]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: implement the 'area-mismatch' notification
authorEmanuele Di Pascale <emanuele@voltanet.io>
Wed, 14 Nov 2018 14:27:10 +0000 (15:27 +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 ec8bd8f1d2c2344c23de808743b8b925f0248d18..cb61c93e12f5269da8dcd89441e6efaf182ca80b 100644 (file)
@@ -2733,6 +2733,28 @@ void isis_notif_reject_adjacency(const struct isis_circuit *circuit,
        nb_notification_send(xpath, arguments);
 }
 
        nb_notification_send(xpath, arguments);
 }
 
+/*
+ * XPath:
+ * /frr-isisd:area-mismatch
+ */
+void isis_notif_area_mismatch(const struct isis_circuit *circuit,
+                             const char *raw_pdu)
+{
+       const char *xpath = "/frr-isisd:area-mismatch";
+       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/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",
 /* clang-format off */
 const struct frr_yang_module_info frr_isisd_info = {
        .name = "frr-isisd",
index 49869ccbab8d369b6aa9d8b047f0f596d5438968..6b8758f5f0461865b1d5fb94f2a6d7ec7715aa7c 100644 (file)
@@ -683,6 +683,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit,
 
        if (!iih.tlvs->area_addresses.count) {
                zlog_warn("No Area addresses TLV in %s", pdu_name);
 
        if (!iih.tlvs->area_addresses.count) {
                zlog_warn("No Area addresses TLV in %s", pdu_name);
+#ifndef FABRICD
+               /* send northbound notification */
+               isis_notif_area_mismatch(circuit, raw_pdu);
+#endif /* ifndef FABRICD */
                goto out;
        }
 
                goto out;
        }
 
@@ -736,6 +740,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit,
                                circuit->area->area_tag, level,
                                circuit->interface->name);
                }
                                circuit->area->area_tag, level,
                                circuit->interface->name);
                }
+#ifndef FABRICD
+               /* send northbound notification */
+               isis_notif_area_mismatch(circuit, raw_pdu);
+#endif /* ifndef FABRICD */
                goto out;
        }
 
                goto out;
        }
 
index f934d076de5cb712bcbd40c76b94618701fcf9e9..5169ccb281734f45a9586195a6f0607c4ba0942d 100644 (file)
@@ -245,6 +245,8 @@ extern void isis_notif_adj_state_change(const struct isis_adjacency *adj,
 extern void isis_notif_reject_adjacency(const struct isis_circuit *circuit,
                                        const char *reason,
                                        const char *raw_pdu);
 extern void isis_notif_reject_adjacency(const struct isis_circuit *circuit,
                                        const char *reason,
                                        const char *raw_pdu);
+extern void isis_notif_area_mismatch(const struct isis_circuit *circuit,
+                                    const char *raw_pdu);
 /* Master of threads. */
 extern struct thread_master *master;
 
 /* Master of threads. */
 extern struct thread_master *master;