* support BS11 specific IE types in abis_nm
* make bs11_config compile again * now that we have a proper TLV parser, use it to parse the status response on the serial port
This commit is contained in:
parent
2c38aa8dcd
commit
0313394a88
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue