Merge branch 'master' into smgmaster

This commit is contained in:
Moises Silva
2011-07-29 17:07:24 -04:00
17 changed files with 160 additions and 79 deletions

View File

@@ -4498,35 +4498,41 @@ static ftdm_status_t ftdm_set_channels_gains(ftdm_span_t *span, int currindex, f
return FTDM_SUCCESS;
}
static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) {
unsigned chan_index = 0;
static ftdm_status_t ftdm_report_initial_channels_alarms(ftdm_span_t *span)
{
ftdm_channel_t *fchan = NULL;
ftdm_iterator_t *curr = NULL;
ftdm_status_t status = FTDM_SUCCESS;
ftdm_alarm_flag_t alarmbits;
ftdm_event_t fake_event;
ftdm_iterator_t *citer = ftdm_span_get_chan_iterator(span, NULL);
if (!span->chan_count) {
ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set alarms because span has no channels\n");
return FTDM_FAIL;
if (!citer) {
status = FTDM_ENOMEM;
goto done;
}
if (!span->fio->get_alarms) {
ftdm_log(FTDM_LOG_WARNING, "%d: Span does not support alarms\n", span->span_id);
return FTDM_SUCCESS;
}
memset(&fake_event, 0, sizeof(fake_event));
fake_event.e_type = FTDM_EVENT_OOB;
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;
}
if (span->channels[chan_index]->alarm_flags) {
ftdm_set_flag_locked(span->channels[chan_index], FTDM_CHANNEL_IN_ALARM);
} else {
ftdm_clear_flag_locked(span->channels[chan_index], FTDM_CHANNEL_IN_ALARM);
for (curr = citer; curr; curr = ftdm_iterator_next(curr)) {
fchan = ftdm_iterator_current(curr);
status = ftdm_channel_get_alarms(fchan, &alarmbits);
if (status != FTDM_SUCCESS) {
ftdm_log_chan_msg(fchan, FTDM_LOG_ERROR, "Failed to initialize alarms\n");
continue;
}
fake_event.channel = fchan;
fake_event.enum_id = fchan->alarm_flags ? FTDM_OOB_ALARM_TRAP : FTDM_OOB_ALARM_CLEAR;
ftdm_event_handle_oob(&fake_event);
}
return FTDM_SUCCESS;
done:
ftdm_iterator_free(citer);
return status;
}
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;
@@ -4558,12 +4564,6 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const
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 (chan_config->debugdtmf) {
for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) {
if (!FTDM_IS_VOICE_CHANNEL(span->channels[chan_index])) {
@@ -5084,6 +5084,7 @@ static ftdm_status_t post_configure_span_channels(ftdm_span_t *span)
ftdm_status_t status = FTDM_SUCCESS;
ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
for (i = 1; i <= span->chan_count; i++) {
sigstatus = FTDM_SIG_STATE_DOWN;
ftdm_channel_get_sig_status(span->channels[i], &sigstatus);
if (sigstatus == FTDM_SIG_STATE_UP) {
ftdm_set_flag(span->channels[i], FTDM_CHANNEL_SIG_UP);
@@ -5189,13 +5190,8 @@ FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span)
goto done;
}
/* check the alarms again before starting the signaling module
this works-around some I/O modules (netborder I/O module) that cannot
check the alarm status before during configuration because the spans are
not really started yet at the I/O level */
if (ftdm_set_channels_alarms(span, 0) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_ERROR, "Failed to set channel alarms in span %s\n", span->name);
status = FTDM_FAIL;
status = ftdm_report_initial_channels_alarms(span);
if (status != FTDM_SUCCESS) {
goto done;
}

View File

@@ -777,7 +777,7 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
}
assert(sr);
pri_sr_set_channel(sr, ftdm_channel_get_id(chan), 0, 0);
pri_sr_set_channel(sr, ftdm_channel_get_id(chan), 1, 0);
pri_sr_set_bearer(sr, PRI_TRANS_CAP_SPEECH, isdn_data->layer1);
pri_sr_set_called(sr, caller_data->dnis.digits, ton, 1);

View File

@@ -366,11 +366,10 @@ static void *ftdm_sangoma_isdn_io_run(ftdm_thread_t *me, void *obj)
waitms = 1000;
memset(poll_events, 0, sizeof(short)*span->chan_count);
poll_events[i] |= FTDM_EVENTS;
for (i = 0, citer = ftdm_span_get_chan_iterator(span, chaniter); citer; citer = ftdm_iterator_next(citer), i++) {
ftdmchan = ftdm_iterator_current(citer);
poll_events[i] |= FTDM_EVENTS;
if (FTDM_IS_VOICE_CHANNEL(ftdmchan)) {
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_RX_DISABLED)) {
poll_events[i] |= FTDM_READ;

View File

@@ -1047,12 +1047,11 @@ void sngisdn_restart_timeout(void *p_signal_data)
{
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t *)p_signal_data;
ftdm_span_t *span = signal_data->ftdm_span;
ftdm_log(FTDM_LOG_DEBUG, "s%d:Did not receive a RESTART from remote switch in %d ms - restarting\n", span->name, signal_data->restart_timeout);
ftdm_iterator_t *chaniter = NULL;
ftdm_iterator_t *curr = NULL;
ftdm_log(FTDM_LOG_DEBUG, "s%d:Did not receive a RESTART from remote switch in %d ms - restarting\n", span->name, signal_data->restart_timeout);
chaniter = ftdm_span_get_chan_iterator(span, NULL);
for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);

View File

@@ -100,7 +100,7 @@ int stun_parse_message(stun_msg_t *msg)
msg->stun_attr = NULL;
while (len > 0) {
i = stun_parse_attribute(msg, p);
if (i <= 0) {
if (i <= 0 || i > len) {
SU_DEBUG_3(("%s: Error parsing attribute.\n", __func__));
return -1;
}