From 6196a4199eff71fe6a5a85205e7c235a46752fa1 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Sat, 30 Apr 2011 18:01:38 +0200 Subject: [PATCH] ftmod_libpri: Possible fix for call tear-down problems (+ locking cleanup) Remove pri_destroycall() in on_hangup() and use pri_hangup() instead of the deprecated pri_release(). NOTE: The original patch used PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION for the cause code, which (without pri_enable_hangup_fix() enabled) emits a RELEASE COMPLETE message. This version of the patch uses PRI_CAUSE_NORMAL_CLEARING (-1). (stkn) Additionally, use ftdm_set_state() instead of ftdm_set_state_locked() because the channel is already locked. (stkn) Completely-untested-by: Stefan Knoblich --- .../src/ftmod/ftmod_libpri/ftmod_libpri.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c index 0f45128ac9..949ea154e3 100644 --- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c +++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c @@ -854,7 +854,6 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even { ftdm_span_t *span = spri->span; ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->hangup.channel); -/* q931_call *call = NULL; */ if (!chan) { ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d %s but it's not in use?\n", ftdm_span_get_id(spri->span), pevent->hangup.channel); @@ -868,25 +867,13 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even goto done; } -/* - * Make sure we can really tear-down a call, simply ignore the missing call_data and - * use the call handle from the event - * - if (!chan->call_data) { - ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s with no call data\n", ftdm_channel_get_state_str(chan)); - goto done; - } - - call = (q931_call *)chan->call_data; -*/ ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n", ftdm_span_get_id(spri->span), pevent->hangup.channel); - pri_release(spri->pri, pevent->hangup.call, 0); - pri_destroycall(spri->pri, pevent->hangup.call); + pri_hangup(spri->pri, pevent->hangup.call, -1); chan->caller_data.hangup_cause = pevent->hangup.cause; chan->call_data = NULL; - ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_TERMINATING); + ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING); done: ftdm_channel_unlock(chan); return 0;