From e39af3727e00d0a1262d9d73b3672788d823e8d3 Mon Sep 17 00:00:00 2001 From: Eric Kinzie Date: Fri, 2 Sep 2022 16:33:43 +0200 Subject: [PATCH] isisd: show non-zero algos in "show isis route prefix-sid" (2/2) Show Prefix-SIDs and labels for all available Flex-Algos. Signed-off-by: Eric Kinzie Signed-off-by: Louis Scalbert --- isisd/isis_spf.c | 86 +++++++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index 9560e0c67a..30a558a52f 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -2355,23 +2355,28 @@ static void isis_print_route(struct ttable *tt, const struct prefix *prefix, char buf_prefix[BUFSIZ]; (void)prefix2str(prefix, buf_prefix, sizeof(buf_prefix)); - for (ALL_LIST_ELEMENTS_RO(rinfo->nexthops, node, nexthop)) { + for (int alg = 0; alg < SR_ALGORITHM_COUNT; alg++) { + for (ALL_LIST_ELEMENTS_RO(rinfo->sr_algo[alg].nexthops, node, + nexthop)) { struct interface *ifp; char buf_iface[BUFSIZ]; char buf_nhop[BUFSIZ]; if (!no_adjacencies) { - inet_ntop(nexthop->family, &nexthop->ip, buf_nhop, - sizeof(buf_nhop)); - ifp = if_lookup_by_index(nexthop->ifindex, VRF_DEFAULT); + inet_ntop(nexthop->family, &nexthop->ip, + buf_nhop, sizeof(buf_nhop)); + ifp = if_lookup_by_index(nexthop->ifindex, + VRF_DEFAULT); if (ifp) strlcpy(buf_iface, ifp->name, sizeof(buf_iface)); else snprintf(buf_iface, sizeof(buf_iface), - "ifindex %u", nexthop->ifindex); + "ifindex %u", + nexthop->ifindex); } else { - strlcpy(buf_nhop, print_sys_hostname(nexthop->sysid), + strlcpy(buf_nhop, + print_sys_hostname(nexthop->sysid), sizeof(buf_nhop)); strlcpy(buf_iface, "-", sizeof(buf_iface)); } @@ -2380,40 +2385,45 @@ static void isis_print_route(struct ttable *tt, const struct prefix *prefix, char buf_sid[BUFSIZ] = {}; char buf_lblop[BUFSIZ] = {}; - if (nexthop->sr.present) { + if (rinfo->sr_algo[alg].present) { snprintf(buf_sid, sizeof(buf_sid), "%u", - nexthop->sr.sid.value); - sr_op2str( - buf_lblop, sizeof(buf_lblop), - rinfo->sr_algo[SR_ALGORITHM_SPF].label, - nexthop->sr.label); - } else { + rinfo->sr_algo[alg].sid.value); + sr_op2str(buf_lblop, sizeof(buf_lblop), + rinfo->sr_algo[alg].label, + nexthop->sr.label); + } else if (alg == SR_ALGORITHM_SPF) { strlcpy(buf_sid, "-", sizeof(buf_sid)); - strlcpy(buf_lblop, "-", sizeof(buf_lblop)); + strlcpy(buf_lblop, "-", + sizeof(buf_lblop)); + } else { + continue; } if (first) { - ttable_add_row(tt, "%s|%u|%s|%s|%s|%s", - buf_prefix, rinfo->cost, - buf_iface, buf_nhop, buf_sid, - buf_lblop); + ttable_add_row(tt, + "%s|%u|%s|%s|%s|%s|%d", + buf_prefix, rinfo->cost, + buf_iface, buf_nhop, + buf_sid, buf_lblop, alg); first = false; } else - ttable_add_row(tt, "||%s|%s|%s|%s", buf_iface, - buf_nhop, buf_sid, buf_lblop); + ttable_add_row(tt, "||%s|%s|%s|%s|%d", + buf_iface, buf_nhop, + buf_sid, buf_lblop, alg); } else { char buf_labels[BUFSIZ] = {}; if (nexthop->label_stack) { for (int i = 0; - i < nexthop->label_stack->num_labels; - i++) { + i < + nexthop->label_stack->num_labels; + i++) { char buf_label[BUFSIZ]; - label2str( - nexthop->label_stack->label[i], - 0, buf_label, - sizeof(buf_label)); + label2str(nexthop->label_stack + ->label[i], + 0, buf_label, + sizeof(buf_label)); if (i != 0) strlcat(buf_labels, "/", sizeof(buf_labels)); @@ -2421,21 +2431,27 @@ static void isis_print_route(struct ttable *tt, const struct prefix *prefix, sizeof(buf_labels)); } } else if (nexthop->sr.present) - label2str(nexthop->sr.label, 0, buf_labels, + label2str(nexthop->sr.label, 0, + buf_labels, sizeof(buf_labels)); else - strlcpy(buf_labels, "-", sizeof(buf_labels)); + strlcpy(buf_labels, "-", + sizeof(buf_labels)); if (first) { - ttable_add_row(tt, "%s|%u|%s|%s|%s", buf_prefix, - rinfo->cost, buf_iface, buf_nhop, - buf_labels); + ttable_add_row(tt, "%s|%u|%s|%s|%s", + buf_prefix, rinfo->cost, + buf_iface, buf_nhop, + buf_labels); first = false; } else - ttable_add_row(tt, "||%s|%s|%s", buf_iface, - buf_nhop, buf_labels); + ttable_add_row(tt, "||%s|%s|%s", + buf_iface, buf_nhop, + buf_labels); } } + } + if (list_isempty(rinfo->nexthops)) { if (prefix_sid) { char buf_sid[BUFSIZ] = {}; @@ -2496,7 +2512,9 @@ void isis_print_routes(struct vty *vty, struct isis_spftree *spftree, /* Prepare table. */ tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]); if (prefix_sid) - ttable_add_row(tt, "Prefix|Metric|Interface|Nexthop|SID|Label Op."); + ttable_add_row( + tt, + "Prefix|Metric|Interface|Nexthop|SID|Label Op.|Algo"); else ttable_add_row(tt, "Prefix|Metric|Interface|Nexthop|Label(s)"); tt->style.cell.rpad = 2;