Modified: freeswitch/trunk/conf/autoload_configs/switch.conf.xml ( => )
Modified: freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c
===================================================================
--- freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c 2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c 2010-04-28 14:19:07 UTC (rev 17429)
@@ -25,6 +25,7 @@
*
* Anthony Minessale II <anthmct@yahoo.com>
* Moises Silva <moy@sangoma.com>
+ * David Yat Sin <dyatsin@sangoma.com>
*
*
* mod_freetdm.c -- FreeTDM Endpoint Module
@@ -1950,6 +1951,14 @@
sigmsg->channel->span_id, sigmsg->channel->chan_id, (uuid) ? uuid : "N/A");
}
}
+ break;
+ case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
+ {
+ ftdm_signaling_status_t *sigstatus = (ftdm_signaling_status_t*)(sigmsg->raw_data);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to :%s\n",
+ sigmsg->channel->span_id, sigmsg->channel->chan_id, ftdm_signaling_status2str(*sigstatus));
+ }
+ break;
default:
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unhandled msg type %d for channel %d:%d\n",
@@ -2983,15 +2992,19 @@
void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream)
{
+ ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
if (chan_id > span->chan_count) {
return;
}
-
+
+ ftdm_channel_get_sig_status(span->channels[chan_id], &sigstatus);
stream->write_function(stream,
"span_id: %u\n"
"chan_id: %u\n"
"physical_span_id: %u\n"
"physical_chan_id: %u\n"
+ "physical_status: %s\n"
+ "signaling_status: %s\n"
"type: %s\n"
"state: %s\n"
"last_state: %s\n"
@@ -3009,6 +3022,8 @@
span->channels[chan_id]->chan_id,
span->channels[chan_id]->physical_span_id,
span->channels[chan_id]->physical_chan_id,
+ (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP",
+ ftdm_signaling_status2str(sigstatus),
ftdm_chan_type2str(span->channels[chan_id]->type),
ftdm_channel_state2str(span->channels[chan_id]->state),
ftdm_channel_state2str(span->channels[chan_id]->last_state),
@@ -3027,16 +3042,19 @@
void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream)
{
+ ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
if (chan_id > span->chan_count) {
return;
}
-
+ ftdm_channel_get_sig_status(span->channels[chan_id], &sigstatus);
stream->write_function(stream,
" <channel>\n"
" <span-id>%u</span-id>\n"
" <chan-id>%u</chan-id>>\n"
" <physical-span-id>%u</physical-span-id>\n"
" <physical-chan-id>%u</physical-chan-id>\n"
+ " <physical-status>%s</physical-status>\n"
+ " <signaling-status>%s</signaling-status>\n"
" <type>%s</type>\n"
" <state>%s</state>\n"
" <last-state>%s</last-state>\n"
@@ -3055,6 +3073,8 @@
span->channels[chan_id]->chan_id,
span->channels[chan_id]->physical_span_id,
span->channels[chan_id]->physical_chan_id,
+ (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP",
+ ftdm_signaling_status2str(sigstatus),
ftdm_chan_type2str(span->channels[chan_id]->type),
ftdm_channel_state2str(span->channels[chan_id]->state),
ftdm_channel_state2str(span->channels[chan_id]->last_state),
@@ -3168,7 +3188,7 @@
stream->write_function(stream,
"+OK\n"
"span: %u (%s)\n"
- "type: %s\n"
+ "type: %s\n"
"signaling_status: %s\n"
"chan_count: %u\n"
"dialplan: %s\n"
Modified: freeswitch/trunk/libs/freetdm/src/ftdm_io.c (17428 => 17429)
--- freeswitch/trunk/libs/freetdm/src/ftdm_io.c 2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftdm_io.c 2010-04-28 14:19:07 UTC (rev 17429)
@@ -143,6 +143,8 @@
FTDM_ENUM_NAMES(SIGNALING_STATUS_NAMES, SIGSTATUS_STRINGS)
FTDM_STR2ENUM(ftdm_str2ftdm_signaling_status, ftdm_signaling_status2str, ftdm_signaling_status_t, SIGNALING_STATUS_NAMES, FTDM_SIG_STATE_INVALID)
+static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name);
+
static const char *cut_path(const char *in)
{
const char *p, *ret = in;
@@ -775,7 +777,7 @@
i++;
}
- ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY);
+ ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY);
*chan = new_chan;
return FTDM_SUCCESS;
}
@@ -1279,9 +1281,10 @@
if (!(check = group->channels[i])) {
status = FTDM_FAIL;
break;
- }
+ }
- if (ftdm_test_flag(check, FTDM_CHANNEL_READY) &&
+ if (ftdm_test_flag(check, FTDM_CHANNEL_READY) &&
+ ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) &&
!ftdm_test_flag(check, FTDM_CHANNEL_INUSE) &&
!ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) &&
!ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) &&
@@ -1401,7 +1404,8 @@
break;
}
- if (ftdm_test_flag(check, FTDM_CHANNEL_READY) &&
+ if (ftdm_test_flag(check, FTDM_CHANNEL_READY) &&
+ ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) &&
!ftdm_test_flag(check, FTDM_CHANNEL_INUSE) &&
!ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) &&
!ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) &&
@@ -2851,26 +2855,79 @@
return rval;
}
-static void ftdm_set_channels_gains(ftdm_span_t *span, int currindex, float rxgain, float txgain)
+static ftdm_status_t ftdm_set_channels_gains(ftdm_span_t *span, int currindex, float rxgain, float txgain)
{
unsigned chan_index = 0;
if (!span->chan_count) {
- return;
+ ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set gains because span has no channels\n");
+ return FTDM_FAIL;
}
for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) {
if (!FTDM_IS_VOICE_CHANNEL(span->channels[chan_index])) {
continue;
}
- ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_RX_GAIN, &rxgain);
- ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_TX_GAIN, &txgain);
+ if (ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_RX_GAIN, &rxgain) != FTDM_SUCCESS) {
+ return FTDM_FAIL;
+ }
+ if (ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_TX_GAIN, &txgain) != FTDM_SUCCESS) {
+ return FTDM_FAIL;
+ }
}
+ return FTDM_SUCCESS;
}
+static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) {
+ unsigned chan_index = 0;
+ if (!span->chan_count) {
+ ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set alarms because span has no channels\n");
+ return FTDM_FAIL;
+ }
-static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex);
+ if (!span->fio->get_alarms) {
+ ftdm_log(FTDM_LOG_WARNING, "%d: Span does not support alarms\n", span->span_id);
+ return FTDM_SUCCESS;
+ }
+
+ for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) {
+ /* fio->get_alarms will update ftdm_chan->alarm_flags */
+ if (span->fio->get_alarms(span->channels[chan_index]) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_ERROR, "%d:%d: Failed to get alarms\n", span->channels[chan_index]->physical_span_id, span->channels[chan_index]->physical_chan_id);
+ return FTDM_FAIL;
+ }
+ }
+ return FTDM_SUCCESS;
+}
+
+
+FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char* str, ftdm_channel_config_t *chan_config, unsigned *configured)
+{
+ int currindex = span->chan_count;
+ *configured = 0;
+ *configured = span->fio->configure_span(span, str, chan_config->type, chan_config->name, chan_config->number);
+ if (!*configured) {
+ ftdm_log(FTDM_LOG_ERROR, "%d:Failed to configure span", span->span_id);
+ return FTDM_FAIL;
+ }
+
+ if (ftdm_group_add_channels(span, currindex, chan_config->group_name) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_ERROR, "%d:Failed to add channels to group %s\n", span->span_id, chan_config->group_name);
+ return FTDM_FAIL;
+ }
+ if (ftdm_set_channels_alarms(span, currindex) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set channel alarms\n", span->span_id);
+ return FTDM_FAIL;
+ }
+ if (ftdm_set_channels_gains(span, currindex, chan_config->rxgain, chan_config->txgain) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set channel gains\n", span->span_id);
+ return FTDM_FAIL;
+ }
+ return FTDM_SUCCESS;
+}
+
+
static ftdm_status_t load_config(void)
{
char cfg_name[] = "freetdm.conf";
@@ -2878,18 +2935,16 @@
char *var, *val;
int catno = -1;
int intparam = 0;
- int currindex = 0;
ftdm_span_t *span = NULL;
unsigned configured = 0, d = 0;
- char name[80] = "";
- char number[25] = "";
- char group_name[80] = "default";
ftdm_io_interface_t *fio = NULL;
ftdm_analog_start_type_t tmp;
- float rxgain = 0.0;
- float txgain = 0.0;
ftdm_size_t len = 0;
+ ftdm_channel_config_t chan_config;
+ memset(&chan_config, 0, sizeof(chan_config));
+ sprintf(chan_config.group_name,"default");
+
if (!ftdm_config_open_file(&cfg, cfg_name)) {
return FTDM_FAIL;
}
@@ -2967,15 +3022,15 @@
ftdm_log(FTDM_LOG_DEBUG, "setting trunk type to '%s'\n", ftdm_trunk_type2str(span->trunk_type));
} else if (!strcasecmp(var, "name")) {
if (!strcasecmp(val, "undef")) {
- *name = '\0';
+ chan_config.name[0] = '\0';
} else {
- ftdm_copy_string(name, val, sizeof(name));
+ ftdm_copy_string(chan_config.name, val, FTDM_MAX_NAME_STR_SZ);
}
} else if (!strcasecmp(var, "number")) {
if (!strcasecmp(val, "undef")) {
- *number = '\0';
+ chan_config.number[0] = '\0';
} else {
- ftdm_copy_string(number, val, sizeof(number));
+ ftdm_copy_string(chan_config.number, val, FTDM_MAX_NUMBER_STR_SZ);
}
} else if (!strcasecmp(var, "analog-start-type")) {
if (span->trunk_type == FTDM_TRUNK_FXS || span->trunk_type == FTDM_TRUNK_FXO || span->trunk_type == FTDM_TRUNK_EM) {
@@ -2993,10 +3048,11 @@
ftdm_analog_start_type2str(span->start_type));
}
if (span->trunk_type == FTDM_TRUNK_FXO) {
- currindex = span->chan_count;
- configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number);
- ftdm_set_channels_gains(span, currindex, rxgain, txgain);
- ftdm_group_add_channels(group_name, span, currindex);
+ unsigned chans_configured = 0;
+ chan_config.type = FTDM_CHAN_TYPE_FXO;
+ if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+ configured += chans_configured;
+ }
} else {
ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n");
}
@@ -3007,10 +3063,11 @@
ftdm_analog_start_type2str(span->start_type));
}
if (span->trunk_type == FTDM_TRUNK_FXS) {
- currindex = span->chan_count;
- configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number);
- ftdm_set_channels_gains(span, currindex, rxgain, txgain);
- ftdm_group_add_channels(group_name, span, currindex);
+ unsigned chans_configured = 0;
+ chan_config.type = FTDM_CHAN_TYPE_FXS;
+ if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+ configured += chans_configured;
+ }
} else {
ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n");
}
@@ -3021,56 +3078,62 @@
ftdm_analog_start_type2str(span->start_type));
}
if (span->trunk_type == FTDM_TRUNK_EM) {
- currindex = span->chan_count;
- configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number);
- ftdm_set_channels_gains(span, currindex, rxgain, txgain);
- ftdm_group_add_channels(group_name, span, currindex);
+ unsigned chans_configured = 0;
+ chan_config.type = FTDM_CHAN_TYPE_EM;
+ if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+ configured += chans_configured;
+ }
} else {
ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n");
}
} else if (!strcasecmp(var, "b-channel")) {
- currindex = span->chan_count;
- configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number);
- ftdm_set_channels_gains(span, currindex, rxgain, txgain);
- ftdm_group_add_channels(group_name, span, currindex);
+ unsigned chans_configured = 0;
+ chan_config.type = FTDM_CHAN_TYPE_B;
+ if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+ configured += chans_configured;
+ }
} else if (!strcasecmp(var, "d-channel")) {
if (d) {
ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n");
} else {
- ftdm_chan_type_t qtype;
+ unsigned chans_configured = 0;
if (!strncasecmp(val, "lapd:", 5)) {
- qtype = FTDM_CHAN_TYPE_DQ931;
+ chan_config.type = FTDM_CHAN_TYPE_DQ931;
val += 5;
} else {
- qtype = FTDM_CHAN_TYPE_DQ921;
+ chan_config.type = FTDM_CHAN_TYPE_DQ921;
}
- configured += fio->configure_span(span, val, qtype, name, number);
+ if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+ configured += chans_configured;
+ }
d++;
}
} else if (!strcasecmp(var, "cas-channel")) {
- currindex = span->chan_count;
- configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number);
- ftdm_set_channels_gains(span, currindex, rxgain, txgain);
- ftdm_group_add_channels(group_name, span, currindex);
+ unsigned chans_configured = 0;
+ chan_config.type = FTDM_CHAN_TYPE_CAS;
+
+ if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+ configured += chans_configured;
+ }
} else if (!strcasecmp(var, "dtmf_hangup")) {
span->dtmf_hangup = ftdm_strdup(val);
span->dtmf_hangup_len = strlen(val);
} else if (!strcasecmp(var, "txgain")) {
- if (sscanf(val, "%f", &txgain) != 1) {
+ if (sscanf(val, "%f", &(chan_config.txgain)) != 1) {
ftdm_log(FTDM_LOG_ERROR, "invalid txgain: '%s'\n", val);
}
} else if (!strcasecmp(var, "rxgain")) {
- if (sscanf(val, "%f", &rxgain) != 1) {
+ if (sscanf(val, "%f", &(chan_config.rxgain)) != 1) {
ftdm_log(FTDM_LOG_ERROR, "invalid rxgain: '%s'\n", val);
}
} else if (!strcasecmp(var, "group")) {
len = strlen(val);
- if (len >= sizeof(group_name)) {
- len = sizeof(group_name) - 1;
+ if (len >= FTDM_MAX_NAME_STR_SZ) {
+ len = FTDM_MAX_NAME_STR_SZ - 1;
ftdm_log(FTDM_LOG_WARNING, "Truncating group name %s to %zd length\n", val, len);
}
- memcpy(group_name, val, len);
- group_name[len] = '\0';
+ memcpy(chan_config.group_name, val, len);
+ chan_config.group_name[len] = '\0';
} else {
ftdm_log(FTDM_LOG_ERROR, "unknown span variable '%s'\n", var);
}
@@ -3527,7 +3590,7 @@
return FTDM_FAIL;
}
-static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex)
+static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name)
{
unsigned chan_index = 0;
@@ -3639,19 +3702,24 @@
FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t *sigmsg)
{
ftdm_status_t status = FTDM_FAIL;
+ if (sigmsg->channel) {
+ ftdm_mutex_lock(sigmsg->channel->mutex);
+ }
+ if (sigmsg->event_id == FTDM_SIGEVENT_SIGSTATUS_CHANGED) {
+ if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) {
+ ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+ } else {
+ ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+ }
+ }
if (span->signal_cb) {
- if (sigmsg->channel) {
- ftdm_mutex_lock(sigmsg->channel->mutex);
- }
-
status = span->signal_cb(sigmsg);
+ }
- if (sigmsg->channel) {
- ftdm_mutex_unlock(sigmsg->channel->mutex);
- }
+ if (sigmsg->channel) {
+ ftdm_mutex_unlock(sigmsg->channel->mutex);
}
-
return status;
}
Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c (17428 => 17429)
--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c 2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c 2010-04-28 14:19:07 UTC (rev 17429)
@@ -44,6 +44,43 @@
}
/**
+ * \brief Returns the signalling status on a channel
+ * \param ftdmchan Channel to get status on
+ * \param status Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(isdn_get_channel_sig_status)
+{
+ *status = FTDM_SIG_STATE_DOWN;
+
+ ftdm_libpri_data_t *isdn_data = ftdmchan->span->signal_data;
+ if (ftdm_test_flag(&(isdn_data->spri), LPWRAP_PRI_READY)) {
+ *status = FTDM_SIG_STATE_UP;
+ }
+ return FTDM_SUCCESS;
+}
+
+/**
+ * \brief Returns the signalling status on a span
+ * \param span Span to get status on
+ * \param status Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_SPAN_GET_SIG_STATUS_FUNCTION(isdn_get_span_sig_status)
+{
+ *status = FTDM_SIG_STATE_DOWN;
+
+ ftdm_libpri_data_t *isdn_data = span->signal_data;
+ if (ftdm_test_flag(&(isdn_data->spri), LPWRAP_PRI_READY)) {
+ *status = FTDM_SIG_STATE_UP;
+ }
+ return FTDM_SUCCESS;
+}
+
+
+/**
* \brief Starts a libpri channel (outgoing call)
* \param ftdmchan Channel to initiate call on
* \return Success or failure
@@ -937,13 +974,27 @@
*/
static int on_dchan_up(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
-
if (!ftdm_test_flag(spri, LPWRAP_PRI_READY)) {
+ ftdm_signaling_status_t status = FTDM_SIG_STATE_UP;
+ ftdm_channel_t *ftdmchan = NULL;
+ ftdm_sigmsg_t sig;
+ int i;
ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan UP!\n", spri->span->span_id);
ftdm_set_flag(spri, LPWRAP_PRI_READY);
ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART);
+
+ ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status));
+ for(i=1; i <= spri->span->chan_count; i++) {
+ ftdmchan = spri->span->channels[i];
+ memset(&sig, 0, sizeof(sig));
+ sig.chan_id = ftdmchan->chan_id;
+ sig.span_id = ftdmchan->span_id;
+ sig.channel = ftdmchan;
+ sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+ sig.raw_data = &status;
+ ftdm_span_send_signal(spri->span, &sig);
+ }
}
-
return 0;
}
@@ -955,13 +1006,28 @@
* \return 0
*/
static int on_dchan_down(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
-{
-
+{
if (ftdm_test_flag(spri, LPWRAP_PRI_READY)) {
+ ftdm_signaling_status_t status = FTDM_SIG_STATE_DOWN;
+ ftdm_channel_t *ftdmchan = NULL;
+ ftdm_sigmsg_t sig;
+ int i;
ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan DOWN!\n", spri->span->span_id);
ftdm_clear_flag(spri, LPWRAP_PRI_READY);
ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART);
-
+
+
+ ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status));
+ for(i=1; i <= spri->span->chan_count; i++) {
+ ftdmchan = spri->span->channels[i];
+ memset(&sig, 0, sizeof(sig));
+ sig.chan_id = ftdmchan->chan_id;
+ sig.span_id = ftdmchan->span_id;
+ sig.channel = ftdmchan;
+ sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+ sig.raw_data = &status;
+ ftdm_span_send_signal(spri->span, &sig);
+ }
}
return 0;
@@ -1329,6 +1395,9 @@
span->signal_type = FTDM_SIGTYPE_ISDN;
span->outgoing_call = isdn_outgoing_call;
+ span->get_channel_sig_status = isdn_get_channel_sig_status;
+ span->get_span_sig_status = isdn_get_span_sig_status;
+
if ((isdn_data->opts & FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL)) {
span->channel_request = isdn_channel_request;
ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);