summaryrefslogtreecommitdiff
path: root/staticd
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2025-01-27 18:18:24 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2025-01-28 15:40:17 +0100
commit3671ce36fdcc1b74972d188250397da4e3b19f6d (patch)
treed0da324a414bdd754ef3a61aa3138d9f40816e17 /staticd
parent1d341d461e8549524f9054534fb20cec7b7c967d (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.c90
-rw-r--r--staticd/static_nb.h87
-rw-r--r--staticd/static_nb_config.c353
-rw-r--r--staticd/static_routes.c71
-rw-r--r--staticd/static_vrf.c7
-rw-r--r--staticd/static_vty.c168
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,