aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2012-09-18 16:44:49 -0400
committerDavid S. Miller <davem@davemloft.net>2012-09-19 15:32:42 -0400
commitb40863c667c16b7a73d4f034a8eab67029b5b15a (patch)
treeeb69adf4283657af39e74c9a9fa3928603b780bb /net/core
parentadccff34de1ef81564b7e6c436f762e7a1caf807 (diff)
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>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/dev.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index dcc673d0674c..52cd1d7f004a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2213,9 +2213,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
2213 if (dev->priv_flags & IFF_XMIT_DST_RELEASE) 2213 if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
2214 skb_dst_drop(skb); 2214 skb_dst_drop(skb);
2215 2215
2216 if (!list_empty(&ptype_all))
2217 dev_queue_xmit_nit(skb, dev);
2218
2219 features = netif_skb_features(skb); 2216 features = netif_skb_features(skb);
2220 2217
2221 if (vlan_tx_tag_present(skb) && 2218 if (vlan_tx_tag_present(skb) &&
@@ -2250,6 +2247,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
2250 } 2247 }
2251 } 2248 }
2252 2249
2250 if (!list_empty(&ptype_all))
2251 dev_queue_xmit_nit(skb, dev);
2252
2253 skb_len = skb->len; 2253 skb_len = skb->len;
2254 rc = ops->ndo_start_xmit(skb, dev); 2254 rc = ops->ndo_start_xmit(skb, dev);
2255 trace_net_dev_xmit(skb, rc, dev, skb_len); 2255 trace_net_dev_xmit(skb, rc, dev, skb_len);
@@ -2272,6 +2272,9 @@ gso:
2272 if (dev->priv_flags & IFF_XMIT_DST_RELEASE) 2272 if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
2273 skb_dst_drop(nskb); 2273 skb_dst_drop(nskb);
2274 2274
2275 if (!list_empty(&ptype_all))
2276 dev_queue_xmit_nit(nskb, dev);
2277
2275 skb_len = nskb->len; 2278 skb_len = nskb->len;
2276 rc = ops->ndo_start_xmit(nskb, dev); 2279 rc = ops->ndo_start_xmit(nskb, dev);
2277 trace_net_dev_xmit(nskb, rc, dev, skb_len); 2280 trace_net_dev_xmit(nskb, rc, dev, skb_len);