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
next prev parent 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.