mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-04 23:42:27 +00:00
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:
parent
215181cbf1
commit
1e88567226
12
zebra/rt.h
12
zebra/rt.h
@ -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,8 +66,10 @@ 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 prefix *src_p,
|
||||||
|
struct route_entry *old,
|
||||||
struct route_entry *new);
|
struct route_entry *new);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1689,7 +1689,8 @@ 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 *p,
|
||||||
struct prefix *src_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,
|
||||||
|
@ -385,8 +385,10 @@ 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 prefix *src_p,
|
||||||
|
struct route_entry *old,
|
||||||
struct route_entry *new)
|
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,
|
||||||
|
@ -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)) {
|
||||||
|
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++;
|
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)) {
|
||||||
|
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)
|
if (zvrf)
|
||||||
zvrf->removals++;
|
zvrf->removals++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user