summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--isisd/fabricd.c62
-rw-r--r--isisd/isis_spf.c3
-rw-r--r--isisd/isis_spf.h1
-rw-r--r--isisd/isis_spf_private.h3
-rw-r--r--isisd/isis_vty_fabricd.c32
-rw-r--r--isisd/isisd.c6
-rw-r--r--isisd/isisd.h1
7 files changed, 103 insertions, 5 deletions
diff --git a/isisd/fabricd.c b/isisd/fabricd.c
index 95718f3bd..88ecdf2a7 100644
--- a/isisd/fabricd.c
+++ b/isisd/fabricd.c
@@ -491,6 +491,13 @@ static void move_to_dnr(struct isis_lsp *lsp, struct neighbor_entry *n)
struct isis_adjacency *adj = listnode_head(n->vertex->Adj_N);
n->present = false;
+
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ char buff[PREFIX2STR_BUFFER];
+ zlog_debug("OpenFabric: Adding %s to DNR",
+ vid2string(n->vertex, buff, sizeof(buff)));
+ }
+
if (adj) {
isis_tx_queue_add(adj->circuit->tx_queue, lsp,
TX_LSP_CIRCUIT_SCOPED);
@@ -502,6 +509,13 @@ static void move_to_rf(struct isis_lsp *lsp, struct neighbor_entry *n)
struct isis_adjacency *adj = listnode_head(n->vertex->Adj_N);
n->present = false;
+
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ char buff[PREFIX2STR_BUFFER];
+ zlog_debug("OpenFabric: Adding %s to RF",
+ vid2string(n->vertex, buff, sizeof(buff)));
+ }
+
if (adj) {
isis_tx_queue_add(adj->circuit->tx_queue, lsp,
TX_LSP_NORMAL);
@@ -524,12 +538,24 @@ static void handle_firsthops(struct hash_backet *backet, void *arg)
struct neighbor_entry *n;
n = neighbor_entry_lookup_list(f->neighbors, vertex->N.id);
- if (n)
+ if (n) {
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ char buff[PREFIX2STR_BUFFER];
+ zlog_debug("Removing %s from NL as its in the reverse path",
+ vid2string(vertex, buff, sizeof(buff)));
+ }
n->present = false;
+ }
n = neighbor_entry_lookup_hash(f->neighbors_neighbors, vertex->N.id);
- if (n)
+ if (n) {
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ char buff[PREFIX2STR_BUFFER];
+ zlog_debug("Removing %s from NN as its in the reverse path",
+ vid2string(vertex, buff, sizeof(buff)));
+ }
n->present = false;
+ }
}
void fabricd_lsp_flood(struct isis_lsp *lsp)
@@ -540,6 +566,11 @@ 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;
@@ -552,6 +583,11 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
|| lsp->tlvs->spine_leaf->tier != 0)
continue;
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ zlog_debug("Moving %s to DNR because it's T0",
+ rawlspid_print(lsp->hdr.lsp_id));
+ }
+
move_to_dnr(lsp, n);
}
@@ -575,10 +611,22 @@ 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) {
+ char buff[PREFIX2STR_BUFFER];
+ zlog_debug("Moving %s to DNR as it has no LSP",
+ vid2string(n->vertex, buff, sizeof(buff)));
+ }
+
move_to_dnr(lsp, n);
continue;
}
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ char buff[PREFIX2STR_BUFFER];
+ zlog_debug("Considering %s from NL...",
+ vid2string(n->vertex, buff, sizeof(buff)));
+ }
+
/* For all neighbors of the NL IS check whether they are present
* in NN. If yes, remove from NN and set need_reflood. */
bool need_reflood = false;
@@ -591,6 +639,12 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
er->id);
if (nn) {
+ if (isis->debugs & DEBUG_FABRICD_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)));
+ }
+
nn->present = false;
need_reflood = true;
}
@@ -601,4 +655,8 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
else
move_to_dnr(lsp, n);
}
+
+ if (isis->debugs & DEBUG_FABRICD_FLOODING) {
+ zlog_debug("OpenFabric: Flooding algorithm complete.");
+ }
}
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c
index 225ef22ec..25e2d43ce 100644
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@ -162,8 +162,7 @@ static const char *vtype2string(enum vertextype vtype)
return NULL; /* Not reached */
}
-#define VID2STR_BUFFER SRCDEST2STR_BUFFER
-static const char *vid2string(struct isis_vertex *vertex, char *buff, int size)
+const char *vid2string(struct isis_vertex *vertex, char *buff, int size)
{
if (VTYPE_IS(vertex->type) || VTYPE_ES(vertex->type)) {
return print_sys_hostname(vertex->N.id);
diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h
index 0532bd546..f4db98cfe 100644
--- a/isisd/isis_spf.h
+++ b/isisd/isis_spf.h
@@ -40,5 +40,4 @@ void isis_spf_print(struct isis_spftree *spftree, struct vty *vty);
struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area,
uint8_t *sysid,
struct isis_spftree *spftree);
-
#endif /* _ZEBRA_ISIS_SPF_H */
diff --git a/isisd/isis_spf_private.h b/isisd/isis_spf_private.h
index 2c6514d47..2e33367e2 100644
--- a/isisd/isis_spf_private.h
+++ b/isisd/isis_spf_private.h
@@ -354,4 +354,7 @@ static struct isis_lsp *lsp_for_vertex(struct isis_spftree *spftree,
return NULL;
}
+#define VID2STR_BUFFER SRCDEST2STR_BUFFER
+const char *vid2string(struct isis_vertex *vertex, char *buff, int size);
+
#endif
diff --git a/isisd/isis_vty_fabricd.c b/isisd/isis_vty_fabricd.c
index 5ef3af0f1..95ebe0de8 100644
--- a/isisd/isis_vty_fabricd.c
+++ b/isisd/isis_vty_fabricd.c
@@ -55,8 +55,40 @@ 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 84f44b164..640bd69ce 100644
--- a/isisd/isisd.c
+++ b/isisd/isisd.c
@@ -744,6 +744,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);
}
DEFUN_NOSH (show_debugging,
@@ -825,6 +827,10 @@ static int config_write_debug(struct vty *vty)
vty_out(vty, "debug " PROTO_NAME " lsp-sched\n");
write++;
}
+ if (flags & DEBUG_FABRICD_FLOODING) {
+ vty_out(vty, "debug " PROTO_NAME " flooding\n");
+ write++;
+ }
write += spf_backoff_write_config(vty);
return write;
diff --git a/isisd/isisd.h b/isisd/isisd.h
index 0e75b870a..cc5def8f5 100644
--- a/isisd/isisd.h
+++ b/isisd/isisd.h
@@ -209,6 +209,7 @@ extern struct thread_master *master;
#define DEBUG_PACKET_DUMP (1<<12)
#define DEBUG_LSP_GEN (1<<13)
#define DEBUG_LSP_SCHED (1<<14)
+#define DEBUG_FABRICD_FLOODING (1<<15)
#define lsp_debug(...) \
do { \