freetdm: Made CPG optional on configuration file

Fixes in hw alarm - no need to set hw unblock if hw block did not execute yet.
         Minor bug fixes
This commit is contained in:
Nenad Corbic 2011-11-03 20:04:26 -04:00
parent 69f6f20fd2
commit 4b25044ac6
4 changed files with 64 additions and 9 deletions

View File

@ -94,7 +94,7 @@ int ft_to_sngss7_cfg_all(void)
/* set the desired procID value */ /* set the desired procID value */
sng_set_procId((uint16_t)g_ftdm_sngss7_data.cfg.procId); sng_set_procId((uint16_t)g_ftdm_sngss7_data.cfg.procId);
} }
/* start up the stack manager */ /* start up the stack manager */
if (sng_isup_init_sm()) { if (sng_isup_init_sm()) {
SS7_CRITICAL("Failed to start Stack Manager\n"); SS7_CRITICAL("Failed to start Stack Manager\n");

View File

@ -308,10 +308,14 @@ static void handle_hw_alarm(ftdm_event_t *e)
} }
} else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) { } else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) {
SS7_DEBUG("handle_hw_alarm: Clear\n"); SS7_DEBUG("handle_hw_alarm: Clear\n");
sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX);
SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX);
if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) {
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); 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);
}
} }
} }
} }
@ -737,6 +741,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM); sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM);
ft_to_sngss7_acm(ftdmchan); 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; break;
@ -756,7 +766,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM); sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM);
ft_to_sngss7_acm(ftdmchan); 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; break;
@ -973,7 +988,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/* all flags are down so we can bring up the sig status */ /* all flags are down so we can bring up the sig status */
sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP);
} /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_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 { } else {
SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags); SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags);
@ -998,6 +1016,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL); 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_LOCAL_REL);
sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_ACM); 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)) { if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) {
@ -1162,6 +1181,22 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/* clear the PAUSE flag */ /* clear the PAUSE flag */
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); 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 there are any resets present */
if (!sngss7_channel_status_clear(sngss7_info)) { if (!sngss7_channel_status_clear(sngss7_info)) {
/* don't bring up the sig status but also move to reset */ /* don't bring up the sig status but also move to reset */

View File

@ -342,6 +342,8 @@ typedef struct sng_isup_ckt {
uint32_t min_digits; uint32_t min_digits;
uint8_t itx_auto_reply; uint8_t itx_auto_reply;
uint8_t transparent_iam; uint8_t transparent_iam;
uint8_t cpg_on_progress_media;
uint8_t cpg_on_progress;
void *obj; void *obj;
uint16_t t3; uint16_t t3;
uint32_t t10; uint32_t t10;
@ -534,6 +536,7 @@ typedef enum {
FLAG_INFID_RESUME = (1 << 14), FLAG_INFID_RESUME = (1 << 14),
FLAG_INFID_PAUSED = (1 << 15), FLAG_INFID_PAUSED = (1 << 15),
FLAG_SENT_ACM = (1 << 16), FLAG_SENT_ACM = (1 << 16),
FLAG_SENT_CPG = (1 << 17),
FLAG_RELAY_DOWN = (1 << 30), FLAG_RELAY_DOWN = (1 << 30),
FLAG_CKT_RECONFIG = (1 << 31) FLAG_CKT_RECONFIG = (1 << 31)
} sng_ckt_flag_t; } sng_ckt_flag_t;
@ -542,14 +545,14 @@ typedef enum {
"RX_RSC", \ "RX_RSC", \
"TX_RSC", \ "TX_RSC", \
"TX_RSC_REQ_SENT", \ "TX_RSC_REQ_SENT", \
"TX_RSC_RSP_RECIEVED", \ "TX_RSC_RSP_RECEIVED", \
"RX_GRS", \ "RX_GRS", \
"RX_GRS_DONE", \ "RX_GRS_DONE", \
"RX_GRS_CMPLT", \ "RX_GRS_CMPLT", \
"GRS_BASE", \ "GRS_BASE", \
"TX_GRS", \ "TX_GRS", \
"TX_GRS_REQ_SENT", \ "TX_GRS_REQ_SENT", \
"TX_GRS_RSP_RECIEVED", \ "TX_GRS_RSP_RECEIVED", \
"REMOTE_REL", \ "REMOTE_REL", \
"LOCAL_REL", \ "LOCAL_REL", \
"GLARE", \ "GLARE", \
@ -1058,6 +1061,11 @@ if (ftdmchan->state == new_state) { \
FLAG_GRP_RESET_TX | \ FLAG_GRP_RESET_TX | \
FLAG_GRP_RESET_RX ))) 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))) #define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj)))

View File

@ -128,6 +128,8 @@ typedef struct sng_ccSpan
uint32_t min_digits; uint32_t min_digits;
uint8_t itx_auto_reply; uint8_t itx_auto_reply;
uint8_t transparent_iam; uint8_t transparent_iam;
uint8_t cpg_on_progress_media;
uint8_t cpg_on_progress;
uint32_t t3; uint32_t t3;
uint32_t t10; uint32_t t10;
uint32_t t12; uint32_t t12;
@ -1906,6 +1908,14 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span)
sng_ccSpan.transparent_iam = ftdm_true(parm->val); sng_ccSpan.transparent_iam = ftdm_true(parm->val);
SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam); SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam);
#endif #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")) { } else if (!strcasecmp(parm->var, "cicbase")) {
/**********************************************************************/ /**********************************************************************/
sng_ccSpan.cicbase = atoi(parm->val); sng_ccSpan.cicbase = atoi(parm->val);
@ -2941,6 +2951,8 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; 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].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].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) { if (ccSpan->t3 == 0) {
g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200; g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200;