<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>