diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 6bb6470f5b7b..323c04edd779 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2915,9 +2915,11 @@ EXPORT_SYMBOL(xmit_recursion); | |||
2915 | 2915 | ||
2916 | /** | 2916 | /** |
2917 | * dev_loopback_xmit - loop back @skb | 2917 | * dev_loopback_xmit - loop back @skb |
2918 | * @net: network namespace this loopback is happening in | ||
2919 | * @sk: sk needed to be a netfilter okfn | ||
2918 | * @skb: buffer to transmit | 2920 | * @skb: buffer to transmit |
2919 | */ | 2921 | */ |
2920 | int dev_loopback_xmit(struct sock *sk, struct sk_buff *skb) | 2922 | int dev_loopback_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) |
2921 | { | 2923 | { |
2922 | skb_reset_mac_header(skb); | 2924 | skb_reset_mac_header(skb); |
2923 | __skb_pull(skb, skb_network_offset(skb)); | 2925 | __skb_pull(skb, skb_network_offset(skb)); |
@@ -3143,11 +3145,11 @@ out: | |||
3143 | return rc; | 3145 | return rc; |
3144 | } | 3146 | } |
3145 | 3147 | ||
3146 | int dev_queue_xmit_sk(struct sock *sk, struct sk_buff *skb) | 3148 | int dev_queue_xmit(struct sk_buff *skb) |
3147 | { | 3149 | { |
3148 | return __dev_queue_xmit(skb, NULL); | 3150 | return __dev_queue_xmit(skb, NULL); |
3149 | } | 3151 | } |
3150 | EXPORT_SYMBOL(dev_queue_xmit_sk); | 3152 | EXPORT_SYMBOL(dev_queue_xmit); |
3151 | 3153 | ||
3152 | int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv) | 3154 | int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv) |
3153 | { | 3155 | { |
@@ -3668,6 +3670,14 @@ static inline struct sk_buff *handle_ing(struct sk_buff *skb, | |||
3668 | case TC_ACT_QUEUED: | 3670 | case TC_ACT_QUEUED: |
3669 | kfree_skb(skb); | 3671 | kfree_skb(skb); |
3670 | return NULL; | 3672 | return NULL; |
3673 | case TC_ACT_REDIRECT: | ||
3674 | /* skb_mac_header check was done by cls/act_bpf, so | ||
3675 | * we can safely push the L2 header back before | ||
3676 | * redirecting to another netdev | ||
3677 | */ | ||
3678 | __skb_push(skb, skb->mac_len); | ||
3679 | skb_do_redirect(skb); | ||
3680 | return NULL; | ||
3671 | default: | 3681 | default: |
3672 | break; | 3682 | break; |
3673 | } | 3683 | } |
@@ -3982,13 +3992,13 @@ static int netif_receive_skb_internal(struct sk_buff *skb) | |||
3982 | * NET_RX_SUCCESS: no congestion | 3992 | * NET_RX_SUCCESS: no congestion |
3983 | * NET_RX_DROP: packet was dropped | 3993 | * NET_RX_DROP: packet was dropped |
3984 | */ | 3994 | */ |
3985 | int netif_receive_skb_sk(struct sock *sk, struct sk_buff *skb) | 3995 | int netif_receive_skb(struct sk_buff *skb) |
3986 | { | 3996 | { |
3987 | trace_netif_receive_skb_entry(skb); | 3997 | trace_netif_receive_skb_entry(skb); |
3988 | 3998 | ||
3989 | return netif_receive_skb_internal(skb); | 3999 | return netif_receive_skb_internal(skb); |
3990 | } | 4000 | } |
3991 | EXPORT_SYMBOL(netif_receive_skb_sk); | 4001 | EXPORT_SYMBOL(netif_receive_skb); |
3992 | 4002 | ||
3993 | /* Network device is going away, flush any packets still pending | 4003 | /* Network device is going away, flush any packets still pending |
3994 | * Called with irqs disabled. | 4004 | * Called with irqs disabled. |
@@ -4857,8 +4867,7 @@ struct netdev_adjacent { | |||
4857 | struct rcu_head rcu; | 4867 | struct rcu_head rcu; |
4858 | }; | 4868 | }; |
4859 | 4869 | ||
4860 | static struct netdev_adjacent *__netdev_find_adj(struct net_device *dev, | 4870 | static struct netdev_adjacent *__netdev_find_adj(struct net_device *adj_dev, |
4861 | struct net_device *adj_dev, | ||
4862 | struct list_head *adj_list) | 4871 | struct list_head *adj_list) |
4863 | { | 4872 | { |
4864 | struct netdev_adjacent *adj; | 4873 | struct netdev_adjacent *adj; |
@@ -4884,7 +4893,7 @@ bool netdev_has_upper_dev(struct net_device *dev, | |||
4884 | { | 4893 | { |
4885 | ASSERT_RTNL(); | 4894 | ASSERT_RTNL(); |
4886 | 4895 | ||
4887 | return __netdev_find_adj(dev, upper_dev, &dev->all_adj_list.upper); | 4896 | return __netdev_find_adj(upper_dev, &dev->all_adj_list.upper); |
4888 | } | 4897 | } |
4889 | EXPORT_SYMBOL(netdev_has_upper_dev); | 4898 | EXPORT_SYMBOL(netdev_has_upper_dev); |
4890 | 4899 | ||
@@ -5146,7 +5155,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, | |||
5146 | struct netdev_adjacent *adj; | 5155 | struct netdev_adjacent *adj; |
5147 | int ret; | 5156 | int ret; |
5148 | 5157 | ||
5149 | adj = __netdev_find_adj(dev, adj_dev, dev_list); | 5158 | adj = __netdev_find_adj(adj_dev, dev_list); |
5150 | 5159 | ||
5151 | if (adj) { | 5160 | if (adj) { |
5152 | adj->ref_nr++; | 5161 | adj->ref_nr++; |
@@ -5202,7 +5211,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev, | |||
5202 | { | 5211 | { |
5203 | struct netdev_adjacent *adj; | 5212 | struct netdev_adjacent *adj; |
5204 | 5213 | ||
5205 | adj = __netdev_find_adj(dev, adj_dev, dev_list); | 5214 | adj = __netdev_find_adj(adj_dev, dev_list); |
5206 | 5215 | ||
5207 | if (!adj) { | 5216 | if (!adj) { |
5208 | pr_err("tried to remove device %s from %s\n", | 5217 | pr_err("tried to remove device %s from %s\n", |
@@ -5323,10 +5332,10 @@ static int __netdev_upper_dev_link(struct net_device *dev, | |||
5323 | return -EBUSY; | 5332 | return -EBUSY; |
5324 | 5333 | ||
5325 | /* To prevent loops, check if dev is not upper device to upper_dev. */ | 5334 | /* To prevent loops, check if dev is not upper device to upper_dev. */ |
5326 | if (__netdev_find_adj(upper_dev, dev, &upper_dev->all_adj_list.upper)) | 5335 | if (__netdev_find_adj(dev, &upper_dev->all_adj_list.upper)) |
5327 | return -EBUSY; | 5336 | return -EBUSY; |
5328 | 5337 | ||
5329 | if (__netdev_find_adj(dev, upper_dev, &dev->adj_list.upper)) | 5338 | if (__netdev_find_adj(upper_dev, &dev->adj_list.upper)) |
5330 | return -EEXIST; | 5339 | return -EEXIST; |
5331 | 5340 | ||
5332 | if (master && netdev_master_upper_dev_get(dev)) | 5341 | if (master && netdev_master_upper_dev_get(dev)) |
@@ -5604,7 +5613,7 @@ void *netdev_lower_dev_get_private(struct net_device *dev, | |||
5604 | 5613 | ||
5605 | if (!lower_dev) | 5614 | if (!lower_dev) |
5606 | return NULL; | 5615 | return NULL; |
5607 | lower = __netdev_find_adj(dev, lower_dev, &dev->adj_list.lower); | 5616 | lower = __netdev_find_adj(lower_dev, &dev->adj_list.lower); |
5608 | if (!lower) | 5617 | if (!lower) |
5609 | return NULL; | 5618 | return NULL; |
5610 | 5619 | ||