From c2bb077a489863cd6352298bff2eb510a4a22133 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 14 Sep 2011 00:23:22 +0200 Subject: mgcp: Split creation of endpoints and static port allocation Create the endpoints as soon as possible, configure static ports after we are through with the parsing of the VTY config. --- include/mgcp/mgcp_internal.h | 1 + src/mgcp/mgcp_protocol.c | 6 ++++++ src/mgcp/mgcp_vty.c | 41 ++++++++++++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/include/mgcp/mgcp_internal.h b/include/mgcp/mgcp_internal.h index 6d9f03e..d499166 100644 --- a/include/mgcp/mgcp_internal.h +++ b/include/mgcp/mgcp_internal.h @@ -155,6 +155,7 @@ static inline int endp_back_channel(int endpoint) struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index); struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index); +void mgcp_trunk_free(struct mgcp_trunk_config *cfg); #endif diff --git a/src/mgcp/mgcp_protocol.c b/src/mgcp/mgcp_protocol.c index 9d359cc..cae05da 100644 --- a/src/mgcp/mgcp_protocol.c +++ b/src/mgcp/mgcp_protocol.c @@ -937,6 +937,12 @@ struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int nr) return trunk; } +void mgcp_trunk_free(struct mgcp_trunk_config *cfg) +{ + llist_del(&cfg->entry); + talloc_free(cfg); +} + struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index) { struct mgcp_trunk_config *trunk; diff --git a/src/mgcp/mgcp_vty.c b/src/mgcp/mgcp_vty.c index 5167721..15ea196 100644 --- a/src/mgcp/mgcp_vty.c +++ b/src/mgcp/mgcp_vty.c @@ -37,6 +37,7 @@ extern void mgcp_write_extra(struct vty *vty, struct mgcp_config *cfg); extern void mgcp_write_trunk_extra(struct vty *vty, struct mgcp_trunk_config *cfg); +static int allocate_endpoints(struct mgcp_trunk_config *tcfg); enum node_type mgcp_go_parent(struct vty *vty) { @@ -404,8 +405,18 @@ DEFUN(cfg_mgcp_number_endp, "number endpoints <0-65534>", "The number of endpoints to allocate. This is not dynamic.") { + if (g_cfg->trunk.endpoints) { + vty_out(vty, "Can not change size.%s", VTY_NEWLINE); + return CMD_WARNING; + } + /* + 1 as we start counting at one */ g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1; + if (allocate_endpoints(&g_cfg->trunk) != 0) { + vty_out(vty, "Can not allocate endpoints.%s", VTY_NEWLINE); + return CMD_WARNING; + } + return CMD_SUCCESS; } @@ -461,8 +472,15 @@ DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd, int index = atoi(argv[0]); trunk = mgcp_trunk_num(g_cfg, index); - if (!trunk) + if (!trunk) { trunk = mgcp_trunk_alloc(g_cfg, index); + if (allocate_endpoints(trunk) != 0) { + vty_out(vty, "%%Unable to allocate endpoints.%s", + VTY_NEWLINE); + mgcp_trunk_free(trunk); + return CMD_WARNING; + } + } if (!trunk) { vty_out(vty, "%%Unable to allocate trunk %u.%s", @@ -710,18 +728,23 @@ int mgcp_vty_init(void) return 0; } -static int allocate_trunk(struct mgcp_trunk_config *trunk) +static int allocate_endpoints(struct mgcp_trunk_config *tcfg) { - int i; - struct mgcp_config *cfg = trunk->cfg; - - if (mgcp_endpoints_allocate(trunk) != 0) { + if (mgcp_endpoints_allocate(tcfg) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to allocate %d endpoints on trunk %d.\n", - trunk->number_endpoints, trunk->trunk_nr); + tcfg->number_endpoints, tcfg->trunk_nr); return -1; } + return 0; +} + +static int configure_endpoints(struct mgcp_trunk_config *trunk) +{ + int i; + struct mgcp_config *cfg = trunk->cfg; + /* early bind */ for (i = 1; i < trunk->number_endpoints; ++i) { struct mgcp_endpoint *endp = &trunk->endpoints[i]; @@ -798,13 +821,13 @@ int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg) g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port); g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port); - if (allocate_trunk(&g_cfg->trunk) != 0) { + if (configure_endpoints(&g_cfg->trunk) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n"); return -1; } llist_for_each_entry(trunk, &g_cfg->trunks, entry) { - if (allocate_trunk(trunk) != 0) { + if (configure_endpoints(trunk) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr); return -1; -- cgit v1.2.3