aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-12-27 13:28:20 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-12-27 13:32:20 +0100
commit08eebd59b78d9327c88269e6da75e1c9d5a881ef (patch)
treee2cf0425866fad705ffeb51f656f21734877511f /openbsc/src
parent9ae7b29e3a74b3c7ddf7781ae0b9ebd4cd8efddb (diff)
lchan: Every SS_LCHAN signal now sends a struct lchan_sig_data
The SS_LCHAN signals now always include the lchan_sig_data. For the measurement report it will optionally include the measurement report as well. Attempt to update all handlers of this signal as well
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/abis_rsl.c17
-rw-r--r--openbsc/src/bsc_api.c19
-rw-r--r--openbsc/src/chan_alloc.c6
-rw-r--r--openbsc/src/gsm_04_08.c10
-rw-r--r--openbsc/src/handover_decision.c6
-rw-r--r--openbsc/src/handover_logic.c4
6 files changed, 36 insertions, 26 deletions
diff --git a/openbsc/src/abis_rsl.c b/openbsc/src/abis_rsl.c
index 52ed9fa5b..ad11c7362 100644
--- a/openbsc/src/abis_rsl.c
+++ b/openbsc/src/abis_rsl.c
@@ -51,6 +51,15 @@
static int rsl_send_imm_assignment(struct gsm_lchan *lchan);
+static void send_lchan_signal(int sig_no, struct gsm_lchan *lchan,
+ struct gsm_meas_rep *resp)
+{
+ struct lchan_signal_data sig;
+ sig.lchan = lchan;
+ sig.mr = resp;
+ dispatch_signal(SS_LCHAN, sig_no, &sig);
+}
+
static u_int8_t mdisc_by_msgtype(u_int8_t msg_type)
{
/* mask off the transparent bit ? */
@@ -813,7 +822,7 @@ static int rsl_rx_chan_act_ack(struct msgb *msg)
msg->lchan->rqd_ta = 0;
}
- dispatch_signal(SS_LCHAN, S_LCHAN_ACTIVATE_ACK, msg->lchan);
+ send_lchan_signal(S_LCHAN_ACTIVATE_ACK, msg->lchan, NULL);
return 0;
}
@@ -843,7 +852,7 @@ static int rsl_rx_chan_act_nack(struct msgb *msg)
LOGPC(DRSL, LOGL_ERROR, "\n");
- dispatch_signal(SS_LCHAN, S_LCHAN_ACTIVATE_NACK, msg->lchan);
+ send_lchan_signal(S_LCHAN_ACTIVATE_NACK, msg->lchan, NULL);
lchan_free(msg->lchan);
return 0;
@@ -986,7 +995,7 @@ static int rsl_rx_meas_res(struct msgb *msg)
print_meas_rep(mr);
- dispatch_signal(SS_LCHAN, S_LCHAN_MEAS_REP, mr);
+ send_lchan_signal(S_LCHAN_MEAS_REP, msg->lchan, mr);
return 0;
}
@@ -1007,7 +1016,7 @@ static int rsl_rx_hando_det(struct msgb *msg)
else
DEBUGPC(DRSL, "\n");
- dispatch_signal(SS_LCHAN, S_LCHAN_HANDOVER_DETECT, msg->lchan);
+ send_lchan_signal(S_LCHAN_HANDOVER_DETECT, msg->lchan, NULL);
return 0;
}
diff --git a/openbsc/src/bsc_api.c b/openbsc/src/bsc_api.c
index 8b3ff8f3a..9b070a950 100644
--- a/openbsc/src/bsc_api.c
+++ b/openbsc/src/bsc_api.c
@@ -602,28 +602,17 @@ static int bsc_handle_lchan_signal(unsigned int subsys, unsigned int signal,
{
struct bsc_api *bsc;
struct gsm_lchan *lchan;
+ struct lchan_signal_data *lchan_data;
if (subsys != SS_LCHAN)
return 0;
- /*
- * Check if it is any of the signals we handle. We do want
- * to do this early as we will need to check the lchan and
- * the bsc api in it.
- */
- switch (signal) {
- case S_LCHAN_UNEXPECTED_RELEASE:
- case S_LCHAN_ACTIVATE_ACK:
- case S_LCHAN_ACTIVATE_NACK:
- break;
- default:
- return -1;
- }
- lchan = (struct gsm_lchan *)signal_data;
- if (!lchan || !lchan->conn)
+ lchan_data = signal_data;
+ if (!lchan_data->lchan || !lchan_data->lchan->conn)
return 0;
+ lchan = lchan_data->lchan;
bsc = lchan->ts->trx->bts->network->bsc_api;
if (!bsc)
return 0;
diff --git a/openbsc/src/chan_alloc.c b/openbsc/src/chan_alloc.c
index 5c1644642..13b576733 100644
--- a/openbsc/src/chan_alloc.c
+++ b/openbsc/src/chan_alloc.c
@@ -302,8 +302,12 @@ void lchan_free(struct gsm_lchan *lchan)
if (lchan->conn) {
+ struct lchan_signal_data sig;
+
/* We might kill an active channel... */
- dispatch_signal(SS_LCHAN, S_LCHAN_UNEXPECTED_RELEASE, lchan);
+ sig.lchan = lchan;
+ sig.mr = NULL;
+ dispatch_signal(SS_LCHAN, S_LCHAN_UNEXPECTED_RELEASE, &sig);
}
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index d6d9b983d..7659fd112 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1157,12 +1157,15 @@ static int gsm48_rx_rr_ciph_m_compl(struct gsm_subscriber_connection *conn, stru
/* Chapter 9.1.16 Handover complete */
static int gsm48_rx_rr_ho_compl(struct msgb *msg)
{
+ struct lchan_signal_data sig;
struct gsm48_hdr *gh = msgb_l3(msg);
DEBUGP(DRR, "HANDOVER COMPLETE cause = %s\n",
rr_cause_name(gh->data[0]));
- dispatch_signal(SS_LCHAN, S_LCHAN_HANDOVER_COMPL, msg->lchan);
+ sig.lchan = msg->lchan;
+ sig.mr = NULL;
+ dispatch_signal(SS_LCHAN, S_LCHAN_HANDOVER_COMPL, &sig);
/* FIXME: release old channel */
return 0;
@@ -1171,12 +1174,15 @@ static int gsm48_rx_rr_ho_compl(struct msgb *msg)
/* Chapter 9.1.17 Handover Failure */
static int gsm48_rx_rr_ho_fail(struct msgb *msg)
{
+ struct lchan_signal_data sig;
struct gsm48_hdr *gh = msgb_l3(msg);
DEBUGP(DRR, "HANDOVER FAILED cause = %s\n",
rr_cause_name(gh->data[0]));
- dispatch_signal(SS_LCHAN, S_LCHAN_HANDOVER_FAIL, msg->lchan);
+ sig.lchan = msg->lchan;
+ sig.mr = NULL;
+ dispatch_signal(SS_LCHAN, S_LCHAN_HANDOVER_FAIL, &sig);
/* FIXME: release allocated new channel */
return 0;
diff --git a/openbsc/src/handover_decision.c b/openbsc/src/handover_decision.c
index efafca6e2..4ac3286ff 100644
--- a/openbsc/src/handover_decision.c
+++ b/openbsc/src/handover_decision.c
@@ -277,15 +277,15 @@ static int process_meas_rep(struct gsm_meas_rep *mr)
static int ho_dec_sig_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data)
{
- struct gsm_meas_rep *mr;
+ struct lchan_signal_data *lchan_data;
if (subsys != SS_LCHAN)
return 0;
+ lchan_data = signal_data;
switch (signal) {
case S_LCHAN_MEAS_REP:
- mr = signal_data;
- process_meas_rep(mr);
+ process_meas_rep(lchan_data->mr);
break;
}
diff --git a/openbsc/src/handover_logic.c b/openbsc/src/handover_logic.c
index 38bb32ea2..a537d4f6c 100644
--- a/openbsc/src/handover_logic.c
+++ b/openbsc/src/handover_logic.c
@@ -388,11 +388,13 @@ static int ho_ipac_crcx_ack(struct gsm_lchan *new_lchan)
static int ho_logic_sig_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data)
{
+ struct lchan_signal_data *lchan_data;
struct gsm_lchan *lchan;
+ lchan_data = signal_data;
switch (subsys) {
case SS_LCHAN:
- lchan = signal_data;
+ lchan = lchan_data->lchan;
switch (signal) {
case S_LCHAN_ACTIVATE_ACK:
return ho_chan_activ_ack(lchan);