}
} else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) {
SS7_DEBUG("handle_hw_alarm: Clear\n");
- sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX);
- SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n");
- if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) {
- ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+ sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX);
+ sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX);
+ if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) {
+ sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX);
+ SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n");
+ if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) {
+ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+ }
}
}
}
sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM);
ft_to_sngss7_acm(ftdmchan);
}
+ if (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cpg_on_progress == FTDM_TRUE) {
+ if (!sngss7_test_ckt_flag(sngss7_info, FLAG_SENT_CPG)) {
+ sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_CPG);
+ ft_to_sngss7_cpg(ftdmchan);
+ }
+ }
}
break;
sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM);
ft_to_sngss7_acm(ftdmchan);
}
- ft_to_sngss7_cpg(ftdmchan);
+ if (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cpg_on_progress_media == FTDM_TRUE) {
+ if (!sngss7_test_ckt_flag(sngss7_info, FLAG_SENT_CPG)) {
+ sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_CPG);
+ ft_to_sngss7_cpg(ftdmchan);
+ }
+ }
}
break;
/* all flags are down so we can bring up the sig status */
sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP);
} /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */
- } /* if !blocked */
+ } else {
+ state_flag = 0;
+ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+ } /* if !blocked */
} else {
SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags);
sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_clear_ckt_flag (sngss7_info, FLAG_LOCAL_REL);
sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_ACM);
+ sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_CPG);
if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) {
/* clear the PAUSE flag */
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
+ /* We have transmitted Reset/GRS but have not gotten a
+ * Response. In mean time we got a RESUME. We cannot be sure
+ * that our reset has been trasmitted, thus restart reset procedure. */
+ if (sngss7_tx_reset_status_pending(sngss7_info)) {
+ SS7_DEBUG_CHAN(ftdmchan, "Channel transmitted RSC/GRS before RESUME, restart Reset procedure%s\n", "");
+ clear_rx_grs_flags(sngss7_info);
+ clear_rx_grs_data(sngss7_info);
+ clear_tx_grs_flags(sngss7_info);
+ clear_tx_grs_data(sngss7_info);
+ clear_rx_rsc_flags(sngss7_info);
+ clear_tx_rsc_flags(sngss7_info);
+
+ clear_tx_rsc_flags(sngss7_info);
+ sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
+ }
+
/* if there are any resets present */
if (!sngss7_channel_status_clear(sngss7_info)) {
/* don't bring up the sig status but also move to reset */
uint32_t min_digits;
uint8_t itx_auto_reply;
uint8_t transparent_iam;
+ uint8_t cpg_on_progress_media;
+ uint8_t cpg_on_progress;
void *obj;
uint16_t t3;
uint32_t t10;
FLAG_INFID_RESUME = (1 << 14),
FLAG_INFID_PAUSED = (1 << 15),
FLAG_SENT_ACM = (1 << 16),
+ FLAG_SENT_CPG = (1 << 17),
FLAG_RELAY_DOWN = (1 << 30),
FLAG_CKT_RECONFIG = (1 << 31)
} sng_ckt_flag_t;
"RX_RSC", \
"TX_RSC", \
"TX_RSC_REQ_SENT", \
- "TX_RSC_RSP_RECIEVED", \
+ "TX_RSC_RSP_RECEIVED", \
"RX_GRS", \
"RX_GRS_DONE", \
"RX_GRS_CMPLT", \
"GRS_BASE", \
"TX_GRS", \
"TX_GRS_REQ_SENT", \
- "TX_GRS_RSP_RECIEVED", \
+ "TX_GRS_RSP_RECEIVED", \
"REMOTE_REL", \
"LOCAL_REL", \
"GLARE", \
FLAG_GRP_RESET_TX | \
FLAG_GRP_RESET_RX )))
+#define sngss7_tx_reset_status_pending(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \
+ sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \
+ (sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \
+ sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT))))
+
#define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj)))
uint32_t min_digits;
uint8_t itx_auto_reply;
uint8_t transparent_iam;
+ uint8_t cpg_on_progress_media;
+ uint8_t cpg_on_progress;
uint32_t t3;
uint32_t t10;
uint32_t t12;
sng_ccSpan.transparent_iam = ftdm_true(parm->val);
SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam);
#endif
+ } else if (!strcasecmp(parm->var, "cpg_on_progress_media")) {
+ sng_ccSpan.cpg_on_progress_media = ftdm_true(parm->val);
+ SS7_DEBUG("Found cpg_on_progress_media %d\n", sng_ccSpan.cpg_on_progress_media);
+
+ } else if (!strcasecmp(parm->var, "cpg_on_progress")) {
+ sng_ccSpan.cpg_on_progress = ftdm_true(parm->val);
+ SS7_DEBUG("Found cpg_on_progress_media %d\n", sng_ccSpan.cpg_on_progress);
+
} else if (!strcasecmp(parm->var, "cicbase")) {
/**********************************************************************/
sng_ccSpan.cicbase = atoi(parm->val);
g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits;
g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply;
g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam;
+ g_ftdm_sngss7_data.cfg.isupCkt[x].cpg_on_progress_media = ccSpan->cpg_on_progress_media;
+ g_ftdm_sngss7_data.cfg.isupCkt[x].cpg_on_progress = ccSpan->cpg_on_progress;
if (ccSpan->t3 == 0) {
g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200;