This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
fixeria gerrit-no-reply at lists.osmocom.orgfixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/24340 ) Change subject: [VAMOS] rsl: call bts_supports_cm() from rsl_handle_chan_mod_ie() ...................................................................... [VAMOS] rsl: call bts_supports_cm() from rsl_handle_chan_mod_ie() Ensure that we check the PHY capabilities in both cases: * RSL CHANnel ACTIVation, and * RSL CHANnel MODE MODIFY, by calling bts_supports_cm() from rsl_handle_chan_mod_ie(). Modify bts_supports_cm() to accept a 'struct rsl_ie_chan_mode', so we can handle VAMOS enabled channel modes and CSD later on. Change-Id: I31a444592436705ec9d6ddade3cbfa7f8cb4bb91 Related: SYS#5315, OS#4940 --- M include/osmo-bts/bts.h M src/common/bts.c M src/common/rsl.c M tests/misc/misc_test.c 4 files changed, 69 insertions(+), 35 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/40/24340/1 diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h index 141dce2..978a548 100644 --- a/include/osmo-bts/bts.h +++ b/include/osmo-bts/bts.h @@ -400,8 +400,8 @@ int bts_main(int argc, char **argv); -int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan, - enum gsm48_chan_mode cm); +int bts_supports_cm(const struct gsm_bts *bts, + const struct rsl_ie_chan_mode *cm); int32_t bts_get_avg_fn_advance(const struct gsm_bts *bts); diff --git a/src/common/bts.c b/src/common/bts.c index fe4d26e..b5615d6 100644 --- a/src/common/bts.c +++ b/src/common/bts.c @@ -854,28 +854,35 @@ return &bts->gsm_time; } -int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan, - enum gsm48_chan_mode cm) +int bts_supports_cm(const struct gsm_bts *bts, + const struct rsl_ie_chan_mode *cm) { enum osmo_bts_features feature = _NUM_BTS_FEAT; - /* We assume that signalling support is mandatory, - * there is no BTS_FEAT_* definition to check that. */ - if (cm == GSM48_CMODE_SIGN) + switch (cm->spd_ind) { + case RSL_CMOD_SPD_SIGN: + /* We assume that signalling support is mandatory, + * there is no BTS_FEAT_* definition to check that. */ return 1; + case RSL_CMOD_SPD_SPEECH: + break; + case RSL_CMOD_SPD_DATA: + default: + return 0; + } /* Before the requested pchan/cm combination can be checked, we need to * convert it to a feature identifier we can check */ - switch (pchan) { - case GSM_PCHAN_TCH_F: - switch(cm) { - case GSM48_CMODE_SPEECH_V1: + switch (cm->chan_rt) { + case RSL_CMOD_CRT_TCH_Bm: + switch (cm->chan_rate) { + case RSL_CMOD_SP_GSM1: feature = BTS_FEAT_SPEECH_F_V1; break; - case GSM48_CMODE_SPEECH_EFR: + case RSL_CMOD_SP_GSM2: feature = BTS_FEAT_SPEECH_F_EFR; break; - case GSM48_CMODE_SPEECH_AMR: + case RSL_CMOD_SP_GSM3: feature = BTS_FEAT_SPEECH_F_AMR; break; default: @@ -884,12 +891,12 @@ } break; - case GSM_PCHAN_TCH_H: - switch(cm) { - case GSM48_CMODE_SPEECH_V1: + case RSL_CMOD_CRT_TCH_Lm: + switch (cm->chan_rate) { + case RSL_CMOD_SP_GSM1: feature = BTS_FEAT_SPEECH_H_V1; break; - case GSM48_CMODE_SPEECH_AMR: + case RSL_CMOD_SP_GSM3: feature = BTS_FEAT_SPEECH_H_AMR; break; default: @@ -899,8 +906,9 @@ break; default: - LOGP(DRSL, LOGL_ERROR, "BTS %u: unhandled pchan %s when checking mode %s\n", - bts->nr, gsm_pchan_name(pchan), gsm48_chan_mode_name(cm)); + LOGP(DRSL, LOGL_ERROR, + "Unhandled RSL channel type=0x%02x/rate=0x%02x\n", + cm->chan_rt, cm->chan_rate); return 0; } diff --git a/src/common/rsl.c b/src/common/rsl.c index 601e5f8..bb53aa5 100644 --- a/src/common/rsl.c +++ b/src/common/rsl.c @@ -227,6 +227,14 @@ #undef RSL_CMODE + if (bts_supports_cm(lchan->ts->trx->bts, cm) != 1) { + LOGPLCHAN(lchan, DRSL, LOGL_ERROR, "Channel type=0x%02x/mode=%s " + "is not supported by the PHY\n", cm->chan_rt, + gsm48_chan_mode_name(lchan->tch_mode)); + *cause = RSL_ERR_SERV_OPT_UNAVAIL; + return -ENOTSUP; + } + return 0; } @@ -1989,12 +1997,6 @@ if (rsl_handle_chan_ident_ie(lchan, &tp, &cause) != 0) return rsl_tx_mode_modif_nack(lchan, cause); - if (bts_supports_cm(lchan->ts->trx->bts, ts_pchan(lchan->ts), lchan->tch_mode) != 1) { - LOGPLCHAN(lchan, DRSL, LOGL_ERROR, "%s: invalid mode: %s (wrong BSC configuration?)\n", - gsm_ts_and_pchan_name(lchan->ts), gsm48_chan_mode_name(lchan->tch_mode)); - return rsl_tx_mode_modif_nack(lchan, RSL_ERR_SERV_OPT_UNAVAIL); - } - /* 9.3.7 Encryption Information */ if (TLVP_PRESENT(&tp, RSL_IE_ENCR_INFO)) { uint8_t len = TLVP_LEN(&tp, RSL_IE_ENCR_INFO); diff --git a/tests/misc/misc_test.c b/tests/misc/misc_test.c index 439d6b3..e65fcb4 100644 --- a/tests/misc/misc_test.c +++ b/tests/misc/misc_test.c @@ -162,25 +162,49 @@ static void test_bts_supports_cm(void) { + struct rsl_ie_chan_mode cm; struct gsm_bts *bts; bts = gsm_bts_alloc(ctx, 0); + /* Signalling shall be supported regardless of the features */ + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Bm, + .spd_ind = RSL_CMOD_SPD_SIGN }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 1); /* TCH/F */ + + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Lm, + .spd_ind = RSL_CMOD_SPD_SIGN }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 1); /* TCH/H */ + osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1); osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1); osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR); osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR); - OSMO_ASSERT(bts_supports_cm - (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1) == 1); - OSMO_ASSERT(bts_supports_cm - (bts, GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1) == 1); - OSMO_ASSERT(bts_supports_cm - (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_EFR) == 0); - OSMO_ASSERT(bts_supports_cm - (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_AMR) == 1); - OSMO_ASSERT(bts_supports_cm - (bts, GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_AMR) == 1); + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Bm, + .spd_ind = RSL_CMOD_SPD_SPEECH, + .chan_rate = RSL_CMOD_SP_GSM1 }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 1); /* TCH/FS */ + + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Lm, + .spd_ind = RSL_CMOD_SPD_SPEECH, + .chan_rate = RSL_CMOD_SP_GSM1 }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 1); /* TCH/HS */ + + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Bm, + .spd_ind = RSL_CMOD_SPD_SPEECH, + .chan_rate = RSL_CMOD_SP_GSM2 }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 0); /* TCH/EFS */ + + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Bm, + .spd_ind = RSL_CMOD_SPD_SPEECH, + .chan_rate = RSL_CMOD_SP_GSM3 }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 1); /* TCH/AFS */ + + cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Lm, + .spd_ind = RSL_CMOD_SPD_SPEECH, + .chan_rate = RSL_CMOD_SP_GSM3 }; + OSMO_ASSERT(bts_supports_cm(bts, &cm) == 1); /* TCH/AHS */ talloc_free(bts); } -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/24340 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I31a444592436705ec9d6ddade3cbfa7f8cb4bb91 Gerrit-Change-Number: 24340 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210522/2f88c98e/attachment.htm>