aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/include/openbsc/bsc_nat.h2
-rw-r--r--openbsc/src/nat/bsc_mgcp_utils.c17
-rw-r--r--openbsc/tests/bsc-nat/bsc_nat_test.c45
3 files changed, 62 insertions, 2 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 6f79106fd..412d9a841 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -183,4 +183,6 @@ void bsc_mgcp_clear(struct sccp_connections *);
void bsc_mgcp_free_endpoints(struct bsc_nat *nat);
int bsc_mgcp_init(struct bsc_nat *nat);
+struct bsc_connection *bsc_mgcp_find_con(struct bsc_nat *, int endpoint_number);
+
#endif
diff --git a/openbsc/src/nat/bsc_mgcp_utils.c b/openbsc/src/nat/bsc_mgcp_utils.c
index e19010597..0f45a91a5 100644
--- a/openbsc/src/nat/bsc_mgcp_utils.c
+++ b/openbsc/src/nat/bsc_mgcp_utils.c
@@ -78,6 +78,23 @@ void bsc_mgcp_free_endpoints(struct bsc_nat *nat)
mgcp_free_endp(&nat->mgcp_cfg->endpoints[i]);
}
+struct bsc_connection *bsc_mgcp_find_con(struct bsc_nat *nat, int endpoint)
+{
+ struct sccp_connections *sccp;
+
+ llist_for_each_entry(sccp, &nat->sccp_connections, list_entry) {
+ if (sccp->msc_timeslot == -1)
+ continue;
+ if (mgcp_timeslot_to_endpoint(0, sccp->msc_timeslot) != endpoint)
+ continue;
+
+ return sccp->bsc;
+ }
+
+ LOGP(DMGCP, LOGL_ERROR, "Failed to find the connection.\n");
+ return NULL;
+}
+
static int mgcp_do_read(struct bsc_fd *fd)
{
struct bsc_nat *nat;
diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c
index 70e98d721..30f1490f1 100644
--- a/openbsc/tests/bsc-nat/bsc_nat_test.c
+++ b/openbsc/tests/bsc-nat/bsc_nat_test.c
@@ -335,7 +335,7 @@ static void test_paging(void)
talloc_free(parsed);
}
-static void test_mgcp(void)
+static void test_mgcp_ass_tracking(void)
{
struct sccp_connections con;
struct bsc_nat_parsed *parsed;
@@ -370,6 +370,46 @@ static void test_mgcp(void)
}
}
+/* test the code to find a given connection */
+static void test_mgcp_find(void)
+{
+ struct bsc_nat *nat;
+ struct bsc_connection *con;
+ struct sccp_connections *sccp_con;
+
+ fprintf(stderr, "Testing finding of a BSC Connection\n");
+
+ nat = bsc_nat_alloc();
+ con = bsc_connection_alloc(nat);
+ llist_add(&con->list_entry, &nat->bsc_connections);
+
+ sccp_con = talloc_zero(con, struct sccp_connections);
+ sccp_con->msc_timeslot = 12;
+ sccp_con->bsc_timeslot = 12;
+ sccp_con->bsc = con;
+ llist_add(&sccp_con->list_entry, &nat->sccp_connections);
+
+ if (bsc_mgcp_find_con(nat, 11) != NULL) {
+ fprintf(stderr, "Found the wrong connection.\n");
+ abort();
+ }
+
+ if (bsc_mgcp_find_con(nat, 12) != con) {
+ fprintf(stderr, "Didn't find the connection\n");
+ abort();
+ }
+
+ sccp_con->msc_timeslot = 0;
+ sccp_con->bsc_timeslot = 0;
+ if (bsc_mgcp_find_con(nat, 1) != con) {
+ fprintf(stderr, "Didn't find the connection\n");
+ abort();
+ }
+
+ /* free everything */
+ talloc_free(nat);
+}
+
int main(int argc, char **argv)
{
struct debug_target *stderr_target;
@@ -381,7 +421,8 @@ int main(int argc, char **argv)
test_filter();
test_contrack();
test_paging();
- test_mgcp();
+ test_mgcp_ass_tracking();
+ test_mgcp_find();
return 0;
}