fix adding of span channels to group for E1 lines

git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@1005 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Moises Silva 2010-01-25 18:53:27 +00:00
parent 08df1fd80c
commit 448d2e8566
2 changed files with 22 additions and 32 deletions

View File

@ -2701,12 +2701,14 @@ FT_DECLARE(char *) ftdm_api_execute(const char *type, const char *cmd)
} }
static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex);
static ftdm_status_t load_config(void) static ftdm_status_t load_config(void)
{ {
char cfg_name[] = "freetdm.conf"; char cfg_name[] = "freetdm.conf";
ftdm_config_t cfg; ftdm_config_t cfg;
char *var, *val; char *var, *val;
int catno = -1; int catno = -1;
int currindex = 0;
ftdm_span_t *span = NULL; ftdm_span_t *span = NULL;
unsigned configured = 0, d = 0; unsigned configured = 0, d = 0;
char name[80] = ""; char name[80] = "";
@ -2819,7 +2821,9 @@ static ftdm_status_t load_config(void)
ftdm_analog_start_type2str(span->start_type)); ftdm_analog_start_type2str(span->start_type));
} }
if (span->trunk_type == FTDM_TRUNK_FXO) { if (span->trunk_type == FTDM_TRUNK_FXO) {
currindex = span->chan_count;
configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number); configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number);
ftdm_group_add_channels(group_name, span, currindex);
} else { } else {
ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n"); ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n");
} }
@ -2830,7 +2834,9 @@ static ftdm_status_t load_config(void)
ftdm_analog_start_type2str(span->start_type)); ftdm_analog_start_type2str(span->start_type));
} }
if (span->trunk_type == FTDM_TRUNK_FXS) { if (span->trunk_type == FTDM_TRUNK_FXS) {
currindex = span->chan_count;
configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number); configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number);
ftdm_group_add_channels(group_name, span, currindex);
} else { } else {
ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n"); ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n");
} }
@ -2841,13 +2847,16 @@ static ftdm_status_t load_config(void)
ftdm_analog_start_type2str(span->start_type)); ftdm_analog_start_type2str(span->start_type));
} }
if (span->trunk_type == FTDM_TRUNK_EM) { if (span->trunk_type == FTDM_TRUNK_EM) {
currindex = span->chan_count;
configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number); configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number);
ftdm_group_add_channels(group_name, span, currindex);
} else { } else {
ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n");
} }
} else if (!strcasecmp(var, "b-channel")) { } else if (!strcasecmp(var, "b-channel")) {
currindex = span->chan_count;
configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number); configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number);
ftdm_group_add_channels(group_name, span, val); ftdm_group_add_channels(group_name, span, currindex);
} else if (!strcasecmp(var, "d-channel")) { } else if (!strcasecmp(var, "d-channel")) {
if (d) { if (d) {
ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n"); ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n");
@ -2863,7 +2872,9 @@ static ftdm_status_t load_config(void)
d++; d++;
} }
} else if (!strcasecmp(var, "cas-channel")) { } else if (!strcasecmp(var, "cas-channel")) {
currindex = span->chan_count;
configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number); configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number);
ftdm_group_add_channels(group_name, span, currindex);
} else if (!strcasecmp(var, "dtmf_hangup")) { } else if (!strcasecmp(var, "dtmf_hangup")) {
span->dtmf_hangup = ftdm_strdup(val); span->dtmf_hangup = ftdm_strdup(val);
span->dtmf_hangup_len = strlen(val); span->dtmf_hangup_len = strlen(val);
@ -3228,42 +3239,22 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_remove_from_group(ftdm_group_t* group, ft
return FTDM_FAIL; return FTDM_FAIL;
} }
FT_DECLARE(ftdm_status_t) ftdm_group_add_channels(const char* name, ftdm_span_t* span, const char* val) static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex)
{ {
char *p, *mydata, *item_list[10]; int chan_index = 0;
int items, i;
assert(strlen(name) > 0); ftdm_assert_return(strlen(name) > 0, FTDM_FAIL, "Invalid group name provided\n");
ftdm_assert_return(currindex >= 0, FTDM_FAIL, "Invalid current channel index provided\n");
p = strchr(val, ':'); if (!span->chan_count) {
mydata = ftdm_strdup(++p); return FTDM_SUCCESS;
ftdm_assert_return(mydata != NULL, FTDM_FAIL, "ftdm_strdup failed when adding channels\n");
items = ftdm_separate_string(mydata, ',', item_list, (sizeof(item_list) / sizeof(item_list[0])));
for(i=0; i < items; i++) {
if (!strchr(item_list[i], '-')) {
int chan_no;
chan_no = atoi (item_list[i]);
ftdm_assert(chan_no > 0, "Channel number is not bigger than zero, expect a nasty failure!\n");
if (ftdm_channel_add_to_group(name, span->channels[chan_no]) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_CRIT, "Failed to add chan:%d to group:%s\n", chan_no, name);
} }
} else {
int chan_no_start, chan_no_end; for (chan_index = (span->chan_count - currindex); chan_index <= span->chan_count; chan_index++) {
if (sscanf(item_list[i], "%d-%d", &chan_no_start, &chan_no_end) == 2) { if (ftdm_channel_add_to_group(name, span->channels[chan_index])) {
while (chan_no_start <= chan_no_end) { ftdm_log(FTDM_LOG_CRIT, "Failed to add chan:%d to group:%s\n", chan_index, name);
if (ftdm_channel_add_to_group(name, span->channels[chan_no_start++])) {
ftdm_log(FTDM_LOG_CRIT, "Failed to add chan:%d to group:%s\n", chan_no_start-1, name);
} }
} }
}
}
}
ftdm_safe_free(mydata);
return FTDM_SUCCESS; return FTDM_SUCCESS;
} }

View File

@ -740,7 +740,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_close_all(void);
FT_DECLARE(ftdm_status_t) ftdm_span_add_channel(ftdm_span_t *span, ftdm_socket_t sockfd, ftdm_chan_type_t type, ftdm_channel_t **chan); FT_DECLARE(ftdm_status_t) ftdm_span_add_channel(ftdm_span_t *span, ftdm_socket_t sockfd, ftdm_chan_type_t type, ftdm_channel_t **chan);
FT_DECLARE(ftdm_status_t) ftdm_span_set_event_callback(ftdm_span_t *span, fio_event_cb_t event_callback); FT_DECLARE(ftdm_status_t) ftdm_span_set_event_callback(ftdm_span_t *span, fio_event_cb_t event_callback);
FT_DECLARE(ftdm_status_t) ftdm_channel_add_to_group(const char* name, ftdm_channel_t* ftdmchan); FT_DECLARE(ftdm_status_t) ftdm_channel_add_to_group(const char* name, ftdm_channel_t* ftdmchan);
FT_DECLARE(ftdm_status_t) ftdm_group_add_channels(const char* name, ftdm_span_t* span, const char* val);
FT_DECLARE(ftdm_status_t) ftdm_channel_remove_from_group(ftdm_group_t* group, ftdm_channel_t* ftdmchan); FT_DECLARE(ftdm_status_t) ftdm_channel_remove_from_group(ftdm_group_t* group, ftdm_channel_t* ftdmchan);
FT_DECLARE(ftdm_status_t) ftdm_group_find(uint32_t id, ftdm_group_t **group); FT_DECLARE(ftdm_status_t) ftdm_group_find(uint32_t id, ftdm_group_t **group);
FT_DECLARE(ftdm_status_t) ftdm_group_find_by_name(const char *name, ftdm_group_t **group); FT_DECLARE(ftdm_status_t) ftdm_group_find_by_name(const char *name, ftdm_group_t **group);