From e98d76337633e58dff2136d930217d83a98e1ee8 Mon Sep 17 00:00:00 2001 From: Emanuele Di Pascale Date: Wed, 14 Nov 2018 15:29:55 +0100 Subject: [PATCH] isisd: implement the 'id-len-mismatch' notification Signed-off-by: Emanuele Di Pascale --- isisd/isis_northbound.c | 25 +++++++++++++++++++++++++ isisd/isis_pdu.c | 4 ++++ isisd/isisd.h | 2 ++ 3 files changed, 31 insertions(+) diff --git a/isisd/isis_northbound.c b/isisd/isis_northbound.c index ca694a95a..c6cc8515d 100644 --- a/isisd/isis_northbound.c +++ b/isisd/isis_northbound.c @@ -2813,6 +2813,31 @@ void isis_notif_lsp_gen(const struct isis_area *area, const char *lsp_id, nb_notification_send(xpath, arguments); } +/* + * XPath: + * /frr-isisd:id-len-mismatch + */ +void isis_notif_id_len_mismatch(const struct isis_circuit *circuit, + uint8_t rcv_id_len, const char *raw_pdu) +{ + const char *xpath = "/frr-isisd:id-len-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/pdu-field-len", xpath); + data = yang_data_new_uint8(xpath_arg, rcv_id_len); + 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 6b3cd0319..b6586b94a 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -1584,6 +1584,10 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa) "IDFieldLengthMismatch: ID Length field in a received PDU %" PRIu8 ", while the parameter for this IS is %u", id_len, ISIS_SYS_ID_LEN); +#ifndef FABRICD + /* send northbound notification */ + isis_notif_id_len_mismatch(circuit, id_len, raw_pdu); +#endif /* ifndef FABRICD */ return ISIS_ERROR; } diff --git a/isisd/isisd.h b/isisd/isisd.h index 96db44b63..e69023f45 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -252,6 +252,8 @@ extern void isis_notif_lsp_received(const struct isis_circuit *circuit, uint32_t timestamp, const char *sys_id); 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); /* Master of threads. */ extern struct thread_master *master; -- 2.39.2