Skip to content

Commit

Permalink
af_packet: when sending ethernet frames, parse header for skb->protocol
Browse files Browse the repository at this point in the history
This may be necessary when the SKB is passed to other layers on the go,
which check the protocol field on their own. An example is a VLAN packet
sent out using AF_PACKET on a bridge interface. The bridging code checks
the SKB size, accounting for any VLAN header only if the protocol field
is set accordingly.

Note that eth_type_trans() sets skb->dev to the passed argument, so this
can be skipped in packet_snd() for ethernet frames, as well.

Signed-off-by: Phil Sutter <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Phil Sutter authored and davem330 committed Aug 2, 2013
1 parent d27fc78 commit 0f75b09
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions net/packet/af_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
#include <linux/virtio_net.h>
#include <linux/errqueue.h>
#include <linux/net_tstamp.h>
#include <linux/if_arp.h>

#ifdef CONFIG_INET
#include <net/inet_common.h>
Expand Down Expand Up @@ -2005,6 +2006,9 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
if (unlikely(err))
return err;

if (dev->type == ARPHRD_ETHER)
skb->protocol = eth_type_trans(skb, dev);

data += dev->hard_header_len;
to_write -= dev->hard_header_len;
}
Expand Down Expand Up @@ -2324,6 +2328,13 @@ static int packet_snd(struct socket *sock,

sock_tx_timestamp(sk, &skb_shinfo(skb)->tx_flags);

if (dev->type == ARPHRD_ETHER) {
skb->protocol = eth_type_trans(skb, dev);
} else {
skb->protocol = proto;
skb->dev = dev;
}

if (!gso_type && (len > dev->mtu + reserve + extra_len)) {
/* Earlier code assumed this would be a VLAN pkt,
* double-check this now that we have the actual
Expand All @@ -2338,8 +2349,6 @@ static int packet_snd(struct socket *sock,
}
}

skb->protocol = proto;
skb->dev = dev;
skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;

Expand Down

0 comments on commit 0f75b09

Please sign in to comment.