for (myspan = switch_xml_child(spans, "span"); myspan; myspan = myspan->next) {
char *id = (char *) switch_xml_attr(myspan, "id");
char *name = (char *) switch_xml_attr(myspan, "name");
+ char *sigmod = (char *) switch_xml_attr(myspan, "sigmod");
zap_status_t zstatus = ZAP_FAIL;
const char *context = "default";
const char *dialplan = "XML";
uint32_t span_id = 0;
zap_span_t *span = NULL;
const char *tonegroup = NULL;
- char *local_ip = NULL;
- int local_port = 0;
- char *remote_ip = NULL;
- int remote_port = 0;
+ zap_conf_parameter_t spanparameters[30];
+ unsigned paramindex = 0;
+
+ if (!id && !name) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "boost span requires an id or name as attribute: <span id=ozid|name=ozname>\n");
+ continue;
+ }
+ memset(spanparameters, 0, sizeof(spanparameters));
+ if (sigmod) {
+ spanparameters[paramindex].var = "sigmod";
+ spanparameters[paramindex].val = sigmod;
+ paramindex++;
+ }
for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
-
+ if (sizeof(spanparameters)/sizeof(spanparameters[0]) == paramindex) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for boost span, ignoring any parameter after %s\n", var);
+ break;
+ }
if (!strcasecmp(var, "tonegroup")) {
tonegroup = val;
- } else if (!strcasecmp(var, "local-ip")) {
- local_ip = val;
- } else if (!strcasecmp(var, "local-port")) {
- local_port = atoi(val);
- } else if (!strcasecmp(var, "remote-ip")) {
- remote_ip = val;
- } else if (!strcasecmp(var, "remote-port")) {
- remote_port = atoi(val);
} else if (!strcasecmp(var, "context")) {
context = val;
} else if (!strcasecmp(var, "dialplan")) {
dialplan = val;
- }
- }
-
- if (!id && !name) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required param\n");
- continue;
+ } else {
+ spanparameters[paramindex].var = var;
+ spanparameters[paramindex].val = val;
+ paramindex++;
+ }
}
if (!tonegroup) {
span_id = span->span_id;
}
- if (zap_configure_span("sangoma_boost", span, on_clear_channel_signal,
- "local_ip", local_ip,
- "local_port", &local_port,
- "remote_ip", remote_ip,
- "remote_port", &remote_port,
- TAG_END) != ZAP_SUCCESS) {
+ if (zap_configure_span_signaling("sangoma_boost", span, on_clear_channel_signal, spanparameters) != ZAP_SUCCESS) {
zap_log(ZAP_LOG_ERROR, "Error starting OpenZAP span %d error: %s\n", span_id, span->last_error);
continue;
}
OZ_DECLARE(int) zap_load_modules(void);
OZ_DECLARE(zap_status_t) zap_unload_modules(void);
OZ_DECLARE(zap_status_t) zap_configure_span(const char *type, zap_span_t *span, zio_signal_cb_t sig_cb, ...);
+OZ_DECLARE(zap_status_t) zap_configure_span_signaling(const char *type, zap_span_t *span, zio_signal_cb_t sig_cb, zap_conf_parameter_t *parameters);
OZ_DECLARE(zap_status_t) zap_span_start(zap_span_t *span);
OZ_DECLARE(zap_status_t) zap_span_stop(zap_span_t *span);
OZ_DECLARE(char *) zap_build_dso_path(const char *name, char *path, zap_size_t len);
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Contributors:
+ *
+ * Moises Silva <moy@sangoma.com>
+ *
*/
#ifndef ZAP_TYPES_H
ZAP_HW_LINK_CONNECTED
} zap_channel_hw_link_status_t;
+typedef struct zap_conf_parameter_s {
+ const char *var;
+ const char *val;
+} zap_conf_parameter_t;
+
typedef struct zap_channel zap_channel_t;
typedef struct zap_event zap_event_t;
typedef struct zap_sigmsg zap_sigmsg_t;
#define ZIO_IO_UNLOAD_ARGS (void)
#define ZIO_SIG_LOAD_ARGS (void)
#define ZIO_SIG_CONFIGURE_ARGS (zap_span_t *span, zio_signal_cb_t sig_cb, va_list ap)
+#define ZIO_CONFIGURE_SPAN_SIGNALING_ARGS (zap_span_t *span, zio_signal_cb_t sig_cb, zap_conf_parameter_t *zap_parameters)
#define ZIO_SIG_UNLOAD_ARGS (void)
#define ZIO_API_ARGS (zap_stream_handle_t *stream, const char *data)
typedef zap_status_t (*zio_io_load_t) ZIO_IO_LOAD_ARGS ;
typedef zap_status_t (*zio_sig_load_t) ZIO_SIG_LOAD_ARGS ;
typedef zap_status_t (*zio_sig_configure_t) ZIO_SIG_CONFIGURE_ARGS ;
+typedef zap_status_t (*zio_configure_span_signaling_t) ZIO_CONFIGURE_SPAN_SIGNALING_ARGS ;
typedef zap_status_t (*zio_io_unload_t) ZIO_IO_UNLOAD_ARGS ;
typedef zap_status_t (*zio_sig_unload_t) ZIO_SIG_UNLOAD_ARGS ;
typedef zap_status_t (*zio_api_t) ZIO_API_ARGS ;
#define ZIO_IO_LOAD_FUNCTION(name) zap_status_t name ZIO_IO_LOAD_ARGS
#define ZIO_SIG_LOAD_FUNCTION(name) zap_status_t name ZIO_SIG_LOAD_ARGS
#define ZIO_SIG_CONFIGURE_FUNCTION(name) zap_status_t name ZIO_SIG_CONFIGURE_ARGS
+#define ZIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(name) zap_status_t name ZIO_CONFIGURE_SPAN_SIGNALING_ARGS
#define ZIO_IO_UNLOAD_FUNCTION(name) zap_status_t name ZIO_IO_UNLOAD_ARGS
#define ZIO_SIG_UNLOAD_FUNCTION(name) zap_status_t name ZIO_SIG_UNLOAD_ARGS
#define ZIO_API_FUNCTION(name) zap_status_t name ZIO_API_ARGS
#include "zap_dso.h"
-
-
typedef struct {
char name[256];
zio_io_load_t io_load;
zio_sig_unload_t sig_unload;
zap_dso_lib_t lib;
char path[256];
+ /*!
+ \brief configure a given span signaling
+ \see sig_configure
+ This is just like sig_configure but receives
+ an array of paramters instead of va_list
+ I'd like to deprecate sig_configure and move
+ all modules to use sigparam_configure
+ */
+ zio_configure_span_signaling_t configure_span_signaling;
} zap_module_t;
#ifndef __FUNCTION__
* \param ap List of configuration variables
* \return Success or failure
*/
-static ZIO_SIG_CONFIGURE_FUNCTION(zap_sangoma_boost_configure_span)
+static ZIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(zap_sangoma_boost_configure_span)
{
#define FAIL_CONFIG_RETURN(retstatus) \
if (sangoma_boost_data) \
zap_mutex_unlock(g_boost_modules_mutex); \
if (lib) \
zap_dso_destroy(lib); \
- va_end(conflist); \
return retstatus;
boost_sigmod_interface_t *sigmod_iface = NULL;
const char *local_ip = "127.0.0.65", *remote_ip = "127.0.0.66";
const char *sigmod = NULL;
int local_port = 53000, remote_port = 53000;
- char *var = NULL, *val = NULL;
- int *intval = NULL;
+ const char *var = NULL, *val = NULL;
int hash_locked = 0;
zap_dso_lib_t lib = NULL;
char path[255] = "";
char *err = NULL;
- va_list conflist;
+ unsigned paramindex = 0;
- /* we need to copy the list before moving with va_arg in case this configuration should be handled by a sigmod */
- va_copy(conflist, ap); /* WARNING: must be freed before returning */
-
- while((var = va_arg(ap, char *))) {
+ for (; zap_parameters[paramindex].var; paramindex++) {
+ var = zap_parameters[paramindex].var;
+ val = zap_parameters[paramindex].val;
if (!strcasecmp(var, "sigmod")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
sigmod = val;
} else if (!strcasecmp(var, "local_ip")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
local_ip = val;
} else if (!strcasecmp(var, "remote_ip")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
remote_ip = val;
} else if (!strcasecmp(var, "local_port")) {
- if (!(intval = va_arg(ap, int *))) {
- break;
- }
- local_port = *intval;
+ local_port = atoi(val);
} else if (!strcasecmp(var, "remote_port")) {
- if (!(intval = va_arg(ap, int *))) {
- break;
- }
- remote_port = *intval;
- } else {
+ remote_port = atoi(val);
+ } else if (!sigmod) {
snprintf(span->last_error, sizeof(span->last_error), "Unknown parameter [%s]", var);
FAIL_CONFIG_RETURN(ZAP_FAIL);
}
}
zap_log(ZAP_LOG_NOTICE, "Span %s will use Sangoma Boost Signaling Module %s\n", span->name, sigmod_iface->name);
sangoma_boost_data->sigmod = sigmod_iface;
- sigmod_iface->configure_span(span, conflist);
+ sigmod_iface->configure_span(span, zap_parameters);
} else {
zap_set_string(sangoma_boost_data->mcon.cfg.local_ip, local_ip);
sangoma_boost_data->mcon.cfg.local_port = local_port;
span->get_sig_status = sangoma_boost_get_sig_status;
span->state_map = &boost_state_map;
zap_set_flag_locked(span, ZAP_SPAN_SUSPENDED);
-
- va_end(conflist);
-
return ZAP_SUCCESS;
}
* \brief Openzap sangoma boost signaling module definition
*/
zap_module_t zap_module = {
- "sangoma_boost",
- NULL,
- NULL,
- zap_sangoma_boost_init,
- zap_sangoma_boost_configure_span,
- zap_sangoma_boost_destroy
+ .name = "sangoma_boost",
+ .sig_load = zap_sangoma_boost_init,
+ .sig_unload = zap_sangoma_boost_destroy,
+ .configure_span_signaling = zap_sangoma_boost_configure_span
};
/* For Emacs:
/*!
\brief Configure the given span signaling
\param span The openzap span
- \param ap The list of configuration key,value pairs (must be null terminated)
+ \param parameters The array of configuration key,value pairs (must be null terminated)
\return ZAP_SUCCESS or ZAP_FAIL
*/
-#define BOOST_CONFIGURE_SPAN_ARGS (zap_span_t *span, va_list ap)
+#define BOOST_CONFIGURE_SPAN_ARGS (zap_span_t *span, zap_conf_parameter_t *parameters)
typedef zap_status_t (*boost_configure_span_func_t) BOOST_CONFIGURE_SPAN_ARGS;
#define BOOST_CONFIGURE_SPAN_FUNCTION(name) zap_status_t name BOOST_CONFIGURE_SPAN_ARGS
return status;
}
+OZ_DECLARE(zap_status_t) zap_configure_span_signaling(const char *type, zap_span_t *span, zio_signal_cb_t sig_cb, zap_conf_parameter_t *parameters)
+{
+ zap_module_t *mod = (zap_module_t *) hashtable_search(globals.module_hash, (void *)type);
+ zap_status_t status = ZAP_FAIL;
+
+ zap_assert(type != NULL, ZAP_FAIL, "No signaling type");
+ zap_assert(span != NULL, ZAP_FAIL, "No span");
+ zap_assert(sig_cb != NULL, ZAP_FAIL, "No signaling callback");
+ zap_assert(parameters != NULL, ZAP_FAIL, "No parameters");
+
+ if (!mod) {
+ zap_load_module_assume(type);
+ if ((mod = (zap_module_t *) hashtable_search(globals.module_hash, (void *)type))) {
+ zap_log(ZAP_LOG_INFO, "auto-loaded '%s'\n", type);
+ }
+ }
+
+ if (mod && mod->configure_span_signaling) {
+ status = mod->configure_span_signaling(span, sig_cb, parameters);
+ } else {
+ zap_log(ZAP_LOG_ERROR, "can't find module '%s' or the module did not implement the signaling configuration method\n", type);
+ }
+
+ return status;
+}
+
OZ_DECLARE(zap_status_t) zap_span_start(zap_span_t *span)
{
if (span->start) {