From 08eebd59b78d9327c88269e6da75e1c9d5a881ef Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 27 Dec 2010 13:28:20 +0100 Subject: [PATCH] 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 --- openbsc/include/openbsc/signal.h | 7 +++++++ openbsc/src/abis_rsl.c | 17 +++++++++++++---- openbsc/src/bsc_api.c | 19 ++++--------------- openbsc/src/chan_alloc.c | 6 +++++- openbsc/src/gsm_04_08.c | 10 ++++++++-- openbsc/src/handover_decision.c | 6 +++--- openbsc/src/handover_logic.c | 4 +++- 7 files changed, 43 insertions(+), 26 deletions(-) diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h index dfb837d38..a235cfb71 100644 --- a/openbsc/include/openbsc/signal.h +++ b/openbsc/include/openbsc/signal.h @@ -182,6 +182,13 @@ struct sms_signal_data { 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 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);