diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-12-23 01:07:46 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2011-01-01 17:23:42 +0100 |
commit | 29b64e9708297d604b57b5a4779996fa5ca0b2f7 (patch) | |
tree | 0ce715d1123143f3eb5050f57aef1ac9cc160162 /openbsc | |
parent | 04dc88fb9d364a9d841e4be53dca4116b28aaad6 (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')
-rw-r--r-- | openbsc/include/openbsc/gsm_data.h | 4 | ||||
-rw-r--r-- | openbsc/include/openbsc/mncc.h | 3 | ||||
-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 |
6 files changed, 15 insertions, 11 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index f9c87e757..59599ab03 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -694,7 +694,7 @@ struct gsm_network { struct gsmnet_stats stats; /* layer 4 */ - int (*mncc_recv) (struct gsm_network *net, int msg_type, void *arg); + int (*mncc_recv) (struct gsm_network *net, struct msgb *msg); struct llist_head upqueue; struct llist_head trans_list; struct bsc_api *bsc_api; @@ -762,7 +762,7 @@ struct gsm_sms { 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_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, u_int8_t tsc, u_int8_t bsic); struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts); diff --git a/openbsc/include/openbsc/mncc.h b/openbsc/include/openbsc/mncc.h index bd3eb71fe..75551c522 100644 --- a/openbsc/include/openbsc/mncc.h +++ b/openbsc/include/openbsc/mncc.h @@ -28,6 +28,7 @@ #include <osmocore/mncc.h> struct gsm_network; +struct msgb; /* One end of a call */ @@ -155,7 +156,7 @@ struct gsm_data_frame { }; char *get_mncc_name(int value); -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 mncc_set_cause(struct gsm_mncc *data, int loc, int val); void cc_tx_to_mncc(struct gsm_network *net, struct msgb *msg); diff --git a/openbsc/src/bsc_init.c b/openbsc/src/bsc_init.c index 01ff70aa3..86a1c8dc9 100644 --- a/openbsc/src/bsc_init.c +++ b/openbsc/src/bsc_init.c @@ -1184,7 +1184,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 27d07323f..705c10742 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -248,7 +248,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 d20b4efda..34093a8b1 100644 --- a/openbsc/src/mncc.c +++ b/openbsc/src/mncc.c @@ -110,7 +110,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; } |