aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/include/openbsc/bsc_nat.h6
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_utils.c28
-rw-r--r--openbsc/tests/bsc-nat/bsc_nat_test.c25
3 files changed, 50 insertions, 9 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 7a161ff27..15e20997a 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -498,4 +498,10 @@ int bsc_nat_handle_ctrlif_msg(struct bsc_connection *bsc, struct msgb *msg);
int bsc_nat_extract_lac(struct bsc_connection *bsc, struct nat_sccp_connection *con,
struct bsc_nat_parsed *parsed, struct msgb *msg);
+
+/*
+ * Use for testing
+ */
+void bsc_nat_free(struct bsc_nat *nat);
+
#endif
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
index 93831c417..70ad577b9 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
@@ -120,6 +120,32 @@ struct bsc_nat *bsc_nat_alloc(void)
return nat;
}
+void bsc_nat_free(struct bsc_nat *nat)
+{
+ struct bsc_config *cfg, *tmp;
+ struct bsc_nat_acc_lst *lst, *tmp_lst;
+
+ llist_for_each_entry_safe(cfg, tmp, &nat->bsc_configs, entry)
+ bsc_config_free(cfg);
+ llist_for_each_entry_safe(lst, tmp_lst, &nat->access_lists, list)
+ bsc_nat_acc_lst_delete(lst);
+
+ bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
+ bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr_post, NULL);
+ bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, NULL);
+ bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_num_rewr, NULL);
+ bsc_nat_num_rewr_entry_adapt(nat, &nat->tpdest_match, NULL);
+
+ osmo_counter_free(nat->stats.sccp.conn);
+ osmo_counter_free(nat->stats.sccp.calls);
+ osmo_counter_free(nat->stats.bsc.reconn);
+ osmo_counter_free(nat->stats.bsc.auth_fail);
+ osmo_counter_free(nat->stats.msc.reconn);
+ osmo_counter_free(nat->stats.ussd.reconn);
+ talloc_free(nat->mgcp_cfg);
+ talloc_free(nat);
+}
+
void bsc_nat_set_msc_ip(struct bsc_nat *nat, const char *ip)
{
bsc_replace_string(nat, &nat->main_dest->ip, ip);
@@ -167,7 +193,9 @@ struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token)
void bsc_config_free(struct bsc_config *cfg)
{
+ llist_del(&cfg->entry);
rate_ctr_group_free(cfg->stats.ctrg);
+ talloc_free(cfg);
}
static void _add_lac(void *ctx, struct llist_head *list, int _lac)
diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c
index 6f517071a..245b081e1 100644
--- a/openbsc/tests/bsc-nat/bsc_nat_test.c
+++ b/openbsc/tests/bsc-nat/bsc_nat_test.c
@@ -419,7 +419,7 @@ static void test_contrack()
bsc_config_free(con->cfg);
- talloc_free(nat);
+ bsc_nat_free(nat);
msgb_free(msg);
}
@@ -453,7 +453,7 @@ static void test_paging(void)
abort();
}
- talloc_free(nat);
+ bsc_nat_free(nat);
}
static void test_mgcp_allocations(void)
@@ -577,7 +577,7 @@ static void test_mgcp_ass_tracking(void)
}
bsc_config_free(bsc->cfg);
- talloc_free(nat);
+ bsc_nat_free(nat);
}
/* test the code to find a given connection */
@@ -610,7 +610,7 @@ static void test_mgcp_find(void)
}
/* free everything */
- talloc_free(nat);
+ bsc_nat_free(nat);
}
static void test_mgcp_rewrite(void)
@@ -937,7 +937,7 @@ static void test_cr_filter()
}
msgb_free(msg);
- talloc_free(nat);
+ bsc_nat_free(nat);
}
static void test_dt_filter()
@@ -994,6 +994,9 @@ static void test_dt_filter()
memset(&cause, 0, sizeof(cause));
bsc_nat_filter_dt(bsc, msg, con, parsed, &cause);
}
+
+ msgb_free(msg);
+ bsc_nat_free(nat);
}
static void test_setup_rewrite()
@@ -1159,7 +1162,7 @@ static void test_setup_rewrite()
ARRAY_SIZE(cc_setup_national_again));
msgb_free(out);
bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
- talloc_free(nat);
+ bsc_nat_free(nat);
}
static void test_setup_rewrite_prefix(void)
@@ -1208,7 +1211,7 @@ static void test_setup_rewrite_prefix(void)
msgb_free(out);
bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
- talloc_free(nat);
+ bsc_nat_free(nat);
}
static void test_setup_rewrite_post(void)
@@ -1267,8 +1270,7 @@ static void test_setup_rewrite_post(void)
verify_msg(out, cc_setup_national, ARRAY_SIZE(cc_setup_national));
msgb_free(out);
- bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
- talloc_free(nat);
+ bsc_nat_free(nat);
}
static void test_sms_smsc_rewrite()
@@ -1364,6 +1366,7 @@ static void test_sms_smsc_rewrite()
verify_msg(out, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
msgb_free(out);
+ bsc_nat_free(nat);
}
static void test_sms_number_rewrite(void)
@@ -1436,6 +1439,7 @@ static void test_sms_number_rewrite(void)
verify_msg(out, smsc_rewrite_num_patched_tp_srr,
ARRAY_SIZE(smsc_rewrite_num_patched_tp_srr));
msgb_free(out);
+ bsc_nat_free(nat);
}
static void test_barr_list_parsing(void)
@@ -1502,6 +1506,7 @@ static void test_barr_list_parsing(void)
entry->cm_reject_cause, entry->lu_reject_cause);
}
+ rc = bsc_nat_barr_adapt(NULL, &root, NULL);
}
static void test_nat_extract_lac()
@@ -1535,6 +1540,8 @@ static void test_nat_extract_lac()
/* verify the LAC */
OSMO_ASSERT(con.lac == 8210);
OSMO_ASSERT(con.ci == 50000);
+
+ bsc_nat_free(nat);
}
int main(int argc, char **argv)