]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Add log-pdu-drops log functionality
authorIsabella de Leon <ideleon@microsoft.com>
Fri, 31 Mar 2023 00:00:39 +0000 (17:00 -0700)
committerIsabella de Leon <ideleon@microsoft.com>
Tue, 4 Apr 2023 16:23:21 +0000 (09:23 -0700)
If log-pdu-drops is configured, create an INFO log that displays the PDU type and drop counts when a PDU drop is detected.

Example logs:

2023/03/30 23:54:59.749 ISIS: [VAS9N-1JNNR] PDU drop detected of type: P2P IIH. 1 Total Drops; 0 L1 IIH drops;  0 L2 IIH drops; 1 P2P IIH drops; 0 L1 LSP drops; 0 L2 LSP drops; 0 FS LSP drops; 0 L1 CSNP drops; 0 L2 CSNP drops; 0 L1 PSNP drops; 0 L2 PSNP drops.
2023/03/30 23:54:59.848 ISIS: [VAS9N-1JNNR] PDU drop detected of type: P2P IIH. 2 Total Drops; 0 L1 IIH drops;  0 L2 IIH drops; 2 P2P IIH drops; 0 L1 LSP drops; 0 L2 LSP drops; 0 FS LSP drops; 0 L1 CSNP drops; 0 L2 CSNP drops; 0 L1 PSNP drops; 0 L2 PSNP drops.

Code changes:
Add a new PDU counter function that increments the drop counter and runs the logging functionality if log-pdu-drops is configured.

Signed-off-by: Isabella de Leon <ideleon@microsoft.com>
isisd/isis_pdu.c
isisd/isis_pdu.h
isisd/isis_pdu_counter.c
isisd/isis_pdu_counter.h

index d53d43ad0ecb5cca964750097bd03acb55f2ac78..d489bb98ce47ce40c8c789996e89caf5c42d9bd3 100644 (file)
@@ -1654,14 +1654,14 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
        if (idrp == ISO9542_ESIS) {
                flog_err(EC_LIB_DEVELOPMENT,
                         "No support for ES-IS packet IDRP=%hhx", idrp);
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
        if (idrp != ISO10589_ISIS) {
                flog_err(EC_ISIS_PACKET, "Not an IS-IS packet IDRP=%hhx",
                         idrp);
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
@@ -1672,7 +1672,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                isis_notif_version_skew(circuit, version1, raw_pdu,
                                        sizeof(raw_pdu));
 #endif /* ifndef FABRICD */
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_WARNING;
        }
 
@@ -1696,14 +1696,14 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                isis_notif_id_len_mismatch(circuit, id_len, raw_pdu,
                                           sizeof(raw_pdu));
 #endif /* ifndef FABRICD */
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
        uint8_t expected_length;
        if (pdu_size(pdu_type, &expected_length)) {
                zlog_warn("Unsupported ISIS PDU %hhu", pdu_type);
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_WARNING;
        }
 
@@ -1711,7 +1711,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                flog_err(EC_ISIS_PACKET,
                         "Expected fixed header length = %hhu but got %hhu",
                         expected_length, length);
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
@@ -1719,7 +1719,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                flog_err(
                        EC_ISIS_PACKET,
                        "PDU is too short to contain fixed header of given PDU type.");
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
@@ -1730,14 +1730,14 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                isis_notif_version_skew(circuit, version2, raw_pdu,
                                        sizeof(raw_pdu));
 #endif /* ifndef FABRICD */
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_WARNING;
        }
 
        if (circuit->is_passive) {
                zlog_warn("Received ISIS PDU on passive circuit %s",
                          circuit->interface->name);
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_WARNING;
        }
 
@@ -1756,7 +1756,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                isis_notif_max_area_addr_mismatch(circuit, max_area_addrs,
                                                  raw_pdu, sizeof(raw_pdu));
 #endif /* ifndef FABRICD */
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
@@ -1765,8 +1765,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
        case L2_LAN_HELLO:
        case P2P_HELLO:
                if (fabricd && pdu_type != P2P_HELLO) {
-                       pdu_counter_count(circuit->area->pdu_drop_counters,
-                                         pdu_type);
+                       pdu_counter_count_drop(circuit->area, pdu_type);
                        return ISIS_ERROR;
                }
 
@@ -1777,8 +1776,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
        case FS_LINK_STATE:
                if (fabricd && pdu_type != L2_LINK_STATE &&
                    pdu_type != FS_LINK_STATE) {
-                       pdu_counter_count(circuit->area->pdu_drop_counters,
-                                         pdu_type);
+                       pdu_counter_count_drop(circuit->area, pdu_type);
                        return ISIS_ERROR;
                }
 
@@ -1791,12 +1789,12 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
                retval = process_snp(pdu_type, circuit, ssnpa);
                break;
        default:
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
                return ISIS_ERROR;
        }
 
        if (retval != ISIS_OK)
-               pdu_counter_count(circuit->area->pdu_drop_counters, pdu_type);
+               pdu_counter_count_drop(circuit->area, pdu_type);
 
        return retval;
 }
@@ -2554,3 +2552,37 @@ out:
                isis_tx_queue_del(circuit->tx_queue, lsp);
        }
 }
+
+void isis_log_pdu_drops(struct isis_area *area, const char *pdu_type)
+{
+       uint64_t total_drops = 0;
+
+       for (int i = 0; i < PDU_COUNTER_SIZE; i++) {
+               if (!area->pdu_drop_counters[i])
+                       continue;
+               total_drops += area->pdu_drop_counters[i];
+       }
+
+       zlog_info("PDU drop detected of type: %s. %" PRIu64
+                 " Total Drops; %" PRIu64 " L1 IIH drops;  %" PRIu64
+                 " L2 IIH drops; %" PRIu64 " P2P IIH drops; %" PRIu64
+                 " L1 LSP drops; %" PRIu64 " L2 LSP drops; %" PRIu64
+                 " FS LSP drops; %" PRIu64 " L1 CSNP drops; %" PRIu64
+                 " L2 CSNP drops; %" PRIu64 " L1 PSNP drops; %" PRIu64
+                 " L2 PSNP drops.",
+                 pdu_type, total_drops,
+                 pdu_counter_get_count(area->pdu_drop_counters, L1_LAN_HELLO),
+                 pdu_counter_get_count(area->pdu_drop_counters, L2_LAN_HELLO),
+                 pdu_counter_get_count(area->pdu_drop_counters, P2P_HELLO),
+                 pdu_counter_get_count(area->pdu_drop_counters, L1_LINK_STATE),
+                 pdu_counter_get_count(area->pdu_drop_counters, L2_LINK_STATE),
+                 pdu_counter_get_count(area->pdu_drop_counters, FS_LINK_STATE),
+                 pdu_counter_get_count(area->pdu_drop_counters,
+                                       L1_COMPLETE_SEQ_NUM),
+                 pdu_counter_get_count(area->pdu_drop_counters,
+                                       L2_COMPLETE_SEQ_NUM),
+                 pdu_counter_get_count(area->pdu_drop_counters,
+                                       L1_PARTIAL_SEQ_NUM),
+                 pdu_counter_get_count(area->pdu_drop_counters,
+                                       L2_PARTIAL_SEQ_NUM));
+}
index ccd89a70f1b0676c74b761bfa7cfd1300ed590d7..5303c61d38a273ea39bfadcb5ef000dce5ea3b7d 100644 (file)
@@ -206,4 +206,6 @@ void send_lsp(struct isis_circuit *circuit,
 void fill_fixed_hdr(uint8_t pdu_type, struct stream *stream);
 int send_hello(struct isis_circuit *circuit, int level);
 int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa);
+void isis_log_pdu_drops(struct isis_area *area, const char *pdu_type);
+
 #endif /* _ZEBRA_ISIS_PDU_H */
index 9d07b5e5989d3017296a93b38a59ae357f6683b0..a3605a32a16234db97ea524d474844565379a6f3 100644 (file)
@@ -8,10 +8,10 @@
 
 #include "vty.h"
 
-#include "isisd/isis_pdu_counter.h"
 #include "isisd/isisd.h"
 #include "isisd/isis_circuit.h"
 #include "isisd/isis_pdu.h"
+#include "isisd/isis_pdu_counter.h"
 
 static int pdu_type_to_counter_index(uint8_t pdu_type)
 {
@@ -91,3 +91,23 @@ void pdu_counter_print(struct vty *vty, const char *prefix,
                        pdu_counter_index_to_name(i), counter[i]);
        }
 }
+
+void pdu_counter_count_drop(struct isis_area *area, uint8_t pdu_type)
+{
+       pdu_counter_count(area->pdu_drop_counters, pdu_type);
+
+       if (area->log_pdu_drops) {
+               isis_log_pdu_drops(
+                       area, pdu_counter_index_to_name(
+                                     pdu_type_to_counter_index(pdu_type)));
+       }
+}
+
+uint64_t pdu_counter_get_count(pdu_counter_t counter, uint8_t pdu_type)
+{
+       int index = pdu_type_to_counter_index(pdu_type);
+
+       if (index < 0)
+               return -1;
+       return counter[index];
+}
index c53c47368f46af0224ec346df9331e7e40474612..5c35b4fb51daf27cc7b0cd072f169b1bf02675cb 100644 (file)
@@ -24,5 +24,7 @@ typedef uint64_t pdu_counter_t[PDU_COUNTER_SIZE];
 void pdu_counter_print(struct vty *vty, const char *prefix,
                       pdu_counter_t counter);
 void pdu_counter_count(pdu_counter_t counter, uint8_t pdu_type);
+void pdu_counter_count_drop(struct isis_area *area, uint8_t pdu_type);
+uint64_t pdu_counter_get_count(pdu_counter_t counter, uint8_t pdu_type);
 
 #endif