aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-05-01 13:03:40 +0000
committerHarald Welte <laforge@gnumonks.org>2009-05-01 13:03:40 +0000
commit6c96ba5e4fb6b44292315f4b493e3553fa382e36 (patch)
tree37dab91973d9f50c23278b367e6f2c22d005938f
parentacb688bc9b15f827fe60cf2d38367a76bf3cfcfb (diff)
abis_nm: print the NACK cause in human readable form
-rw-r--r--src/abis_nm.c75
1 files changed, 71 insertions, 4 deletions
diff --git a/src/abis_nm.c b/src/abis_nm.c
index 8d57b3755..d6bfd4ecd 100644
--- a/src/abis_nm.c
+++ b/src/abis_nm.c
@@ -147,6 +147,54 @@ static const char *nack_names[0xff] = {
[NM_MT_BS11_DELETE_OBJ_NACK] = "BS11 DELETE OBJECT",
};
+/* Chapter 9.4.36 */
+static const char *nack_cause_names[] = {
+ /* General Nack Causes */
+ [NM_NACK_INCORR_STRUCT] = "Incorrect message structure",
+ [NM_NACK_MSGTYPE_INVAL] = "Invalid message type value",
+ [NM_NACK_OBJCLASS_INVAL] = "Invalid Object class value",
+ [NM_NACK_OBJCLASS_NOTSUPP] = "Object class not supported",
+ [NM_NACK_BTSNR_UNKN] = "BTS no. unknown",
+ [NM_NACK_TRXNR_UNKN] = "Baseband Transceiver no. unknown",
+ [NM_NACK_OBJINST_UNKN] = "Object Instance unknown",
+ [NM_NACK_ATTRID_INVAL] = "Invalid attribute identifier value",
+ [NM_NACK_ATTRID_NOTSUPP] = "Attribute identifier not supported",
+ [NM_NACK_PARAM_RANGE] = "Parameter value outside permitted range",
+ [NM_NACK_ATTRLIST_INCONSISTENT] = "Inconsistency in attribute list",
+ [NM_NACK_SPEC_IMPL_NOTSUPP] = "Specified implementation not supported",
+ [NM_NACK_CANT_PERFORM] = "Message cannot be performed",
+ /* Specific Nack Causes */
+ [NM_NACK_RES_NOTIMPL] = "Resource not implemented",
+ [NM_NACK_RES_NOTAVAIL] = "Resource not available",
+ [NM_NACK_FREQ_NOTAVAIL] = "Frequency not available",
+ [NM_NACK_TEST_NOTSUPP] = "Test not supported",
+ [NM_NACK_CAPACITY_RESTR] = "Capacity restrictions",
+ [NM_NACK_PHYSCFG_NOTPERFORM] = "Physical configuration cannot be performed",
+ [NM_NACK_TEST_NOTINIT] = "Test not initiated",
+ [NM_NACK_PHYSCFG_NOTRESTORE] = "Physical configuration cannot be restored",
+ [NM_NACK_TEST_NOSUCH] = "No such test",
+ [NM_NACK_TEST_NOSTOP] = "Test cannot be stopped",
+ [NM_NACK_MSGINCONSIST_PHYSCFG] = "Message inconsistent with physical configuration",
+ [NM_NACK_FILE_INCOMPLETE] = "Complete file notreceived",
+ [NM_NACK_FILE_NOTAVAIL] = "File not available at destination",
+ [MN_NACK_FILE_NOTACTIVATE] = "File cannot be activate",
+ [NM_NACK_REQ_NOT_GRANT] = "Request not granted",
+ [NM_NACK_WAIT] = "Wait",
+ [NM_NACK_NOTH_REPORT_EXIST] = "Nothing reportable existing",
+ [NM_NACK_MEAS_NOTSUPP] = "Measurement not supported",
+ [NM_NACK_MEAS_NOTSTART] = "Measurement not started",
+};
+
+static char namebuf[255];
+static const char *nack_cause_name(u_int8_t cause)
+{
+ if (cause < ARRAY_SIZE(nack_cause_names) && nack_cause_names[cause])
+ return nack_cause_names[cause];
+
+ snprintf(namebuf, sizeof(namebuf), "0x%02x\n", cause);
+ return namebuf;
+}
+
/* Attributes that the BSC can set, not only get, according to Section 9.4 */
static const enum abis_nm_attr nm_att_settable[] = {
NM_ATT_ADD_INFO,
@@ -678,6 +726,7 @@ static int abis_nm_rx_lmt_event(struct msgb *mb)
/* Receive a OML NM Message from BTS */
static int abis_nm_rcvmsg_fom(struct msgb *mb)
{
+ struct abis_om_hdr *oh = msgb_l2(mb);
struct abis_om_fom_hdr *foh = msgb_l3(mb);
u_int8_t mt = foh->msg_type;
@@ -689,10 +738,19 @@ static int abis_nm_rcvmsg_fom(struct msgb *mb)
return abis_nm_rcvmsg_sw(mb);
if (is_in_arr(mt, nacks, ARRAY_SIZE(nacks))) {
+ struct tlv_parsed tp;
if (nack_names[mt])
- DEBUGP(DNM, "%s NACK\n", nack_names[mt]);
+ DEBUGP(DNM, "%s NACK ", nack_names[mt]);
+ /* FIXME: NACK cause */
else
- DEBUGP(DNM, "NACK 0x%02x\n", mt);
+ DEBUGP(DNM, "NACK 0x%02x ", mt);
+
+ abis_nm_tlv_parse(&tp, foh->data, oh->length-sizeof(*foh));
+ if (TLVP_PRESENT(&tp, NM_ATT_NACK_CAUSES))
+ DEBUGPC(DNM, "CAUSE=%s\n",
+ nack_cause_name(*TLVP_VAL(&tp, NM_ATT_NACK_CAUSES)));
+ else
+ DEBUGPC(DNM, "\n");
}
#if 0
/* check if last message is to be acked */
@@ -1095,6 +1153,7 @@ static int abis_nm_rcvmsg_sw(struct msgb *mb)
sw->state = SW_STATE_WAIT_SEGACK;
} else {
DEBUGP(DNM, "Software Load Init NACK\n");
+ /* FIXME: cause */
if (sw->cbfn)
sw->cbfn(GSM_HOOK_NM_SWLOAD,
NM_MT_LOAD_INIT_NACK, mb,
@@ -1147,6 +1206,7 @@ static int abis_nm_rcvmsg_sw(struct msgb *mb)
sw->cb_data, NULL);
} else {
DEBUGP(DNM, "Software Load End NACK\n");
+ /* FIXME: cause */
sw->state = SW_STATE_ERROR;
if (sw->cbfn)
sw->cbfn(GSM_HOOK_NM_SWLOAD,
@@ -1169,6 +1229,7 @@ static int abis_nm_rcvmsg_sw(struct msgb *mb)
break;
case NM_MT_ACTIVATE_SW_NACK:
DEBUGP(DNM, "Activate Software NACK\n");
+ /* FIXME: cause */
sw->state = SW_STATE_ERROR;
if (sw->cbfn)
sw->cbfn(GSM_HOOK_NM_SWLOAD,
@@ -2031,7 +2092,8 @@ static int abis_nm_rx_ipacc(struct msgb *msg)
case NM_MT_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));
+ DEBUGPC(DNM, " CAUSE=%s\n",
+ nack_cause_name(*TLVP_VAL(&tp, NM_ATT_NACK_CAUSES)));
else
DEBUGPC(DNM, "\n");
break;
@@ -2040,7 +2102,12 @@ static int abis_nm_rx_ipacc(struct msgb *msg)
/* FIXME: decode and show the actual attributes */
break;
case NM_MT_IPACC_SET_NVATTR_NACK:
- DEBUGPC(DNM, "SET NVATTR NACK\n");
+ DEBUGPC(DNM, "SET NVATTR NACK ");
+ if (TLVP_PRESENT(&tp, NM_ATT_NACK_CAUSES))
+ DEBUGPC(DNM, " CAUSE=%s\n",
+ nack_cause_name(*TLVP_VAL(&tp, NM_ATT_NACK_CAUSES)));
+ else
+ DEBUGPC(DNM, "\n");
break;
default:
DEBUGPC(DNM, "unknown\n");