mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 02:19:51 +00:00
net: more accurate network taps in transmit path
dev_queue_xmit_nit() should be called right before ndo_start_xmit() calls or we might give wrong packet contents to taps users : Packet checksum can be changed, or packet can be linearized or segmented, and segments partially sent for the later case. Also a memory allocation can fail and packet never really hit the driver entry point. Reported-by: Jamie Gloudon <jamie.gloudon@gmail.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
adccff34de
commit
b40863c667
1 changed files with 6 additions and 3 deletions
|
@ -2213,9 +2213,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||||
if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
|
if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
|
||||||
skb_dst_drop(skb);
|
skb_dst_drop(skb);
|
||||||
|
|
||||||
if (!list_empty(&ptype_all))
|
|
||||||
dev_queue_xmit_nit(skb, dev);
|
|
||||||
|
|
||||||
features = netif_skb_features(skb);
|
features = netif_skb_features(skb);
|
||||||
|
|
||||||
if (vlan_tx_tag_present(skb) &&
|
if (vlan_tx_tag_present(skb) &&
|
||||||
|
@ -2250,6 +2247,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!list_empty(&ptype_all))
|
||||||
|
dev_queue_xmit_nit(skb, dev);
|
||||||
|
|
||||||
skb_len = skb->len;
|
skb_len = skb->len;
|
||||||
rc = ops->ndo_start_xmit(skb, dev);
|
rc = ops->ndo_start_xmit(skb, dev);
|
||||||
trace_net_dev_xmit(skb, rc, dev, skb_len);
|
trace_net_dev_xmit(skb, rc, dev, skb_len);
|
||||||
|
@ -2272,6 +2272,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||||
if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
|
if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
|
||||||
skb_dst_drop(nskb);
|
skb_dst_drop(nskb);
|
||||||
|
|
||||||
|
if (!list_empty(&ptype_all))
|
||||||
|
dev_queue_xmit_nit(nskb, dev);
|
||||||
|
|
||||||
skb_len = nskb->len;
|
skb_len = nskb->len;
|
||||||
rc = ops->ndo_start_xmit(nskb, dev);
|
rc = ops->ndo_start_xmit(nskb, dev);
|
||||||
trace_net_dev_xmit(nskb, rc, dev, skb_len);
|
trace_net_dev_xmit(nskb, rc, dev, skb_len);
|
||||||
|
|
Loading…
Reference in a new issue