aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-12-23 01:07:46 +0100
committerHarald Welte <laforge@gnumonks.org>2010-12-26 10:01:41 +0100
commit404908d9bdc44513e6beb8f8fb2906ef43001b23 (patch)
tree3af7fc4d753ec575401fb1f81b6e274e1f43c5f2
parentb7f8b35afdd5b4160dada99d1659db63578f158f (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.
-rw-r--r--openbsc/include/openbsc/gsm_data.h4
-rw-r--r--openbsc/include/openbsc/mncc.h3
-rw-r--r--openbsc/src/bsc_init.c2
-rw-r--r--openbsc/src/gsm_data.c2
-rw-r--r--openbsc/src/mncc.c4
-rw-r--r--openbsc/src/mncc_builtin.c11
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 35d925aea..afcf33661 100644
--- a/openbsc/include/openbsc/mncc.h
+++ b/openbsc/include/openbsc/mncc.h
@@ -29,6 +29,7 @@
#include <osmocore/mncc.h>
struct gsm_network;
+struct msgb;
/* One end of a call */
@@ -156,7 +157,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 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;
}