diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2025-01-27 18:18:24 +0100 | 
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2025-01-28 15:40:17 +0100 | 
| commit | 3671ce36fdcc1b74972d188250397da4e3b19f6d (patch) | |
| tree | d0da324a414bdd754ef3a61aa3138d9f40816e17 /staticd | |
| parent | 1d341d461e8549524f9054534fb20cec7b7c967d (diff) | |
staticd: fix botched staticd YANG for dst-src
The staticd YANG conversion completely f*cked up dst-src routes.
Stupidly enough, the correct thing is much simpler as seen by the amount
of deletes in this commit.
This does, unfortunately, involve a rather annoying YANG edge case with
what should reasonably be an optional leaf as part of a list key, which
is not possible.  It uses `::/0` as unconditional filler instead, since
that is semantically correct.
The `test_yang_mgmt` topotest needed to be adjusted after this to add
`src-prefix='::/0'`.
Fixes: 88fa5104a04a ("staticd : Configuration northbound implementation")
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'staticd')
| -rw-r--r-- | staticd/static_nb.c | 90 | ||||
| -rw-r--r-- | staticd/static_nb.h | 87 | ||||
| -rw-r--r-- | staticd/static_nb_config.c | 353 | ||||
| -rw-r--r-- | staticd/static_routes.c | 71 | ||||
| -rw-r--r-- | staticd/static_vrf.c | 7 | ||||
| -rw-r--r-- | staticd/static_vty.c | 168 | 
6 files changed, 66 insertions, 710 deletions
diff --git a/staticd/static_nb.c b/staticd/static_nb.c index 356324126a..ef363bfe7e 100644 --- a/staticd/static_nb.c +++ b/staticd/static_nb.c @@ -135,96 +135,6 @@ const struct frr_yang_module_info frr_staticd_info = {  			}  		},  		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list", -			.cbs = { -				.create = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_create, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list", -			.cbs = { -				.create = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_create, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/tag", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_tag_modify, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop", -			.cbs = { -				.apply_finish = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_apply_finish, -				.create = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_create, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_destroy, -				.pre_validate = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_path_list_frr_nexthops_nexthop_pre_validate, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/bh-type", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_bh_type_modify, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/onlink", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_onlink_modify, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/srte-color", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_color_modify, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_color_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/srv6-segs-stack/entry", -			.cbs = { -				.create = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_create, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/srv6-segs-stack/entry/seg", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_seg_modify, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_seg_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry", -			.cbs = { -				.create = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_create, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry/label", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_label_modify, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_label_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry/ttl", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_ttl_modify, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_ttl_destroy, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry/traffic-class", -			.cbs = { -				.modify = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_traffic_class_modify, -				.destroy = routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_traffic_class_destroy, -			} -		}, -		{  			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids/sid",  			.cbs = {  				.apply_finish = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_apply_finish, diff --git a/staticd/static_nb.h b/staticd/static_nb.h index d11bf5363b..aa11f34021 100644 --- a/staticd/static_nb.h +++ b/staticd/static_nb.h @@ -72,52 +72,6 @@ int route_next_hop_bfd_source_destroy(struct nb_cb_destroy_args *args);  int route_next_hop_bfd_profile_modify(struct nb_cb_modify_args *args);  int route_next_hop_bfd_profile_destroy(struct nb_cb_destroy_args *args);  int route_next_hop_bfd_multi_hop_modify(struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_create( -	struct nb_cb_create_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_create( -	struct nb_cb_create_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_tag_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_create( -	struct nb_cb_create_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_bh_type_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_onlink_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_color_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_color_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_create( -	struct nb_cb_create_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_seg_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_seg_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_create( -	struct nb_cb_create_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_label_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_label_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_ttl_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_ttl_destroy( -	struct nb_cb_destroy_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_traffic_class_modify( -	struct nb_cb_modify_args *args); -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_traffic_class_destroy( -	struct nb_cb_destroy_args *args);  int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_create(  	struct nb_cb_create_args *args);  int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_destroy( @@ -151,8 +105,6 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routi  void routing_control_plane_protocols_control_plane_protocol_staticd_route_list_path_list_frr_nexthops_nexthop_apply_finish(  	struct nb_cb_apply_finish_args *args); -void routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_apply_finish( -	struct nb_cb_apply_finish_args *args);  void routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_apply_finish(  	struct nb_cb_apply_finish_args *args); @@ -169,16 +121,16 @@ int routing_control_plane_protocols_name_validate(  /* xpath macros */  /* route-list */ -#define FRR_STATIC_ROUTE_INFO_KEY_XPATH                                        \ -	"/frr-routing:routing/control-plane-protocols/"                        \ -	"control-plane-protocol[type='%s'][name='%s'][vrf='%s']/"              \ -	"frr-staticd:staticd/route-list[prefix='%s'][afi-safi='%s']/"          \ +#define FRR_STATIC_ROUTE_INFO_KEY_XPATH                                                            \ +	"/frr-routing:routing/control-plane-protocols/"                                            \ +	"control-plane-protocol[type='%s'][name='%s'][vrf='%s']/"                                  \ +	"frr-staticd:staticd/route-list[prefix='%s'][src-prefix='%s'][afi-safi='%s']/"             \  	"path-list[table-id='%u'][distance='%u']" -#define FRR_STATIC_ROUTE_INFO_KEY_NO_DISTANCE_XPATH                            \ -	"/frr-routing:routing/control-plane-protocols/"                        \ -	"control-plane-protocol[type='%s'][name='%s'][vrf='%s']/"              \ -	"frr-staticd:staticd/route-list[prefix='%s'][afi-safi='%s']/"          \ +#define FRR_STATIC_ROUTE_INFO_KEY_NO_DISTANCE_XPATH                                                \ +	"/frr-routing:routing/control-plane-protocols/"                                            \ +	"control-plane-protocol[type='%s'][name='%s'][vrf='%s']/"                                  \ +	"frr-staticd:staticd/route-list[prefix='%s'][src-prefix='%s'][afi-safi='%s']/"             \  	"path-list[table-id='%u']" @@ -203,19 +155,6 @@ int routing_control_plane_protocols_name_validate(  #define FRR_STATIC_ROUTE_NH_SRV6_KEY_SEG_XPATH "/entry[id='%u']/seg" -/* route-list/srclist */ -#define FRR_S_ROUTE_SRC_INFO_KEY_XPATH                                         \ -	"/frr-routing:routing/control-plane-protocols/"                        \ -	"control-plane-protocol[type='%s'][name='%s'][vrf='%s']/"              \ -	"frr-staticd:staticd/route-list[prefix='%s'][afi-safi='%s']/"          \ -	"src-list[src-prefix='%s']/path-list[table-id='%u'][distance='%u']" - -#define FRR_S_ROUTE_SRC_INFO_KEY_NO_DISTANCE_XPATH                             \ -	"/frr-routing:routing/control-plane-protocols/"                        \ -	"control-plane-protocol[type='%s'][name='%s'][vrf='%s']/"              \ -	"frr-staticd:staticd/route-list[prefix='%s'][afi-safi='%s']/"          \ -	"src-list[src-prefix='%s']/path-list[table-id='%u']" -  /* route-list/frr-nexthops */  #define FRR_DEL_S_ROUTE_NH_KEY_XPATH                                           \  	FRR_STATIC_ROUTE_INFO_KEY_XPATH                                        \ @@ -226,16 +165,6 @@ int routing_control_plane_protocols_name_validate(  	FRR_STATIC_ROUTE_INFO_KEY_NO_DISTANCE_XPATH                            \  	FRR_STATIC_ROUTE_NH_KEY_XPATH -/* route-list/src/src-list/frr-nexthops*/ -#define FRR_DEL_S_ROUTE_SRC_NH_KEY_XPATH                                       \ -	FRR_S_ROUTE_SRC_INFO_KEY_XPATH                                         \ -	FRR_STATIC_ROUTE_NH_KEY_XPATH - -/* route-list/src/src-list/frr-nexthops*/ -#define FRR_DEL_S_ROUTE_SRC_NH_KEY_NO_DISTANCE_XPATH                           \ -	FRR_S_ROUTE_SRC_INFO_KEY_NO_DISTANCE_XPATH                             \ -	FRR_STATIC_ROUTE_NH_KEY_XPATH -  /* srv6 */  #define FRR_STATIC_SRV6_INFO_KEY_XPATH                                                             \  	"/frr-routing:routing/control-plane-protocols/"                                            \ diff --git a/staticd/static_nb_config.c b/staticd/static_nb_config.c index 51de05c2ea..e2ab1f2ffe 100644 --- a/staticd/static_nb_config.c +++ b/staticd/static_nb_config.c @@ -502,16 +502,6 @@ void routing_control_plane_protocols_control_plane_protocol_staticd_route_list_p  	static_install_nexthop(nh);  } -void routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_apply_finish( -	struct nb_cb_apply_finish_args *args) -{ -	struct static_nexthop *nh; - -	nh = nb_running_get_entry(args->dnode, NULL, true); - -	static_install_nexthop(nh); -} -  int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_path_list_frr_nexthops_nexthop_pre_validate(  	struct nb_cb_pre_validate_args *args)  { @@ -576,7 +566,7 @@ int routing_control_plane_protocols_staticd_destroy(  		if (!stable)  			continue; -		for (rn = route_top(stable); rn; rn = route_next(rn)) +		for (rn = route_top(stable); rn; rn = srcdest_route_next(rn))  			static_del_route(rn);  	} @@ -595,7 +585,7 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_cr  	struct static_vrf *svrf;  	struct route_node *rn;  	const struct lyd_node *vrf_dnode; -	struct prefix prefix; +	struct prefix prefix, src_prefix, *src_p;  	const char *afi_safi;  	afi_t prefix_afi;  	afi_t afi; @@ -604,6 +594,8 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_cr  	switch (args->event) {  	case NB_EV_VALIDATE:  		yang_dnode_get_prefix(&prefix, args->dnode, "prefix"); +		yang_dnode_get_prefix(&src_prefix, args->dnode, "src-prefix"); +		src_p = src_prefix.prefixlen ? &src_prefix : NULL;  		afi_safi = yang_dnode_get_string(args->dnode, "afi-safi");  		yang_afi_safi_identity2value(afi_safi, &afi, &safi);  		prefix_afi = family2afi(prefix.family); @@ -614,6 +606,14 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_cr  				yang_dnode_get_string(args->dnode, "prefix"));  			return NB_ERR_VALIDATION;  		} + +		if (src_p && afi != AFI_IP6) { +			flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE, +				  "invalid use of IPv6 dst-src prefix %s on %s", +				  yang_dnode_get_string(args->dnode, "src-prefix"), +				  yang_dnode_get_string(args->dnode, "prefix")); +			return NB_ERR_VALIDATION; +		}  		break;  	case NB_EV_PREPARE:  	case NB_EV_ABORT: @@ -624,10 +624,12 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_cr  		svrf = nb_running_get_entry(vrf_dnode, NULL, true);  		yang_dnode_get_prefix(&prefix, args->dnode, "prefix"); +		yang_dnode_get_prefix(&src_prefix, args->dnode, "src-prefix"); +		src_p = src_prefix.prefixlen ? &src_prefix : NULL;  		afi_safi = yang_dnode_get_string(args->dnode, "afi-safi");  		yang_afi_safi_identity2value(afi_safi, &afi, &safi); -		rn = static_add_route(afi, safi, &prefix, NULL, svrf); +		rn = static_add_route(afi, safi, &prefix, (struct prefix_ipv6 *)src_p, svrf);  		if (!svrf->vrf || svrf->vrf->vrf_id == VRF_UNKNOWN)  			snprintf(  				args->errmsg, args->errmsg_len, @@ -1048,331 +1050,6 @@ int route_next_hop_bfd_profile_destroy(struct nb_cb_destroy_args *args)  /*   * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_create( -	struct nb_cb_create_args *args) -{ -	struct static_vrf *s_vrf; -	struct route_node *rn; -	struct route_node *src_rn; -	struct prefix_ipv6 src_prefix = {}; -	struct stable_info *info; -	afi_t afi; -	safi_t safi = SAFI_UNICAST; - -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -		break; -	case NB_EV_APPLY: -		rn = nb_running_get_entry(args->dnode, NULL, true); -		info = route_table_get_info(rn->table); -		s_vrf = info->svrf; -		yang_dnode_get_ipv6p(&src_prefix, args->dnode, "src-prefix"); -		afi = family2afi(src_prefix.family); -		src_rn = -			static_add_route(afi, safi, &rn->p, &src_prefix, s_vrf); -		nb_running_set_entry(args->dnode, src_rn); -		break; -	} -	return NB_OK; -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_destroy( -	struct nb_cb_destroy_args *args) -{ -	struct route_node *src_rn; - -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -		break; -	case NB_EV_APPLY: -		src_rn = nb_running_unset_entry(args->dnode); -		static_del_route(src_rn); -		break; -	} - -	return NB_OK; -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_create( -	struct nb_cb_create_args *args) -{ -	return static_path_list_create(args); -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_destroy( -	struct nb_cb_destroy_args *args) -{ -	return static_path_list_destroy(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/tag - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_tag_modify( -	struct nb_cb_modify_args *args) -{ -	return static_path_list_tag_modify(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_create( -	struct nb_cb_create_args *args) -{ -	return static_nexthop_create(args); -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_destroy( -	struct nb_cb_destroy_args *args) -{ -	return static_nexthop_destroy(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/bh-type - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_bh_type_modify( -	struct nb_cb_modify_args *args) -{ -	return static_nexthop_bh_type_modify(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/onlink - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_onlink_modify( -	struct nb_cb_modify_args *args) -{ -	return static_nexthop_onlink_modify(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/srte-color - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_color_modify( -	struct nb_cb_modify_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -		break; -	case NB_EV_APPLY: -		if (static_nexthop_color_modify(args) != NB_OK) -			return NB_ERR; - -		break; -	} -	return NB_OK; -} - - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_color_destroy( -	struct nb_cb_destroy_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -		break; -	case NB_EV_APPLY: -		if (static_nexthop_color_destroy(args) != NB_OK) -			return NB_ERR; -		break; -	} -	return NB_OK; -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/srv6-segs-stack/entry - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_create( -	struct nb_cb_create_args *args) -{ -	return nexthop_srv6_segs_stack_entry_create(args); -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_destroy( -	struct nb_cb_destroy_args *args) -{ -	return nexthop_srv6_segs_stack_entry_destroy(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/srv6-segs-stack/entry/seg - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_seg_modify( -	struct nb_cb_modify_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -		break; -	case NB_EV_APPLY: -		if (static_nexthop_srv6_segs_modify(args) != NB_OK) -			return NB_ERR; -		break; -	} -	return NB_OK; -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_srv6_segs_stack_entry_seg_destroy( -	struct nb_cb_destroy_args *args) -{ -	/* -	 * No operation is required in this call back. -	 * nexthop_mpls_seg_stack_entry_destroy() will take care -	 * to reset the seg vaue. -	 */ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -	case NB_EV_APPLY: -		break; -	} -	return NB_OK; -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_create( -	struct nb_cb_create_args *args) -{ -	return nexthop_mpls_label_stack_entry_create(args); -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_destroy( -	struct nb_cb_destroy_args *args) -{ -	return nexthop_mpls_label_stack_entry_destroy(args); -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry/label - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_label_modify( -	struct nb_cb_modify_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -		break; -	case NB_EV_APPLY: -		if (static_nexthop_mpls_label_modify(args) != NB_OK) -			return NB_ERR; -		break; -	} -	return NB_OK; -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_label_destroy( -	struct nb_cb_destroy_args *args) -{ -	/* -	 * No operation is required in this call back. -	 * nexthop_mpls_label_stack_entry_destroy() will take care -	 * to reset the label vaue. -	 */ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -	case NB_EV_APPLY: -		break; -	} -	return NB_OK; -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry/ttl - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_ttl_modify( -	struct nb_cb_modify_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -	case NB_EV_APPLY: -		break; -	} - -	return NB_OK; -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_ttl_destroy( -	struct nb_cb_destroy_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -	case NB_EV_APPLY: -		break; -	} - -	return NB_OK; -} - -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop/mpls-label-stack/entry/traffic-class - */ -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_traffic_class_modify( -	struct nb_cb_modify_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -	case NB_EV_APPLY: -		break; -	} - -	return NB_OK; -} - -int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_src_list_path_list_frr_nexthops_nexthop_mpls_label_stack_entry_traffic_class_destroy( -	struct nb_cb_destroy_args *args) -{ -	switch (args->event) { -	case NB_EV_VALIDATE: -	case NB_EV_PREPARE: -	case NB_EV_ABORT: -	case NB_EV_APPLY: -		break; -	} - -	return NB_OK; -} - -/* - * XPath:   * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing   */  int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_create( diff --git a/staticd/static_routes.c b/staticd/static_routes.c index cba38183bb..cbe1c3c8c0 100644 --- a/staticd/static_routes.c +++ b/staticd/static_routes.c @@ -33,10 +33,6 @@ void zebra_stable_node_cleanup(struct route_table *table,  	struct static_nexthop *nh;  	struct static_path *pn;  	struct static_route_info *si; -	struct route_table *src_table; -	struct route_node *src_node; -	struct static_path *src_pn; -	struct static_route_info *src_si;  	si = node->info; @@ -50,36 +46,6 @@ void zebra_stable_node_cleanup(struct route_table *table,  			static_path_list_del(&si->path_list, pn);  			XFREE(MTYPE_STATIC_PATH, pn);  		} - -		/* clean up for dst table */ -		src_table = srcdest_srcnode_table(node); -		if (src_table) { -			/* This means the route_node is part of the top -			 * hierarchy and refers to a destination prefix. -			 */ -			for (src_node = route_top(src_table); src_node; -			     src_node = route_next(src_node)) { -				src_si = src_node->info; - -				frr_each_safe(static_path_list, -					      &src_si->path_list, src_pn) { -					frr_each_safe(static_nexthop_list, -						      &src_pn->nexthop_list, -						      nh) { -						static_nexthop_list_del( -							&src_pn->nexthop_list, -							nh); -						XFREE(MTYPE_STATIC_NEXTHOP, nh); -					} -					static_path_list_del(&src_si->path_list, -							     src_pn); -					XFREE(MTYPE_STATIC_PATH, src_pn); -				} - -				XFREE(MTYPE_STATIC_ROUTE, src_node->info); -			} -		} -  		XFREE(MTYPE_STATIC_ROUTE, node->info);  	}  } @@ -124,28 +90,10 @@ struct route_node *static_add_route(afi_t afi, safi_t safi, struct prefix *p,  	return rn;  } -/* To delete the srcnodes */ -static void static_del_src_route(struct route_node *rn) -{ -	struct static_path *pn; -	struct static_route_info *si; - -	si = rn->info; - -	frr_each_safe(static_path_list, &si->path_list, pn) { -		static_del_path(pn); -	} - -	XFREE(MTYPE_STATIC_ROUTE, rn->info); -	route_unlock_node(rn); -} -  void static_del_route(struct route_node *rn)  {  	struct static_path *pn;  	struct static_route_info *si; -	struct route_table *src_table; -	struct route_node *src_node;  	si = rn->info; @@ -153,17 +101,6 @@ void static_del_route(struct route_node *rn)  		static_del_path(pn);  	} -	/* clean up for dst table */ -	src_table = srcdest_srcnode_table(rn); -	if (src_table) { -		/* This means the route_node is part of the top hierarchy -		 * and refers to a destination prefix. -		 */ -		for (src_node = route_top(src_table); src_node; -		     src_node = route_next(src_node)) { -			static_del_src_route(src_node); -		} -	}  	XFREE(MTYPE_STATIC_ROUTE, rn->info);  	route_unlock_node(rn);  } @@ -477,7 +414,7 @@ static void static_fixup_vrf(struct vrf *vrf, struct route_table *stable,  	struct static_path *pn;  	struct static_route_info *si; -	for (rn = route_top(stable); rn; rn = route_next(rn)) { +	for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) {  		si = static_route_info_from_rnode(rn);  		if (!si)  			continue; @@ -517,7 +454,7 @@ static void static_enable_vrf(struct route_table *stable, afi_t afi, safi_t safi  	struct static_path *pn;  	struct static_route_info *si; -	for (rn = route_top(stable); rn; rn = route_next(rn)) { +	for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) {  		si = static_route_info_from_rnode(rn);  		if (!si)  			continue; @@ -575,7 +512,7 @@ static void static_cleanup_vrf(struct vrf *vrf, struct route_table *stable,  	struct static_path *pn;  	struct static_route_info *si; -	for (rn = route_top(stable); rn; rn = route_next(rn)) { +	for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) {  		si = static_route_info_from_rnode(rn);  		if (!si)  			continue; @@ -608,7 +545,7 @@ static void static_disable_vrf(struct route_table *stable,  	struct static_path *pn;  	struct static_route_info *si; -	for (rn = route_top(stable); rn; rn = route_next(rn)) { +	for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) {  		si = static_route_info_from_rnode(rn);  		if (!si)  			continue; diff --git a/staticd/static_vrf.c b/staticd/static_vrf.c index 710827a9ff..78bc30500b 100644 --- a/staticd/static_vrf.c +++ b/staticd/static_vrf.c @@ -51,10 +51,8 @@ struct static_vrf *static_vrf_alloc(const char *name)  	for (afi = AFI_IP; afi <= AFI_IP6; afi++) {  		for (safi = SAFI_UNICAST; safi <= SAFI_MULTICAST; safi++) { -			if (afi == AFI_IP6) -				table = srcdest_table_init(); -			else -				table = route_table_init(); +			table = srcdest_table_init(); +			table->cleanup = zebra_stable_node_cleanup;  			info = XCALLOC(MTYPE_STATIC_RTABLE_INFO,  				       sizeof(struct stable_info)); @@ -63,7 +61,6 @@ struct static_vrf *static_vrf_alloc(const char *name)  			info->safi = safi;  			route_table_set_info(table, info); -			table->cleanup = zebra_stable_node_cleanup;  			svrf->stable[afi][safi] = table;  		}  	} diff --git a/staticd/static_vty.c b/staticd/static_vty.c index 2fadc1f0d4..ed2805d3ea 100644 --- a/staticd/static_vty.c +++ b/staticd/static_vty.c @@ -79,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; @@ -116,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: @@ -146,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; @@ -183,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 @@ -218,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); @@ -412,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) { @@ -1439,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; @@ -1455,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"); @@ -1476,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) { @@ -1582,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, @@ -1658,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); @@ -1673,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, @@ -1831,25 +1756,6 @@ 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", -			.cbs = { -				.cli_cmp = static_src_list_cli_cmp, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list", -			.cbs = { -				.cli_cmp = static_path_list_cli_cmp, -			} -		}, -		{ -			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/route-list/src-list/path-list/frr-nexthops/nexthop", -			.cbs = { -				.cli_show = static_src_nexthop_cli_show, -				.cli_cmp = static_nexthop_cli_cmp, -			} -		}, -		{  			.xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing",  			.cbs = {  				.cli_show = static_segment_routing_cli_show,  | 
