diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-15 18:48:55 +0800 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-15 20:24:09 +0800 |
commit | 49c7fb52f00816522a17abab9a5e7e277b1717f2 (patch) | |
tree | 693cbd99102efbd7116f65e81b1752c5cd00ac74 /openbsc/src/nat/bsc_sccp.c | |
parent | 72ba1624b3d9f6fe3cbb62c3146dda75314b14e0 (diff) |
nat: Return the SCCP connection, change order of patching and updating
* Return the SCCP connection. This will be needed to store the
assigned timeslot in there.
* Update code to work with this change
* This uncovered a bug in the CC handling, at the time the BSC was
passed it was still a null pointer and the code would have failed.
Diffstat (limited to 'openbsc/src/nat/bsc_sccp.c')
-rw-r--r-- | openbsc/src/nat/bsc_sccp.c | 43 |
1 files changed, 15 insertions, 28 deletions
diff --git a/openbsc/src/nat/bsc_sccp.c b/openbsc/src/nat/bsc_sccp.c index 4e28ccf66..5f0809d77 100644 --- a/openbsc/src/nat/bsc_sccp.c +++ b/openbsc/src/nat/bsc_sccp.c @@ -108,32 +108,19 @@ int create_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc return 0; } -int update_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed) +int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *parsed) { - struct sccp_connections *conn; - if (!parsed->dest_local_ref || !parsed->src_local_ref) { LOGP(DNAT, LOGL_ERROR, "CC MSG should contain both local and dest address.\n"); return -1; } - llist_for_each_entry(conn, &bsc->nat->sccp_connections, list_entry) { - if (conn->bsc != bsc) - continue; - - if (memcmp(parsed->dest_local_ref, - &conn->patched_ref, sizeof(conn->patched_ref)) != 0) - continue; - - conn->remote_ref = *parsed->src_local_ref; - LOGP(DNAT, LOGL_DEBUG, "Updating 0x%x to remote 0x%x on %p\n", - sccp_src_ref_to_int(&conn->patched_ref), - sccp_src_ref_to_int(&conn->remote_ref), bsc); - return 0; - } + sccp->remote_ref = *parsed->src_local_ref; + LOGP(DNAT, LOGL_DEBUG, "Updating 0x%x to remote 0x%x on %p\n", + sccp_src_ref_to_int(&sccp->patched_ref), + sccp_src_ref_to_int(&sccp->remote_ref), sccp->bsc); - LOGP(DNAT, LOGL_ERROR, "Referenced connection not found on BSC: %p\n", bsc); - return -1; + return 0; } void remove_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed) @@ -165,9 +152,9 @@ void remove_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bs * an address that was assigned by the MUX, we need to update the * dest reference to the real network. */ -struct bsc_connection *patch_sccp_src_ref_to_bsc(struct msgb *msg, - struct bsc_nat_parsed *parsed, - struct bsc_nat *nat) +struct sccp_connections *patch_sccp_src_ref_to_bsc(struct msgb *msg, + struct bsc_nat_parsed *parsed, + struct bsc_nat *nat) { struct sccp_connections *conn; @@ -183,7 +170,7 @@ struct bsc_connection *patch_sccp_src_ref_to_bsc(struct msgb *msg, /* Change the dest address to the real one */ *parsed->dest_local_ref = conn->real_ref; - return conn->bsc; + return conn; } return NULL; @@ -197,9 +184,9 @@ struct bsc_connection *patch_sccp_src_ref_to_bsc(struct msgb *msg, * in all other cases we need to work by the destination local * reference.. */ -struct bsc_connection *patch_sccp_src_ref_to_msc(struct msgb *msg, - struct bsc_nat_parsed *parsed, - struct bsc_nat *nat) +struct sccp_connections *patch_sccp_src_ref_to_msc(struct msgb *msg, + struct bsc_nat_parsed *parsed, + struct bsc_nat *nat) { struct sccp_connections *conn; @@ -207,11 +194,11 @@ struct bsc_connection *patch_sccp_src_ref_to_msc(struct msgb *msg, if (parsed->src_local_ref) { if (equal(parsed->src_local_ref, &conn->real_ref)) { *parsed->src_local_ref = conn->patched_ref; - return conn->bsc; + return conn; } } else if (parsed->dest_local_ref) { if (equal(parsed->dest_local_ref, &conn->remote_ref)) - return conn->bsc; + return conn; } else { LOGP(DNAT, LOGL_ERROR, "Header has neither loc/dst ref.\n"); return NULL; |