From ddb33326ff961c9328f8ff05f609f51b8a0255f5 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Fri, 16 Nov 2018 16:31:37 +0100 Subject: [PATCH] isisd: Provide better flooding debugging Show from where LSP flooding is triggered. Signed-off-by: Christian Franke --- isisd/fabricd.c | 23 +++++++++-------------- isisd/isis_lsp.c | 11 ++++++++++- isisd/isis_lsp.h | 6 +++++- isisd/isis_vty_fabricd.c | 32 -------------------------------- isisd/isisd.c | 37 ++++++++++++++++++++++++++++++++++--- isisd/isisd.h | 2 +- 6 files changed, 59 insertions(+), 52 deletions(-) diff --git a/isisd/fabricd.c b/isisd/fabricd.c index 2b3116b1ff..a9eb6da521 100644 --- a/isisd/fabricd.c +++ b/isisd/fabricd.c @@ -502,7 +502,7 @@ static void move_to_dnr(struct isis_lsp *lsp, struct neighbor_entry *n) n->present = false; - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("OpenFabric: Adding %s to DNR", vid2string(n->vertex, buff, sizeof(buff))); @@ -520,7 +520,7 @@ static void move_to_rf(struct isis_lsp *lsp, struct neighbor_entry *n) n->present = false; - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("OpenFabric: Adding %s to RF", vid2string(n->vertex, buff, sizeof(buff))); @@ -549,7 +549,7 @@ static void handle_firsthops(struct hash_backet *backet, void *arg) n = neighbor_entry_lookup_list(f->neighbors, vertex->N.id); if (n) { - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("Removing %s from NL as its in the reverse path", vid2string(vertex, buff, sizeof(buff))); @@ -559,7 +559,7 @@ static void handle_firsthops(struct hash_backet *backet, void *arg) n = neighbor_entry_lookup_hash(f->neighbors_neighbors, vertex->N.id); if (n) { - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("Removing %s from NN as its in the reverse path", vid2string(vertex, buff, sizeof(buff))); @@ -576,11 +576,6 @@ void fabricd_lsp_flood(struct isis_lsp *lsp) void *cursor = NULL; struct neighbor_entry *n; - if (isis->debugs & DEBUG_FABRICD_FLOODING) { - zlog_debug("OpenFabric: Flooding LSP %s", - rawlspid_print(lsp->hdr.lsp_id)); - } - /* Mark all elements in NL as present and move T0s into DNR */ while (!skiplist_next(f->neighbors, NULL, (void **)&n, &cursor)) { n->present = true; @@ -595,7 +590,7 @@ void fabricd_lsp_flood(struct isis_lsp *lsp) continue; } - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { zlog_debug("Moving %s to DNR because it's T0", rawlspid_print(node_lsp->hdr.lsp_id)); } @@ -623,7 +618,7 @@ void fabricd_lsp_flood(struct isis_lsp *lsp) struct isis_lsp *nlsp = lsp_for_vertex(f->spftree, n->vertex); if (!nlsp || !nlsp->tlvs) { - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("Moving %s to DNR as it has no LSP", vid2string(n->vertex, buff, sizeof(buff))); @@ -633,7 +628,7 @@ void fabricd_lsp_flood(struct isis_lsp *lsp) continue; } - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("Considering %s from NL...", vid2string(n->vertex, buff, sizeof(buff))); @@ -651,7 +646,7 @@ void fabricd_lsp_flood(struct isis_lsp *lsp) er->id); if (nn) { - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { char buff[PREFIX2STR_BUFFER]; zlog_debug("Found neighbor %s in NN, removing it from NN and setting reflood.", vid2string(nn->vertex, buff, sizeof(buff))); @@ -668,7 +663,7 @@ void fabricd_lsp_flood(struct isis_lsp *lsp) move_to_dnr(lsp, n); } - if (isis->debugs & DEBUG_FABRICD_FLOODING) { + if (isis->debugs & DEBUG_FLOODING) { zlog_debug("OpenFabric: Flooding algorithm complete."); } } diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index 9a57d0d0ac..de9c84402f 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -1997,8 +1997,17 @@ void lsp_set_all_srmflags(struct isis_lsp *lsp, bool set) } } -void lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit) +void _lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit, + const char *func, const char *file, int line) { + if (isis->debugs & DEBUG_FLOODING) { + zlog_debug("Flooding LSP %s%s%s (From %s %s:%d)", + rawlspid_print(lsp->hdr.lsp_id), + circuit ? " except on " : "", + circuit ? circuit->interface->name : "", + func, file, line); + } + if (!fabricd) lsp_set_all_srmflags(lsp, true); else diff --git a/isisd/isis_lsp.h b/isisd/isis_lsp.h index 2b45e6994c..f303c953c0 100644 --- a/isisd/isis_lsp.h +++ b/isisd/isis_lsp.h @@ -105,7 +105,11 @@ void lsp_print_detail(struct isis_lsp *lsp, struct vty *vty, char dynhost); int lsp_print_all(struct vty *vty, dict_t *lspdb, char detail, char dynhost); /* sets SRMflags for all active circuits of an lsp */ void lsp_set_all_srmflags(struct isis_lsp *lsp, bool set); -void lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit); + +#define lsp_flood(lsp, circuit) \ + _lsp_flood((lsp), (circuit), __func__, __FILE__, __LINE__) +void _lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit, + const char *func, const char *file, int line); void lsp_init(void); #endif /* ISIS_LSP */ diff --git a/isisd/isis_vty_fabricd.c b/isisd/isis_vty_fabricd.c index 95ebe0de81..5ef3af0f19 100644 --- a/isisd/isis_vty_fabricd.c +++ b/isisd/isis_vty_fabricd.c @@ -55,40 +55,8 @@ DEFUN (no_fabric_tier, return CMD_SUCCESS; } -DEFUN (debug_fabric_flooding, - debug_fabric_flooding_cmd, - "debug openfabric flooding", - DEBUG_STR - PROTO_HELP - "Flooding optimization algorithm\n") -{ - isis->debugs |= DEBUG_FABRICD_FLOODING; - print_debug(vty, DEBUG_FABRICD_FLOODING, 1); - - return CMD_SUCCESS; -} - -DEFUN (no_debug_fabric_flooding, - no_debug_fabric_flooding_cmd, - "no debug openfabric flooding", - NO_STR - UNDEBUG_STR - PROTO_HELP - "Flooding optimization algorithm\n") -{ - isis->debugs &= ~DEBUG_FABRICD_FLOODING; - print_debug(vty, DEBUG_FABRICD_FLOODING, 0); - - return CMD_SUCCESS; -} - - void isis_vty_daemon_init(void) { install_element(ROUTER_NODE, &fabric_tier_cmd); install_element(ROUTER_NODE, &no_fabric_tier_cmd); - install_element(ENABLE_NODE, &debug_fabric_flooding_cmd); - install_element(ENABLE_NODE, &no_debug_fabric_flooding_cmd); - install_element(CONFIG_NODE, &debug_fabric_flooding_cmd); - install_element(CONFIG_NODE, &no_debug_fabric_flooding_cmd); } diff --git a/isisd/isisd.c b/isisd/isisd.c index 279f7bfee1..0138f4345d 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -741,8 +741,8 @@ void print_debug(struct vty *vty, int flags, int onoff) vty_out(vty, "IS-IS LSP generation debugging is %s\n", onoffs); if (flags & DEBUG_LSP_SCHED) vty_out(vty, "IS-IS LSP scheduling debugging is %s\n", onoffs); - if (flags & DEBUG_FABRICD_FLOODING) - vty_out(vty, "OpenFabric Flooding debugging is %s\n", onoffs); + if (flags & DEBUG_FLOODING) + vty_out(vty, "IS-IS Flooding debugging is %s\n", onoffs); if (flags & DEBUG_BFD) vty_out(vty, "IS-IS BFD debugging is %s\n", onoffs); } @@ -810,7 +810,7 @@ static int config_write_debug(struct vty *vty) vty_out(vty, "debug " PROTO_NAME " lsp-sched\n"); write++; } - if (flags & DEBUG_FABRICD_FLOODING) { + if (flags & DEBUG_FLOODING) { vty_out(vty, "debug " PROTO_NAME " flooding\n"); write++; } @@ -877,6 +877,33 @@ DEFUN (no_debug_isis_tx_queue, return CMD_SUCCESS; } +DEFUN (debug_isis_flooding, + debug_isis_flooding_cmd, + "debug " PROTO_NAME " flooding", + DEBUG_STR + PROTO_HELP + "Flooding algorithm\n") +{ + isis->debugs |= DEBUG_FLOODING; + print_debug(vty, DEBUG_FLOODING, 1); + + return CMD_SUCCESS; +} + +DEFUN (no_debug_isis_flooding, + no_debug_isis_flooding_cmd, + "no debug " PROTO_NAME " flooding", + NO_STR + UNDEBUG_STR + PROTO_HELP + "Flooding algorithm\n") +{ + isis->debugs &= ~DEBUG_FLOODING; + print_debug(vty, DEBUG_FLOODING, 0); + + return CMD_SUCCESS; +} + DEFUN (debug_isis_snp, debug_isis_snp_cmd, "debug " PROTO_NAME " snp-packets", @@ -2097,6 +2124,8 @@ void isis_init() install_element(ENABLE_NODE, &no_debug_isis_adj_cmd); install_element(ENABLE_NODE, &debug_isis_tx_queue_cmd); install_element(ENABLE_NODE, &no_debug_isis_tx_queue_cmd); + install_element(ENABLE_NODE, &debug_isis_flooding_cmd); + install_element(ENABLE_NODE, &no_debug_isis_flooding_cmd); install_element(ENABLE_NODE, &debug_isis_snp_cmd); install_element(ENABLE_NODE, &no_debug_isis_snp_cmd); install_element(ENABLE_NODE, &debug_isis_upd_cmd); @@ -2120,6 +2149,8 @@ void isis_init() install_element(CONFIG_NODE, &no_debug_isis_adj_cmd); install_element(CONFIG_NODE, &debug_isis_tx_queue_cmd); install_element(CONFIG_NODE, &no_debug_isis_tx_queue_cmd); + install_element(CONFIG_NODE, &debug_isis_flooding_cmd); + install_element(CONFIG_NODE, &no_debug_isis_flooding_cmd); install_element(CONFIG_NODE, &debug_isis_snp_cmd); install_element(CONFIG_NODE, &no_debug_isis_snp_cmd); install_element(CONFIG_NODE, &debug_isis_upd_cmd); diff --git a/isisd/isisd.h b/isisd/isisd.h index 95fdb971b1..7899d3ecd8 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -212,7 +212,7 @@ extern struct thread_master *master; #define DEBUG_PACKET_DUMP (1<<6) #define DEBUG_LSP_GEN (1<<7) #define DEBUG_LSP_SCHED (1<<8) -#define DEBUG_FABRICD_FLOODING (1<<9) +#define DEBUG_FLOODING (1<<9) #define DEBUG_BFD (1<<10) #define DEBUG_TX_QUEUE (1<<11)