diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index b13e5c766c11..b24ab0e98eb4 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1624,7 +1624,6 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | |||
| 1624 | } | 1624 | } |
| 1625 | 1625 | ||
| 1626 | skb_orphan(skb); | 1626 | skb_orphan(skb); |
| 1627 | nf_reset(skb); | ||
| 1628 | 1627 | ||
| 1629 | if (unlikely(!is_skb_forwardable(dev, skb))) { | 1628 | if (unlikely(!is_skb_forwardable(dev, skb))) { |
| 1630 | atomic_long_inc(&dev->rx_dropped); | 1629 | atomic_long_inc(&dev->rx_dropped); |
| @@ -1640,6 +1639,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | |||
| 1640 | skb->mark = 0; | 1639 | skb->mark = 0; |
| 1641 | secpath_reset(skb); | 1640 | secpath_reset(skb); |
| 1642 | nf_reset(skb); | 1641 | nf_reset(skb); |
| 1642 | nf_reset_trace(skb); | ||
| 1643 | return netif_rx(skb); | 1643 | return netif_rx(skb); |
| 1644 | } | 1644 | } |
| 1645 | EXPORT_SYMBOL_GPL(dev_forward_skb); | 1645 | EXPORT_SYMBOL_GPL(dev_forward_skb); |
| @@ -2148,6 +2148,9 @@ static void skb_warn_bad_offload(const struct sk_buff *skb) | |||
| 2148 | struct net_device *dev = skb->dev; | 2148 | struct net_device *dev = skb->dev; |
| 2149 | const char *driver = ""; | 2149 | const char *driver = ""; |
| 2150 | 2150 | ||
| 2151 | if (!net_ratelimit()) | ||
| 2152 | return; | ||
| 2153 | |||
| 2151 | if (dev && dev->dev.parent) | 2154 | if (dev && dev->dev.parent) |
| 2152 | driver = dev_driver_string(dev->dev.parent); | 2155 | driver = dev_driver_string(dev->dev.parent); |
| 2153 | 2156 | ||
| @@ -3314,6 +3317,7 @@ int netdev_rx_handler_register(struct net_device *dev, | |||
| 3314 | if (dev->rx_handler) | 3317 | if (dev->rx_handler) |
| 3315 | return -EBUSY; | 3318 | return -EBUSY; |
| 3316 | 3319 | ||
| 3320 | /* Note: rx_handler_data must be set before rx_handler */ | ||
| 3317 | rcu_assign_pointer(dev->rx_handler_data, rx_handler_data); | 3321 | rcu_assign_pointer(dev->rx_handler_data, rx_handler_data); |
| 3318 | rcu_assign_pointer(dev->rx_handler, rx_handler); | 3322 | rcu_assign_pointer(dev->rx_handler, rx_handler); |
| 3319 | 3323 | ||
| @@ -3334,6 +3338,11 @@ void netdev_rx_handler_unregister(struct net_device *dev) | |||
| 3334 | 3338 | ||
| 3335 | ASSERT_RTNL(); | 3339 | ASSERT_RTNL(); |
| 3336 | RCU_INIT_POINTER(dev->rx_handler, NULL); | 3340 | RCU_INIT_POINTER(dev->rx_handler, NULL); |
| 3341 | /* a reader seeing a non NULL rx_handler in a rcu_read_lock() | ||
| 3342 | * section has a guarantee to see a non NULL rx_handler_data | ||
| 3343 | * as well. | ||
| 3344 | */ | ||
| 3345 | synchronize_net(); | ||
| 3337 | RCU_INIT_POINTER(dev->rx_handler_data, NULL); | 3346 | RCU_INIT_POINTER(dev->rx_handler_data, NULL); |
| 3338 | } | 3347 | } |
| 3339 | EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); | 3348 | EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); |
