diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-12-23 01:07:46 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-12-26 19:20:56 +0100 |
commit | 8d037972b0fe58ec695dd4d2f89afbbc2d68080c (patch) | |
tree | 735de1bbb6335bf77f2c95661b1ebe97f4efe7df /openbsc/src | |
parent | 80693ac0fa18af3692325207f796f7d0cf5e670b (diff) |
MNCC: pass the actual 'struct msgb' down the mncc_recv() callback
this is required as we no longer have a dequeue-handler that can take
care of free()ing the message after passing it to the MNCC handler.
Diffstat (limited to 'openbsc/src')
-rw-r--r-- | openbsc/src/bsc_init.c | 2 | ||||
-rw-r--r-- | openbsc/src/gsm_data.c | 2 | ||||
-rw-r--r-- | openbsc/src/mncc.c | 4 | ||||
-rw-r--r-- | openbsc/src/mncc_builtin.c | 11 |
4 files changed, 11 insertions, 8 deletions
diff --git a/openbsc/src/bsc_init.c b/openbsc/src/bsc_init.c index 875da16c9..9963dc759 100644 --- a/openbsc/src/bsc_init.c +++ b/openbsc/src/bsc_init.c @@ -1185,7 +1185,7 @@ static int bootstrap_bts(struct gsm_bts *bts) return 0; } -int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *), +int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), const char *config_file) { struct telnet_connection dummy_conn; diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index f6920480c..dce15601d 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -249,7 +249,7 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, } struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_code, - int (*mncc_recv)(struct gsm_network *, int, void *)) + int (*mncc_recv)(struct gsm_network *, struct msgb *)) { struct gsm_network *net; diff --git a/openbsc/src/mncc.c b/openbsc/src/mncc.c index affc80982..732a76c0c 100644 --- a/openbsc/src/mncc.c +++ b/openbsc/src/mncc.c @@ -111,7 +111,5 @@ void mncc_set_cause(struct gsm_mncc *data, int loc, int val) void cc_tx_to_mncc(struct gsm_network *net, struct msgb *msg) { - struct gsm_mncc *mncc = msgb_data(msg); - - net->mncc_recv(net, mncc->msg_type, mncc); + net->mncc_recv(net, msg); } diff --git a/openbsc/src/mncc_builtin.c b/openbsc/src/mncc_builtin.c index a81910831..640a286bc 100644 --- a/openbsc/src/mncc_builtin.c +++ b/openbsc/src/mncc_builtin.c @@ -277,9 +277,11 @@ static int mncc_rcv_tchf(struct gsm_call *call, int msg_type, /* Internal MNCC handler input function (from CC -> MNCC -> here) */ -int int_mncc_recv(struct gsm_network *net, int msg_type, void *arg) +int int_mncc_recv(struct gsm_network *net, struct msgb *msg) { + void *arg = msgb_data(msg); struct gsm_mncc *data = arg; + int msg_type = data->msg_type; int callref; struct gsm_call *call = NULL, *callt; int rc = 0; @@ -300,7 +302,7 @@ int int_mncc_recv(struct gsm_network *net, int msg_type, void *arg) /* create callref, if setup is received */ if (!call) { if (msg_type != MNCC_SETUP_IND) - return 0; /* drop */ + goto out_free; /* drop */ /* create call */ if (!(call = talloc_zero(tall_call_ctx, struct gsm_call))) { struct gsm_mncc rel; @@ -310,7 +312,7 @@ int int_mncc_recv(struct gsm_network *net, int msg_type, void *arg) mncc_set_cause(&rel, GSM48_CAUSE_LOC_PRN_S_LU, GSM48_CC_CAUSE_RESOURCE_UNAVAIL); mncc_tx_to_cc(net, MNCC_REL_REQ, &rel); - return 0; + goto out_free; } llist_add_tail(&call->entry, &call_list); call->net = net; @@ -396,5 +398,8 @@ int int_mncc_recv(struct gsm_network *net, int msg_type, void *arg) break; } +out_free: + talloc_free(msg); + return rc; } |