提交 f5894db2 authored 作者: Moises Silva's avatar Moises Silva

OPENZAP-238: [freetdm] Several core and gsm improvements

* Add error handing in mod_freetdm for ftdm trace failures

* Allow freetdm signaling modules to specify a destroy function

* Added conditional forwarding to the freetdm gsm module
  Just specify the conditional-forwarding-number gsm parameter in freetdm.conf.xml

* Added new 'gsm call' freetdm command for raw GSM calls which can be
  used to enable/disabling network features (e.g call *93) without
  having to resort to use a full originate that requires routing the
  call somewhere when answered

* Miscelaneous cleanup of piggy coding style left over by one of the
  previous authors -_-
上级 ff283f60
......@@ -4936,6 +4936,7 @@ FTDM_CLI_DECLARE(ftdm_cmd_trace)
uint32_t chan_id = 0;
uint32_t span_id = 0;
uint32_t chan_count = 0;
ftdm_status_t status;
ftdm_span_t *span = NULL;
ftdm_channel_t *chan = NULL;
......@@ -4964,17 +4965,39 @@ FTDM_CLI_DECLARE(ftdm_cmd_trace)
if (chan_id) {
chan = ftdm_span_get_channel(span, chan_id);
snprintf(tracepath, sizeof(tracepath), "%s-in-s%dc%d", argv[1], span_id, chan_id);
ftdm_channel_command(chan, FTDM_COMMAND_TRACE_INPUT, tracepath);
status = ftdm_channel_command(chan, FTDM_COMMAND_TRACE_INPUT, tracepath);
if (status != FTDM_SUCCESS) {
stream->write_function(stream, "-ERR failed to enable input trace at path %s\n", tracepath);
goto end;
}
snprintf(tracepath, sizeof(tracepath), "%s-out-s%dc%d", argv[1], span_id, chan_id);
ftdm_channel_command(chan, FTDM_COMMAND_TRACE_OUTPUT, tracepath);
status = ftdm_channel_command(chan, FTDM_COMMAND_TRACE_OUTPUT, tracepath);
if (status != FTDM_SUCCESS) {
stream->write_function(stream, "-ERR failed to enable output trace at path %s\n", tracepath);
ftdm_channel_command(chan, FTDM_COMMAND_TRACE_END_ALL, NULL);
goto end;
}
} else {
for (i = 1; i <= chan_count; i++) {
chan = ftdm_span_get_channel(span, i);
snprintf(tracepath, sizeof(tracepath), "%s-in-s%dc%d", argv[1], span_id, i);
ftdm_channel_command(chan, FTDM_COMMAND_TRACE_INPUT, tracepath);
status = ftdm_channel_command(chan, FTDM_COMMAND_TRACE_INPUT, tracepath);
if (status != FTDM_SUCCESS) {
stream->write_function(stream, "-ERR failed to enable input trace at path %s\n", tracepath);
goto end;
}
snprintf(tracepath, sizeof(tracepath), "%s-out-s%dc%d", argv[1], span_id, i);
ftdm_channel_command(chan, FTDM_COMMAND_TRACE_OUTPUT, tracepath);
status = ftdm_channel_command(chan, FTDM_COMMAND_TRACE_OUTPUT, tracepath);
if (status != FTDM_SUCCESS) {
stream->write_function(stream, "-ERR failed to enable output trace at path %s\n", tracepath);
ftdm_channel_command(chan, FTDM_COMMAND_TRACE_END_ALL, NULL);
goto end;
}
}
}
stream->write_function(stream, "+OK trace enabled with prefix path %s\n", argv[1]);
......
......@@ -728,7 +728,14 @@ static ftdm_status_t ftdm_span_destroy(ftdm_span_t *span)
}
ftdm_mutex_unlock(span->mutex);
ftdm_mutex_destroy(&span->mutex);
ftdm_safe_free(span->signal_data);
/* Give the span a chance to destroy its own signaling data */
if (span->destroy) {
span->destroy(span);
} else if (span->signal_data) {
/* We take care of their dirty business ... */
ftdm_free(span->signal_data);
}
return status;
}
......@@ -5520,7 +5527,8 @@ FT_DECLARE(ftdm_io_interface_t *) ftdm_global_get_io_interface(const char *iotyp
FT_DECLARE(int) ftdm_load_module(const char *name)
{
ftdm_dso_lib_t lib;
int count = 0, x = 0;
int count = 0;
ftdm_bool_t load_proceed = FTDM_TRUE;
char path[512] = "";
char *err;
ftdm_module_t *mod;
......@@ -5544,11 +5552,11 @@ FT_DECLARE(int) ftdm_load_module(const char *name)
if (mod->io_load(&interface1) != FTDM_SUCCESS || !interface1 || !interface1->name) {
ftdm_log(FTDM_LOG_ERROR, "Error loading %s\n", path);
load_proceed = FTDM_FALSE;
} else {
ftdm_log(FTDM_LOG_INFO, "Loading IO from %s [%s]\n", path, interface1->name);
if (ftdm_global_add_io_interface(interface1) == FTDM_SUCCESS) {
process_module_config(interface1);
x++;
}
}
}
......@@ -5556,13 +5564,13 @@ FT_DECLARE(int) ftdm_load_module(const char *name)
if (mod->sig_load) {
if (mod->sig_load() != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_ERROR, "Error loading %s\n", path);
load_proceed = FTDM_FALSE;
} else {
ftdm_log(FTDM_LOG_INFO, "Loading SIG from %s\n", path);
x++;
}
}
if (x) {
if (load_proceed) {
char *p;
mod->lib = lib;
ftdm_set_string(mod->path, path);
......@@ -5583,7 +5591,7 @@ FT_DECLARE(int) ftdm_load_module(const char *name)
}
ftdm_mutex_unlock(globals.mutex);
} else {
ftdm_log(FTDM_LOG_ERROR, "Unloading %s\n", path);
ftdm_log(FTDM_LOG_ERROR, "Errors during module load. Unloading %s\n", path);
ftdm_dso_destroy(&lib);
}
......
......@@ -512,6 +512,7 @@ struct ftdm_span {
fio_channel_request_t channel_request;
ftdm_span_start_t start;
ftdm_span_stop_t stop;
ftdm_span_destroy_t destroy;
ftdm_channel_sig_read_t sig_read;
ftdm_channel_sig_write_t sig_write;
ftdm_channel_sig_dtmf_t sig_queue_dtmf;
......
......@@ -348,6 +348,7 @@ typedef struct ftdm_bitstream ftdm_bitstream_t;
typedef struct ftdm_fsk_modulator ftdm_fsk_modulator_t;
typedef ftdm_status_t (*ftdm_span_start_t)(ftdm_span_t *span);
typedef ftdm_status_t (*ftdm_span_stop_t)(ftdm_span_t *span);
typedef ftdm_status_t (*ftdm_span_destroy_t)(ftdm_span_t *span);
typedef ftdm_status_t (*ftdm_channel_sig_read_t)(ftdm_channel_t *ftdmchan, void *data, ftdm_size_t size);
typedef ftdm_status_t (*ftdm_channel_sig_write_t)(ftdm_channel_t *ftdmchan, void *data, ftdm_size_t size);
typedef ftdm_status_t (*ftdm_channel_sig_dtmf_t)(ftdm_channel_t *ftdmchan, const char *dtmf);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论