diff options
Diffstat (limited to 'lib/distribute.c')
| -rw-r--r-- | lib/distribute.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/lib/distribute.c b/lib/distribute.c index 719bac4faa..8d1fca9a9e 100644 --- a/lib/distribute.c +++ b/lib/distribute.c @@ -244,11 +244,13 @@ static enum distribute_type distribute_direction(const char *dir, bool v4) __builtin_unreachable(); } -int distribute_list_parser(bool prefix, bool v4, const char *dir, - const char *list, const char *ifname) +int distribute_list_parser(struct distribute_ctx *ctx, bool prefix, bool v4, + const char *dir, const char *list, const char *ifname) { enum distribute_type type = distribute_direction(dir, v4); - struct distribute_ctx *ctx = listnode_head(dist_ctx_list); + + if (!ctx) + ctx = listnode_head(dist_ctx_list); void (*distfn)(struct distribute_ctx *, const char *, enum distribute_type, const char *) = @@ -259,14 +261,17 @@ int distribute_list_parser(bool prefix, bool v4, const char *dir, return CMD_SUCCESS; } -int distribute_list_no_parser(struct vty *vty, bool prefix, bool v4, - const char *dir, const char *list, - const char *ifname) + +int distribute_list_no_parser(struct distribute_ctx *ctx, struct vty *vty, + bool prefix, bool v4, const char *dir, + const char *list, const char *ifname) { enum distribute_type type = distribute_direction(dir, v4); - struct distribute_ctx *ctx = listnode_head(dist_ctx_list); int ret; + if (!ctx) + ctx = listnode_head(dist_ctx_list); + int (*distfn)(struct distribute_ctx *, const char *, enum distribute_type, const char *) = prefix ? &distribute_list_prefix_unset : &distribute_list_unset; @@ -451,8 +456,7 @@ int config_write_distribute(struct vty *vty, int group_distribute_list_create_helper( struct nb_cb_create_args *args, struct distribute_ctx *ctx) { - /* The code currently doesn't require this as it uses a global */ - /* nb_running_set_entry(args->dnode, ctx); */ + nb_running_set_entry(args->dnode, ctx); return NB_OK; } @@ -469,23 +473,23 @@ int group_distribute_list_destroy(struct nb_cb_destroy_args *args) static int distribute_list_leaf_update(const struct lyd_node *dnode, int ip_version, bool no) { + struct distribute_ctx *ctx; struct lyd_node *dir_node = lyd_parent(dnode); struct lyd_node_inner *list_node = dir_node->parent; struct lyd_node *intf_key = list_node->child; bool ipv4 = ip_version == 4 ? true : false; bool prefix; - /* The code currently doesn't require this as it uses a global */ - /* ctx = nb_running_get_entry_non_rec(&list_node->node, NULL, false); */ + ctx = nb_running_get_entry_non_rec(&list_node->node, NULL, false); prefix = dnode->schema->name[0] == 'p' ? true : false; if (no) - distribute_list_no_parser(NULL, prefix, ipv4, + distribute_list_no_parser(ctx, NULL, prefix, ipv4, dir_node->schema->name, lyd_get_value(dnode), lyd_get_value(intf_key)); else - distribute_list_parser(prefix, ipv4, + distribute_list_parser(ctx, prefix, ipv4, dir_node->schema->name, lyd_get_value(dnode), lyd_get_value(intf_key)); |
