diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c index 02b1ce0be8..f6e0d70b41 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c @@ -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; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c index 246c3190ee..cabf68be77 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c @@ -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; }