aboutsummaryrefslogtreecommitdiffstats
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
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.
-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;