aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2016-04-07 12:27:11 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-04-12 10:15:02 -0400
commit714b170f895dfdc2f0d725ab110baf3dc14ef874 (patch)
tree173a97c9280642127eb102e9c5c19fad50b7493c /openbsc
parent7a301d357612347723e59c7f16a97227814d406e (diff)
NAT: allow allocating BSC in arbitrary order
Check for existing BSC before allocating new one. Track number of remaining BSCs on deallocation. Explicitly use BSC number in allocation function.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/bsc_nat.h3
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_utils.c7
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_vty.c14
-rw-r--r--openbsc/tests/bsc-nat/bsc_nat_test.c14
4 files changed, 18 insertions, 20 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 309adb1ba..c5fefe172 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -320,7 +320,8 @@ struct bsc_nat_ussd_con {
};
/* create and init the structures */
-struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token);
+struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token,
+ unsigned int number);
struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num);
struct bsc_config *bsc_config_by_token(struct bsc_nat *nat, const char *token, int len);
void bsc_config_free(struct bsc_config *);
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
index cc7d44287..37b01e314 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
@@ -155,14 +155,15 @@ struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat)
return con;
}
-struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token)
+struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token,
+ unsigned int number)
{
struct bsc_config *conf = talloc_zero(nat, struct bsc_config);
if (!conf)
return NULL;
conf->token = talloc_strdup(conf, token);
- conf->nr = nat->num_bsc;
+ conf->nr = number;
conf->nat = nat;
conf->max_endpoints = 32;
conf->paging_group = PAGIN_GROUP_UNASSIGNED;
@@ -205,6 +206,8 @@ void bsc_config_free(struct bsc_config *cfg)
llist_del(&cfg->entry);
rate_ctr_group_free(cfg->stats.ctrg);
talloc_free(cfg);
+ cfg->nat->num_bsc--;
+ OSMO_ASSERT(cfg->nat->num_bsc >= 0)
}
static void _add_lac(void *ctx, struct llist_head *list, int _lac)
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
index 5af6d9743..4348d6fb8 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
@@ -799,17 +799,11 @@ DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR",
"BSC configuration\n" "Identifier of the BSC\n")
{
int bsc_nr = atoi(argv[0]);
- struct bsc_config *bsc;
+ struct bsc_config *bsc = bsc_config_num(_nat, bsc_nr);
- if (bsc_nr > _nat->num_bsc) {
- vty_out(vty, "%% The next unused BSC number is %u%s",
- _nat->num_bsc, VTY_NEWLINE);
- return CMD_WARNING;
- } else if (bsc_nr == _nat->num_bsc) {
- /* allocate a new one */
- bsc = bsc_config_alloc(_nat, "unknown");
- } else
- bsc = bsc_config_num(_nat, bsc_nr);
+ /* allocate a new one */
+ if (!bsc)
+ bsc = bsc_config_alloc(_nat, "unknown", bsc_nr);
if (!bsc)
return CMD_WARNING;
diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c
index a4b313c91..a405763bc 100644
--- a/openbsc/tests/bsc-nat/bsc_nat_test.c
+++ b/openbsc/tests/bsc-nat/bsc_nat_test.c
@@ -316,7 +316,7 @@ static void test_contrack()
printf("Testing connection tracking.\n");
nat = bsc_nat_alloc();
con = bsc_connection_alloc(nat);
- con->cfg = bsc_config_alloc(nat, "foo");
+ con->cfg = bsc_config_alloc(nat, "foo", 0);
bsc_config_add_lac(con->cfg, 23);
bsc_config_add_lac(con->cfg, 49);
bsc_config_add_lac(con->cfg, 42);
@@ -434,7 +434,7 @@ static void test_paging(void)
nat = bsc_nat_alloc();
con = bsc_connection_alloc(nat);
- cfg = bsc_config_alloc(nat, "unknown");
+ cfg = bsc_config_alloc(nat, "unknown", 0);
con->cfg = cfg;
bsc_config_add_lac(cfg, 23);
con->authenticated = 1;
@@ -476,7 +476,7 @@ static void test_mgcp_allocations(void)
nat->mgcp_cfg->trunk.number_endpoints = 64;
bsc = bsc_connection_alloc(nat);
- bsc->cfg = bsc_config_alloc(nat, "foo");
+ bsc->cfg = bsc_config_alloc(nat, "foo", 0);
bsc->cfg->max_endpoints = 60;
bsc_config_add_lac(bsc->cfg, 2323);
bsc->last_endpoint = 0x22;
@@ -522,7 +522,7 @@ static void test_mgcp_ass_tracking(void)
mgcp_endpoints_allocate(&nat->mgcp_cfg->trunk);
bsc = bsc_connection_alloc(nat);
- bsc->cfg = bsc_config_alloc(nat, "foo");
+ bsc->cfg = bsc_config_alloc(nat, "foo", 0);
bsc_config_add_lac(bsc->cfg, 2323);
bsc->last_endpoint = 0x1e;
con.bsc = bsc;
@@ -874,7 +874,7 @@ static void test_cr_filter()
struct bsc_nat *nat = bsc_nat_alloc();
struct bsc_connection *bsc = bsc_connection_alloc(nat);
- bsc->cfg = bsc_config_alloc(nat, "foo");
+ bsc->cfg = bsc_config_alloc(nat, "foo", 0);
bsc_config_add_lac(bsc->cfg, 1234);
bsc->cfg->acc_lst_name = "bsc";
nat->acc_lst_name = "nat";
@@ -953,7 +953,7 @@ static void test_dt_filter()
struct bsc_connection *bsc = bsc_connection_alloc(nat);
struct nat_sccp_connection *con = talloc_zero(0, struct nat_sccp_connection);
- bsc->cfg = bsc_config_alloc(nat, "foo");
+ bsc->cfg = bsc_config_alloc(nat, "foo", 0);
bsc_config_add_lac(bsc->cfg, 23);
con->bsc = bsc;
@@ -1525,7 +1525,7 @@ static void test_nat_extract_lac()
/* initialize the testcase */
nat = bsc_nat_alloc();
bsc = bsc_connection_alloc(nat);
- bsc->cfg = bsc_config_alloc(nat, "foo");
+ bsc->cfg = bsc_config_alloc(nat, "foo", 0);
memset(&con, 0, sizeof(con));
con.bsc = bsc;