This diff extends the show rib command to only show invalid (ineligible)
or leaked (via OTC leak detection) routes.
While there rename the OTC_LOOP defines to OTC_LEAK since this is not a
route loop but a route leak.
--
:wq Claudio
Index: usr.sbin/bgpctl/bgpctl.8
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.8,v
retrieving revision 1.105
diff -u -p -r1.105 bgpctl.8
--- usr.sbin/bgpctl/bgpctl.8 2 Mar 2023 17:09:52 -0000 1.105
+++ usr.sbin/bgpctl/bgpctl.8 13 Mar 2023 16:03:01 -0000
@@ -387,8 +387,20 @@ are defined:
.It Cm best
Alias for
.Ic selected .
+.It Cm detail
+Show more detailed output for matching routes.
.It Cm error
Show only prefixes which are marked invalid and were treated as withdrawn.
+.It Ar family
+Limit the output to the given address family.
+.It Cm in
+Show routes from the unfiltered Adj-RIB-In.
+.It Cm invalid
+Show only routes which are not eligible.
+.It Cm leaked
+Show only routes where a route leak was detected.
+.It Cm out
+Show the filtered routes sent to a neighbor.
.It Cm selected
Show only selected routes.
.It Cm ssv
@@ -396,17 +408,9 @@ Show each RIB entry as a single line, wi
Only works if
.Cm detail
is specified.
-.It Cm detail
-Show more detailed output for matching routes.
-.It Ar family
-Limit the output to the given address family.
-.It Cm in
-Show routes from the unfiltered Adj-RIB-In.
The
.Cm neighbor
needs to be specified.
-.It Cm out
-Show the filtered routes sent to a neighbor.
The
.Cm neighbor
needs to be specified.
Index: usr.sbin/bgpctl/bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
retrieving revision 1.289
diff -u -p -r1.289 bgpctl.c
--- usr.sbin/bgpctl/bgpctl.c 24 Jan 2023 11:29:34 -0000 1.289
+++ usr.sbin/bgpctl/bgpctl.c 13 Mar 2023 16:09:02 -0000
@@ -711,7 +711,7 @@ fmt_flags(uint32_t flags, int sum)
if (sum) {
if (flags & F_PREF_INVALID)
*p++ = 'E';
- if (flags & F_PREF_OTC_LOOP)
+ if (flags & F_PREF_OTC_LEAK)
*p++ = 'L';
if (flags & F_PREF_ANNOUNCE)
*p++ = 'A';
@@ -737,8 +737,8 @@ fmt_flags(uint32_t flags, int sum)
if (flags & F_PREF_INVALID)
strlcat(buf, ", invalid", sizeof(buf));
- if (flags & F_PREF_OTC_LOOP)
- strlcat(buf, ", otc loop", sizeof(buf));
+ if (flags & F_PREF_OTC_LEAK)
+ strlcat(buf, ", otc leak", sizeof(buf));
if (flags & F_PREF_STALE)
strlcat(buf, ", stale", sizeof(buf));
if (flags & F_PREF_ELIGIBLE)
Index: usr.sbin/bgpctl/parser.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/parser.c,v
retrieving revision 1.121
diff -u -p -r1.121 parser.c
--- usr.sbin/bgpctl/parser.c 2 Feb 2023 19:23:01 -0000 1.121
+++ usr.sbin/bgpctl/parser.c 13 Mar 2023 16:09:22 -0000
@@ -178,9 +178,11 @@ static const struct token t_show_rib[] =
{ FLAG, "selected", F_CTL_BEST, t_show_rib},
{ FLAG, "detail", F_CTL_DETAIL, t_show_rib},
{ FLAG, "error", F_CTL_INVALID, t_show_rib},
- { FLAG, "ssv" , F_CTL_SSV, t_show_rib},
+ { FLAG, "invalid", F_CTL_INELIGIBLE, t_show_rib},
+ { FLAG, "leaked", F_CTL_LEAKED, t_show_rib},
{ FLAG, "in", F_CTL_ADJ_IN, t_show_rib},
{ FLAG, "out", F_CTL_ADJ_OUT, t_show_rib},
+ { FLAG, "ssv" , F_CTL_SSV, t_show_rib},
{ KEYWORD, "neighbor", NONE, t_show_rib_neigh},
{ KEYWORD, "avs", NONE, t_show_avs},
{ KEYWORD, "ovs", NONE, t_show_ovs},
Index: usr.sbin/bgpd/bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.464
diff -u -p -r1.464 bgpd.h
--- usr.sbin/bgpd/bgpd.h 10 Mar 2023 07:57:15 -0000 1.464
+++ usr.sbin/bgpd/bgpd.h 13 Mar 2023 16:06:51 -0000
@@ -83,20 +83,22 @@
#define F_MPLS 0x0080
#define F_LONGER 0x0200
#define F_SHORTER 0x0400
-#define F_CTL_DETAIL 0x1000 /* only set on requests */
-#define F_CTL_ADJ_IN 0x2000 /* only set on requests */
-#define F_CTL_ADJ_OUT 0x4000 /* only set on requests */
+#define F_CTL_DETAIL 0x1000 /* only set on requests
*/
+#define F_CTL_ADJ_IN 0x2000 /* only set on requests
*/
+#define F_CTL_ADJ_OUT 0x4000 /* only set on requests
*/
#define F_CTL_BEST 0x8000
-#define F_CTL_SSV 0x20000 /* only used by bgpctl */
-#define F_CTL_INVALID 0x40000 /* only set on requests */
+#define F_CTL_INELIGIBLE 0x10000 /* only set on requests
*/
+#define F_CTL_LEAKED 0x20000 /* only set on requests
*/
+#define F_CTL_INVALID 0x40000 /* only set on requests
*/
#define F_CTL_OVS_VALID 0x80000
#define F_CTL_OVS_INVALID 0x100000
#define F_CTL_OVS_NOTFOUND 0x200000
-#define F_CTL_NEIGHBORS 0x400000 /* only used by bgpctl */
-#define F_CTL_HAS_PATHID 0x800000 /* only set on requests */
+#define F_CTL_NEIGHBORS 0x400000 /* only used by bgpctl
*/
+#define F_CTL_HAS_PATHID 0x800000 /* only set on
requests */
#define F_CTL_AVS_VALID 0x1000000
#define F_CTL_AVS_INVALID 0x2000000
#define F_CTL_AVS_UNKNOWN 0x4000000
+#define F_CTL_SSV 0x80000000 /* only used by bgpctl
*/
#define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \
__attribute__((__unused__))
@@ -837,7 +839,7 @@ struct ctl_neighbor {
#define F_PREF_STALE 0x010
#define F_PREF_INVALID 0x020
#define F_PREF_PATH_ID 0x040
-#define F_PREF_OTC_LOOP 0x080
+#define F_PREF_OTC_LEAK 0x080
#define F_PREF_ECMP 0x100
#define F_PREF_AS_WIDE 0x200
Index: usr.sbin/bgpd/rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.595
diff -u -p -r1.595 rde.c
--- usr.sbin/bgpd/rde.c 10 Mar 2023 07:57:15 -0000 1.595
+++ usr.sbin/bgpd/rde.c 13 Mar 2023 16:03:59 -0000
@@ -1608,7 +1608,7 @@ rde_update_dispatch(struct rde_peer *pee
}
} else {
/* Only IPv4 and IPv6 unicast do OTC handling */
- state.aspath.flags &= ~F_ATTR_OTC_LOOP;
+ state.aspath.flags &= ~F_ATTR_OTC_LEAK;
}
/* unlock the previously locked nexthop, it is no longer used */
@@ -2194,13 +2194,13 @@ bad_flags:
switch (peer->role) {
case ROLE_PROVIDER:
case ROLE_RS:
- a->flags |= F_ATTR_OTC_LOOP;
+ a->flags |= F_ATTR_OTC_LEAK;
break;
case ROLE_PEER:
memcpy(&tmp32, p, sizeof(tmp32));
tmp32 = ntohl(tmp32);
if (tmp32 != peer->conf.remote_as)
- a->flags |= F_ATTR_OTC_LOOP;
+ a->flags |= F_ATTR_OTC_LEAK;
break;
default:
break;
@@ -2678,8 +2678,8 @@ rde_dump_rib_as(struct prefix *p, struct
if (prefix_eligible(p))
rib.flags |= F_PREF_ELIGIBLE;
/* otc loop includes parse err so skip the latter if the first is set */
- if (asp->flags & F_ATTR_OTC_LOOP)
- rib.flags |= F_PREF_OTC_LOOP;
+ if (asp->flags & F_ATTR_OTC_LEAK)
+ rib.flags |= F_PREF_OTC_LEAK;
else if (asp->flags & F_ATTR_PARSE_ERR)
rib.flags |= F_PREF_INVALID;
staletime = peer->staletime[p->pt->aid];
@@ -2772,6 +2772,11 @@ rde_dump_filter(struct prefix *p, struct
return;
if ((req->flags & F_CTL_INVALID) &&
(asp->flags & F_ATTR_PARSE_ERR) == 0)
+ return;
+ if ((req->flags & F_CTL_INELIGIBLE) && prefix_eligible(p))
+ return;
+ if ((req->flags & F_CTL_LEAKED) &&
+ (asp->flags & F_ATTR_OTC_LEAK) == 0)
return;
if ((req->flags & F_CTL_HAS_PATHID)) {
/* Match against the transmit path id if adjout is used. */
Index: usr.sbin/bgpd/rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.285
diff -u -p -r1.285 rde.h
--- usr.sbin/bgpd/rde.h 10 Mar 2023 07:57:15 -0000 1.285
+++ usr.sbin/bgpd/rde.h 13 Mar 2023 16:03:20 -0000
@@ -203,7 +203,7 @@ struct rde_community {
#define F_PREFIX_ANNOUNCED 0x00400
#define F_ANN_DYNAMIC 0x00800
#define F_ATTR_OTC 0x01000 /* OTC present */
-#define F_ATTR_OTC_LOOP 0x02000 /* otc loop, not eligible */
+#define F_ATTR_OTC_LEAK 0x02000 /* otc leak, not eligible */
#define F_ATTR_PARSE_ERR 0x10000 /* parse error, not eligible */
#define F_ATTR_LINKED 0x20000 /* if set path is on various
lists */
Index: usr.sbin/bgpd/rde_decide.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_decide.c,v
retrieving revision 1.100
diff -u -p -r1.100 rde_decide.c
--- usr.sbin/bgpd/rde_decide.c 9 Mar 2023 13:12:19 -0000 1.100
+++ usr.sbin/bgpd/rde_decide.c 13 Mar 2023 16:07:31 -0000
@@ -488,7 +488,7 @@ prefix_eligible(struct prefix *p)
/* The aspath needs to be loop and error free */
if (asp == NULL ||
- asp->flags & (F_ATTR_LOOP|F_ATTR_OTC_LOOP|F_ATTR_PARSE_ERR))
+ asp->flags & (F_ATTR_LOOP|F_ATTR_OTC_LEAK|F_ATTR_PARSE_ERR))
return 0;
/* The nexthop must be valid. */
Index: usr.sbin/bgpd/rde_update.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_update.c,v
retrieving revision 1.158
diff -u -p -r1.158 rde_update.c
--- usr.sbin/bgpd/rde_update.c 10 Mar 2023 07:57:16 -0000 1.158
+++ usr.sbin/bgpd/rde_update.c 13 Mar 2023 16:07:49 -0000
@@ -66,7 +66,7 @@ up_test_update(struct rde_peer *peer, st
if (asp == NULL || asp->flags & F_ATTR_PARSE_ERR)
fatalx("try to send out a botched path");
- if (asp->flags & (F_ATTR_LOOP | F_ATTR_OTC_LOOP))
+ if (asp->flags & (F_ATTR_LOOP | F_ATTR_OTC_LEAK))
fatalx("try to send out a looped path");
if (peer == frompeer)