summaryrefslogtreecommitdiff
path: root/isisd/isis_srv6.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-02-02 11:29:09 +0100
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-09-11 17:34:51 +0200
commitfb9eb231f4eb130c6c11b4108faf69af37bcb56d (patch)
tree589b55192bf5a5d58f67c11fe988768b83f67209 /isisd/isis_srv6.c
parent00a05b79b69f6e85402f668f3d4642405fba0998 (diff)
isisd: Add CLI command to show SRv6 node info
Add a CLI command to print SRv6 capabilities, algorithms and MSDs supported by the IS-IS nodes. Example: r1# show isis segment-routing srv6 node Area FOO: IS-IS L1 SRv6-Nodes: IS-IS L2 SRv6-Nodes: System ID Algorithm SRH Max SL SRH Max End Pop SRH Max H.encaps SRH Max End D ----------------------------------------------------------------------------------------- 1111.1111.1111 SPF 16 0 1 2 2222.2222.2222 SPF 16 0 1 2 Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
Diffstat (limited to 'isisd/isis_srv6.c')
-rw-r--r--isisd/isis_srv6.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/isisd/isis_srv6.c b/isisd/isis_srv6.c
index 564fd04285..1397ea4d0b 100644
--- a/isisd/isis_srv6.c
+++ b/isisd/isis_srv6.c
@@ -9,10 +9,95 @@
#include <zebra.h>
+#include "termtable.h"
+
#include "isisd/isisd.h"
+#include "isisd/isis_misc.h"
#include "isisd/isis_srv6.h"
/**
+ * Show Segment Routing over IPv6 (SRv6) Node.
+ *
+ * @param vty VTY output
+ * @param area IS-IS area
+ * @param level IS-IS level
+ */
+static void show_node(struct vty *vty, struct isis_area *area, int level)
+{
+ struct isis_lsp *lsp;
+ struct ttable *tt;
+
+ vty_out(vty, " IS-IS %s SRv6-Nodes:\n\n", circuit_t2string(level));
+
+ /* Prepare table. */
+ tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]);
+ ttable_add_row(
+ tt,
+ "System ID|Algorithm|SRH Max SL|SRH Max End Pop|SRH Max H.encaps|SRH Max End D");
+ tt->style.cell.rpad = 2;
+ tt->style.corner = '+';
+ ttable_restyle(tt);
+ ttable_rowseps(tt, 0, BOTTOM, true, '-');
+
+ frr_each (lspdb, &area->lspdb[level - 1], lsp) {
+ struct isis_router_cap *cap;
+
+ if (!lsp->tlvs)
+ continue;
+ cap = lsp->tlvs->router_cap;
+ if (!cap)
+ continue;
+
+ ttable_add_row(tt, "%pSY|%s|%u|%u|%u|%u", lsp->hdr.lsp_id,
+ cap->algo[0] == SR_ALGORITHM_SPF ? "SPF"
+ : "S-SPF",
+ cap->srv6_msd.max_seg_left_msd,
+ cap->srv6_msd.max_end_pop_msd,
+ cap->srv6_msd.max_h_encaps_msd,
+ cap->srv6_msd.max_end_d_msd);
+ }
+
+ /* Dump the generated table. */
+ if (tt->nrows > 1) {
+ char *table;
+
+ table = ttable_dump(tt, "\n");
+ vty_out(vty, "%s\n", table);
+ XFREE(MTYPE_TMP, table);
+ }
+ ttable_del(tt);
+}
+
+DEFUN(show_srv6_node, show_srv6_node_cmd,
+ "show " PROTO_NAME " segment-routing srv6 node",
+ SHOW_STR
+ PROTO_HELP
+ "Segment-Routing\n"
+ "Segment-Routing over IPv6 (SRv6)\n"
+ "SRv6 node\n")
+{
+ struct listnode *node, *inode;
+ struct isis_area *area;
+ struct isis *isis;
+
+ for (ALL_LIST_ELEMENTS_RO(im->isis, inode, isis)) {
+ for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) {
+ vty_out(vty, "Area %s:\n",
+ area->area_tag ? area->area_tag : "null");
+ if (!area->srv6db.config.enabled) {
+ vty_out(vty, " SRv6 is disabled\n");
+ continue;
+ }
+ for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS;
+ level++)
+ show_node(vty, area, level);
+ }
+ }
+
+ return CMD_SUCCESS;
+}
+
+/**
* IS-IS SRv6 initialization for given area.
*
* @param area IS-IS area
@@ -56,6 +141,7 @@ void isis_srv6_area_term(struct isis_area *area)
*/
void isis_srv6_init(void)
{
+ install_element(VIEW_NODE, &show_srv6_node_cmd);
}
/**