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 wellchanges/44/3444/1
parent
9ae7b29e3a
commit
08eebd59b7
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue