Review at  https://gerrit.osmocom.org/2085

Handle PCU version received viam OML alert

Explicitly check for and log PCU version received from BTS via OML alert
message.

Change-Id: I3c88663d4e2887a4038b4c3f1387128295b8934e
Related: OS#1614
---
M openbsc/src/libbsc/abis_nm.c
1 file changed, 54 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/85/2085/1

diff --git a/openbsc/src/libbsc/abis_nm.c b/openbsc/src/libbsc/abis_nm.c
index 8b0eec2..47e72dd 100644
--- a/openbsc/src/libbsc/abis_nm.c
+++ b/openbsc/src/libbsc/abis_nm.c
@@ -273,43 +273,71 @@
        return 0;
 }
 
-static int rx_fail_evt_rep(struct msgb *mb)
+static int rx_fail_evt_rep(struct msgb *mb, struct gsm_bts *bts)
 {
        struct abis_om_hdr *oh = msgb_l2(mb);
        struct abis_om_fom_hdr *foh = msgb_l3(mb);
        struct e1inp_sign_link *sign_link = mb->dst;
        struct tlv_parsed tp;
-       const uint8_t *p_val;
-       char *p_text;
+       const uint8_t *p_val = NULL;
+       enum abis_mm_event_causes c;
+       char *p_text = NULL;
 
-       LOGPC(DNM, LOGL_ERROR, "Failure Event Report: ");
+       abis_nm_tlv_parse(&tp, sign_link->trx->bts, foh->data,
+                         oh->length-sizeof(*foh));
 
-       abis_nm_tlv_parse(&tp, sign_link->trx->bts, foh->data, 
oh->length-sizeof(*foh));
+       if (TLVP_PRESENT(&tp, NM_ATT_ADD_TEXT)) {
+               p_val = TLVP_VAL(&tp, NM_ATT_ADD_TEXT);
+               p_text = talloc_strndup(tall_bsc_ctx, (const char *) p_val,
+                                       TLVP_LEN(&tp, NM_ATT_ADD_TEXT));
+       }
 
+       if (TLVP_PRESENT(&tp, NM_ATT_PROB_CAUSE)) {
+               p_val = TLVP_VAL(&tp, NM_ATT_PROB_CAUSE);
+               if (p_val[0] == NM_PCAUSE_T_MANUF) {
+                       c = osmo_load16be(p_val + 1);
+                       if (c == OSMO_EVT_PCU_VERS) {
+                               if (p_text) {
+                                       LOGPC(DNM, LOGL_NOTICE,
+                                             "BTS%u reported PCU version %s\n",
+                                             bts->nr, p_text);
+                                       return 0;
+                               } else {
+                                       LOGPC(DNM, LOGL_ERROR,
+                                             "BTS%u sent %s without actual "
+                                             "version string.\n",
+                                             bts->nr,
+                                             
get_value_string(abis_mm_event_cause_names,
+                                                              c));
+                                       return -EINVAL;
+                               }
+                       }
+               }
+       } else {
+               LOGPC(DNM, LOGL_ERROR, "BTS%u: Failure Event Report without "
+                     "Probable Cause?!\n", bts->nr);
+               return -EINVAL;
+       }
+
+       LOGPC(DNM, LOGL_ERROR, "BTS%u: Failure Event Report: ", bts->nr);
        if (TLVP_PRESENT(&tp, NM_ATT_EVENT_TYPE))
                LOGPC(DNM, LOGL_ERROR, "Type=%s, ",
                      abis_nm_event_type_name(*TLVP_VAL(&tp, 
NM_ATT_EVENT_TYPE)));
        if (TLVP_PRESENT(&tp, NM_ATT_SEVERITY))
                LOGPC(DNM, LOGL_ERROR, "Severity=%s, ",
                      abis_nm_severity_name(*TLVP_VAL(&tp, NM_ATT_SEVERITY)));
-       if (TLVP_PRESENT(&tp, NM_ATT_PROB_CAUSE)) {
-               p_val = TLVP_VAL(&tp, NM_ATT_PROB_CAUSE);
-               LOGPC(DNM, LOGL_ERROR, "Probable cause=%s: ",
-                     get_value_string(abis_nm_pcause_type_names, p_val[0]));
-               if (p_val[0] == NM_PCAUSE_T_MANUF)
-                       LOGPC(DNM, LOGL_ERROR, "%s, ",
-                             get_value_string(abis_mm_event_cause_names,
-                                              osmo_load16be(p_val + 1)));
-               else
-                       LOGPC(DNM, LOGL_ERROR, "%02X %02X ", p_val[1], 
p_val[2]);
-       }
-       if (TLVP_PRESENT(&tp, NM_ATT_ADD_TEXT)) {
-               p_val = TLVP_VAL(&tp, NM_ATT_ADD_TEXT);
-               p_text = talloc_strndup(tall_bsc_ctx, (const char *) p_val, 
TLVP_LEN(&tp, NM_ATT_ADD_TEXT));
-               if (p_text) {
-                       LOGPC(DNM, LOGL_ERROR, "Additional Text=%s. ", p_text);
-                       talloc_free(p_text);
-               }
+
+       LOGPC(DNM, LOGL_ERROR, "Probable cause=%s: ",
+             get_value_string(abis_nm_pcause_type_names, p_val[0]));
+       if (p_val[0] == NM_PCAUSE_T_MANUF)
+               LOGPC(DNM, LOGL_ERROR, "%s, ",
+                     get_value_string(abis_mm_event_cause_names, c));
+       else
+               LOGPC(DNM, LOGL_ERROR, "%02X %02X ", p_val[1], p_val[2]);
+
+       if (p_text) {
+               LOGPC(DNM, LOGL_ERROR, "Additional Text=%s. ", p_text);
+               talloc_free(p_text);
        }
 
        LOGPC(DNM, LOGL_ERROR, "\n");
@@ -317,7 +345,7 @@
        return 0;
 }
 
-static int abis_nm_rcvmsg_report(struct msgb *mb)
+static int abis_nm_rcvmsg_report(struct msgb *mb, struct gsm_bts *bts)
 {
        struct abis_om_fom_hdr *foh = msgb_l3(mb);
        uint8_t mt = foh->msg_type;
@@ -335,7 +363,7 @@
                osmo_signal_dispatch(SS_NM, S_NM_SW_ACTIV_REP, mb);
                break;
        case NM_MT_FAILURE_EVENT_REP:
-               rx_fail_evt_rep(mb);
+               rx_fail_evt_rep(mb, bts);
                osmo_signal_dispatch(SS_NM, S_NM_FAIL_REP, mb);
                break;
        case NM_MT_TEST_REP:
@@ -580,7 +608,7 @@
 
        /* check for unsolicited message */
        if (is_report(mt))
-               return abis_nm_rcvmsg_report(mb);
+               return abis_nm_rcvmsg_report(mb, bts);
 
        if (is_in_arr(mt, abis_nm_sw_load_msgs, 
ARRAY_SIZE(abis_nm_sw_load_msgs)))
                return abis_nm_rcvmsg_sw(mb);

-- 
To view, visit https://gerrit.osmocom.org/2085
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3c88663d4e2887a4038b4c3f1387128295b8934e
Gerrit-PatchSet: 1
Gerrit-Project: openbsc
Gerrit-Branch: master
Gerrit-Owner: Max <msur...@sysmocom.de>

Reply via email to