summaryrefslogtreecommitdiff
path: root/staticd/static_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'staticd/static_vty.c')
-rw-r--r--staticd/static_vty.c450
1 files changed, 327 insertions, 123 deletions
diff --git a/staticd/static_vty.c b/staticd/static_vty.c
index 07b8bc3d28..f93e81e8dc 100644
--- a/staticd/static_vty.c
+++ b/staticd/static_vty.c
@@ -27,6 +27,8 @@
#include "static_debug.h"
#include "staticd/static_vty_clippy.c"
#include "static_nb.h"
+#include "static_srv6.h"
+#include "static_zebra.h"
#define STATICD_STR "Static route daemon\n"
@@ -77,7 +79,7 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
char xpath_seg[XPATH_MAXLEN];
char ab_xpath[XPATH_MAXLEN];
char buf_prefix[PREFIX_STRLEN];
- char buf_src_prefix[PREFIX_STRLEN] = {};
+ char buf_src_prefix[PREFIX_STRLEN] = "::/0";
char buf_nh_type[PREFIX_STRLEN] = {};
char buf_tag[PREFIX_STRLEN];
uint8_t label_stack_id = 0;
@@ -114,6 +116,7 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
}
assert(!!str2prefix(args->prefix, &p));
+ src = (struct prefix){ .family = p.family, .prefixlen = 0 };
switch (args->afi) {
case AFI_IP:
@@ -144,7 +147,7 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
return CMD_WARNING_CONFIG_FAILED;
}
- if (args->source)
+ if (src.prefixlen)
prefix2str(&src, buf_src_prefix, sizeof(buf_src_prefix));
if (args->gateway)
buf_gate_str = args->gateway;
@@ -181,25 +184,10 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
static_get_nh_type(type, buf_nh_type, sizeof(buf_nh_type));
if (!args->delete) {
- if (args->source)
- snprintf(ab_xpath, sizeof(ab_xpath),
- FRR_DEL_S_ROUTE_SRC_NH_KEY_NO_DISTANCE_XPATH,
- "frr-staticd:staticd", "staticd", args->vrf,
- buf_prefix,
- yang_afi_safi_value2identity(args->afi,
- args->safi),
- buf_src_prefix, table_id, buf_nh_type,
- args->nexthop_vrf, buf_gate_str,
- args->interface_name);
- else
- snprintf(ab_xpath, sizeof(ab_xpath),
- FRR_DEL_S_ROUTE_NH_KEY_NO_DISTANCE_XPATH,
- "frr-staticd:staticd", "staticd", args->vrf,
- buf_prefix,
- yang_afi_safi_value2identity(args->afi,
- args->safi),
- table_id, buf_nh_type, args->nexthop_vrf,
- buf_gate_str, args->interface_name);
+ snprintf(ab_xpath, sizeof(ab_xpath), FRR_DEL_S_ROUTE_NH_KEY_NO_DISTANCE_XPATH,
+ "frr-staticd:staticd", "staticd", args->vrf, buf_prefix, buf_src_prefix,
+ yang_afi_safi_value2identity(args->afi, args->safi), table_id, buf_nh_type,
+ args->nexthop_vrf, buf_gate_str, args->interface_name);
/*
* If there's already the same nexthop but with a different
@@ -216,22 +204,9 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
}
/* route + path procesing */
- if (args->source)
- snprintf(xpath_prefix, sizeof(xpath_prefix),
- FRR_S_ROUTE_SRC_INFO_KEY_XPATH,
- "frr-staticd:staticd", "staticd", args->vrf,
- buf_prefix,
- yang_afi_safi_value2identity(args->afi,
- args->safi),
- buf_src_prefix, table_id, distance);
- else
- snprintf(xpath_prefix, sizeof(xpath_prefix),
- FRR_STATIC_ROUTE_INFO_KEY_XPATH,
- "frr-staticd:staticd", "staticd", args->vrf,
- buf_prefix,
- yang_afi_safi_value2identity(args->afi,
- args->safi),
- table_id, distance);
+ snprintf(xpath_prefix, sizeof(xpath_prefix), FRR_STATIC_ROUTE_INFO_KEY_XPATH,
+ "frr-staticd:staticd", "staticd", args->vrf, buf_prefix, buf_src_prefix,
+ yang_afi_safi_value2identity(args->afi, args->safi), table_id, distance);
nb_cli_enqueue_change(vty, xpath_prefix, NB_OP_CREATE, NULL);
@@ -410,51 +385,18 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
if (orig_seg)
XFREE(MTYPE_TMP, orig_seg);
} else {
- if (args->source) {
- if (args->distance)
- snprintf(ab_xpath, sizeof(ab_xpath),
- FRR_DEL_S_ROUTE_SRC_NH_KEY_XPATH,
- "frr-staticd:staticd", "staticd",
- args->vrf, buf_prefix,
- yang_afi_safi_value2identity(
- args->afi, args->safi),
- buf_src_prefix, table_id, distance,
- buf_nh_type, args->nexthop_vrf,
- buf_gate_str, args->interface_name);
- else
- snprintf(
- ab_xpath, sizeof(ab_xpath),
- FRR_DEL_S_ROUTE_SRC_NH_KEY_NO_DISTANCE_XPATH,
- "frr-staticd:staticd", "staticd",
- args->vrf, buf_prefix,
- yang_afi_safi_value2identity(
- args->afi, args->safi),
- buf_src_prefix, table_id, buf_nh_type,
- args->nexthop_vrf, buf_gate_str,
- args->interface_name);
- } else {
- if (args->distance)
- snprintf(ab_xpath, sizeof(ab_xpath),
- FRR_DEL_S_ROUTE_NH_KEY_XPATH,
- "frr-staticd:staticd", "staticd",
- args->vrf, buf_prefix,
- yang_afi_safi_value2identity(
- args->afi, args->safi),
- table_id, distance, buf_nh_type,
- args->nexthop_vrf, buf_gate_str,
- args->interface_name);
- else
- snprintf(
- ab_xpath, sizeof(ab_xpath),
- FRR_DEL_S_ROUTE_NH_KEY_NO_DISTANCE_XPATH,
- "frr-staticd:staticd", "staticd",
- args->vrf, buf_prefix,
- yang_afi_safi_value2identity(
- args->afi, args->safi),
- table_id, buf_nh_type,
- args->nexthop_vrf, buf_gate_str,
- args->interface_name);
- }
+ if (args->distance)
+ snprintf(ab_xpath, sizeof(ab_xpath), FRR_DEL_S_ROUTE_NH_KEY_XPATH,
+ "frr-staticd:staticd", "staticd", args->vrf, buf_prefix,
+ buf_src_prefix, yang_afi_safi_value2identity(args->afi, args->safi),
+ table_id, distance, buf_nh_type, args->nexthop_vrf, buf_gate_str,
+ args->interface_name);
+ else
+ snprintf(ab_xpath, sizeof(ab_xpath),
+ FRR_DEL_S_ROUTE_NH_KEY_NO_DISTANCE_XPATH, "frr-staticd:staticd",
+ "staticd", args->vrf, buf_prefix, buf_src_prefix,
+ yang_afi_safi_value2identity(args->afi, args->safi), table_id,
+ buf_nh_type, args->nexthop_vrf, buf_gate_str, args->interface_name);
dnode = yang_dnode_get(vty->candidate_config->dnode, ab_xpath);
if (!dnode) {
@@ -1201,8 +1143,167 @@ DEFPY_YANG(ipv6_route_vrf, ipv6_route_vrf_cmd,
return static_route_nb_run(vty, &args);
}
+DEFUN_NOSH (static_segment_routing, static_segment_routing_cmd,
+ "segment-routing",
+ "Segment Routing\n")
+{
+ VTY_PUSH_CONTEXT_NULL(SEGMENT_ROUTING_NODE);
+ return CMD_SUCCESS;
+}
+
+DEFUN_NOSH (static_srv6, static_srv6_cmd,
+ "srv6",
+ "Segment Routing SRv6\n")
+{
+ VTY_PUSH_CONTEXT_NULL(SRV6_NODE);
+ return CMD_SUCCESS;
+}
+
+DEFUN_YANG_NOSH (no_static_srv6, no_static_srv6_cmd,
+ "no srv6",
+ NO_STR
+ "Segment Routing SRv6\n")
+{
+ char xpath[XPATH_MAXLEN];
+
+ snprintf(xpath, sizeof(xpath), FRR_STATIC_SRV6_INFO_KEY_XPATH, "frr-staticd:staticd",
+ "staticd", VRF_DEFAULT_NAME);
+
+ nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, "%s", xpath);
+}
+
+DEFUN_NOSH (static_srv6_sids, static_srv6_sids_cmd,
+ "static-sids",
+ "Segment Routing SRv6 SIDs\n")
+{
+ VTY_PUSH_CONTEXT_NULL(SRV6_SIDS_NODE);
+ return CMD_SUCCESS;
+}
+
+DEFPY_YANG(srv6_sid, srv6_sid_cmd,
+ "sid X:X::X:X/M locator NAME$locator_name behavior <uN | uDT6 vrf VIEWVRFNAME | uDT4 vrf VIEWVRFNAME | uDT46 vrf VIEWVRFNAME>",
+ "Configure SRv6 SID\n"
+ "Specify SRv6 SID\n"
+ "Locator name\n"
+ "Specify Locator name\n"
+ "Specify SRv6 SID behavior\n"
+ "Apply the code to a uN SID\n"
+ "Apply the code to an uDT6 SID\n"
+ "Configure VRF name\n"
+ "Specify VRF name\n"
+ "Apply the code to an uDT4 SID\n"
+ "Configure VRF name\n"
+ "Specify VRF name\n"
+ "Apply the code to an uDT46 SID\n"
+ "Configure VRF name\n"
+ "Specify VRF name\n")
+{
+ enum srv6_endpoint_behavior_codepoint behavior = SRV6_ENDPOINT_BEHAVIOR_RESERVED;
+ int idx = 0;
+ const char *vrf_name = NULL;
+ char xpath_srv6[XPATH_MAXLEN];
+ char xpath_sid[XPATH_MAXLEN];
+ char xpath_behavior[XPATH_MAXLEN];
+ char xpath_vrf_name[XPATH_MAXLEN];
+ char xpath_locator_name[XPATH_MAXLEN];
+
+ if (argv_find(argv, argc, "uN", &idx)) {
+ behavior = SRV6_ENDPOINT_BEHAVIOR_END_NEXT_CSID;
+ } else if (argv_find(argv, argc, "uDT6", &idx)) {
+ behavior = SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID;
+ vrf_name = argv[idx + 2]->arg;
+ } else if (argv_find(argv, argc, "uDT4", &idx)) {
+ behavior = SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID;
+ vrf_name = argv[idx + 2]->arg;
+ } else if (argv_find(argv, argc, "uDT46", &idx)) {
+ behavior = SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID;
+ vrf_name = argv[idx + 2]->arg;
+ }
+
+ snprintf(xpath_srv6, sizeof(xpath_srv6), FRR_STATIC_SRV6_INFO_KEY_XPATH,
+ "frr-staticd:staticd", "staticd", VRF_DEFAULT_NAME);
+
+ snprintf(xpath_sid, sizeof(xpath_sid), FRR_STATIC_SRV6_SID_KEY_XPATH, "frr-staticd:staticd",
+ "staticd", VRF_DEFAULT_NAME, sid_str);
+
+ strlcpy(xpath_behavior, xpath_sid, sizeof(xpath_behavior));
+ strlcat(xpath_behavior, FRR_STATIC_SRV6_SID_BEHAVIOR_XPATH, sizeof(xpath_behavior));
+
+ nb_cli_enqueue_change(vty, xpath_sid, NB_OP_CREATE, sid_str);
+
+ nb_cli_enqueue_change(vty, xpath_behavior, NB_OP_MODIFY,
+ srv6_endpoint_behavior_codepoint2str(behavior));
+
+ if (vrf_name) {
+ strlcpy(xpath_vrf_name, xpath_sid, sizeof(xpath_vrf_name));
+ strlcat(xpath_vrf_name, FRR_STATIC_SRV6_SID_VRF_NAME_XPATH, sizeof(xpath_vrf_name));
+
+ nb_cli_enqueue_change(vty, xpath_vrf_name, NB_OP_MODIFY, vrf_name);
+ }
+
+ strlcpy(xpath_locator_name, xpath_sid, sizeof(xpath_locator_name));
+ strlcat(xpath_locator_name, FRR_STATIC_SRV6_SID_LOCATOR_NAME_XPATH,
+ sizeof(xpath_locator_name));
+
+ nb_cli_enqueue_change(vty, xpath_locator_name, NB_OP_MODIFY, locator_name);
+
+ return nb_cli_apply_changes(vty, "%s", xpath_sid);
+}
+
+DEFPY_YANG(no_srv6_sid, no_srv6_sid_cmd,
+ "no sid X:X::X:X/M [locator NAME$locator_name] [behavior <uN | uDT6 vrf VIEWVRFNAME | uDT4 vrf VIEWVRFNAME | uDT46 vrf VIEWVRFNAME>]",
+ NO_STR
+ "Configure SRv6 SID\n"
+ "Specify SRv6 SID\n"
+ "Locator name\n"
+ "Specify Locator name\n"
+ "Specify SRv6 SID behavior\n"
+ "Apply the code to a uN SID\n"
+ "Apply the code to an uDT6 SID\n"
+ "Configure VRF name\n"
+ "Specify VRF name\n"
+ "Apply the code to an uDT4 SID\n"
+ "Configure VRF name\n"
+ "Specify VRF name\n"
+ "Apply the code to an uDT46 SID\n"
+ "Configure VRF name\n"
+ "Specify VRF name\n")
+{
+ char xpath[XPATH_MAXLEN + 37];
+
+ snprintf(xpath, sizeof(xpath), FRR_STATIC_SRV6_SID_KEY_XPATH, "frr-staticd:staticd",
+ "staticd", VRF_DEFAULT_NAME, sid_str);
+
+ nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, NULL);
+}
+
#ifdef INCLUDE_MGMTD_CMDDEFS_ONLY
+static struct cmd_node sr_node = {
+ .name = "sr",
+ .node = SEGMENT_ROUTING_NODE,
+ .parent_node = CONFIG_NODE,
+ .prompt = "%s(config-sr)# ",
+};
+
+static struct cmd_node srv6_node = {
+ .name = "srv6",
+ .node = SRV6_NODE,
+ .parent_node = SEGMENT_ROUTING_NODE,
+ .prompt = "%s(config-srv6)# ",
+};
+
+static struct cmd_node srv6_sids_node = {
+ .name = "srv6-sids",
+ .node = SRV6_SIDS_NODE,
+ .parent_node = SRV6_NODE,
+ .prompt = "%s(config-srv6-sids)# ",
+};
+
static void static_cli_show(struct vty *vty, const struct lyd_node *dnode,
bool show_defaults)
{
@@ -1278,9 +1379,8 @@ static int srv6_seg_iter_cb(const struct lyd_node *dnode, void *arg)
}
static void nexthop_cli_show(struct vty *vty, const struct lyd_node *route,
- const struct lyd_node *src,
- const struct lyd_node *path,
- const struct lyd_node *nexthop, bool show_defaults)
+ const struct lyd_node *path, const struct lyd_node *nexthop,
+ bool show_defaults)
{
const char *vrf;
const char *afi_safi;
@@ -1294,6 +1394,7 @@ static void nexthop_cli_show(struct vty *vty, const struct lyd_node *route,
struct srv6_seg_iter seg_iter;
const char *nexthop_vrf;
uint32_t table_id;
+ struct prefix src_prefix;
bool onlink;
vrf = yang_dnode_get_string(route, "../../vrf");
@@ -1315,9 +1416,9 @@ static void nexthop_cli_show(struct vty *vty, const struct lyd_node *route,
vty_out(vty, " %s", yang_dnode_get_string(route, "prefix"));
- if (src)
- vty_out(vty, " from %s",
- yang_dnode_get_string(src, "src-prefix"));
+ yang_dnode_get_prefix(&src_prefix, route, "src-prefix");
+ if (src_prefix.prefixlen)
+ vty_out(vty, " from %pFX", &src_prefix);
nh_type = yang_dnode_get_enum(nexthop, "nh-type");
switch (nh_type) {
@@ -1421,18 +1522,7 @@ static void static_nexthop_cli_show(struct vty *vty,
const struct lyd_node *route =
yang_dnode_get_parent(path, "route-list");
- nexthop_cli_show(vty, route, NULL, path, dnode, show_defaults);
-}
-
-static void static_src_nexthop_cli_show(struct vty *vty,
- const struct lyd_node *dnode,
- bool show_defaults)
-{
- const struct lyd_node *path = yang_dnode_get_parent(dnode, "path-list");
- const struct lyd_node *src = yang_dnode_get_parent(path, "src-list");
- const struct lyd_node *route = yang_dnode_get_parent(src, "route-list");
-
- nexthop_cli_show(vty, route, src, path, dnode, show_defaults);
+ nexthop_cli_show(vty, route, path, dnode, show_defaults);
}
static int static_nexthop_cli_cmp(const struct lyd_node *dnode1,
@@ -1497,6 +1587,8 @@ static int static_route_list_cli_cmp(const struct lyd_node *dnode1,
afi_t afi1, afi2;
safi_t safi1, safi2;
struct prefix prefix1, prefix2;
+ struct prefix src_prefix1, src_prefix2;
+ int rv;
afi_safi1 = yang_dnode_get_string(dnode1, "afi-safi");
yang_afi_safi_identity2value(afi_safi1, &afi1, &safi1);
@@ -1512,19 +1604,13 @@ static int static_route_list_cli_cmp(const struct lyd_node *dnode1,
yang_dnode_get_prefix(&prefix1, dnode1, "prefix");
yang_dnode_get_prefix(&prefix2, dnode2, "prefix");
+ rv = prefix_cmp(&prefix1, &prefix2);
+ if (rv)
+ return rv;
- return prefix_cmp(&prefix1, &prefix2);
-}
-
-static int static_src_list_cli_cmp(const struct lyd_node *dnode1,
- const struct lyd_node *dnode2)
-{
- struct prefix prefix1, prefix2;
-
- yang_dnode_get_prefix(&prefix1, dnode1, "src-prefix");
- yang_dnode_get_prefix(&prefix2, dnode2, "src-prefix");
-
- return prefix_cmp(&prefix1, &prefix2);
+ yang_dnode_get_prefix(&src_prefix1, dnode1, "src-prefix");
+ yang_dnode_get_prefix(&src_prefix2, dnode2, "src-prefix");
+ return prefix_cmp(&src_prefix1, &src_prefix2);
}
static int static_path_list_cli_cmp(const struct lyd_node *dnode1,
@@ -1545,6 +1631,100 @@ static int static_path_list_cli_cmp(const struct lyd_node *dnode1,
return (int)distance1 - (int)distance2;
}
+static void static_segment_routing_cli_show(struct vty *vty, const struct lyd_node *dnode,
+ bool show_defaults)
+{
+ vty_out(vty, "segment-routing\n");
+}
+
+static void static_segment_routing_cli_show_end(struct vty *vty, const struct lyd_node *dnode)
+{
+ vty_out(vty, "exit\n");
+ vty_out(vty, "!\n");
+}
+
+static void static_srv6_cli_show(struct vty *vty, const struct lyd_node *dnode, bool show_defaults)
+{
+ vty_out(vty, " srv6\n");
+}
+
+static void static_srv6_cli_show_end(struct vty *vty, const struct lyd_node *dnode)
+{
+ vty_out(vty, " exit\n");
+ vty_out(vty, " !\n");
+}
+
+static void static_sids_cli_show(struct vty *vty, const struct lyd_node *dnode, bool show_defaults)
+{
+ vty_out(vty, " static-sids\n");
+}
+
+static void static_sids_cli_show_end(struct vty *vty, const struct lyd_node *dnode)
+{
+ vty_out(vty, " exit\n");
+ vty_out(vty, " !\n");
+}
+
+static void srv6_sid_cli_show(struct vty *vty, const struct lyd_node *sid, bool show_defaults)
+{
+ enum srv6_endpoint_behavior_codepoint srv6_behavior;
+ struct prefix_ipv6 sid_value;
+
+ yang_dnode_get_ipv6p(&sid_value, sid, "sid");
+
+ vty_out(vty, " sid %pFX", &sid_value);
+ vty_out(vty, " locator %s", yang_dnode_get_string(sid, "locator-name"));
+
+ srv6_behavior = yang_dnode_get_enum(sid, "behavior");
+ switch (srv6_behavior) {
+ case SRV6_ENDPOINT_BEHAVIOR_END:
+ vty_out(vty, " behavior End");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_X:
+ vty_out(vty, " behavior End.X");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT6:
+ vty_out(vty, " behavior End.DT6");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT4:
+ vty_out(vty, " behavior End.DT4");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT46:
+ vty_out(vty, " behavior End.DT46");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_NEXT_CSID:
+ vty_out(vty, " behavior uN");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_X_NEXT_CSID:
+ vty_out(vty, " behavior uA");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID:
+ vty_out(vty, " behavior uDT6");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID:
+ vty_out(vty, " behavior uDT4");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID:
+ vty_out(vty, " behavior uDT46");
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_RESERVED:
+ case SRV6_ENDPOINT_BEHAVIOR_OPAQUE:
+ vty_out(vty, " behavior unknown");
+ break;
+ }
+
+ if (yang_dnode_exists(sid, "vrf-name"))
+ vty_out(vty, " vrf %s", yang_dnode_get_string(sid, "vrf-name"));
+
+ vty_out(vty, "\n");
+}
+
+static void static_srv6_sid_cli_show(struct vty *vty, const struct lyd_node *dnode,
+ bool show_defaults)
+{
+ srv6_sid_cli_show(vty, dnode, show_defaults);
+}
+
const struct frr_yang_module_info frr_staticd_cli_info = {
.name = "frr-staticd",
.ignore_cfg_cbs = true,
@@ -1576,22 +1756,30 @@ const struct frr_yang_module_info frr_staticd_cli_info = {
}
},
{
- .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list",
+ .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing",
.cbs = {
- .cli_cmp = static_src_list_cli_cmp,
+ .cli_show = static_segment_routing_cli_show,
+ .cli_show_end = static_segment_routing_cli_show_end,
}
},
{
- .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list",
+ .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6",
.cbs = {
- .cli_cmp = static_path_list_cli_cmp,
+ .cli_show = static_srv6_cli_show,
+ .cli_show_end = static_srv6_cli_show_end,
}
},
{
- .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop",
+ .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids",
.cbs = {
- .cli_show = static_src_nexthop_cli_show,
- .cli_cmp = static_nexthop_cli_cmp,
+ .cli_show = static_sids_cli_show,
+ .cli_show_end = static_sids_cli_show_end,
+ }
+ },
+ {
+ .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids/sid",
+ .cbs = {
+ .cli_show = static_srv6_sid_cli_show,
}
},
{
@@ -1603,17 +1791,18 @@ const struct frr_yang_module_info frr_staticd_cli_info = {
#else /* ifdef INCLUDE_MGMTD_CMDDEFS_ONLY */
DEFPY_YANG(debug_staticd, debug_staticd_cmd,
- "[no] debug static [{events$events|route$route|bfd$bfd}]",
+ "[no] debug static [{events$events|route$route|bfd$bfd|srv6$srv6}]",
NO_STR DEBUG_STR STATICD_STR
"Debug events\n"
"Debug route\n"
- "Debug bfd\n")
+ "Debug bfd\n"
+ "Debug srv6\n")
{
/* If no specific category, change all */
if (strmatch(argv[argc - 1]->text, "static"))
- static_debug_set(vty->node, !no, true, true, true);
+ static_debug_set(vty->node, !no, true, true, true, true);
else
- static_debug_set(vty->node, !no, !!events, !!route, !!bfd);
+ static_debug_set(vty->node, !no, !!events, !!route, !!bfd, !!srv6);
return CMD_SUCCESS;
}
@@ -1669,6 +1858,21 @@ void static_vty_init(void)
install_element(VRF_NODE, &ipv6_route_address_interface_vrf_cmd);
install_element(CONFIG_NODE, &ipv6_route_cmd);
install_element(VRF_NODE, &ipv6_route_vrf_cmd);
+
+ install_node(&sr_node);
+ install_node(&srv6_node);
+ install_node(&srv6_sids_node);
+ install_default(SEGMENT_ROUTING_NODE);
+ install_default(SRV6_NODE);
+ install_default(SRV6_SIDS_NODE);
+
+ install_element(CONFIG_NODE, &static_segment_routing_cmd);
+ install_element(SEGMENT_ROUTING_NODE, &static_srv6_cmd);
+ install_element(SEGMENT_ROUTING_NODE, &no_static_srv6_cmd);
+ install_element(SRV6_NODE, &static_srv6_sids_cmd);
+ install_element(SRV6_SIDS_NODE, &srv6_sid_cmd);
+ install_element(SRV6_SIDS_NODE, &no_srv6_sid_cmd);
+
#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */
#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY