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 <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-05-25 10:47:40 -04:00
parent 215181cbf1
commit 1e88567226
4 changed files with 46 additions and 15 deletions

View 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,8 +66,10 @@ 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,
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);
/*

View File

@ -1689,7 +1689,8 @@ 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,
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,

View File

@ -385,8 +385,10 @@ 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,
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,

View 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);
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);
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;
}