]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: Increased T310 to 120 sec on network side, added check for ces when handling...
authorDavid Yat Sin <dyatsin@sangoma.com>
Tue, 4 Oct 2011 17:20:58 +0000 (13:20 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Tue, 4 Oct 2011 17:20:58 +0000 (13:20 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c

index 8033fad305240b549f44c6a623b5edc3c90a7d93..2b9bceea25d235041a8a045baa0beb53e15e86ff 100644 (file)
@@ -681,7 +681,11 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
                        cfg.t.cfg.s.inDLSAP.clrGlr = FALSE;                     /* in case of glare, do not clear local call */
                        cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
 
-                       cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
+                       if (signal_data->ftdm_span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
+                               cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+                       } else {
+                               cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
+                       }
                } else {
                        cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
                        cfg.t.cfg.s.inDLSAP.intType = USER;
@@ -772,15 +776,13 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
        cfg.t.cfg.s.inDLSAP.tmr.t307.val = 35;
        cfg.t.cfg.s.inDLSAP.tmr.t308.enb = TRUE;
        cfg.t.cfg.s.inDLSAP.tmr.t308.val = 4;
+       cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE;
+       cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120;
 
        if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
-               cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE;
-               cfg.t.cfg.s.inDLSAP.tmr.t310.val = 10;
                cfg.t.cfg.s.inDLSAP.tmr.t312.enb = TRUE;
                cfg.t.cfg.s.inDLSAP.tmr.t312.val = cfg.t.cfg.s.inDLSAP.tmr.t303.val+2;
        } else {
-               cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE;
-               cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120;
                cfg.t.cfg.s.inDLSAP.tmr.t312.enb = FALSE;
        }
 
@@ -908,7 +910,14 @@ ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span)
 
        cfg.t.cfg.s.inLCe.sapId = signal_data->dchan_id;
 
-       cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE;
+       if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
+               /* Stack will send Restart CFM's each time link is established (TEI negotiated),
+                   and we do not want thi s event */
+               cfg.t.cfg.s.inLCe.lnkUpDwnInd = FALSE;
+       } else {
+               cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE;
+       }
+
        cfg.t.cfg.s.inLCe.tCon.enb = TRUE;
        cfg.t.cfg.s.inLCe.tCon.val = 35;
        cfg.t.cfg.s.inLCe.tDisc.enb = TRUE;
index e95a582a45379be5d7c77c0d787bf71c7878cc63..19a9b62b0a3ea564618f7b2a1793626888fae291 100644 (file)
@@ -1178,7 +1178,16 @@ void sngisdn_process_rst_cfm (sngisdn_event_data_t *sngisdn_event)
                ftdm_log(FTDM_LOG_CRIT, "Received RESTART CFM on unconfigured span (suId:%d)\n", suId);
                return;
        }
-       
+
+       ftdm_log(FTDM_LOG_DEBUG, "%s: Processing RESTART CFM (suId:%u dChan:%d ces:%d %s(%d))\n",
+                                                                       signal_data->ftdm_span->name,
+                                                                       suId, dChan, ces,
+                                                                       (evntType == IN_LNK_DWN)?"LNK_DOWN":
+                                                                       (evntType == IN_LNK_UP)?"LNK_UP":
+                                                                       (evntType == IN_INDCHAN)?"b-channel":
+                                                                       (evntType == IN_LNK_DWN_DM_RLS)?"NFAS service procedures":
+                                                                       (evntType == IN_SWCHD_BU_DCHAN)?"NFAS switchover to backup":"Unknown", evntType);
+
        if (rstEvnt->rstInd.eh.pres == PRSNT_NODEF && rstEvnt->rstInd.rstClass.pres == PRSNT_NODEF) {                   
                switch(rstEvnt->rstInd.rstClass.val) {
                        case IN_CL_INDCHAN: /* Indicated b-channel */
@@ -1212,19 +1221,29 @@ void sngisdn_process_rst_cfm (sngisdn_event_data_t *sngisdn_event)
        }
 
        if (chan_no) { /* For a single channel */
-               if (chan_no > ftdm_span_get_chan_count(signal_data->ftdm_span)) {
-                       ftdm_log(FTDM_LOG_CRIT, "Received RESTART on invalid channel:%d\n", chan_no);
-               } else {
-                       ftdm_channel_t *ftdmchan = ftdm_span_get_channel(signal_data->ftdm_span, chan_no);
-                       sngisdn_bring_down(ftdmchan);
+               ftdm_iterator_t *chaniter = NULL;
+               ftdm_iterator_t *curr = NULL;
+
+               chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL);
+               for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
+                       ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
+                       sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
+                       if (sngisdn_info->ces == ces && ftdmchan->physical_chan_id == chan_no) {
+                               sngisdn_bring_down(ftdmchan);
+                       }
                }
+               ftdm_iterator_free(chaniter);
        } else { /* for all channels */
                ftdm_iterator_t *chaniter = NULL;
                ftdm_iterator_t *curr = NULL;
 
                chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL);
                for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
-                       sngisdn_bring_down((ftdm_channel_t*)ftdm_iterator_current(curr));
+                       ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
+                       sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
+                       if (sngisdn_info->ces == ces) {
+                               sngisdn_bring_down(ftdmchan);
+                       }
                }
                ftdm_iterator_free(chaniter);
        }
@@ -1305,28 +1324,29 @@ void sngisdn_process_rst_ind (sngisdn_event_data_t *sngisdn_event)
        }
 
        if (chan_no) { /* For a single channel */
-               if (chan_no > ftdm_span_get_chan_count(signal_data->ftdm_span)) {
-                       ftdm_log(FTDM_LOG_CRIT, "Received RESTART IND on invalid channel:%d\n", chan_no);
-               } else {
-                       ftdm_iterator_t *chaniter = NULL;
-                       ftdm_iterator_t *curr = NULL;
-                       
-                       chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL);
-                       for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {                  
-                               ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
-                               if (ftdmchan->physical_chan_id == chan_no) {
-                                       sngisdn_bring_down(ftdmchan);
-                               }
+               ftdm_iterator_t *chaniter = NULL;
+               ftdm_iterator_t *curr = NULL;
+
+               chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL);
+               for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
+                       ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
+                       sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
+                       if (sngisdn_info->ces == ces && ftdmchan->physical_chan_id == chan_no) {
+                               sngisdn_bring_down(ftdmchan);
                        }
-                       ftdm_iterator_free(chaniter);
                }
+               ftdm_iterator_free(chaniter);
        } else { /* for all channels */
                ftdm_iterator_t *chaniter = NULL;
                ftdm_iterator_t *curr = NULL;
 
                chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL);
                for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
-                       sngisdn_bring_down((ftdm_channel_t*)ftdm_iterator_current(curr));
+                       ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
+                       sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
+                       if (sngisdn_info->ces == ces) {
+                               sngisdn_bring_down(ftdmchan);
+                       }
                }
                ftdm_iterator_free(chaniter);
        }
index 3788a9c25b74afebd255b23091c0cc2996619336..8ae33cee0aad67790441e9671e4e7247c6f1efef 100644 (file)
@@ -990,27 +990,27 @@ void sngisdn_rcv_sng_log(uint8_t level, char *fmt,...)
 
     switch (level) {
                case SNG_LOGLEVEL_DEBUG:
-                       ftdm_log(FTDM_LOG_DEBUG, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_DEBUG, "sng_isdn->%s\n", data);
                        break;
                case SNG_LOGLEVEL_WARN:
-                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data);
                        break;
                case SNG_LOGLEVEL_INFO:
-                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data);
                        break;
                case SNG_LOGLEVEL_STATS:
-                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data);
                        break;
                case SNG_LOGLEVEL_ERROR:
-                       ftdm_log(FTDM_LOG_ERROR, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_ERROR, "sng_isdn->%s\n", data);
                        /*ftdm_assert(0, "Got an error from stack");*/
                        break;
                case SNG_LOGLEVEL_CRIT:
-                       ftdm_log(FTDM_LOG_CRIT, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_CRIT, "sng_isdn->%s\n", data);
                        /* ftdm_assert(0, "Got an error from stack"); */
                        break;
                default:
-                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data);
+                       ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data);
                        break;
     }
        ftdm_safe_free(data);