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.c46
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
670int 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}
681EXPORT_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
2852static DEFINE_PER_CPU(int, xmit_recursion); 2873DEFINE_PER_CPU(int, xmit_recursion);
2874EXPORT_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 */
2859int dev_loopback_xmit(struct sk_buff *skb) 2882int 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
2997int dev_queue_xmit(struct sk_buff *skb) 3020int 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}
3001EXPORT_SYMBOL(dev_queue_xmit); 3024EXPORT_SYMBOL(dev_queue_xmit_sk);
3002 3025
3003int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv) 3026int 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 */
3833int netif_receive_skb(struct sk_buff *skb) 3856int 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}
3839EXPORT_SYMBOL(netif_receive_skb); 3862EXPORT_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);