aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-03-06 02:25:39 +0700
committerfixeria <vyanitskiy@sysmocom.de>2023-03-07 09:43:21 +0000
commit54840a203b1f92a596e10a3774a41923da48841e (patch)
tree36fcb4f23e5700260a4a3f7e74d4bd7c66e57a18
parent66bcdd839c209caa89df879e67aa0b7fb4db939b (diff)
osmo-bts-{trx,virtual}: clean up bts_model_l1sap_down()
Having a common body for PRIM_INFO_{ACTIVATE,DEACTIVATE,MODIFY}, but then branching using if-statements is a bit confusing. Change-Id: I915c8a541249249e3c0b1f2eda4535e7c52db79f Related: OS#1572
-rw-r--r--src/osmo-bts-trx/l1_if.c131
-rw-r--r--src/osmo-bts-virtual/l1_if.c108
2 files changed, 113 insertions, 126 deletions
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index ae4fe70a..6e290ee4 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -396,83 +396,80 @@ int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)
/* put data into scheduler's queue */
return trx_sched_tch_req(trx, l1sap);
case OSMO_PRIM(PRIM_MPH_INFO, PRIM_OP_REQUEST):
+ if (l1sap->u.info.type == PRIM_INFO_ACT_CIPH)
+ chan_nr = l1sap->u.info.u.ciph_req.chan_nr;
+ else /* u.act_req used by PRIM_INFO_{ACTIVATE,DEACTIVATE,MODIFY} */
+ chan_nr = l1sap->u.info.u.act_req.chan_nr;
+ lchan = get_lchan_by_chan_nr(trx, chan_nr);
+
switch (l1sap->u.info.type) {
case PRIM_INFO_ACT_CIPH:
- chan_nr = l1sap->u.info.u.ciph_req.chan_nr;
- lchan = get_lchan_by_chan_nr(trx, chan_nr);
if (l1sap->u.info.u.ciph_req.uplink)
l1if_set_ciphering(lchan, chan_nr, 0);
if (l1sap->u.info.u.ciph_req.downlink)
l1if_set_ciphering(lchan, chan_nr, 1);
break;
case PRIM_INFO_ACTIVATE:
- case PRIM_INFO_DEACTIVATE:
- case PRIM_INFO_MODIFY:
- chan_nr = l1sap->u.info.u.act_req.chan_nr;
- lchan = get_lchan_by_chan_nr(trx, chan_nr);
- if (l1sap->u.info.type == PRIM_INFO_ACTIVATE) {
- if ((chan_nr & 0xE0) == 0x80) {
- LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot activate"
- " channel %s\n", rsl_chan_nr_str(chan_nr));
- break;
- }
-
- /* attempt to allocate an Error Concealment Unit instance, if available */
- lchan->ecu_state = osmo_ecu_init(trx, lchan2ecu_codec(lchan));
-
- /* activate dedicated channel */
- trx_sched_set_lchan(lchan, chan_nr, LID_DEDIC, true);
- /* activate associated channel */
- trx_sched_set_lchan(lchan, chan_nr, LID_SACCH, true);
- /* set mode */
- trx_sched_set_mode(lchan->ts, chan_nr,
- lchan->rsl_cmode, lchan->tch_mode,
- lchan->tch.amr_mr.num_modes,
- lchan->tch.amr_mr.mode[0].mode,
- lchan->tch.amr_mr.mode[1].mode,
- lchan->tch.amr_mr.mode[2].mode,
- lchan->tch.amr_mr.mode[3].mode,
- amr_get_initial_mode(lchan),
- (lchan->ho.active == 1));
- /* set lchan active */
- lchan_set_state(lchan, LCHAN_S_ACTIVE);
- /* set initial ciphering */
- l1if_set_ciphering(lchan, chan_nr, 0);
- l1if_set_ciphering(lchan, chan_nr, 1);
- if (lchan->encr.alg_id)
- lchan->ciph_state = LCHAN_CIPH_RXTX_CONF;
- else
- lchan->ciph_state = LCHAN_CIPH_NONE;
-
- /* confirm */
- mph_info_chan_confirm(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);
- break;
- }
- if (l1sap->u.info.type == PRIM_INFO_MODIFY) {
- /* ECU for possibly new codec */
- if (lchan->ecu_state)
- osmo_ecu_destroy(lchan->ecu_state);
- lchan->ecu_state = osmo_ecu_init(trx, lchan2ecu_codec(lchan));
- /* change mode */
- trx_sched_set_mode(lchan->ts, chan_nr,
- lchan->rsl_cmode, lchan->tch_mode,
- lchan->tch.amr_mr.num_modes,
- lchan->tch.amr_mr.mode[0].mode,
- lchan->tch.amr_mr.mode[1].mode,
- lchan->tch.amr_mr.mode[2].mode,
- lchan->tch.amr_mr.mode[3].mode,
- amr_get_initial_mode(lchan),
- 0);
- /* update ciphering params */
- l1if_set_ciphering(lchan, chan_nr, 0);
- l1if_set_ciphering(lchan, chan_nr, 1);
- if (lchan->encr.alg_id)
- lchan->ciph_state = LCHAN_CIPH_RXTX_CONF;
- else
- lchan->ciph_state = LCHAN_CIPH_NONE;
+ if ((chan_nr & 0xE0) == 0x80) {
+ LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot activate"
+ " channel %s\n", rsl_chan_nr_str(chan_nr));
break;
}
- /* here, type == PRIM_INFO_DEACTIVATE */
+
+ /* attempt to allocate an Error Concealment Unit instance, if available */
+ lchan->ecu_state = osmo_ecu_init(trx, lchan2ecu_codec(lchan));
+
+ /* activate dedicated channel */
+ trx_sched_set_lchan(lchan, chan_nr, LID_DEDIC, true);
+ /* activate associated channel */
+ trx_sched_set_lchan(lchan, chan_nr, LID_SACCH, true);
+ /* set mode */
+ trx_sched_set_mode(lchan->ts, chan_nr,
+ lchan->rsl_cmode, lchan->tch_mode,
+ lchan->tch.amr_mr.num_modes,
+ lchan->tch.amr_mr.mode[0].mode,
+ lchan->tch.amr_mr.mode[1].mode,
+ lchan->tch.amr_mr.mode[2].mode,
+ lchan->tch.amr_mr.mode[3].mode,
+ amr_get_initial_mode(lchan),
+ (lchan->ho.active == 1));
+ /* set lchan active */
+ lchan_set_state(lchan, LCHAN_S_ACTIVE);
+ /* set initial ciphering */
+ l1if_set_ciphering(lchan, chan_nr, 0);
+ l1if_set_ciphering(lchan, chan_nr, 1);
+ if (lchan->encr.alg_id)
+ lchan->ciph_state = LCHAN_CIPH_RXTX_CONF;
+ else
+ lchan->ciph_state = LCHAN_CIPH_NONE;
+
+ /* confirm */
+ mph_info_chan_confirm(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);
+ break;
+ case PRIM_INFO_MODIFY:
+ /* ECU for possibly new codec */
+ if (lchan->ecu_state)
+ osmo_ecu_destroy(lchan->ecu_state);
+ lchan->ecu_state = osmo_ecu_init(trx, lchan2ecu_codec(lchan));
+ /* change mode */
+ trx_sched_set_mode(lchan->ts, chan_nr,
+ lchan->rsl_cmode, lchan->tch_mode,
+ lchan->tch.amr_mr.num_modes,
+ lchan->tch.amr_mr.mode[0].mode,
+ lchan->tch.amr_mr.mode[1].mode,
+ lchan->tch.amr_mr.mode[2].mode,
+ lchan->tch.amr_mr.mode[3].mode,
+ amr_get_initial_mode(lchan),
+ 0);
+ /* update ciphering params */
+ l1if_set_ciphering(lchan, chan_nr, 0);
+ l1if_set_ciphering(lchan, chan_nr, 1);
+ if (lchan->encr.alg_id)
+ lchan->ciph_state = LCHAN_CIPH_RXTX_CONF;
+ else
+ lchan->ciph_state = LCHAN_CIPH_NONE;
+ break;
+ case PRIM_INFO_DEACTIVATE:
if ((chan_nr & 0xE0) == 0x80) {
LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot deactivate"
" channel %s\n", rsl_chan_nr_str(chan_nr));
diff --git a/src/osmo-bts-virtual/l1_if.c b/src/osmo-bts-virtual/l1_if.c
index da25554b..e0536d32 100644
--- a/src/osmo-bts-virtual/l1_if.c
+++ b/src/osmo-bts-virtual/l1_if.c
@@ -336,7 +336,6 @@ int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)
{
struct msgb *msg = l1sap->oph.msg;
uint8_t chan_nr;
- uint8_t tn, ss;
int rc = 0;
struct gsm_lchan *lchan;
@@ -352,74 +351,65 @@ int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)
/* put data into scheduler's queue */
return trx_sched_tch_req(trx, l1sap);
case OSMO_PRIM(PRIM_MPH_INFO, PRIM_OP_REQUEST):
+ if (l1sap->u.info.type == PRIM_INFO_ACT_CIPH)
+ chan_nr = l1sap->u.info.u.ciph_req.chan_nr;
+ else /* u.act_req used by PRIM_INFO_{ACTIVATE,DEACTIVATE,MODIFY} */
+ chan_nr = l1sap->u.info.u.act_req.chan_nr;
+ lchan = get_lchan_by_chan_nr(trx, chan_nr);
+
switch (l1sap->u.info.type) {
case PRIM_INFO_ACT_CIPH:
- chan_nr = l1sap->u.info.u.ciph_req.chan_nr;
- tn = L1SAP_CHAN2TS(chan_nr);
- ss = l1sap_chan2ss(chan_nr);
- lchan = &trx->ts[tn].lchan[ss];
if (l1sap->u.info.u.ciph_req.uplink)
l1if_set_ciphering(lchan, chan_nr, 0);
if (l1sap->u.info.u.ciph_req.downlink)
l1if_set_ciphering(lchan, chan_nr, 1);
break;
case PRIM_INFO_ACTIVATE:
- case PRIM_INFO_DEACTIVATE:
- case PRIM_INFO_MODIFY:
- chan_nr = l1sap->u.info.u.act_req.chan_nr;
- tn = L1SAP_CHAN2TS(chan_nr);
- ss = l1sap_chan2ss(chan_nr);
- lchan = &trx->ts[tn].lchan[ss];
- /* we receive a channel activation request from the BSC,
- * e.g. as a response to a channel req on RACH */
- if (l1sap->u.info.type == PRIM_INFO_ACTIVATE) {
- if ((chan_nr & 0xE0) == 0x80) {
- LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot activate"
- " channel %s\n", rsl_chan_nr_str(chan_nr));
- break;
- }
- /* activate dedicated channel */
- trx_sched_set_lchan(lchan, chan_nr, LID_DEDIC, true);
- /* activate associated channel */
- trx_sched_set_lchan(lchan, chan_nr, LID_SACCH, true);
- /* set mode */
- trx_sched_set_mode(lchan->ts, chan_nr,
- lchan->rsl_cmode, lchan->tch_mode,
- lchan->tch.amr_mr.num_modes,
- lchan->tch.amr_mr.mode[0].mode,
- lchan->tch.amr_mr.mode[1].mode,
- lchan->tch.amr_mr.mode[2].mode,
- lchan->tch.amr_mr.mode[3].mode,
- amr_get_initial_mode(lchan),
- (lchan->ho.active == 1));
- /* set lchan active */
- lchan_set_state(lchan, LCHAN_S_ACTIVE);
- /* set initial ciphering */
- l1if_set_ciphering(lchan, chan_nr, 0);
- l1if_set_ciphering(lchan, chan_nr, 1);
- if (lchan->encr.alg_id)
- lchan->ciph_state = LCHAN_CIPH_RXTX_CONF;
- else
- lchan->ciph_state = LCHAN_CIPH_NONE;
-
- /* confirm */
- mph_info_chan_confirm(trx, chan_nr,
- PRIM_INFO_ACTIVATE, 0);
- break;
- }
- if (l1sap->u.info.type == PRIM_INFO_MODIFY) {
- /* change mode */
- trx_sched_set_mode(lchan->ts, chan_nr,
- lchan->rsl_cmode, lchan->tch_mode,
- lchan->tch.amr_mr.num_modes,
- lchan->tch.amr_mr.mode[0].mode,
- lchan->tch.amr_mr.mode[1].mode,
- lchan->tch.amr_mr.mode[2].mode,
- lchan->tch.amr_mr.mode[3].mode,
- amr_get_initial_mode(lchan),
- 0);
+ if ((chan_nr & 0xE0) == 0x80) {
+ LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot activate"
+ " channel %s\n", rsl_chan_nr_str(chan_nr));
break;
}
+ /* activate dedicated channel */
+ trx_sched_set_lchan(lchan, chan_nr, LID_DEDIC, true);
+ /* activate associated channel */
+ trx_sched_set_lchan(lchan, chan_nr, LID_SACCH, true);
+ /* set mode */
+ trx_sched_set_mode(lchan->ts, chan_nr,
+ lchan->rsl_cmode, lchan->tch_mode,
+ lchan->tch.amr_mr.num_modes,
+ lchan->tch.amr_mr.mode[0].mode,
+ lchan->tch.amr_mr.mode[1].mode,
+ lchan->tch.amr_mr.mode[2].mode,
+ lchan->tch.amr_mr.mode[3].mode,
+ amr_get_initial_mode(lchan),
+ (lchan->ho.active == 1));
+ /* set lchan active */
+ lchan_set_state(lchan, LCHAN_S_ACTIVE);
+ /* set initial ciphering */
+ l1if_set_ciphering(lchan, chan_nr, 0);
+ l1if_set_ciphering(lchan, chan_nr, 1);
+ if (lchan->encr.alg_id)
+ lchan->ciph_state = LCHAN_CIPH_RXTX_CONF;
+ else
+ lchan->ciph_state = LCHAN_CIPH_NONE;
+
+ /* confirm */
+ mph_info_chan_confirm(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);
+ break;
+ case PRIM_INFO_MODIFY:
+ /* change mode */
+ trx_sched_set_mode(lchan->ts, chan_nr,
+ lchan->rsl_cmode, lchan->tch_mode,
+ lchan->tch.amr_mr.num_modes,
+ lchan->tch.amr_mr.mode[0].mode,
+ lchan->tch.amr_mr.mode[1].mode,
+ lchan->tch.amr_mr.mode[2].mode,
+ lchan->tch.amr_mr.mode[3].mode,
+ amr_get_initial_mode(lchan),
+ 0);
+ break;
+ case PRIM_INFO_DEACTIVATE:
if ((chan_nr & 0xE0) == 0x80) {
LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot deactivate"
" channel %s\n", rsl_chan_nr_str(chan_nr));