]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Add isis_errors and generate custom Error Codes
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 18 Jun 2018 18:56:15 +0000 (14:56 -0400)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 14 Aug 2018 20:02:05 +0000 (20:02 +0000)
Generate appropriate error codes for ISIS.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
isisd/isis_circuit.c
isisd/isis_csm.c
isisd/isis_errors.c [new file with mode: 0644]
isisd/isis_errors.h [new file with mode: 0644]
isisd/isis_events.c
isisd/isis_lsp.c
isisd/isis_main.c
isisd/isis_pdu.c
isisd/subdir.am

index 42041a7c46770c6c0a18378b5440452651f72bca..04247e8e15de73a7138e3659406880538a070dc1 100644 (file)
@@ -57,6 +57,7 @@
 #include "isisd/isis_events.h"
 #include "isisd/isis_te.h"
 #include "isisd/isis_mt.h"
+#include "isisd/isis_errors.h"
 
 DEFINE_QOBJ_TYPE(isis_circuit)
 
@@ -566,7 +567,8 @@ int isis_circuit_up(struct isis_circuit *circuit)
                return ISIS_OK;
 
        if (circuit->area->lsp_mtu > isis_circuit_pdu_size(circuit)) {
-               zlog_err(
+               zlog_ferr(
+                       ISIS_ERR_CONFIG,
                        "Interface MTU %zu on %s is too low to support area lsp mtu %u!",
                        isis_circuit_pdu_size(circuit),
                        circuit->interface->name, circuit->area->lsp_mtu);
@@ -577,7 +579,9 @@ int isis_circuit_up(struct isis_circuit *circuit)
        if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
                circuit->circuit_id = isis_circuit_id_gen(isis, circuit->interface);
                if (!circuit->circuit_id) {
-                       zlog_err("There are already 255 broadcast circuits active!");
+                       zlog_ferr(
+                               ISIS_ERR_CONFIG,
+                               "There are already 255 broadcast circuits active!");
                        return ISIS_ERROR;
                }
 
index 10870d5c50210c222d8ea40b9107ab540b28ef9f..691d2a43f9a43b3d485ca7f2bb16ac1094be9a10 100644 (file)
@@ -47,6 +47,7 @@
 #include "isisd/isisd.h"
 #include "isisd/isis_csm.h"
 #include "isisd/isis_events.h"
+#include "isisd/isis_errors.h"
 
 extern struct isis *isis;
 
@@ -137,10 +138,12 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                case IF_UP_FROM_Z:
                        isis_circuit_if_add(circuit, (struct interface *)arg);
                        if (isis_circuit_up(circuit) != ISIS_OK) {
-                               zlog_err(
+                               zlog_ferr(
+                                       ISIS_ERR_CONFIG,
                                        "Could not bring up %s because of invalid config.",
                                        circuit->interface->name);
-                               zlog_err(
+                               zlog_ferr(
+                                       ISIS_ERR_CONFIG,
                                        "Clearing config for %s. Please re-examine it.",
                                        circuit->interface->name);
                                if (circuit->ip_router) {
diff --git a/isisd/isis_errors.c b/isisd/isis_errors.c
new file mode 100644 (file)
index 0000000..154ba2b
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * isis_errors - code for error messages that may occur in the
+ *              isis process
+ * Copyright (C) 2018 Cumulus Networks, Inc.
+ *               Donald Sharp
+ *
+ * FRR is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * FRR is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <zebra.h>
+
+#include "isis_errors.h"
+
+static struct ferr_ref ferr_isis_err[] = {
+       {
+               .code = ISIS_ERR_PACKET,
+               .title = "ISIS Packet Error",
+               .description = "Isis has detected an error with a packet from a peer",
+               .suggestion = "Gather log information and open an issue then restart FRR"
+       },
+       {
+               .code = ISIS_ERR_CONFIG,
+               .title = "ISIS Configuration Error",
+               .description = "Isis has detected an error within configuration for the router",
+               .suggestion = "Ensure configuration is correct"
+       },
+       {
+               .code = END_FERR,
+       }
+};
+
+void isis_error_init(void)
+{
+       ferr_ref_init();
+
+       ferr_ref_add(ferr_isis_err);
+}
diff --git a/isisd/isis_errors.h b/isisd/isis_errors.h
new file mode 100644 (file)
index 0000000..d92a4e4
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * isis_errors - header for error messages that may occur in the isis process
+ * Copyright (C) 2018 Cumulus Networks, Inc.
+ *               Donald Sharp
+ *
+ * FRR is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * FRR is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef __ISIS_ERRORS_H__
+#define __ISIS_ERRORS_H__
+
+#include "ferr.h"
+#include "isis_errors.h"
+
+enum isis_ferr_refs {
+       ISIS_ERR_PACKET = ISIS_FERR_START,
+       ISIS_ERR_CONFIG,
+};
+
+extern void isis_error_init(void);
+
+#endif
index 349ec262c09f4dedb05a88b8afbcd852262d9c35..ad0fbc97e397a38967f4b4c8ed492d6549fdede6 100644 (file)
@@ -48,6 +48,7 @@
 #include "isisd/isis_csm.h"
 #include "isisd/isis_events.h"
 #include "isisd/isis_spf.h"
+#include "isisd/isis_errors.h"
 
 /* debug isis-spf spf-events
  4w4d: ISIS-Spf (tlt): L2 SPF needed, new adjacency, from 0x609229F4
@@ -156,9 +157,9 @@ void isis_circuit_is_type_set(struct isis_circuit *circuit, int newtype)
                return; /* No change */
 
        if (!(newtype & circuit->area->is_type)) {
-               zlog_err(
-                       "ISIS-Evt (%s) circuit type change - invalid level %s because"
-                       " area is %s",
+               zlog_ferr(
+                       ISIS_ERR_CONFIG,
+                       "ISIS-Evt (%s) circuit type change - invalid level %s because area is %s",
                        circuit->area->area_tag, circuit_t2string(newtype),
                        circuit_t2string(circuit->area->is_type));
                return;
index 63f7776551aa05758214df9a17d8a5829155147c..14a88e9e8f69814b8606988f78a77ed7d082f1dc 100644 (file)
@@ -1244,8 +1244,9 @@ static int lsp_regenerate(struct isis_area *area, int level)
        lsp = lsp_search(lspid, lspdb);
 
        if (!lsp) {
-               zlog_err("ISIS-Upd (%s): lsp_regenerate: no L%d LSP found!",
-                        area->area_tag, level);
+               zlog_ferr(LIB_ERR_DEVELOPMENT,
+                         "ISIS-Upd (%s): lsp_regenerate: no L%d LSP found!",
+                         area->area_tag, level);
                return ISIS_ERROR;
        }
 
@@ -1612,8 +1613,9 @@ static int lsp_regenerate_pseudo(struct isis_circuit *circuit, int level)
        lsp = lsp_search(lsp_id, lspdb);
 
        if (!lsp) {
-               zlog_err("lsp_regenerate_pseudo: no l%d LSP %s found!", level,
-                        rawlspid_print(lsp_id));
+               zlog_ferr(LIB_ERR_DEVELOPMENT,
+                         "lsp_regenerate_pseudo: no l%d LSP %s found!", level,
+                         rawlspid_print(lsp_id));
                return ISIS_ERROR;
        }
 
index ec6b0922bbd325e53678a08258993483ae9f66e8..5b18ab0a2c0d3c701ea815c581fa55f177e86567 100644 (file)
@@ -53,6 +53,7 @@
 #include "isisd/isis_routemap.h"
 #include "isisd/isis_zebra.h"
 #include "isisd/isis_te.h"
+#include "isisd/isis_errors.h"
 
 /* Default configuration file name */
 #define ISISD_DEFAULT_CONFIG "isisd.conf"
@@ -189,6 +190,7 @@ int main(int argc, char **argv, char **envp)
        /*
         *  initializations
         */
+       isis_error_init();
        access_list_init();
        vrf_init(NULL, NULL, NULL, NULL);
        prefix_list_init();
index 1753ea22f6ca829f354f66702381d6c357ce01d2..c9cf87508e87a6aedfffbf4c3cb1ef15f2e55393 100644 (file)
@@ -55,6 +55,7 @@
 #include "isisd/isis_te.h"
 #include "isisd/isis_mt.h"
 #include "isisd/isis_tlvs.h"
+#include "isisd/isis_errors.h"
 
 static int ack_lsp(struct isis_lsp_hdr *hdr, struct isis_circuit *circuit,
                   int level)
@@ -87,9 +88,10 @@ static int ack_lsp(struct isis_lsp_hdr *hdr, struct isis_circuit *circuit,
 
        retval = circuit->tx(circuit, level);
        if (retval != ISIS_OK)
-               zlog_err("ISIS-Upd (%s): Send L%d LSP PSNP on %s failed",
-                        circuit->area->area_tag, level,
-                        circuit->interface->name);
+               zlog_ferr(ISIS_ERR_PACKET,
+                         "ISIS-Upd (%s): Send L%d LSP PSNP on %s failed",
+                         circuit->area->area_tag, level,
+                         circuit->interface->name);
 
        return retval;
 }
@@ -615,8 +617,9 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit,
        }
 
        if (!p2p_hello && !(level & iih.circ_type)) {
-               zlog_err("Level %d LAN Hello with Circuit Type %d", level,
-                        iih.circ_type);
+               zlog_ferr(ISIS_ERR_PACKET,
+                         "Level %d LAN Hello with Circuit Type %d", level,
+                         iih.circ_type);
                return ISIS_ERROR;
        }
 
@@ -1351,7 +1354,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
 
        /* Verify that at least the 8 bytes fixed header have been received */
        if (stream_get_endp(circuit->rcv_stream) < ISIS_FIXED_HDR_LEN) {
-               zlog_err("PDU is too short to be IS-IS.");
+               zlog_ferr(ISIS_ERR_PACKET, "PDU is too short to be IS-IS.");
                return ISIS_ERROR;
        }
 
@@ -1372,7 +1375,8 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
        }
 
        if (idrp != ISO10589_ISIS) {
-               zlog_err("Not an IS-IS packet IDRP=%" PRIx8, idrp);
+               zlog_ferr(ISIS_ERR_PACKET, "Not an IS-IS packet IDRP=%" PRIx8,
+                         idrp);
                return ISIS_ERROR;
        }
 
@@ -1382,7 +1386,8 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
        }
 
        if (id_len != 0 && id_len != ISIS_SYS_ID_LEN) {
-               zlog_err(
+               zlog_ferr(
+                       ISIS_ERR_PACKET,
                        "IDFieldLengthMismatch: ID Length field in a received PDU  %" PRIu8
                        ", while the parameter for this IS is %u",
                        id_len, ISIS_SYS_ID_LEN);
@@ -1396,14 +1401,16 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
        }
 
        if (length != expected_length) {
-               zlog_err("Exepected fixed header length = %" PRIu8
-                        " but got %" PRIu8,
-                        expected_length, length);
+               zlog_ferr(ISIS_ERR_PACKET,
+                         "Exepected fixed header length = %" PRIu8
+                         " but got %" PRIu8,
+                         expected_length, length);
                return ISIS_ERROR;
        }
 
        if (stream_get_endp(circuit->rcv_stream) < length) {
-               zlog_err(
+               zlog_ferr(
+                       ISIS_ERR_PACKET,
                        "PDU is too short to contain fixed header of given PDU type.");
                return ISIS_ERROR;
        }
@@ -1421,7 +1428,8 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
 
        /* either 3 or 0 */
        if (max_area_addrs != 0 && max_area_addrs != isis->max_area_addrs) {
-               zlog_err(
+               zlog_ferr(
+                       ISIS_ERR_PACKET,
                        "maximumAreaAddressesMismatch: maximumAreaAdresses in a received PDU %" PRIu8
                        " while the parameter for this IS is %u",
                        max_area_addrs, isis->max_area_addrs);
@@ -1645,9 +1653,10 @@ int send_hello(struct isis_circuit *circuit, int level)
 
        retval = circuit->tx(circuit, level);
        if (retval != ISIS_OK)
-               zlog_err("ISIS-Adj (%s): Send L%d IIH on %s failed",
-                        circuit->area->area_tag, level,
-                        circuit->interface->name);
+               zlog_ferr(ISIS_ERR_PACKET,
+                         "ISIS-Adj (%s): Send L%d IIH on %s failed",
+                         circuit->area->area_tag, level,
+                         circuit->interface->name);
 
        return retval;
 }
@@ -1842,9 +1851,10 @@ int send_csnp(struct isis_circuit *circuit, int level)
 
                int retval = circuit->tx(circuit, level);
                if (retval != ISIS_OK) {
-                       zlog_err("ISIS-Snp (%s): Send L%d CSNP on %s failed",
-                                circuit->area->area_tag, level,
-                                circuit->interface->name);
+                       zlog_ferr(ISIS_ERR_PACKET,
+                                 "ISIS-Snp (%s): Send L%d CSNP on %s failed",
+                                 circuit->area->area_tag, level,
+                                 circuit->interface->name);
                        isis_free_tlvs(tlvs);
                        return retval;
                }
@@ -2006,9 +2016,10 @@ static int send_psnp(int level, struct isis_circuit *circuit)
 
                int retval = circuit->tx(circuit, level);
                if (retval != ISIS_OK) {
-                       zlog_err("ISIS-Snp (%s): Send L%d PSNP on %s failed",
-                                circuit->area->area_tag, level,
-                                circuit->interface->name);
+                       zlog_ferr(ISIS_ERR_PACKET,
+                                 "ISIS-Snp (%s): Send L%d PSNP on %s failed",
+                                 circuit->area->area_tag, level,
+                                 circuit->interface->name);
                        isis_free_tlvs(tlvs);
                        return retval;
                }
@@ -2113,7 +2124,8 @@ int send_lsp(struct thread *thread)
         * than
         * the circuit's MTU. So handle and log this case here. */
        if (stream_get_endp(lsp->pdu) > stream_get_size(circuit->snd_stream)) {
-               zlog_err(
+               zlog_ferr(
+                       ISIS_ERR_PACKET,
                        "ISIS-Upd (%s): Can't send L%d LSP %s, seq 0x%08" PRIx32
                        ", cksum 0x%04" PRIx16 ", lifetime %" PRIu16
                        "s on %s. LSP Size is %zu while interface stream size is %zu.",
@@ -2148,11 +2160,12 @@ int send_lsp(struct thread *thread)
        clear_srm = 0;
        retval = circuit->tx(circuit, lsp->level);
        if (retval != ISIS_OK) {
-               zlog_err("ISIS-Upd (%s): Send L%d LSP on %s failed %s",
-                        circuit->area->area_tag, lsp->level,
-                        circuit->interface->name,
-                        (retval == ISIS_WARNING) ? "temporarily"
-                                                 : "permanently");
+               zlog_ferr(ISIS_ERR_PACKET,
+                         "ISIS-Upd (%s): Send L%d LSP on %s failed %s",
+                         circuit->area->area_tag, lsp->level,
+                         circuit->interface->name,
+                         (retval == ISIS_WARNING) ? "temporarily"
+                                                  : "permanently");
        }
 
 out:
index 7b56715fa917fa504782ecc0385106d0e181ab3c..7b8be46167cf25144d09be6cd80cf8462fe1cd6e 100644 (file)
@@ -15,6 +15,7 @@ isisd_libisis_a_SOURCES = \
        isisd/isis_csm.c \
        isisd/isis_dr.c \
        isisd/isis_dynhn.c \
+       isisd/isis_errors.c \
        isisd/isis_events.c \
        isisd/isis_flags.c \
        isisd/isis_lsp.c \
@@ -44,6 +45,7 @@ noinst_HEADERS += \
        isisd/isis_csm.h \
        isisd/isis_dr.h \
        isisd/isis_dynhn.h \
+       isisd/isis_errors.h \
        isisd/isis_events.h \
        isisd/isis_flags.h \
        isisd/isis_lsp.h \