diff options
-rw-r--r-- | include/openbsc/abis_nm.h | 7 | ||||
-rw-r--r-- | src/abis_nm.c | 14 | ||||
-rw-r--r-- | src/bs11_config.c | 80 |
3 files changed, 67 insertions, 34 deletions
diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h index 749f025c7..a28905c18 100644 --- a/include/openbsc/abis_nm.h +++ b/include/openbsc/abis_nm.h @@ -25,6 +25,8 @@ #include <sys/types.h> +#include <openbsc/tlv.h> + /* PRIVATE */ /* generic header in front of every OML message according to TS 08.59 */ @@ -371,6 +373,8 @@ enum abis_nm_attr { NM_ATT_BS11_RADIO_MEAS_GRAN = 0xdc, /* in SACCH multiframes */ NM_ATT_BS11_RADIO_MEAS_REP = 0xdd, + NM_ATT_BS11_BTS_STATE = 0xf0, + NM_ATT_BS11_E1_STATE = 0xf1, NM_ATT_BS11_PLL = 0xf2, NM_ATT_BS11_RX_OFFSET = 0xf3, NM_ATT_BS11_ANT_TYPE = 0xf4, @@ -497,9 +501,8 @@ struct abis_nm_cfg { }; extern int abis_nm_rcvmsg(struct msgb *msg); -//extern struct abis_nm_h *abis_nm_init(struct abis_nm_cfg *cfg); -//extern void abis_nm_fini(struct abis_nm_h *nmh); +int abis_nm_tlv_parse(struct tlv_parsed *tp, const u_int8_t *buf, int len); int abis_nm_rx(struct msgb *msg); int abis_nm_opstart(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0, u_int8_t i1, u_int8_t i2); int abis_nm_chg_adm_state(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0, diff --git a/src/abis_nm.c b/src/abis_nm.c index 33fc0bfbc..9793dc4cd 100644 --- a/src/abis_nm.c +++ b/src/abis_nm.c @@ -217,6 +217,8 @@ static const struct tlv_definition nm_att_tlvdef = { [NM_ATT_BS11_LMT_LOGIN_TIME] = { TLV_TYPE_TLV }, [NM_ATT_BS11_LMT_USER_ACC_LEV] ={ TLV_TYPE_TLV }, [NM_ATT_BS11_LMT_USER_NAME] = { TLV_TYPE_TLV }, + [NM_ATT_BS11_BTS_STATE] = { TLV_TYPE_TLV }, + [NM_ATT_BS11_E1_STATE] = { TLV_TYPE_TLV }, /* ip.access specifics */ [NM_ATT_IPACC_RSL_BSC_IP] = { TLV_TYPE_FIXED, 4 }, [NM_ATT_IPACC_RSL_BSC_PORT] = { TLV_TYPE_FIXED, 2 }, @@ -224,7 +226,11 @@ static const struct tlv_definition nm_att_tlvdef = { }, }; -#define nm_tlv_parse(dec, buf, len) tlv_parse(dec, &nm_att_tlvdef, buf, len) + +int abis_nm_tlv_parse(struct tlv_parsed *tp, const u_int8_t *buf, int len) +{ + return tlv_parse(tp, &nm_att_tlvdef, buf, len); +} static int is_in_arr(enum abis_nm_msgtype mt, const enum abis_nm_msgtype *arr, int size) { @@ -462,7 +468,7 @@ static int abis_nm_rx_statechg_rep(struct msgb *mb) new_state = *nm_state; - nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); + abis_nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); if (TLVP_PRESENT(&tp, NM_ATT_OPER_STATE)) { new_state.operational = *TLVP_VAL(&tp, NM_ATT_OPER_STATE); DEBUGPC(DNM, "OP_STATE=%s ", opstate_name(new_state.operational)); @@ -584,7 +590,7 @@ static int abis_nm_rx_chg_adm_state_ack(struct msgb *mb) struct tlv_parsed tp; u_int8_t adm_state; - nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); + abis_nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); if (!TLVP_PRESENT(&tp, NM_ATT_ADM_STATE)) return -EINVAL; @@ -1858,7 +1864,7 @@ static int abis_nm_rx_ipacc(struct msgb *msg) } foh = (struct abis_om_fom_hdr *) oh->data + 1 + idstrlen; - nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); + abis_nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); switch (foh->msg_type) { case NM_MT_IPACC_RSL_CONNECT_ACK: diff --git a/src/bs11_config.c b/src/bs11_config.c index e623ade16..bddd1f2fd 100644 --- a/src/bs11_config.c +++ b/src/bs11_config.c @@ -164,12 +164,10 @@ static int swload_cbfn(unsigned int hook, unsigned int event, struct msgb *msg, break; case NM_MT_LOAD_END_ACK: if (data) { - /* we did a SWL load and must activate it */ + /* we did a safety load and must activate it */ abis_nm_software_activate(g_bts, fname_safety, swload_cbfn, g_bts); - } else { - /* we did a safety load and have to wait */ - sleep(10); + sleep(5); } break; case NM_MT_LOAD_END_NACK: @@ -225,49 +223,67 @@ static const char *mbccu_load_name(u_int8_t linkstate) return mbccu_load[linkstate]; } - -static void print_state(struct abis_nm_bs11_state *st) +static const char *bts_phase_name(u_int8_t phase) { - enum abis_bs11_phase phase = st->phase; - - printf("Abis-link: %-9s MBCCU0: %-11s MBCCU1: %-11s PHASE: %u ", - linkstate_name(st->abis_link & 0xf), - mbccu_load_name(st->mbccu & 0xf), mbccu_load_name(st->mbccu >> 4), - phase & 0xf); - switch (phase) { case BS11_STATE_WARM_UP: case BS11_STATE_WARM_UP_2: - printf("Warm Up...\n"); + return "Warm Up"; break; case BS11_STATE_LOAD_SMU_SAFETY: - printf("Load SMU Safety...\n"); + return "Load SMU Safety"; break; case BS11_STATE_LOAD_SMU_INTENDED: - printf("Load SMU Intended...\n"); + return "Load SMU Intended"; break; case BS11_STATE_LOAD_MBCCU: - printf("Load MBCCU...\n"); + return "Load MBCCU"; break; case BS11_STATE_SOFTWARE_RQD: - printf("Software required...\n"); + return "Software required"; break; case BS11_STATE_WAIT_MIN_CFG: case BS11_STATE_WAIT_MIN_CFG_2: - printf("Wait minimal config...\n"); + return "Wait minimal config"; break; case BS11_STATE_MAINTENANCE: - printf("Maintenance...\n"); + return "Maintenance"; break; case BS11_STATE_NORMAL: - printf("Normal...\n"); + return "Normal"; + break; + case BS11_STATE_ABIS_LOAD: + return "Abis load"; break; default: - printf("Unknown phase 0x%02x\n", phase); + return "Unknown"; break; } } +static void print_state(struct tlv_parsed *tp) +{ + if (TLVP_PRESENT(tp, NM_ATT_BS11_BTS_STATE)) { + u_int8_t phase, mbccu; + if (TLVP_LEN(tp, NM_ATT_BS11_BTS_STATE) >= 1) { + phase = *TLVP_VAL(tp, NM_ATT_BS11_BTS_STATE); + printf("PHASE: %u %-20s ", phase & 0xf, + bts_phase_name(phase)); + } + if (TLVP_LEN(tp, NM_ATT_BS11_BTS_STATE) >= 2) { + mbccu = *(TLVP_VAL(tp, NM_ATT_BS11_BTS_STATE)+1); + printf("MBCCU0: %-11s MBCCU1: %-11s ", + mbccu_load_name(mbccu & 0xf), mbccu_load_name(mbccu >> 4)); + } + } + if (TLVP_PRESENT(tp, NM_ATT_BS11_E1_STATE) && + TLVP_LEN(tp, NM_ATT_BS11_E1_STATE) >= 1) { + u_int8_t e1_state = *TLVP_VAL(tp, NM_ATT_BS11_E1_STATE); + printf("Abis-link: %-9s ", linkstate_name(e1_state & 0xf)); + } + printf("\n"); +} + /* handle a response from the BTS to a GET STATE command */ static int handle_state_resp(enum abis_bs11_phase state) { @@ -332,7 +348,7 @@ int handle_serial_msg(struct msgb *rx_msg) { struct abis_om_hdr *oh; struct abis_om_fom_hdr *foh; - struct abis_nm_bs11_state *st; + struct tlv_parsed tp; int rc = -1; #if 0 @@ -363,9 +379,11 @@ int handle_serial_msg(struct msgb *rx_msg) exit(0); break; case NM_MT_BS11_GET_STATE_ACK: - st = (struct abis_nm_bs11_state *) &foh->data[0]; - print_state(st); - rc = handle_state_resp(st->phase); + abis_nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); + print_state(&tp); + if (TLVP_PRESENT(&tp, NM_ATT_BS11_BTS_STATE) && + TLVP_LEN(&tp, NM_ATT_BS11_BTS_STATE) >= 1) + rc = handle_state_resp(*TLVP_VAL(&tp, NM_ATT_BS11_BTS_STATE)); break; default: rc = abis_nm_rcvmsg(rx_msg); @@ -391,6 +409,12 @@ int handle_serial_msg(struct msgb *rx_msg) return rc; } +int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj, + struct gsm_nm_state *old_state, struct gsm_nm_state *new_state) +{ + return 0; +} + static void print_banner(void) { printf("bs11_config (C) 2009 by Harald Welte and Dieter Spaar\n"); @@ -428,7 +452,7 @@ static void handle_options(int argc, char **argv) { "restart", 0, 0, 'r' }, }; - c = getopt_long(argc, argv, "hp:s:S:td:Dw:fr", + c = getopt_long(argc, argv, "hp:s:S:td:Dw:fra:", long_options, &option_index); if (c == -1) @@ -492,7 +516,7 @@ int main(int argc, char **argv) handle_options(argc, argv); - gsmnet = gsm_network_init(1, 1, 1); + gsmnet = gsm_network_init(1, 1, 1, GSM_BTS_TYPE_BS11); if (!gsmnet) { fprintf(stderr, "Unable to allocate gsm network\n"); exit(1); |