diff options
Diffstat (limited to 'staticd/static_vty.c')
| -rw-r--r-- | staticd/static_vty.c | 450 | 
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  | 
