Merge pull request #7973 from sworleys/Pbr-More-Fixes

zebra,pbrd,doc: PBR more fixes
This commit is contained in:
Russ White 2021-02-09 07:37:09 -05:00 committed by GitHub
commit d887c7bf04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 86 additions and 34 deletions

View File

@ -258,6 +258,21 @@ causes the policy to be installed into the kernel.
| valid | Is the map well-formed? | Boolean | | valid | Is the map well-formed? | Boolean |
+--------+----------------------------+---------+ +--------+----------------------------+---------+
.. _pbr-debugs:
PBR Debugs
===========
.. index:: debug pbr
.. clicmd:: debug pbr events|map|nht|zebra
Debug pbr in pbrd daemon. You specify what types of debugs to turn on.
.. index:: debug zebra pbr
.. clicmd:: debug zebra pbr
Debug pbr in zebra daemon.
.. _pbr-details: .. _pbr-details:
PBR Details PBR Details

View File

@ -711,7 +711,6 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
struct pbr_nht_individual *pnhi) struct pbr_nht_individual *pnhi)
{ {
bool is_valid = pnhc->valid; bool is_valid = pnhc->valid;
bool all_done = false;
/* /*
* If we have an interface down event, let's note that * If we have an interface down event, let's note that
@ -723,43 +722,19 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
* interface event. * interface event.
*/ */
if (!pnhi->nhr && pnhi->ifp) { if (!pnhi->nhr && pnhi->ifp) {
struct connected *connected;
struct listnode *node;
struct prefix p;
switch (pnhc->nexthop.type) { switch (pnhc->nexthop.type) {
case NEXTHOP_TYPE_BLACKHOLE: case NEXTHOP_TYPE_BLACKHOLE:
all_done = true; case NEXTHOP_TYPE_IPV4:
break; case NEXTHOP_TYPE_IPV6:
goto done;
case NEXTHOP_TYPE_IFINDEX: case NEXTHOP_TYPE_IFINDEX:
case NEXTHOP_TYPE_IPV4_IFINDEX: case NEXTHOP_TYPE_IPV4_IFINDEX:
case NEXTHOP_TYPE_IPV6_IFINDEX: case NEXTHOP_TYPE_IPV6_IFINDEX:
is_valid = if_is_up(pnhi->ifp); if (pnhc->nexthop.ifindex == pnhi->ifp->ifindex)
all_done = true;
break;
case NEXTHOP_TYPE_IPV4:
p.family = AF_INET;
p.prefixlen = IPV4_MAX_BITLEN;
p.u.prefix4 = pnhc->nexthop.gate.ipv4;
break;
case NEXTHOP_TYPE_IPV6:
p.family = AF_INET6;
p.prefixlen = IPV6_MAX_BITLEN;
memcpy(&p.u.prefix6, &pnhc->nexthop.gate.ipv6,
sizeof(struct in6_addr));
break;
}
/* Early exit in a couple of cases. */
if (all_done)
goto done;
FOR_ALL_INTERFACES_ADDRESSES (pnhi->ifp, connected, node) {
if (prefix_match(connected->address, &p)) {
is_valid = if_is_up(pnhi->ifp); is_valid = if_is_up(pnhi->ifp);
break; goto done;
}
} }
goto done; goto done;
} }

View File

@ -41,6 +41,7 @@ unsigned long zebra_debug_dplane;
unsigned long zebra_debug_mlag; unsigned long zebra_debug_mlag;
unsigned long zebra_debug_nexthop; unsigned long zebra_debug_nexthop;
unsigned long zebra_debug_evpn_mh; unsigned long zebra_debug_evpn_mh;
unsigned long zebra_debug_pbr;
DEFINE_HOOK(zebra_debug_show_debugging, (struct vty *vty), (vty)); DEFINE_HOOK(zebra_debug_show_debugging, (struct vty *vty), (vty));
@ -122,6 +123,9 @@ DEFUN_NOSH (show_debugging_zebra,
if (IS_ZEBRA_DEBUG_EVPN_MH_NEIGH) if (IS_ZEBRA_DEBUG_EVPN_MH_NEIGH)
vty_out(vty, " Zebra EVPN-MH Neigh debugging is on\n"); vty_out(vty, " Zebra EVPN-MH Neigh debugging is on\n");
if (IS_ZEBRA_DEBUG_PBR)
vty_out(vty, " Zebra PBR debugging is on\n");
hook_call(zebra_debug_show_debugging, vty); hook_call(zebra_debug_show_debugging, vty);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -318,6 +322,17 @@ DEFUN (debug_zebra_dplane,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFUN (debug_zebra_pbr,
debug_zebra_pbr_cmd,
"debug zebra pbr",
DEBUG_STR
"Zebra configuration\n"
"Debug zebra pbr events\n")
{
SET_FLAG(zebra_debug_pbr, ZEBRA_DEBUG_PBR);
return CMD_SUCCESS;
}
DEFPY (debug_zebra_mlag, DEFPY (debug_zebra_mlag,
debug_zebra_mlag_cmd, debug_zebra_mlag_cmd,
"[no$no] debug zebra mlag", "[no$no] debug zebra mlag",
@ -508,6 +523,18 @@ DEFUN (no_debug_zebra_dplane,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFUN (no_debug_zebra_pbr,
no_debug_zebra_pbr_cmd,
"no debug zebra pbr",
NO_STR
DEBUG_STR
"Zebra configuration\n"
"Debug zebra pbr events\n")
{
zebra_debug_pbr = 0;
return CMD_SUCCESS;
}
DEFPY (debug_zebra_nexthop, DEFPY (debug_zebra_nexthop,
debug_zebra_nexthop_cmd, debug_zebra_nexthop_cmd,
"[no$no] debug zebra nexthop [detail$detail]", "[no$no] debug zebra nexthop [detail$detail]",
@ -650,6 +677,11 @@ static int config_write_debug(struct vty *vty)
write++; write++;
} }
if (IS_ZEBRA_DEBUG_PBR) {
vty_out(vty, "debug zebra pbr\n");
write++;
}
return write; return write;
} }
@ -668,6 +700,7 @@ void zebra_debug_init(void)
zebra_debug_evpn_mh = 0; zebra_debug_evpn_mh = 0;
zebra_debug_nht = 0; zebra_debug_nht = 0;
zebra_debug_nexthop = 0; zebra_debug_nexthop = 0;
zebra_debug_pbr = 0;
install_node(&debug_node); install_node(&debug_node);
@ -686,6 +719,7 @@ void zebra_debug_init(void)
install_element(ENABLE_NODE, &debug_zebra_dplane_cmd); install_element(ENABLE_NODE, &debug_zebra_dplane_cmd);
install_element(ENABLE_NODE, &debug_zebra_mlag_cmd); install_element(ENABLE_NODE, &debug_zebra_mlag_cmd);
install_element(ENABLE_NODE, &debug_zebra_nexthop_cmd); install_element(ENABLE_NODE, &debug_zebra_nexthop_cmd);
install_element(ENABLE_NODE, &debug_zebra_pbr_cmd);
install_element(ENABLE_NODE, &no_debug_zebra_events_cmd); install_element(ENABLE_NODE, &no_debug_zebra_events_cmd);
install_element(ENABLE_NODE, &no_debug_zebra_nht_cmd); install_element(ENABLE_NODE, &no_debug_zebra_nht_cmd);
install_element(ENABLE_NODE, &no_debug_zebra_mpls_cmd); install_element(ENABLE_NODE, &no_debug_zebra_mpls_cmd);
@ -696,6 +730,7 @@ void zebra_debug_init(void)
install_element(ENABLE_NODE, &no_debug_zebra_rib_cmd); install_element(ENABLE_NODE, &no_debug_zebra_rib_cmd);
install_element(ENABLE_NODE, &no_debug_zebra_fpm_cmd); install_element(ENABLE_NODE, &no_debug_zebra_fpm_cmd);
install_element(ENABLE_NODE, &no_debug_zebra_dplane_cmd); install_element(ENABLE_NODE, &no_debug_zebra_dplane_cmd);
install_element(ENABLE_NODE, &no_debug_zebra_pbr_cmd);
install_element(ENABLE_NODE, &debug_zebra_evpn_mh_cmd); install_element(ENABLE_NODE, &debug_zebra_evpn_mh_cmd);
install_element(CONFIG_NODE, &debug_zebra_events_cmd); install_element(CONFIG_NODE, &debug_zebra_events_cmd);
@ -710,6 +745,8 @@ void zebra_debug_init(void)
install_element(CONFIG_NODE, &debug_zebra_fpm_cmd); install_element(CONFIG_NODE, &debug_zebra_fpm_cmd);
install_element(CONFIG_NODE, &debug_zebra_dplane_cmd); install_element(CONFIG_NODE, &debug_zebra_dplane_cmd);
install_element(CONFIG_NODE, &debug_zebra_nexthop_cmd); install_element(CONFIG_NODE, &debug_zebra_nexthop_cmd);
install_element(CONFIG_NODE, &debug_zebra_pbr_cmd);
install_element(CONFIG_NODE, &no_debug_zebra_events_cmd); install_element(CONFIG_NODE, &no_debug_zebra_events_cmd);
install_element(CONFIG_NODE, &no_debug_zebra_nht_cmd); install_element(CONFIG_NODE, &no_debug_zebra_nht_cmd);
install_element(CONFIG_NODE, &no_debug_zebra_mpls_cmd); install_element(CONFIG_NODE, &no_debug_zebra_mpls_cmd);
@ -720,6 +757,7 @@ void zebra_debug_init(void)
install_element(CONFIG_NODE, &no_debug_zebra_rib_cmd); install_element(CONFIG_NODE, &no_debug_zebra_rib_cmd);
install_element(CONFIG_NODE, &no_debug_zebra_fpm_cmd); install_element(CONFIG_NODE, &no_debug_zebra_fpm_cmd);
install_element(CONFIG_NODE, &no_debug_zebra_dplane_cmd); install_element(CONFIG_NODE, &no_debug_zebra_dplane_cmd);
install_element(CONFIG_NODE, &no_debug_zebra_pbr_cmd);
install_element(CONFIG_NODE, &debug_zebra_mlag_cmd); install_element(CONFIG_NODE, &debug_zebra_mlag_cmd);
install_element(CONFIG_NODE, &debug_zebra_evpn_mh_cmd); install_element(CONFIG_NODE, &debug_zebra_evpn_mh_cmd);
} }

View File

@ -67,6 +67,8 @@ extern "C" {
#define ZEBRA_DEBUG_EVPN_MH_MAC 0x04 #define ZEBRA_DEBUG_EVPN_MH_MAC 0x04
#define ZEBRA_DEBUG_EVPN_MH_NEIGH 0x08 #define ZEBRA_DEBUG_EVPN_MH_NEIGH 0x08
#define ZEBRA_DEBUG_PBR 0x01
/* Debug related macro. */ /* Debug related macro. */
#define IS_ZEBRA_DEBUG_EVENT (zebra_debug_event & ZEBRA_DEBUG_EVENT) #define IS_ZEBRA_DEBUG_EVENT (zebra_debug_event & ZEBRA_DEBUG_EVENT)
@ -114,6 +116,8 @@ extern "C" {
#define IS_ZEBRA_DEBUG_EVPN_MH_NEIGH \ #define IS_ZEBRA_DEBUG_EVPN_MH_NEIGH \
(zebra_debug_evpn_mh & ZEBRA_DEBUG_EVPN_MH_NEIGH) (zebra_debug_evpn_mh & ZEBRA_DEBUG_EVPN_MH_NEIGH)
#define IS_ZEBRA_DEBUG_PBR (zebra_debug_pbr & ZEBRA_DEBUG_PBR)
extern unsigned long zebra_debug_event; extern unsigned long zebra_debug_event;
extern unsigned long zebra_debug_packet; extern unsigned long zebra_debug_packet;
extern unsigned long zebra_debug_kernel; extern unsigned long zebra_debug_kernel;
@ -127,6 +131,7 @@ extern unsigned long zebra_debug_dplane;
extern unsigned long zebra_debug_mlag; extern unsigned long zebra_debug_mlag;
extern unsigned long zebra_debug_nexthop; extern unsigned long zebra_debug_nexthop;
extern unsigned long zebra_debug_evpn_mh; extern unsigned long zebra_debug_evpn_mh;
extern unsigned long zebra_debug_pbr;
extern void zebra_debug_init(void); extern void zebra_debug_init(void);

View File

@ -32,6 +32,7 @@
#include "zebra/zapi_msg.h" #include "zebra/zapi_msg.h"
#include "zebra/zebra_memory.h" #include "zebra/zebra_memory.h"
#include "zebra/zserv.h" #include "zebra/zserv.h"
#include "zebra/debug.h"
/* definitions */ /* definitions */
DEFINE_MTYPE_STATIC(ZEBRA, PBR_IPTABLE_IFNAME, "PBR interface list") DEFINE_MTYPE_STATIC(ZEBRA, PBR_IPTABLE_IFNAME, "PBR interface list")
@ -499,10 +500,14 @@ void zebra_pbr_add_rule(struct zebra_pbr_rule *rule)
*/ */
found = pbr_rule_lookup_unique(rule); found = pbr_rule_lookup_unique(rule);
(void)hash_get(zrouter.rules_hash, rule, pbr_rule_alloc_intern);
/* If found, this is an update */ /* If found, this is an update */
if (found) { if (found) {
if (IS_ZEBRA_DEBUG_PBR)
zlog_debug(
"%s: seq: %d, prior: %d, unique: %d, ifname: %s -- update",
__func__, rule->rule.seq, rule->rule.priority,
rule->rule.unique, rule->rule.ifname);
(void)dplane_pbr_rule_update(found, rule); (void)dplane_pbr_rule_update(found, rule);
if (pbr_rule_release(found)) if (pbr_rule_release(found))
@ -510,12 +515,26 @@ void zebra_pbr_add_rule(struct zebra_pbr_rule *rule)
"%s: Rule being updated we know nothing about", "%s: Rule being updated we know nothing about",
__PRETTY_FUNCTION__); __PRETTY_FUNCTION__);
} else } else {
if (IS_ZEBRA_DEBUG_PBR)
zlog_debug(
"%s: seq: %d, prior: %d, unique: %d, ifname: %s -- new",
__func__, rule->rule.seq, rule->rule.priority,
rule->rule.unique, rule->rule.ifname);
(void)dplane_pbr_rule_add(rule); (void)dplane_pbr_rule_add(rule);
}
(void)hash_get(zrouter.rules_hash, rule, pbr_rule_alloc_intern);
} }
void zebra_pbr_del_rule(struct zebra_pbr_rule *rule) void zebra_pbr_del_rule(struct zebra_pbr_rule *rule)
{ {
if (IS_ZEBRA_DEBUG_PBR)
zlog_debug("%s: seq: %d, prior: %d, unique: %d, ifname: %s",
__func__, rule->rule.seq, rule->rule.priority,
rule->rule.unique, rule->rule.ifname);
(void)dplane_pbr_rule_delete(rule); (void)dplane_pbr_rule_delete(rule);
if (pbr_rule_release(rule)) if (pbr_rule_release(rule))