mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 15:07:51 +00:00
Merge pull request #2292 from donaldsharp/fixup_sb_stuff
Fixup sb stuff
This commit is contained in:
commit
71343b85d6
32
zebra/rt.h
32
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,8 +66,10 @@ 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,
|
||||
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);
|
||||
|
||||
/*
|
||||
@ -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);
|
||||
|
||||
|
@ -1689,8 +1689,10 @@ 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,
|
||||
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,
|
||||
|
@ -385,8 +385,10 @@ 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,
|
||||
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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user