diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan_core.c | 46 | ||||
| -rw-r--r-- | net/core/dev.c | 3 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 3 | ||||
| -rw-r--r-- | net/ipv4/xfrm4_state.c | 1 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_state.c | 1 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_helper.c | 3 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_proto.c | 5 | ||||
| -rw-r--r-- | net/rfkill/rfkill.c | 2 |
9 files changed, 51 insertions, 17 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 916061f681b6..68ced4bf158c 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
| @@ -3,11 +3,20 @@ | |||
| 3 | #include <linux/if_vlan.h> | 3 | #include <linux/if_vlan.h> |
| 4 | #include "vlan.h" | 4 | #include "vlan.h" |
| 5 | 5 | ||
| 6 | struct vlan_hwaccel_cb { | ||
| 7 | struct net_device *dev; | ||
| 8 | }; | ||
| 9 | |||
| 10 | static inline struct vlan_hwaccel_cb *vlan_hwaccel_cb(struct sk_buff *skb) | ||
| 11 | { | ||
| 12 | return (struct vlan_hwaccel_cb *)skb->cb; | ||
| 13 | } | ||
| 14 | |||
| 6 | /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */ | 15 | /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */ |
| 7 | int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | 16 | int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
| 8 | u16 vlan_tci, int polling) | 17 | u16 vlan_tci, int polling) |
| 9 | { | 18 | { |
| 10 | struct net_device_stats *stats; | 19 | struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb); |
| 11 | 20 | ||
| 12 | if (skb_bond_should_drop(skb)) { | 21 | if (skb_bond_should_drop(skb)) { |
| 13 | dev_kfree_skb_any(skb); | 22 | dev_kfree_skb_any(skb); |
| @@ -15,23 +24,35 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 15 | } | 24 | } |
| 16 | 25 | ||
| 17 | skb->vlan_tci = vlan_tci; | 26 | skb->vlan_tci = vlan_tci; |
| 27 | cb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | ||
| 28 | |||
| 29 | return (polling ? netif_receive_skb(skb) : netif_rx(skb)); | ||
| 30 | } | ||
| 31 | EXPORT_SYMBOL(__vlan_hwaccel_rx); | ||
| 32 | |||
| 33 | int vlan_hwaccel_do_receive(struct sk_buff *skb) | ||
| 34 | { | ||
| 35 | struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb); | ||
| 36 | struct net_device *dev = cb->dev; | ||
| 37 | struct net_device_stats *stats; | ||
| 38 | |||
| 18 | netif_nit_deliver(skb); | 39 | netif_nit_deliver(skb); |
| 19 | 40 | ||
| 20 | skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | 41 | if (dev == NULL) { |
| 21 | if (skb->dev == NULL) { | 42 | kfree_skb(skb); |
| 22 | dev_kfree_skb_any(skb); | 43 | return -1; |
| 23 | /* Not NET_RX_DROP, this is not being dropped | ||
| 24 | * due to congestion. */ | ||
| 25 | return NET_RX_SUCCESS; | ||
| 26 | } | 44 | } |
| 27 | skb->dev->last_rx = jiffies; | 45 | |
| 46 | skb->dev = dev; | ||
| 47 | skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci); | ||
| 28 | skb->vlan_tci = 0; | 48 | skb->vlan_tci = 0; |
| 29 | 49 | ||
| 30 | stats = &skb->dev->stats; | 50 | dev->last_rx = jiffies; |
| 51 | |||
| 52 | stats = &dev->stats; | ||
| 31 | stats->rx_packets++; | 53 | stats->rx_packets++; |
| 32 | stats->rx_bytes += skb->len; | 54 | stats->rx_bytes += skb->len; |
| 33 | 55 | ||
| 34 | skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci); | ||
| 35 | switch (skb->pkt_type) { | 56 | switch (skb->pkt_type) { |
| 36 | case PACKET_BROADCAST: | 57 | case PACKET_BROADCAST: |
| 37 | break; | 58 | break; |
| @@ -43,13 +64,12 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 43 | * This allows the VLAN to have a different MAC than the | 64 | * This allows the VLAN to have a different MAC than the |
| 44 | * underlying device, and still route correctly. */ | 65 | * underlying device, and still route correctly. */ |
| 45 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, | 66 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, |
| 46 | skb->dev->dev_addr)) | 67 | dev->dev_addr)) |
| 47 | skb->pkt_type = PACKET_HOST; | 68 | skb->pkt_type = PACKET_HOST; |
| 48 | break; | 69 | break; |
| 49 | }; | 70 | }; |
| 50 | return (polling ? netif_receive_skb(skb) : netif_rx(skb)); | 71 | return 0; |
| 51 | } | 72 | } |
| 52 | EXPORT_SYMBOL(__vlan_hwaccel_rx); | ||
| 53 | 73 | ||
| 54 | struct net_device *vlan_dev_real_dev(const struct net_device *dev) | 74 | struct net_device *vlan_dev_real_dev(const struct net_device *dev) |
| 55 | { | 75 | { |
diff --git a/net/core/dev.c b/net/core/dev.c index d9038e328cc1..9174c77d3112 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2218,6 +2218,9 @@ int netif_receive_skb(struct sk_buff *skb) | |||
| 2218 | int ret = NET_RX_DROP; | 2218 | int ret = NET_RX_DROP; |
| 2219 | __be16 type; | 2219 | __be16 type; |
| 2220 | 2220 | ||
| 2221 | if (skb->vlan_tci && vlan_hwaccel_do_receive(skb)) | ||
| 2222 | return NET_RX_SUCCESS; | ||
| 2223 | |||
| 2221 | /* if we've gotten here through NAPI, check netpoll */ | 2224 | /* if we've gotten here through NAPI, check netpoll */ |
| 2222 | if (netpoll_receive_skb(skb)) | 2225 | if (netpoll_receive_skb(skb)) |
| 2223 | return NET_RX_DROP; | 2226 | return NET_RX_DROP; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index eccb7165a80c..c5aca0bb116a 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -1374,8 +1374,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1374 | sk->sk_state == TCP_CLOSE || | 1374 | sk->sk_state == TCP_CLOSE || |
| 1375 | (sk->sk_shutdown & RCV_SHUTDOWN) || | 1375 | (sk->sk_shutdown & RCV_SHUTDOWN) || |
| 1376 | !timeo || | 1376 | !timeo || |
| 1377 | signal_pending(current) || | 1377 | signal_pending(current)) |
| 1378 | (flags & MSG_PEEK)) | ||
| 1379 | break; | 1378 | break; |
| 1380 | } else { | 1379 | } else { |
| 1381 | if (sock_flag(sk, SOCK_DONE)) | 1380 | if (sock_flag(sk, SOCK_DONE)) |
diff --git a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c index 07735ed280d7..55dc6beab9aa 100644 --- a/net/ipv4/xfrm4_state.c +++ b/net/ipv4/xfrm4_state.c | |||
| @@ -33,6 +33,7 @@ __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl, | |||
| 33 | x->sel.dport_mask = htons(0xffff); | 33 | x->sel.dport_mask = htons(0xffff); |
| 34 | x->sel.sport = xfrm_flowi_sport(fl); | 34 | x->sel.sport = xfrm_flowi_sport(fl); |
| 35 | x->sel.sport_mask = htons(0xffff); | 35 | x->sel.sport_mask = htons(0xffff); |
| 36 | x->sel.family = AF_INET; | ||
| 36 | x->sel.prefixlen_d = 32; | 37 | x->sel.prefixlen_d = 32; |
| 37 | x->sel.prefixlen_s = 32; | 38 | x->sel.prefixlen_s = 32; |
| 38 | x->sel.proto = fl->proto; | 39 | x->sel.proto = fl->proto; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index eea9542728ca..d9da5eb9dcb2 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -2483,8 +2483,10 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
| 2483 | if (!idev && dev->mtu >= IPV6_MIN_MTU) | 2483 | if (!idev && dev->mtu >= IPV6_MIN_MTU) |
| 2484 | idev = ipv6_add_dev(dev); | 2484 | idev = ipv6_add_dev(dev); |
| 2485 | 2485 | ||
| 2486 | if (idev) | 2486 | if (idev) { |
| 2487 | idev->if_flags |= IF_READY; | 2487 | idev->if_flags |= IF_READY; |
| 2488 | run_pending = 1; | ||
| 2489 | } | ||
| 2488 | } else { | 2490 | } else { |
| 2489 | if (!addrconf_qdisc_ok(dev)) { | 2491 | if (!addrconf_qdisc_ok(dev)) { |
| 2490 | /* device is still not ready. */ | 2492 | /* device is still not ready. */ |
diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c index 89884a4f23aa..60c78cfc2737 100644 --- a/net/ipv6/xfrm6_state.c +++ b/net/ipv6/xfrm6_state.c | |||
| @@ -34,6 +34,7 @@ __xfrm6_init_tempsel(struct xfrm_state *x, struct flowi *fl, | |||
| 34 | x->sel.dport_mask = htons(0xffff); | 34 | x->sel.dport_mask = htons(0xffff); |
| 35 | x->sel.sport = xfrm_flowi_sport(fl); | 35 | x->sel.sport = xfrm_flowi_sport(fl); |
| 36 | x->sel.sport_mask = htons(0xffff); | 36 | x->sel.sport_mask = htons(0xffff); |
| 37 | x->sel.family = AF_INET6; | ||
| 37 | x->sel.prefixlen_d = 128; | 38 | x->sel.prefixlen_d = 128; |
| 38 | x->sel.prefixlen_s = 128; | 39 | x->sel.prefixlen_s = 128; |
| 39 | x->sel.proto = fl->proto; | 40 | x->sel.proto = fl->proto; |
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index 9c06b9f86ad4..c39b6a994133 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/netdevice.h> | 22 | #include <linux/netdevice.h> |
| 23 | #include <linux/rculist.h> | 23 | #include <linux/rculist.h> |
| 24 | #include <linux/rtnetlink.h> | ||
| 24 | 25 | ||
| 25 | #include <net/netfilter/nf_conntrack.h> | 26 | #include <net/netfilter/nf_conntrack.h> |
| 26 | #include <net/netfilter/nf_conntrack_l3proto.h> | 27 | #include <net/netfilter/nf_conntrack_l3proto.h> |
| @@ -167,10 +168,12 @@ void nf_conntrack_helper_unregister(struct nf_conntrack_helper *me) | |||
| 167 | */ | 168 | */ |
| 168 | synchronize_rcu(); | 169 | synchronize_rcu(); |
| 169 | 170 | ||
| 171 | rtnl_lock(); | ||
| 170 | spin_lock_bh(&nf_conntrack_lock); | 172 | spin_lock_bh(&nf_conntrack_lock); |
| 171 | for_each_net(net) | 173 | for_each_net(net) |
| 172 | __nf_conntrack_helper_unregister(me, net); | 174 | __nf_conntrack_helper_unregister(me, net); |
| 173 | spin_unlock_bh(&nf_conntrack_lock); | 175 | spin_unlock_bh(&nf_conntrack_lock); |
| 176 | rtnl_unlock(); | ||
| 174 | } | 177 | } |
| 175 | EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); | 178 | EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); |
| 176 | 179 | ||
diff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c index a59a307e685d..592d73344d46 100644 --- a/net/netfilter/nf_conntrack_proto.c +++ b/net/netfilter/nf_conntrack_proto.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/notifier.h> | 22 | #include <linux/notifier.h> |
| 23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
| 24 | #include <linux/netdevice.h> | 24 | #include <linux/netdevice.h> |
| 25 | #include <linux/rtnetlink.h> | ||
| 25 | 26 | ||
| 26 | #include <net/netfilter/nf_conntrack.h> | 27 | #include <net/netfilter/nf_conntrack.h> |
| 27 | #include <net/netfilter/nf_conntrack_l3proto.h> | 28 | #include <net/netfilter/nf_conntrack_l3proto.h> |
| @@ -221,8 +222,10 @@ void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto) | |||
| 221 | synchronize_rcu(); | 222 | synchronize_rcu(); |
| 222 | 223 | ||
| 223 | /* Remove all contrack entries for this protocol */ | 224 | /* Remove all contrack entries for this protocol */ |
| 225 | rtnl_lock(); | ||
| 224 | for_each_net(net) | 226 | for_each_net(net) |
| 225 | nf_ct_iterate_cleanup(net, kill_l3proto, proto); | 227 | nf_ct_iterate_cleanup(net, kill_l3proto, proto); |
| 228 | rtnl_unlock(); | ||
| 226 | } | 229 | } |
| 227 | EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister); | 230 | EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister); |
| 228 | 231 | ||
| @@ -333,8 +336,10 @@ void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto) | |||
| 333 | synchronize_rcu(); | 336 | synchronize_rcu(); |
| 334 | 337 | ||
| 335 | /* Remove all contrack entries for this protocol */ | 338 | /* Remove all contrack entries for this protocol */ |
| 339 | rtnl_lock(); | ||
| 336 | for_each_net(net) | 340 | for_each_net(net) |
| 337 | nf_ct_iterate_cleanup(net, kill_l4proto, l4proto); | 341 | nf_ct_iterate_cleanup(net, kill_l4proto, l4proto); |
| 342 | rtnl_unlock(); | ||
| 338 | } | 343 | } |
| 339 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister); | 344 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister); |
| 340 | 345 | ||
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index f949a482b007..25ba3bd57e66 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
| @@ -603,7 +603,7 @@ static int rfkill_check_duplicity(const struct rfkill *rfkill) | |||
| 603 | } | 603 | } |
| 604 | 604 | ||
| 605 | /* 0: first switch of its kind */ | 605 | /* 0: first switch of its kind */ |
| 606 | return test_bit(rfkill->type, seen); | 606 | return (test_bit(rfkill->type, seen)) ? 1 : 0; |
| 607 | } | 607 | } |
| 608 | 608 | ||
| 609 | static int rfkill_add_switch(struct rfkill *rfkill) | 609 | static int rfkill_add_switch(struct rfkill *rfkill) |
