aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/nat/bsc_mgcp_utils.c31
-rw-r--r--openbsc/src/nat/bsc_nat_utils.c1
-rw-r--r--openbsc/src/nat/bsc_nat_vty.c10
3 files changed, 33 insertions, 9 deletions
diff --git a/openbsc/src/nat/bsc_mgcp_utils.c b/openbsc/src/nat/bsc_mgcp_utils.c
index aacfce6eb..d814f0dc3 100644
--- a/openbsc/src/nat/bsc_mgcp_utils.c
+++ b/openbsc/src/nat/bsc_mgcp_utils.c
@@ -38,18 +38,33 @@
#include <errno.h>
#include <unistd.h>
+static int bsc_init_endps_if_needed(struct bsc_connection *con)
+{
+ /* we have done that */
+ if (con->_endpoint_status)
+ return 0;
+
+ /* we have no config... */
+ if (!con->cfg)
+ return -1;
+
+ con->_endpoint_status = talloc_zero_array(con, char,
+ (32 * con->cfg->number_multiplexes) + 1);
+ return con->_endpoint_status == NULL;
+}
+
static int bsc_assign_endpoint(struct bsc_connection *bsc, struct sccp_connections *con)
{
- const int number_endpoints = ARRAY_SIZE(bsc->endpoint_status);
+ const int number_endpoints = 31 * bsc->cfg->number_multiplexes;
int i;
- for (i = 1; i < number_endpoints; ++i) {
+ for (i = 1; i <= number_endpoints; ++i) {
int endpoint = (bsc->last_endpoint + i) % number_endpoints;
if (endpoint == 0)
endpoint = 1;
- if (bsc->endpoint_status[endpoint] == 0) {
- bsc->endpoint_status[endpoint] = 1;
+ if (bsc->_endpoint_status[endpoint] == 0) {
+ bsc->_endpoint_status[endpoint] = 1;
con->bsc_endp = endpoint;
bsc->last_endpoint = endpoint;
return 0;
@@ -119,6 +134,8 @@ int bsc_mgcp_assign_patch(struct sccp_connections *con, struct msgb *msg)
}
con->msc_endp = endp;
+ if (bsc_init_endps_if_needed(con->bsc) != 0)
+ return -1;
if (bsc_assign_endpoint(con->bsc, con) != 0)
return -1;
@@ -202,10 +219,10 @@ void bsc_mgcp_init(struct sccp_connections *con)
void bsc_mgcp_dlcx(struct sccp_connections *con)
{
/* send a DLCX down the stream */
- if (con->bsc_endp != -1) {
- if (con->bsc->endpoint_status[con->bsc_endp] != 1)
+ if (con->bsc_endp != -1 && con->bsc->_endpoint_status) {
+ if (con->bsc->_endpoint_status[con->bsc_endp] != 1)
LOGP(DNAT, LOGL_ERROR, "Endpoint 0x%x was not in use\n", con->bsc_endp);
- con->bsc->endpoint_status[con->bsc_endp] = 0;
+ con->bsc->_endpoint_status[con->bsc_endp] = 0;
bsc_mgcp_send_dlcx(con->bsc, con->bsc_endp);
bsc_mgcp_free_endpoint(con->bsc->nat, con->msc_endp);
}
diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c
index 7b75fa56d..047038785 100644
--- a/openbsc/src/nat/bsc_nat_utils.c
+++ b/openbsc/src/nat/bsc_nat_utils.c
@@ -126,6 +126,7 @@ struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token)
conf->token = talloc_strdup(conf, token);
conf->nr = nat->num_bsc;
conf->nat = nat;
+ conf->number_multiplexes = 1;
INIT_LLIST_HEAD(&conf->lac_list);
diff --git a/openbsc/src/nat/bsc_nat_vty.c b/openbsc/src/nat/bsc_nat_vty.c
index 532e7905c..01bee7489 100644
--- a/openbsc/src/nat/bsc_nat_vty.c
+++ b/openbsc/src/nat/bsc_nat_vty.c
@@ -172,15 +172,21 @@ DEFUN(show_bsc_mgcp, show_bsc_mgcp_cmd, "show bsc mgcp NR",
int i;
llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
+ int endpoints;
if (!con->cfg)
continue;
if (con->cfg->nr != nr)
continue;
+ /* this bsc has no audio endpoints yet */
+ if (!con->_endpoint_status)
+ continue;
+
vty_out(vty, "MGCP Status for %d%s", con->cfg->nr, VTY_NEWLINE);
- for (i = 1; i < ARRAY_SIZE(con->endpoint_status); ++i)
+ endpoints = 31 * con->cfg->number_multiplexes;
+ for (i = 1; i <= endpoints; ++i)
vty_out(vty, " Endpoint 0x%x %s%s", i,
- con->endpoint_status[i] == 0 ? "free" : "allocated",
+ con->_endpoint_status[i] == 0 ? "free" : "allocated",
VTY_NEWLINE);
break;
}