summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/rib.h6
-rw-r--r--zebra/rt.h52
-rw-r--r--zebra/rt_netlink.c85
-rw-r--r--zebra/rt_socket.c18
-rw-r--r--zebra/zebra_mpls.c90
-rw-r--r--zebra/zebra_mpls_netlink.c62
-rw-r--r--zebra/zebra_mpls_null.c12
-rw-r--r--zebra/zebra_mpls_openbsd.c55
-rw-r--r--zebra/zebra_rib.c101
9 files changed, 290 insertions, 191 deletions
diff --git a/zebra/rib.h b/zebra/rib.h
index 61beebb409..818844cb6d 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -285,9 +285,9 @@ extern int zebra_check_addr(struct prefix *p);
extern void rib_addnode(struct route_node *rn, struct route_entry *re,
int process);
extern void rib_delnode(struct route_node *rn, struct route_entry *re);
-extern int rib_install_kernel(struct route_node *rn, struct route_entry *re,
- struct route_entry *old);
-extern int rib_uninstall_kernel(struct route_node *rn, struct route_entry *re);
+extern void rib_install_kernel(struct route_node *rn, struct route_entry *re,
+ struct route_entry *old);
+extern void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re);
/* NOTE:
* All rib_add function will not just add prefix into RIB, but
diff --git a/zebra/rt.h b/zebra/rt.h
index 3ce15e9640..6bbe69e983 100644
--- a/zebra/rt.h
+++ b/zebra/rt.h
@@ -41,17 +41,59 @@
* success failure should be handled by the caller.
*/
-extern int kernel_route_rib(struct prefix *, struct prefix *,
- struct route_entry *, struct route_entry *);
+
+enum southbound_results {
+ SOUTHBOUND_INSTALL_SUCCESS,
+ SOUTHBOUND_INSTALL_FAILURE,
+ SOUTHBOUND_DELETE_SUCCESS,
+ SOUTHBOUND_DELETE_FAILURE,
+};
+
+/*
+ * Install/delete the specified prefix p from the kernel
+ *
+ * old = NULL, new = pointer - Install new
+ * old = pointer, new = pointer - Route replace Old w/ New
+ * old = pointer, new = NULL, - Route Delete
+ *
+ * Please note not all kernels support route replace
+ * semantics so we will end up with a delete than
+ * a re-add.
+ */
+extern void kernel_route_rib(struct prefix *p, struct prefix *src_p,
+ struct route_entry *old, struct route_entry *new);
+
+/*
+ * So route install/failure may not be immediately known
+ * so let's separate it out and allow the result to
+ * be passed back up.
+ */
+extern void kernel_route_rib_pass_fail(struct prefix *p,
+ struct route_entry *re,
+ enum southbound_results res);
extern int kernel_address_add_ipv4(struct interface *, struct connected *);
extern int kernel_address_delete_ipv4(struct interface *, struct connected *);
extern int kernel_neigh_update(int, int, uint32_t, char *, int);
extern int kernel_interface_set_master(struct interface *master,
struct interface *slave);
-extern int kernel_add_lsp(zebra_lsp_t *);
-extern int kernel_upd_lsp(zebra_lsp_t *);
-extern int kernel_del_lsp(zebra_lsp_t *);
+
+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);
+
+/*
+ * Add the ability to pass back up the lsp install/delete
+ * success/failure.
+ *
+ * This functions goal is similiar to kernel_route_rib_pass_fail
+ * in that we are separating out the mechanics for
+ * the install/failure to set/unset flags and to notify
+ * as needed.
+ */
+extern void kernel_lsp_pass_fail(zebra_lsp_t *lsp,
+ enum southbound_results res);
+
extern int mpls_kernel_init(void);
extern int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *mroute);
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 3830e1fbde..cbe736e00c 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1598,33 +1598,51 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
return suc;
}
-int kernel_route_rib(struct prefix *p, struct prefix *src_p,
- struct route_entry *old, struct route_entry *new)
+void kernel_route_rib(struct prefix *p, struct prefix *src_p,
+ struct route_entry *old, struct route_entry *new)
{
+ int ret = 0;
+
assert(old || new);
- if (!old && new)
- return netlink_route_multipath(RTM_NEWROUTE, p, src_p, new, 0);
- if (old && !new)
- return netlink_route_multipath(RTM_DELROUTE, p, src_p, old, 0);
+ if (new) {
+ if (p->family == AF_INET)
+ ret = netlink_route_multipath(RTM_NEWROUTE, p, src_p,
+ new, (old) ? 1 : 0);
+ else {
+ /*
+ * So v6 route replace semantics are not in
+ * the kernel at this point as I understand it.
+ * So let's do a delete than an add.
+ * In the future once v6 route replace semantics
+ * are in we can figure out what to do here to
+ * allow working with old and new kernels.
+ *
+ * I'm also intentionally ignoring the failure case
+ * of the route delete. If that happens yeah we're
+ * screwed.
+ */
+ if (old)
+ netlink_route_multipath(RTM_DELROUTE, p,
+ src_p, old, 0);
+ ret = netlink_route_multipath(RTM_NEWROUTE, p,
+ src_p, new, 0);
+ }
+ kernel_route_rib_pass_fail(p, new,
+ (!ret) ?
+ SOUTHBOUND_INSTALL_SUCCESS :
+ SOUTHBOUND_INSTALL_FAILURE);
+ return;
+ }
- if (p->family == AF_INET)
- return netlink_route_multipath(RTM_NEWROUTE, p, src_p, new, 1);
+ if (old) {
+ ret = netlink_route_multipath(RTM_DELROUTE, p, src_p, old, 0);
- /*
- * So v6 route replace semantics are not in the kernel at this
- * point as I understand it.
- * So let's do a delete than an add.
- * In the future once v6 route replace semantics are in
- * we can figure out what to do here to allow working
- * with old and new kernels.
- *
- * I'm also intentionally ignoring the failure case
- * of the route delete. If that happens yeah we're
- * screwed.
- */
- netlink_route_multipath(RTM_DELROUTE, p, src_p, old, 0);
- return netlink_route_multipath(RTM_NEWROUTE, p, src_p, new, 0);
+ kernel_route_rib_pass_fail(p, old,
+ (!ret) ?
+ SOUTHBOUND_DELETE_SUCCESS :
+ SOUTHBOUND_DELETE_FAILURE);
+ }
}
int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
@@ -2414,17 +2432,6 @@ int netlink_mpls_multipath(int cmd, zebra_lsp_t *lsp)
_netlink_mpls_build_singlepath(routedesc, nhlfe,
&req.n, &req.r,
sizeof req, cmd);
- if (cmd == RTM_NEWROUTE) {
- SET_FLAG(nhlfe->flags,
- NHLFE_FLAG_INSTALLED);
- SET_FLAG(nexthop->flags,
- NEXTHOP_FLAG_FIB);
- } else {
- UNSET_FLAG(nhlfe->flags,
- NHLFE_FLAG_INSTALLED);
- UNSET_FLAG(nexthop->flags,
- NEXTHOP_FLAG_FIB);
- }
nexthop_num++;
break;
}
@@ -2468,18 +2475,6 @@ int netlink_mpls_multipath(int cmd, zebra_lsp_t *lsp)
rta, rtnh, &req.r,
&src1);
rtnh = RTNH_NEXT(rtnh);
-
- if (cmd == RTM_NEWROUTE) {
- SET_FLAG(nhlfe->flags,
- NHLFE_FLAG_INSTALLED);
- SET_FLAG(nexthop->flags,
- NEXTHOP_FLAG_FIB);
- } else {
- UNSET_FLAG(nhlfe->flags,
- NHLFE_FLAG_INSTALLED);
- UNSET_FLAG(nexthop->flags,
- NEXTHOP_FLAG_FIB);
- }
}
}
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c
index e588794947..0d1a80e737 100644
--- a/zebra/rt_socket.c
+++ b/zebra/rt_socket.c
@@ -387,14 +387,14 @@ static int kernel_rtm(int cmd, struct prefix *p, struct route_entry *re)
return 0;
}
-int kernel_route_rib(struct prefix *p, struct prefix *src_p,
- struct route_entry *old, struct route_entry *new)
+void kernel_route_rib(struct prefix *p, struct prefix *src_p,
+ struct route_entry *old, struct route_entry *new)
{
int route = 0;
if (src_p && src_p->prefixlen) {
zlog_err("route add: IPv6 sourcedest routes unsupported!");
- return 1;
+ return;
}
if (zserv_privs.change(ZPRIVS_RAISE))
@@ -409,7 +409,17 @@ int kernel_route_rib(struct prefix *p, struct prefix *src_p,
if (zserv_privs.change(ZPRIVS_LOWER))
zlog_err("Can't lower privileges");
- return route;
+ if (new) {
+ kernel_route_rib_pass_fail(p, new,
+ (!route) ?
+ SOUTHBOUND_INSTALL_SUCCESS :
+ SOUTHBOUND_INSTALL_FAILURE);
+ } else {
+ kernel_route_rib_pass_fail(p, old,
+ (!route) ?
+ SOUTHBOUND_DELETE_SUCCESS :
+ SOUTHBOUND_DELETE_FAILURE);
+ }
}
int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c
index 320176ba3a..4c6fb002dc 100644
--- a/zebra/zebra_mpls.c
+++ b/zebra/zebra_mpls.c
@@ -839,18 +839,11 @@ static void lsp_select_best_nhlfe(zebra_lsp_t *lsp)
*/
static void lsp_uninstall_from_kernel(struct hash_backet *backet, void *ctxt)
{
- int ret;
zebra_lsp_t *lsp;
lsp = (zebra_lsp_t *)backet->data;
- if (CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
- ret = kernel_del_lsp(lsp);
-
- if (!ret) {
- UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
- clear_nhlfe_installed(lsp);
- }
- }
+ if (CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED))
+ kernel_del_lsp(lsp);
}
/*
@@ -871,7 +864,6 @@ static void lsp_schedule(struct hash_backet *backet, void *ctxt)
*/
static wq_item_status lsp_process(struct work_queue *wq, void *data)
{
- int ret = 1;
zebra_lsp_t *lsp;
zebra_nhlfe_t *oldbest, *newbest;
char buf[BUFSIZ], buf2[BUFSIZ];
@@ -905,12 +897,7 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
if (newbest) {
UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
- ret = kernel_add_lsp(lsp);
-
- if (!ret)
- SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
- else
- clear_nhlfe_installed(lsp);
+ kernel_add_lsp(lsp);
zvrf->lsp_installs++;
}
@@ -918,25 +905,38 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
/* Installed, may need an update and/or delete. */
if (!newbest) {
- ret = kernel_del_lsp(lsp);
-
- if (!ret) {
- UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
- clear_nhlfe_installed(lsp);
- }
+ kernel_del_lsp(lsp);
zvrf->lsp_removals++;
} else if (CHECK_FLAG(lsp->flags, LSP_FLAG_CHANGED)) {
+ zebra_nhlfe_t *nhlfe;
+ struct nexthop *nexthop;
UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
- ret = kernel_upd_lsp(lsp);
+ /*
+ * Any NHLFE that was installed but is not
+ * selected now needs to have its flags updated.
+ */
+ for (nhlfe = lsp->nhlfe_list;
+ nhlfe; nhlfe = nhlfe->next) {
+ nexthop = nhlfe->nexthop;
+ if (!nexthop)
+ continue;
+
+ if (CHECK_FLAG(nhlfe->flags,
+ NHLFE_FLAG_INSTALLED) &&
+ !CHECK_FLAG(nhlfe->flags,
+ NHLFE_FLAG_SELECTED)) {
+ UNSET_FLAG(nhlfe->flags,
+ NHLFE_FLAG_INSTALLED);
+ UNSET_FLAG(nexthop->flags,
+ NEXTHOP_FLAG_FIB);
+ }
+ }
- if (!ret)
- SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
- else
- clear_nhlfe_installed(lsp);
+ kernel_upd_lsp(lsp);
zvrf->lsp_installs++;
}
@@ -1659,6 +1659,42 @@ static int mpls_processq_init(struct zebra_t *zebra)
/* Public functions */
+void kernel_lsp_pass_fail(zebra_lsp_t *lsp,
+ enum southbound_results res)
+{
+ struct nexthop *nexthop;
+ zebra_nhlfe_t *nhlfe;
+
+ if (!lsp)
+ return;
+
+ switch (res) {
+ case SOUTHBOUND_INSTALL_FAILURE:
+ UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+ clear_nhlfe_installed(lsp);
+ zlog_warn("LSP Install Failure: %u", lsp->ile.in_label);
+ break;
+ case SOUTHBOUND_INSTALL_SUCCESS:
+ SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+ for (nhlfe = lsp->nhlfe_list; nhlfe; nhlfe = nhlfe->next) {
+ nexthop = nhlfe->nexthop;
+ if (!nexthop)
+ continue;
+
+ SET_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED);
+ SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
+ }
+ break;
+ case SOUTHBOUND_DELETE_SUCCESS:
+ UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+ clear_nhlfe_installed(lsp);
+ break;
+ case SOUTHBOUND_DELETE_FAILURE:
+ zlog_warn("LSP Deletion Failure: %u", lsp->ile.in_label);
+ break;
+ }
+}
+
/*
* String to label conversion, labels separated by '/'.
*
diff --git a/zebra/zebra_mpls_netlink.c b/zebra/zebra_mpls_netlink.c
index 0abc4959fa..3c8d25189e 100644
--- a/zebra/zebra_mpls_netlink.c
+++ b/zebra/zebra_mpls_netlink.c
@@ -29,16 +29,21 @@
/*
* Install Label Forwarding entry into the kernel.
*/
-int kernel_add_lsp(zebra_lsp_t *lsp)
+void kernel_add_lsp(zebra_lsp_t *lsp)
{
int ret;
- if (!lsp || !lsp->best_nhlfe) // unexpected
- return -1;
+ if (!lsp || !lsp->best_nhlfe) { // unexpected
+ kernel_lsp_pass_fail(lsp, SOUTHBOUND_INSTALL_FAILURE);
+ return;
+ }
ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ?
+ SOUTHBOUND_INSTALL_SUCCESS :
+ SOUTHBOUND_INSTALL_FAILURE);
}
/*
@@ -52,51 +57,48 @@ int 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.
*/
-int kernel_upd_lsp(zebra_lsp_t *lsp)
+void kernel_upd_lsp(zebra_lsp_t *lsp)
{
int ret;
- zebra_nhlfe_t *nhlfe;
- struct nexthop *nexthop;
- if (!lsp || !lsp->best_nhlfe) // unexpected
- return -1;
-
- /* Any NHLFE that was installed but is not selected now needs to
- * have its flags updated.
- */
- for (nhlfe = lsp->nhlfe_list; nhlfe; nhlfe = nhlfe->next) {
- nexthop = nhlfe->nexthop;
- if (!nexthop)
- continue;
-
- if (CHECK_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED) &&
- !CHECK_FLAG(nhlfe->flags, NHLFE_FLAG_SELECTED)) {
- UNSET_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED);
- UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- }
+ if (!lsp || !lsp->best_nhlfe) { // unexpected
+ kernel_lsp_pass_fail(lsp, SOUTHBOUND_INSTALL_FAILURE);
+ return;
}
ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ?
+ SOUTHBOUND_INSTALL_SUCCESS :
+ SOUTHBOUND_INSTALL_FAILURE);
}
/*
* Delete Label Forwarding entry from the kernel.
*/
-int kernel_del_lsp(zebra_lsp_t *lsp)
+void kernel_del_lsp(zebra_lsp_t *lsp)
{
int ret;
- if (!lsp) // unexpected
- return -1;
+ if (!lsp) { // unexpected
+ kernel_lsp_pass_fail(lsp,
+ SOUTHBOUND_DELETE_FAILURE);
+ return;
+ }
- if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED))
- return -1;
+ if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
+ kernel_lsp_pass_fail(lsp,
+ SOUTHBOUND_DELETE_FAILURE);
+ return;
+ }
ret = netlink_mpls_multipath(RTM_DELROUTE, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ?
+ SOUTHBOUND_DELETE_SUCCESS :
+ SOUTHBOUND_DELETE_FAILURE);
}
int mpls_kernel_init(void)
diff --git a/zebra/zebra_mpls_null.c b/zebra/zebra_mpls_null.c
index e4dc570fd9..6b5318325d 100644
--- a/zebra/zebra_mpls_null.c
+++ b/zebra/zebra_mpls_null.c
@@ -24,17 +24,17 @@
#if !defined(HAVE_NETLINK) && !defined(OPEN_BSD)
-int kernel_add_lsp(zebra_lsp_t *lsp)
+void kernel_add_lsp(zebra_lsp_t *lsp)
{
- return 0;
+ return;
}
-int kernel_upd_lsp(zebra_lsp_t *lsp)
+void kernel_upd_lsp(zebra_lsp_t *lsp)
{
- return 0;
+ return;
}
-int kernel_del_lsp(zebra_lsp_t *lsp)
+void kernel_del_lsp(zebra_lsp_t *lsp)
{
- return 0;
+ return;
}
int mpls_kernel_init(void)
{
diff --git a/zebra/zebra_mpls_openbsd.c b/zebra/zebra_mpls_openbsd.c
index 44f89f0b3b..2fc93893fa 100644
--- a/zebra/zebra_mpls_openbsd.c
+++ b/zebra/zebra_mpls_openbsd.c
@@ -279,56 +279,69 @@ static int kernel_lsp_cmd(int action, zebra_lsp_t *lsp)
default:
break;
}
- if (action == RTM_ADD || action == RTM_CHANGE) {
- SET_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED);
- SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- } else {
- UNSET_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED);
- UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- }
}
}
return (0);
}
-int kernel_add_lsp(zebra_lsp_t *lsp)
+void kernel_add_lsp(zebra_lsp_t *lsp)
{
int ret;
- if (!lsp || !lsp->best_nhlfe) // unexpected
- return -1;
+ if (!lsp || !lsp->best_nhlfe) { // unexpected
+ kernel_lsp_pass_fail(lsp, SOUTHBOUND_INSTALL_FAILURE);
+ return;
+ }
ret = kernel_lsp_cmd(RTM_ADD, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ?
+ SOUTHBOUND_INSTALL_SUCCESS :
+ SOUTHBOUND_INSTALL_FAILURE);
}
-int kernel_upd_lsp(zebra_lsp_t *lsp)
+void kernel_upd_lsp(zebra_lsp_t *lsp)
{
int ret;
- if (!lsp || !lsp->best_nhlfe) // unexpected
- return -1;
+ if (!lsp || !lsp->best_nhlfe) { // unexpected
+ kernel_lsp_pass_fail(lsp, SOUTHBOUND_INSTALL_FAILURE);
+ return;
+ }
ret = kernel_lsp_cmd(RTM_CHANGE, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ?
+ SOUTHBOUND_INSTALL_SUCCESS :
+ SOUTHBOUND_INSTALL_FAILURE);
+ return;
}
-int kernel_del_lsp(zebra_lsp_t *lsp)
+void kernel_del_lsp(zebra_lsp_t *lsp)
{
int ret;
- if (!lsp) // unexpected
- return -1;
+ if (!lsp) { // unexpected
+ kernel_lsp_pass_fail(lsp,
+ SOUTHBOUND_DELETE_FAILURE);
+ return;
+ }
- if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED))
- return -1;
+ if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
+ kernel_lsp_pass_fail(lsp,
+ SOUTHBOUND_DELETE_FAILURE);
+ return;
+ }
ret = kernel_lsp_cmd(RTM_DELETE, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ?
+ SOUTHBOUND_DELETE_SUCCESS :
+ SOUTHBOUND_DELETE_FAILURE);
}
static int kmpw_install(struct zebra_pw *pw)
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 791f319120..58b6965995 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -993,13 +993,49 @@ int zebra_rib_labeled_unicast(struct route_entry *re)
return 1;
}
+void kernel_route_rib_pass_fail(struct prefix *p, struct route_entry *re,
+ enum southbound_results res)
+{
+ struct nexthop *nexthop;
+ char buf[PREFIX_STRLEN];
+
+ switch (res) {
+ case SOUTHBOUND_INSTALL_SUCCESS:
+ for (ALL_NEXTHOPS(re->nexthop, nexthop)) {
+ if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
+ continue;
+
+ if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE))
+ SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
+ else
+ UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
+ }
+ zsend_route_notify_owner(re->type, re->instance, re->vrf_id,
+ p, ZAPI_ROUTE_INSTALLED);
+ break;
+ case SOUTHBOUND_INSTALL_FAILURE:
+ zsend_route_notify_owner(re->type, re->instance, re->vrf_id,
+ p, ZAPI_ROUTE_FAIL_INSTALL);
+ zlog_warn("%u:%s: Route install failed", re->vrf_id,
+ prefix2str(p, buf, sizeof(buf)));
+ break;
+ case SOUTHBOUND_DELETE_SUCCESS:
+ for (ALL_NEXTHOPS(re->nexthop, nexthop))
+ UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
+ break;
+ case SOUTHBOUND_DELETE_FAILURE:
+ zlog_warn("%u:%s: Route Deletion failure", re->vrf_id,
+ prefix2str(p, buf, sizeof(buf)));
+ break;
+ }
+}
+
/* Update flag indicates whether this is a "replace" or not. Currently, this
* is only used for IPv4.
*/
-int rib_install_kernel(struct route_node *rn, struct route_entry *re,
- struct route_entry *old)
+void rib_install_kernel(struct route_node *rn, struct route_entry *re,
+ struct route_entry *old)
{
- int ret = 0;
struct nexthop *nexthop;
rib_table_info_t *info = srcdest_rnode_table_info(rn);
struct prefix *p, *src_p;
@@ -1010,7 +1046,7 @@ int rib_install_kernel(struct route_node *rn, struct route_entry *re,
if (info->safi != SAFI_UNICAST) {
for (ALL_NEXTHOPS(re->nexthop, nexthop))
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- return ret;
+ return;
} else {
struct nexthop *prev;
@@ -1042,33 +1078,15 @@ int rib_install_kernel(struct route_node *rn, struct route_entry *re,
* the kernel.
*/
hook_call(rib_update, rn, "installing in kernel");
- ret = kernel_route_rib(p, src_p, old, re);
+ kernel_route_rib(p, src_p, old, re);
zvrf->installs++;
- /* If install succeeds, update FIB flag for nexthops. */
- if (!ret) {
- for (ALL_NEXTHOPS(re->nexthop, nexthop)) {
- if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
- continue;
-
- if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE))
- SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- else
- UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- }
- zsend_route_notify_owner(re->type, re->instance, re->vrf_id,
- p, ZAPI_ROUTE_INSTALLED);
- } else
- zsend_route_notify_owner(re->type, re->instance, re->vrf_id,
- p, ZAPI_ROUTE_FAIL_INSTALL);
-
- return ret;
+ return;
}
/* Uninstall the route from kernel. */
-int rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
+void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
{
- int ret = 0;
struct nexthop *nexthop;
rib_table_info_t *info = srcdest_rnode_table_info(rn);
struct prefix *p, *src_p;
@@ -1079,7 +1097,7 @@ int rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
if (info->safi != SAFI_UNICAST) {
for (ALL_NEXTHOPS(re->nexthop, nexthop))
UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- return ret;
+ return;
}
/*
@@ -1087,13 +1105,10 @@ int rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
* the kernel.
*/
hook_call(rib_update, rn, "uninstalling from kernel");
- ret = kernel_route_rib(p, src_p, re, NULL);
+ kernel_route_rib(p, src_p, re, NULL);
zvrf->removals++;
- for (ALL_NEXTHOPS(re->nexthop, nexthop))
- UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
-
- return ret;
+ return;
}
/* Uninstall the route from kernel. */
@@ -1207,14 +1222,8 @@ static void rib_process_add_fib(struct zebra_vrf *zvrf, struct route_node *rn,
if (zebra_rib_labeled_unicast(new))
zebra_mpls_lsp_install(zvrf, rn, new);
- if (!RIB_SYSTEM_ROUTE(new)) {
- if (rib_install_kernel(rn, new, NULL)) {
- char buf[SRCDEST2STR_BUFFER];
- srcdest_rnode2str(rn, buf, sizeof(buf));
- zlog_warn("%u:%s: Route install failed", zvrf_id(zvrf),
- buf);
- }
- }
+ if (!RIB_SYSTEM_ROUTE(new))
+ rib_install_kernel(rn, new, NULL);
UNSET_FLAG(new->status, ROUTE_ENTRY_CHANGED);
}
@@ -1301,13 +1310,7 @@ static void rib_process_update_fib(struct zebra_vrf *zvrf,
if (zebra_rib_labeled_unicast(new))
zebra_mpls_lsp_install(zvrf, rn, new);
- if (rib_install_kernel(rn, new, old)) {
- char buf[SRCDEST2STR_BUFFER];
- srcdest_rnode2str(rn, buf, sizeof(buf));
- installed = 0;
- zlog_warn("%u:%s: Route install failed",
- zvrf_id(zvrf), buf);
- }
+ rib_install_kernel(rn, new, old);
}
/* If install succeeded or system route, cleanup flags
@@ -2633,7 +2636,6 @@ static void rib_sweep_table(struct route_table *table)
struct route_entry *re;
struct route_entry *next;
struct nexthop *nexthop;
- int ret = 0;
if (!table)
return;
@@ -2670,9 +2672,8 @@ static void rib_sweep_table(struct route_table *table)
for (ALL_NEXTHOPS(re->nexthop, nexthop))
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- ret = rib_uninstall_kernel(rn, re);
- if (!ret)
- rib_delnode(rn, re);
+ rib_uninstall_kernel(rn, re);
+ rib_delnode(rn, re);
}
}
}