diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-03-06 02:25:39 +0700 |
---|---|---|
committer | fixeria <vyanitskiy@sysmocom.de> | 2023-03-07 09:43:21 +0000 |
commit | 54840a203b1f92a596e10a3774a41923da48841e (patch) | |
tree | 36fcb4f23e5700260a4a3f7e74d4bd7c66e57a18 | |
parent | 66bcdd839c209caa89df879e67aa0b7fb4db939b (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.c | 131 | ||||
-rw-r--r-- | src/osmo-bts-virtual/l1_if.c | 108 |
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)); |