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:
parent
7a301d3576
commit
714b170f89
|
@ -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 *);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue