zebra: Add enum dp_req_result to lsp install/deletes

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-05-25 11:07:34 -04:00
parent ebecd64913
commit 7c5d0e1853
5 changed files with 68 additions and 34 deletions

View File

@ -90,9 +90,9 @@ extern int kernel_neigh_update(int cmd, int ifindex, uint32_t addr, char *lla,
extern int kernel_interface_set_master(struct interface *master,
struct interface *slave);
extern void kernel_add_lsp(zebra_lsp_t *lsp);
extern void kernel_upd_lsp(zebra_lsp_t *lsp);
extern void kernel_del_lsp(zebra_lsp_t *lsp);
extern enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp);
extern enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp);
extern enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp);
/*
* Add the ability to pass back up the lsp install/delete

View File

@ -860,7 +860,7 @@ static void lsp_uninstall_from_kernel(struct hash_backet *backet, void *ctxt)
lsp = (zebra_lsp_t *)backet->data;
if (CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED))
kernel_del_lsp(lsp);
(void)kernel_del_lsp(lsp);
}
/*
@ -914,17 +914,31 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
if (newbest) {
UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
kernel_add_lsp(lsp);
switch (kernel_add_lsp(lsp)) {
case DP_REQUEST_QUEUED:
zlog_err("No current DataPlane interfaces can return this, please fix");
break;
case DP_REQUEST_FAILURE:
break;
case DP_REQUEST_SUCCESS:
zvrf->lsp_installs++;
break;
}
}
} else {
/* Installed, may need an update and/or delete. */
if (!newbest) {
kernel_del_lsp(lsp);
switch (kernel_del_lsp(lsp)) {
case DP_REQUEST_QUEUED:
zlog_err("No current DataPlane interfaces can return this, please fix");
break;
case DP_REQUEST_FAILURE:
break;
case DP_REQUEST_SUCCESS:
zvrf->lsp_removals++;
break;
}
} else if (CHECK_FLAG(lsp->flags, LSP_FLAG_CHANGED)) {
zebra_nhlfe_t *nhlfe;
struct nexthop *nexthop;
@ -953,9 +967,16 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
}
}
kernel_upd_lsp(lsp);
switch (kernel_upd_lsp(lsp)) {
case DP_REQUEST_QUEUED:
zlog_err("No current DataPlane interfaces can return this, please fix");
break;
case DP_REQUEST_FAILURE:
break;
case DP_REQUEST_SUCCESS:
zvrf->lsp_installs++;
break;
}
}
}

View File

@ -29,13 +29,13 @@
/*
* Install Label Forwarding entry into the kernel.
*/
void kernel_add_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
{
int ret;
if (!lsp || !lsp->best_nhlfe) { // unexpected
kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
@ -43,6 +43,8 @@ void kernel_add_lsp(zebra_lsp_t *lsp)
kernel_lsp_pass_fail(lsp,
(!ret) ? DP_INSTALL_SUCCESS
: DP_INSTALL_FAILURE);
return DP_REQUEST_SUCCESS;
}
/*
@ -56,13 +58,13 @@ void kernel_add_lsp(zebra_lsp_t *lsp)
* through the metric field (before kernel-MPLS). This shouldn't be an issue
* any longer, so REPLACE can be reintroduced.
*/
void kernel_upd_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp)
{
int ret;
if (!lsp || !lsp->best_nhlfe) { // unexpected
kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
@ -70,23 +72,25 @@ void kernel_upd_lsp(zebra_lsp_t *lsp)
kernel_lsp_pass_fail(lsp,
(!ret) ? DP_INSTALL_SUCCESS
: DP_INSTALL_FAILURE);
return DP_REQUEST_SUCCESS;
}
/*
* Delete Label Forwarding entry from the kernel.
*/
void kernel_del_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp)
{
int ret;
if (!lsp) { // unexpected
kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
ret = netlink_mpls_multipath(RTM_DELROUTE, lsp);
@ -94,6 +98,8 @@ void kernel_del_lsp(zebra_lsp_t *lsp)
kernel_lsp_pass_fail(lsp,
(!ret) ? DP_DELETE_SUCCESS
: DP_DELETE_FAILURE);
return DP_REQUEST_SUCCESS;
}
int mpls_kernel_init(void)

View File

@ -24,18 +24,21 @@
#if !defined(HAVE_NETLINK) && !defined(OPEN_BSD)
void kernel_add_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
{
return;
return DP_REQUEST_SUCCESS;
}
void kernel_upd_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp)
{
return;
return DP_REQUEST_SUCCESS;
}
void kernel_del_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp)
{
return;
return DP_REQUEST_SUCCESS;
}
int mpls_kernel_init(void)
{
return -1;

View File

@ -285,13 +285,13 @@ static int kernel_lsp_cmd(int action, zebra_lsp_t *lsp)
return (0);
}
void kernel_add_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
{
int ret;
if (!lsp || !lsp->best_nhlfe) { // unexpected
kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
ret = kernel_lsp_cmd(RTM_ADD, lsp);
@ -299,15 +299,17 @@ void kernel_add_lsp(zebra_lsp_t *lsp)
kernel_lsp_pass_fail(lsp,
(!ret) ? DP_INSTALL_SUCCESS
: DP_INSTALL_FAILURE);
return DP_REQUEST_SUCCESS;
}
void kernel_upd_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp)
{
int ret;
if (!lsp || !lsp->best_nhlfe) { // unexpected
kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
ret = kernel_lsp_cmd(RTM_CHANGE, lsp);
@ -315,21 +317,21 @@ void kernel_upd_lsp(zebra_lsp_t *lsp)
kernel_lsp_pass_fail(lsp,
(!ret) ? DP_INSTALL_SUCCESS
: DP_INSTALL_FAILURE);
return;
return DP_REQUEST_SUCCESS;
}
void kernel_del_lsp(zebra_lsp_t *lsp)
enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp)
{
int ret;
if (!lsp) { // unexpected
kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
return;
return DP_REQUEST_FAILURE;
}
ret = kernel_lsp_cmd(RTM_DELETE, lsp);
@ -337,6 +339,8 @@ void kernel_del_lsp(zebra_lsp_t *lsp)
kernel_lsp_pass_fail(lsp,
(!ret) ? DP_DELETE_SUCCESS
: DP_DELETE_FAILURE);
return DP_REQUEST_SUCCESS;
}
static int kmpw_install(struct zebra_pw *pw)