]> git.puffer.fish Git - matthieu/frr.git/commitdiff
staticd: Add nb callbacks to configure a nexthop for SRv6 uA behavior
authorCarmine Scarpitta <cscarpit@cisco.com>
Thu, 13 Feb 2025 09:59:40 +0000 (10:59 +0100)
committerCarmine Scarpitta <cscarpit@cisco.com>
Wed, 26 Feb 2025 06:19:51 +0000 (07:19 +0100)
An SRv6 uA SID is associated with the interface and (optionally) the
IPv6 address of the nexthop.

This commit adds the modify and destroy nortbound callbacks required to
set the nexthop.

Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
staticd/static_nb.c
staticd/static_nb.h
staticd/static_nb_config.c

index bec151e6635c2956ecdc320714219ccf7a8cab65..60dc3dc788c7775888dbc702de6672dcbed6c2b7 100644 (file)
@@ -170,6 +170,13 @@ const struct frr_yang_module_info frr_staticd_info = {
                                .destroy = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_interface_destroy,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids/sid/paths/next-hop",
+                       .cbs = {
+                               .modify = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_next_hop_modify,
+                               .destroy = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_next_hop_destroy,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids/sid/locator-name",
                        .cbs = {
index 878a78772b7a4dac6b6833ea2d04db873ca07224..282c9dcf11c5f377af14d0a037203cba4a17ada0 100644 (file)
@@ -104,6 +104,10 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routi
        struct nb_cb_modify_args *args);
 int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_interface_destroy(
        struct nb_cb_destroy_args *args);
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_next_hop_modify(
+       struct nb_cb_modify_args *args);
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_next_hop_destroy(
+       struct nb_cb_destroy_args *args);
 int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_locator_name_modify(
        struct nb_cb_modify_args *args);
 int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_locator_name_destroy(
@@ -193,7 +197,7 @@ int routing_control_plane_protocols_name_validate(
 
 #define FRR_STATIC_SRV6_SID_INTERFACE_XPATH "/paths[path-index=%u]/interface"
 
-#define FRR_STATIC_SRV6_SID_NEXTHOP_XPATH "/next-hop"
+#define FRR_STATIC_SRV6_SID_NEXTHOP_XPATH "/paths[path-index=%u]/next-hop"
 
 #ifdef __cplusplus
 }
index fb3e2d0f837d3c9650a5864f240b48cbcb37a30f..71df15fa61231bac42635432de052f126ec7a01a 100644 (file)
@@ -1284,6 +1284,58 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routi
        return NB_OK;
 }
 
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/locators/locator/static-sids/sid/paths/next-hop
+ */
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_next_hop_modify(
+       struct nb_cb_modify_args *args)
+{
+       struct static_srv6_sid *sid;
+       struct ipaddr nexthop;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+               zlog_info("validating nexthop %pI6", &nexthop.ipaddr_v6);
+               yang_dnode_get_ip(&nexthop, args->dnode, "../next-hop");
+               if (!IS_IPADDR_V6(&nexthop)) {
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "%% Nexthop must be an IPv6 address");
+                       return NB_ERR_VALIDATION;
+               }
+               break;
+       case NB_EV_ABORT:
+       case NB_EV_PREPARE:
+               break;
+       case NB_EV_APPLY:
+               sid = nb_running_get_entry(args->dnode, NULL, true);
+
+               /* Release and uninstall existing SID, if any, before requesting the new one */
+               if (CHECK_FLAG(sid->flags, STATIC_FLAG_SRV6_SID_VALID)) {
+                       static_zebra_release_srv6_sid(sid);
+                       UNSET_FLAG(sid->flags, STATIC_FLAG_SRV6_SID_VALID);
+               }
+
+               if (CHECK_FLAG(sid->flags, STATIC_FLAG_SRV6_SID_SENT_TO_ZEBRA)) {
+                       static_zebra_srv6_sid_uninstall(sid);
+                       UNSET_FLAG(sid->flags, STATIC_FLAG_SRV6_SID_SENT_TO_ZEBRA);
+               }
+
+               yang_dnode_get_ip(&nexthop, args->dnode, "../next-hop");
+               sid->attributes.nh6 = nexthop.ipaddr_v6;
+
+               break;
+       }
+
+       return NB_OK;
+}
+
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_next_hop_destroy(
+       struct nb_cb_destroy_args *args)
+{
+       return NB_OK;
+}
+
 /*
  * XPath:
  * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/locators/locator/static-sids/sid/vrf-name