On Wed, Oct 03, 2018 at 01:17:59PM +0200, Claudio Jeker wrote:
> 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)) {
> 

Thank you.

> > +           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
> 

Reply via email to