RSL link: explicitly select rsl_link based on lchan

Prepare for VAMOS, where there will be secondary "shadow" lchans serving
secondary MS on the same timeslots. For those, RSL messages will need to
reflect a different stream ID aka TEI, via an rsl_link_vamos.

Make sure that every code path that sends an RSL message for a specific
lchan selects the RSL link via the new function rsl_chan_link(). When
VAMOS is implemented, this function can select the proper RSL stream.

Rename gsm_bts_trx.rsl_link to rsl_link_primary. This makes sure I'm not
missing any uses of the RSL link, and clarifies the code.

Related: SYS#5315 OS#4940
Change-Id: Ifbf16bb296e91f151d19e15e39f5c953ad77ff17
This commit is contained in:
Neels Hofmeyr 2021-04-12 14:43:10 +02:00
parent 69def1f97e
commit 1b277ec2a2
15 changed files with 69 additions and 62 deletions

View File

@ -44,6 +44,8 @@ struct gsm_bts_trx_ts;
const char *ip_to_a(uint32_t ip);
struct e1inp_sign_link *rsl_chan_link(const struct gsm_lchan *lchan);
int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len);
int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
const uint8_t *data, int len);

View File

@ -33,8 +33,8 @@ struct gsm_bts_trx {
uint8_t nr;
/* how do we talk RSL with this TRX? */
struct gsm_e1_subslot rsl_e1_link;
uint8_t rsl_tei;
struct e1inp_sign_link *rsl_link;
uint8_t rsl_tei_primary;
struct e1inp_sign_link *rsl_link_primary;
/* Timeout for initiating the RSL connection. */
struct osmo_timer_list rsl_connect_timeout;

View File

@ -159,7 +159,7 @@ static int ia_config_connect(struct gsm_bts *bts, struct sockaddr_in *sin)
/* create back-links from bts/trx */
bts->oml_link = oml_link;
bts->c0->rsl_link = rsl_link;
bts->c0->rsl_link_primary = rsl_link;
/* default port at BTS for incoming connections is 3006 */
if (sin->sin_port == 0)
@ -1122,7 +1122,7 @@ int main(int argc, char **argv)
}
bts->oml_link->ts->sign.delay = 10;
bts->c0->rsl_link->ts->sign.delay = 10;
bts->c0->rsl_link_primary->ts->sign.delay = 10;
while (1) {
rc = osmo_select_main(0);
if (rc < 0)

View File

@ -893,7 +893,7 @@ bool all_trx_rsl_connected_unlocked(const struct gsm_bts *bts)
}
llist_for_each_entry(trx, &bts->trx_list, list) {
if (!trx->rsl_link)
if (!trx->rsl_link_primary)
return false;
if (!trx_is_usable(trx))

View File

@ -251,7 +251,7 @@ int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type,
msgb_tlv_put(msg, RSL_IE_FULL_BCCH_INFO, len, data);
}
msg->dst = trx->rsl_link;
msg->dst = trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -270,7 +270,7 @@ int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
if (data)
msgb_tl16v_put(msg, RSL_IE_L3_INFO, len, data);
msg->dst = trx->rsl_link;
msg->dst = trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -290,7 +290,7 @@ int rsl_sacch_info_modify(struct gsm_lchan *lchan, uint8_t type,
if (data)
msgb_tl16v_put(msg, RSL_IE_L3_INFO, len, data);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -320,7 +320,7 @@ int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db)
/* BS Power Control Parameters (if supported by BTS model) */
add_power_control_params(msg, RSL_IE_BS_POWER_PARAM, lchan);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -345,7 +345,7 @@ int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan)
/* MS Power Control Parameters (if supported by BTS model) */
add_power_control_params(msg, RSL_IE_MS_POWER_PARAM, lchan);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -605,7 +605,7 @@ int rsl_tx_chan_activ(struct gsm_lchan *lchan, uint8_t act_type, uint8_t ho_ref)
rep_acch_cap_for_bts(lchan, msg);
msg->dst = trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_TOTAL]);
switch (lchan->type) {
@ -665,7 +665,7 @@ int rsl_chan_mode_modify_req(struct gsm_lchan *lchan)
rep_acch_cap_for_bts(lchan, msg);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -697,7 +697,7 @@ int rsl_encryption_cmd(struct msgb *msg)
init_dchan_hdr(dh, RSL_MT_ENCR_CMD);
dh->chan_nr = chan_nr;
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -713,7 +713,7 @@ int rsl_deact_sacch(struct gsm_lchan *lchan)
dh->chan_nr = gsm_lchan2chan_nr(lchan);
msg->lchan = lchan;
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
DEBUGP(DRSL, "%s DEACTivate SACCH CMD\n", gsm_lchan_name(lchan));
@ -732,7 +732,7 @@ int rsl_tx_rf_chan_release(struct gsm_lchan *lchan)
dh->chan_nr = gsm_lchan2chan_nr(lchan);
msg->lchan = lchan;
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -767,7 +767,7 @@ int rsl_paging_cmd(struct gsm_bts *bts, uint8_t paging_group,
if (bts->type == GSM_BTS_TYPE_RBS2000 && is_gprs)
msgb_tv_put(msg, RSL_IE_ERIC_PACKET_PAG_IND, 0);
msg->dst = bts->c0->rsl_link;
msg->dst = bts->c0->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -827,7 +827,7 @@ struct msgb *rsl_imm_assign_cmd_common(struct gsm_bts *bts, uint8_t len, uint8_t
break;
}
msg->dst = bts->c0->rsl_link;
msg->dst = bts->c0->rsl_link_primary;
return msg;
}
@ -870,7 +870,7 @@ int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci)
DEBUGP(DRSL, "%s TX Siemens MRPCI 0x%02x\n",
gsm_lchan_name(lchan), *(uint8_t *)mrpci);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -888,7 +888,7 @@ int rsl_data_request(struct msgb *msg, uint8_t link_id)
rsl_rll_push_l3(msg, RSL_MT_DATA_REQ, gsm_lchan2chan_nr(msg->lchan),
link_id, 1);
msg->dst = msg->lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(msg->lchan);
return abis_rsl_sendmsg(msg);
}
@ -901,7 +901,7 @@ int rsl_establish_request(struct gsm_lchan *lchan, uint8_t link_id)
msg = rsl_rll_simple(RSL_MT_EST_REQ, gsm_lchan2chan_nr(lchan),
link_id, 0);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
DEBUGP(DRLL, "%s RSL RLL ESTABLISH REQ (link_id=0x%02x)\n",
gsm_lchan_name(lchan), link_id);
@ -925,7 +925,7 @@ int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id,
/* 0 is normal release, 1 is local end */
msgb_tv_put(msg, RSL_IE_RELEASE_MODE, release_mode);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
DEBUGP(DRLL, "%s RSL RLL RELEASE REQ (link_id=0x%02x, reason=%u)\n",
gsm_lchan_name(lchan), link_id, release_mode);
@ -2255,7 +2255,7 @@ int rsl_tx_ipacc_crcx(const struct gsm_lchan *lchan)
LOG_LCHAN(lchan, LOGL_DEBUG, "Sending IPACC CRCX to BTS: speech_mode=0x%02x RTP_PAYLOAD=%d\n",
lchan->abis_ip.speech_mode, lchan->abis_ip.rtp_payload);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return abis_rsl_sendmsg(msg);
}
@ -2286,7 +2286,7 @@ struct msgb *rsl_make_ipacc_mdcx(const struct gsm_lchan *lchan, uint32_t dest_ip
if (lchan->abis_ip.rtp_payload2)
msgb_tv_put(msg, RSL_IE_IPAC_RTP_PAYLOAD2, lchan->abis_ip.rtp_payload2);
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
return msg;
}
@ -2483,7 +2483,7 @@ static int send_osmocom_style_pdch_chan_act(struct gsm_bts_trx_ts *ts, bool acti
}
}
msg->dst = ts->trx->rsl_link;
msg->dst = ts->trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -2498,7 +2498,7 @@ static int send_ipacc_style_pdch_act(struct gsm_bts_trx_ts *ts, bool activate)
dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN;
dh->chan_nr = gsm_pchan2chan_nr(GSM_PCHAN_TCH_F, ts->nr, 0);
msg->dst = ts->trx->rsl_link;
msg->dst = ts->trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -2603,7 +2603,7 @@ int rsl_etws_pn_command(struct gsm_bts *bts, uint8_t chan_nr, const uint8_t *dat
msgb_tlv_put(msg, RSL_IE_SMSCB_MSG, len, data);
msg->dst = bts->c0->rsl_link;
msg->dst = bts->c0->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -2629,7 +2629,7 @@ int rsl_sms_cb_command(struct gsm_bts *bts, uint8_t chan_number,
if (use_extended_cbch)
msgb_tv_put(cb_cmd, RSL_IE_SMSCB_CHAN_INDICATOR, 0x01);
cb_cmd->dst = bts->c0->rsl_link;
cb_cmd->dst = bts->c0->rsl_link_primary;
return abis_rsl_sendmsg(cb_cmd);
}
@ -2643,7 +2643,7 @@ int rsl_nokia_si_begin(struct gsm_bts_trx *trx)
ch->msg_discr = ABIS_RSL_MDISC_TRX;
ch->msg_type = 0x40; /* Nokia SI Begin */
msg->dst = trx->rsl_link;
msg->dst = trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -2659,7 +2659,7 @@ int rsl_nokia_si_end(struct gsm_bts_trx *trx)
msgb_tv_put(msg, 0xFD, 0x00); /* Nokia Pagemode Info, No paging reorganisation required */
msg->dst = trx->rsl_link;
msg->dst = trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
@ -2676,7 +2676,12 @@ int rsl_bs_power_control(struct gsm_bts_trx *trx, uint8_t channel, uint8_t reduc
msgb_tv_put(msg, RSL_IE_CHAN_NR, channel);
msgb_tv_put(msg, RSL_IE_BS_POWER, reduction); /* reduction in 2dB steps */
msg->dst = trx->rsl_link;
msg->dst = trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}
struct e1inp_sign_link *rsl_chan_link(const struct gsm_lchan *lchan)
{
return lchan->ts->trx->rsl_link_primary;
}

View File

@ -439,7 +439,7 @@ static int acc_ramp_nm_sig_cb(unsigned int subsys, unsigned int signal, void *ha
return 0;
/* RSL must already be up. We cannot send RACH system information to the BTS otherwise. */
if (trx->rsl_link == NULL) {
if (trx->rsl_link_primary == NULL) {
LOG_TRX(trx, DRSL, LOGL_DEBUG,
"ACC RAMP: ignoring state change because RSL link is down\n");
return 0;

View File

@ -1136,7 +1136,6 @@ static void gsm0808_send_rsl_dtap(struct gsm_subscriber_connection *conn,
sapi = link_id & 0x7;
msg->lchan = conn->lchan;
msg->dst = msg->lchan->ts->trx->rsl_link;
/* If we are on a TCH and need to submit a SMS (on SAPI=3) we need to use the SACH */
if (allow_sacch && sapi != 0) {

View File

@ -735,7 +735,7 @@ static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei_primary, VTY_NEWLINE);
if (trx->bts->model->config_write_trx)
trx->bts->model->config_write_trx(vty, trx);
@ -1326,10 +1326,10 @@ static int config_write_net(struct vty *vty)
static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx, bool print_rsl, bool show_connected)
{
if (show_connected && !trx->rsl_link)
if (show_connected && !trx->rsl_link_primary)
return;
if (!show_connected && trx->rsl_link)
if (!show_connected && trx->rsl_link_primary)
return;
vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
@ -1341,15 +1341,15 @@ static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx, bool print_rs
vty_out(vty, " Radio Carrier NM State: ");
net_dump_nmstate(vty, &trx->mo.nm_state);
if (print_rsl)
vty_out(vty, " RSL State: %s%s", trx->rsl_link? "connected" : "disconnected", VTY_NEWLINE);
vty_out(vty, " RSL State: %s%s", trx->rsl_link_primary? "connected" : "disconnected", VTY_NEWLINE);
vty_out(vty, " Baseband Transceiver NM State: ");
net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
if (is_ipaccess_bts(trx->bts)) {
vty_out(vty, " ip.access stream ID: 0x%02x ", trx->rsl_tei);
e1isl_dump_vty_tcp(vty, trx->rsl_link);
vty_out(vty, " ip.access stream ID: 0x%02x ", trx->rsl_tei_primary);
e1isl_dump_vty_tcp(vty, trx->rsl_link_primary);
} else {
vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
e1isl_dump_vty(vty, trx->rsl_link);
e1isl_dump_vty(vty, trx->rsl_link_primary);
}
}
@ -5449,7 +5449,7 @@ DEFUN_USRATTR(cfg_trx_rsl_e1_tei,
{
struct gsm_bts_trx *trx = vty->index;
trx->rsl_tei = atoi(argv[0]);
trx->rsl_tei_primary = atoi(argv[0]);
return CMD_SUCCESS;
}

View File

@ -525,12 +525,12 @@ find_bts_by_unitid(struct gsm_network *net, uint16_t site_id, uint16_t bts_id)
/* These are exported because they are used by the VTY interface. */
void ipaccess_drop_rsl(struct gsm_bts_trx *trx, const char *reason)
{
if (!trx->rsl_link)
if (!trx->rsl_link_primary)
return;
LOG_TRX(trx, DLINP, LOGL_NOTICE, "Dropping RSL link: %s\n", reason);
e1inp_sign_link_destroy(trx->rsl_link);
trx->rsl_link = NULL;
e1inp_sign_link_destroy(trx->rsl_link_primary);
trx->rsl_link_primary = NULL;
osmo_stat_item_dec(trx->bts->bts_statg->items[BTS_STAT_RSL_CONNECTED], 1);
if (trx->bts->c0 == trx)
@ -729,10 +729,10 @@ ipaccess_sign_link_up(void *unit_data, struct e1inp_line *line,
line = bts->oml_link->ts->line;
ts = e1inp_line_ipa_rsl_ts(line, dev->trx_id);
e1inp_ts_config_sign(ts, line);
sign_link = trx->rsl_link =
sign_link = trx->rsl_link_primary =
e1inp_sign_link_create(ts, E1INP_SIGN_RSL,
trx, trx->rsl_tei, 0);
trx->rsl_link->ts->sign.delay = 0;
trx, trx->rsl_tei_primary, 0);
trx->rsl_link_primary->ts->sign.delay = 0;
if (!(sign_link->trx->bts->ip_access.flags &
(RSL_UP << sign_link->trx->nr))) {
e1inp_event(sign_link->ts, S_L_INP_TEI_UP,
@ -947,7 +947,7 @@ static int power_ctrl_send_def_params(const struct gsm_bts_trx *trx)
if (bs_power_ctrl->mode == GSM_PWR_CTRL_MODE_DYN_BTS)
add_power_params_ie(msg, RSL_IE_BS_POWER_PARAM, bs_power_ctrl);
msg->dst = trx->rsl_link;
msg->dst = trx->rsl_link_primary;
return abis_rsl_sendmsg(msg);
}

View File

@ -434,7 +434,7 @@ static void nm_reconfig_trx(struct gsm_bts_trx *trx)
abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
e1l->e1_ts_ss);
abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei);
e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei_primary);
/* Set Radio Attributes */
if (trx == trx->bts->c0)

View File

@ -90,7 +90,7 @@ int e1_reconfig_trx(struct gsm_bts_trx *trx)
if (trx->bts->type == GSM_BTS_TYPE_RBS2000) {
struct e1inp_sign_link *oml_link;
oml_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_OML, trx,
trx->rsl_tei, SAPI_OML);
trx->rsl_tei_primary, SAPI_OML);
if (!oml_link) {
LOG_TRX(trx, DLINP, LOGL_ERROR, "TRX OML link creation failed\n");
return -ENOMEM;
@ -100,14 +100,14 @@ int e1_reconfig_trx(struct gsm_bts_trx *trx)
trx->oml_link = oml_link;
}
rsl_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_RSL,
trx, trx->rsl_tei, SAPI_RSL);
trx, trx->rsl_tei_primary, SAPI_RSL);
if (!rsl_link) {
LOG_TRX(trx, DLINP, LOGL_ERROR, "TRX RSL link creation failed\n");
return -ENOMEM;
}
if (trx->rsl_link)
e1inp_sign_link_destroy(trx->rsl_link);
trx->rsl_link = rsl_link;
if (trx->rsl_link_primary)
e1inp_sign_link_destroy(trx->rsl_link_primary);
trx->rsl_link_primary = rsl_link;
for (i = 0; i < TRX_NR_TS; i++)
e1_reconfig_ts(&trx->ts[i]);

View File

@ -51,7 +51,7 @@
int gsm48_sendmsg(struct msgb *msg)
{
if (msg->lchan)
msg->dst = msg->lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(msg->lchan);
msg->l3h = msg->data;
return rsl_data_request(msg, 0);

View File

@ -119,7 +119,7 @@ static void configure_loop(struct gsm_bts_bb_trx *bb_transc, struct gsm_nm_state
abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC, trx->bts->bts_nr, trx->nr, 0xff);
/* TRX software is active, tell it to initiate RSL Link */
abis_nm_ipaccess_rsl_connect(trx, trx->bts->ip_access.rsl_ip,
3003, trx->rsl_tei);
3003, trx->rsl_tei_primary);
}
}

View File

@ -992,3 +992,4 @@ void pcu_info_update(struct gsm_bts *bts) {};
int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }
int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)
{ return 0; }
struct e1inp_sign_link *rsl_chan_link(const struct gsm_lchan *lchan) { return NULL; }

View File

@ -175,7 +175,7 @@ static void gen_meas_rep(struct gsm_lchan *lchan,
mr->bcch_f_nc6_hi = neighbors[5].bcch_f >> 2;
mr->bcch_f_nc6_lo = neighbors[5].bcch_f & 3;
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
msg->dst = rsl_chan_link(lchan);
msg->l2h = (unsigned char *)dh;
msg->l3h = (unsigned char *)gh;
@ -231,7 +231,7 @@ static struct gsm_bts *_create_bts(int num_trx, const char * const *ts_args, int
rsl_link = talloc_zero(ctx, struct e1inp_sign_link);
rsl_link->trx = bts->c0;
bts->c0->rsl_link = rsl_link;
bts->c0->rsl_link_primary = rsl_link;
for (trx_i = 0; trx_i < num_trx; trx_i++) {
while (!(trx = gsm_bts_trx_num(bts, trx_i)))
@ -555,7 +555,7 @@ static void send_chan_act_ack(struct gsm_lchan *lchan, int act)
dh->ie_chan = RSL_IE_CHAN_NR;
dh->chan_nr = gsm_lchan2chan_nr(lchan);
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
msg->dst = rsl_chan_link(lchan);
msg->l2h = (unsigned char *)dh;
abis_rsl_rcvmsg(msg);
@ -592,7 +592,7 @@ static void send_assignment_complete(struct gsm_lchan *lchan)
gh->proto_discr = GSM48_PDISC_RR;
gh->msg_type = GSM48_MT_RR_ASS_COMPL;
msg->dst = lchan->ts->trx->rsl_link;
msg->dst = rsl_chan_link(lchan);
msg->l2h = (unsigned char *)rh;
msg->l3h = (unsigned char *)gh;
@ -616,7 +616,7 @@ static void send_est_ind(struct gsm_lchan *lchan)
rh->ie_link_id = RSL_IE_LINK_IDENT;
rh->link_id = 0x00;
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
msg->dst = rsl_chan_link(lchan);
msg->l2h = (unsigned char *)rh;
abis_rsl_rcvmsg(msg);
@ -638,7 +638,7 @@ static void send_ho_detect(struct gsm_lchan *lchan)
rh->ie_link_id = RSL_IE_LINK_IDENT;
rh->link_id = 0x00;
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
msg->dst = rsl_chan_link(lchan);
msg->l2h = (unsigned char *)rh;
abis_rsl_rcvmsg(msg);
@ -682,7 +682,7 @@ static void send_ho_complete(struct gsm_lchan *lchan, bool success)
gh->msg_type =
success ? GSM48_MT_RR_HANDO_COMPL : GSM48_MT_RR_HANDO_FAIL;
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
msg->dst = rsl_chan_link(lchan);
msg->l2h = (unsigned char *)rh;
msg->l3h = (unsigned char *)gh;