freetdm: merge native bridge fix from releases.3.4

which solves the crash on outgoing calls after native bridge
This commit is contained in:
James Zhang 2012-03-16 12:24:10 -04:00
parent 46ddfc0ebb
commit 63a2c847eb
4 changed files with 39 additions and 27 deletions

View File

@ -2453,6 +2453,12 @@ FT_DECLARE(ftdm_status_t) ftdm_get_channel_from_string(const char *string_id, ft
*out_span = NULL; *out_span = NULL;
*out_channel = NULL; *out_channel = NULL;
if (!string_id) {
ftdm_log(FTDM_LOG_ERROR, "Cannot parse NULL channel id string\n");
status = FTDM_EINVAL;
goto done;
}
rc = sscanf(string_id, "%u:%u", &span_id, &chan_id); rc = sscanf(string_id, "%u:%u", &span_id, &chan_id);
if (rc != 2) { if (rc != 2) {
ftdm_log(FTDM_LOG_ERROR, "Failed to parse channel id string '%s'\n", string_id); ftdm_log(FTDM_LOG_ERROR, "Failed to parse channel id string '%s'\n", string_id);

View File

@ -1325,6 +1325,10 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
}else { }else {
stream->write_function(stream, "relay=N"); stream->write_function(stream, "relay=N");
} }
#ifdef SMG_RELAY_DBG
stream->write_function(stream, "| flag=0x%llx", ftdmchan->flags);
#endif
} }
#ifdef SMG_RELAY_DBG #ifdef SMG_RELAY_DBG

View File

@ -615,6 +615,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
break; break;
case SNGSS7_REL_CFM_EVENT: case SNGSS7_REL_CFM_EVENT:
{ {
if (sngss7_info->peer_data) {
ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan;
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
if (peer_chan) { if (peer_chan) {
@ -631,6 +632,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
ftdm_channel_lock(ftdmchan); ftdm_channel_lock(ftdmchan);
} }
} }
}
break; break;
default: default:
break; break;
@ -1087,12 +1089,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan)
/*now go to the RING state */ /*now go to the RING state */
state_flag = 0; state_flag = 0;
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
} else if (i >= sngss7_info->circuit->min_digits) { } else if (i >= sngss7_info->circuit->min_digits) {
SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, sngss7_info->circuit->min_digits); SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, sngss7_info->circuit->min_digits);
/*now go to the RING state */ /*now go to the RING state */
state_flag = 0; state_flag = 0;
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
} else { } else {
/* if we are coming from idle state then we have already been here once before */ /* if we are coming from idle state then we have already been here once before */
if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) { if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) {

View File

@ -57,12 +57,12 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
memset (&iam, 0x0, sizeof (iam)); memset (&iam, 0x0, sizeof (iam));
var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) {
if (!ftdm_strlen_zero(var)) {
ftdm_span_t *peer_span = NULL; ftdm_span_t *peer_span = NULL;
ftdm_channel_t *peer_chan = NULL; ftdm_channel_t *peer_chan = NULL;
sngss7_chan_data_t *peer_info = NULL; sngss7_chan_data_t *peer_info = NULL;
var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer");
ftdm_get_channel_from_string(var, &peer_span, &peer_chan); ftdm_get_channel_from_string(var, &peer_span, &peer_chan);
if (!peer_chan) { if (!peer_chan) {
SS7_ERROR_CHAN(ftdmchan, "Failed to find sigbridge peer from string '%s'\n", var); SS7_ERROR_CHAN(ftdmchan, "Failed to find sigbridge peer from string '%s'\n", var);
@ -91,7 +91,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
} }
} }
if (sngss7_info->peer_data) { if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE) && sngss7_info->peer_data) {
sngss7_span_data_t *span_data = ftdmchan->span->signal_data; sngss7_span_data_t *span_data = ftdmchan->span->signal_data;
sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue); sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue);
/* Retrieve IAM from our peer */ /* Retrieve IAM from our peer */
@ -224,7 +224,6 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
&iam, &iam,
0); 0);
if (native_going_up) { if (native_going_up) {
/* /*
Note that this function (ft_to_sngss7_iam) is run within the main SS7 processing loop in Note that this function (ft_to_sngss7_iam) is run within the main SS7 processing loop in
@ -275,7 +274,6 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED;
} }
} }
acm.bckCallInd.holdInd.pres = PRSNT_NODEF; acm.bckCallInd.holdInd.pres = PRSNT_NODEF;
acm.bckCallInd.holdInd.val = HOLD_NOTREQD; acm.bckCallInd.holdInd.val = HOLD_NOTREQD;
acm.bckCallInd.isdnAccInd.pres = PRSNT_NODEF; acm.bckCallInd.isdnAccInd.pres = PRSNT_NODEF;