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
This commit is contained in:
parent
71d082bec7
commit
aef68387ae
|
@ -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 *
|
||||
|
|
|
@ -225,11 +225,13 @@ struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan)
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -106,6 +106,19 @@ const char *btstype2str(enum gsm_bts_type type)
|
|||
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" },
|
||||
|
@ -343,6 +356,8 @@ struct gsm_bts *gsm_bts_alloc(void *ctx)
|
|||
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;
|
||||
|
|
Loading…
Reference in New Issue