summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/rt.h14
-rw-r--r--zebra/rt_netlink.c9
-rw-r--r--zebra/rt_socket.c10
-rw-r--r--zebra/zebra_rib.c28
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;
}