}
/* initalize sng_isdn library */
-
ftdm_assert_return(!sng_isdn_init(&g_sngisdn_event_interface), FTDM_FAIL, "Failed to initialize stack\n");
+
+ /* Load Stack General Configuration */
+ sngisdn_start_gen_cfg();
+
return FTDM_SUCCESS;
}
void sngisdn_restart_timeout(void* p_signal_data);
/* Stack management functions */
+ftdm_status_t sngisdn_start_gen_cfg(void);
ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span);
ftdm_status_t sngisdn_stack_start(ftdm_span_t *span);
ftdm_status_t sngisdn_stack_stop(ftdm_span_t *span);
ftdm_status_t sngisdn_stack_cfg_cc_sap(ftdm_span_t *span);
-ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span)
+ftdm_status_t sngisdn_start_gen_cfg(void)
{
- sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
-
- ftdm_log(FTDM_LOG_DEBUG, "Starting stack configuration for span:%s\n", span->name);
-
if (!g_sngisdn_data.gen_config_done) {
g_sngisdn_data.gen_config_done = 1;
ftdm_log(FTDM_LOG_DEBUG, "Starting general stack configuration\n");
ftdm_log(FTDM_LOG_DEBUG, "General stack CC done\n");
ftdm_log(FTDM_LOG_INFO, "General stack configuration done\n");
}
+ return FTDM_SUCCESS;
+}
+
+
+ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span)
+{
+ sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
+
+ ftdm_log(FTDM_LOG_DEBUG, "Starting stack configuration for span:%s\n", span->name);
if (signal_data->dchan) {
if (sngisdn_stack_cfg_phy_psap(span) != FTDM_SUCCESS) {
{
sngisdn_span_data_t *signal_data = sngisdn_dchan((sngisdn_span_data_t*)span->signal_data);
+ if (!signal_data) {
+ ftdm_log(FTDM_LOG_ERROR, "%s:Span is not used by signalling module\n", span->name);
+ return FTDM_FAIL;
+ }
+
switch (trace_opt) {
case SNGISDN_TRACE_DISABLE:
if (sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q921)) {
sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
- if (ftdmchan->span->trunk_type != FTDM_TRUNK_BRI &&
- ftdmchan->span->trunk_type != FTDM_TRUNK_BRI_PTMP) {
-
- ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Ignoring INFO REQ on non-BRI channel\n");
- return;
- }
-
memset(&cnStEvnt, 0, sizeof(cnStEvnt));
- ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending INFO REQ (suId:%d dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Requesting Link establishment (suId:%d dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces);
if (sng_isdn_con_status(signal_data->cc_id, 0, 0, &cnStEvnt, MI_INFO, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces)) {
- ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused INFO request\n");
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused Link establishment\n");
}
return;
}
case FTDM_OOB_ALARM_CLEAR:
l1_event.type = SNG_L1EVENT_ALARM_OFF;
sng_isdn_event_ind(signal_data->link_id, &l1_event);
+
+ sngisdn_snd_info_req(signal_data->ftdm_span->channels[1]);
break;
case FTDM_OOB_ALARM_TRAP:
l1_event.type = SNG_L1EVENT_ALARM_ON;
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
+ if (!suInstId && !spInstId) {
+ /* This is a response to a sngisdn_snd_info_req
+ * that was sent to attempt to re-establish DL link */
+ ISDN_FUNC_TRACE_EXIT(__FUNCTION__);
+ return;
+ }
+
/* We sometimes receive a STA CFM after receiving a RELEASE/RELEASE COMPLETE, so we need to lock
here in case we are calling clear_call_data at the same time this function is called */
- ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
+ ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
!(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
if (nfas_data && status->t.usta.alarm.event == LCM_EVENT_DOWN) {
if (nfas_data->dchan->sigstatus == FTDM_SIG_STATE_DOWN &&
- (nfas_data->backup && nfas_data->backup->sigstatus == FTDM_SIG_STATE_DOWN)) {
+ ((nfas_data->backup && nfas_data->backup->sigstatus == FTDM_SIG_STATE_DOWN) || !nfas_data->backup)) {
for (i = 0; i < ftdm_array_len(nfas_data->spans); i++) {
if (nfas_data->spans[i] && nfas_data->spans[i]->nfas.sigchan == SNGISDN_NFAS_DCHAN_NONE) {
sngisdn_span_data_t *sngisdn_dchan(sngisdn_span_data_t *signal_data)
{
+ if (!signal_data) {
+ return NULL;
+ }
+
if (!signal_data->nfas.trunk) {
return signal_data;
}