diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 65492b0354c0..b2775f06c710 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -660,6 +660,27 @@ __setup("netdev=", netdev_boot_setup); | |||
| 660 | *******************************************************************************/ | 660 | *******************************************************************************/ |
| 661 | 661 | ||
| 662 | /** | 662 | /** |
| 663 | * dev_get_iflink - get 'iflink' value of a interface | ||
| 664 | * @dev: targeted interface | ||
| 665 | * | ||
| 666 | * Indicates the ifindex the interface is linked to. | ||
| 667 | * Physical interfaces have the same 'ifindex' and 'iflink' values. | ||
| 668 | */ | ||
| 669 | |||
| 670 | int dev_get_iflink(const struct net_device *dev) | ||
| 671 | { | ||
| 672 | if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) | ||
| 673 | return dev->netdev_ops->ndo_get_iflink(dev); | ||
| 674 | |||
| 675 | /* If dev->rtnl_link_ops is set, it's a virtual interface. */ | ||
| 676 | if (dev->rtnl_link_ops) | ||
| 677 | return 0; | ||
| 678 | |||
| 679 | return dev->ifindex; | ||
| 680 | } | ||
| 681 | EXPORT_SYMBOL(dev_get_iflink); | ||
| 682 | |||
| 683 | /** | ||
| 663 | * __dev_get_by_name - find a device by its name | 684 | * __dev_get_by_name - find a device by its name |
| 664 | * @net: the applicable net namespace | 685 | * @net: the applicable net namespace |
| 665 | * @name: name to find | 686 | * @name: name to find |
| @@ -2849,14 +2870,16 @@ static void skb_update_prio(struct sk_buff *skb) | |||
| 2849 | #define skb_update_prio(skb) | 2870 | #define skb_update_prio(skb) |
| 2850 | #endif | 2871 | #endif |
| 2851 | 2872 | ||
| 2852 | static DEFINE_PER_CPU(int, xmit_recursion); | 2873 | DEFINE_PER_CPU(int, xmit_recursion); |
| 2874 | EXPORT_SYMBOL(xmit_recursion); | ||
| 2875 | |||
| 2853 | #define RECURSION_LIMIT 10 | 2876 | #define RECURSION_LIMIT 10 |
| 2854 | 2877 | ||
| 2855 | /** | 2878 | /** |
| 2856 | * dev_loopback_xmit - loop back @skb | 2879 | * dev_loopback_xmit - loop back @skb |
| 2857 | * @skb: buffer to transmit | 2880 | * @skb: buffer to transmit |
| 2858 | */ | 2881 | */ |
| 2859 | int dev_loopback_xmit(struct sk_buff *skb) | 2882 | int dev_loopback_xmit(struct sock *sk, struct sk_buff *skb) |
| 2860 | { | 2883 | { |
| 2861 | skb_reset_mac_header(skb); | 2884 | skb_reset_mac_header(skb); |
| 2862 | __skb_pull(skb, skb_network_offset(skb)); | 2885 | __skb_pull(skb, skb_network_offset(skb)); |
| @@ -2994,11 +3017,11 @@ out: | |||
| 2994 | return rc; | 3017 | return rc; |
| 2995 | } | 3018 | } |
| 2996 | 3019 | ||
| 2997 | int dev_queue_xmit(struct sk_buff *skb) | 3020 | int dev_queue_xmit_sk(struct sock *sk, struct sk_buff *skb) |
| 2998 | { | 3021 | { |
| 2999 | return __dev_queue_xmit(skb, NULL); | 3022 | return __dev_queue_xmit(skb, NULL); |
| 3000 | } | 3023 | } |
| 3001 | EXPORT_SYMBOL(dev_queue_xmit); | 3024 | EXPORT_SYMBOL(dev_queue_xmit_sk); |
| 3002 | 3025 | ||
| 3003 | int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv) | 3026 | int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv) |
| 3004 | { | 3027 | { |
| @@ -3830,13 +3853,13 @@ static int netif_receive_skb_internal(struct sk_buff *skb) | |||
| 3830 | * NET_RX_SUCCESS: no congestion | 3853 | * NET_RX_SUCCESS: no congestion |
| 3831 | * NET_RX_DROP: packet was dropped | 3854 | * NET_RX_DROP: packet was dropped |
| 3832 | */ | 3855 | */ |
| 3833 | int netif_receive_skb(struct sk_buff *skb) | 3856 | int netif_receive_skb_sk(struct sock *sk, struct sk_buff *skb) |
| 3834 | { | 3857 | { |
| 3835 | trace_netif_receive_skb_entry(skb); | 3858 | trace_netif_receive_skb_entry(skb); |
| 3836 | 3859 | ||
| 3837 | return netif_receive_skb_internal(skb); | 3860 | return netif_receive_skb_internal(skb); |
| 3838 | } | 3861 | } |
| 3839 | EXPORT_SYMBOL(netif_receive_skb); | 3862 | EXPORT_SYMBOL(netif_receive_skb_sk); |
| 3840 | 3863 | ||
| 3841 | /* Network device is going away, flush any packets still pending | 3864 | /* Network device is going away, flush any packets still pending |
| 3842 | * Called with irqs disabled. | 3865 | * Called with irqs disabled. |
| @@ -6314,8 +6337,6 @@ int register_netdevice(struct net_device *dev) | |||
| 6314 | spin_lock_init(&dev->addr_list_lock); | 6337 | spin_lock_init(&dev->addr_list_lock); |
| 6315 | netdev_set_addr_lockdep_class(dev); | 6338 | netdev_set_addr_lockdep_class(dev); |
| 6316 | 6339 | ||
| 6317 | dev->iflink = -1; | ||
| 6318 | |||
| 6319 | ret = dev_get_valid_name(net, dev, dev->name); | 6340 | ret = dev_get_valid_name(net, dev, dev->name); |
| 6320 | if (ret < 0) | 6341 | if (ret < 0) |
| 6321 | goto out; | 6342 | goto out; |
| @@ -6345,9 +6366,6 @@ int register_netdevice(struct net_device *dev) | |||
| 6345 | else if (__dev_get_by_index(net, dev->ifindex)) | 6366 | else if (__dev_get_by_index(net, dev->ifindex)) |
| 6346 | goto err_uninit; | 6367 | goto err_uninit; |
| 6347 | 6368 | ||
| 6348 | if (dev->iflink == -1) | ||
| 6349 | dev->iflink = dev->ifindex; | ||
| 6350 | |||
| 6351 | /* Transfer changeable features to wanted_features and enable | 6369 | /* Transfer changeable features to wanted_features and enable |
| 6352 | * software offloads (GSO and GRO). | 6370 | * software offloads (GSO and GRO). |
| 6353 | */ | 6371 | */ |
| @@ -7060,12 +7078,8 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
| 7060 | dev_net_set(dev, net); | 7078 | dev_net_set(dev, net); |
| 7061 | 7079 | ||
| 7062 | /* If there is an ifindex conflict assign a new one */ | 7080 | /* If there is an ifindex conflict assign a new one */ |
| 7063 | if (__dev_get_by_index(net, dev->ifindex)) { | 7081 | if (__dev_get_by_index(net, dev->ifindex)) |
| 7064 | int iflink = (dev->iflink == dev->ifindex); | ||
| 7065 | dev->ifindex = dev_new_index(net); | 7082 | dev->ifindex = dev_new_index(net); |
| 7066 | if (iflink) | ||
| 7067 | dev->iflink = dev->ifindex; | ||
| 7068 | } | ||
| 7069 | 7083 | ||
| 7070 | /* Send a netdev-add uevent to the new namespace */ | 7084 | /* Send a netdev-add uevent to the new namespace */ |
| 7071 | kobject_uevent(&dev->dev.kobj, KOBJ_ADD); | 7085 | kobject_uevent(&dev->dev.kobj, KOBJ_ADD); |
