On Wed, Jul 13, 2016 at 12:48:28PM -0700, Ben Pfaff wrote: > On Mon, Jul 11, 2016 at 11:56:47PM -0700, Justin Pettit wrote: > > These will have callers later. > > > > Signed-off-by: Justin Pettit <jpet...@ovn.org> > > > lib/packets.c | 38 ++++++++++++++++++++++++++++++++++++++ > > lib/packets.h | 3 +++ > > 2 files changed, 41 insertions(+) > > > > diff --git a/lib/packets.c b/lib/packets.c > > index 9e4d0e7..9b34961 100644 > > --- a/lib/packets.c > > +++ b/lib/packets.c > > @@ -693,6 +693,44 @@ struct in6_addr ipv6_addr_bitand(const struct in6_addr > > *a, > > return dst; > > } > > > > We usually put the return type on a separate line (here and a second > time later); > > > +struct in6_addr ipv6_addr_bitxor(const struct in6_addr *a, > > + const struct in6_addr *b) > > +{ > > I tend to declare loop variables inside the loop these days: > > + int i; > > + struct in6_addr dst; > > + > > +#ifdef s6_addr32 > > + for (i=0; i<4; i++) { > > + dst.s6_addr32[i] = a->s6_addr32[i] ^ b->s6_addr32[i]; > > + } > > +#else > > + for (i=0; i<16; i++) { > > + dst.s6_addr[i] = a->s6_addr[i] ^ b->s6_addr[i]; > > + } > > +#endif > > + > > + return dst; > > +} > > + > > +bool ipv6_is_zero(const struct in6_addr *a) > > +{ > > +#ifdef s6_addr32 > > + for (int i = 0; i < 4; i++) { > > + if (a->s6_addr32[i]) { > > + return false; > > + } > > + } > > +#else > > + for (int i = 0; i < 16; i++) { > > + if (a->s6_addr[i]) { > > + return false; > > + } > > + } > > +#endif > > + > > + return true; > > +} > > But what if we do the whole thing this way? > > #ifdef s6_addr32 > #define s6_addrX s6_addr32 > #define IPV6_FOR_EACH(VAR) for (int VAR = 0; VAR < 4; VAR++) > #else > #define s6_addrX s6_addr > #define IPV6_FOR_EACH(VAR) for (int VAR = 0; VAR < 16; VAR++) > #endif > > struct in6_addr > ipv6_addr_bitand(const struct in6_addr *a, const struct in6_addr *b) > { > struct in6_addr dst; > IPV6_FOR_EACH (i) { > dst.s6_addrX[i] = a->s6_addrX[i] & b->s6_addrX[i]; > } > return dst; > } > > struct in6_addr > ipv6_addr_bitxor(const struct in6_addr *a, const struct in6_addr *b) > { > struct in6_addr dst; > IPV6_FOR_EACH (i) { > dst.s6_addrX[i] = a->s6_addrX[i] ^ b->s6_addrX[i]; > } > return dst; > } > > bool > ipv6_is_zero(const struct in6_addr *a) > { > IPV6_FOR_EACH (i) { > if (a->s6_addrX[i]) { > return false; > } > } > return true; > } > > or > > #ifdef s6_addr32 > #define s6_addrX s6_addr32 > #define s6_n_addrX 4 > #else > #define s6_addrX s6_addr > #define s6_n_addrX 16 > #endif > > struct in6_addr > ipv6_addr_bitand(const struct in6_addr *a, const struct in6_addr *b) > { > struct in6_addr dst; > for (int i = 0; i < s6_n_addrX; i++) { > dst.s6_addrX[i] = a->s6_addrX[i] & b->s6_addrX[i]; > } > return dst; > } > > struct in6_addr > ipv6_addr_bitxor(const struct in6_addr *a, const struct in6_addr *b) > { > struct in6_addr dst; > for (int i = 0; i < s6_n_addrX; i++) { > dst.s6_addrX[i] = a->s6_addrX[i] ^ b->s6_addrX[i]; > } > return dst; > } > > bool > ipv6_is_zero(const struct in6_addr *a) > { > for (int i = 0; i < s6_n_addrX; i++) { > if (a->s6_addrX[i]) { > return false; > } > } > return true; > }
Acked-by: Ben Pfaff <b...@ovn.org> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev