]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Add a result from dataplane request
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 25 May 2018 14:47:40 +0000 (10:47 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 30 May 2018 12:03:13 +0000 (08:03 -0400)
Add a bit of code to allow return of data plane
request messages.

Add the ability to pass the result back to callers
of kernel_route_rib.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
zebra/rt.h
zebra/rt_netlink.c
zebra/rt_socket.c
zebra/zebra_rib.c

index 1c10fa5cd14f173bb94cc75c62d7ee1735741348..e1345c8e954545f6576d22776bc2844ff1387695 100644 (file)
@@ -49,6 +49,12 @@ enum dp_results {
        DP_DELETE_FAILURE,
 };
 
+enum dp_req_result {
+       DP_REQUEST_QUEUED,
+       DP_REQUEST_SUCCESS,
+       DP_REQUEST_FAILURE,
+};
+
 /*
  * Install/delete the specified prefix p from the kernel
  *
@@ -60,9 +66,11 @@ enum dp_results {
  * semantics so we will end up with a delete than
  * a re-add.
  */
-extern void kernel_route_rib(struct route_node *rn, struct prefix *p,
-                            struct prefix *src_p, struct route_entry *old,
-                            struct route_entry *new);
+extern enum dp_req_result kernel_route_rib(struct route_node *rn,
+                                          struct prefix *p,
+                                          struct prefix *src_p,
+                                          struct route_entry *old,
+                                          struct route_entry *new);
 
 /*
  * So route install/failure may not be immediately known
index d902f03a40a98cab4447de872d4f19699f48828d..a5f288f54117f155eb1d8b652c0f9dd27e4d4528 100644 (file)
@@ -1689,8 +1689,9 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
        return suc;
 }
 
-void kernel_route_rib(struct route_node *rn, struct prefix *p,
-                     struct prefix *src_p,
+enum dp_req_result kernel_route_rib(struct route_node *rn,
+                                   struct prefix *p,
+                                   struct prefix *src_p,
                                    struct route_entry *old,
                                    struct route_entry *new)
 {
@@ -1724,7 +1725,7 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p,
                kernel_route_rib_pass_fail(rn, p, new,
                                           (!ret) ? DP_INSTALL_SUCCESS
                                                  : DP_INSTALL_FAILURE);
-               return;
+               return DP_REQUEST_SUCCESS;
        }
 
        if (old) {
@@ -1735,7 +1736,7 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p,
                                                  : DP_DELETE_FAILURE);
        }
 
-       return;
+       return DP_REQUEST_SUCCESS;
 }
 
 int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
index 961e732471c6f62ff5312593d8eaa28a4f8fcda6..3380f225c0a35b7dec80f7e0d8782752d803c104 100644 (file)
@@ -385,9 +385,11 @@ static int kernel_rtm(int cmd, struct prefix *p, struct route_entry *re)
        return 0;
 }
 
-void kernel_route_rib(struct route_node *rn, struct prefix *p,
-                     struct prefix *src_p, struct route_entry *old,
-                     struct route_entry *new)
+enum dp_req_result kernel_route_rib(struct route_node *rn,
+                                   struct prefix *p,
+                                   struct prefix *src_p,
+                                   struct route_entry *old,
+                                   struct route_entry *new)
 {
        int route = 0;
 
@@ -419,6 +421,8 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p,
                                                   ? DP_DELETE_SUCCESS
                                                   : DP_DELETE_FAILURE);
        }
+
+       return DP_REQUEST_SUCCESS;
 }
 
 int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
index 4a4b0c78105a7719d83915ec1d6990179ea99cd8..879e7e831769b877523da38a3563a9b816eaed08 100644 (file)
@@ -1123,8 +1123,17 @@ void rib_install_kernel(struct route_node *rn, struct route_entry *re,
         * the kernel.
         */
        hook_call(rib_update, rn, "installing in kernel");
-       kernel_route_rib(rn, p, src_p, old, re);
-       zvrf->installs++;
+       switch (kernel_route_rib(rn, p, src_p, old, re)) {
+       case DP_REQUEST_QUEUED:
+               zlog_err("No current known DataPlane interfaces can return this, please fix");
+               break;
+       case DP_REQUEST_FAILURE:
+               zlog_err("No current known Rib Install Failure cases, please fix");
+               break;
+       case DP_REQUEST_SUCCESS:
+               zvrf->installs++;
+               break;
+       }
 
        return;
 }
@@ -1150,9 +1159,18 @@ void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
         * the kernel.
         */
        hook_call(rib_update, rn, "uninstalling from kernel");
-       kernel_route_rib(rn, p, src_p, re, NULL);
-       if (zvrf)
-               zvrf->removals++;
+       switch (kernel_route_rib(rn, p, src_p, re, NULL)) {
+       case DP_REQUEST_QUEUED:
+               zlog_err("No current known DataPlane interfaces can return this, please fix");
+               break;
+       case DP_REQUEST_FAILURE:
+               zlog_err("No current known RIB Install Failure cases, please fix");
+               break;
+       case DP_REQUEST_SUCCESS:
+               if (zvrf)
+                       zvrf->removals++;
+               break;
+       }
 
        return;
 }