summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorChristian Hopps <chopps@labn.net>2024-12-30 04:31:21 +0100
committerChristian Hopps <chopps@labn.net>2025-01-07 11:33:32 +0100
commit153c06043bc570c5ed1f6a0a0bf7751f625b8834 (patch)
tree1ea53a51efa5be2ecaab9a5b5806cb60b5965ffd /tools
parentlib: northbound: add new get() callback to add lyd_node direclty (diff)
downloadfrr-153c06043bc570c5ed1f6a0a0bf7751f625b8834.tar.xz
frr-153c06043bc570c5ed1f6a0a0bf7751f625b8834.zip
tools: add new-style get operation callback support
Signed-off-by: Christian Hopps <chopps@labn.net>
Diffstat (limited to 'tools')
-rw-r--r--tools/gen_northbound_callbacks.c72
1 files changed, 55 insertions, 17 deletions
diff --git a/tools/gen_northbound_callbacks.c b/tools/gen_northbound_callbacks.c
index 516743aca..019404d7c 100644
--- a/tools/gen_northbound_callbacks.c
+++ b/tools/gen_northbound_callbacks.c
@@ -15,12 +15,13 @@
#include "yang.h"
#include "northbound.h"
-static bool static_cbs;
+static bool f_static_cbs;
+static bool f_new_cbs;
static void __attribute__((noreturn)) usage(int status)
{
extern const char *__progname;
- fprintf(stderr, "usage: %s [-h] [-s] [-p path]* MODULE\n", __progname);
+ fprintf(stderr, "usage: %s [-h] [-n] [-s] [-p path]* MODULE\n", __progname);
exit(status);
}
@@ -111,6 +112,14 @@ static struct nb_callback_info nb_config_write = {
.arguments = "struct vty *vty, const struct lyd_node *dnode, bool show_defaults",
};
+static struct nb_callback_info nb_oper_get = {
+ .operation = NB_CB_GET_ELEM,
+ .return_type = "enum nb_error ",
+ .return_value = "NB_OK",
+ .arguments =
+ "const struct nb_node *nb_node, const void *parent_list_entry, struct lyd_node *parent",
+};
+
static void replace_hyphens_by_underscores(char *str)
{
char *p;
@@ -120,6 +129,14 @@ static void replace_hyphens_by_underscores(char *str)
*p++ = '_';
}
+static const char *__operation_name(enum nb_cb_operation operation)
+{
+ if (f_new_cbs && operation == NB_CB_GET_ELEM)
+ return "get";
+ else
+ return nb_cb_operation_name(operation);
+}
+
static void generate_callback_name(const struct lysc_node *snode,
enum nb_cb_operation operation, char *buffer,
size_t size)
@@ -143,7 +160,7 @@ static void generate_callback_name(const struct lysc_node *snode,
strlcat(buffer, snode->name, size);
strlcat(buffer, "_", size);
}
- strlcat(buffer, nb_cb_operation_name(operation), size);
+ strlcat(buffer, __operation_name(operation), size);
list_delete(&snodes);
replace_hyphens_by_underscores(buffer);
@@ -208,17 +225,25 @@ static int generate_prototypes(const struct lysc_node *snode, void *arg)
return YANG_ITER_CONTINUE;
}
- for (struct nb_callback_info *cb = &nb_callbacks[0];
- cb->operation != -1; cb++) {
+ for (struct nb_callback_info *cb = &nb_callbacks[0]; cb->operation != -1; cb++) {
char cb_name[BUFSIZ];
if (cb->optional
|| !nb_cb_operation_is_valid(cb->operation, snode))
continue;
+ if (f_new_cbs && cb->operation == NB_CB_GET_NEXT && snode->nodetype == LYS_LEAFLIST)
+ continue;
+
generate_callback_name(snode, cb->operation, cb_name,
sizeof(cb_name));
- generate_prototype(cb, cb_name);
+
+ if (cb->operation == NB_CB_GET_ELEM) {
+ if (f_new_cbs)
+ generate_prototype(&nb_oper_get, cb_name);
+ else
+ generate_prototype(cb, cb_name);
+ }
if (cb->need_config_write && need_config_write) {
generate_config_write_cb_name(snode, cb_name,
@@ -236,8 +261,8 @@ static int generate_prototypes(const struct lysc_node *snode, void *arg)
static void generate_callback(const struct nb_callback_info *ncinfo,
const char *cb_name)
{
- printf("%s%s%s(%s)\n{\n", static_cbs ? "static " : "",
- ncinfo->return_type, cb_name, ncinfo->arguments);
+ printf("%s%s%s(%s)\n{\n", f_static_cbs ? "static " : "", ncinfo->return_type, cb_name,
+ ncinfo->arguments);
switch (ncinfo->operation) {
case NB_CB_CREATE:
@@ -266,8 +291,8 @@ static void generate_callback(const struct nb_callback_info *ncinfo,
static void generate_config_write_callback(const struct nb_callback_info *ncinfo,
const char *cb_name)
{
- printf("%s%s%s(%s)\n{\n", static_cbs ? "static " : "",
- ncinfo->return_type, cb_name, ncinfo->arguments);
+ printf("%s%s%s(%s)\n{\n", f_static_cbs ? "static " : "", ncinfo->return_type, cb_name,
+ ncinfo->arguments);
/* Add a comment, since these callbacks may not all be needed. */
printf("\t/* TODO: this cli callback is optional; the cli output may not need to be done at each node. */\n");
@@ -313,9 +338,18 @@ static int generate_callbacks(const struct lysc_node *snode, void *arg)
first = false;
}
+ if (f_new_cbs && cb->operation == NB_CB_GET_NEXT && snode->nodetype == LYS_LEAFLIST)
+ continue;
+
generate_callback_name(snode, cb->operation, cb_name,
sizeof(cb_name));
- generate_callback(cb, cb_name);
+
+ if (cb->operation == NB_CB_GET_ELEM) {
+ if (f_new_cbs)
+ generate_callback(&nb_oper_get, cb_name);
+ else
+ generate_callback(cb, cb_name);
+ }
if (cb->need_config_write && need_config_write) {
generate_config_write_cb_name(snode, cb_name,
@@ -371,12 +405,13 @@ static int generate_nb_nodes(const struct lysc_node *snode, void *arg)
printf("\t\t\t.cbs = {\n");
first = false;
}
+ if (f_new_cbs && cb->operation == NB_CB_GET_NEXT &&
+ snode->nodetype == LYS_LEAFLIST)
+ continue;
generate_callback_name(snode, cb->operation, cb_name,
sizeof(cb_name));
- printf("\t\t\t\t.%s = %s,\n",
- nb_cb_operation_name(cb->operation),
- cb_name);
+ printf("\t\t\t\t.%s = %s,\n", __operation_name(cb->operation), cb_name);
} else if (cb->need_config_write && need_config_write) {
if (first) {
yang_snode_get_path(snode,
@@ -417,11 +452,14 @@ int main(int argc, char *argv[])
int opt;
bool config_pass;
- while ((opt = getopt(argc, argv, "hp:s")) != -1) {
+ while ((opt = getopt(argc, argv, "hnp:s")) != -1) {
switch (opt) {
case 'h':
usage(EXIT_SUCCESS);
/* NOTREACHED */
+ case 'n':
+ f_new_cbs = true;
+ break;
case 'p':
if (stat(optarg, &st) == -1) {
fprintf(stderr,
@@ -438,7 +476,7 @@ int main(int argc, char *argv[])
*darr_append(search_paths) = darr_strdup(optarg);
break;
case 's':
- static_cbs = true;
+ f_static_cbs = true;
break;
default:
usage(EXIT_FAILURE);
@@ -477,7 +515,7 @@ int main(int argc, char *argv[])
printf("// SPDX-" "License-Identifier: GPL-2.0-or-later\n\n");
/* Generate callback prototypes. */
- if (!static_cbs) {
+ if (!f_static_cbs) {
printf("/* prototypes */\n");
yang_snodes_iterate(module->info, generate_prototypes, 0, NULL);
printf("\n");