From 8375020ac65337d0ba246c884af28a7c64bba540 Mon Sep 17 00:00:00 2001 From: Emanuele Di Pascale Date: Wed, 14 Nov 2018 15:28:12 +0100 Subject: [PATCH] isisd: implement the 'lsp-received' notification Signed-off-by: Emanuele Di Pascale --- isisd/isis_northbound.c | 32 ++++++++++++++++++++++++++++++++ isisd/isis_pdu.c | 6 ++++++ isisd/isisd.h | 3 +++ 3 files changed, 41 insertions(+) diff --git a/isisd/isis_northbound.c b/isisd/isis_northbound.c index cb61c93e1..bb6b23122 100644 --- a/isisd/isis_northbound.c +++ b/isisd/isis_northbound.c @@ -2755,6 +2755,38 @@ void isis_notif_area_mismatch(const struct isis_circuit *circuit, nb_notification_send(xpath, arguments); } +/* + * XPath: + * /frr-isisd:lsp-received + */ +void isis_notif_lsp_received(const struct isis_circuit *circuit, + const char *lsp_id, uint32_t seqno, + uint32_t timestamp, const char *sys_id) +{ + const char *xpath = "/frr-isisd:lsp-received"; + 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/lsp-id", xpath); + data = yang_data_new_string(xpath_arg, lsp_id); + listnode_add(arguments, data); + snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath); + data = yang_data_new_uint32(xpath_arg, seqno); + listnode_add(arguments, data); + snprintf(xpath_arg, sizeof(xpath_arg), "%s/received-timestamp", xpath); + data = yang_data_new_uint32(xpath_arg, timestamp); + listnode_add(arguments, data); + snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath); + data = yang_data_new_string(xpath_arg, sys_id); + 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 6b8758f5f..6b3cd0319 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -844,6 +844,12 @@ static int process_lsp(uint8_t pdu_type, struct isis_circuit *circuit, hdr.checksum = stream_getw(circuit->rcv_stream); hdr.lsp_bits = stream_getc(circuit->rcv_stream); +#ifndef FABRICD + /* send northbound notification */ + isis_notif_lsp_received(circuit, rawlspid_print(hdr.lsp_id), hdr.seqno, + time(NULL), sysid_print(hdr.lsp_id)); +#endif /* ifndef FABRICD */ + if (pdu_len_validate(hdr.pdu_len, circuit)) { zlog_debug("ISIS-Upd (%s): LSP %s invalid LSP length %" PRIu16, circuit->area->area_tag, rawlspid_print(hdr.lsp_id), diff --git a/isisd/isisd.h b/isisd/isisd.h index 5169ccb28..bad930ddf 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -247,6 +247,9 @@ extern void isis_notif_reject_adjacency(const struct isis_circuit *circuit, const char *raw_pdu); extern void isis_notif_area_mismatch(const struct isis_circuit *circuit, const char *raw_pdu); +extern void isis_notif_lsp_received(const struct isis_circuit *circuit, + const char *lsp_id, uint32_t seqno, + uint32_t timestamp, const char *sys_id); /* Master of threads. */ extern struct thread_master *master; -- 2.39.2