diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/dev.c | 37 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 6 |
2 files changed, 9 insertions, 34 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 171420e75b03..7fe82929f509 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2352,7 +2352,6 @@ EXPORT_SYMBOL(skb_checksum_help); | |||
| 2352 | 2352 | ||
| 2353 | __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | 2353 | __be16 skb_network_protocol(struct sk_buff *skb, int *depth) |
| 2354 | { | 2354 | { |
| 2355 | unsigned int vlan_depth = skb->mac_len; | ||
| 2356 | __be16 type = skb->protocol; | 2355 | __be16 type = skb->protocol; |
| 2357 | 2356 | ||
| 2358 | /* Tunnel gso handlers can set protocol to ethernet. */ | 2357 | /* Tunnel gso handlers can set protocol to ethernet. */ |
| @@ -2366,35 +2365,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | |||
| 2366 | type = eth->h_proto; | 2365 | type = eth->h_proto; |
| 2367 | } | 2366 | } |
| 2368 | 2367 | ||
| 2369 | /* if skb->protocol is 802.1Q/AD then the header should already be | 2368 | return __vlan_get_protocol(skb, type, depth); |
| 2370 | * present at mac_len - VLAN_HLEN (if mac_len > 0), or at | ||
| 2371 | * ETH_HLEN otherwise | ||
| 2372 | */ | ||
| 2373 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { | ||
| 2374 | if (vlan_depth) { | ||
| 2375 | if (WARN_ON(vlan_depth < VLAN_HLEN)) | ||
| 2376 | return 0; | ||
| 2377 | vlan_depth -= VLAN_HLEN; | ||
| 2378 | } else { | ||
| 2379 | vlan_depth = ETH_HLEN; | ||
| 2380 | } | ||
| 2381 | do { | ||
| 2382 | struct vlan_hdr *vh; | ||
| 2383 | |||
| 2384 | if (unlikely(!pskb_may_pull(skb, | ||
| 2385 | vlan_depth + VLAN_HLEN))) | ||
| 2386 | return 0; | ||
| 2387 | |||
| 2388 | vh = (struct vlan_hdr *)(skb->data + vlan_depth); | ||
| 2389 | type = vh->h_vlan_encapsulated_proto; | ||
| 2390 | vlan_depth += VLAN_HLEN; | ||
| 2391 | } while (type == htons(ETH_P_8021Q) || | ||
| 2392 | type == htons(ETH_P_8021AD)); | ||
| 2393 | } | ||
| 2394 | |||
| 2395 | *depth = vlan_depth; | ||
| 2396 | |||
| 2397 | return type; | ||
| 2398 | } | 2369 | } |
| 2399 | 2370 | ||
| 2400 | /** | 2371 | /** |
| @@ -5323,7 +5294,7 @@ void netdev_upper_dev_unlink(struct net_device *dev, | |||
| 5323 | } | 5294 | } |
| 5324 | EXPORT_SYMBOL(netdev_upper_dev_unlink); | 5295 | EXPORT_SYMBOL(netdev_upper_dev_unlink); |
| 5325 | 5296 | ||
| 5326 | void netdev_adjacent_add_links(struct net_device *dev) | 5297 | static void netdev_adjacent_add_links(struct net_device *dev) |
| 5327 | { | 5298 | { |
| 5328 | struct netdev_adjacent *iter; | 5299 | struct netdev_adjacent *iter; |
| 5329 | 5300 | ||
| @@ -5348,7 +5319,7 @@ void netdev_adjacent_add_links(struct net_device *dev) | |||
| 5348 | } | 5319 | } |
| 5349 | } | 5320 | } |
| 5350 | 5321 | ||
| 5351 | void netdev_adjacent_del_links(struct net_device *dev) | 5322 | static void netdev_adjacent_del_links(struct net_device *dev) |
| 5352 | { | 5323 | { |
| 5353 | struct netdev_adjacent *iter; | 5324 | struct netdev_adjacent *iter; |
| 5354 | 5325 | ||
| @@ -6656,7 +6627,7 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev) | |||
| 6656 | if (!queue) | 6627 | if (!queue) |
| 6657 | return NULL; | 6628 | return NULL; |
| 6658 | netdev_init_one_queue(dev, queue, NULL); | 6629 | netdev_init_one_queue(dev, queue, NULL); |
| 6659 | queue->qdisc = &noop_qdisc; | 6630 | RCU_INIT_POINTER(queue->qdisc, &noop_qdisc); |
| 6660 | queue->qdisc_sleeping = &noop_qdisc; | 6631 | queue->qdisc_sleeping = &noop_qdisc; |
| 6661 | rcu_assign_pointer(dev->ingress_queue, queue); | 6632 | rcu_assign_pointer(dev->ingress_queue, queue); |
| 6662 | #endif | 6633 | #endif |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9cf6fe9ddc0c..446cbaf81185 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -2895,12 +2895,16 @@ static int rtnl_bridge_notify(struct net_device *dev, u16 flags) | |||
| 2895 | goto errout; | 2895 | goto errout; |
| 2896 | } | 2896 | } |
| 2897 | 2897 | ||
| 2898 | if (!skb->len) | ||
| 2899 | goto errout; | ||
| 2900 | |||
| 2898 | rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); | 2901 | rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); |
| 2899 | return 0; | 2902 | return 0; |
| 2900 | errout: | 2903 | errout: |
| 2901 | WARN_ON(err == -EMSGSIZE); | 2904 | WARN_ON(err == -EMSGSIZE); |
| 2902 | kfree_skb(skb); | 2905 | kfree_skb(skb); |
| 2903 | rtnl_set_sk_err(net, RTNLGRP_LINK, err); | 2906 | if (err) |
| 2907 | rtnl_set_sk_err(net, RTNLGRP_LINK, err); | ||
| 2904 | return err; | 2908 | return err; |
| 2905 | } | 2909 | } |
| 2906 | 2910 | ||
