mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 13:27:53 +00:00
fabricd: add flooding algorithm debugging
Add a command `debug openfabric flooding` to allow verification of correct operation of the OpenFabric flooding optimization algorithm. Signed-off-by: Christian Franke <chris@opensourcerouting.org>
This commit is contained in:
parent
9d22481933
commit
d4cff91a06
@ -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);
|
struct isis_adjacency *adj = listnode_head(n->vertex->Adj_N);
|
||||||
|
|
||||||
n->present = false;
|
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) {
|
if (adj) {
|
||||||
isis_tx_queue_add(adj->circuit->tx_queue, lsp,
|
isis_tx_queue_add(adj->circuit->tx_queue, lsp,
|
||||||
TX_LSP_CIRCUIT_SCOPED);
|
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);
|
struct isis_adjacency *adj = listnode_head(n->vertex->Adj_N);
|
||||||
|
|
||||||
n->present = false;
|
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) {
|
if (adj) {
|
||||||
isis_tx_queue_add(adj->circuit->tx_queue, lsp,
|
isis_tx_queue_add(adj->circuit->tx_queue, lsp,
|
||||||
TX_LSP_NORMAL);
|
TX_LSP_NORMAL);
|
||||||
@ -524,13 +538,25 @@ static void handle_firsthops(struct hash_backet *backet, void *arg)
|
|||||||
struct neighbor_entry *n;
|
struct neighbor_entry *n;
|
||||||
|
|
||||||
n = neighbor_entry_lookup_list(f->neighbors, vertex->N.id);
|
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->present = false;
|
||||||
|
}
|
||||||
|
|
||||||
n = neighbor_entry_lookup_hash(f->neighbors_neighbors, vertex->N.id);
|
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;
|
n->present = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void fabricd_lsp_flood(struct isis_lsp *lsp)
|
void fabricd_lsp_flood(struct isis_lsp *lsp)
|
||||||
{
|
{
|
||||||
@ -540,6 +566,11 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
|
|||||||
void *cursor = NULL;
|
void *cursor = NULL;
|
||||||
struct neighbor_entry *n;
|
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 */
|
/* Mark all elements in NL as present and move T0s into DNR */
|
||||||
while (!skiplist_next(f->neighbors, NULL, (void **)&n, &cursor)) {
|
while (!skiplist_next(f->neighbors, NULL, (void **)&n, &cursor)) {
|
||||||
n->present = true;
|
n->present = true;
|
||||||
@ -552,6 +583,11 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
|
|||||||
|| lsp->tlvs->spine_leaf->tier != 0)
|
|| lsp->tlvs->spine_leaf->tier != 0)
|
||||||
continue;
|
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);
|
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);
|
struct isis_lsp *nlsp = lsp_for_vertex(f->spftree, n->vertex);
|
||||||
if (!nlsp || !nlsp->tlvs) {
|
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);
|
move_to_dnr(lsp, n);
|
||||||
continue;
|
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
|
/* For all neighbors of the NL IS check whether they are present
|
||||||
* in NN. If yes, remove from NN and set need_reflood. */
|
* in NN. If yes, remove from NN and set need_reflood. */
|
||||||
bool need_reflood = false;
|
bool need_reflood = false;
|
||||||
@ -591,6 +639,12 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
|
|||||||
er->id);
|
er->id);
|
||||||
|
|
||||||
if (nn) {
|
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;
|
nn->present = false;
|
||||||
need_reflood = true;
|
need_reflood = true;
|
||||||
}
|
}
|
||||||
@ -601,4 +655,8 @@ void fabricd_lsp_flood(struct isis_lsp *lsp)
|
|||||||
else
|
else
|
||||||
move_to_dnr(lsp, n);
|
move_to_dnr(lsp, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isis->debugs & DEBUG_FABRICD_FLOODING) {
|
||||||
|
zlog_debug("OpenFabric: Flooding algorithm complete.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,8 +162,7 @@ static const char *vtype2string(enum vertextype vtype)
|
|||||||
return NULL; /* Not reached */
|
return NULL; /* Not reached */
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VID2STR_BUFFER SRCDEST2STR_BUFFER
|
const char *vid2string(struct isis_vertex *vertex, char *buff, int size)
|
||||||
static const char *vid2string(struct isis_vertex *vertex, char *buff, int size)
|
|
||||||
{
|
{
|
||||||
if (VTYPE_IS(vertex->type) || VTYPE_ES(vertex->type)) {
|
if (VTYPE_IS(vertex->type) || VTYPE_ES(vertex->type)) {
|
||||||
return print_sys_hostname(vertex->N.id);
|
return print_sys_hostname(vertex->N.id);
|
||||||
|
@ -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,
|
struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area,
|
||||||
uint8_t *sysid,
|
uint8_t *sysid,
|
||||||
struct isis_spftree *spftree);
|
struct isis_spftree *spftree);
|
||||||
|
|
||||||
#endif /* _ZEBRA_ISIS_SPF_H */
|
#endif /* _ZEBRA_ISIS_SPF_H */
|
||||||
|
@ -354,4 +354,7 @@ static struct isis_lsp *lsp_for_vertex(struct isis_spftree *spftree,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VID2STR_BUFFER SRCDEST2STR_BUFFER
|
||||||
|
const char *vid2string(struct isis_vertex *vertex, char *buff, int size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,8 +55,40 @@ DEFUN (no_fabric_tier,
|
|||||||
return CMD_SUCCESS;
|
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)
|
void isis_vty_daemon_init(void)
|
||||||
{
|
{
|
||||||
install_element(ROUTER_NODE, &fabric_tier_cmd);
|
install_element(ROUTER_NODE, &fabric_tier_cmd);
|
||||||
install_element(ROUTER_NODE, &no_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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
vty_out(vty, "IS-IS LSP generation debugging is %s\n", onoffs);
|
||||||
if (flags & DEBUG_LSP_SCHED)
|
if (flags & DEBUG_LSP_SCHED)
|
||||||
vty_out(vty, "IS-IS LSP scheduling debugging is %s\n", onoffs);
|
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,
|
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");
|
vty_out(vty, "debug " PROTO_NAME " lsp-sched\n");
|
||||||
write++;
|
write++;
|
||||||
}
|
}
|
||||||
|
if (flags & DEBUG_FABRICD_FLOODING) {
|
||||||
|
vty_out(vty, "debug " PROTO_NAME " flooding\n");
|
||||||
|
write++;
|
||||||
|
}
|
||||||
write += spf_backoff_write_config(vty);
|
write += spf_backoff_write_config(vty);
|
||||||
|
|
||||||
return write;
|
return write;
|
||||||
|
@ -209,6 +209,7 @@ extern struct thread_master *master;
|
|||||||
#define DEBUG_PACKET_DUMP (1<<12)
|
#define DEBUG_PACKET_DUMP (1<<12)
|
||||||
#define DEBUG_LSP_GEN (1<<13)
|
#define DEBUG_LSP_GEN (1<<13)
|
||||||
#define DEBUG_LSP_SCHED (1<<14)
|
#define DEBUG_LSP_SCHED (1<<14)
|
||||||
|
#define DEBUG_FABRICD_FLOODING (1<<15)
|
||||||
|
|
||||||
#define lsp_debug(...) \
|
#define lsp_debug(...) \
|
||||||
do { \
|
do { \
|
||||||
|
Loading…
Reference in New Issue
Block a user