diff options
-rw-r--r-- | zebra/rt.h | 34 | ||||
-rw-r--r-- | zebra/rt_netlink.c | 20 | ||||
-rw-r--r-- | zebra/rt_socket.c | 18 | ||||
-rw-r--r-- | zebra/rule_netlink.c | 16 | ||||
-rw-r--r-- | zebra/rule_socket.c | 9 | ||||
-rw-r--r-- | zebra/zebra_mpls.c | 51 | ||||
-rw-r--r-- | zebra/zebra_mpls_netlink.c | 40 | ||||
-rw-r--r-- | zebra/zebra_mpls_null.c | 15 | ||||
-rw-r--r-- | zebra/zebra_mpls_openbsd.c | 40 | ||||
-rw-r--r-- | zebra/zebra_pbr.c | 60 | ||||
-rw-r--r-- | zebra/zebra_pbr.h | 14 | ||||
-rw-r--r-- | zebra/zebra_rib.c | 38 |
12 files changed, 216 insertions, 139 deletions
diff --git a/zebra/rt.h b/zebra/rt.h index fd298fd23..ad1fe9a1f 100644 --- a/zebra/rt.h +++ b/zebra/rt.h @@ -42,11 +42,17 @@ */ -enum southbound_results { - SOUTHBOUND_INSTALL_SUCCESS, - SOUTHBOUND_INSTALL_FAILURE, - SOUTHBOUND_DELETE_SUCCESS, - SOUTHBOUND_DELETE_FAILURE, +enum dp_results { + DP_INSTALL_SUCCESS, + DP_INSTALL_FAILURE, + DP_DELETE_SUCCESS, + DP_DELETE_FAILURE, +}; + +enum dp_req_result { + DP_REQUEST_QUEUED, + DP_REQUEST_SUCCESS, + DP_REQUEST_FAILURE, }; /* @@ -60,9 +66,11 @@ enum southbound_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, - struct route_entry *new); +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); /* * So route install/failure may not be immediately known @@ -71,7 +79,7 @@ extern void kernel_route_rib(struct route_node *rn, struct prefix *p, */ extern void kernel_route_rib_pass_fail(struct route_node *rn, struct prefix *p, struct route_entry *re, - enum southbound_results res); + enum dp_results res); extern int kernel_address_add_ipv4(struct interface *, struct connected *); extern int kernel_address_delete_ipv4(struct interface *, struct connected *); @@ -82,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 @@ -95,7 +103,7 @@ extern void kernel_del_lsp(zebra_lsp_t *lsp); * 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 void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum dp_results res); extern int mpls_kernel_init(void); diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index e9b3e59d0..a5f288f54 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1689,9 +1689,11 @@ 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, - struct prefix *src_p, struct route_entry *old, - struct route_entry *new) +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 ret = 0; @@ -1721,18 +1723,20 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p, new, 0); } kernel_route_rib_pass_fail(rn, p, new, - (!ret) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); - return; + (!ret) ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); + return DP_REQUEST_SUCCESS; } if (old) { ret = netlink_route_multipath(RTM_DELROUTE, p, src_p, old, 0); kernel_route_rib_pass_fail(rn, p, old, - (!ret) ? SOUTHBOUND_DELETE_SUCCESS - : SOUTHBOUND_DELETE_FAILURE); + (!ret) ? DP_DELETE_SUCCESS + : DP_DELETE_FAILURE); } + + return DP_REQUEST_SUCCESS; } int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla, diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c index f9cd1cbab..3380f225c 100644 --- a/zebra/rt_socket.c +++ b/zebra/rt_socket.c @@ -385,9 +385,11 @@ 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, - struct route_entry *new) +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; @@ -411,14 +413,16 @@ void kernel_route_rib(struct route_node *rn, struct prefix *p, if (new) { kernel_route_rib_pass_fail( rn, p, new, - (!route) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + (!route) ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); } else { kernel_route_rib_pass_fail(rn, p, old, (!route) - ? SOUTHBOUND_DELETE_SUCCESS - : SOUTHBOUND_DELETE_FAILURE); + ? DP_DELETE_SUCCESS + : DP_DELETE_FAILURE); } + + return DP_REQUEST_SUCCESS; } int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla, diff --git a/zebra/rule_netlink.c b/zebra/rule_netlink.c index f0ed8f2f5..bcffdf472 100644 --- a/zebra/rule_netlink.c +++ b/zebra/rule_netlink.c @@ -142,27 +142,31 @@ static int netlink_rule_update(int cmd, struct zebra_pbr_rule *rule) * goes in the rule to denote relative ordering; it may or may not be the * same as the rule's user-defined sequence number. */ -void kernel_add_pbr_rule(struct zebra_pbr_rule *rule) +enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule) { int ret = 0; ret = netlink_rule_update(RTM_NEWRULE, rule); kernel_pbr_rule_add_del_status(rule, - (!ret) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + (!ret) ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); + + return DP_REQUEST_SUCCESS; } /* * Uninstall specified rule for a specific interface. */ -void kernel_del_pbr_rule(struct zebra_pbr_rule *rule) +enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule) { int ret = 0; ret = netlink_rule_update(RTM_DELRULE, rule); kernel_pbr_rule_add_del_status(rule, - (!ret) ? SOUTHBOUND_DELETE_SUCCESS - : SOUTHBOUND_DELETE_FAILURE); + (!ret) ? DP_DELETE_SUCCESS + : DP_DELETE_FAILURE); + + return DP_REQUEST_SUCCESS; } /* diff --git a/zebra/rule_socket.c b/zebra/rule_socket.c index 46c53f9e0..ecd642d80 100644 --- a/zebra/rule_socket.c +++ b/zebra/rule_socket.c @@ -41,11 +41,16 @@ #include "zebra/rule_netlink.h" #include "zebra/zebra_pbr.h" -void kernel_add_pbr_rule(struct zebra_pbr_rule *rule) +enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule) { + zlog_err("%s not Implemented for this platform", __PRETTY_FUNCTION__); + return DP_REQUEST_FAILURE; } -void kernel_del_pbr_rule(struct zebra_pbr_rule *rule) + +enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule) { + zlog_err("%s not Implemented for this platform", __PRETTY_FUNCTION__); + return DP_REQUEST_FAILURE; } #endif diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index e040808e0..fe0837a63 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -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); - - zvrf->lsp_installs++; + 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); - - zvrf->lsp_removals++; + 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); - - zvrf->lsp_installs++; + 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; + } } } @@ -1687,7 +1708,7 @@ static int mpls_processq_init(struct zebra_t *zebra) /* Public functions */ -void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum southbound_results res) +void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum dp_results res) { struct nexthop *nexthop; zebra_nhlfe_t *nhlfe; @@ -1696,12 +1717,12 @@ void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum southbound_results res) return; switch (res) { - case SOUTHBOUND_INSTALL_FAILURE: + case DP_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: + case DP_INSTALL_SUCCESS: SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED); for (nhlfe = lsp->nhlfe_list; nhlfe; nhlfe = nhlfe->next) { nexthop = nhlfe->nexthop; @@ -1712,11 +1733,11 @@ void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum southbound_results res) SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB); } break; - case SOUTHBOUND_DELETE_SUCCESS: + case DP_DELETE_SUCCESS: UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED); clear_nhlfe_installed(lsp); break; - case SOUTHBOUND_DELETE_FAILURE: + case DP_DELETE_FAILURE: zlog_warn("LSP Deletion Failure: %u", lsp->ile.in_label); break; } diff --git a/zebra/zebra_mpls_netlink.c b/zebra/zebra_mpls_netlink.c index d7c231c37..245a77178 100644 --- a/zebra/zebra_mpls_netlink.c +++ b/zebra/zebra_mpls_netlink.c @@ -29,20 +29,22 @@ /* * 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, SOUTHBOUND_INSTALL_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE); + return DP_REQUEST_FAILURE; } ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp); kernel_lsp_pass_fail(lsp, - (!ret) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + (!ret) ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); + + return DP_REQUEST_SUCCESS; } /* @@ -56,44 +58,48 @@ 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, SOUTHBOUND_INSTALL_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE); + return DP_REQUEST_FAILURE; } ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp); kernel_lsp_pass_fail(lsp, - (!ret) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + (!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, SOUTHBOUND_DELETE_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE); + return DP_REQUEST_FAILURE; } if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) { - kernel_lsp_pass_fail(lsp, SOUTHBOUND_DELETE_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE); + return DP_REQUEST_FAILURE; } ret = netlink_mpls_multipath(RTM_DELROUTE, lsp); kernel_lsp_pass_fail(lsp, - (!ret) ? SOUTHBOUND_DELETE_SUCCESS - : SOUTHBOUND_DELETE_FAILURE); + (!ret) ? DP_DELETE_SUCCESS + : DP_DELETE_FAILURE); + + return DP_REQUEST_SUCCESS; } int mpls_kernel_init(void) diff --git a/zebra/zebra_mpls_null.c b/zebra/zebra_mpls_null.c index 6b5318325..d1371d334 100644 --- a/zebra/zebra_mpls_null.c +++ b/zebra/zebra_mpls_null.c @@ -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; diff --git a/zebra/zebra_mpls_openbsd.c b/zebra/zebra_mpls_openbsd.c index 2d75353c7..412fe7d3d 100644 --- a/zebra/zebra_mpls_openbsd.c +++ b/zebra/zebra_mpls_openbsd.c @@ -285,58 +285,62 @@ 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, SOUTHBOUND_INSTALL_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE); + return DP_REQUEST_FAILURE; } ret = kernel_lsp_cmd(RTM_ADD, lsp); kernel_lsp_pass_fail(lsp, - (!ret) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + (!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, SOUTHBOUND_INSTALL_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE); + return DP_REQUEST_FAILURE; } ret = kernel_lsp_cmd(RTM_CHANGE, lsp); kernel_lsp_pass_fail(lsp, - (!ret) ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); - return; + (!ret) ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); + 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, SOUTHBOUND_DELETE_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE); + return DP_REQUEST_FAILURE; } if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) { - kernel_lsp_pass_fail(lsp, SOUTHBOUND_DELETE_FAILURE); - return; + kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE); + return DP_REQUEST_FAILURE; } ret = kernel_lsp_cmd(RTM_DELETE, lsp); kernel_lsp_pass_fail(lsp, - (!ret) ? SOUTHBOUND_DELETE_SUCCESS - : SOUTHBOUND_DELETE_FAILURE); + (!ret) ? DP_DELETE_SUCCESS + : DP_DELETE_FAILURE); + + return DP_REQUEST_SUCCESS; } static int kmpw_install(struct zebra_pw *pw) diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c index 799b85d4d..d511c8c6e 100644 --- a/zebra/zebra_pbr.c +++ b/zebra/zebra_pbr.c @@ -79,7 +79,7 @@ void zebra_pbr_rules_free(void *arg) rule = (struct zebra_pbr_rule *)arg; - kernel_del_pbr_rule(rule); + (void)kernel_del_pbr_rule(rule); XFREE(MTYPE_TMP, rule); } @@ -369,7 +369,7 @@ void zebra_pbr_add_rule(struct zebra_ns *zns, struct zebra_pbr_rule *rule) pbr_rule_lookup_unique(zns, rule->rule.unique, rule->ifp); (void)hash_get(zns->rules_hash, rule, pbr_rule_alloc_intern); - kernel_add_pbr_rule(rule); + (void)kernel_add_pbr_rule(rule); /* * Rule Replace semantics, if we have an old, install the * new rule, look above, and then delete the old @@ -383,7 +383,7 @@ void zebra_pbr_del_rule(struct zebra_ns *zns, struct zebra_pbr_rule *rule) struct zebra_pbr_rule *lookup; lookup = hash_lookup(zns->rules_hash, rule); - kernel_del_pbr_rule(rule); + (void)kernel_del_pbr_rule(rule); if (lookup) { hash_release(zns->rules_hash, lookup); @@ -400,7 +400,7 @@ static void zebra_pbr_cleanup_rules(struct hash_backet *b, void *data) int *sock = data; if (rule->sock == *sock) { - kernel_del_pbr_rule(rule); + (void)kernel_del_pbr_rule(rule); hash_release(zns->rules_hash, rule); XFREE(MTYPE_TMP, rule); } @@ -490,8 +490,8 @@ void zebra_pbr_create_ipset(struct zebra_ns *zns, ret = hook_call(zebra_pbr_ipset_wrap_script_update, zns, 1, ipset); kernel_pbr_ipset_add_del_status(ipset, - ret ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + ret ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); } void zebra_pbr_destroy_ipset(struct zebra_ns *zns, @@ -574,8 +574,8 @@ void zebra_pbr_add_ipset_entry(struct zebra_ns *zns, ret = hook_call(zebra_pbr_ipset_entry_wrap_script_update, zns, 1, ipset); kernel_pbr_ipset_entry_add_del_status(ipset, - ret ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + ret ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); } void zebra_pbr_del_ipset_entry(struct zebra_ns *zns, @@ -617,8 +617,8 @@ void zebra_pbr_add_iptable(struct zebra_ns *zns, pbr_iptable_alloc_intern); ret = hook_call(zebra_pbr_iptable_wrap_script_update, zns, 1, iptable); kernel_pbr_iptable_add_del_status(iptable, - ret ? SOUTHBOUND_INSTALL_SUCCESS - : SOUTHBOUND_INSTALL_FAILURE); + ret ? DP_INSTALL_SUCCESS + : DP_INSTALL_FAILURE); } void zebra_pbr_del_iptable(struct zebra_ns *zns, @@ -649,19 +649,19 @@ void zebra_pbr_del_iptable(struct zebra_ns *zns, * Handle success or failure of rule (un)install in the kernel. */ void kernel_pbr_rule_add_del_status(struct zebra_pbr_rule *rule, - enum southbound_results res) + enum dp_results res) { switch (res) { - case SOUTHBOUND_INSTALL_SUCCESS: + case DP_INSTALL_SUCCESS: zsend_rule_notify_owner(rule, ZAPI_RULE_INSTALLED); break; - case SOUTHBOUND_INSTALL_FAILURE: + case DP_INSTALL_FAILURE: zsend_rule_notify_owner(rule, ZAPI_RULE_FAIL_INSTALL); break; - case SOUTHBOUND_DELETE_SUCCESS: + case DP_DELETE_SUCCESS: zsend_rule_notify_owner(rule, ZAPI_RULE_REMOVED); break; - case SOUTHBOUND_DELETE_FAILURE: + case DP_DELETE_FAILURE: zsend_rule_notify_owner(rule, ZAPI_RULE_FAIL_REMOVE); break; } @@ -671,19 +671,19 @@ void kernel_pbr_rule_add_del_status(struct zebra_pbr_rule *rule, * Handle success or failure of ipset (un)install in the kernel. */ void kernel_pbr_ipset_add_del_status(struct zebra_pbr_ipset *ipset, - enum southbound_results res) + enum dp_results res) { switch (res) { - case SOUTHBOUND_INSTALL_SUCCESS: + case DP_INSTALL_SUCCESS: zsend_ipset_notify_owner(ipset, ZAPI_IPSET_INSTALLED); break; - case SOUTHBOUND_INSTALL_FAILURE: + case DP_INSTALL_FAILURE: zsend_ipset_notify_owner(ipset, ZAPI_IPSET_FAIL_INSTALL); break; - case SOUTHBOUND_DELETE_SUCCESS: + case DP_DELETE_SUCCESS: zsend_ipset_notify_owner(ipset, ZAPI_IPSET_REMOVED); break; - case SOUTHBOUND_DELETE_FAILURE: + case DP_DELETE_FAILURE: zsend_ipset_notify_owner(ipset, ZAPI_IPSET_FAIL_REMOVE); break; } @@ -694,22 +694,22 @@ void kernel_pbr_ipset_add_del_status(struct zebra_pbr_ipset *ipset, */ void kernel_pbr_ipset_entry_add_del_status( struct zebra_pbr_ipset_entry *ipset, - enum southbound_results res) + enum dp_results res) { switch (res) { - case SOUTHBOUND_INSTALL_SUCCESS: + case DP_INSTALL_SUCCESS: zsend_ipset_entry_notify_owner(ipset, ZAPI_IPSET_ENTRY_INSTALLED); break; - case SOUTHBOUND_INSTALL_FAILURE: + case DP_INSTALL_FAILURE: zsend_ipset_entry_notify_owner(ipset, ZAPI_IPSET_ENTRY_FAIL_INSTALL); break; - case SOUTHBOUND_DELETE_SUCCESS: + case DP_DELETE_SUCCESS: zsend_ipset_entry_notify_owner(ipset, ZAPI_IPSET_ENTRY_REMOVED); break; - case SOUTHBOUND_DELETE_FAILURE: + case DP_DELETE_FAILURE: zsend_ipset_entry_notify_owner(ipset, ZAPI_IPSET_ENTRY_FAIL_REMOVE); break; @@ -720,20 +720,20 @@ void kernel_pbr_ipset_entry_add_del_status( * Handle success or failure of ipset (un)install in the kernel. */ void kernel_pbr_iptable_add_del_status(struct zebra_pbr_iptable *iptable, - enum southbound_results res) + enum dp_results res) { switch (res) { - case SOUTHBOUND_INSTALL_SUCCESS: + case DP_INSTALL_SUCCESS: zsend_iptable_notify_owner(iptable, ZAPI_IPTABLE_INSTALLED); break; - case SOUTHBOUND_INSTALL_FAILURE: + case DP_INSTALL_FAILURE: zsend_iptable_notify_owner(iptable, ZAPI_IPTABLE_FAIL_INSTALL); break; - case SOUTHBOUND_DELETE_SUCCESS: + case DP_DELETE_SUCCESS: zsend_iptable_notify_owner(iptable, ZAPI_IPTABLE_REMOVED); break; - case SOUTHBOUND_DELETE_FAILURE: + case DP_DELETE_FAILURE: zsend_iptable_notify_owner(iptable, ZAPI_IPTABLE_FAIL_REMOVE); break; diff --git a/zebra/zebra_pbr.h b/zebra/zebra_pbr.h index 31fc55358..6cbafd6da 100644 --- a/zebra/zebra_pbr.h +++ b/zebra/zebra_pbr.h @@ -162,37 +162,37 @@ void zebra_pbr_del_iptable(struct zebra_ns *zns, * forwarding plane may not coincide, hence the API requires a separate * rule priority - maps to preference/FRA_PRIORITY on Linux. */ -extern void kernel_add_pbr_rule(struct zebra_pbr_rule *rule); +extern enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule); /* * Uninstall specified rule for a specific interface. */ -extern void kernel_del_pbr_rule(struct zebra_pbr_rule *rule); +extern enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule); /* * Get to know existing PBR rules in the kernel - typically called at startup. */ extern void kernel_read_pbr_rules(struct zebra_ns *zns); -enum southbound_results; +enum dp_results; /* * Handle success or failure of rule (un)install in the kernel. */ extern void kernel_pbr_rule_add_del_status(struct zebra_pbr_rule *rule, - enum southbound_results res); + enum dp_results res); /* * Handle success or failure of ipset kinds (un)install in the kernel. */ extern void kernel_pbr_ipset_add_del_status(struct zebra_pbr_ipset *ipset, - enum southbound_results res); + enum dp_results res); extern void kernel_pbr_ipset_entry_add_del_status( struct zebra_pbr_ipset_entry *ipset, - enum southbound_results res); + enum dp_results res); extern void kernel_pbr_iptable_add_del_status(struct zebra_pbr_iptable *iptable, - enum southbound_results res); + enum dp_results res); /* * Handle rule delete notification from kernel. diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index dec4ed06a..879e7e831 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1014,7 +1014,7 @@ int zebra_rib_labeled_unicast(struct route_entry *re) void kernel_route_rib_pass_fail(struct route_node *rn, struct prefix *p, struct route_entry *re, - enum southbound_results res) + enum dp_results res) { struct nexthop *nexthop; char buf[PREFIX_STRLEN]; @@ -1023,7 +1023,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, struct prefix *p, dest = rib_dest_from_rnode(rn); switch (res) { - case SOUTHBOUND_INSTALL_SUCCESS: + case DP_INSTALL_SUCCESS: dest->selected_fib = re; for (ALL_NEXTHOPS(re->ng, nexthop)) { if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) @@ -1036,7 +1036,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, struct prefix *p, } zsend_route_notify_owner(re, p, ZAPI_ROUTE_INSTALLED); break; - case SOUTHBOUND_INSTALL_FAILURE: + case DP_INSTALL_FAILURE: /* * I am not sure this is the right thing to do here * but the code always set selected_fib before @@ -1048,7 +1048,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, struct prefix *p, zlog_warn("%u:%s: Route install failed", re->vrf_id, prefix2str(p, buf, sizeof(buf))); break; - case SOUTHBOUND_DELETE_SUCCESS: + case DP_DELETE_SUCCESS: /* * The case where selected_fib is not re is * when we have received a system route @@ -1063,7 +1063,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, struct prefix *p, zsend_route_notify_owner(re, p, ZAPI_ROUTE_REMOVED); break; - case SOUTHBOUND_DELETE_FAILURE: + case DP_DELETE_FAILURE: /* * Should we set this to NULL if the * delete fails? @@ -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); - zvrf->installs++; + 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); - if (zvrf) - zvrf->removals++; + 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; } |