[nat] Make create_sccp_src_ref return the SCCP Connection.

Right now it was not possible to just find a connection, by returning
the connection that is created we will have direct access to it. It
will be used by the local connection handling.
This commit is contained in:
Holger Hans Peter Freyther
2010-05-16 16:51:31 +08:00
parent 797b9f0af0
commit 60a2f4a7e6
4 changed files with 16 additions and 11 deletions

View File

@@ -281,7 +281,7 @@ int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
/**
* SCCP patching and handling
*/
int create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed);
struct sccp_connections *create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed);
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 *);

View File

@@ -644,7 +644,7 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
case SCCP_MSG_TYPE_CR:
if (bsc_nat_filter_sccp_cr(bsc, msg, parsed, &con_type) != 0)
goto exit3;
if (create_sccp_src_ref(bsc, parsed) != 0)
if (!create_sccp_src_ref(bsc, parsed))
goto exit2;
con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
con->con_type = con_type;

View File

@@ -82,7 +82,8 @@ static int assign_src_local_reference(struct sccp_source_reference *ref, struct
return -1;
}
int create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed)
struct sccp_connections *create_sccp_src_ref(struct bsc_connection *bsc,
struct bsc_nat_parsed *parsed)
{
struct sccp_connections *conn;
@@ -101,11 +102,11 @@ int create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parse
bsc_mgcp_dlcx(conn);
llist_del(&conn->list_entry);
talloc_free(conn);
return -1;
return NULL;
} else {
clock_gettime(CLOCK_MONOTONIC, &conn->creation_time);
bsc_mgcp_dlcx(conn);
return 0;
return conn;
}
}
@@ -113,7 +114,7 @@ int create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parse
conn = talloc_zero(bsc->nat, struct sccp_connections);
if (!conn) {
LOGP(DNAT, LOGL_ERROR, "Memory allocation failure.\n");
return -1;
return NULL;
}
conn->bsc = bsc;
@@ -122,7 +123,7 @@ int create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parse
if (assign_src_local_reference(&conn->patched_ref, bsc->nat) != 0) {
LOGP(DNAT, LOGL_ERROR, "Failed to assign a ref.\n");
talloc_free(conn);
return -1;
return NULL;
}
bsc_mgcp_init(conn);
@@ -134,7 +135,7 @@ int create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parse
sccp_src_ref_to_int(&conn->real_ref),
sccp_src_ref_to_int(&conn->patched_ref), bsc);
return 0;
return conn;
}
int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *parsed)

View File

@@ -273,10 +273,10 @@ static void copy_to_msg(struct msgb *msg, const u_int8_t *data, unsigned int len
/* test conn tracking once */
static void test_contrack()
{
int rc;
struct bsc_nat *nat;
struct bsc_connection *con;
struct sccp_connections *con_found;
struct sccp_connections *rc_con;
struct bsc_nat_parsed *parsed;
struct msgb *msg;
@@ -294,8 +294,8 @@ static void test_contrack()
fprintf(stderr, "Con should not exist %p\n", con_found);
abort();
}
rc = create_sccp_src_ref(con, parsed);
if (rc != 0) {
rc_con = create_sccp_src_ref(con, parsed);
if (!rc_con) {
fprintf(stderr, "Failed to create a ref\n");
abort();
}
@@ -304,6 +304,10 @@ static void test_contrack()
fprintf(stderr, "Failed to find the con: %p\n", con_found);
abort();
}
if (con_found != rc_con) {
fprintf(stderr, "Failed to find the right connection.\n");
abort();
}
if (memcmp(msg->data, bsc_cr_patched, sizeof(bsc_cr_patched)) != 0) {
fprintf(stderr, "Failed to patch the BSC CR msg.\n");
abort();