summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2021-02-09 07:37:09 -0500
committerGitHub <noreply@github.com>2021-02-09 07:37:09 -0500
commitd887c7bf04f08b37ec122587f11cd2079cb22bd7 (patch)
tree00b7651276d08f6bb5b9f2018afe3d6ad43dbcda
parenta384dd69d8cb34bfa02314ef45ca39368a2d8d51 (diff)
parentb74a0a33f3734a772b315323ce5265fce4715c58 (diff)
Merge pull request #7973 from sworleys/Pbr-More-Fixes
zebra,pbrd,doc: PBR more fixes
-rw-r--r--doc/user/pbr.rst15
-rw-r--r--pbrd/pbr_nht.c37
-rw-r--r--zebra/debug.c38
-rw-r--r--zebra/debug.h5
-rw-r--r--zebra/zebra_pbr.c25
5 files changed, 86 insertions, 34 deletions
diff --git a/doc/user/pbr.rst b/doc/user/pbr.rst
index c869c6bc45..5cec7cbe62 100644
--- a/doc/user/pbr.rst
+++ b/doc/user/pbr.rst
@@ -258,6 +258,21 @@ causes the policy to be installed into the kernel.
| 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
diff --git a/pbrd/pbr_nht.c b/pbrd/pbr_nht.c
index 723374d9d6..7a814bd724 100644
--- a/pbrd/pbr_nht.c
+++ b/pbrd/pbr_nht.c
@@ -711,7 +711,6 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
struct pbr_nht_individual *pnhi)
{
bool is_valid = pnhc->valid;
- bool all_done = false;
/*
* 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.
*/
if (!pnhi->nhr && pnhi->ifp) {
- struct connected *connected;
- struct listnode *node;
- struct prefix p;
-
switch (pnhc->nexthop.type) {
case NEXTHOP_TYPE_BLACKHOLE:
- all_done = true;
- break;
- case NEXTHOP_TYPE_IFINDEX:
- case NEXTHOP_TYPE_IPV4_IFINDEX:
- case NEXTHOP_TYPE_IPV6_IFINDEX:
- is_valid = if_is_up(pnhi->ifp);
- 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)) {
+ case NEXTHOP_TYPE_IFINDEX:
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
+ if (pnhc->nexthop.ifindex == pnhi->ifp->ifindex)
is_valid = if_is_up(pnhi->ifp);
- break;
- }
+ goto done;
}
+
goto done;
}
diff --git a/zebra/debug.c b/zebra/debug.c
index 87a10ea65d..21fa765c63 100644
--- a/zebra/debug.c
+++ b/zebra/debug.c
@@ -41,6 +41,7 @@ unsigned long zebra_debug_dplane;
unsigned long zebra_debug_mlag;
unsigned long zebra_debug_nexthop;
unsigned long zebra_debug_evpn_mh;
+unsigned long zebra_debug_pbr;
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)
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);
return CMD_SUCCESS;
}
@@ -318,6 +322,17 @@ DEFUN (debug_zebra_dplane,
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,
debug_zebra_mlag_cmd,
"[no$no] debug zebra mlag",
@@ -508,6 +523,18 @@ DEFUN (no_debug_zebra_dplane,
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,
debug_zebra_nexthop_cmd,
"[no$no] debug zebra nexthop [detail$detail]",
@@ -650,6 +677,11 @@ static int config_write_debug(struct vty *vty)
write++;
}
+ if (IS_ZEBRA_DEBUG_PBR) {
+ vty_out(vty, "debug zebra pbr\n");
+ write++;
+ }
+
return write;
}
@@ -668,6 +700,7 @@ void zebra_debug_init(void)
zebra_debug_evpn_mh = 0;
zebra_debug_nht = 0;
zebra_debug_nexthop = 0;
+ zebra_debug_pbr = 0;
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_mlag_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_nht_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_fpm_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(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_dplane_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_nht_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_fpm_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_evpn_mh_cmd);
}
diff --git a/zebra/debug.h b/zebra/debug.h
index 8402224f19..86506846ad 100644
--- a/zebra/debug.h
+++ b/zebra/debug.h
@@ -67,6 +67,8 @@ extern "C" {
#define ZEBRA_DEBUG_EVPN_MH_MAC 0x04
#define ZEBRA_DEBUG_EVPN_MH_NEIGH 0x08
+#define ZEBRA_DEBUG_PBR 0x01
+
/* Debug related macro. */
#define IS_ZEBRA_DEBUG_EVENT (zebra_debug_event & ZEBRA_DEBUG_EVENT)
@@ -114,6 +116,8 @@ extern "C" {
#define IS_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_packet;
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_nexthop;
extern unsigned long zebra_debug_evpn_mh;
+extern unsigned long zebra_debug_pbr;
extern void zebra_debug_init(void);
diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c
index c244d2a955..87ab900092 100644
--- a/zebra/zebra_pbr.c
+++ b/zebra/zebra_pbr.c
@@ -32,6 +32,7 @@
#include "zebra/zapi_msg.h"
#include "zebra/zebra_memory.h"
#include "zebra/zserv.h"
+#include "zebra/debug.h"
/* definitions */
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);
- (void)hash_get(zrouter.rules_hash, rule, pbr_rule_alloc_intern);
-
/* If found, this is an update */
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);
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",
__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)hash_get(zrouter.rules_hash, rule, pbr_rule_alloc_intern);
}
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);
if (pbr_rule_release(rule))