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
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index dfb837d..a235cfb 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -182,6 +182,13 @@
 	int paging_result;
 };
 
+struct lchan_signal_data {
+	/* The lchan the signal happened on */
+	struct gsm_lchan *lchan;
+	/* Measurement reports on this lchan */
+	struct gsm_meas_rep *mr;
+};
+
 enum signal_ns {
 	S_NS_RESET,
 	S_NS_BLOCK,
diff --git a/openbsc/src/abis_rsl.c b/openbsc/src/abis_rsl.c
index 52ed9fa..ad11c73 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 @@
 		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 @@
 
 	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 @@
 
 	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 @@
 	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 8b3ff8f..9b070a9 100644
--- a/openbsc/src/bsc_api.c
+++ b/openbsc/src/bsc_api.c
@@ -602,28 +602,17 @@
 {
 	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 5c16446..13b5767 100644
--- a/openbsc/src/chan_alloc.c
+++ b/openbsc/src/chan_alloc.c
@@ -302,8 +302,12 @@
 
 
 	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 d6d9b98..7659fd1 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1157,12 +1157,15 @@
 /* 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 @@
 /* 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 efafca6..4ac3286 100644
--- a/openbsc/src/handover_decision.c
+++ b/openbsc/src/handover_decision.c
@@ -277,15 +277,15 @@
 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 38bb32e..a537d4f 100644
--- a/openbsc/src/handover_logic.c
+++ b/openbsc/src/handover_logic.c
@@ -388,11 +388,13 @@
 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);