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