From 193fefc68322d5ed0cf7f545d1ba2f09c9c879f4 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 30 Apr 2009 15:16:27 +0000 Subject: [PATCH] functionality to set nanoBTS NVRAM attributes and to restart BTS --- include/openbsc/abis_nm.h | 20 +++++++++++++++++--- src/abis_nm.c | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h index af5ade0b1..1ed4ccedf 100644 --- a/include/openbsc/abis_nm.h +++ b/include/openbsc/abis_nm.h @@ -171,6 +171,9 @@ enum abis_nm_msgtype { NM_MT_SET_ALARM_THRES, NM_MT_SET_ALARM_THRES_ACK, NM_MT_SET_ALARM_THRES_NACK, + + NM_MT_IPACC_RESTART = 0x87, + NM_MT_IPACC_RESTART_ACK, }; enum abis_nm_msgtype_bs11 { @@ -212,8 +215,12 @@ enum abis_nm_msgtype_ipacc { NM_MT_IPACC_RSL_CONNECT = 0xe0, NM_MT_IPACC_RSL_CONNECT_ACK, NM_MT_IPACC_RSL_CONNECT_NACK, - NM_MT_IPACC_RSL_SET_NVATTR = 0xef, - NM_MT_IPACC_RSL_SET_NVATTR_ACK = 0xff, + NM_MT_IPACC_SET_NVATTR = 0xef, + NM_MT_IPACC_SET_NVATTR_ACK, + NM_MT_IPACC_SET_NVATTR_NACK, + NM_MT_IPACC_GET_NVATTR = 0xf2, + NM_MT_IPACC_GET_NVATTR_ACK, + NM_MT_IPACC_GET_NVATTR_NACK, }; /* Section 9.2: Object Class */ @@ -337,7 +344,11 @@ enum abis_nm_attr { NM_ATT_IPACC_RSL_BSC_IP = 0x80, NM_ATT_IPACC_RSL_BSC_PORT = 0x81, - NM_ATT_IPACC_PRIM_OML_IP = 0x88, + NM_ATT_IPACC_LOCATION = 0x8e, /* string describing location */ + NM_ATT_IPACC_UNIT_ID = 0x91, + NM_ATT_IPACC_UNIT_NAME = 0x93, /* default: nbts- */ + NM_ATT_IPACC_PRIM_OML_IP = 0x95, + NM_ATT_IPACC_SEC_OML_IP = 0x96, NM_ATT_BS11_RF_RES_IND_PER = 0x8f, @@ -570,6 +581,9 @@ int abis_nm_ipaccess_msg(struct gsm_bts *bts, u_int8_t msg_type, u_int8_t obj_class, u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr, u_int8_t *attr, int attr_len); +int abis_nm_ipaccess_set_nvattr(struct gsm_bts *bts, u_int8_t *attr, + int attr_len); +int abis_nm_ipaccess_restart(struct gsm_bts *bts); /* Functions calling into other code parts */ enum nm_evt { diff --git a/src/abis_nm.c b/src/abis_nm.c index 6ca179218..cee704de9 100644 --- a/src/abis_nm.c +++ b/src/abis_nm.c @@ -2010,12 +2010,14 @@ static int abis_nm_rx_ipacc(struct msgb *msg) return -EINVAL; } - foh = (struct abis_om_fom_hdr *) oh->data + 1 + idstrlen; + foh = (struct abis_om_fom_hdr *) (oh->data + 1 + idstrlen); abis_nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh)); + DEBUGP(DNM, "IPACCESS(0x%02x): ", foh->msg_type); + switch (foh->msg_type) { case NM_MT_IPACC_RSL_CONNECT_ACK: - DEBUGP(DNM, "IPACC: RSL CONNECT ACK"); + DEBUGPC(DNM, "RSL CONNECT ACK "); if (TLVP_PRESENT(&tp, NM_ATT_IPACC_RSL_BSC_IP)) DEBUGPC(DNM, "IP=%s\n", inet_ntoa(*((struct in_addr *) @@ -2026,16 +2028,27 @@ static int abis_nm_rx_ipacc(struct msgb *msg) TLVP_VAL(&tp, NM_ATT_IPACC_RSL_BSC_PORT)))); break; case NM_MT_IPACC_RSL_CONNECT_NACK: - DEBUGP(DNM, "IPACC: RSL CONNECT NACK"); + DEBUGPC(DNM, "RSL CONNECT NACK "); if (TLVP_PRESENT(&tp, NM_ATT_NACK_CAUSES)) DEBUGPC(DNM, " CAUSE=0x%02x\n", *TLVP_VAL(&tp, NM_ATT_NACK_CAUSES)); else DEBUGPC(DNM, "\n"); break; + case NM_MT_IPACC_SET_NVATTR_ACK: + DEBUGPC(DNM, "SET NVATTR ACK\n"); + /* FIXME: decode and show the actual attributes */ + break; + case NM_MT_IPACC_SET_NVATTR_NACK: + DEBUGPC(DNM, "SET NVATTR NACK\n"); + break; + default: + DEBUGPC(DNM, "unknown\n"); + break; } return 0; } +/* send an ip-access manufacturer specific message */ int abis_nm_ipaccess_msg(struct gsm_bts *bts, u_int8_t msg_type, u_int8_t obj_class, u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr, @@ -2072,3 +2085,17 @@ int abis_nm_ipaccess_msg(struct gsm_bts *bts, u_int8_t msg_type, return abis_nm_sendmsg(bts, msg); } +/* set some attributes in NVRAM */ +int abis_nm_ipaccess_set_nvattr(struct gsm_bts *bts, u_int8_t *attr, + int attr_len) +{ + return abis_nm_ipaccess_msg(bts, NM_MT_IPACC_SET_NVATTR, + NM_OC_BASEB_TRANSC, 0, 0, 0xff, attr, + attr_len); +} + +/* restart / reboot an ip.access nanoBTS */ +int abis_nm_ipaccess_restart(struct gsm_bts *bts) +{ + return __simple_cmd(bts, NM_MT_IPACC_RESTART); +}