diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h index 6f0e04131..3aac31f3a 100644 --- a/include/openbsc/abis_nm.h +++ b/include/openbsc/abis_nm.h @@ -223,6 +223,11 @@ enum abis_nm_msgtype_ipacc { NM_MT_IPACC_GET_NVATTR_NACK, }; +enum abis_nm_bs11_cell_alloc { + NM_BS11_CANR_GSM = 0x00, + NM_BS11_CANR_DCS1800 = 0x01, +}; + /* Section 9.2: Object Class */ enum abis_nm_obj_class { NM_OC_SITE_MANAGER = 0x00, @@ -231,13 +236,13 @@ enum abis_nm_obj_class { NM_OC_CHANNEL, NM_OC_BASEB_TRANSC, /* RFU: 05-FE */ - NM_OC_BS11_A0 = 0xa0, + NM_OC_BS11_ADJC = 0xa0, NM_OC_BS11_HANDOVER = 0xa1, NM_OC_BS11_PWR_CTRL = 0xa2, - NM_OC_BS11_A3 = 0xa3, - NM_OC_BS11_A4 = 0xa4, - NM_OC_BS11 = 0xa5, - NM_OC_BS11_A6 = 0xa6, + NM_OC_BS11_BTSE = 0xa3, /* LMT? */ + NM_OC_BS11_RACK = 0xa4, + NM_OC_BS11 = 0xa5, /* 01: ALCO */ + NM_OC_BS11_TEST = 0xa6, NM_OC_BS11_ENVABTSE = 0xa8, NM_OC_BS11_BPORT = 0xa9, @@ -495,7 +500,7 @@ struct abis_nm_channel { u_int8_t subslot; } __attribute__ ((packed)); -/* Siemens BS-11 specific */ +/* Siemens BS-11 specific objects in the SienemsHW (0xA5) object class */ enum abis_bs11_objtype { BS11_OBJ_ALCO = 0x01, BS11_OBJ_BBSIG = 0x02, /* obj_class: 0,1 */ diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h index 2c0526014..145e406f9 100644 --- a/include/openbsc/gsm_data.h +++ b/include/openbsc/gsm_data.h @@ -303,10 +303,21 @@ struct gsm_bts { } site_mgr; /* ip.accesss Unit ID's have Site/BTS/TRX layout */ - struct { - u_int16_t site_id; - u_int16_t bts_id; - } ip_access; + union { + struct { + u_int16_t site_id; + u_int16_t bts_id; + } ip_access; + struct { + struct { + struct gsm_nm_state nm_state; + } cclk; + struct { + struct gsm_nm_state nm_state; + } rack; + + } bs11; + }; /* transceivers */ int num_trx; diff --git a/src/abis_nm.c b/src/abis_nm.c index 0107c294e..57d415984 100644 --- a/src/abis_nm.c +++ b/src/abis_nm.c @@ -435,19 +435,46 @@ int abis_nm_sendmsg(struct gsm_bts *bts, struct msgb *msg) static int abis_nm_rcvmsg_sw(struct msgb *mb); -const char *oc_names[] = { - [NM_OC_SITE_MANAGER] = "SITE MANAGER", - [NM_OC_BTS] = "BTS", - [NM_OC_RADIO_CARRIER] = "RADIO CARRIER", - [NM_OC_BASEB_TRANSC] = "BASEBAND TRANSCEIVER", - [NM_OC_CHANNEL] = "CHANNEL", -}; - static const char *obj_class_name(u_int8_t oc) { - if (oc >= ARRAY_SIZE(oc_names)) - return "UNKNOWN"; - return oc_names[oc]; + switch (oc) { + case NM_OC_SITE_MANAGER: + return "SITE MANAGER"; + case NM_OC_BTS: + return "BTS"; + case NM_OC_RADIO_CARRIER: + return "RADIO CARRIER"; + case NM_OC_BASEB_TRANSC: + return "BASEBAND TRANSCEIVER"; + case NM_OC_CHANNEL: + return "CHANNL"; + case NM_OC_BS11_ADJC: + return "ADJC"; + case NM_OC_BS11_HANDOVER: + return "HANDOVER"; + case NM_OC_BS11_PWR_CTRL: + return "POWER CONTROL"; + case NM_OC_BS11_BTSE: + return "BTSE"; + case NM_OC_BS11_RACK: + return "RACK"; + case NM_OC_BS11_TEST: + return "TEST"; + case NM_OC_BS11_ENVABTSE: + return "ENVABTSE"; + case NM_OC_BS11_BPORT: + return "BPORT"; + case NM_OC_GPRS_NSE: + return "GPRS NSE"; + case NM_OC_GPRS_CELL: + return "GPRS CELL"; + case NM_OC_GPRS_NSVC0: + return "GPRS NSVC0"; + case NM_OC_GPRS_NSVC1: + return "GPRS NSVC1"; + } + + return "UNKNOWN"; } const char *nm_opstate_name(u_int8_t os) @@ -484,7 +511,20 @@ const char *nm_avail_name(u_int8_t avail) return "UNKNOWN"; return avail_names[avail]; } - + +const char *nm_adm_name(u_int8_t adm) +{ + switch (adm) { + case 1: + return "Locked"; + case 2: + return "Unlocked"; + case 3: + return "Shutdown"; + default: + return ""; + } +} /* obtain the gsm_nm_state data structure for a given object instance */ static struct gsm_nm_state * @@ -521,6 +561,17 @@ objclass2nmstate(struct gsm_bts *bts, u_int8_t obj_class, case NM_OC_SITE_MANAGER: nm_state = &bts->site_mgr.nm_state; break; + case NM_OC_BS11: + switch (obj_inst->bts_nr) { + case BS11_OBJ_CCLK: + nm_state = &bts->bs11.cclk.nm_state; + break; + default: + return NULL; + } + case NM_OC_BS11_RACK: + nm_state = &bts->bs11.rack.nm_state; + break; } return nm_state; } @@ -622,7 +673,7 @@ static int abis_nm_rx_statechg_rep(struct msgb *mb) } if (TLVP_PRESENT(&tp, NM_ATT_ADM_STATE)) { new_state.administrative = *TLVP_VAL(&tp, NM_ATT_ADM_STATE); - DEBUGPC(DNM, "ADM=%02x ", new_state.administrative); + DEBUGPC(DNM, "ADM=%02x ", nm_adm_name(new_state.administrative)); } DEBUGPC(DNM, "\n"); @@ -1872,7 +1923,7 @@ int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on) u_int8_t len = 3*2 + sizeof(bdt) + sizeof(bs11_logon_c8) + sizeof(bs11_logon_c9); fill_om_fom_hdr(oh, len, NM_MT_BS11_LMT_LOGON, - NM_OC_BS11_A3, 0xff, 0xff, 0xff); + NM_OC_BS11_BTSE, 0xff, 0xff, 0xff); msgb_tlv_put(msg, NM_ATT_BS11_LMT_LOGIN_TIME, sizeof(bdt), (u_int8_t *) &bdt); msgb_tlv_put(msg, NM_ATT_BS11_LMT_USER_ACC_LEV, @@ -1881,7 +1932,7 @@ int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on) sizeof(bs11_logon_c9), bs11_logon_c9); } else { fill_om_fom_hdr(oh, 0, NM_MT_BS11_LMT_LOGOFF, - NM_OC_BS11_A3, 0xff, 0xff, 0xff); + NM_OC_BS11_BTSE, 0xff, 0xff, 0xff); } return abis_nm_sendmsg(bts, msg); diff --git a/src/bs11_config.c b/src/bs11_config.c index ceb23a8e2..656feb453 100644 --- a/src/bs11_config.c +++ b/src/bs11_config.c @@ -310,8 +310,10 @@ static const char *cclk_acc_name(u_int8_t acc) { switch (acc) { case 0: + /* Out of the demanded +/- 0.05ppm */ return "Medium"; case 1: + /* Synchronized with Abis, within demanded tolerance +/- 0.05ppm */ return "High"; default: return "unknown"; diff --git a/src/bsc_hack.c b/src/bsc_hack.c index 7ac65c576..a8fd53771 100644 --- a/src/bsc_hack.c +++ b/src/bsc_hack.c @@ -157,8 +157,8 @@ unsigned char msg_2[] = NM_ATT_BS11_BTSLS_HOPPING, 0x00, NM_ATT_CCCH_L_I_P, 0x01, NM_ATT_CCCH_L_T, 0x00, - NM_ATT_BS11_CELL_ALLOC_NR, 0x00, - NM_ATT_BS11_ENA_INTERF_CLASS, 0x00, + NM_ATT_BS11_CELL_ALLOC_NR, NM_BS11_CANR_GSM, + NM_ATT_BS11_ENA_INTERF_CLASS, 0x01, NM_ATT_BS11_FACCH_QUAL, 0x06, /* interference avg. period in numbers of SACCH multifr */ NM_ATT_INTAVE_PARAM, 0x1F,