On Tue, Jan 07, 2014 at 05:09:38PM -0800, Ben Pfaff wrote: > On Tue, Jan 07, 2014 at 02:33:40PM +0900, Simon Horman wrote: > > If VLAN acceleration is used when the kernel receives a packet > > then the outer-most VLAN tag will not be present in the packet > > when it is received by netdev-linux. Rather, it will be present > > in auxdata. > > > > This patch uses recvmsg() instead of recv() to read auxdata for > > each packet and if the vlan_tid is set then it is added to the packet. > > > > Adding the vlan_tid makes use of headroom available > > in the buffer parameter of rx_recv. > > > > Signed-off-by: Simon Horman <ho...@verge.net.au> > > I'd like to eliminate the dependency on the kernel headers used for > the build, by folding this in. What do you think?
Sure, that is fine by me. > > diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c > index 444369e..4d0544e 100644 > --- a/lib/netdev-linux.c > +++ b/lib/netdev-linux.c > @@ -107,6 +107,33 @@ COVERAGE_DEFINE(netdev_set_ethtool); > #define TC_RTAB_SIZE 1024 > #endif > > +/* Linux 2.6.21 introduced struct tpacket_auxdata. > + * Linux 2.6.27 added the tp_vlan_tci member. > + * Linux 3.0 defined TP_STATUS_VLAN_VALID. > + * Linux 3.13 repurposed a padding member for tp_vlan_tpid and defined > + * TP_STATUS_VLAN_TPID_VALID. > + * > + * With all this churn it's easiest to unconditionally define a replacement > + * structure that has everything we want. > + */ > +#ifndef TP_STATUS_VLAN_VALID > +#define TP_STATUS_VLAN_VALID (1 << 4) > +#endif > +#ifndef TP_STATUS_VLAN_TPID_VALID > +#define TP_STATUS_VLAN_TPID_VALID (1 << 6) > +#endif > +#undef tpacket_auxdata > +#define tpacket_auxdata rpl_tpacket_auxdata > +struct tpacket_auxdata { > + uint32_t tp_status; > + uint32_t tp_len; > + uint32_t tp_snaplen; > + uint16_t tp_mac; > + uint16_t tp_net; > + uint16_t tp_vlan_tci; > + uint16_t tp_vlan_tpid; > +}; > + > enum { > VALID_IFINDEX = 1 << 0, > VALID_ETHERADDR = 1 << 1, > @@ -855,7 +882,6 @@ netdev_linux_rx_dealloc(struct netdev_rx *rx_) > free(rx); > } > > -#ifdef TP_STATUS_VLAN_TPID_VALID > static ovs_be16 > auxdata_to_vlan_tpid(const struct tpacket_auxdata *aux) > { > @@ -865,30 +891,12 @@ auxdata_to_vlan_tpid(const struct tpacket_auxdata *aux) > return htons(ETH_TYPE_VLAN); > } > } > -#else > -static ovs_be16 > -auxdata_to_vlan_tpid(const struct tpacket_auxdata *aux OVS_UNUSED) > -{ > - return htons(ETH_TYPE_VLAN); > -} > -#endif > > -/* TP_STATUS_VLAN_VALID was added to v3.0 of the linux kernel > - * to allow VLAN 0 to be accessed via auxdata. Use it if it > - * is available */ > -#ifdef TP_STATUS_VLAN_VALID > static bool > auxdata_has_vlan_tci(const struct tpacket_auxdata *aux) > { > - return aux->tp_vlan_tci || (aux->tp_status & TP_STATUS_VLAN_VALID); > + return aux->tp_vlan_tci || aux->tp_status & TP_STATUS_VLAN_VALID; > } > -#else > -static bool > -auxdata_has_vlan_tci(const struct tpacket_auxdata *aux) > -{ > - return aux->tp_vlan_tci; > -} > -#endif > > static int > netdev_linux_rx_recv_sock(int fd, struct ofpbuf *buffer) > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev