]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: Add support for json output in srv6 locator detail command
authorYamato Sugawara <yamato.sugawara@linecorp.com>
Tue, 26 Oct 2021 12:21:20 +0000 (12:21 +0000)
committerYamato Sugawara <yamato.sugawara@linecorp.com>
Sun, 28 Nov 2021 23:53:41 +0000 (23:53 +0000)
Signed-off-by: Yamato Sugawara <yamato.sugawara@linecorp.com>
lib/srv6.c
lib/srv6.h
zebra/zebra_srv6_vty.c

index aacd30a7af851d972d4009af1a68cd989d524c13..6a658444c6ddb7d53bd86128086215069cf4aa29 100644 (file)
@@ -171,6 +171,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;
@@ -205,3 +246,50 @@ 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 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;
+}
index 715fc3723b3194075c25a0a8b5f5ecb3adaa5c40..e0db30cd13e1681f04cc5ee708e0ec015b95561a 100644 (file)
@@ -189,6 +189,9 @@ extern void srv6_locator_free(struct srv6_locator *locator);
 extern void srv6_locator_chunk_free(struct srv6_locator_chunk *chunk);
 json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk);
 json_object *srv6_locator_json(const struct srv6_locator *loc);
+json_object *srv6_locator_detailed_json(const struct srv6_locator *loc);
+json_object *
+srv6_locator_chunk_detailed_json(const struct srv6_locator_chunk *chunk);
 
 #ifdef __cplusplus
 }
index cb1e6c42283ad41330f986ba97e1c4cea8af1931..bf87696204ff47aa5200bd520b5c0d9b360695a0 100644 (file)
@@ -147,10 +147,16 @@ DEFUN (show_srv6_locator_detail,
        struct listnode *node;
        char str[256];
        const char *locator_name = argv[4]->arg;
+       json_object *json_locator = NULL;
 
        if (uj) {
-               vty_out(vty, "JSON format isn't supported\n");
-               return CMD_WARNING;
+               locator = zebra_srv6_locator_lookup(locator_name);
+               if (!locator)
+                       return CMD_WARNING;
+
+               json_locator = srv6_locator_detailed_json(locator);
+               vty_json(vty, json_locator);
+               return CMD_SUCCESS;
        }
 
        for (ALL_LIST_ELEMENTS_RO(srv6->locators, node, locator)) {