From aef68387ae6d78df948a6b2b3a61050c4f192c5e Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 31 May 2017 12:15:54 +0200 Subject: 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 --- openbsc/include/openbsc/gsm_data_shared.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/gsm_data_shared.h b/openbsc/include/openbsc/gsm_data_shared.h index 1380a6cba..b920e3be0 100644 --- a/openbsc/include/openbsc/gsm_data_shared.h +++ b/openbsc/include/openbsc/gsm_data_shared.h @@ -535,10 +535,13 @@ struct gsm_bts_model { 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, @@ -549,8 +552,11 @@ enum gsm_bts_features { 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 * includes a number of pending requests, a back pointer @@ -682,6 +688,10 @@ struct gsm_bts { 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 @@ static inline char *gsm_lchan_name(const struct gsm_lchan *lchan) 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 * -- cgit v1.2.3