提交 9257e0f3 authored 作者: Stefan Knoblich's avatar Stefan Knoblich

ftmod_isdn: Port(/Fix) span signal handling, remove some dead/unused pieces and…

ftmod_isdn: Port(/Fix) span signal handling, remove some dead/unused pieces and close the D-Channel on shutdown.

This fixes a NULL-call segfault in ftdm_span_trigger_signal().
Signed-off-by: 's avatarStefan Knoblich <s.knoblich@axsentis.de>
上级 a9b2ced2
...@@ -595,9 +595,10 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent * ...@@ -595,9 +595,10 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent *
return; return;
} }
if (ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) { if (ftdm_channel_get_state(ftdmchan) != FTDM_CHANNEL_STATE_DOWN) {
ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d not in DOWN state, cleaning up\n", ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d not in DOWN state, cleaning up\n",
ftdmchan->span_id, ftdmchan->chan_id); ftdm_channel_get_span_id(ftdmchan),
ftdm_channel_get_id(ftdmchan));
/* /*
* Send hangup signal to mod_openzap * Send hangup signal to mod_openzap
...@@ -607,7 +608,7 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent * ...@@ -607,7 +608,7 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent *
} }
sig.event_id = FTDM_SIGEVENT_STOP; sig.event_id = FTDM_SIGEVENT_STOP;
isdn_data->sig_cb(&sig); ftdm_span_send_signal(ftdm_channel_get_span(ftdmchan), &sig);
/* Release zap channel */ /* Release zap channel */
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
...@@ -641,7 +642,9 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent * ...@@ -641,7 +642,9 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent *
return; return;
} }
ftdm_log(FTDM_LOG_DEBUG, "Call setup failed on channel %d:%d\n", ftdmchan->span_id, ftdmchan->chan_id); ftdm_log(FTDM_LOG_DEBUG, "Call setup failed on channel %d:%d\n",
ftdm_channel_get_span_id(ftdmchan),
ftdm_channel_get_id(ftdmchan));
/* /*
* Send signal to mod_openzap * Send signal to mod_openzap
...@@ -649,7 +652,7 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent * ...@@ -649,7 +652,7 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent *
sig.channel->caller_data.hangup_cause = FTDM_CAUSE_NETWORK_OUT_OF_ORDER; sig.channel->caller_data.hangup_cause = FTDM_CAUSE_NETWORK_OUT_OF_ORDER;
sig.event_id = FTDM_SIGEVENT_STOP; sig.event_id = FTDM_SIGEVENT_STOP;
isdn_data->sig_cb(&sig); ftdm_span_send_signal(ftdm_channel_get_span(ftdmchan), &sig);
/* Release zap channel */ /* Release zap channel */
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
...@@ -909,7 +912,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic ...@@ -909,7 +912,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
sig.channel->caller_data.hangup_cause = (cause) ? cause->Value : FTDM_CAUSE_NORMAL_UNSPECIFIED; sig.channel->caller_data.hangup_cause = (cause) ? cause->Value : FTDM_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = FTDM_SIGEVENT_STOP; sig.event_id = FTDM_SIGEVENT_STOP;
status = isdn_data->sig_cb(&sig); status = ftdm_span_send_signal(span, &sig);
ftdm_log(FTDM_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what, ftdm_log(FTDM_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what,
ftdm_channel_get_state_str(ftdmchan), ftdm_channel_get_state_str(ftdmchan),
...@@ -1298,6 +1301,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1298,6 +1301,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{ {
Q931mes_Generic *gen = (Q931mes_Generic *) ftdmchan->caller_data.raw_data; Q931mes_Generic *gen = (Q931mes_Generic *) ftdmchan->caller_data.raw_data;
ftdm_isdn_data_t *isdn_data = ftdmchan->span->signal_data; ftdm_isdn_data_t *isdn_data = ftdmchan->span->signal_data;
ftdm_span_t *span = ftdm_channel_get_span(ftdmchan);
ftdm_sigmsg_t sig; ftdm_sigmsg_t sig;
ftdm_status_t status; ftdm_status_t status;
...@@ -1329,7 +1333,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1329,7 +1333,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{ {
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_PROGRESS; sig.event_id = FTDM_SIGEVENT_PROGRESS;
if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) { if ((status = ftdm_span_send_signal(ftdm_channel_get_span(ftdmchan), &sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
} }
} else { } else {
...@@ -1377,7 +1381,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1377,7 +1381,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{ {
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_START; sig.event_id = FTDM_SIGEVENT_START;
if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) { if ((status = ftdm_span_send_signal(span, &sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
} }
} }
...@@ -1387,7 +1391,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1387,7 +1391,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{ {
ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_UNSPECIFIED; ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = FTDM_SIGEVENT_RESTART; sig.event_id = FTDM_SIGEVENT_RESTART;
status = isdn_data->sig_cb(&sig); status = ftdm_span_send_signal(span, &sig);
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
} }
break; break;
...@@ -1395,7 +1399,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1395,7 +1399,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{ {
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_PROGRESS_MEDIA; sig.event_id = FTDM_SIGEVENT_PROGRESS_MEDIA;
if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) { if ((status = ftdm_span_send_signal(span, &sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
} }
} else { } else {
...@@ -1415,7 +1419,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1415,7 +1419,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{ {
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_UP; sig.event_id = FTDM_SIGEVENT_UP;
if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) { if ((status = ftdm_span_send_signal(span, &sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
} }
} else { } else {
...@@ -1636,7 +1640,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan) ...@@ -1636,7 +1640,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
ftdm_log(FTDM_LOG_DEBUG, "Terminating: Direction %s\n", ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound"); ftdm_log(FTDM_LOG_DEBUG, "Terminating: Direction %s\n", ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound");
sig.event_id = FTDM_SIGEVENT_STOP; sig.event_id = FTDM_SIGEVENT_STOP;
status = isdn_data->sig_cb(&sig); status = ftdm_span_send_signal(span, &sig);
gen->MesType = Q931mes_RELEASE; gen->MesType = Q931mes_RELEASE;
gen->CRVFlag = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? 0 : 1; gen->CRVFlag = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? 0 : 1;
...@@ -1673,7 +1677,6 @@ static __inline__ void check_state(ftdm_span_t *span) ...@@ -1673,7 +1677,6 @@ static __inline__ void check_state(ftdm_span_t *span)
static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *event) static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *event)
{ {
ftdm_isdn_data_t *isdn_data = span->signal_data;
ftdm_alarm_flag_t alarmbits; ftdm_alarm_flag_t alarmbits;
ftdm_sigmsg_t sig; ftdm_sigmsg_t sig;
...@@ -1697,7 +1700,7 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e ...@@ -1697,7 +1700,7 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e
} }
ftdm_set_flag(event->channel, FTDM_CHANNEL_SUSPENDED); ftdm_set_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
ftdm_channel_get_alarms(event->channel, &alarmbits); ftdm_channel_get_alarms(event->channel, &alarmbits);
isdn_data->sig_cb(&sig); ftdm_span_send_signal(span, &sig);
ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms [%s]\n", ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms [%s]\n",
ftdm_channel_get_span_id(event->channel), ftdm_channel_get_span_id(event->channel),
...@@ -1712,7 +1715,7 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e ...@@ -1712,7 +1715,7 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e
sig.event_id = FTDM_OOB_ALARM_CLEAR; sig.event_id = FTDM_OOB_ALARM_CLEAR;
ftdm_clear_flag(event->channel, FTDM_CHANNEL_SUSPENDED); ftdm_clear_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
ftdm_channel_get_alarms(event->channel, &alarmbits); ftdm_channel_get_alarms(event->channel, &alarmbits);
isdn_data->sig_cb(&sig); ftdm_span_send_signal(span, &sig);
} }
break; break;
#ifdef __BROKEN_BY_FREETDM_CONVERSION__ #ifdef __BROKEN_BY_FREETDM_CONVERSION__
...@@ -2057,8 +2060,7 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj) ...@@ -2057,8 +2060,7 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
} }
done: done:
// ftdm_channel_close(&isdn_data->dchans[0]); ftdm_channel_close(&isdn_data->dchan);
// ftdm_channel_close(&isdn_data->dchans[1]);
ftdm_clear_flag(isdn_data, FTDM_ISDN_RUNNING); ftdm_clear_flag(isdn_data, FTDM_ISDN_RUNNING);
#ifdef WIN32 #ifdef WIN32
...@@ -2745,8 +2747,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(isdn_configure_span) ...@@ -2745,8 +2747,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(isdn_configure_span)
} }
} }
isdn_data->sig_cb = sig_cb; isdn_data->dchan = dchan;
isdn_data->dchan = dchan;
isdn_data->digit_timeout = digit_timeout; isdn_data->digit_timeout = digit_timeout;
Q921_InitTrunk(&isdn_data->q921, Q921_InitTrunk(&isdn_data->q921,
...@@ -2788,6 +2789,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(isdn_configure_span) ...@@ -2788,6 +2789,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(isdn_configure_span)
span->state_map = &isdn_state_map; span->state_map = &isdn_state_map;
span->signal_data = isdn_data; span->signal_data = isdn_data;
span->signal_type = FTDM_SIGTYPE_ISDN; span->signal_type = FTDM_SIGTYPE_ISDN;
span->signal_cb = sig_cb;
span->start = ftdm_isdn_start; span->start = ftdm_isdn_start;
span->stop = ftdm_isdn_stop; span->stop = ftdm_isdn_stop;
span->outgoing_call = isdn_outgoing_call; span->outgoing_call = isdn_outgoing_call;
......
...@@ -63,9 +63,6 @@ struct ftdm_isdn_data { ...@@ -63,9 +63,6 @@ struct ftdm_isdn_data {
Q921Data_t q921; Q921Data_t q921;
Q931_TrunkInfo_t q931; Q931_TrunkInfo_t q931;
ftdm_channel_t *dchan; ftdm_channel_t *dchan;
ftdm_channel_t *dchans[2];
struct ftdm_sigmsg sigmsg;
fio_signal_cb_t sig_cb;
uint32_t flags; uint32_t flags;
int32_t mode; int32_t mode;
int32_t digit_timeout; int32_t digit_timeout;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论