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

Reply via email to