On Wed, Oct 03, 2018 at 01:08:19PM +0200, Denis Fondras wrote:
> Add a 'ovs' command to filter on Origin Validation State.
>
> 'bgpctl show rib ovs invalid' returns only prefixes that failed route origin
> validation.
>
>
> Index: bgpctl/bgpctl.8
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.8,v
> retrieving revision 1.82
> diff -u -p -r1.82 bgpctl.8
> --- bgpctl/bgpctl.8 9 Sep 2018 12:53:00 -0000 1.82
> +++ bgpctl/bgpctl.8 3 Oct 2018 10:53:08 -0000
> @@ -357,6 +357,8 @@ Show only entries from the specified RIB
> Show all entries with
> .Ar as
> anywhere but rightmost.
> +.It Cm ovs Pq Ic valid | not-found | invalid
> +Show all entries with matching Origin Validation State (OVS).
> .El
> .Pp
> Additionally, the following
> Index: bgpctl/parser.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpctl/parser.c,v
> retrieving revision 1.85
> diff -u -p -r1.85 parser.c
> --- bgpctl/parser.c 7 Sep 2018 05:47:02 -0000 1.85
> +++ bgpctl/parser.c 3 Oct 2018 10:53:08 -0000
> @@ -81,6 +81,7 @@ static const struct token t_show[];
> static const struct token t_show_summary[];
> static const struct token t_show_fib[];
> static const struct token t_show_rib[];
> +static const struct token t_show_ovs[];
> static const struct token t_show_mrt[];
> static const struct token t_show_mrt_file[];
> static const struct token t_show_rib_neigh[];
> @@ -185,11 +186,18 @@ static const struct token t_show_rib[] =
> { KEYWORD, "table", NONE, t_show_rib_rib},
> { KEYWORD, "summary", SHOW_SUMMARY, t_show_summary},
> { KEYWORD, "memory", SHOW_RIB_MEM, NULL},
> + { KEYWORD, "ovs", NONE, t_show_ovs},
> { FAMILY, "", NONE, t_show_rib},
> { PREFIX, "", NONE, t_show_prefix},
> { ENDTOKEN, "", NONE, NULL}
> };
>
> +static const struct token t_show_ovs[] = {
> + { FLAG, "valid" , F_CTL_OVS_VALID, t_show_rib},
> + { FLAG, "invalid", F_CTL_OVS_INVALID, t_show_rib},
> + { FLAG, "not-found", F_CTL_OVS_NOTFOUND, t_show_rib},
> + { ENDTOKEN, "", NONE, NULL}
> +};
>
> static const struct token t_show_mrt[] = {
> { NOTOKEN, "", NONE, NULL},
> Index: bgpd/bgpd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
> retrieving revision 1.348
> diff -u -p -r1.348 bgpd.h
> --- bgpd/bgpd.h 1 Oct 2018 23:09:53 -0000 1.348
> +++ bgpd/bgpd.h 3 Oct 2018 10:53:08 -0000
> @@ -88,6 +88,10 @@
> #define F_RTLABEL 0x10000
> #define F_CTL_SSV 0x20000 /* only used by bgpctl */
> #define F_CTL_INVALID 0x40000 /* only used by bgpctl */
> +#define F_CTL_OVS_VALID 0x80000
> +#define F_CTL_OVS_INVALID 0x100000
> +#define F_CTL_OVS_NOTFOUND 0x200000
> +
Extra newline.
>
> /*
> * Note that these numeric assignments differ from the numbers commonly
> Index: bgpd/rde.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
> retrieving revision 1.432
> diff -u -p -r1.432 rde.c
> --- bgpd/rde.c 1 Oct 2018 23:09:53 -0000 1.432
> +++ bgpd/rde.c 3 Oct 2018 10:53:08 -0000
> @@ -126,6 +126,7 @@ void network_dump_upcall(struct rib_en
>
> void rde_shutdown(void);
> int sa_cmp(struct bgpd_addr *, struct sockaddr *);
> +int ovs_match(struct prefix *, u_int32_t);
>
> volatile sig_atomic_t rde_quit = 0;
> struct bgpd_config *conf, *nconf;
> @@ -2286,6 +2287,8 @@ rde_dump_filter(struct prefix *p, struct
> !community_large_match(asp, req->large_community.as,
> req->large_community.ld1, req->large_community.ld2))
> return;
> + if (!ovs_match(p, req->flags))
> + return;
> rde_dump_rib_as(p, asp, req->pid, req->flags);
> }
> }
> @@ -3958,4 +3961,30 @@ rde_roa_validity(struct rde_prefixset *p
>
> r = trie_roa_check(&ps->th, prefix, plen, as);
> return (r & ROA_MASK);
> +}
> +
> +int
> +ovs_match(struct prefix *p, u_int32_t flag)
> +{
> + if (flag & F_CTL_OVS_VALID || flag & F_CTL_OVS_INVALID ||
> + flag & F_CTL_OVS_NOTFOUND) {
I would write this as:
if (flag & (F_CTL_OVS_VALID|F_CTL_OVS_INVALID|F_CTL_OVS_NOTFOUND)) {
> + switch (prefix_vstate(p)) {
> + case ROA_VALID:
> + if (!(flag & F_CTL_OVS_VALID))
> + return 0;
> + break;
> + case ROA_INVALID:
> + if (!(flag & F_CTL_OVS_INVALID))
> + return 0;
> + break;
> + case ROA_NOTFOUND:
> + if (!(flag & F_CTL_OVS_NOTFOUND))
> + return 0;
> + break;
> + default:
> + break;
> + }
> + }
> +
> + return 1;
> }
>
Apart from that OK claudio.
--
:wq Claudio