]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: fix northbound conflicts
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Wed, 29 Apr 2020 18:33:46 +0000 (15:33 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Fri, 5 Jun 2020 17:36:52 +0000 (14:36 -0300)
Changes:
- Use the northbound callback prototypes.
- Re-implement the removed function: `ipv4_network_addr` (more
  information: https://github.com/FRRouting/frr/pull/5535 )

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
lib/filter_nb.c

index e18064a23f703db2e5129090b0312b48d69f32a2..23cea50870effb1c832ca701634789f7cf039758 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "zebra.h"
 
-#include "lib/log.h"
 #include "lib/northbound.h"
 #include "lib/prefix.h"
 
 #include "lib/plist.h"
 #include "lib/plist_int.h"
 
+/* Helper function. */
+static in_addr_t
+ipv4_network_addr(in_addr_t hostaddr, int masklen)
+{
+       struct in_addr mask;
+
+       masklen2ip(masklen, &mask);
+       return hostaddr & mask.s_addr;
+}
+
 /*
  * XPath: /frr-filter:lib/access-list-legacy
  */
-static int lib_access_list_legacy_create(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+static int lib_access_list_legacy_create(struct nb_cb_create_args *args)
 {
        struct access_list *acl;
        const char *acl_name;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       acl_name = yang_dnode_get_string(dnode, "./number");
+       acl_name = yang_dnode_get_string(args->dnode, "./number");
        acl = access_list_get(AFI_IP, acl_name);
-       nb_running_set_entry(dnode, acl);
+       nb_running_set_entry(args->dnode, acl);
 
        return NB_OK;
 }
 
-static int lib_access_list_legacy_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+static int lib_access_list_legacy_destroy(struct nb_cb_destroy_args *args)
 {
        struct access_master *am;
        struct access_list *acl;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       acl = nb_running_unset_entry(dnode);
+       acl = nb_running_unset_entry(args->dnode);
        am = acl->master;
        if (am->delete_hook)
                am->delete_hook(acl);
@@ -72,35 +78,33 @@ static int lib_access_list_legacy_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/access-list-legacy/remark
  */
-static int lib_access_list_legacy_remark_modify(enum nb_event event,
-                                               const struct lyd_node *dnode,
-                                               union nb_resource *resource)
+static int lib_access_list_legacy_remark_modify(struct nb_cb_modify_args *args)
 {
        struct access_list *acl;
        const char *remark;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       acl = nb_running_get_entry(dnode, NULL, true);
+       acl = nb_running_get_entry(args->dnode, NULL, true);
        if (acl->remark)
                XFREE(MTYPE_TMP, acl->remark);
 
-       remark = yang_dnode_get_string(dnode, NULL);
+       remark = yang_dnode_get_string(args->dnode, NULL);
        acl->remark = XSTRDUP(MTYPE_TMP, remark);
 
        return NB_OK;
 }
 
-static int lib_access_list_legacy_remark_destroy(enum nb_event event,
-                                                const struct lyd_node *dnode)
+static int
+lib_access_list_legacy_remark_destroy(struct nb_cb_destroy_args *args)
 {
        struct access_list *acl;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       acl = nb_running_get_entry(dnode, NULL, true);
+       acl = nb_running_get_entry(args->dnode, NULL, true);
        if (acl->remark)
                XFREE(MTYPE_TMP, acl->remark);
 
@@ -112,9 +116,7 @@ static int lib_access_list_legacy_remark_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/access-list-legacy/entry
  */
-static int lib_access_list_legacy_entry_create(enum nb_event event,
-                                              const struct lyd_node *dnode,
-                                              union nb_resource *resource)
+static int lib_access_list_legacy_entry_create(struct nb_cb_create_args *args)
 {
        struct filter_cisco *fc;
        struct access_list *acl;
@@ -123,38 +125,37 @@ static int lib_access_list_legacy_entry_create(enum nb_event event,
 
        /* TODO: validate `filter_lookup_cisco` returns NULL. */
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       aclno = yang_dnode_get_uint16(dnode, "../number");
+       aclno = yang_dnode_get_uint16(args->dnode, "../number");
 
        f = filter_new();
        f->cisco = 1;
-       f->seq = yang_dnode_get_uint32(dnode, "./sequence");
+       f->seq = yang_dnode_get_uint32(args->dnode, "./sequence");
        fc = &f->u.cfilter;
        if ((aclno >= 1 && aclno <= 99) || (aclno >= 1300 && aclno <= 1999))
                fc->extended = 0;
        else
                fc->extended = 1;
 
-       acl = nb_running_get_entry(dnode, NULL, true);
+       acl = nb_running_get_entry(args->dnode, NULL, true);
        f->acl = acl;
        access_list_filter_add(acl, f);
-       nb_running_set_entry(dnode, f);
+       nb_running_set_entry(args->dnode, f);
 
        return NB_OK;
 }
 
-static int lib_access_list_legacy_entry_destroy(enum nb_event event,
-                                               const struct lyd_node *dnode)
+static int lib_access_list_legacy_entry_destroy(struct nb_cb_destroy_args *args)
 {
        struct access_list *acl;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_unset_entry(dnode);
+       f = nb_running_unset_entry(args->dnode);
        acl = f->acl;
        access_list_filter_delete(acl, f);
 
@@ -165,18 +166,16 @@ static int lib_access_list_legacy_entry_destroy(enum nb_event event,
  * XPath: /frr-filter:lib/access-list-legacy/entry/action
  */
 static int
-lib_access_list_legacy_entry_action_modify(enum nb_event event,
-                                          const struct lyd_node *dnode,
-                                          union nb_resource *resource)
+lib_access_list_legacy_entry_action_modify(struct nb_cb_modify_args *args)
 {
        const char *filter_type;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
-       filter_type = yang_dnode_get_string(dnode, NULL);
+       f = nb_running_get_entry(args->dnode, NULL, true);
+       filter_type = yang_dnode_get_string(args->dnode, NULL);
        if (strcmp(filter_type, "permit") == 0)
                f->type = FILTER_PERMIT;
        else
@@ -189,35 +188,32 @@ lib_access_list_legacy_entry_action_modify(enum nb_event event,
  * XPath: /frr-filter:lib/access-list-legacy/entry/host
  */
 static int
-lib_access_list_legacy_entry_host_modify(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+lib_access_list_legacy_entry_host_modify(struct nb_cb_modify_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
-       yang_dnode_get_ipv4(&fc->addr, dnode, NULL);
+       yang_dnode_get_ipv4(&fc->addr, args->dnode, NULL);
        fc->addr_mask.s_addr = INADDR_ANY;
 
        return NB_OK;
 }
 
 static int
-lib_access_list_legacy_entry_host_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+lib_access_list_legacy_entry_host_destroy(struct nb_cb_destroy_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->addr.s_addr = INADDR_ANY;
        fc->addr_mask.s_addr = INADDR_NONE;
@@ -229,20 +225,18 @@ lib_access_list_legacy_entry_host_destroy(enum nb_event event,
  * XPath: /frr-filter:lib/access-list-legacy/entry/network
  */
 static int
-lib_access_list_legacy_entry_network_modify(enum nb_event event,
-                                           const struct lyd_node *dnode,
-                                           union nb_resource *resource)
+lib_access_list_legacy_entry_network_modify(struct nb_cb_modify_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
        struct prefix p;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
-       yang_dnode_get_prefix(&p, dnode, NULL);
+       yang_dnode_get_prefix(&p, args->dnode, NULL);
        fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
        masklen2ip(p.prefixlen, &fc->addr_mask);
 
@@ -250,16 +244,15 @@ lib_access_list_legacy_entry_network_modify(enum nb_event event,
 }
 
 static int
-lib_access_list_legacy_entry_network_destroy(enum nb_event event,
-                                            const struct lyd_node *dnode)
+lib_access_list_legacy_entry_network_destroy(struct nb_cb_destroy_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->addr.s_addr = INADDR_ANY;
        fc->addr_mask.s_addr = INADDR_NONE;
@@ -270,17 +263,16 @@ lib_access_list_legacy_entry_network_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/access-list-legacy/entry/any
  */
-static int lib_access_list_legacy_entry_any_create(enum nb_event event,
-                                                  const struct lyd_node *dnode,
-                                                  union nb_resource *resource)
+static int
+lib_access_list_legacy_entry_any_create(struct nb_cb_create_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->addr.s_addr = INADDR_ANY;
        fc->addr_mask.s_addr = INADDR_NONE;
@@ -289,16 +281,15 @@ static int lib_access_list_legacy_entry_any_create(enum nb_event event,
 }
 
 static int
-lib_access_list_legacy_entry_any_destroy(enum nb_event event,
-                                        const struct lyd_node *dnode)
+lib_access_list_legacy_entry_any_destroy(struct nb_cb_destroy_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->addr.s_addr = INADDR_ANY;
        fc->addr_mask.s_addr = INADDR_NONE;
@@ -310,33 +301,32 @@ lib_access_list_legacy_entry_any_destroy(enum nb_event event,
  * XPath: /frr-filter:lib/access-list-legacy/entry/destination-host
  */
 static int lib_access_list_legacy_entry_destination_host_modify(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_modify_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
-       yang_dnode_get_ipv4(&fc->mask, dnode, NULL);
+       yang_dnode_get_ipv4(&fc->mask, args->dnode, NULL);
        fc->mask_mask.s_addr = INADDR_ANY;
 
        return NB_OK;
 }
 
 static int lib_access_list_legacy_entry_destination_host_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->mask.s_addr = INADDR_ANY;
        fc->mask_mask.s_addr = INADDR_NONE;
@@ -348,19 +338,18 @@ static int lib_access_list_legacy_entry_destination_host_destroy(
  * XPath: /frr-filter:lib/access-list-legacy/entry/destination-network
  */
 static int lib_access_list_legacy_entry_destination_network_modify(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_modify_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
        struct prefix p;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
-       yang_dnode_get_prefix(&p, dnode, NULL);
+       yang_dnode_get_prefix(&p, args->dnode, NULL);
        fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
        masklen2ip(p.prefixlen, &fc->addr_mask);
 
@@ -368,15 +357,15 @@ static int lib_access_list_legacy_entry_destination_network_modify(
 }
 
 static int lib_access_list_legacy_entry_destination_network_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->mask.s_addr = INADDR_ANY;
        fc->mask_mask.s_addr = INADDR_NONE;
@@ -388,16 +377,15 @@ static int lib_access_list_legacy_entry_destination_network_destroy(
  * XPath: /frr-filter:lib/access-list-legacy/entry/destination-any
  */
 static int lib_access_list_legacy_entry_destination_any_create(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_create_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->mask.s_addr = INADDR_ANY;
        fc->mask_mask.s_addr = INADDR_NONE;
@@ -406,15 +394,15 @@ static int lib_access_list_legacy_entry_destination_any_create(
 }
 
 static int lib_access_list_legacy_entry_destination_any_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        struct filter_cisco *fc;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fc = &f->u.cfilter;
        fc->mask.s_addr = INADDR_ANY;
        fc->mask_mask.s_addr = INADDR_NONE;
@@ -425,19 +413,17 @@ static int lib_access_list_legacy_entry_destination_any_destroy(
 /*
  * XPath: /frr-filter:lib/access-list
  */
-static int lib_access_list_create(enum nb_event event,
-                                 const struct lyd_node *dnode,
-                                 union nb_resource *resource)
+static int lib_access_list_create(struct nb_cb_create_args *args)
 {
        struct access_list *acl;
        const char *acl_name;
        int type;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       type = yang_dnode_get_enum(dnode, "./type");
-       acl_name = yang_dnode_get_string(dnode, "./name");
+       type = yang_dnode_get_enum(args->dnode, "./type");
+       acl_name = yang_dnode_get_string(args->dnode, "./name");
 
        switch (type) {
        case 0: /* ipv4 */
@@ -451,21 +437,20 @@ static int lib_access_list_create(enum nb_event event,
                break;
        }
 
-       nb_running_set_entry(dnode, acl);
+       nb_running_set_entry(args->dnode, acl);
 
        return NB_OK;
 }
 
-static int lib_access_list_destroy(enum nb_event event,
-                                  const struct lyd_node *dnode)
+static int lib_access_list_destroy(struct nb_cb_destroy_args *args)
 {
        struct access_master *am;
        struct access_list *acl;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       acl = nb_running_unset_entry(dnode);
+       acl = nb_running_unset_entry(args->dnode);
        am = acl->master;
        if (am->delete_hook)
                am->delete_hook(acl);
@@ -478,55 +463,49 @@ static int lib_access_list_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/access-list/remark
  */
-static int lib_access_list_remark_modify(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+static int lib_access_list_remark_modify(struct nb_cb_modify_args *args)
 {
-       return lib_access_list_legacy_remark_modify(event, dnode, resource);
+       return lib_access_list_legacy_remark_modify(args);
 }
 
-static int lib_access_list_remark_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+static int lib_access_list_remark_destroy(struct nb_cb_destroy_args *args)
 {
-       return lib_access_list_legacy_remark_destroy(event, dnode);
+       return lib_access_list_legacy_remark_destroy(args);
 }
 
 /*
  * XPath: /frr-filter:lib/access-list/entry
  */
-static int lib_access_list_entry_create(enum nb_event event,
-                                       const struct lyd_node *dnode,
-                                       union nb_resource *resource)
+static int lib_access_list_entry_create(struct nb_cb_create_args *args)
 {
        struct access_list *acl;
        struct filter *f;
 
        /* TODO: validate `filter_lookup_zebra` returns NULL. */
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
        f = filter_new();
-       f->seq = yang_dnode_get_uint32(dnode, "./sequence");
+       f->seq = yang_dnode_get_uint32(args->dnode, "./sequence");
 
-       acl = nb_running_get_entry(dnode, NULL, true);
+       acl = nb_running_get_entry(args->dnode, NULL, true);
        f->acl = acl;
        access_list_filter_add(acl, f);
-       nb_running_set_entry(dnode, f);
+       nb_running_set_entry(args->dnode, f);
 
        return NB_OK;
 }
 
-static int lib_access_list_entry_destroy(enum nb_event event,
-                                        const struct lyd_node *dnode)
+static int lib_access_list_entry_destroy(struct nb_cb_destroy_args *args)
 {
        struct access_list *acl;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_unset_entry(dnode);
+       f = nb_running_unset_entry(args->dnode);
        acl = f->acl;
        access_list_filter_delete(acl, f);
 
@@ -536,46 +515,40 @@ static int lib_access_list_entry_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/access-list/entry/action
  */
-static int lib_access_list_entry_action_modify(enum nb_event event,
-                                              const struct lyd_node *dnode,
-                                              union nb_resource *resource)
+static int lib_access_list_entry_action_modify(struct nb_cb_modify_args *args)
 {
-       return lib_access_list_legacy_entry_action_modify(event, dnode,
-                                                         resource);
+       return lib_access_list_legacy_entry_action_modify(args);
 }
 
 /*
  * XPath: /frr-filter:lib/access-list/entry/ipv4-prefix
  */
 static int
-lib_access_list_entry_ipv4_prefix_modify(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+lib_access_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
 {
        struct filter_zebra *fz;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fz = &f->u.zfilter;
-       yang_dnode_get_prefix(&fz->prefix, dnode, NULL);
+       yang_dnode_get_prefix(&fz->prefix, args->dnode, NULL);
 
        return NB_OK;
 }
 
 static int
-lib_access_list_entry_ipv4_prefix_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+lib_access_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
 {
        struct filter_zebra *fz;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fz = &f->u.zfilter;
        memset(&fz->prefix, 0, sizeof(fz->prefix));
 
@@ -586,34 +559,31 @@ lib_access_list_entry_ipv4_prefix_destroy(enum nb_event event,
  * XPath: /frr-filter:lib/access-list/entry/ipv4-exact-match
  */
 static int
-lib_access_list_entry_ipv4_exact_match_modify(enum nb_event event,
-                                             const struct lyd_node *dnode,
-                                             union nb_resource *resource)
+lib_access_list_entry_ipv4_exact_match_modify(struct nb_cb_modify_args *args)
 {
        struct filter_zebra *fz;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fz = &f->u.zfilter;
-       fz->exact = yang_dnode_get_bool(dnode, NULL);
+       fz->exact = yang_dnode_get_bool(args->dnode, NULL);
 
        return NB_OK;
 }
 
 static int
-lib_access_list_entry_ipv4_exact_match_destroy(enum nb_event event,
-                                              const struct lyd_node *dnode)
+lib_access_list_entry_ipv4_exact_match_destroy(struct nb_cb_destroy_args *args)
 {
        struct filter_zebra *fz;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fz = &f->u.zfilter;
        fz->exact = 0;
 
@@ -624,74 +594,62 @@ lib_access_list_entry_ipv4_exact_match_destroy(enum nb_event event,
  * XPath: /frr-filter:lib/access-list/entry/ipv6-prefix
  */
 static int
-lib_access_list_entry_ipv6_prefix_modify(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+lib_access_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
 {
-       return lib_access_list_entry_ipv4_prefix_modify(event, dnode, resource);
+       return lib_access_list_entry_ipv4_prefix_modify(args);
 }
 
 static int
-lib_access_list_entry_ipv6_prefix_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+lib_access_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
 {
-       return lib_access_list_entry_ipv4_prefix_destroy(event, dnode);
+       return lib_access_list_entry_ipv4_prefix_destroy(args);
 }
 
 /*
  * XPath: /frr-filter:lib/access-list/entry/ipv6-exact-match
  */
 static int
-lib_access_list_entry_ipv6_exact_match_modify(enum nb_event event,
-                                             const struct lyd_node *dnode,
-                                             union nb_resource *resource)
+lib_access_list_entry_ipv6_exact_match_modify(struct nb_cb_modify_args *args)
 {
-       return lib_access_list_entry_ipv4_exact_match_modify(event, dnode,
-                                                            resource);
+       return lib_access_list_entry_ipv4_exact_match_modify(args);
 }
 
 static int
-lib_access_list_entry_ipv6_exact_match_destroy(enum nb_event event,
-                                              const struct lyd_node *dnode)
+lib_access_list_entry_ipv6_exact_match_destroy(struct nb_cb_destroy_args *args)
 {
-       return lib_access_list_entry_ipv4_exact_match_destroy(event, dnode);
+       return lib_access_list_entry_ipv4_exact_match_destroy(args);
 }
 
 /*
  * XPath: /frr-filter:lib/access-list/entry/mac
  */
-static int lib_access_list_entry_mac_modify(enum nb_event event,
-                                           const struct lyd_node *dnode,
-                                           union nb_resource *resource)
+static int lib_access_list_entry_mac_modify(struct nb_cb_modify_args *args)
 {
-       return lib_access_list_entry_ipv4_prefix_modify(event, dnode, resource);
+       return lib_access_list_entry_ipv4_prefix_modify(args);
 }
 
-static int lib_access_list_entry_mac_destroy(enum nb_event event,
-                                            const struct lyd_node *dnode)
+static int lib_access_list_entry_mac_destroy(struct nb_cb_destroy_args *args)
 {
-       return lib_access_list_entry_ipv4_prefix_destroy(event, dnode);
+       return lib_access_list_entry_ipv4_prefix_destroy(args);
 }
 
 /*
  * XPath: /frr-filter:lib/access-list/entry/any
  */
-static int lib_access_list_entry_any_create(enum nb_event event,
-                                           const struct lyd_node *dnode,
-                                           union nb_resource *resource)
+static int lib_access_list_entry_any_create(struct nb_cb_create_args *args)
 {
        struct filter_zebra *fz;
        struct filter *f;
        int type;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fz = &f->u.zfilter;
        memset(&fz->prefix, 0, sizeof(fz->prefix));
 
-       type = yang_dnode_get_enum(dnode, "../../type");
+       type = yang_dnode_get_enum(args->dnode, "../../type");
        switch (type) {
        case 0: /* ipv4 */
                fz->prefix.family = AF_INET;
@@ -707,16 +665,15 @@ static int lib_access_list_entry_any_create(enum nb_event event,
        return NB_OK;
 }
 
-static int lib_access_list_entry_any_destroy(enum nb_event event,
-                                            const struct lyd_node *dnode)
+static int lib_access_list_entry_any_destroy(struct nb_cb_destroy_args *args)
 {
        struct filter_zebra *fz;
        struct filter *f;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       f = nb_running_get_entry(dnode, NULL, true);
+       f = nb_running_get_entry(args->dnode, NULL, true);
        fz = &f->u.zfilter;
        fz->prefix.family = 0;
 
@@ -726,9 +683,7 @@ static int lib_access_list_entry_any_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/prefix-list
  */
-static int lib_prefix_list_create(enum nb_event event,
-                                 const struct lyd_node *dnode,
-                                 union nb_resource *resource)
+static int lib_prefix_list_create(struct nb_cb_create_args *args)
 {
        struct prefix_list *pl;
        const char *name;
@@ -736,11 +691,11 @@ static int lib_prefix_list_create(enum nb_event event,
 
        /* TODO: validate prefix_entry_dup_check() passes. */
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       type = yang_dnode_get_enum(dnode, "./type");
-       name = yang_dnode_get_string(dnode, "./name");
+       type = yang_dnode_get_enum(args->dnode, "./type");
+       name = yang_dnode_get_string(args->dnode, "./name");
        switch (type) {
        case 0: /* ipv4 */
                pl = prefix_list_get(AFI_IP, 0, name);
@@ -750,20 +705,19 @@ static int lib_prefix_list_create(enum nb_event event,
                break;
        }
 
-       nb_running_set_entry(dnode, pl);
+       nb_running_set_entry(args->dnode, pl);
 
        return NB_OK;
 }
 
-static int lib_prefix_list_destroy(enum nb_event event,
-                                  const struct lyd_node *dnode)
+static int lib_prefix_list_destroy(struct nb_cb_destroy_args *args)
 {
        struct prefix_list *pl;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       pl = nb_running_unset_entry(dnode);
+       pl = nb_running_unset_entry(args->dnode);
        prefix_list_delete(pl);
 
        return NB_OK;
@@ -772,35 +726,32 @@ static int lib_prefix_list_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/prefix-list/description
  */
-static int lib_prefix_list_description_modify(enum nb_event event,
-                                             const struct lyd_node *dnode,
-                                             union nb_resource *resource)
+static int lib_prefix_list_description_modify(struct nb_cb_modify_args *args)
 {
        struct prefix_list *pl;
        const char *remark;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       pl = nb_running_get_entry(dnode, NULL, true);
+       pl = nb_running_get_entry(args->dnode, NULL, true);
        if (pl->desc)
                XFREE(MTYPE_TMP, pl->desc);
 
-       remark = yang_dnode_get_string(dnode, NULL);
+       remark = yang_dnode_get_string(args->dnode, NULL);
        pl->desc = XSTRDUP(MTYPE_TMP, remark);
 
        return NB_OK;
 }
 
-static int lib_prefix_list_description_destroy(enum nb_event event,
-                                              const struct lyd_node *dnode)
+static int lib_prefix_list_description_destroy(struct nb_cb_destroy_args *args)
 {
        struct prefix_list *pl;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       pl = nb_running_get_entry(dnode, NULL, true);
+       pl = nb_running_get_entry(args->dnode, NULL, true);
        if (pl->desc)
                XFREE(MTYPE_TMP, pl->desc);
 
@@ -812,37 +763,34 @@ static int lib_prefix_list_description_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/prefix-list/entry
  */
-static int lib_prefix_list_entry_create(enum nb_event event,
-                                       const struct lyd_node *dnode,
-                                       union nb_resource *resource)
+static int lib_prefix_list_entry_create(struct nb_cb_create_args *args)
 {
        struct prefix_list_entry *ple;
        struct prefix_list *pl;
        struct prefix p;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
        memset(&p, 0, sizeof(p));
 
-       pl = nb_running_get_entry(dnode, NULL, true);
+       pl = nb_running_get_entry(args->dnode, NULL, true);
        ple = prefix_list_entry_new();
        ple->pl = pl;
        ple->any = 1;
-       ple->seq = yang_dnode_get_int64(dnode, "./sequence");
+       ple->seq = yang_dnode_get_int64(args->dnode, "./sequence");
 
        return NB_OK;
 }
 
-static int lib_prefix_list_entry_destroy(enum nb_event event,
-                                        const struct lyd_node *dnode)
+static int lib_prefix_list_entry_destroy(struct nb_cb_destroy_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_unset_entry(dnode);
+       ple = nb_running_unset_entry(args->dnode);
        prefix_list_entry_delete(ple->pl, ple, 1);
 
        return NB_OK;
@@ -851,18 +799,16 @@ static int lib_prefix_list_entry_destroy(enum nb_event event,
 /*
  * XPath: /frr-filter:lib/prefix-list/entry/action
  */
-static int lib_prefix_list_entry_action_modify(enum nb_event event,
-                                              const struct lyd_node *dnode,
-                                              union nb_resource *resource)
+static int lib_prefix_list_entry_action_modify(struct nb_cb_modify_args *args)
 {
        struct prefix_list_entry *ple;
        const char *action_str;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
-       action_str = yang_dnode_get_string(dnode, "./action");
+       ple = nb_running_get_entry(args->dnode, NULL, true);
+       action_str = yang_dnode_get_string(args->dnode, "./action");
        if (strcmp(action_str, "permit") == 0)
                ple->type = PREFIX_PERMIT;
        else
@@ -875,31 +821,28 @@ static int lib_prefix_list_entry_action_modify(enum nb_event event,
  * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix
  */
 static int
-lib_prefix_list_entry_ipv4_prefix_modify(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+lib_prefix_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
-       yang_dnode_get_prefix(&ple->prefix, dnode, NULL);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
+       yang_dnode_get_prefix(&ple->prefix, args->dnode, NULL);
 
        return NB_OK;
 }
 
 static int
-lib_prefix_list_entry_ipv4_prefix_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+lib_prefix_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
        memset(&ple->prefix, 0, sizeof(ple->prefix));
        ple->any = 1;
 
@@ -910,29 +853,28 @@ lib_prefix_list_entry_ipv4_prefix_destroy(enum nb_event event,
  * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-greater-or-equal
  */
 static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_modify_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
-       ple->ge = yang_dnode_get_uint8(dnode, NULL);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
+       ple->ge = yang_dnode_get_uint8(args->dnode, NULL);
 
        return NB_OK;
 }
 
 static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
        ple->ge = 0;
 
        return NB_OK;
@@ -942,29 +884,28 @@ static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
  * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-lesser-or-equal
  */
 static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_modify_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
-       ple->le = yang_dnode_get_uint8(dnode, NULL);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
+       ple->le = yang_dnode_get_uint8(args->dnode, NULL);
 
        return NB_OK;
 }
 
 static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
        ple->le = 0;
 
        return NB_OK;
@@ -974,84 +915,76 @@ static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
  * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix
  */
 static int
-lib_prefix_list_entry_ipv6_prefix_modify(enum nb_event event,
-                                        const struct lyd_node *dnode,
-                                        union nb_resource *resource)
+lib_prefix_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
 {
-       return lib_prefix_list_entry_ipv4_prefix_modify(event, dnode, resource);
+       return lib_prefix_list_entry_ipv4_prefix_modify(args);
 }
 
 static int
-lib_prefix_list_entry_ipv6_prefix_destroy(enum nb_event event,
-                                         const struct lyd_node *dnode)
+lib_prefix_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
 {
-       return lib_prefix_list_entry_ipv4_prefix_destroy(event, dnode);
+       return lib_prefix_list_entry_ipv4_prefix_destroy(args);
 }
 
 /*
  * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal
  */
 static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_modify_args *args)
 {
        return lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
-               event, dnode, resource);
+               args);
 }
 
 static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        return lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
-               event, dnode);
+               args);
 }
 
 /*
  * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal
  */
 static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify(
-       enum nb_event event, const struct lyd_node *dnode,
-       union nb_resource *resource)
+       struct nb_cb_modify_args *args)
 {
        return lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
-               event, dnode, resource);
+               args);
 }
 
 static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy(
-       enum nb_event event, const struct lyd_node *dnode)
+       struct nb_cb_destroy_args *args)
 {
        return lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
-               event, dnode);
+               args);
 }
 
 /*
  * XPath: /frr-filter:lib/prefix-list/entry/any
  */
-static int lib_prefix_list_entry_any_create(enum nb_event event,
-                                           const struct lyd_node *dnode,
-                                           union nb_resource *resource)
+static int lib_prefix_list_entry_any_create(struct nb_cb_create_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
        memset(&ple->prefix, 0, sizeof(ple->prefix));
        ple->any = 1;
 
        return NB_OK;
 }
 
-static int lib_prefix_list_entry_any_destroy(enum nb_event event,
-                                            const struct lyd_node *dnode)
+static int lib_prefix_list_entry_any_destroy(struct nb_cb_destroy_args *args)
 {
        struct prefix_list_entry *ple;
 
-       if (event != NB_EV_APPLY)
+       if (args->event != NB_EV_APPLY)
                return NB_OK;
 
-       ple = nb_running_get_entry(dnode, NULL, true);
+       ple = nb_running_get_entry(args->dnode, NULL, true);
        memset(&ple->prefix, 0, sizeof(ple->prefix));
        ple->any = 1;