]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Abstract `dplane_ctx_route_init` to init route without copying
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Fri, 7 Jul 2023 00:55:18 +0000 (02:55 +0200)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Fri, 7 Jul 2023 08:59:28 +0000 (10:59 +0200)
The function `dplane_ctx_route_init` initializes a dplane route context
from the route object passed as an argument. Let's abstract this
function to allow initializing the dplane route context without actually
copying a route object.

This allows us to use this function for initializing a dplane route
context when we don't have any route to copy in it.

Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
zebra/zebra_dplane.c

index 6dd1a9c18dbfac881940d6daf6bf76d4a2d0b154..6a685267a960da59607e8914a25d3058f52f6ca3 100644 (file)
@@ -3257,7 +3257,7 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx,
 {
        int ret = EINVAL;
 
-       if (!ctx || !re)
+       if (!ctx)
                return ret;
 
        dplane_intf_extra_list_init(&ctx->u.rinfo.intf_extra_list);
@@ -3265,6 +3265,13 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx,
        ctx->zd_op = op;
        ctx->zd_status = ZEBRA_DPLANE_REQUEST_SUCCESS;
 
+       /* This function may be called to create/init a dplane context, not
+        * necessarily to copy a route object. Let's return if there is no route
+        * object to copy.
+        */
+       if (!re)
+               return AOK;
+
        ctx->u.rinfo.zd_type = re->type;
        ctx->u.rinfo.zd_old_type = re->type;
 
@@ -3296,6 +3303,8 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx,
 
 /*
  * Initialize a context block for a route update from zebra data structs.
+ * If the `rn` or `re` parameters are NULL, this function only initializes the
+ * dplane context without copying a route object into it.
  */
 int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
                          struct route_node *rn, struct route_entry *re)
@@ -3312,9 +3321,17 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
        const struct interface *ifp;
        struct dplane_intf_extra *if_extra;
 
-       if (!ctx || !rn || !re)
+       if (!ctx)
                return ret;
 
+       /*
+        * Initialize the dplane context and return, if there is no route
+        * object to copy
+        */
+       if (!re || !rn)
+               return dplane_ctx_route_init_basic(ctx, op, NULL, NULL, NULL,
+                                                  AFI_UNSPEC, SAFI_UNSPEC);
+
        /*
         * Let's grab the data from the route_node
         * so that we can call a helper function