]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/srv6.c
Merge pull request #12708 from donaldsharp/no_notification
[mirror_frr.git] / lib / srv6.c
index aacd30a7af851d972d4009af1a68cd989d524c13..f4077a86d228c3b0c3a0637b6e5fb5c834260578 100644 (file)
@@ -57,6 +57,8 @@ const char *seg6local_action2str(uint32_t action)
                return "End.AS";
        case ZEBRA_SEG6_LOCAL_ACTION_END_AM:
                return "End.AM";
+       case ZEBRA_SEG6_LOCAL_ACTION_END_DT46:
+               return "End.DT46";
        case ZEBRA_SEG6_LOCAL_ACTION_UNSPEC:
                return "unspec";
        default:
@@ -83,8 +85,6 @@ const char *seg6local_context2str(char *str, size_t size,
                                  const struct seg6local_context *ctx,
                                  uint32_t action)
 {
-       char b0[128];
-
        switch (action) {
 
        case ZEBRA_SEG6_LOCAL_ACTION_END:
@@ -93,18 +93,17 @@ const char *seg6local_context2str(char *str, size_t size,
 
        case ZEBRA_SEG6_LOCAL_ACTION_END_X:
        case ZEBRA_SEG6_LOCAL_ACTION_END_DX6:
-               inet_ntop(AF_INET6, &ctx->nh6, b0, 128);
-               snprintf(str, size, "nh6 %s", b0);
+               snprintfrr(str, size, "nh6 %pI6", &ctx->nh6);
                return str;
 
        case ZEBRA_SEG6_LOCAL_ACTION_END_DX4:
-               inet_ntop(AF_INET, &ctx->nh4, b0, 128);
-               snprintf(str, size, "nh4 %s", b0);
+               snprintfrr(str, size, "nh4 %pI4", &ctx->nh4);
                return str;
 
        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:
                snprintf(str, size, "table %u", ctx->table);
                return str;
 
@@ -122,6 +121,13 @@ const char *seg6local_context2str(char *str, size_t size,
        }
 }
 
+static void srv6_locator_chunk_list_free(void *data)
+{
+       struct srv6_locator_chunk *chunk = data;
+
+       srv6_locator_chunk_free(&chunk);
+}
+
 struct srv6_locator *srv6_locator_alloc(const char *name)
 {
        struct srv6_locator *locator = NULL;
@@ -129,7 +135,7 @@ struct srv6_locator *srv6_locator_alloc(const char *name)
        locator = XCALLOC(MTYPE_SRV6_LOCATOR, sizeof(struct srv6_locator));
        strlcpy(locator->name, name, sizeof(locator->name));
        locator->chunks = list_new();
-       locator->chunks->del = (void (*)(void *))srv6_locator_chunk_free;
+       locator->chunks->del = srv6_locator_chunk_list_free;
 
        QOBJ_REG(locator, srv6_locator);
        return locator;
@@ -154,9 +160,9 @@ void srv6_locator_free(struct srv6_locator *locator)
        }
 }
 
-void srv6_locator_chunk_free(struct srv6_locator_chunk *chunk)
+void srv6_locator_chunk_free(struct srv6_locator_chunk **chunk)
 {
-       XFREE(MTYPE_SRV6_LOCATOR_CHUNK, chunk);
+       XFREE(MTYPE_SRV6_LOCATOR_CHUNK, *chunk);
 }
 
 json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk)
@@ -171,6 +177,47 @@ json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk)
        return jo_root;
 }
 
+json_object *
+srv6_locator_chunk_detailed_json(const struct srv6_locator_chunk *chunk)
+{
+       json_object *jo_root = NULL;
+
+       jo_root = json_object_new_object();
+
+       /* set prefix */
+       json_object_string_addf(jo_root, "prefix", "%pFX", &chunk->prefix);
+
+       /* set block_bits_length */
+       json_object_int_add(jo_root, "blockBitsLength",
+                           chunk->block_bits_length);
+
+       /* set node_bits_length */
+       json_object_int_add(jo_root, "nodeBitsLength", chunk->node_bits_length);
+
+       /* set function_bits_length */
+       json_object_int_add(jo_root, "functionBitsLength",
+                           chunk->function_bits_length);
+
+       /* set argument_bits_length */
+       json_object_int_add(jo_root, "argumentBitsLength",
+                           chunk->argument_bits_length);
+
+       /* set keep */
+       json_object_int_add(jo_root, "keep", chunk->keep);
+
+       /* set proto */
+       json_object_string_add(jo_root, "proto",
+                              zebra_route_string(chunk->proto));
+
+       /* set instance */
+       json_object_int_add(jo_root, "instance", chunk->instance);
+
+       /* set session_id */
+       json_object_int_add(jo_root, "sessionId", chunk->session_id);
+
+       return jo_root;
+}
+
 json_object *srv6_locator_json(const struct srv6_locator *loc)
 {
        struct listnode *node;
@@ -187,10 +234,24 @@ json_object *srv6_locator_json(const struct srv6_locator *loc)
        /* set prefix */
        json_object_string_addf(jo_root, "prefix", "%pFX", &loc->prefix);
 
+       /* set block_bits_length */
+       json_object_int_add(jo_root, "blockBitsLength", loc->block_bits_length);
+
+       /* set node_bits_length */
+       json_object_int_add(jo_root, "nodeBitsLength", loc->node_bits_length);
+
        /* set function_bits_length */
        json_object_int_add(jo_root, "functionBitsLength",
                            loc->function_bits_length);
 
+       /* set argument_bits_length */
+       json_object_int_add(jo_root, "argumentBitsLength",
+                           loc->argument_bits_length);
+
+       /* set true if the locator is a Micro-segment (uSID) locator */
+       if (CHECK_FLAG(loc->flags, SRV6_LOCATOR_USID))
+               json_object_string_add(jo_root, "behavior", "usid");
+
        /* set status_up */
        json_object_boolean_add(jo_root, "statusUp",
                                loc->status_up);
@@ -205,3 +266,54 @@ json_object *srv6_locator_json(const struct srv6_locator *loc)
 
        return jo_root;
 }
+
+json_object *srv6_locator_detailed_json(const struct srv6_locator *loc)
+{
+       struct listnode *node;
+       struct srv6_locator_chunk *chunk;
+       json_object *jo_root = NULL;
+       json_object *jo_chunk = NULL;
+       json_object *jo_chunks = NULL;
+
+       jo_root = json_object_new_object();
+
+       /* set name */
+       json_object_string_add(jo_root, "name", loc->name);
+
+       /* set prefix */
+       json_object_string_addf(jo_root, "prefix", "%pFX", &loc->prefix);
+
+       /* set block_bits_length */
+       json_object_int_add(jo_root, "blockBitsLength", loc->block_bits_length);
+
+       /* set node_bits_length */
+       json_object_int_add(jo_root, "nodeBitsLength", loc->node_bits_length);
+
+       /* set function_bits_length */
+       json_object_int_add(jo_root, "functionBitsLength",
+                           loc->function_bits_length);
+
+       /* set argument_bits_length */
+       json_object_int_add(jo_root, "argumentBitsLength",
+                           loc->argument_bits_length);
+
+       /* set true if the locator is a Micro-segment (uSID) locator */
+       if (CHECK_FLAG(loc->flags, SRV6_LOCATOR_USID))
+               json_object_string_add(jo_root, "behavior", "usid");
+
+       /* set algonum */
+       json_object_int_add(jo_root, "algoNum", loc->algonum);
+
+       /* set status_up */
+       json_object_boolean_add(jo_root, "statusUp", loc->status_up);
+
+       /* set chunks */
+       jo_chunks = json_object_new_array();
+       json_object_object_add(jo_root, "chunks", jo_chunks);
+       for (ALL_LIST_ELEMENTS_RO((struct list *)loc->chunks, node, chunk)) {
+               jo_chunk = srv6_locator_chunk_detailed_json(chunk);
+               json_object_array_add(jo_chunks, jo_chunk);
+       }
+
+       return jo_root;
+}