]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
spInstId's are now saved before queueing the SETUP event
authorDavid Yat Sin <dyatsin@sangoma.com>
Fri, 3 Sep 2010 19:27:42 +0000 (15:27 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Fri, 3 Sep 2010 19:27:42 +0000 (15:27 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c

index f49d651c0930936f12950c2314eee6223477cd1d..c3d97e5c5cc6edeadf444290a2fea6e56912df59 100644 (file)
@@ -78,7 +78,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                        }
                        
                        sngisdn_info->suInstId = get_unique_suInstId(suId);
-                       sngisdn_info->spInstId = spInstId;
+                       sngisdn_info->spInstId = spInstId;              
 
                        /* If this is a glared call that was previously saved, we moved
                        all the info to the current call, so clear the glared saved data */
@@ -87,10 +87,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                                clear_call_glare_data(sngisdn_info);
                        }
 
-                       ftdm_assert(g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] == NULL, "Con Ind on busy spInstId");
-
                        ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-                       g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
                        g_sngisdn_data.ccs[suId].active_suInstIds[sngisdn_info->suInstId] = sngisdn_info;
                        ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
 
@@ -118,7 +115,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                                ftdmchan->caller_data.bearer_layer1 = sngisdn_get_infoTranCap_from_stack(conEvnt->bearCap[0].usrInfoLyr1Prot.val);
                                ftdmchan->caller_data.bearer_capability = sngisdn_get_infoTranCap_from_stack(conEvnt->bearCap[0].infoTranCap.val);
                        }
-                       
+
                        if (signal_data->switchtype == SNGISDN_SWITCH_NI2) {
                                if (conEvnt->shift11.eh.pres && conEvnt->ni2OctStr.eh.pres) {
                                        if (conEvnt->ni2OctStr.str.len == 4 && conEvnt->ni2OctStr.str.val[0] == 0x37) {
@@ -160,7 +157,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                        break;
                case FTDM_CHANNEL_STATE_TERMINATING:
                        ftdm_log_chan_msg(ftdmchan, FTDM_LOG_INFO, "Processing SETUP in TERMINATING state, saving SETUP info for later processing\n");
-                       ftdm_assert(!sngisdn_test_flag(sngisdn_info, FLAG_GLARE), "Trying to save GLARE info, but we already had a glare");
+                       ftdm_assert(!sngisdn_test_flag(sngisdn_info, FLAG_GLARE), "Trying to save GLARE info, but we already had a glare\n");
                        
                        sngisdn_set_flag(sngisdn_info, FLAG_GLARE);
 
@@ -172,11 +169,6 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                        sngisdn_info->glare.dChan = dChan;
                        sngisdn_info->glare.ces = ces;
                        
-                       /* We need to register the spInstId in case we get a release for that call while it is still stored in sngisdn_info->glare */
-                       ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-                       g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
-                       ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
-                       
                        break;
                case FTDM_CHANNEL_STATE_DIALING:        /* glare */
                        if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
@@ -188,11 +180,6 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                                sngisdn_info->glare.suInstId = get_unique_suInstId(suId);
                                sngisdn_info->glare.spInstId = spInstId;
 
-                               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-                               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
-                               g_sngisdn_data.ccs[suId].active_suInstIds[sngisdn_info->suInstId] = sngisdn_info;
-                               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
-
                                sngisdn_info->glare.dChan = dChan;
                                sngisdn_info->glare.ces = ces;
                                ftdmchan->caller_data.hangup_cause = 0x2C; /* Channel requested not available */
@@ -212,10 +199,6 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                                sngisdn_info->glare.dChan = dChan;
                                sngisdn_info->glare.ces = ces;
 
-                               /* We need to register the spInstId in case we get a release for that call while it is still stored in sngisdn_info->glare */
-                               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-                               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
-                               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
                                ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
                        }
                        break;
@@ -245,13 +228,6 @@ void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event)
        ftdm_assert(!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE), "State change flag pending\n");
        
        ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Processing CONNECT/CONNECT ACK (suId:%u suInstId:%u spInstId:%u ces:%d)\n", suId, suInstId, spInstId, ces);
-       
-       if (!sngisdn_info->spInstId) {
-               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-               sngisdn_info->spInstId = spInstId;
-               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
-               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
-       }
 
        if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP &&
                ((sngisdn_span_data_t*)ftdmchan->span->signal_data)->signalling == SNGISDN_SIGNALING_NET) {
@@ -315,13 +291,6 @@ void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event)
        
        CnStEvnt *cnStEvnt = &sngisdn_event->event.cnStEvnt;
 
-       if (!sngisdn_info->spInstId) {
-               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-               sngisdn_info->spInstId = spInstId;
-               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
-               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
-       }
-
        ftdm_assert(!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE), "State change flag pending\n");
 
        ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Processing %s (suId:%u suInstId:%u spInstId:%u ces:%d)\n",
@@ -418,13 +387,6 @@ void sngisdn_process_disc_ind (sngisdn_event_data_t *sngisdn_event)
        
        DiscEvnt *discEvnt = &sngisdn_event->event.discEvnt;
 
-       if (!sngisdn_info->spInstId) {
-               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
-               sngisdn_info->spInstId = spInstId;
-               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
-               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
-       }
-
        ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Processing DISCONNECT (suId:%u suInstId:%u spInstId:%u)\n", suId, suInstId, spInstId);
 
        ftdm_assert(!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE), "State change flag pending\n");
@@ -698,6 +660,7 @@ void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event)
                                        ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Failed to retrieve Caller Name from Facility IE\n");
                                }
                        }
+
                        ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
                        break;
                default:
@@ -876,6 +839,7 @@ void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event)
                        case 9:
                                switch (ftdmchan->state) {
                                        case FTDM_CHANNEL_STATE_PROGRESS:
+                                       case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
                                                /* Do nothing */
                                                break;
                                        default:
index 8ae513881b67bf228aeec7f19e5a43d834d9d615..6e8e0e81fd3d66557c53de139cd0cffcf8e4aa0f 100644 (file)
@@ -283,7 +283,7 @@ void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan)
        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 (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
      if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
                ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending PROGRESS, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
                sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
                ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
index 75513fb0a074b99fc481bdecf7ac3b3c0601d078..29cfb2330ea746167e1d32df61fa9f46ceedeb30 100644 (file)
@@ -87,11 +87,14 @@ void sngisdn_rcv_con_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, Co
        sngisdn_event->event_id = SNGISDN_EVENT_CON_IND;
        sngisdn_event->sngisdn_info = sngisdn_info;
        sngisdn_event->suId = suId;
-       sngisdn_event->suInstId = suInstId;
        sngisdn_event->spInstId = spInstId;
        sngisdn_event->dChan = dChan;
        sngisdn_event->ces = ces;
 
+       ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
+       g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;     
+       ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
+
        memcpy(&sngisdn_event->event.conEvnt, conEvnt, sizeof(*conEvnt));
        
        ftdm_queue_enqueue(((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->event_queue, sngisdn_event);
@@ -113,6 +116,14 @@ void sngisdn_rcv_con_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, Cn
                return;
        }
 
+       if (!sngisdn_info->spInstId) {
+               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
+               sngisdn_info->spInstId = spInstId;
+               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
+               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
+       }
+
+       
        ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Received CONNECT/CONNECT ACK (suId:%u suInstId:%u spInstId:%u ces:%d)\n", suId, suInstId, spInstId, ces);
        
        sngisdn_event = ftdm_malloc(sizeof(*sngisdn_event));
@@ -126,7 +137,6 @@ void sngisdn_rcv_con_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, Cn
        sngisdn_event->spInstId = spInstId;
        sngisdn_event->dChan = dChan;
        sngisdn_event->ces = ces;
-
        memcpy(&sngisdn_event->event.cnStEvnt, cnStEvnt, sizeof(*cnStEvnt));
        
        ftdm_queue_enqueue(((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->event_queue, sngisdn_event);
@@ -148,6 +158,13 @@ void sngisdn_rcv_cnst_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, C
                return;
        }
 
+       if (!sngisdn_info->spInstId) {
+               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
+               sngisdn_info->spInstId = spInstId;
+               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
+               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
+       }
+
        ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Received %s (suId:%u suInstId:%u spInstId:%u ces:%d)\n",
                                                                                                        (evntType == MI_ALERTING)?"ALERT":
                                                                                                        (evntType == MI_CALLPROC)?"PROCEED":
@@ -191,6 +208,13 @@ void sngisdn_rcv_disc_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, D
                return;
        }
 
+       if (!sngisdn_info->spInstId) {
+               ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex);
+               sngisdn_info->spInstId = spInstId;
+               g_sngisdn_data.ccs[suId].active_spInstIds[spInstId] = sngisdn_info;
+               ftdm_mutex_unlock(g_sngisdn_data.ccs[suId].mutex);
+       }
+       
        ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Received DISCONNECT (suId:%u suInstId:%u spInstId:%u)\n", suId, suInstId, spInstId);
        
        sngisdn_event = ftdm_malloc(sizeof(*sngisdn_event));
@@ -643,7 +667,10 @@ void sngisdn_rcv_q921_ind(BdMngmt *status)
                        }
                }
        }
-       ftdm_assert(ftdmspan != NULL, "Received q921 status on unconfigured span\n");
+       if (ftdmspan == NULL) {
+               ftdm_log(FTDM_LOG_WARNING, "Received q921 status on unconfigured span (lnkNmb:%d)\n", status->t.usta.lnkNmb);
+               return;
+       }
 
        switch (status->t.usta.alarm.category) {
                case (LCM_CATEGORY_INTERFACE):