aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 72b0d26fd46d..f1129706ce7b 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2267,12 +2267,6 @@ int netif_receive_skb(struct sk_buff *skb)
2267 2267
2268 rcu_read_lock(); 2268 rcu_read_lock();
2269 2269
2270 /* Don't receive packets in an exiting network namespace */
2271 if (!net_alive(dev_net(skb->dev))) {
2272 kfree_skb(skb);
2273 goto out;
2274 }
2275
2276#ifdef CONFIG_NET_CLS_ACT 2270#ifdef CONFIG_NET_CLS_ACT
2277 if (skb->tc_verd & TC_NCLS) { 2271 if (skb->tc_verd & TC_NCLS) {
2278 skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); 2272 skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
@@ -4288,6 +4282,39 @@ unsigned long netdev_fix_features(unsigned long features, const char *name)
4288} 4282}
4289EXPORT_SYMBOL(netdev_fix_features); 4283EXPORT_SYMBOL(netdev_fix_features);
4290 4284
4285/* Some devices need to (re-)set their netdev_ops inside
4286 * ->init() or similar. If that happens, we have to setup
4287 * the compat pointers again.
4288 */
4289void netdev_resync_ops(struct net_device *dev)
4290{
4291#ifdef CONFIG_COMPAT_NET_DEV_OPS
4292 const struct net_device_ops *ops = dev->netdev_ops;
4293
4294 dev->init = ops->ndo_init;
4295 dev->uninit = ops->ndo_uninit;
4296 dev->open = ops->ndo_open;
4297 dev->change_rx_flags = ops->ndo_change_rx_flags;
4298 dev->set_rx_mode = ops->ndo_set_rx_mode;
4299 dev->set_multicast_list = ops->ndo_set_multicast_list;
4300 dev->set_mac_address = ops->ndo_set_mac_address;
4301 dev->validate_addr = ops->ndo_validate_addr;
4302 dev->do_ioctl = ops->ndo_do_ioctl;
4303 dev->set_config = ops->ndo_set_config;
4304 dev->change_mtu = ops->ndo_change_mtu;
4305 dev->neigh_setup = ops->ndo_neigh_setup;
4306 dev->tx_timeout = ops->ndo_tx_timeout;
4307 dev->get_stats = ops->ndo_get_stats;
4308 dev->vlan_rx_register = ops->ndo_vlan_rx_register;
4309 dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid;
4310 dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid;
4311#ifdef CONFIG_NET_POLL_CONTROLLER
4312 dev->poll_controller = ops->ndo_poll_controller;
4313#endif
4314#endif
4315}
4316EXPORT_SYMBOL(netdev_resync_ops);
4317
4291/** 4318/**
4292 * register_netdevice - register a network device 4319 * register_netdevice - register a network device
4293 * @dev: device to register 4320 * @dev: device to register
@@ -4332,27 +4359,7 @@ int register_netdevice(struct net_device *dev)
4332 * This is temporary until all network devices are converted. 4359 * This is temporary until all network devices are converted.
4333 */ 4360 */
4334 if (dev->netdev_ops) { 4361 if (dev->netdev_ops) {
4335 const struct net_device_ops *ops = dev->netdev_ops; 4362 netdev_resync_ops(dev);
4336
4337 dev->init = ops->ndo_init;
4338 dev->uninit = ops->ndo_uninit;
4339 dev->open = ops->ndo_open;
4340 dev->change_rx_flags = ops->ndo_change_rx_flags;
4341 dev->set_rx_mode = ops->ndo_set_rx_mode;
4342 dev->set_multicast_list = ops->ndo_set_multicast_list;
4343 dev->set_mac_address = ops->ndo_set_mac_address;
4344 dev->validate_addr = ops->ndo_validate_addr;
4345 dev->do_ioctl = ops->ndo_do_ioctl;
4346 dev->set_config = ops->ndo_set_config;
4347 dev->change_mtu = ops->ndo_change_mtu;
4348 dev->tx_timeout = ops->ndo_tx_timeout;
4349 dev->get_stats = ops->ndo_get_stats;
4350 dev->vlan_rx_register = ops->ndo_vlan_rx_register;
4351 dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid;
4352 dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid;
4353#ifdef CONFIG_NET_POLL_CONTROLLER
4354 dev->poll_controller = ops->ndo_poll_controller;
4355#endif
4356 } else { 4363 } else {
4357 char drivername[64]; 4364 char drivername[64];
4358 pr_info("%s (%s): not using net_device_ops yet\n", 4365 pr_info("%s (%s): not using net_device_ops yet\n",