|
|
@@ -2510,12 +2510,13 @@ 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 + VLAN_HLEN;
|
|
|
+ if (po->sk.sk_socket->type == SOCK_RAW)
|
|
|
+ reserve = dev->hard_header_len;
|
|
|
size_max = po->tx_ring.frame_size
|
|
|
- (po->tp_hdrlen - sizeof(struct sockaddr_ll));
|
|
|
|
|
|
- if (size_max > dev->mtu + reserve)
|
|
|
- size_max = dev->mtu + reserve;
|
|
|
+ if (size_max > dev->mtu + reserve + VLAN_HLEN)
|
|
|
+ size_max = dev->mtu + reserve + VLAN_HLEN;
|
|
|
|
|
|
do {
|
|
|
ph = packet_current_frame(po, &po->tx_ring,
|
|
|
@@ -2542,7 +2543,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
|
|
tp_len = tpacket_fill_skb(po, skb, ph, dev, size_max, proto,
|
|
|
addr, hlen);
|
|
|
if (likely(tp_len >= 0) &&
|
|
|
- tp_len > dev->mtu + dev->hard_header_len &&
|
|
|
+ tp_len > dev->mtu + reserve &&
|
|
|
!packet_extra_vlan_len_allowed(dev, skb))
|
|
|
tp_len = -EMSGSIZE;
|
|
|
|