From 1e88567226fada65009c3cac635e5e280121eecc Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 25 May 2018 10:47:40 -0400 Subject: [PATCH] zebra: Add a result from dataplane request 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 --- zebra/rt.h | 14 +++++++++++--- zebra/rt_netlink.c | 9 +++++---- zebra/rt_socket.c | 10 +++++++--- zebra/zebra_rib.c | 28 +++++++++++++++++++++++----- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/zebra/rt.h b/zebra/rt.h index 1c10fa5cd1..e1345c8e95 100644 --- a/zebra/rt.h +++ b/zebra/rt.h @@ -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 diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index d902f03a40..a5f288f541 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -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, diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c index 961e732471..3380f225c0 100644 --- a/zebra/rt_socket.c +++ b/zebra/rt_socket.c @@ -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, diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 4a4b0c7810..879e7e8317 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -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; } -- 2.39.5