aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bsc
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2021-04-25 17:02:15 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2021-06-10 16:15:35 +0200
commit2aac1765e6e301716770b2fa4e223d6e9ff6cbc7 (patch)
tree189686a7913a52b3cbb352065af1f664e964d3d6 /src/osmo-bsc
parent3cb4ddd8193d8d1dba8fac332db75c0d147e3ef4 (diff)
implement CHANnel ACTIVate to VAMOS mode
Diffstat (limited to 'src/osmo-bsc')
-rw-r--r--src/osmo-bsc/abis_rsl.c6
-rw-r--r--src/osmo-bsc/bsc_vty.c12
-rw-r--r--src/osmo-bsc/lchan_fsm.c23
3 files changed, 37 insertions, 4 deletions
diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c
index 40bfcec5e..c20693785 100644
--- a/src/osmo-bsc/abis_rsl.c
+++ b/src/osmo-bsc/abis_rsl.c
@@ -534,7 +534,7 @@ int rsl_tx_chan_activ(struct gsm_lchan *lchan, uint8_t act_type, uint8_t ho_ref)
/* PDCH activation is a job for rsl_tx_dyn_ts_pdch_act_deact(); */
OSMO_ASSERT(act_type != RSL_ACT_OSMO_PDCH);
- rc = channel_mode_from_lchan(&cm, lchan, &lchan->activate.ch_mode_rate, false);
+ rc = channel_mode_from_lchan(&cm, lchan, &lchan->activate.ch_mode_rate, lchan->activate.info.vamos);
if (rc < 0) {
LOGP(DRSL, LOGL_ERROR,
"%s Cannot find channel mode from lchan type\n",
@@ -620,6 +620,10 @@ int rsl_tx_chan_activ(struct gsm_lchan *lchan, uint8_t act_type, uint8_t ho_ref)
rep_acch_cap_for_bts(lchan, msg);
+ /* Selecting a specific TSC Set is only applicable to VAMOS mode */
+ if (lchan->activate.info.vamos && lchan->activate.tsc_set >= 1)
+ put_osmo_training_sequence_ie(msg, lchan->activate.tsc_set, lchan->activate.tsc);
+
msg->dst = rsl_chan_link(lchan);
rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_ACT_TOTAL));
diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c
index 79026a1d2..1f208bc7f 100644
--- a/src/osmo-bsc/bsc_vty.c
+++ b/src/osmo-bsc/bsc_vty.c
@@ -6215,6 +6215,13 @@ static int lchan_act_single(struct vty *vty, struct gsm_lchan *lchan, const char
info.ch_mode_rate.chan_rate = chan_t_to_chan_rate(lchan_t);
+ if (activate == 2 || lchan->vamos.is_secondary) {
+ info.vamos = true;
+ info.tsc_set = lchan->vamos.is_secondary ? 1 : 0;
+ info.tsc = 0;
+ info.ch_mode_rate.chan_mode = gsm48_chan_mode_to_vamos(info.ch_mode_rate.chan_mode);
+ }
+
vty_out(vty, "%% activating lchan %s as %s%s", gsm_lchan_name(lchan), gsm_chan_t_name(lchan->type),
VTY_NEWLINE);
lchan_activate(lchan, &info);
@@ -6287,9 +6294,10 @@ static int lchan_act_trx(struct vty *vty, struct gsm_bts_trx *trx, int activate)
* manually in a given mode/codec. This is useful for receiver
* performance testing (FER/RBER/...) */
DEFUN(lchan_act, lchan_act_cmd,
- "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|deactivate) (hr|fr|efr|amr|sig) [<0-7>]",
+ "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|activate-vamos|deactivate) (hr|fr|efr|amr|sig) [<0-7>]",
BTS_NR_TRX_TS_SS_STR2
"Manual Channel Activation (e.g. for BER test)\n"
+ "Manual Channel Activation, in VAMOS mode\n"
"Manual Channel Deactivation (e.g. for BER test)\n"
"Half-Rate v1\n" "Full-Rate\n" "Enhanced Full Rate\n" "Adaptive Multi-Rate\n" "Signalling\n" "AMR Mode\n")
{
@@ -6312,6 +6320,8 @@ DEFUN(lchan_act, lchan_act_cmd,
if (!strcmp(act_str, "activate"))
activate = 1;
+ else if (!strcmp(act_str, "activate-vamos"))
+ activate = 2;
else
activate = 0;
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c
index b772482a0..c42924300 100644
--- a/src/osmo-bsc/lchan_fsm.c
+++ b/src/osmo-bsc/lchan_fsm.c
@@ -311,6 +311,16 @@ void lchan_activate(struct gsm_lchan *lchan, struct lchan_activate_info *info)
OSMO_ASSERT(lchan && info);
+ if ((info->vamos || lchan->vamos.is_secondary)
+ && !osmo_bts_has_feature(&lchan->ts->trx->bts->features, BTS_FEAT_VAMOS)) {
+ lchan->last_error = talloc_strdup(lchan->ts->trx, "VAMOS related channel activation requested,"
+ " but BTS does not support VAMOS");
+ LOG_LCHAN(lchan, LOGL_ERROR,
+ "VAMOS related channel activation requested, but BTS %u does not support VAMOS\n",
+ lchan->ts->trx->bts->nr);
+ goto abort;
+ }
+
if (!lchan_state_is(lchan, LCHAN_ST_UNUSED))
goto abort;
@@ -608,7 +618,13 @@ static int lchan_activate_set_ch_mode_rate_and_mr_config(struct gsm_lchan *lchan
{
struct osmo_fsm_inst *fi = lchan->fi;
lchan->activate.ch_mode_rate = lchan->activate.info.ch_mode_rate;
- /* future: automatically adjust chan_mode in lchan->activate.ch_mode_rate */
+ lchan->activate.ch_mode_rate.chan_mode = (lchan->activate.info.vamos
+ ? gsm48_chan_mode_to_vamos(lchan->activate.info.ch_mode_rate.chan_mode)
+ : gsm48_chan_mode_to_non_vamos(lchan->activate.info.ch_mode_rate.chan_mode));
+ if (lchan->activate.ch_mode_rate.chan_mode < 0) {
+ lchan_fail("Invalid chan_mode: %s", gsm48_chan_mode_name(lchan->activate.info.ch_mode_rate.chan_mode));
+ return -EINVAL;
+ }
if (gsm48_chan_mode_to_non_vamos(lchan->activate.ch_mode_rate.chan_mode) == GSM48_CMODE_SPEECH_AMR) {
if (lchan_mr_config(&lchan->activate.mr_conf_filtered, lchan, lchan->activate.ch_mode_rate.s15_s0) < 0) {
@@ -737,10 +753,12 @@ static void lchan_fsm_wait_activ_ack_onenter(struct osmo_fsm_inst *fi, uint32_t
lchan->encr = lchan->activate.info.encr;
+ /* If enabling VAMOS mode and no specific TSC Set was selected, make sure to select a sane TSC Set by
+ * default: Set 1 for the primary and Set 2 for the shadow lchan. For non-VAMOS lchans, TSC Set 1. */
if (lchan->activate.info.tsc_set > 0)
lchan->activate.tsc_set = lchan->activate.info.tsc_set;
else
- lchan->activate.tsc_set = 1;
+ lchan->activate.tsc_set = lchan->vamos.is_secondary ? 2 : 1;
/* Use the TSC provided in the modification request, if any. Otherwise use the timeslot's configured
* TSC. */
@@ -819,6 +837,7 @@ static void lchan_fsm_post_activ_ack(struct osmo_fsm_inst *fi)
lchan->current_ch_mode_rate = lchan->activate.ch_mode_rate;
lchan->current_mr_conf = lchan->activate.mr_conf_filtered;
+ lchan->vamos.enabled = lchan->activate.info.vamos;
lchan->tsc_set = lchan->activate.tsc_set;
lchan->tsc = lchan->activate.tsc;
LOG_LCHAN(lchan, LOGL_INFO, "Rx Activ ACK %s\n",