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:
parent
69def1f97e
commit
1b277ec2a2
|
@ -44,6 +44,8 @@ struct gsm_bts_trx_ts;
|
||||||
|
|
||||||
const char *ip_to_a(uint32_t ip);
|
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_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,
|
int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
|
||||||
const uint8_t *data, int len);
|
const uint8_t *data, int len);
|
||||||
|
|
|
@ -33,8 +33,8 @@ struct gsm_bts_trx {
|
||||||
uint8_t nr;
|
uint8_t nr;
|
||||||
/* how do we talk RSL with this TRX? */
|
/* how do we talk RSL with this TRX? */
|
||||||
struct gsm_e1_subslot rsl_e1_link;
|
struct gsm_e1_subslot rsl_e1_link;
|
||||||
uint8_t rsl_tei;
|
uint8_t rsl_tei_primary;
|
||||||
struct e1inp_sign_link *rsl_link;
|
struct e1inp_sign_link *rsl_link_primary;
|
||||||
|
|
||||||
/* Timeout for initiating the RSL connection. */
|
/* Timeout for initiating the RSL connection. */
|
||||||
struct osmo_timer_list rsl_connect_timeout;
|
struct osmo_timer_list rsl_connect_timeout;
|
||||||
|
|
|
@ -159,7 +159,7 @@ static int ia_config_connect(struct gsm_bts *bts, struct sockaddr_in *sin)
|
||||||
|
|
||||||
/* create back-links from bts/trx */
|
/* create back-links from bts/trx */
|
||||||
bts->oml_link = oml_link;
|
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 */
|
/* default port at BTS for incoming connections is 3006 */
|
||||||
if (sin->sin_port == 0)
|
if (sin->sin_port == 0)
|
||||||
|
@ -1122,7 +1122,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
bts->oml_link->ts->sign.delay = 10;
|
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) {
|
while (1) {
|
||||||
rc = osmo_select_main(0);
|
rc = osmo_select_main(0);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
|
|
@ -893,7 +893,7 @@ bool all_trx_rsl_connected_unlocked(const struct gsm_bts *bts)
|
||||||
}
|
}
|
||||||
|
|
||||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||||
if (!trx->rsl_link)
|
if (!trx->rsl_link_primary)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!trx_is_usable(trx))
|
if (!trx_is_usable(trx))
|
||||||
|
|
|
@ -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);
|
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);
|
return abis_rsl_sendmsg(msg);
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
|
||||||
if (data)
|
if (data)
|
||||||
msgb_tl16v_put(msg, RSL_IE_L3_INFO, len, 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);
|
return abis_rsl_sendmsg(msg);
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@ int rsl_sacch_info_modify(struct gsm_lchan *lchan, uint8_t type,
|
||||||
if (data)
|
if (data)
|
||||||
msgb_tl16v_put(msg, RSL_IE_L3_INFO, len, 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);
|
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) */
|
/* BS Power Control Parameters (if supported by BTS model) */
|
||||||
add_power_control_params(msg, RSL_IE_BS_POWER_PARAM, lchan);
|
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);
|
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) */
|
/* MS Power Control Parameters (if supported by BTS model) */
|
||||||
add_power_control_params(msg, RSL_IE_MS_POWER_PARAM, lchan);
|
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);
|
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);
|
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]);
|
rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_TOTAL]);
|
||||||
switch (lchan->type) {
|
switch (lchan->type) {
|
||||||
|
@ -665,7 +665,7 @@ int rsl_chan_mode_modify_req(struct gsm_lchan *lchan)
|
||||||
|
|
||||||
rep_acch_cap_for_bts(lchan, msg);
|
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);
|
return abis_rsl_sendmsg(msg);
|
||||||
}
|
}
|
||||||
|
@ -697,7 +697,7 @@ int rsl_encryption_cmd(struct msgb *msg)
|
||||||
init_dchan_hdr(dh, RSL_MT_ENCR_CMD);
|
init_dchan_hdr(dh, RSL_MT_ENCR_CMD);
|
||||||
dh->chan_nr = chan_nr;
|
dh->chan_nr = chan_nr;
|
||||||
|
|
||||||
msg->dst = lchan->ts->trx->rsl_link;
|
msg->dst = rsl_chan_link(lchan);
|
||||||
|
|
||||||
return abis_rsl_sendmsg(msg);
|
return abis_rsl_sendmsg(msg);
|
||||||
}
|
}
|
||||||
|
@ -713,7 +713,7 @@ int rsl_deact_sacch(struct gsm_lchan *lchan)
|
||||||
dh->chan_nr = gsm_lchan2chan_nr(lchan);
|
dh->chan_nr = gsm_lchan2chan_nr(lchan);
|
||||||
|
|
||||||
msg->lchan = 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));
|
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);
|
dh->chan_nr = gsm_lchan2chan_nr(lchan);
|
||||||
|
|
||||||
msg->lchan = lchan;
|
msg->lchan = lchan;
|
||||||
msg->dst = lchan->ts->trx->rsl_link;
|
msg->dst = rsl_chan_link(lchan);
|
||||||
|
|
||||||
return abis_rsl_sendmsg(msg);
|
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)
|
if (bts->type == GSM_BTS_TYPE_RBS2000 && is_gprs)
|
||||||
msgb_tv_put(msg, RSL_IE_ERIC_PACKET_PAG_IND, 0);
|
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);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg->dst = bts->c0->rsl_link;
|
msg->dst = bts->c0->rsl_link_primary;
|
||||||
return msg;
|
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",
|
DEBUGP(DRSL, "%s TX Siemens MRPCI 0x%02x\n",
|
||||||
gsm_lchan_name(lchan), *(uint8_t *)mrpci);
|
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);
|
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),
|
rsl_rll_push_l3(msg, RSL_MT_DATA_REQ, gsm_lchan2chan_nr(msg->lchan),
|
||||||
link_id, 1);
|
link_id, 1);
|
||||||
|
|
||||||
msg->dst = msg->lchan->ts->trx->rsl_link;
|
msg->dst = rsl_chan_link(msg->lchan);
|
||||||
|
|
||||||
return abis_rsl_sendmsg(msg);
|
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),
|
msg = rsl_rll_simple(RSL_MT_EST_REQ, gsm_lchan2chan_nr(lchan),
|
||||||
link_id, 0);
|
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",
|
DEBUGP(DRLL, "%s RSL RLL ESTABLISH REQ (link_id=0x%02x)\n",
|
||||||
gsm_lchan_name(lchan), link_id);
|
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 */
|
/* 0 is normal release, 1 is local end */
|
||||||
msgb_tv_put(msg, RSL_IE_RELEASE_MODE, release_mode);
|
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",
|
DEBUGP(DRLL, "%s RSL RLL RELEASE REQ (link_id=0x%02x, reason=%u)\n",
|
||||||
gsm_lchan_name(lchan), link_id, release_mode);
|
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",
|
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);
|
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);
|
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)
|
if (lchan->abis_ip.rtp_payload2)
|
||||||
msgb_tv_put(msg, RSL_IE_IPAC_RTP_PAYLOAD2, 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;
|
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);
|
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->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN;
|
||||||
dh->chan_nr = gsm_pchan2chan_nr(GSM_PCHAN_TCH_F, ts->nr, 0);
|
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);
|
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);
|
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);
|
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)
|
if (use_extended_cbch)
|
||||||
msgb_tv_put(cb_cmd, RSL_IE_SMSCB_CHAN_INDICATOR, 0x01);
|
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);
|
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_discr = ABIS_RSL_MDISC_TRX;
|
||||||
ch->msg_type = 0x40; /* Nokia SI Begin */
|
ch->msg_type = 0x40; /* Nokia SI Begin */
|
||||||
|
|
||||||
msg->dst = trx->rsl_link;
|
msg->dst = trx->rsl_link_primary;
|
||||||
|
|
||||||
return abis_rsl_sendmsg(msg);
|
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 */
|
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);
|
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_CHAN_NR, channel);
|
||||||
msgb_tv_put(msg, RSL_IE_BS_POWER, reduction); /* reduction in 2dB steps */
|
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);
|
return abis_rsl_sendmsg(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct e1inp_sign_link *rsl_chan_link(const struct gsm_lchan *lchan)
|
||||||
|
{
|
||||||
|
return lchan->ts->trx->rsl_link_primary;
|
||||||
|
}
|
||||||
|
|
|
@ -439,7 +439,7 @@ static int acc_ramp_nm_sig_cb(unsigned int subsys, unsigned int signal, void *ha
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* RSL must already be up. We cannot send RACH system information to the BTS otherwise. */
|
/* 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,
|
LOG_TRX(trx, DRSL, LOGL_DEBUG,
|
||||||
"ACC RAMP: ignoring state change because RSL link is down\n");
|
"ACC RAMP: ignoring state change because RSL link is down\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1136,7 +1136,6 @@ static void gsm0808_send_rsl_dtap(struct gsm_subscriber_connection *conn,
|
||||||
|
|
||||||
sapi = link_id & 0x7;
|
sapi = link_id & 0x7;
|
||||||
msg->lchan = conn->lchan;
|
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 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) {
|
if (allow_sacch && sapi != 0) {
|
||||||
|
|
|
@ -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, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
|
||||||
vty_out(vty, " max_power_red %u%s", trx->max_power_red, 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 ");
|
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)
|
if (trx->bts->model->config_write_trx)
|
||||||
trx->bts->model->config_write_trx(vty, 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)
|
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;
|
return;
|
||||||
|
|
||||||
if (!show_connected && trx->rsl_link)
|
if (!show_connected && trx->rsl_link_primary)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
|
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: ");
|
vty_out(vty, " Radio Carrier NM State: ");
|
||||||
net_dump_nmstate(vty, &trx->mo.nm_state);
|
net_dump_nmstate(vty, &trx->mo.nm_state);
|
||||||
if (print_rsl)
|
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: ");
|
vty_out(vty, " Baseband Transceiver NM State: ");
|
||||||
net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
|
net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
|
||||||
if (is_ipaccess_bts(trx->bts)) {
|
if (is_ipaccess_bts(trx->bts)) {
|
||||||
vty_out(vty, " ip.access stream ID: 0x%02x ", trx->rsl_tei);
|
vty_out(vty, " ip.access stream ID: 0x%02x ", trx->rsl_tei_primary);
|
||||||
e1isl_dump_vty_tcp(vty, trx->rsl_link);
|
e1isl_dump_vty_tcp(vty, trx->rsl_link_primary);
|
||||||
} else {
|
} else {
|
||||||
vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
|
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;
|
struct gsm_bts_trx *trx = vty->index;
|
||||||
|
|
||||||
trx->rsl_tei = atoi(argv[0]);
|
trx->rsl_tei_primary = atoi(argv[0]);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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. */
|
/* These are exported because they are used by the VTY interface. */
|
||||||
void ipaccess_drop_rsl(struct gsm_bts_trx *trx, const char *reason)
|
void ipaccess_drop_rsl(struct gsm_bts_trx *trx, const char *reason)
|
||||||
{
|
{
|
||||||
if (!trx->rsl_link)
|
if (!trx->rsl_link_primary)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOG_TRX(trx, DLINP, LOGL_NOTICE, "Dropping RSL link: %s\n", reason);
|
LOG_TRX(trx, DLINP, LOGL_NOTICE, "Dropping RSL link: %s\n", reason);
|
||||||
e1inp_sign_link_destroy(trx->rsl_link);
|
e1inp_sign_link_destroy(trx->rsl_link_primary);
|
||||||
trx->rsl_link = NULL;
|
trx->rsl_link_primary = NULL;
|
||||||
osmo_stat_item_dec(trx->bts->bts_statg->items[BTS_STAT_RSL_CONNECTED], 1);
|
osmo_stat_item_dec(trx->bts->bts_statg->items[BTS_STAT_RSL_CONNECTED], 1);
|
||||||
|
|
||||||
if (trx->bts->c0 == trx)
|
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;
|
line = bts->oml_link->ts->line;
|
||||||
ts = e1inp_line_ipa_rsl_ts(line, dev->trx_id);
|
ts = e1inp_line_ipa_rsl_ts(line, dev->trx_id);
|
||||||
e1inp_ts_config_sign(ts, line);
|
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,
|
e1inp_sign_link_create(ts, E1INP_SIGN_RSL,
|
||||||
trx, trx->rsl_tei, 0);
|
trx, trx->rsl_tei_primary, 0);
|
||||||
trx->rsl_link->ts->sign.delay = 0;
|
trx->rsl_link_primary->ts->sign.delay = 0;
|
||||||
if (!(sign_link->trx->bts->ip_access.flags &
|
if (!(sign_link->trx->bts->ip_access.flags &
|
||||||
(RSL_UP << sign_link->trx->nr))) {
|
(RSL_UP << sign_link->trx->nr))) {
|
||||||
e1inp_event(sign_link->ts, S_L_INP_TEI_UP,
|
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)
|
if (bs_power_ctrl->mode == GSM_PWR_CTRL_MODE_DYN_BTS)
|
||||||
add_power_params_ie(msg, RSL_IE_BS_POWER_PARAM, bs_power_ctrl);
|
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);
|
return abis_rsl_sendmsg(msg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
|
||||||
e1l->e1_ts_ss);
|
e1l->e1_ts_ss);
|
||||||
abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
|
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 */
|
/* Set Radio Attributes */
|
||||||
if (trx == trx->bts->c0)
|
if (trx == trx->bts->c0)
|
||||||
|
|
|
@ -90,7 +90,7 @@ int e1_reconfig_trx(struct gsm_bts_trx *trx)
|
||||||
if (trx->bts->type == GSM_BTS_TYPE_RBS2000) {
|
if (trx->bts->type == GSM_BTS_TYPE_RBS2000) {
|
||||||
struct e1inp_sign_link *oml_link;
|
struct e1inp_sign_link *oml_link;
|
||||||
oml_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_OML, trx,
|
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) {
|
if (!oml_link) {
|
||||||
LOG_TRX(trx, DLINP, LOGL_ERROR, "TRX OML link creation failed\n");
|
LOG_TRX(trx, DLINP, LOGL_ERROR, "TRX OML link creation failed\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -100,14 +100,14 @@ int e1_reconfig_trx(struct gsm_bts_trx *trx)
|
||||||
trx->oml_link = oml_link;
|
trx->oml_link = oml_link;
|
||||||
}
|
}
|
||||||
rsl_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_RSL,
|
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) {
|
if (!rsl_link) {
|
||||||
LOG_TRX(trx, DLINP, LOGL_ERROR, "TRX RSL link creation failed\n");
|
LOG_TRX(trx, DLINP, LOGL_ERROR, "TRX RSL link creation failed\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
if (trx->rsl_link)
|
if (trx->rsl_link_primary)
|
||||||
e1inp_sign_link_destroy(trx->rsl_link);
|
e1inp_sign_link_destroy(trx->rsl_link_primary);
|
||||||
trx->rsl_link = rsl_link;
|
trx->rsl_link_primary = rsl_link;
|
||||||
|
|
||||||
for (i = 0; i < TRX_NR_TS; i++)
|
for (i = 0; i < TRX_NR_TS; i++)
|
||||||
e1_reconfig_ts(&trx->ts[i]);
|
e1_reconfig_ts(&trx->ts[i]);
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
int gsm48_sendmsg(struct msgb *msg)
|
int gsm48_sendmsg(struct msgb *msg)
|
||||||
{
|
{
|
||||||
if (msg->lchan)
|
if (msg->lchan)
|
||||||
msg->dst = msg->lchan->ts->trx->rsl_link;
|
msg->dst = rsl_chan_link(msg->lchan);
|
||||||
|
|
||||||
msg->l3h = msg->data;
|
msg->l3h = msg->data;
|
||||||
return rsl_data_request(msg, 0);
|
return rsl_data_request(msg, 0);
|
||||||
|
|
|
@ -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);
|
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 */
|
/* TRX software is active, tell it to initiate RSL Link */
|
||||||
abis_nm_ipaccess_rsl_connect(trx, trx->bts->ip_access.rsl_ip,
|
abis_nm_ipaccess_rsl_connect(trx, trx->bts->ip_access.rsl_ip,
|
||||||
3003, trx->rsl_tei);
|
3003, trx->rsl_tei_primary);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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_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)
|
int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
|
struct e1inp_sign_link *rsl_chan_link(const struct gsm_lchan *lchan) { return NULL; }
|
||||||
|
|
|
@ -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_hi = neighbors[5].bcch_f >> 2;
|
||||||
mr->bcch_f_nc6_lo = neighbors[5].bcch_f & 3;
|
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->l2h = (unsigned char *)dh;
|
||||||
msg->l3h = (unsigned char *)gh;
|
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 = talloc_zero(ctx, struct e1inp_sign_link);
|
||||||
rsl_link->trx = bts->c0;
|
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++) {
|
for (trx_i = 0; trx_i < num_trx; trx_i++) {
|
||||||
while (!(trx = gsm_bts_trx_num(bts, 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->ie_chan = RSL_IE_CHAN_NR;
|
||||||
dh->chan_nr = gsm_lchan2chan_nr(lchan);
|
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;
|
msg->l2h = (unsigned char *)dh;
|
||||||
|
|
||||||
abis_rsl_rcvmsg(msg);
|
abis_rsl_rcvmsg(msg);
|
||||||
|
@ -592,7 +592,7 @@ static void send_assignment_complete(struct gsm_lchan *lchan)
|
||||||
gh->proto_discr = GSM48_PDISC_RR;
|
gh->proto_discr = GSM48_PDISC_RR;
|
||||||
gh->msg_type = GSM48_MT_RR_ASS_COMPL;
|
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->l2h = (unsigned char *)rh;
|
||||||
msg->l3h = (unsigned char *)gh;
|
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->ie_link_id = RSL_IE_LINK_IDENT;
|
||||||
rh->link_id = 0x00;
|
rh->link_id = 0x00;
|
||||||
|
|
||||||
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
|
msg->dst = rsl_chan_link(lchan);
|
||||||
msg->l2h = (unsigned char *)rh;
|
msg->l2h = (unsigned char *)rh;
|
||||||
|
|
||||||
abis_rsl_rcvmsg(msg);
|
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->ie_link_id = RSL_IE_LINK_IDENT;
|
||||||
rh->link_id = 0x00;
|
rh->link_id = 0x00;
|
||||||
|
|
||||||
msg->dst = lchan->ts->trx->bts->c0->rsl_link;
|
msg->dst = rsl_chan_link(lchan);
|
||||||
msg->l2h = (unsigned char *)rh;
|
msg->l2h = (unsigned char *)rh;
|
||||||
|
|
||||||
abis_rsl_rcvmsg(msg);
|
abis_rsl_rcvmsg(msg);
|
||||||
|
@ -682,7 +682,7 @@ static void send_ho_complete(struct gsm_lchan *lchan, bool success)
|
||||||
gh->msg_type =
|
gh->msg_type =
|
||||||
success ? GSM48_MT_RR_HANDO_COMPL : GSM48_MT_RR_HANDO_FAIL;
|
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->l2h = (unsigned char *)rh;
|
||||||
msg->l3h = (unsigned char *)gh;
|
msg->l3h = (unsigned char *)gh;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue