]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: implement the 'version-skew' notification
authorEmanuele Di Pascale <emanuele@voltanet.io>
Wed, 14 Nov 2018 14:30:46 +0000 (15:30 +0100)
committerEmanuele Di Pascale <emanuele@voltanet.io>
Tue, 18 Dec 2018 14:24:46 +0000 (15:24 +0100)
Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
isisd/isis_northbound.c
isisd/isis_pdu.c
isisd/isisd.h

index c6cc8515d95798aa4d54cb781a4004dfdb2ccbee..593f5be054fb64199a2fea942e447bea97f40b48 100644 (file)
@@ -2838,6 +2838,31 @@ void isis_notif_id_len_mismatch(const struct isis_circuit *circuit,
        nb_notification_send(xpath, arguments);
 }
 
+/*
+ * XPath:
+ * /frr-isisd:version-skew
+ */
+void isis_notif_version_skew(const struct isis_circuit *circuit,
+                            uint8_t version, const char *raw_pdu)
+{
+       const char *xpath = "/frr-isisd:version-skew";
+       struct list *arguments = yang_data_list_new();
+       char xpath_arg[XPATH_MAXLEN];
+       struct yang_data *data;
+       struct isis_area *area = circuit->area;
+
+       notif_prep_instance_hdr(xpath, area, "default", arguments);
+       notif_prepr_iface_hdr(xpath, circuit, arguments);
+       snprintf(xpath_arg, sizeof(xpath_arg), "%s/protocol-version", xpath);
+       data = yang_data_new_uint8(xpath_arg, version);
+       listnode_add(arguments, data);
+       snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
+       data = yang_data_new(xpath_arg, raw_pdu);
+       listnode_add(arguments, data);
+
+       nb_notification_send(xpath, arguments);
+}
+
 /* clang-format off */
 const struct frr_yang_module_info frr_isisd_info = {
        .name = "frr-isisd",
index b6586b94ab9b0c0cec9c7e52c4046e128951dbf7..219900bba0626be8cd12a6afdc3317a9fea36e54 100644 (file)
@@ -1575,6 +1575,10 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
 
        if (version1 != 1) {
                zlog_warn("Unsupported ISIS version %" PRIu8, version1);
+#ifndef FABRICD
+               /* send northbound notification */
+               isis_notif_version_skew(circuit, version1, raw_pdu);
+#endif /* ifndef FABRICD */
                return ISIS_WARNING;
        }
 
@@ -1614,6 +1618,10 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)
 
        if (version2 != 1) {
                zlog_warn("Unsupported ISIS PDU version %" PRIu8, version2);
+#ifndef FABRICD
+               /* send northbound notification */
+               isis_notif_version_skew(circuit, version2, raw_pdu);
+#endif /* ifndef FABRICD */
                return ISIS_WARNING;
        }
 
index e69023f45ee5ebef23b5a11ebd9751b9d2327693..87d2065142d44f07c8e77490f2bda3a70908fafe 100644 (file)
@@ -254,6 +254,8 @@ extern void isis_notif_lsp_gen(const struct isis_area *area, const char *lsp_id,
                               uint32_t seqno, uint32_t timestamp);
 extern void isis_notif_id_len_mismatch(const struct isis_circuit *circuit,
                                       uint8_t rcv_id_len, const char *raw_pdu);
+extern void isis_notif_version_skew(const struct isis_circuit *circuit,
+                                   uint8_t version, const char *raw_pdu);
 /* Master of threads. */
 extern struct thread_master *master;