diff options
author | Emanuele Di Pascale <emanuele@voltanet.io> | 2018-11-14 15:25:54 +0100 |
---|---|---|
committer | Emanuele Di Pascale <emanuele@voltanet.io> | 2018-12-18 15:24:46 +0100 |
commit | af6911c98cda9ccbfc48b981892929f29b53ee3b (patch) | |
tree | 5b7dd8505ddffd29995a12bbe6e7b3f3f676781f /isisd | |
parent | isisd: implement the 'adjacency-state-change' notification (diff) | |
download | frr-af6911c98cda9ccbfc48b981892929f29b53ee3b.tar.xz frr-af6911c98cda9ccbfc48b981892929f29b53ee3b.zip |
isisd: implement the 'rejected-adjacency' notification
Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
Diffstat (limited to 'isisd')
-rw-r--r-- | isisd/isis_northbound.c | 25 | ||||
-rw-r--r-- | isisd/isis_pdu.c | 46 | ||||
-rw-r--r-- | isisd/isisd.h | 3 |
3 files changed, 73 insertions, 1 deletions
diff --git a/isisd/isis_northbound.c b/isisd/isis_northbound.c index 03a775faf..ec8bd8f1d 100644 --- a/isisd/isis_northbound.c +++ b/isisd/isis_northbound.c @@ -2708,6 +2708,31 @@ void isis_notif_adj_state_change(const struct isis_adjacency *adj, nb_notification_send(xpath, arguments); } +/* + * XPath: + * /frr-isisd:rejected-adjacency + */ +void isis_notif_reject_adjacency(const struct isis_circuit *circuit, + const char *reason, const char *raw_pdu) +{ + const char *xpath = "/frr-isisd:rejected-adjacency"; + 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/reason", xpath); + data = yang_data_new_string(xpath_arg, reason); + 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", diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index c4a62a62c..49869ccba 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -583,11 +583,21 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, if (p2p_hello) { if (circuit->circ_type != CIRCUIT_T_P2P) { zlog_warn("p2p hello on non p2p circuit"); +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "p2p hello on non p2p circuit", + raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_WARNING; } } else { if (circuit->circ_type != CIRCUIT_T_BROADCAST) { zlog_warn("lan hello on non broadcast circuit"); +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "lan hello on non broadcast circuit", + raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_WARNING; } @@ -595,6 +605,12 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, zlog_debug( "level %d LAN Hello received over circuit with externalDomain = true", level); +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, + "LAN Hello received over circuit with externalDomain = true", + raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_WARNING; } @@ -605,6 +621,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, circuit->area->area_tag, circuit->interface->name); } +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "Interface level mismatch", raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_WARNING; } } @@ -630,6 +650,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, "ISIS-Adj (%s): Rcvd %s from (%s) with invalid pdu length %" PRIu16, circuit->area->area_tag, pdu_name, circuit->interface->name, iih.pdu_len); +#ifndef FABRICD + isis_notif_reject_adjacency(circuit, "Invalid PDU length", + raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_WARNING; } @@ -637,6 +661,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, flog_err(EC_ISIS_PACKET, "Level %d LAN Hello with Circuit Type %d", level, iih.circ_type); +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "LAN Hello with wrong IS-level", raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_ERROR; } @@ -646,6 +674,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, if (isis_unpack_tlvs(STREAM_READABLE(circuit->rcv_stream), circuit->rcv_stream, &iih.tlvs, &error_log)) { zlog_warn("isis_unpack_tlvs() failed: %s", error_log); +#ifndef FABRICD + isis_notif_reject_adjacency(circuit, "Failed to unpack TLVs", + raw_pdu); +#endif /* ifndef FABRICD */ goto out; } @@ -656,6 +688,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, if (!iih.tlvs->protocols_supported.count) { zlog_warn("No supported protocols TLV in %s", pdu_name); +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "No supported protocols TLV", raw_pdu); +#endif /* ifndef FABRICD */ goto out; } @@ -682,6 +718,10 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, zlog_warn( "ISIS-Adj (%s): Received IIH with own sysid - discard", circuit->area->area_tag); +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "Received IIH with our own sysid", raw_pdu); +#endif /* ifndef FABRICD */ goto out; } @@ -711,7 +751,11 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit, "ISIS-Adj (%s): Neither IPv4 nor IPv6 considered usable. Ignoring IIH", circuit->area->area_tag); } - +#ifndef FABRICD + isis_notif_reject_adjacency( + circuit, "Neither IPv4 not IPv6 considered usable", + raw_pdu); +#endif /* ifndef FABRICD */ goto out; } diff --git a/isisd/isisd.h b/isisd/isisd.h index d1547c2fa..f934d076d 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -242,6 +242,9 @@ isis_notif_authentication_failure(const struct isis_circuit *circuit, const char *raw_pdu); extern void isis_notif_adj_state_change(const struct isis_adjacency *adj, int new_state, const char *reason); +extern void isis_notif_reject_adjacency(const struct isis_circuit *circuit, + const char *reason, + const char *raw_pdu); /* Master of threads. */ extern struct thread_master *master; |