On Thu, Jun 16, 2022 at 09:01:33PM +0200, Theo Buehler wrote:
> On Thu, Jun 16, 2022 at 07:15:51PM +0200, Claudio Jeker wrote:
> > Not much holds us back to switch kroute_find() to use a struct bgpd_addr
> > as prefix argument. Only the match code needs some adoption.
> > I created applymask() for this which works on bgpd_addrs like
> > inet4applymask works on in_addrs.
> > 
> > I also switched a simple case in session.c over to applymask().
> > There is another one in bgpctl which I will send out once this is in.
> 
> ok
> 
> A nit and a question below.
> 
> [...]
> 
> > +kroute_find(struct ktable *kt, const struct bgpd_addr *prefix,
> > +    uint8_t prefixlen, uint8_t prio)
> >  {
> >     struct kroute_node      s;
> >     struct kroute_node      *kn, *tmp;
> >  
> > -   s.r.prefix.s_addr = prefix;
> > +   s.r.prefix= prefix->v4;
> 
> Missing space before =.
> 
> [...]
> 
> > Index: util.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
> > retrieving revision 1.64
> > diff -u -p -r1.64 util.c
> > --- util.c  16 Jun 2022 15:33:05 -0000      1.64
> > +++ util.c  16 Jun 2022 16:50:47 -0000
> > @@ -783,6 +783,26 @@ inet6applymask(struct in6_addr *dest, co
> >             dest->s6_addr[i] = src->s6_addr[i] & mask.s6_addr[i];
> >  }
> >  
> > +void
> > +applymask(struct bgpd_addr *dest, const struct bgpd_addr *src, int 
> > prefixlen)
> > +{
> > +   struct bgpd_addr tmp;
> > +
> > +   /* use temporary storage in case src and dest point to same struct */
> > +   tmp = *src;
> 
> While I'm fine with doing it this way, why is this tmp dance needed? I
> would have thought that both inet4applymask() and inet6applymask() work
> fine if src and dest point to the same struct. bgpctl's parse.y assumes
> that this is the case.

While inet4applymask() and inet6applymask() work the problem comes with the
rest of the struct bgpd_addr fields.

Now I could do a trick and copy from offsetof(rd) to sizeof(*src) -
offsetof(rd) plus in the IPv4 case the rest of the union ba needs to
be cleared as well. So I think while possible to do this without this
temporary storage the code will be rather complex.

An alternative option is to just store the v4/v6 values before
memmove(dst, src) and then using those values in the inetXapplymask calls.
I guess that is a reasonable alternative which is a bit more optimized.

What do you think?

> > +   switch (src->aid) {
> > +   case AID_INET:
> > +   case AID_VPN_IPv4:
> > +           inet4applymask(&tmp.v4, &src->v4, prefixlen);
> > +           break;
> > +   case AID_INET6:
> > +   case AID_VPN_IPv6:
> > +           inet6applymask(&tmp.v6, &src->v6, prefixlen);
> > +           break;
> > +   }
> > +   *dest = tmp;
> > +}
> > +
> >  /* address family translation functions */
> >  const struct aid aid_vals[AID_MAX] = AID_VALS;
> >  
> > 
> 

-- 
:wq Claudio

Reply via email to