mgcp: Allocate the endpoints for the E1 trunks as well.

This commit is contained in:
Holger Hans Peter Freyther 2011-02-28 14:37:03 +01:00
parent 74e61110e5
commit 1f0c5b4742
4 changed files with 78 additions and 55 deletions

View File

@ -159,7 +159,7 @@ struct mgcp_config {
struct mgcp_config *mgcp_config_alloc(void); struct mgcp_config *mgcp_config_alloc(void);
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg); int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg);
int mgcp_vty_init(void); int mgcp_vty_init(void);
int mgcp_endpoints_allocate(struct mgcp_config *cfg); int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
void mgcp_free_endp(struct mgcp_endpoint *endp); void mgcp_free_endp(struct mgcp_endpoint *endp);
int mgcp_reset_transcoder(struct mgcp_config *cfg); int mgcp_reset_transcoder(struct mgcp_config *cfg);

View File

@ -942,15 +942,12 @@ static void mgcp_rtp_end_init(struct mgcp_rtp_end *end)
end->rtcp.fd = -1; end->rtcp.fd = -1;
} }
int mgcp_endpoints_allocate(struct mgcp_config *cfg) int mgcp_endpoints_allocate(struct mgcp_trunk_config *tcfg)
{ {
struct mgcp_trunk_config *tcfg;
int i; int i;
tcfg = &cfg->trunk;
/* Initialize all endpoints */ /* Initialize all endpoints */
tcfg->endpoints = _talloc_zero_array(cfg, tcfg->endpoints = _talloc_zero_array(tcfg->cfg,
sizeof(struct mgcp_endpoint), sizeof(struct mgcp_endpoint),
tcfg->number_endpoints, "endpoints"); tcfg->number_endpoints, "endpoints");
if (!tcfg->endpoints) if (!tcfg->endpoints)
@ -958,7 +955,7 @@ int mgcp_endpoints_allocate(struct mgcp_config *cfg)
for (i = 0; i < tcfg->number_endpoints; ++i) { for (i = 0; i < tcfg->number_endpoints; ++i) {
tcfg->endpoints[i].ci = CI_UNUSED; tcfg->endpoints[i].ci = CI_UNUSED;
tcfg->endpoints[i].cfg = cfg; tcfg->endpoints[i].cfg = tcfg->cfg;
tcfg->endpoints[i].tcfg = tcfg; tcfg->endpoints[i].tcfg = tcfg;
mgcp_rtp_end_init(&tcfg->endpoints[i].net_end); mgcp_rtp_end_init(&tcfg->endpoints[i].net_end);
mgcp_rtp_end_init(&tcfg->endpoints[i].bts_end); mgcp_rtp_end_init(&tcfg->endpoints[i].bts_end);

View File

@ -636,9 +636,71 @@ int mgcp_vty_init(void)
return 0; return 0;
} }
static int allocate_trunk(struct mgcp_trunk_config *trunk)
{
int i;
struct mgcp_config *cfg = trunk->cfg;
if (mgcp_endpoints_allocate(trunk) != 0) {
LOGP(DMGCP, LOGL_ERROR,
"Failed to allocate %d endpoints on trunk %d.\n",
trunk->number_endpoints, trunk->trunk_nr);
return -1;
}
/* early bind */
for (i = 1; i < trunk->number_endpoints; ++i) {
struct mgcp_endpoint *endp = &trunk->endpoints[i];
int rtp_port;
if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
cfg->bts_ports.base_port);
if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
}
if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
cfg->net_ports.base_port);
if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->net_end.local_alloc = PORT_ALLOC_STATIC;
}
if (cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
/* network side */
rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
cfg->transcoder_ports.base_port);
if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
/* bts side */
rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
cfg->transcoder_ports.base_port);
if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
}
}
return 0;
}
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg) int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
{ {
int i, rc; int rc;
struct mgcp_trunk_config *trunk;
g_cfg = cfg; g_cfg = cfg;
rc = vty_read_config_file(config_file, NULL); rc = vty_read_config_file(config_file, NULL);
@ -656,55 +718,16 @@ int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
return -1; return -1;
} }
if (mgcp_endpoints_allocate(g_cfg) != 0) { if (allocate_trunk(&g_cfg->trunk) != 0) {
fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
g_cfg->trunk.number_endpoints);
return -1; return -1;
} }
/* early bind */ llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
for (i = 1; i < g_cfg->trunk.number_endpoints; ++i) { if (allocate_trunk(trunk) != 0) {
struct mgcp_endpoint *endp = &g_cfg->trunk.endpoints[i]; LOGP(DMGCP, LOGL_ERROR,
int rtp_port; "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
return -1;
if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
g_cfg->bts_ports.base_port);
if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
}
if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
g_cfg->net_ports.base_port);
if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->net_end.local_alloc = PORT_ALLOC_STATIC;
}
if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
/* network side */
rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
g_cfg->transcoder_ports.base_port);
if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
/* bts side */
rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
g_cfg->transcoder_ports.base_port);
if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
return -1;
}
endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
} }
} }

View File

@ -18,6 +18,7 @@
*/ */
#include <openbsc/mgcp.h> #include <openbsc/mgcp.h>
#include <openbsc/mgcp_internal.h>
#include <osmocore/talloc.h> #include <osmocore/talloc.h>
#include <string.h> #include <string.h>
@ -48,7 +49,9 @@ static void test_auep(void)
struct msgb *msg; struct msgb *msg;
struct mgcp_config *cfg = mgcp_config_alloc(); struct mgcp_config *cfg = mgcp_config_alloc();
cfg->trunk.number_endpoints = 64; cfg->trunk.number_endpoints = 64;
mgcp_endpoints_allocate(cfg); mgcp_endpoints_allocate(&cfg->trunk);
mgcp_endpoints_allocate(mgcp_trunk_alloc(cfg, 1));
inp = create_auep1(); inp = create_auep1();
msg = mgcp_handle_message(cfg, inp); msg = mgcp_handle_message(cfg, inp);