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, 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 * 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 * semantics so we will end up with a delete than
* a re-add. * a re-add.
*/ */
extern void kernel_route_rib(struct route_node *rn, struct prefix *p, extern enum dp_req_result kernel_route_rib(struct route_node *rn,
struct prefix *src_p, struct route_entry *old, struct prefix *p,
struct route_entry *new); struct prefix *src_p,
struct route_entry *old,
struct route_entry *new);
/* /*
* So route install/failure may not be immediately known * So route install/failure may not be immediately known

View File

@ -1689,8 +1689,9 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
return suc; 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 *src_p, struct prefix *p,
struct prefix *src_p,
struct route_entry *old, struct route_entry *old,
struct route_entry *new) 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, kernel_route_rib_pass_fail(rn, p, new,
(!ret) ? DP_INSTALL_SUCCESS (!ret) ? DP_INSTALL_SUCCESS
: DP_INSTALL_FAILURE); : DP_INSTALL_FAILURE);
return; return DP_REQUEST_SUCCESS;
} }
if (old) { if (old) {
@ -1735,7 +1736,7 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p,
: DP_DELETE_FAILURE); : DP_DELETE_FAILURE);
} }
return; return DP_REQUEST_SUCCESS;
} }
int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla, int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,

View File

@ -385,9 +385,11 @@ static int kernel_rtm(int cmd, struct prefix *p, struct route_entry *re)
return 0; return 0;
} }
void kernel_route_rib(struct route_node *rn, struct prefix *p, enum dp_req_result kernel_route_rib(struct route_node *rn,
struct prefix *src_p, struct route_entry *old, struct prefix *p,
struct route_entry *new) struct prefix *src_p,
struct route_entry *old,
struct route_entry *new)
{ {
int route = 0; int route = 0;
@ -419,6 +421,8 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p,
? DP_DELETE_SUCCESS ? DP_DELETE_SUCCESS
: DP_DELETE_FAILURE); : DP_DELETE_FAILURE);
} }
return DP_REQUEST_SUCCESS;
} }
int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla, 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. * the kernel.
*/ */
hook_call(rib_update, rn, "installing in 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)) {
zvrf->installs++; 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; return;
} }
@ -1150,9 +1159,18 @@ void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
* the kernel. * the kernel.
*/ */
hook_call(rib_update, rn, "uninstalling from 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)) {
if (zvrf) case DP_REQUEST_QUEUED:
zvrf->removals++; 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; return;
} }