mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-22 17:42:39 +00:00
Freetdm: ISDN fix for link not always recovering after T1/E1 alarm
This commit is contained in:
parent
de02051b2d
commit
8a25c67d40
@ -1376,8 +1376,11 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_isdn_init)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* initalize sng_isdn library */
|
/* initalize sng_isdn library */
|
||||||
|
|
||||||
ftdm_assert_return(!sng_isdn_init(&g_sngisdn_event_interface), FTDM_FAIL, "Failed to initialize stack\n");
|
ftdm_assert_return(!sng_isdn_init(&g_sngisdn_event_interface), FTDM_FAIL, "Failed to initialize stack\n");
|
||||||
|
|
||||||
|
/* Load Stack General Configuration */
|
||||||
|
sngisdn_start_gen_cfg();
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -583,6 +583,7 @@ void sngisdn_t3_timeout(void* p_sngisdn_info);
|
|||||||
void sngisdn_restart_timeout(void* p_signal_data);
|
void sngisdn_restart_timeout(void* p_signal_data);
|
||||||
|
|
||||||
/* Stack management functions */
|
/* Stack management functions */
|
||||||
|
ftdm_status_t sngisdn_start_gen_cfg(void);
|
||||||
ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span);
|
ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span);
|
||||||
ftdm_status_t sngisdn_stack_start(ftdm_span_t *span);
|
ftdm_status_t sngisdn_stack_start(ftdm_span_t *span);
|
||||||
ftdm_status_t sngisdn_stack_stop(ftdm_span_t *span);
|
ftdm_status_t sngisdn_stack_stop(ftdm_span_t *span);
|
||||||
|
@ -58,12 +58,8 @@ ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span);
|
|||||||
|
|
||||||
ftdm_status_t sngisdn_stack_cfg_cc_sap(ftdm_span_t *span);
|
ftdm_status_t sngisdn_stack_cfg_cc_sap(ftdm_span_t *span);
|
||||||
|
|
||||||
ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span)
|
ftdm_status_t sngisdn_start_gen_cfg(void)
|
||||||
{
|
{
|
||||||
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
|
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Starting stack configuration for span:%s\n", span->name);
|
|
||||||
|
|
||||||
if (!g_sngisdn_data.gen_config_done) {
|
if (!g_sngisdn_data.gen_config_done) {
|
||||||
g_sngisdn_data.gen_config_done = 1;
|
g_sngisdn_data.gen_config_done = 1;
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Starting general stack configuration\n");
|
ftdm_log(FTDM_LOG_DEBUG, "Starting general stack configuration\n");
|
||||||
@ -92,6 +88,15 @@ ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span)
|
|||||||
ftdm_log(FTDM_LOG_DEBUG, "General stack CC done\n");
|
ftdm_log(FTDM_LOG_DEBUG, "General stack CC done\n");
|
||||||
ftdm_log(FTDM_LOG_INFO, "General stack configuration done\n");
|
ftdm_log(FTDM_LOG_INFO, "General stack configuration done\n");
|
||||||
}
|
}
|
||||||
|
return FTDM_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span)
|
||||||
|
{
|
||||||
|
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
|
||||||
|
|
||||||
|
ftdm_log(FTDM_LOG_DEBUG, "Starting stack configuration for span:%s\n", span->name);
|
||||||
|
|
||||||
if (signal_data->dchan) {
|
if (signal_data->dchan) {
|
||||||
if (sngisdn_stack_cfg_phy_psap(span) != FTDM_SUCCESS) {
|
if (sngisdn_stack_cfg_phy_psap(span) != FTDM_SUCCESS) {
|
||||||
|
@ -232,6 +232,11 @@ ftdm_status_t sngisdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trac
|
|||||||
{
|
{
|
||||||
sngisdn_span_data_t *signal_data = sngisdn_dchan((sngisdn_span_data_t*)span->signal_data);
|
sngisdn_span_data_t *signal_data = sngisdn_dchan((sngisdn_span_data_t*)span->signal_data);
|
||||||
|
|
||||||
|
if (!signal_data) {
|
||||||
|
ftdm_log(FTDM_LOG_ERROR, "%s:Span is not used by signalling module\n", span->name);
|
||||||
|
return FTDM_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
switch (trace_opt) {
|
switch (trace_opt) {
|
||||||
case SNGISDN_TRACE_DISABLE:
|
case SNGISDN_TRACE_DISABLE:
|
||||||
if (sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q921)) {
|
if (sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q921)) {
|
||||||
|
@ -314,19 +314,12 @@ void sngisdn_snd_info_req(ftdm_channel_t *ftdmchan)
|
|||||||
sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
|
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;
|
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
|
||||||
|
|
||||||
if (ftdmchan->span->trunk_type != FTDM_TRUNK_BRI &&
|
|
||||||
ftdmchan->span->trunk_type != FTDM_TRUNK_BRI_PTMP) {
|
|
||||||
|
|
||||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Ignoring INFO REQ on non-BRI channel\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&cnStEvnt, 0, sizeof(cnStEvnt));
|
memset(&cnStEvnt, 0, sizeof(cnStEvnt));
|
||||||
|
|
||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending INFO REQ (suId:%d dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces);
|
ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Requesting Link establishment (suId:%d dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces);
|
||||||
|
|
||||||
if (sng_isdn_con_status(signal_data->cc_id, 0, 0, &cnStEvnt, MI_INFO, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces)) {
|
if (sng_isdn_con_status(signal_data->cc_id, 0, 0, &cnStEvnt, MI_INFO, sngisdn_dchan(signal_data)->link_id, sngisdn_info->ces)) {
|
||||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused INFO request\n");
|
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused Link establishment\n");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -552,6 +545,8 @@ 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);
|
||||||
|
|
||||||
|
sngisdn_snd_info_req(signal_data->ftdm_span->channels[1]);
|
||||||
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;
|
||||||
|
@ -525,6 +525,13 @@ void sngisdn_rcv_sta_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, St
|
|||||||
|
|
||||||
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
|
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||||
|
|
||||||
|
if (!suInstId && !spInstId) {
|
||||||
|
/* This is a response to a sngisdn_snd_info_req
|
||||||
|
* that was sent to attempt to re-establish DL link */
|
||||||
|
ISDN_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* We sometimes receive a STA CFM after receiving a RELEASE/RELEASE COMPLETE, so we need to lock
|
/* We sometimes receive a STA CFM after receiving a RELEASE/RELEASE COMPLETE, so we need to lock
|
||||||
here in case we are calling clear_call_data at the same time this function is called */
|
here in case we are calling clear_call_data at the same time this function is called */
|
||||||
|
|
||||||
@ -838,7 +845,7 @@ void sngisdn_rcv_q931_ind(InMngmt *status)
|
|||||||
|
|
||||||
if (nfas_data && status->t.usta.alarm.event == LCM_EVENT_DOWN) {
|
if (nfas_data && status->t.usta.alarm.event == LCM_EVENT_DOWN) {
|
||||||
if (nfas_data->dchan->sigstatus == FTDM_SIG_STATE_DOWN &&
|
if (nfas_data->dchan->sigstatus == FTDM_SIG_STATE_DOWN &&
|
||||||
(nfas_data->backup && nfas_data->backup->sigstatus == FTDM_SIG_STATE_DOWN)) {
|
((nfas_data->backup && nfas_data->backup->sigstatus == FTDM_SIG_STATE_DOWN) || !nfas_data->backup)) {
|
||||||
|
|
||||||
for (i = 0; i < ftdm_array_len(nfas_data->spans); i++) {
|
for (i = 0; i < ftdm_array_len(nfas_data->spans); i++) {
|
||||||
if (nfas_data->spans[i] && nfas_data->spans[i]->nfas.sigchan == SNGISDN_NFAS_DCHAN_NONE) {
|
if (nfas_data->spans[i] && nfas_data->spans[i]->nfas.sigchan == SNGISDN_NFAS_DCHAN_NONE) {
|
||||||
|
@ -1595,6 +1595,10 @@ void sngisdn_send_signal(sngisdn_chan_data_t *sngisdn_info, ftdm_signal_event_t
|
|||||||
|
|
||||||
sngisdn_span_data_t *sngisdn_dchan(sngisdn_span_data_t *signal_data)
|
sngisdn_span_data_t *sngisdn_dchan(sngisdn_span_data_t *signal_data)
|
||||||
{
|
{
|
||||||
|
if (!signal_data) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!signal_data->nfas.trunk) {
|
if (!signal_data->nfas.trunk) {
|
||||||
return signal_data;
|
return signal_data;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user