On Mon, Dec 30, 2013 at 10:12:37AM -0800, Ben Pfaff wrote: > On Mon, Dec 16, 2013 at 05:57:50PM +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. > > > > The purpose of this series is to obtain the vlan_tid from auxdata > > as appropriate and push it onto the packet. In order to allow > > the push to be performed efficiently netdev_class is updated to > > provide an ofpbuf * argument to rx_recv(). > > I look forward to v4, which I expect to apply. While you prepare v4, > would you please consider adding support for the feature recently > added to net-next with the following commit? It should not be > difficult, and it will future-proof the implementation.
Sure. I have coded this up and it seems clean. I have also updated the code to make use of TP_STATUS_VLAN_TPID_VALID to allow vlan id 0 to be read from auxdata. > Thanks, > > Ben. > > ---------------------------------------------------------------------- > > >From a0cdfcf39362410d5ea983f4daf67b38de129408 Mon Sep 17 00:00:00 2001 > From: Atzm Watanabe <a...@stratosphere.co.jp> > Date: Tue, 17 Dec 2013 22:53:40 +0900 > Subject: [PATCH] packet: deliver VLAN TPID to userspace > > This enables userspace to get VLAN TPID as well as the VLAN TCI. > > Signed-off-by: Atzm Watanabe <a...@stratosphere.co.jp> > Acked-by: Daniel Borkmann <dbork...@redhat.com> > Signed-off-by: David S. Miller <da...@davemloft.net> > --- > include/uapi/linux/if_packet.h | 24 ++++++++++++++---------- > net/packet/af_packet.c | 14 ++++++++++---- > 2 files changed, 24 insertions(+), 14 deletions(-) > > diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h > index 9185dc9..e9d844c 100644 > --- a/include/uapi/linux/if_packet.h > +++ b/include/uapi/linux/if_packet.h > @@ -84,17 +84,18 @@ struct tpacket_auxdata { > __u16 tp_mac; > __u16 tp_net; > __u16 tp_vlan_tci; > - __u16 tp_padding; > + __u16 tp_vlan_tpid; > }; > > /* Rx ring - header status */ > -#define TP_STATUS_KERNEL 0 > -#define TP_STATUS_USER (1 << 0) > -#define TP_STATUS_COPY (1 << 1) > -#define TP_STATUS_LOSING (1 << 2) > -#define TP_STATUS_CSUMNOTREADY (1 << 3) > -#define TP_STATUS_VLAN_VALID (1 << 4) /* auxdata has valid tp_vlan_tci */ > -#define TP_STATUS_BLK_TMO (1 << 5) > +#define TP_STATUS_KERNEL 0 > +#define TP_STATUS_USER (1 << 0) > +#define TP_STATUS_COPY (1 << 1) > +#define TP_STATUS_LOSING (1 << 2) > +#define TP_STATUS_CSUMNOTREADY (1 << 3) > +#define TP_STATUS_VLAN_VALID (1 << 4) /* auxdata has valid > tp_vlan_tci */ > +#define TP_STATUS_BLK_TMO (1 << 5) > +#define TP_STATUS_VLAN_TPID_VALID (1 << 6) /* auxdata has valid > tp_vlan_tpid */ > > /* Tx ring - header status */ > #define TP_STATUS_AVAILABLE 0 > @@ -133,12 +134,15 @@ struct tpacket2_hdr { > __u32 tp_sec; > __u32 tp_nsec; > __u16 tp_vlan_tci; > - __u8 tp_padding[6]; > + __u16 tp_vlan_tpid; > + __u8 tp_padding[4]; > }; > > struct tpacket_hdr_variant1 { > __u32 tp_rxhash; > __u32 tp_vlan_tci; > + __u16 tp_vlan_tpid; > + __u16 tp_padding; > }; > > struct tpacket3_hdr { > @@ -154,7 +158,7 @@ struct tpacket3_hdr { > union { > struct tpacket_hdr_variant1 hv1; > }; > - __u8 tp_padding[12]; > + __u8 tp_padding[8]; > }; > > struct tpacket_bd_ts { > diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c > index f281999..dd38408 100644 > --- a/net/packet/af_packet.c > +++ b/net/packet/af_packet.c > @@ -977,9 +977,11 @@ static void prb_fill_vlan_info(struct tpacket_kbdq_core > *pkc, > { > if (vlan_tx_tag_present(pkc->skb)) { > ppd->hv1.tp_vlan_tci = vlan_tx_tag_get(pkc->skb); > - ppd->tp_status = TP_STATUS_VLAN_VALID; > + ppd->hv1.tp_vlan_tpid = ntohs(pkc->skb->vlan_proto); > + ppd->tp_status = TP_STATUS_VLAN_VALID | > TP_STATUS_VLAN_TPID_VALID; > } else { > ppd->hv1.tp_vlan_tci = 0; > + ppd->hv1.tp_vlan_tpid = 0; > ppd->tp_status = TP_STATUS_AVAILABLE; > } > } > @@ -987,6 +989,7 @@ static void prb_fill_vlan_info(struct tpacket_kbdq_core > *pkc, > static void prb_run_all_ft_ops(struct tpacket_kbdq_core *pkc, > struct tpacket3_hdr *ppd) > { > + ppd->hv1.tp_padding = 0; > prb_fill_vlan_info(pkc, ppd); > > if (pkc->feature_req_word & TP_FT_REQ_FILL_RXHASH) > @@ -1925,9 +1928,11 @@ static int tpacket_rcv(struct sk_buff *skb, struct > net_device *dev, > h.h2->tp_nsec = ts.tv_nsec; > if (vlan_tx_tag_present(skb)) { > h.h2->tp_vlan_tci = vlan_tx_tag_get(skb); > - status |= TP_STATUS_VLAN_VALID; > + h.h2->tp_vlan_tpid = ntohs(skb->vlan_proto); > + status |= TP_STATUS_VLAN_VALID | > TP_STATUS_VLAN_TPID_VALID; > } else { > h.h2->tp_vlan_tci = 0; > + h.h2->tp_vlan_tpid = 0; > } > memset(h.h2->tp_padding, 0, sizeof(h.h2->tp_padding)); > hdrlen = sizeof(*h.h2); > @@ -2875,11 +2880,12 @@ static int packet_recvmsg(struct kiocb *iocb, struct > socket *sock, > aux.tp_net = skb_network_offset(skb); > if (vlan_tx_tag_present(skb)) { > aux.tp_vlan_tci = vlan_tx_tag_get(skb); > - aux.tp_status |= TP_STATUS_VLAN_VALID; > + aux.tp_vlan_tpid = ntohs(skb->vlan_proto); > + aux.tp_status |= TP_STATUS_VLAN_VALID | > TP_STATUS_VLAN_TPID_VALID; > } else { > aux.tp_vlan_tci = 0; > + aux.tp_vlan_tpid = 0; > } > - aux.tp_padding = 0; > put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux); > } > > -- > 1.7.10.4 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev