mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-14 16:15:04 +00:00
Fix for Q.921 not always recovering
This commit is contained in:
parent
06a3266360
commit
15ef8925c3
@ -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)
|
void sngisdn_snd_data(ftdm_channel_t *dchan, uint8_t *data, ftdm_size_t len)
|
||||||
{
|
{
|
||||||
sng_l1_frame_t l1_frame;
|
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;
|
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)) {
|
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",
|
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));
|
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:
|
case FTDM_OOB_ALARM_CLEAR:
|
||||||
l1_event.type = SNG_L1EVENT_ALARM_OFF;
|
l1_event.type = SNG_L1EVENT_ALARM_OFF;
|
||||||
sng_isdn_event_ind(signal_data->link_id, &l1_event);
|
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);
|
if (!signal_data->dl_request_pending) {
|
||||||
signal_data->dl_request_pending = 1;
|
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;
|
break;
|
||||||
case FTDM_OOB_ALARM_TRAP:
|
case FTDM_OOB_ALARM_TRAP:
|
||||||
l1_event.type = SNG_L1EVENT_ALARM_ON;
|
l1_event.type = SNG_L1EVENT_ALARM_ON;
|
||||||
|
@ -1214,14 +1214,23 @@ void sngisdn_t3_timeout(void *p_sngisdn_info)
|
|||||||
|
|
||||||
void sngisdn_delayed_dl_req(void *p_signal_data)
|
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;
|
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t *)p_signal_data;
|
||||||
ftdm_span_t *span = signal_data->ftdm_span;
|
ftdm_span_t *span = signal_data->ftdm_span;
|
||||||
|
|
||||||
if (!signal_data->dl_request_pending) {
|
if (!signal_data->dl_request_pending) {
|
||||||
return;
|
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]);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user