<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18591">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Do not mix public and private BTS features, use libosmocore's API<br><br>It was a very bad idea to mix "public" BTS features, that are<br>reported to the BSC via OML, and those features, that are used<br>locally (and exclusively) in osmo-bts.<br><br>Why? At least because we already have the BTS feature manipulation<br>API in libosmocore, that is used by osmo-bsc, but for some reason<br>not by osmo-bts. New features added to libosmocore would clash<br>with the existing "internal" ones like BTS_FEAT_MS_PWR_CTRL_DSP.<br><br>So what this change does can be described as follows:<br><br>  - remove duplicate definitions of the "public" features,<br>  - use libosmocore's API for the "public" features,<br>  - keep the "internal" features in a local header,<br>  - raname the "internal" features to reflect their nature,<br>  - separate both "public" and "local" feature vectors.<br><br>As a bonus, let's allocate the feature vectors using libosmocore's<br>bitvec API instead of doing this manually in gsm_bts_alloc().<br><br>Change-Id: Icf792d02323bb73e3b8d46384c7890cb1eb4731e<br>---<br>M include/osmo-bts/gsm_data_shared.h<br>M src/common/bts.c<br>M src/common/gsm_data_shared.c<br>M src/common/l1sap.c<br>M src/common/oml.c<br>M src/common/vty.c<br>M src/osmo-bts-litecell15/main.c<br>M src/osmo-bts-oc2g/main.c<br>M src/osmo-bts-octphy/l1_if.c<br>M src/osmo-bts-sysmo/main.c<br>M src/osmo-bts-trx/main.c<br>M src/osmo-bts-virtual/main.c<br>M tests/misc/misc_test.c<br>13 files changed, 116 insertions(+), 124 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/91/18591/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h</span><br><span>index 53a6d7a..b7215b5 100644</span><br><span>--- a/include/osmo-bts/gsm_data_shared.h</span><br><span>+++ b/include/osmo-bts/gsm_data_shared.h</span><br><span>@@ -15,6 +15,7 @@</span><br><span> #include <osmocom/gsm/rxlev_stat.h></span><br><span> #include <osmocom/gsm/sysinfo.h></span><br><span> #include <osmocom/gsm/meas_rep.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/bts_features.h></span><br><span> #include <osmocom/gsm/gsm48_rest_octets.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> #include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span>@@ -57,8 +58,6 @@</span><br><span> </span><br><span> #define MAX_VERSION_LENGTH 64</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_BTS_FEATURES 128</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum gsm_hooks {</span><br><span>   GSM_HOOK_NM_SWLOAD,</span><br><span>  GSM_HOOK_RR_PAGING,</span><br><span>@@ -459,35 +458,18 @@</span><br><span> </span><br><span> struct vty;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* N. B: always add new features to the end of the list (right before _NUM_BTS_FEAT) to avoid breaking compatibility</span><br><span style="color: hsl(0, 100%, 40%);">-   with BTS compiled against earlier version of this header. Also make sure that the description strings</span><br><span style="color: hsl(0, 100%, 40%);">-   gsm_bts_features_descs[] in gsm_data_shared.c are also updated accordingly! */</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_bts_features {</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_HSCSD,</span><br><span style="color: hsl(0, 100%, 40%);">- BTS_FEAT_GPRS,</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_EGPRS,</span><br><span style="color: hsl(0, 100%, 40%);">- BTS_FEAT_ECSD,</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_HOPPING,</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS_FEAT_MULTI_TSC,</span><br><span style="color: hsl(0, 100%, 40%);">-     BTS_FEAT_OML_ALERTS,</span><br><span style="color: hsl(0, 100%, 40%);">-    BTS_FEAT_AGCH_PCH_PROP,</span><br><span style="color: hsl(0, 100%, 40%);">- BTS_FEAT_CBCH,</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_SPEECH_F_V1,</span><br><span style="color: hsl(0, 100%, 40%);">-   BTS_FEAT_SPEECH_H_V1,</span><br><span style="color: hsl(0, 100%, 40%);">-   BTS_FEAT_SPEECH_F_EFR,</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_SPEECH_F_AMR,</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_SPEECH_H_AMR,</span><br><span style="color: hsl(0, 100%, 40%);">-  BTS_FEAT_ETWS_PN,</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS_FEAT_MS_PWR_CTRL_DSP,</span><br><span style="color: hsl(120, 100%, 40%);">+/* Private BTS features (internal use, not exposed via OML) */</span><br><span style="color: hsl(120, 100%, 40%);">+enum bts_priv_feat {</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_PRIV_FEAT_MS_PWR_CTRL_DSP,</span><br><span>       /* When the feature is set then the measurement data is included in</span><br><span>   * (PRIM_PH_DATA) and struct ph_tch_param (PRIM_TCH). Otherwise the</span><br><span>   * measurement data is passed using a separate MPH INFO MEAS IND.</span><br><span>     * (See also ticket: OS#2977) */</span><br><span style="color: hsl(0, 100%, 40%);">-        BTS_FEAT_MEAS_PAYLOAD_COMB,</span><br><span style="color: hsl(0, 100%, 40%);">-     _NUM_BTS_FEAT</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB,</span><br><span style="color: hsl(120, 100%, 40%);">+      _NUM_BTS_PRIV_FEAT</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string gsm_bts_features_descs[];</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string bts_priv_feat_desc[];</span><br><span> </span><br><span> struct gsm_bts_gprs_nsvc {</span><br><span>     struct gsm_bts *bts;</span><br><span>@@ -580,8 +562,9 @@</span><br><span>   char sub_model[MAX_VERSION_LENGTH];</span><br><span> </span><br><span>      /* features of a given BTS set/reported via OML */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct bitvec features;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t _features_data[MAX_BTS_FEATURES/8];</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bitvec *features;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* private features of a given BTS (not exposed via OML) */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bitvec *priv_features;</span><br><span> </span><br><span>    /* Connected PCU version (if any) */</span><br><span>         char pcu_version[MAX_VERSION_LENGTH];</span><br><span>@@ -816,16 +799,16 @@</span><br><span>        return lchan->name;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline int gsm_bts_set_feature(struct gsm_bts *bts, enum gsm_bts_features feat)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline int bts_set_priv_feature(struct gsm_bts *bts, enum bts_priv_feat feat)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);</span><br><span style="color: hsl(0, 100%, 40%);">-       return bitvec_set_bit_pos(&bts->features, feat, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(_NUM_BTS_PRIV_FEAT < MAX_BTS_FEATURES);</span><br><span style="color: hsl(120, 100%, 40%);">+        return bitvec_set_bit_pos(bts->priv_features, feat, 1);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline bool gsm_bts_has_feature(const struct gsm_bts *bts, enum gsm_bts_features feat)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline bool bts_has_priv_feature(const struct gsm_bts *bts, enum bts_priv_feat feat)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);</span><br><span style="color: hsl(0, 100%, 40%);">-       return bitvec_get_bit_pos(&bts->features, feat);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(_NUM_BTS_PRIV_FEAT < MAX_BTS_FEATURES);</span><br><span style="color: hsl(120, 100%, 40%);">+        return bitvec_get_bit_pos(bts->priv_features, feat);</span><br><span> }</span><br><span> </span><br><span> void gsm_abis_mo_reset(struct gsm_abis_mo *mo);</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index 2200615..fcc4573 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -194,7 +194,7 @@</span><br><span>       osmo_rtp_init(tall_rtp_ctx);</span><br><span> </span><br><span>     /* features implemented in 'common', available for all models */</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_ETWS_PN);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_bts_set_feature(bts->features, BTS_FEAT_ETWS_PN);</span><br><span> </span><br><span>        rc = bts_model_init(bts);</span><br><span>    if (rc < 0) {</span><br><span>@@ -258,7 +258,7 @@</span><br><span>       tpp->ramp.step_interval_sec = 1;</span><br><span> </span><br><span>      /* IF BTS model doesn't DSP/HW support MS Power Control Loop, enable osmo algo by default: */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!gsm_bts_has_feature(trx->bts, BTS_FEAT_MS_PWR_CTRL_DSP))</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!bts_has_priv_feature(trx->bts, BTS_PRIV_FEAT_MS_PWR_CTRL_DSP))</span><br><span>               trx->ms_pwr_ctl_soft = true;</span><br><span> </span><br><span>  rc = bts_model_trx_init(trx);</span><br><span>@@ -796,7 +796,7 @@</span><br><span> int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan,</span><br><span>                 enum gsm48_chan_mode cm)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       enum gsm_bts_features feature = _NUM_BTS_FEAT;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum osmo_bts_features feature = _NUM_BTS_FEAT;</span><br><span> </span><br><span>  /* We assume that signalling support is mandatory,</span><br><span>    * there is no BTS_FEAT_* definition to check that. */</span><br><span>@@ -844,7 +844,7 @@</span><br><span>         }</span><br><span> </span><br><span>        /* Check if the feature is supported by this BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (gsm_bts_has_feature(bts, feature))</span><br><span style="color: hsl(120, 100%, 40%);">+        if (osmo_bts_has_feature(bts->features, feature))</span><br><span>                 return 1;</span><br><span> </span><br><span>        return 0;</span><br><span>diff --git a/src/common/gsm_data_shared.c b/src/common/gsm_data_shared.c</span><br><span>index c4a60b5..767b5fa 100644</span><br><span>--- a/src/common/gsm_data_shared.c</span><br><span>+++ b/src/common/gsm_data_shared.c</span><br><span>@@ -92,24 +92,9 @@</span><br><span>  return get_value_string(osmo_bts_variant_names, v);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const struct value_string gsm_bts_features_descs[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { BTS_FEAT_HSCSD,               "HSCSD" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { BTS_FEAT_GPRS,                "GPRS" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_FEAT_EGPRS,               "EGPRS" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { BTS_FEAT_ECSD,                "ECSD" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_FEAT_HOPPING,             "Frequency Hopping" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { BTS_FEAT_MULTI_TSC,           "Multi-TSC" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { BTS_FEAT_OML_ALERTS,          "OML Alerts" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { BTS_FEAT_AGCH_PCH_PROP,       "AGCH/PCH proportional allocation" },</span><br><span style="color: hsl(0, 100%, 40%);">- { BTS_FEAT_CBCH,                "CBCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_FEAT_SPEECH_F_V1,         "Fullrate speech V1" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { BTS_FEAT_SPEECH_H_V1,         "Halfrate speech V1" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { BTS_FEAT_SPEECH_F_EFR,        "Fullrate speech EFR" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { BTS_FEAT_SPEECH_F_AMR,        "Fullrate speech AMR" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { BTS_FEAT_SPEECH_H_AMR,        "Halfrate speech AMR" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { BTS_FEAT_ETWS_PN,             "ETWS Primary Notification on PCH" },</span><br><span style="color: hsl(0, 100%, 40%);">- { BTS_FEAT_MS_PWR_CTRL_DSP,     "DSP/HW based MS Power Control Loop" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { BTS_FEAT_MEAS_PAYLOAD_COMB,   "Measurement and Payload data combined"},</span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string bts_priv_feat_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+       { BTS_PRIV_FEAT_MS_PWR_CTRL_DSP,        "DSP/HW based MS Power Control Loop" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB,      "Measurement and Payload data combined" },</span><br><span>         { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -348,8 +333,14 @@</span><br><span> </span><br><span>     bts->rach_b_thresh = -1;</span><br><span>  bts->rach_ldavg_slots = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->features.data = &bts->_features_data[0];</span><br><span style="color: hsl(0, 100%, 40%);">- bts->features.data_len = sizeof(bts->_features_data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* public features (exposed via OML) */</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->features = bitvec_alloc(MAX_BTS_FEATURES / 8, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(bts->features != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* private features (internal use) */</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->priv_features = bitvec_alloc(MAX_BTS_FEATURES / 8, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bts->priv_features != NULL);</span><br><span> </span><br><span>      /* si handling */</span><br><span>    bts->bcch_change_mark = 1;</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index 99aa11b..32a53bc 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -757,8 +757,8 @@</span><br><span>             break;</span><br><span>       case PRIM_INFO_MEAS:</span><br><span>                 /* We should never get an INFO_IND with PRIM_INFO_MEAS</span><br><span style="color: hsl(0, 100%, 40%);">-           * when BTS_FEAT_MEAS_PAYLOAD_COMB is enabled */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (gsm_bts_has_feature(trx->bts, BTS_FEAT_MEAS_PAYLOAD_COMB))</span><br><span style="color: hsl(120, 100%, 40%);">+              * when BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB is enabled */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (bts_has_priv_feature(trx->bts, BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB))</span><br><span>                      OSMO_ASSERT(false);</span><br><span> </span><br><span>              process_l1sap_meas_data(trx, l1sap, PRIM_MPH_INFO);</span><br><span>@@ -1279,7 +1279,7 @@</span><br><span>  /* The ph_data_param contained in the l1sap primitive may contain</span><br><span>     * measurement data. If this data is present, forward it for</span><br><span>          * processing */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (gsm_bts_has_feature(trx->bts, BTS_FEAT_MEAS_PAYLOAD_COMB))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bts_has_priv_feature(trx->bts, BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB))</span><br><span>              process_l1sap_meas_data(trx, l1sap, PRIM_PH_DATA);</span><br><span> </span><br><span>       if (ts_is_pdch(&trx->ts[tn])) {</span><br><span>@@ -1399,7 +1399,7 @@</span><br><span>       /* The ph_tch_param contained in the l1sap primitive may contain</span><br><span>      * measurement data. If this data is present, forward it for</span><br><span>          * processing */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (gsm_bts_has_feature(trx->bts, BTS_FEAT_MEAS_PAYLOAD_COMB))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bts_has_priv_feature(trx->bts, BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB))</span><br><span>              process_l1sap_meas_data(trx, l1sap, PRIM_TCH);</span><br><span> </span><br><span>   msgb_pull_to_l2(msg);</span><br><span>diff --git a/src/common/oml.c b/src/common/oml.c</span><br><span>index 7e3b834..077ef09 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -173,7 +173,7 @@</span><br><span> /* Add BTS features as 3GPP TS 52.021 ยง9.4.30 Manufacturer Id */</span><br><span> static inline void add_bts_feat(struct msgb *msg, const struct gsm_bts *bts)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      msgb_tl16v_put(msg, NM_ATT_MANUF_ID, _NUM_BTS_FEAT/8 + 1, bts->_features_data);</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_tl16v_put(msg, NM_ATT_MANUF_ID, _NUM_BTS_FEAT/8 + 1, bts->features->data);</span><br><span> }</span><br><span> </span><br><span> static inline void add_trx_attr(struct msgb *msg, const struct gsm_bts_trx *trx)</span><br><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index c2cbeb5..ee711b9 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -764,7 +764,7 @@</span><br><span>        struct gsm_bts_trx *trx = vty->index;</span><br><span>     bool soft = !strcmp(argv[0], "osmo");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (!soft && !gsm_bts_has_feature(trx->bts, BTS_FEAT_MS_PWR_CTRL_DSP)) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!soft && !bts_has_priv_feature(trx->bts, BTS_PRIV_FEAT_MS_PWR_CTRL_DSP)) {</span><br><span>            /* NOTE: osmo-bts-trx used to have its own (low-level) MS Power Control loop, which</span><br><span>           * has been ripped out in favour of the common implementation. Configuration files</span><br><span>            * may still contain 'dsp', so let's be tolerant and override 'dsp' by 'osmo'. */</span><br><span>@@ -825,13 +825,27 @@</span><br><span> static void bts_dump_vty_features(struct vty *vty, struct gsm_bts *bts)</span><br><span> {</span><br><span>        unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">- bool no_features = true;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool no_features;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  vty_out(vty, "  Features:%s", VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < _NUM_BTS_FEAT; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (gsm_bts_has_feature(bts, i)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0, no_features = true; i < _NUM_BTS_FEAT; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (osmo_bts_has_feature(bts->features, i)) {</span><br><span>                     vty_out(vty, "    %03u ", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                 vty_out(vty, "%-40s%s", get_value_string(gsm_bts_features_descs, i), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%-40s%s", osmo_bts_feature_name(i), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                     no_features = false;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (no_features)</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "    (not available)%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, "  Internal features:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0, no_features = true; i < _NUM_BTS_PRIV_FEAT; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bts_has_priv_feature(bts, i)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   vty_out(vty, "    %03u ", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, "%-40s%s", get_value_string(bts_priv_feat_desc, i), VTY_NEWLINE);</span><br><span>                     no_features = false;</span><br><span>                 }</span><br><span>    }</span><br><span>diff --git a/src/osmo-bts-litecell15/main.c b/src/osmo-bts-litecell15/main.c</span><br><span>index ef02135..33cbee9 100644</span><br><span>--- a/src/osmo-bts-litecell15/main.c</span><br><span>+++ b/src/osmo-bts-litecell15/main.c</span><br><span>@@ -110,16 +110,17 @@</span><br><span>               exit(23);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   gsm_bts_set_feature(bts, BTS_FEAT_GPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_EGPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_AGCH_PCH_PROP);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_MS_PWR_CTRL_DSP);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_bts_set_feature(bts->features, BTS_FEAT_GPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_EGPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_bts_set_feature(bts->features, BTS_FEAT_AGCH_PCH_PROP);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_set_priv_feature(bts, BTS_PRIV_FEAT_MS_PWR_CTRL_DSP);</span><br><span> </span><br><span>        bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-oc2g/main.c b/src/osmo-bts-oc2g/main.c</span><br><span>index f9bb0cb..849f262 100644</span><br><span>--- a/src/osmo-bts-oc2g/main.c</span><br><span>+++ b/src/osmo-bts-oc2g/main.c</span><br><span>@@ -111,16 +111,17 @@</span><br><span>            exit(23);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   gsm_bts_set_feature(bts, BTS_FEAT_GPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_EGPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_AGCH_PCH_PROP);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_MS_PWR_CTRL_DSP);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_bts_set_feature(bts->features, BTS_FEAT_GPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_EGPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_bts_set_feature(bts->features, BTS_FEAT_AGCH_PCH_PROP);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_set_priv_feature(bts, BTS_PRIV_FEAT_MS_PWR_CTRL_DSP);</span><br><span> </span><br><span>        bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-octphy/l1_if.c b/src/osmo-bts-octphy/l1_if.c</span><br><span>index fb62f8b..0adc8fe 100644</span><br><span>--- a/src/osmo-bts-octphy/l1_if.c</span><br><span>+++ b/src/osmo-bts-octphy/l1_if.c</span><br><span>@@ -779,13 +779,13 @@</span><br><span>        /* FIXME: what is the nominal transmit power of the PHY/board? */</span><br><span>    bts->c0->nominal_power = 15;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_GPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_GPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);</span><br><span> #if defined(cOCTVC1_GSM_LOGICAL_CHANNEL_COMBINATION_ENUM_FCCH_SCH_BCCH_CCCH_SDCCH4_CBCH_SACCHC4) && defined(cOCTVC1_GSM_LOGICAL_CHANNEL_COMBINATION_ENUM_SDCCH8_CBCH_SACCHC8)</span><br><span style="color: hsl(0, 100%, 40%);">-   gsm_bts_set_feature(bts, BTS_FEAT_CBCH);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH);</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span> </span><br><span>    bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c</span><br><span>index 44c6d5d..06891a2 100644</span><br><span>--- a/src/osmo-bts-sysmo/main.c</span><br><span>+++ b/src/osmo-bts-sysmo/main.c</span><br><span>@@ -76,18 +76,19 @@</span><br><span>          exit(23);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   gsm_bts_set_feature(bts, BTS_FEAT_CBCH);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_GPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_EGPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_AGCH_PCH_PROP);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_MS_PWR_CTRL_DSP);</span><br><span style="color: hsl(0, 100%, 40%);">-     gsm_bts_set_feature(bts, BTS_FEAT_MEAS_PAYLOAD_COMB);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_GPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_EGPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_bts_set_feature(bts->features, BTS_FEAT_AGCH_PCH_PROP);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_set_priv_feature(bts, BTS_PRIV_FEAT_MS_PWR_CTRL_DSP);</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_set_priv_feature(bts, BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB);</span><br><span> </span><br><span>      bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c</span><br><span>index ab0472e..112f405 100644</span><br><span>--- a/src/osmo-bts-trx/main.c</span><br><span>+++ b/src/osmo-bts-trx/main.c</span><br><span>@@ -108,15 +108,16 @@</span><br><span>         * value */</span><br><span>  bts->c0->nominal_power = 23;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_GPRS);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_CBCH);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_MEAS_PAYLOAD_COMB);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_GPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_set_priv_feature(bts, BTS_PRIV_FEAT_MEAS_PAYLOAD_COMB);</span><br><span> </span><br><span>      bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c</span><br><span>index a6fc290..fb5d357 100644</span><br><span>--- a/src/osmo-bts-virtual/main.c</span><br><span>+++ b/src/osmo-bts-virtual/main.c</span><br><span>@@ -62,13 +62,13 @@</span><br><span>  bts->variant = BTS_OSMO_VIRTUAL;</span><br><span>  bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_CBCH);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_EFR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH);</span><br><span> </span><br><span>   bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/tests/misc/misc_test.c b/tests/misc/misc_test.c</span><br><span>index c4d3a59..439d6b3 100644</span><br><span>--- a/tests/misc/misc_test.c</span><br><span>+++ b/tests/misc/misc_test.c</span><br><span>@@ -166,10 +166,10 @@</span><br><span> </span><br><span>        bts = gsm_bts_alloc(ctx, 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);</span><br><span> </span><br><span>   OSMO_ASSERT(bts_supports_cm</span><br><span>              (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1) == 1);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18591">change 18591</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/+/18591"/><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: Icf792d02323bb73e3b8d46384c7890cb1eb4731e </div>
<div style="display:none"> Gerrit-Change-Number: 18591 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>