]> git.puffer.fish Git - matthieu/frr.git/commitdiff
staticd: Add nb callbacks to configure an interface for SRv6 uA behavior
authorCarmine Scarpitta <cscarpit@cisco.com>
Thu, 13 Feb 2025 09:59:13 +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 interface.

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

index ef363bfe7e62be92b197003f2f53513d7db58528..bec151e6635c2956ecdc320714219ccf7a8cab65 100644 (file)
@@ -156,6 +156,20 @@ const struct frr_yang_module_info frr_staticd_info = {
                                .destroy = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_vrf_name_destroy,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids/sid/paths",
+                       .cbs = {
+                               .create = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_create,
+                               .destroy = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_destroy,
+                       }
+               },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd/segment-routing/srv6/static-sids/sid/paths/interface",
+                       .cbs = {
+                               .modify = routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_interface_modify,
+                               .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/locator-name",
                        .cbs = {
index aa11f340212ba02d7b55c6a4beecc7ccf77ed236..878a78772b7a4dac6b6833ea2d04db873ca07224 100644 (file)
@@ -96,6 +96,14 @@ 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_vrf_name_destroy(
        struct nb_cb_destroy_args *args);
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_create(
+       struct nb_cb_create_args *args);
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_destroy(
+       struct nb_cb_destroy_args *args);
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_interface_modify(
+       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_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(
@@ -183,6 +191,10 @@ int routing_control_plane_protocols_name_validate(
 
 #define FRR_STATIC_SRV6_SID_LOCATOR_NAME_XPATH "/locator-name"
 
+#define FRR_STATIC_SRV6_SID_INTERFACE_XPATH "/paths[path-index=%u]/interface"
+
+#define FRR_STATIC_SRV6_SID_NEXTHOP_XPATH "/next-hop"
+
 #ifdef __cplusplus
 }
 #endif
index e2ab1f2ffefe4520e0ae3a09b1eacba45c2d3121..fb3e2d0f837d3c9650a5864f240b48cbcb37a30f 100644 (file)
@@ -1229,6 +1229,61 @@ 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
+ */
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_create(
+       struct nb_cb_create_args *args)
+{
+       /* Actual setting is done in apply_finish */
+       return NB_OK;
+}
+
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_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/paths/interface
+ */
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_interface_modify(
+       struct nb_cb_modify_args *args)
+{
+       struct static_srv6_sid *sid;
+       const char *ifname;
+
+       if (args->event != NB_EV_APPLY)
+               return NB_OK;
+
+       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);
+       }
+
+       ifname = yang_dnode_get_string(args->dnode, "../interface");
+       snprintf(sid->attributes.ifname, sizeof(sid->attributes.ifname), "%s", ifname);
+
+       return NB_OK;
+}
+
+int routing_control_plane_protocols_control_plane_protocol_staticd_segment_routing_srv6_local_sids_sid_paths_interface_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