Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/2797

to look at the new patch set (#2).

Add remote BTS feature storage and helpers

In addition to compile-time defined BTS model features we also need
run-time BTS features reported by BTS via OML. This should be shared by
BSC and BTS. To accommodate for this, add following:

* features bitvec to gsm_bts struct
* features descriptions
* comments to avoid confusion between 2 feature sets
* helper functions to set/query particular feature
* upper boundary on number of supported features and assertion for it

Change-Id: I02bd317097ba66585c50ebd4e8fc348f6dc3dad9
Related: OS#1614
---
M openbsc/include/openbsc/gsm_data_shared.h
M openbsc/src/libbsc/bsc_init.c
M openbsc/src/libcommon/gsm_data.c
M openbsc/src/libcommon/gsm_data_shared.c
4 files changed, 40 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/97/2797/2

diff --git a/openbsc/include/openbsc/gsm_data_shared.h 
b/openbsc/include/openbsc/gsm_data_shared.h
index 4661830..d1fec25 100644
--- a/openbsc/include/openbsc/gsm_data_shared.h
+++ b/openbsc/include/openbsc/gsm_data_shared.h
@@ -536,10 +536,13 @@
 
        struct tlv_definition nm_att_tlvdef;
 
+       /* features of a given BTS model set via gsm_bts_model_register() 
locally */
        struct bitvec features;
        uint8_t _features_data[MAX_BTS_FEATURES/8];
 };
 
+/* N. B: always add new features to the end of the list (right before 
_NUM_BTS_FEAT) to avoid breaking compatibility
+   with BTS compiled against earlier version of this header */
 enum gsm_bts_features {
        BTS_FEAT_HSCSD,
        BTS_FEAT_GPRS,
@@ -550,7 +553,10 @@
        BTS_FEAT_OML_ALERTS,
        BTS_FEAT_AGCH_PCH_PROP,
        BTS_FEAT_CBCH,
+       _NUM_BTS_FEAT
 };
+
+extern const struct value_string gsm_bts_features_descs[];
 
 /*
  * This keeps track of the paging status of one BTS. It
@@ -682,6 +688,10 @@
        enum gsm_band band;
        char version[MAX_VERSION_LENGTH];
        char sub_model[MAX_VERSION_LENGTH];
+
+       /* features of a given BTS set/reported via OML */
+       struct bitvec features;
+       uint8_t _features_data[MAX_BTS_FEATURES/8];
 
        /* Connected PCU version (if any) */
        char pcu_version[MAX_VERSION_LENGTH];
@@ -911,6 +921,18 @@
        return lchan->name;
 }
 
+static inline int gsm_bts_set_feature(struct gsm_bts *bts, enum 
gsm_bts_features feat)
+{
+       OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
+       return bitvec_set_bit_pos(&bts->features, feat, 1);
+}
+
+static inline bool gsm_bts_has_feature(const struct gsm_bts *bts, enum 
gsm_bts_features feat)
+{
+       OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
+       return bitvec_get_bit_pos(&bts->features, feat);
+}
+
 void gsm_abis_mo_reset(struct gsm_abis_mo *mo);
 
 struct gsm_abis_mo *
diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c
index 6dcbc44..bc8c312 100644
--- a/openbsc/src/libbsc/bsc_init.c
+++ b/openbsc/src/libbsc/bsc_init.c
@@ -316,6 +316,7 @@
        struct input_signal_data *isd = signal_data;
        struct gsm_bts_trx *trx = isd->trx;
        int ts_no, lchan_no;
+       /* N. B: we rely on attribute order when parsing response in 
abis_nm_rx_get_attr_resp() */
        const uint8_t bts_attr[] = { NM_ATT_MANUF_ID, NM_ATT_SW_CONFIG, };
        const uint8_t trx_attr[] = { NM_ATT_MANUF_STATE, NM_ATT_SW_CONFIG, };
 
diff --git a/openbsc/src/libcommon/gsm_data.c b/openbsc/src/libcommon/gsm_data.c
index 2c7ea0a..8830ce1 100644
--- a/openbsc/src/libcommon/gsm_data.c
+++ b/openbsc/src/libcommon/gsm_data.c
@@ -225,11 +225,13 @@
 
 int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum 
gsm_bts_features feat)
 {
+       OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
        return bitvec_set_bit_pos(&model->features, feat, 1);
 }
 
 bool gsm_btsmodel_has_feature(struct gsm_bts_model *model, enum 
gsm_bts_features feat)
 {
+       OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
        return bitvec_get_bit_pos(&model->features, feat);
 }
 
diff --git a/openbsc/src/libcommon/gsm_data_shared.c 
b/openbsc/src/libcommon/gsm_data_shared.c
index ab64d05..8992636 100644
--- a/openbsc/src/libcommon/gsm_data_shared.c
+++ b/openbsc/src/libcommon/gsm_data_shared.c
@@ -107,6 +107,19 @@
        return get_value_string(bts_type_names, type);
 }
 
+const struct value_string gsm_bts_features_descs[] = {
+       { BTS_FEAT_HSCSD,               "HSCSD" },
+       { BTS_FEAT_GPRS,                "GPRS" },
+       { BTS_FEAT_EGPRS,               "EGPRS" },
+       { BTS_FEAT_ECSD,                "ECSD" },
+       { BTS_FEAT_HOPPING,             "Frequency Hopping" },
+       { BTS_FEAT_MULTI_TSC,           "Multi-TSC" },
+       { BTS_FEAT_OML_ALERTS,          "OML Alerts" },
+       { BTS_FEAT_AGCH_PCH_PROP,       "AGCH/PCH proportional allocation" },
+       { BTS_FEAT_CBCH,                "CBCH" },
+       { 0, NULL }
+};
+
 const struct value_string gsm_chreq_descs[] = {
        { GSM_CHREQ_REASON_EMERG,       "emergency call" },
        { GSM_CHREQ_REASON_PAG,         "answer to paging" },
@@ -344,6 +357,8 @@
        bts->rach_b_thresh = -1;
        bts->rach_ldavg_slots = -1;
        bts->paging.free_chans_need = -1;
+       bts->features.data = &bts->_features_data[0];
+       bts->features.data_len = sizeof(bts->_features_data);
 
        /* si handling */
        bts->bcch_change_mark = 1;

-- 
To view, visit https://gerrit.osmocom.org/2797
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I02bd317097ba66585c50ebd4e8fc348f6dc3dad9
Gerrit-PatchSet: 2
Gerrit-Project: openbsc
Gerrit-Branch: master
Gerrit-Owner: Max <[email protected]>
Gerrit-Reviewer: Jenkins Builder

Reply via email to