This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Max gerrit-no-reply at lists.osmocom.orgReview at https://gerrit.osmocom.org/2544 Get basic BTS attributes Request BTS attributes via OML on connection and parse the response: * make attribute list const * expand gsm_bts-features * add sub_model to gsm_bts * request/parse incoming response as sw-config Note: only basic BTS-wide KV attributes wrapped in sw-config are supported for now. Change-Id: I589be51daca0cb9e1f3473b93e910e46b06e23ae Related: OS#1614 --- M openbsc/include/openbsc/abis_nm.h M openbsc/include/openbsc/gsm_data_shared.h M openbsc/src/libbsc/abis_nm.c M openbsc/src/libbsc/bsc_init.c 4 files changed, 81 insertions(+), 8 deletions(-) git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/44/2544/1 diff --git a/openbsc/include/openbsc/abis_nm.h b/openbsc/include/openbsc/abis_nm.h index 0fe9d8e..56f354b 100644 --- a/openbsc/include/openbsc/abis_nm.h +++ b/openbsc/include/openbsc/abis_nm.h @@ -28,6 +28,8 @@ #include <openbsc/gsm_data.h> +#define MAX_BTS_ATTR 4 + struct cell_global_id { uint16_t mcc; uint16_t mnc; @@ -85,7 +87,7 @@ uint8_t e1_subslot); int abis_nm_get_attr(struct gsm_bts *bts, uint8_t obj_class, uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr, - uint8_t *attr, uint8_t attr_len); + const uint8_t *attr, uint8_t attr_len); int abis_nm_set_bts_attr(struct gsm_bts *bts, uint8_t *attr, int attr_len); int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, uint8_t *attr, int attr_len); int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, uint8_t chan_comb); diff --git a/openbsc/include/openbsc/gsm_data_shared.h b/openbsc/include/openbsc/gsm_data_shared.h index 0586d8a..b9923ce 100644 --- a/openbsc/include/openbsc/gsm_data_shared.h +++ b/openbsc/include/openbsc/gsm_data_shared.h @@ -543,6 +543,9 @@ BTS_FEAT_ECSD, BTS_FEAT_HOPPING, BTS_FEAT_MULTI_TSC, + BTS_FEAT_OML_ALERTS, + BTS_FEAT_AGCH_PCH_PROP, + BTS_FEAT_CBCH, }; /* @@ -674,6 +677,7 @@ struct gsm_bts_model *model; enum gsm_band band; char version[MAX_VERSION_LENGTH]; + char sub_model[MAX_VERSION_LENGTH]; /* Connected PCU version (if any) */ char pcu_version[MAX_VERSION_LENGTH]; diff --git a/openbsc/src/libbsc/abis_nm.c b/openbsc/src/libbsc/abis_nm.c index db0dbd2..19b1d9f 100644 --- a/openbsc/src/libbsc/abis_nm.c +++ b/openbsc/src/libbsc/abis_nm.c @@ -439,6 +439,66 @@ return res; } +static inline bool handle_attr(struct gsm_bts *bts, enum bts_attribute id, uint8_t *val, uint8_t len) +{ + switch (id) { + case BTS_TYPE_VARIANT: + LOGP(DNM, LOGL_ERROR, "BTS reported variant: %s\n", val); + break; + case BTS_SUB_MODEL: + LOGP(DNM, LOGL_ERROR, "BTS reported submodel: %s\n", val); + break; + default: + return false; + } + return true; +} + +static int abis_nm_rx_get_attr_resp(struct msgb *mb, struct gsm_bts *bts) +{ + struct abis_om_hdr *oh = msgb_l2(mb); + struct abis_om_fom_hdr *foh = msgb_l3(mb); + struct e1inp_sign_link *sign_link = mb->dst; + struct tlv_parsed tp; + const uint8_t *ari; + uint8_t count, i; + uint16_t ari_len; + int rc; + struct abis_nm_sw_desc sw_descr[5]; + + abis_nm_debugp_foh(DNM, foh); + + DEBUGPC(DNM, "Get Attributes Response\n"); + + abis_nm_tlv_parse(&tp, sign_link->trx->bts, foh->data, oh->length-sizeof(*foh)); + + if (!TLVP_PRESENT(&tp, NM_ATT_GET_ARI)) { + LOGP(DNM, LOGL_ERROR, "Get Attributes Response without Response Info?!\n"); + return -EINVAL; + } + + ari = TLVP_VAL(&tp, NM_ATT_GET_ARI); + ari_len = TLVP_LEN(&tp, NM_ATT_GET_ARI); + count = ari[0]; + DEBUGP(DNM, "Found Get Attributes Response Info: %u bytes total with %u unreported attributes\n", + ari_len, count); + + for (i = 0; i < count; i++) + LOGP(DNM, LOGL_ERROR, "Attribute %s is unreported\n", get_value_string(abis_nm_att_names, ari[i + 1])); + + rc = abis_nm_get_sw_conf(ari + count + 1, ari_len - (count + 2), &sw_descr[0], ARRAY_SIZE(sw_descr)); + if (rc) { + for (i = 0; i < rc; i++) { + if (!handle_attr(bts, str2btsattr((const char *)sw_descr[i].file_id), sw_descr[i].file_version, + sw_descr[i].file_version_len)) + LOGP(DNM, LOGL_NOTICE, "ARI reported sw[%d/%d]: %s is %s\n", + i, rc, sw_descr[i].file_id, sw_descr[i].file_version); + } + } + + return 0; +} + static int abis_nm_rx_sw_act_req(struct msgb *mb) { struct abis_om_hdr *oh = msgb_l2(mb); @@ -447,7 +507,7 @@ struct tlv_parsed tp; const uint8_t *sw_config; int ret, sw_config_len, len; - struct abis_nm_sw_desc sw_descr[5]; + struct abis_nm_sw_desc sw_descr[MAX_BTS_ATTR]; abis_nm_debugp_foh(DNM, foh); @@ -649,6 +709,9 @@ osmo_signal_dispatch(SS_NM, S_NM_IPACC_RESTART_NACK, NULL); break; case NM_MT_SET_BTS_ATTR_ACK: + break; + case NM_MT_GET_ATTR_RESP: + ret = abis_nm_rx_get_attr_resp(mb, bts); break; default: abis_nm_debugp_foh(DNM, foh); @@ -1441,10 +1504,9 @@ } #endif -/* Chapter 8.11.1 */ -int abis_nm_get_attr(struct gsm_bts *bts, uint8_t obj_class, - uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr, - uint8_t *attr, uint8_t attr_len) +/* 3GPP TS 52.021 § 8.11.1 */ +int abis_nm_get_attr(struct gsm_bts *bts, uint8_t obj_class, uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr, + const uint8_t *attr, uint8_t attr_len) { struct abis_om_hdr *oh; struct msgb *msg = nm_msgb_alloc(); @@ -1452,8 +1514,7 @@ DEBUGP(DNM, "Get Attr (bts=%d)\n", bts->nr); oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_FOM_HDR_SIZE); - fill_om_fom_hdr(oh, attr_len, NM_MT_GET_ATTR, obj_class, - bts_nr, trx_nr, ts_nr); + fill_om_fom_hdr(oh, attr_len, NM_MT_GET_ATTR, obj_class, bts_nr, trx_nr, ts_nr); msgb_tl16v_put(msg, NM_ATT_LIST_REQ_ATTR, attr_len, attr); return abis_nm_sendmsg(bts, msg); diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 521fc89..a5c347f 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -310,6 +310,10 @@ struct input_signal_data *isd = signal_data; struct gsm_bts_trx *trx = isd->trx; int ts_no, lchan_no; + const uint8_t attr[] = { NM_ATT_SW_CONFIG, }; + + /* we should not request more attributes than we're ready to handle */ + OSMO_ASSERT(sizeof(attr) < MAX_BTS_ATTR); if (subsys != SS_L_INPUT) return -EINVAL; @@ -333,6 +337,8 @@ for (i = 0; i < ARRAY_SIZE(cur_trx->ts); i++) generate_ma_for_ts(&cur_trx->ts[i]); } + + abis_nm_get_attr(trx->bts, NM_OC_SITE_MANAGER, trx->bts->nr, trx->nr, 0, attr, sizeof(attr)); } if (isd->link_type == E1INP_SIGN_RSL) bootstrap_rsl(trx); -- To view, visit https://gerrit.osmocom.org/2544 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I589be51daca0cb9e1f3473b93e910e46b06e23ae Gerrit-PatchSet: 1 Gerrit-Project: openbsc Gerrit-Branch: master Gerrit-Owner: Max <msuraev at sysmocom.de>