}
}
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) {
+ goto perform_state_change;
+ }
if (ftdmchan->span->state_map) {
ok = ftdm_parse_state_map(ftdmchan, state, ftdmchan->span->state_map);
goto done;
}
+perform_state_change:
+
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Changed state from %s to %s\n", ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state));
ftdmchan->last_state = ftdmchan->state;
ftdmchan->state = state;
ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event);
ftdm_safe_free(sngss7_event);
}
-
- ftdm_channel_lock(ftdmchan);
+
+ ftdm_channel_unlock(ftdmchan);
}
/* clean out all pending stack events */
SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic);
ftdm_safe_free(event_clone);
}
+ /* clear the peer if any */
+ sngss7_info->peer_data = NULL;
}
/* clone the event and save it for later usage */
ftdm_channel_lock(peer_chan);
if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) {
- ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+ ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN);
}
ftdm_channel_unlock(peer_chan);
case FTDM_CHANNEL_STATE_DOWN:
{
- /* both peers come here after the channel processing the RLC moves the pair to DOWN */
ftdm_channel_t *close_chan = ftdmchan;
-
- /* detach native bridging if needed (only the outbound leg is responsible for that to avoid races or messy locks) */
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
- sngss7_chan_data_t *peer_info = sngss7_info->peer_data;
- sngss7_info->peer_data = NULL;
- if (peer_info) {
- peer_info->peer_data = NULL;
- }
- }
-
- /* close the channel */
ftdm_channel_close (&close_chan);
}
break;
sngss7_info->ckt_flags,
sngss7_info->blk_flags);
+ if (ftdmchan->state == FTDM_CHANNEL_STATE_DIALING) {
+ sngss7_info->peer_data = NULL;
+ }
+
if (sngss7_info->peer_data) {
return ftdm_sangoma_ss7_native_bridge_state_change(ftdmchan);
}