]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Fix for Q.921 not always recovering
authorDavid Yat Sin <dyatsin@sangoma.com>
Fri, 28 Sep 2012 03:48:18 +0000 (23:48 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Fri, 28 Sep 2012 03:48:18 +0000 (23:48 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c

index 02b1ce0be8b6267d4ce009b775df2edbf9877bc6..f6e0d70b419b4f87658044dbf6c9bab8a5f07f1f 100644 (file)
@@ -475,8 +475,16 @@ void sngisdn_snd_restart(ftdm_channel_t *ftdmchan)
 void sngisdn_snd_data(ftdm_channel_t *dchan, uint8_t *data, ftdm_size_t len)
 {
        sng_l1_frame_t l1_frame;
+       ftdm_alarm_flag_t alarmbits = 0;
        sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) dchan->span->signal_data;
 
+       ftdm_channel_get_alarms(dchan, &alarmbits);
+
+       if (alarmbits) {
+               ftdm_log_chan_msg(dchan, FTDM_LOG_WARNING, "Dropping incoming data due to L1 alarm\n");
+               return;
+       }
+
        if (len > sizeof(l1_frame.data)) {
                ftdm_log_chan(dchan, FTDM_LOG_ERROR, "Received frame of %"FTDM_SIZE_FMT" bytes, exceeding max size of %"FTDM_SIZE_FMT" bytes\n", 
                                len, sizeof(l1_frame.data));
@@ -548,9 +556,11 @@ void sngisdn_snd_event(sngisdn_span_data_t *signal_data, ftdm_oob_event_t event)
                case FTDM_OOB_ALARM_CLEAR:
                        l1_event.type = SNG_L1EVENT_ALARM_OFF;
                        sng_isdn_event_ind(signal_data->link_id, &l1_event);
-                       
-                       ftdm_sched_timer(signal_data->sched, "delayed_dl_req", 8000, sngisdn_delayed_dl_req, (void*) signal_data, NULL);
-                       signal_data->dl_request_pending = 1;
+
+                       if (!signal_data->dl_request_pending) {
+                               signal_data->dl_request_pending = 1;
+                               ftdm_sched_timer(signal_data->sched, "delayed_dl_req", 8000, sngisdn_delayed_dl_req, (void*) signal_data, NULL);
+                       }
                        break;
                case FTDM_OOB_ALARM_TRAP:
                        l1_event.type = SNG_L1EVENT_ALARM_ON;
index 246c3190ee6ec4b9e20083873699f430a240c19e..cabf68be776bfc15778f15a2f90e2a6ed6df30a9 100644 (file)
@@ -1214,14 +1214,23 @@ void sngisdn_t3_timeout(void *p_sngisdn_info)
 
 void sngisdn_delayed_dl_req(void *p_signal_data)
 {
+       ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;        
        sngisdn_span_data_t *signal_data = (sngisdn_span_data_t *)p_signal_data;
        ftdm_span_t *span = signal_data->ftdm_span;
        
        if (!signal_data->dl_request_pending) {
                return;
        }
-       signal_data->dl_request_pending = 0;
+       
+       ftdm_span_get_sig_status(span, &sigstatus);
+       if (sigstatus == FTDM_SIG_STATE_UP) {
+               signal_data->dl_request_pending = 0;
+               return;
+       }
+
        sngisdn_snd_dl_req(span->channels[1]);
+       ftdm_sched_timer(signal_data->sched, "delayed_dl_req", 4000, sngisdn_delayed_dl_req, (void*) signal_data, NULL);
+
        return;
 }