diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h index 2ffd75db0..aed556c74 100644 --- a/include/openbsc/abis_nm.h +++ b/include/openbsc/abis_nm.h @@ -595,6 +595,8 @@ int abis_nm_bs11_get_trx_power(struct gsm_bts_trx *trx); int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on); int abis_nm_bs11_set_trx1_pw(struct gsm_bts *bts, const char *password); int abis_nm_bs11_set_pll_locked(struct gsm_bts *bts, int locked); +int abis_nm_bs11_get_pll_mode(struct gsm_bts *bts); +int abis_nm_bs11_get_cclk(struct gsm_bts *bts); int abis_nm_bs11_get_state(struct gsm_bts *bts); int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname, u_int8_t win_size, int forced, gsm_cbfn *cbfn); diff --git a/src/abis_nm.c b/src/abis_nm.c index 5fb53d72f..9820d974b 100644 --- a/src/abis_nm.c +++ b/src/abis_nm.c @@ -351,6 +351,8 @@ static const struct tlv_definition nm_att_tlvdef = { [NM_ATT_BS11_E1_STATE] = { TLV_TYPE_TLV }, [NM_ATT_BS11_PLL_MODE] = { TLV_TYPE_TLV }, [NM_ATT_BS11_PLL] = { TLV_TYPE_TLV }, + [NM_ATT_BS11_CCLK_ACCURACY] = { TLV_TYPE_TV }, + [NM_ATT_BS11_CCLK_TYPE] = { TLV_TYPE_TV }, /* ip.access specifics */ [NM_ATT_IPACC_RSL_BSC_IP] = { TLV_TYPE_FIXED, 4 }, [NM_ATT_IPACC_RSL_BSC_PORT] = { TLV_TYPE_FIXED, 2 }, @@ -1837,6 +1839,21 @@ int abis_nm_bs11_get_pll_mode(struct gsm_bts *bts) return abis_nm_sendmsg(bts, msg); } +int abis_nm_bs11_get_cclk(struct gsm_bts *bts) +{ + struct abis_om_hdr *oh; + struct msgb *msg = nm_msgb_alloc(); + u_int8_t attr[] = { NM_ATT_BS11_CCLK_ACCURACY, + NM_ATT_BS11_CCLK_TYPE }; + + oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_FOM_HDR_SIZE); + fill_om_fom_hdr(oh, 2+sizeof(attr), NM_MT_GET_ATTR, + NM_OC_BS11, BS11_OBJ_CCLK, 0x00, 0x00); + msgb_tlv_put(msg, NM_ATT_LIST_REQ_ATTR, sizeof(attr), attr); + + return abis_nm_sendmsg(bts, msg); + +} //static const u_int8_t bs11_logon_c7[] = { 0x07, 0xd9, 0x01, 0x11, 0x0d, 0x10, 0x20 }; static const u_int8_t bs11_logon_c8[] = { 0x02 }; diff --git a/src/bs11_config.c b/src/bs11_config.c index 2a25b6051..25ff0e0e6 100644 --- a/src/bs11_config.c +++ b/src/bs11_config.c @@ -306,6 +306,18 @@ static const char *pll_mode_name(u_int8_t mode) } } +static const char *cclk_acc_name(u_int8_t acc) +{ + switch (acc) { + case 0: + return "Medium"; + case 1: + return "High"; + default: + return "unknown"; + } +} + static const char *obj_name(struct abis_om_fom_hdr *foh) { static char retbuf[256]; @@ -323,6 +335,9 @@ static const char *obj_name(struct abis_om_fom_hdr *foh) case BS11_OBJ_LI: sprintf(retbuf+strlen(retbuf), "Line Interface "); break; + case BS11_OBJ_CCLK: + sprintf(retbuf+strlen(retbuf), "CCLK "); + break; } break; case NM_OC_SITE_MANAGER: @@ -403,7 +418,17 @@ static int print_attr(struct tlv_parsed *tp) printf("\tPLL Set Value=%d, Work Value=%d\n", vp[0] << 8 | vp[1], vp[2] << 8 | vp[3]); } - + if (TLVP_PRESENT(tp, NM_ATT_BS11_CCLK_ACCURACY) && + TLVP_LEN(tp, NM_ATT_BS11_CCLK_ACCURACY) >= 1) { + const u_int8_t *acc = TLVP_VAL(tp, NM_ATT_BS11_CCLK_ACCURACY); + printf("\tCCLK Accuracy: %s (%d)\n", cclk_acc_name(*acc), *acc); + } + if (TLVP_PRESENT(tp, NM_ATT_BS11_CCLK_TYPE) && + TLVP_LEN(tp, NM_ATT_BS11_CCLK_TYPE) >= 1) { + const u_int8_t *acc = TLVP_VAL(tp, NM_ATT_BS11_CCLK_TYPE); + printf("\tCCLK Type=%d\n", *acc); + } + return 0; } @@ -414,9 +439,10 @@ static void cmd_query(void) abis_nm_bs11_get_serno(g_bts); abis_nm_bs11_get_oml_tei_ts(g_bts); abis_nm_bs11_get_pll_mode(g_bts); + abis_nm_bs11_get_cclk(g_bts); abis_nm_bs11_get_trx_power(&g_bts->trx[0]); abis_nm_bs11_get_trx_power(&g_bts->trx[1]); - sleep(5); + sleep(1); abis_nm_bs11_factory_logon(g_bts, 0); command = NULL; }