]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Add support for SRv6 SIDs
authorCarmine Scarpitta <cscarpit@cisco.com>
Mon, 6 May 2024 15:44:18 +0000 (17:44 +0200)
committerCarmine Scarpitta <cscarpit@cisco.com>
Thu, 13 Jun 2024 12:54:16 +0000 (14:54 +0200)
Add a data structure to represent an SRv6 SID context and the related
management functions (allocate/free).

Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
lib/srv6.c
lib/srv6.h

index 1f485fb8ac8d93ee55a83e6377b899ce0c57038e..883d429b621adf9702db4ebad213daf8600f985f 100644 (file)
@@ -14,6 +14,7 @@ DEFINE_QOBJ_TYPE(srv6_sid_format);
 DEFINE_MTYPE_STATIC(LIB, SRV6_LOCATOR, "SRV6 locator");
 DEFINE_MTYPE_STATIC(LIB, SRV6_LOCATOR_CHUNK, "SRV6 locator chunk");
 DEFINE_MTYPE_STATIC(LIB, SRV6_SID_FORMAT, "SRv6 SID format");
+DEFINE_MTYPE_STATIC(LIB, SRV6_SID_CTX, "SRv6 SID context");
 
 const char *seg6local_action2str(uint32_t action)
 {
@@ -201,6 +202,29 @@ void delete_srv6_sid_format(void *val)
        srv6_sid_format_free((struct srv6_sid_format *)val);
 }
 
+struct srv6_sid_ctx *srv6_sid_ctx_alloc(enum seg6local_action_t behavior,
+                                       struct in_addr *nh4,
+                                       struct in6_addr *nh6, vrf_id_t vrf_id)
+{
+       struct srv6_sid_ctx *ctx = NULL;
+
+       ctx = XCALLOC(MTYPE_SRV6_SID_CTX, sizeof(struct srv6_sid_ctx));
+       ctx->behavior = behavior;
+       if (nh4)
+               ctx->nh4 = *nh4;
+       if (nh6)
+               ctx->nh6 = *nh6;
+       if (vrf_id)
+               ctx->vrf_id = vrf_id;
+
+       return ctx;
+}
+
+void srv6_sid_ctx_free(struct srv6_sid_ctx *ctx)
+{
+       XFREE(MTYPE_SRV6_SID_CTX, ctx);
+}
+
 json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk)
 {
        json_object *jo_root = NULL;
index 4a6ea5c72beabe5badd4c3b4b346e53d2815b298..01b0820133461aa882cd8c43da8deeecf7fe118c 100644 (file)
@@ -246,6 +246,17 @@ struct srv6_sid_format {
 };
 DECLARE_QOBJ_TYPE(srv6_sid_format);
 
+/* Context for an SRv6 SID */
+struct srv6_sid_ctx {
+       /* Behavior associated with the SID */
+       enum seg6local_action_t behavior;
+
+       /* Behavior-specific attributes */
+       struct in_addr nh4;
+       struct in6_addr nh6;
+       vrf_id_t vrf_id;
+};
+
 static inline const char *seg6_mode2str(enum seg6_mode_t mode)
 {
        switch (mode) {
@@ -309,6 +320,54 @@ const char *seg6local_context2str(char *str, size_t size,
                                  const struct seg6local_context *ctx,
                                  uint32_t action);
 
+static inline const char *srv6_sid_ctx2str(char *str, size_t size,
+                                          const struct srv6_sid_ctx *ctx)
+{
+       int len = 0;
+
+       len += snprintf(str + len, size - len, "%s",
+                       seg6local_action2str(ctx->behavior));
+
+       switch (ctx->behavior) {
+       case ZEBRA_SEG6_LOCAL_ACTION_UNSPEC:
+               break;
+
+       case ZEBRA_SEG6_LOCAL_ACTION_END:
+               len += snprintf(str + len, size - len, " USP");
+               break;
+
+       case ZEBRA_SEG6_LOCAL_ACTION_END_X:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DX6:
+               len += snprintfrr(str + len, size - len, " nh6 %pI6", &ctx->nh6);
+               break;
+
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DX4:
+               len += snprintfrr(str + len, size - len, " nh4 %pI4", &ctx->nh4);
+               break;
+
+       case ZEBRA_SEG6_LOCAL_ACTION_END_T:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DT6:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DT4:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DT46:
+               len += snprintf(str + len, size - len, " vrf_id %u",
+                               ctx->vrf_id);
+               break;
+
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DX2:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_B6:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_B6_ENCAP:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_BM:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_S:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_AS:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_AM:
+       case ZEBRA_SEG6_LOCAL_ACTION_END_BPF:
+       default:
+               len += snprintf(str + len, size - len, " unknown(%s)", __func__);
+       }
+
+       return str;
+}
+
 int snprintf_seg6_segs(char *str,
                size_t size, const struct seg6_segs *segs);
 
@@ -329,6 +388,12 @@ extern struct srv6_sid_format *srv6_sid_format_alloc(const char *name);
 extern void srv6_sid_format_free(struct srv6_sid_format *format);
 extern void delete_srv6_sid_format(void *format);
 
+extern struct srv6_sid_ctx *srv6_sid_ctx_alloc(enum seg6local_action_t behavior,
+                                              struct in_addr *nh4,
+                                              struct in6_addr *nh6,
+                                              vrf_id_t vrf_id);
+extern void srv6_sid_ctx_free(struct srv6_sid_ctx *ctx);
+
 #ifdef __cplusplus
 }
 #endif