diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h index 64c6b8656..040d39374 100644 --- a/openbsc/include/openbsc/bsc_nat.h +++ b/openbsc/include/openbsc/bsc_nat.h @@ -248,7 +248,7 @@ int create_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *parsed); void remove_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed); struct sccp_connections *patch_sccp_src_ref_to_bsc(struct msgb *, struct bsc_nat_parsed *, struct bsc_nat *); -struct sccp_connections *patch_sccp_src_ref_to_msc(struct msgb *, struct bsc_nat_parsed *, struct bsc_nat *); +struct sccp_connections *patch_sccp_src_ref_to_msc(struct msgb *, struct bsc_nat_parsed *, struct bsc_connection *); /** * MGCP/Audio handling diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c index 00dcc8884..eaa9d30bc 100644 --- a/openbsc/src/nat/bsc_nat.c +++ b/openbsc/src/nat/bsc_nat.c @@ -524,17 +524,17 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg) case SCCP_MSG_TYPE_CR: if (create_sccp_src_ref(bsc, msg, parsed) != 0) goto exit2; - con = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con = patch_sccp_src_ref_to_msc(msg, parsed, bsc); break; case SCCP_MSG_TYPE_RLSD: case SCCP_MSG_TYPE_CREF: case SCCP_MSG_TYPE_DT1: case SCCP_MSG_TYPE_CC: case SCCP_MSG_TYPE_IT: - con = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con = patch_sccp_src_ref_to_msc(msg, parsed, bsc); break; case SCCP_MSG_TYPE_RLC: - con = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con = patch_sccp_src_ref_to_msc(msg, parsed, bsc); remove_sccp_src_ref(bsc, msg, parsed); break; case SCCP_MSG_TYPE_UDT: diff --git a/openbsc/src/nat/bsc_sccp.c b/openbsc/src/nat/bsc_sccp.c index e84ffe9c1..58302cc64 100644 --- a/openbsc/src/nat/bsc_sccp.c +++ b/openbsc/src/nat/bsc_sccp.c @@ -204,11 +204,14 @@ struct sccp_connections *patch_sccp_src_ref_to_bsc(struct msgb *msg, */ struct sccp_connections *patch_sccp_src_ref_to_msc(struct msgb *msg, struct bsc_nat_parsed *parsed, - struct bsc_nat *nat) + struct bsc_connection *bsc) { struct sccp_connections *conn; - llist_for_each_entry(conn, &nat->sccp_connections, list_entry) { + llist_for_each_entry(conn, &bsc->nat->sccp_connections, list_entry) { + if (conn->bsc != bsc) + continue; + if (parsed->src_local_ref) { if (equal(parsed->src_local_ref, &conn->real_ref)) { *parsed->src_local_ref = conn->patched_ref; diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c index 7ff2c200f..e046e776e 100644 --- a/openbsc/tests/bsc-nat/bsc_nat_test.c +++ b/openbsc/tests/bsc-nat/bsc_nat_test.c @@ -267,7 +267,7 @@ static void test_contrack() /* 1.) create a connection */ copy_to_msg(msg, bsc_cr, sizeof(bsc_cr)); parsed = bsc_nat_parse(msg); - con_found = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con_found = patch_sccp_src_ref_to_msc(msg, parsed, con); if (con_found != NULL) { fprintf(stderr, "Con should not exist %p\n", con_found); abort(); @@ -277,7 +277,7 @@ static void test_contrack() fprintf(stderr, "Failed to create a ref\n"); abort(); } - con_found = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con_found = patch_sccp_src_ref_to_msc(msg, parsed, con); if (!con_found || con_found->bsc != con) { fprintf(stderr, "Failed to find the con: %p\n", con_found); abort(); @@ -301,7 +301,7 @@ static void test_contrack() /* 3.) send some data */ copy_to_msg(msg, bsc_dtap, sizeof(bsc_dtap)); parsed = bsc_nat_parse(msg); - con_found = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con_found = patch_sccp_src_ref_to_msc(msg, parsed, con); VERIFY(con_found, con, msg, bsc_dtap_patched, "BSC DTAP"); /* 4.) receive some data */ @@ -319,7 +319,7 @@ static void test_contrack() /* 6.) confirm the connection close */ copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc)); parsed = bsc_nat_parse(msg); - con_found = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con_found = patch_sccp_src_ref_to_msc(msg, parsed, con); if (!con_found || con_found->bsc != con) { fprintf(stderr, "Failed to find the con: %p\n", con_found); abort(); @@ -333,7 +333,7 @@ static void test_contrack() copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc)); parsed = bsc_nat_parse(msg); - con_found = patch_sccp_src_ref_to_msc(msg, parsed, nat); + con_found = patch_sccp_src_ref_to_msc(msg, parsed, con); /* verify that it is gone */ if (con_found != NULL) {