diff options
-rw-r--r-- | openbsc/include/openbsc/bsc_nat_sccp.h | 9 | ||||
-rw-r--r-- | openbsc/src/nat/bsc_mgcp_utils.c | 30 | ||||
-rw-r--r-- | openbsc/src/nat/bsc_nat_vty.c | 2 | ||||
-rw-r--r-- | openbsc/tests/bsc-nat/bsc_nat_test.c | 17 |
4 files changed, 26 insertions, 32 deletions
diff --git a/openbsc/include/openbsc/bsc_nat_sccp.h b/openbsc/include/openbsc/bsc_nat_sccp.h index 73e9c690c..fcfd23beb 100644 --- a/openbsc/include/openbsc/bsc_nat_sccp.h +++ b/openbsc/include/openbsc/bsc_nat_sccp.h @@ -79,10 +79,13 @@ struct sccp_connections { int con_type; int con_local; - /* GSM audio handling. That is 32 * multiplex + ts */ + /* + * audio handling. Remember if we have ever send a CRCX, + * remember the endpoint used by the MSC and BSC. + */ int crcx; - int msc_timeslot; - int bsc_timeslot; + int msc_endp; + int bsc_endp; /* timeout handling */ struct timespec creation_time; diff --git a/openbsc/src/nat/bsc_mgcp_utils.c b/openbsc/src/nat/bsc_mgcp_utils.c index e3258f02f..4983c352c 100644 --- a/openbsc/src/nat/bsc_mgcp_utils.c +++ b/openbsc/src/nat/bsc_mgcp_utils.c @@ -45,7 +45,7 @@ int bsc_mgcp_assign(struct sccp_connections *con, struct msgb *msg) uint16_t cic; uint8_t timeslot; uint8_t multiplex; - int combined; + int endp; if (!msg->l3h) { LOGP(DNAT, LOGL_ERROR, "Assignment message should have l3h pointer.\n"); @@ -68,22 +68,22 @@ int bsc_mgcp_assign(struct sccp_connections *con, struct msgb *msg) multiplex = (cic & ~0x1f) >> 5; - combined = (32 * multiplex) + timeslot; + endp = mgcp_timeslot_to_endpoint(multiplex, timeslot); /* find stale connections using that endpoint */ llist_for_each_entry(mcon, &con->bsc->nat->sccp_connections, list_entry) { - if (mcon->msc_timeslot == combined) { + if (mcon->msc_endp == endp) { LOGP(DNAT, LOGL_ERROR, - "Timeslot %d was assigned to 0x%x and now 0x%x\n", - combined, + "Endpoint %d was assigned to 0x%x and now 0x%x\n", + endp, sccp_src_ref_to_int(&mcon->patched_ref), sccp_src_ref_to_int(&con->patched_ref)); bsc_mgcp_dlcx(mcon); } } - con->msc_timeslot = combined; - con->bsc_timeslot = con->msc_timeslot; + con->msc_endp = endp; + con->bsc_endp = endp; return 0; } @@ -147,19 +147,17 @@ static void bsc_mgcp_send_dlcx(struct bsc_connection *bsc, int endpoint) void bsc_mgcp_init(struct sccp_connections *con) { - con->msc_timeslot = -1; - con->bsc_timeslot = -1; + con->msc_endp = -1; + con->bsc_endp = -1; con->crcx = 0; } void bsc_mgcp_dlcx(struct sccp_connections *con) { /* send a DLCX down the stream */ - if (con->bsc_timeslot != -1 && con->crcx) { - int bsc_endp = mgcp_timeslot_to_endpoint(0, con->bsc_timeslot); - int msc_endp = mgcp_timeslot_to_endpoint(0, con->msc_timeslot); - bsc_mgcp_send_dlcx(con->bsc, bsc_endp); - bsc_mgcp_free_endpoint(con->bsc->nat, msc_endp); + if (con->bsc_endp != -1 && con->crcx) { + bsc_mgcp_send_dlcx(con->bsc, con->bsc_endp); + bsc_mgcp_free_endpoint(con->bsc->nat, con->msc_endp); } bsc_mgcp_init(con); @@ -172,9 +170,9 @@ struct sccp_connections *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) + if (sccp->msc_endp == -1) continue; - if (mgcp_timeslot_to_endpoint(0, sccp->msc_timeslot) != endpoint) + if (sccp->msc_endp != endpoint) continue; con = sccp; diff --git a/openbsc/src/nat/bsc_nat_vty.c b/openbsc/src/nat/bsc_nat_vty.c index d8af1c23f..b72eb4e26 100644 --- a/openbsc/src/nat/bsc_nat_vty.c +++ b/openbsc/src/nat/bsc_nat_vty.c @@ -121,7 +121,7 @@ DEFUN(show_sccp, show_sccp_cmd, "show sccp connections", sccp_src_ref_to_int(&con->patched_ref), con->has_remote_ref, sccp_src_ref_to_int(&con->remote_ref), - con->msc_timeslot, con->bsc_timeslot, + con->msc_endp, con->bsc_endp, bsc_con_type_to_string(con->con_type), VTY_NEWLINE); } diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c index c5234aa24..b7a89c5b7 100644 --- a/openbsc/tests/bsc-nat/bsc_nat_test.c +++ b/openbsc/tests/bsc-nat/bsc_nat_test.c @@ -449,19 +449,19 @@ static void test_mgcp_ass_tracking(void) abort(); } - if (con.msc_timeslot != 21) { + if (con.msc_endp != 21) { fprintf(stderr, "Timeslot should be 21.\n"); abort(); } - if (con.bsc_timeslot != 21) { + if (con.bsc_endp != 21) { fprintf(stderr, "Assigned timeslot should have been 21.\n"); abort(); } talloc_free(parsed); bsc_mgcp_dlcx(&con); - if (con.bsc_timeslot != -1 || con.msc_timeslot != -1) { + if (con.bsc_endp != -1 || con.msc_endp != -1) { fprintf(stderr, "Clearing should remove the mapping.\n"); abort(); } @@ -483,8 +483,8 @@ static void test_mgcp_find(void) 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->msc_endp = 12; + sccp_con->bsc_endp = 12; sccp_con->bsc = con; llist_add(&sccp_con->list_entry, &nat->sccp_connections); @@ -498,13 +498,6 @@ static void test_mgcp_find(void) abort(); } - sccp_con->msc_timeslot = 0; - sccp_con->bsc_timeslot = 0; - if (bsc_mgcp_find_con(nat, 1) != sccp_con) { - fprintf(stderr, "Didn't find the connection\n"); - abort(); - } - /* free everything */ talloc_free(nat); } |