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.
This commit is contained in:
Max 2016-04-07 12:27:11 +02:00 committed by Holger Hans Peter Freyther
parent 7a301d3576
commit 714b170f89
4 changed files with 18 additions and 20 deletions

View File

@ -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 *);

View File

@ -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)

View File

@ -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;

View File

@ -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;