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.c35
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 */
2920int dev_loopback_xmit(struct sock *sk, struct sk_buff *skb) 2922int 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
3146int dev_queue_xmit_sk(struct sock *sk, struct sk_buff *skb) 3148int 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}
3150EXPORT_SYMBOL(dev_queue_xmit_sk); 3152EXPORT_SYMBOL(dev_queue_xmit);
3151 3153
3152int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv) 3154int 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 */
3985int netif_receive_skb_sk(struct sock *sk, struct sk_buff *skb) 3995int 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}
3991EXPORT_SYMBOL(netif_receive_skb_sk); 4001EXPORT_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
4860static struct netdev_adjacent *__netdev_find_adj(struct net_device *dev, 4870static 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}
4889EXPORT_SYMBOL(netdev_has_upper_dev); 4898EXPORT_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