All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kretschmer, Mathias" <mathias.kretschmer@fokus.fraunhofer.de>
To: Daniel Borkmann <dborkman@redhat.com>,
	"davem@davemloft.net" <davem@davemloft.net>
Cc: "netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	Ben Greear <greearb@candelatech.com>, Phil Sutter <phil@nwl.cc>
Subject: RE: [PATCH net-next] packet: allow to transmit +4 byte in TX_RING slot for VLAN case
Date: Fri, 28 Feb 2014 11:26:47 +0000	[thread overview]
Message-ID: <D53252F45158EF44B1DF124FDC9AF2A35AECCF51@FEYNMAN.fokus.fraunhofer.de> (raw)
In-Reply-To: <1393550526-25390-1-git-send-email-dborkman@redhat.com>

Tested-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>

> -----Original Message-----
> From: Daniel Borkmann [mailto:dborkman@redhat.com]
> Sent: Friday, February 28, 2014 02:22
> To: davem@davemloft.net
> Cc: netdev@vger.kernel.org; Kretschmer, Mathias; Ben Greear; Phil Sutter
> Subject: [PATCH net-next] packet: allow to transmit +4 byte in TX_RING slot
> for VLAN case
> 
> Commit 57f89bfa2140 ("network: Allow af_packet to transmit +4 bytes for
> VLAN packets.") added the possibility for non-mmaped frames to send extra
> 4 byte for VLAN header so the MTU increases from 1500 to
> 1504 byte, for example.
> 
> Commit cbd89acb9eb2 ("af_packet: fix for sending VLAN frames via
> packet_mmap") attempted to fix that for the mmap part but was reverted as
> it caused regressions while using eth_type_trans() on output path.
> 
> Lets just act analogous to 57f89bfa2140 and add a similar logic to TX_RING.
> We presume size_max as overcharged with +4 bytes and later on after skb
> has been built by tpacket_fill_skb() check for ETH_P_8021Q header on
> packets larger than normal MTU. Can be easily reproduced with a slightly
> modified trafgen in mmap(2) mode, test cases:
> 
>  { fill(0xff, 12) const16(0x8100) fill(0xff, <1504|1505>) }  { fill(0xff, 12)
> const16(0x0806) fill(0xff, <1500|1501>) }
> 
> Note that we need to do the test right after tpacket_fill_skb() as sockets can
> have PACKET_LOSS set where we would not fail but instead just continue to
> traverse the ring.
> 
> Reported-by: Mathias Kretschmer
> <mathias.kretschmer@fokus.fraunhofer.de>
> Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
> Cc: Ben Greear <greearb@candelatech.com>
> Cc: Phil Sutter <phil@nwl.cc>
> ---
>  net/packet/af_packet.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index
> 48a6a93..2923044 100644
> --- a/net/packet/af_packet.c
> +++ b/net/packet/af_packet.c
> @@ -2257,8 +2257,7 @@ static int tpacket_snd(struct packet_sock *po,
> struct msghdr *msg)
>  	if (unlikely(!(dev->flags & IFF_UP)))
>  		goto out_put;
> 
> -	reserve = dev->hard_header_len;
> -
> +	reserve = dev->hard_header_len + VLAN_HLEN;
>  	size_max = po->tx_ring.frame_size
>  		- (po->tp_hdrlen - sizeof(struct sockaddr_ll));
> 
> @@ -2285,8 +2284,19 @@ static int tpacket_snd(struct packet_sock *po,
> struct msghdr *msg)
>  			goto out_status;
> 
>  		tp_len = tpacket_fill_skb(po, skb, ph, dev, size_max, proto,
> -				addr, hlen);
> +					  addr, hlen);
> +		if (tp_len > dev->mtu + dev->hard_header_len) {
> +			struct ethhdr *ehdr;
> +			/* Earlier code assumed this would be a VLAN pkt,
> +			 * double-check this now that we have the actual
> +			 * packet in hand.
> +			 */
> 
> +			skb_reset_mac_header(skb);
> +			ehdr = eth_hdr(skb);
> +			if (ehdr->h_proto != htons(ETH_P_8021Q))
> +				tp_len = -EMSGSIZE;
> +		}
>  		if (unlikely(tp_len < 0)) {
>  			if (po->tp_loss) {
>  				__packet_set_status(po, ph,
> --
> 1.7.11.7

  reply	other threads:[~2014-02-28 11:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-28  1:22 [PATCH net-next] packet: allow to transmit +4 byte in TX_RING slot for VLAN case Daniel Borkmann
2014-02-28 11:26 ` Kretschmer, Mathias [this message]
2014-02-28 21:52 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=D53252F45158EF44B1DF124FDC9AF2A35AECCF51@FEYNMAN.fokus.fraunhofer.de \
    --to=mathias.kretschmer@fokus.fraunhofer.de \
    --cc=davem@davemloft.net \
    --cc=dborkman@redhat.com \
    --cc=greearb@candelatech.com \
    --cc=netdev@vger.kernel.org \
    --cc=phil@nwl.cc \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.