diff options
| author | David S. Miller <davem@davemloft.net> | 2011-12-02 13:49:21 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-12-02 13:49:21 -0500 |
| commit | b3613118eb30a589d971e4eccbbb2a1314f5dfd4 (patch) | |
| tree | 868c1ee59e1b5c19a4f2e43716400d0001a994e5 /net | |
| parent | 7505afe28c16a8d386624930a018d0052c75d687 (diff) | |
| parent | 5983fe2b29df5885880d7fa3b91aca306c7564ef (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net')
| -rw-r--r-- | net/bridge/br_netlink.c | 6 | ||||
| -rw-r--r-- | net/bridge/br_stp.c | 29 | ||||
| -rw-r--r-- | net/ceph/osd_client.c | 2 | ||||
| -rw-r--r-- | net/core/dev.c | 9 | ||||
| -rw-r--r-- | net/core/dev_addr_lists.c | 3 | ||||
| -rw-r--r-- | net/decnet/dn_timer.c | 17 | ||||
| -rw-r--r-- | net/ipv4/devinet.c | 5 | ||||
| -rw-r--r-- | net/ipv4/netfilter.c | 3 | ||||
| -rw-r--r-- | net/ipv4/route.c | 44 | ||||
| -rw-r--r-- | net/ipv4/udp.c | 15 | ||||
| -rw-r--r-- | net/ipv6/ipv6_sockglue.c | 2 | ||||
| -rw-r--r-- | net/ipv6/udp.c | 15 | ||||
| -rw-r--r-- | net/l2tp/l2tp_core.c | 2 | ||||
| -rw-r--r-- | net/mac80211/agg-tx.c | 42 | ||||
| -rw-r--r-- | net/netfilter/Kconfig | 1 | ||||
| -rw-r--r-- | net/netfilter/ipset/ip_set_hash_ipport.c | 2 | ||||
| -rw-r--r-- | net/netfilter/ipset/ip_set_hash_ipportip.c | 2 | ||||
| -rw-r--r-- | net/netfilter/ipset/ip_set_hash_ipportnet.c | 2 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_ecache.c | 37 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 73 | ||||
| -rw-r--r-- | net/netlabel/netlabel_kapi.c | 22 | ||||
| -rw-r--r-- | net/sched/sch_red.c | 4 | ||||
| -rw-r--r-- | net/sched/sch_teql.c | 31 | ||||
| -rw-r--r-- | net/sctp/auth.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 7 | ||||
| -rw-r--r-- | net/unix/af_unix.c | 4 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 4 |
27 files changed, 253 insertions, 132 deletions
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index e5f9ece3c9a0..a1daf8227ed1 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <net/sock.h> | 18 | #include <net/sock.h> |
| 19 | 19 | ||
| 20 | #include "br_private.h" | 20 | #include "br_private.h" |
| 21 | #include "br_private_stp.h" | ||
| 21 | 22 | ||
| 22 | static inline size_t br_nlmsg_size(void) | 23 | static inline size_t br_nlmsg_size(void) |
| 23 | { | 24 | { |
| @@ -188,6 +189,11 @@ static int br_rtm_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 188 | 189 | ||
| 189 | p->state = new_state; | 190 | p->state = new_state; |
| 190 | br_log_state(p); | 191 | br_log_state(p); |
| 192 | |||
| 193 | spin_lock_bh(&p->br->lock); | ||
| 194 | br_port_state_selection(p->br); | ||
| 195 | spin_unlock_bh(&p->br->lock); | ||
| 196 | |||
| 191 | br_ifinfo_notify(RTM_NEWLINK, p); | 197 | br_ifinfo_notify(RTM_NEWLINK, p); |
| 192 | 198 | ||
| 193 | return 0; | 199 | return 0; |
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c index ad0a3f7cf6cc..dd147d78a588 100644 --- a/net/bridge/br_stp.c +++ b/net/bridge/br_stp.c | |||
| @@ -399,25 +399,24 @@ void br_port_state_selection(struct net_bridge *br) | |||
| 399 | struct net_bridge_port *p; | 399 | struct net_bridge_port *p; |
| 400 | unsigned int liveports = 0; | 400 | unsigned int liveports = 0; |
| 401 | 401 | ||
| 402 | /* Don't change port states if userspace is handling STP */ | ||
| 403 | if (br->stp_enabled == BR_USER_STP) | ||
| 404 | return; | ||
| 405 | |||
| 406 | list_for_each_entry(p, &br->port_list, list) { | 402 | list_for_each_entry(p, &br->port_list, list) { |
| 407 | if (p->state == BR_STATE_DISABLED) | 403 | if (p->state == BR_STATE_DISABLED) |
| 408 | continue; | 404 | continue; |
| 409 | 405 | ||
| 410 | if (p->port_no == br->root_port) { | 406 | /* Don't change port states if userspace is handling STP */ |
| 411 | p->config_pending = 0; | 407 | if (br->stp_enabled != BR_USER_STP) { |
| 412 | p->topology_change_ack = 0; | 408 | if (p->port_no == br->root_port) { |
| 413 | br_make_forwarding(p); | 409 | p->config_pending = 0; |
| 414 | } else if (br_is_designated_port(p)) { | 410 | p->topology_change_ack = 0; |
| 415 | del_timer(&p->message_age_timer); | 411 | br_make_forwarding(p); |
| 416 | br_make_forwarding(p); | 412 | } else if (br_is_designated_port(p)) { |
| 417 | } else { | 413 | del_timer(&p->message_age_timer); |
| 418 | p->config_pending = 0; | 414 | br_make_forwarding(p); |
| 419 | p->topology_change_ack = 0; | 415 | } else { |
| 420 | br_make_blocking(p); | 416 | p->config_pending = 0; |
| 417 | p->topology_change_ack = 0; | ||
| 418 | br_make_blocking(p); | ||
| 419 | } | ||
| 421 | } | 420 | } |
| 422 | 421 | ||
| 423 | if (p->state == BR_STATE_FORWARDING) | 422 | if (p->state == BR_STATE_FORWARDING) |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 733e46008b89..f4f3f58f5234 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
| @@ -244,7 +244,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | |||
| 244 | ceph_pagelist_init(req->r_trail); | 244 | ceph_pagelist_init(req->r_trail); |
| 245 | } | 245 | } |
| 246 | /* create request message; allow space for oid */ | 246 | /* create request message; allow space for oid */ |
| 247 | msg_size += 40; | 247 | msg_size += MAX_OBJ_NAME_SIZE; |
| 248 | if (snapc) | 248 | if (snapc) |
| 249 | msg_size += sizeof(u64) * snapc->num_snaps; | 249 | msg_size += sizeof(u64) * snapc->num_snaps; |
| 250 | if (use_mempool) | 250 | if (use_mempool) |
diff --git a/net/core/dev.c b/net/core/dev.c index e0c3deec59b0..f494675471a9 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1387,7 +1387,7 @@ rollback: | |||
| 1387 | for_each_net(net) { | 1387 | for_each_net(net) { |
| 1388 | for_each_netdev(net, dev) { | 1388 | for_each_netdev(net, dev) { |
| 1389 | if (dev == last) | 1389 | if (dev == last) |
| 1390 | break; | 1390 | goto outroll; |
| 1391 | 1391 | ||
| 1392 | if (dev->flags & IFF_UP) { | 1392 | if (dev->flags & IFF_UP) { |
| 1393 | nb->notifier_call(nb, NETDEV_GOING_DOWN, dev); | 1393 | nb->notifier_call(nb, NETDEV_GOING_DOWN, dev); |
| @@ -1398,6 +1398,7 @@ rollback: | |||
| 1398 | } | 1398 | } |
| 1399 | } | 1399 | } |
| 1400 | 1400 | ||
| 1401 | outroll: | ||
| 1401 | raw_notifier_chain_unregister(&netdev_chain, nb); | 1402 | raw_notifier_chain_unregister(&netdev_chain, nb); |
| 1402 | goto unlock; | 1403 | goto unlock; |
| 1403 | } | 1404 | } |
| @@ -4209,6 +4210,12 @@ static int dev_seq_open(struct inode *inode, struct file *file) | |||
| 4209 | sizeof(struct dev_iter_state)); | 4210 | sizeof(struct dev_iter_state)); |
| 4210 | } | 4211 | } |
| 4211 | 4212 | ||
| 4213 | int dev_seq_open_ops(struct inode *inode, struct file *file, | ||
| 4214 | const struct seq_operations *ops) | ||
| 4215 | { | ||
| 4216 | return seq_open_net(inode, file, ops, sizeof(struct dev_iter_state)); | ||
| 4217 | } | ||
| 4218 | |||
| 4212 | static const struct file_operations dev_seq_fops = { | 4219 | static const struct file_operations dev_seq_fops = { |
| 4213 | .owner = THIS_MODULE, | 4220 | .owner = THIS_MODULE, |
| 4214 | .open = dev_seq_open, | 4221 | .open = dev_seq_open, |
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 277faef9148d..febba516db62 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c | |||
| @@ -696,8 +696,7 @@ static const struct seq_operations dev_mc_seq_ops = { | |||
| 696 | 696 | ||
| 697 | static int dev_mc_seq_open(struct inode *inode, struct file *file) | 697 | static int dev_mc_seq_open(struct inode *inode, struct file *file) |
| 698 | { | 698 | { |
| 699 | return seq_open_net(inode, file, &dev_mc_seq_ops, | 699 | return dev_seq_open_ops(inode, file, &dev_mc_seq_ops); |
| 700 | sizeof(struct seq_net_private)); | ||
| 701 | } | 700 | } |
| 702 | 701 | ||
| 703 | static const struct file_operations dev_mc_seq_fops = { | 702 | static const struct file_operations dev_mc_seq_fops = { |
diff --git a/net/decnet/dn_timer.c b/net/decnet/dn_timer.c index 67f691bd4acf..d9c150cc59a9 100644 --- a/net/decnet/dn_timer.c +++ b/net/decnet/dn_timer.c | |||
| @@ -36,16 +36,13 @@ static void dn_slow_timer(unsigned long arg); | |||
| 36 | 36 | ||
| 37 | void dn_start_slow_timer(struct sock *sk) | 37 | void dn_start_slow_timer(struct sock *sk) |
| 38 | { | 38 | { |
| 39 | sk->sk_timer.expires = jiffies + SLOW_INTERVAL; | 39 | setup_timer(&sk->sk_timer, dn_slow_timer, (unsigned long)sk); |
| 40 | sk->sk_timer.function = dn_slow_timer; | 40 | sk_reset_timer(sk, &sk->sk_timer, jiffies + SLOW_INTERVAL); |
| 41 | sk->sk_timer.data = (unsigned long)sk; | ||
| 42 | |||
| 43 | add_timer(&sk->sk_timer); | ||
| 44 | } | 41 | } |
| 45 | 42 | ||
| 46 | void dn_stop_slow_timer(struct sock *sk) | 43 | void dn_stop_slow_timer(struct sock *sk) |
| 47 | { | 44 | { |
| 48 | del_timer(&sk->sk_timer); | 45 | sk_stop_timer(sk, &sk->sk_timer); |
| 49 | } | 46 | } |
| 50 | 47 | ||
| 51 | static void dn_slow_timer(unsigned long arg) | 48 | static void dn_slow_timer(unsigned long arg) |
| @@ -53,12 +50,10 @@ static void dn_slow_timer(unsigned long arg) | |||
| 53 | struct sock *sk = (struct sock *)arg; | 50 | struct sock *sk = (struct sock *)arg; |
| 54 | struct dn_scp *scp = DN_SK(sk); | 51 | struct dn_scp *scp = DN_SK(sk); |
| 55 | 52 | ||
| 56 | sock_hold(sk); | ||
| 57 | bh_lock_sock(sk); | 53 | bh_lock_sock(sk); |
| 58 | 54 | ||
| 59 | if (sock_owned_by_user(sk)) { | 55 | if (sock_owned_by_user(sk)) { |
| 60 | sk->sk_timer.expires = jiffies + HZ / 10; | 56 | sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 10); |
| 61 | add_timer(&sk->sk_timer); | ||
| 62 | goto out; | 57 | goto out; |
| 63 | } | 58 | } |
| 64 | 59 | ||
| @@ -100,9 +95,7 @@ static void dn_slow_timer(unsigned long arg) | |||
| 100 | scp->keepalive_fxn(sk); | 95 | scp->keepalive_fxn(sk); |
| 101 | } | 96 | } |
| 102 | 97 | ||
| 103 | sk->sk_timer.expires = jiffies + SLOW_INTERVAL; | 98 | sk_reset_timer(sk, &sk->sk_timer, jiffies + SLOW_INTERVAL); |
| 104 | |||
| 105 | add_timer(&sk->sk_timer); | ||
| 106 | out: | 99 | out: |
| 107 | bh_unlock_sock(sk); | 100 | bh_unlock_sock(sk); |
| 108 | sock_put(sk); | 101 | sock_put(sk); |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index c6b5092f29a1..65f01dc47565 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1490,7 +1490,9 @@ static int devinet_conf_proc(ctl_table *ctl, int write, | |||
| 1490 | void __user *buffer, | 1490 | void __user *buffer, |
| 1491 | size_t *lenp, loff_t *ppos) | 1491 | size_t *lenp, loff_t *ppos) |
| 1492 | { | 1492 | { |
| 1493 | int old_value = *(int *)ctl->data; | ||
| 1493 | int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 1494 | int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); |
| 1495 | int new_value = *(int *)ctl->data; | ||
| 1494 | 1496 | ||
| 1495 | if (write) { | 1497 | if (write) { |
| 1496 | struct ipv4_devconf *cnf = ctl->extra1; | 1498 | struct ipv4_devconf *cnf = ctl->extra1; |
| @@ -1501,6 +1503,9 @@ static int devinet_conf_proc(ctl_table *ctl, int write, | |||
| 1501 | 1503 | ||
| 1502 | if (cnf == net->ipv4.devconf_dflt) | 1504 | if (cnf == net->ipv4.devconf_dflt) |
| 1503 | devinet_copy_dflt_conf(net, i); | 1505 | devinet_copy_dflt_conf(net, i); |
| 1506 | if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1) | ||
| 1507 | if ((new_value == 0) && (old_value != 0)) | ||
| 1508 | rt_cache_flush(net, 0); | ||
| 1504 | } | 1509 | } |
| 1505 | 1510 | ||
| 1506 | return ret; | 1511 | return ret; |
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c index 9899619ab9b8..4f47e064e262 100644 --- a/net/ipv4/netfilter.c +++ b/net/ipv4/netfilter.c | |||
| @@ -64,7 +64,8 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | |||
| 64 | /* Change in oif may mean change in hh_len. */ | 64 | /* Change in oif may mean change in hh_len. */ |
| 65 | hh_len = skb_dst(skb)->dev->hard_header_len; | 65 | hh_len = skb_dst(skb)->dev->hard_header_len; |
| 66 | if (skb_headroom(skb) < hh_len && | 66 | if (skb_headroom(skb) < hh_len && |
| 67 | pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC)) | 67 | pskb_expand_head(skb, HH_DATA_ALIGN(hh_len - skb_headroom(skb)), |
| 68 | 0, GFP_ATOMIC)) | ||
| 68 | return -1; | 69 | return -1; |
| 69 | 70 | ||
| 70 | return 0; | 71 | return 0; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 9a20663d5969..7047069cf967 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -130,6 +130,7 @@ static int ip_rt_mtu_expires __read_mostly = 10 * 60 * HZ; | |||
| 130 | static int ip_rt_min_pmtu __read_mostly = 512 + 20 + 20; | 130 | static int ip_rt_min_pmtu __read_mostly = 512 + 20 + 20; |
| 131 | static int ip_rt_min_advmss __read_mostly = 256; | 131 | static int ip_rt_min_advmss __read_mostly = 256; |
| 132 | static int rt_chain_length_max __read_mostly = 20; | 132 | static int rt_chain_length_max __read_mostly = 20; |
| 133 | static int redirect_genid; | ||
| 133 | 134 | ||
| 134 | /* | 135 | /* |
| 135 | * Interface to generic destination cache. | 136 | * Interface to generic destination cache. |
| @@ -415,9 +416,13 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v) | |||
| 415 | else { | 416 | else { |
| 416 | struct rtable *r = v; | 417 | struct rtable *r = v; |
| 417 | struct neighbour *n; | 418 | struct neighbour *n; |
| 418 | int len; | 419 | int len, HHUptod; |
| 419 | 420 | ||
| 421 | rcu_read_lock(); | ||
| 420 | n = dst_get_neighbour(&r->dst); | 422 | n = dst_get_neighbour(&r->dst); |
| 423 | HHUptod = (n && (n->nud_state & NUD_CONNECTED)) ? 1 : 0; | ||
| 424 | rcu_read_unlock(); | ||
| 425 | |||
| 421 | seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t" | 426 | seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t" |
| 422 | "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n", | 427 | "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n", |
| 423 | r->dst.dev ? r->dst.dev->name : "*", | 428 | r->dst.dev ? r->dst.dev->name : "*", |
| @@ -431,7 +436,7 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v) | |||
| 431 | dst_metric(&r->dst, RTAX_RTTVAR)), | 436 | dst_metric(&r->dst, RTAX_RTTVAR)), |
| 432 | r->rt_key_tos, | 437 | r->rt_key_tos, |
| 433 | -1, | 438 | -1, |
| 434 | (n && (n->nud_state & NUD_CONNECTED)) ? 1 : 0, | 439 | HHUptod, |
| 435 | r->rt_spec_dst, &len); | 440 | r->rt_spec_dst, &len); |
| 436 | 441 | ||
| 437 | seq_printf(seq, "%*s\n", 127 - len, ""); | 442 | seq_printf(seq, "%*s\n", 127 - len, ""); |
| @@ -836,6 +841,7 @@ static void rt_cache_invalidate(struct net *net) | |||
| 836 | 841 | ||
| 837 | get_random_bytes(&shuffle, sizeof(shuffle)); | 842 | get_random_bytes(&shuffle, sizeof(shuffle)); |
| 838 | atomic_add(shuffle + 1U, &net->ipv4.rt_genid); | 843 | atomic_add(shuffle + 1U, &net->ipv4.rt_genid); |
| 844 | redirect_genid++; | ||
| 839 | } | 845 | } |
| 840 | 846 | ||
| 841 | /* | 847 | /* |
| @@ -1385,8 +1391,10 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
| 1385 | 1391 | ||
| 1386 | peer = rt->peer; | 1392 | peer = rt->peer; |
| 1387 | if (peer) { | 1393 | if (peer) { |
| 1388 | if (peer->redirect_learned.a4 != new_gw) { | 1394 | if (peer->redirect_learned.a4 != new_gw || |
| 1395 | peer->redirect_genid != redirect_genid) { | ||
| 1389 | peer->redirect_learned.a4 = new_gw; | 1396 | peer->redirect_learned.a4 = new_gw; |
| 1397 | peer->redirect_genid = redirect_genid; | ||
| 1390 | atomic_inc(&__rt_peer_genid); | 1398 | atomic_inc(&__rt_peer_genid); |
| 1391 | } | 1399 | } |
| 1392 | check_peer_redir(&rt->dst, peer); | 1400 | check_peer_redir(&rt->dst, peer); |
| @@ -1679,12 +1687,8 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
| 1679 | } | 1687 | } |
| 1680 | 1688 | ||
| 1681 | 1689 | ||
| 1682 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | 1690 | static struct rtable *ipv4_validate_peer(struct rtable *rt) |
| 1683 | { | 1691 | { |
| 1684 | struct rtable *rt = (struct rtable *) dst; | ||
| 1685 | |||
| 1686 | if (rt_is_expired(rt)) | ||
| 1687 | return NULL; | ||
| 1688 | if (rt->rt_peer_genid != rt_peer_genid()) { | 1692 | if (rt->rt_peer_genid != rt_peer_genid()) { |
| 1689 | struct inet_peer *peer; | 1693 | struct inet_peer *peer; |
| 1690 | 1694 | ||
| @@ -1693,17 +1697,29 @@ static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | |||
| 1693 | 1697 | ||
| 1694 | peer = rt->peer; | 1698 | peer = rt->peer; |
| 1695 | if (peer) { | 1699 | if (peer) { |
| 1696 | check_peer_pmtu(dst, peer); | 1700 | check_peer_pmtu(&rt->dst, peer); |
| 1697 | 1701 | ||
| 1702 | if (peer->redirect_genid != redirect_genid) | ||
| 1703 | peer->redirect_learned.a4 = 0; | ||
| 1698 | if (peer->redirect_learned.a4 && | 1704 | if (peer->redirect_learned.a4 && |
| 1699 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1705 | peer->redirect_learned.a4 != rt->rt_gateway) { |
| 1700 | if (check_peer_redir(dst, peer)) | 1706 | if (check_peer_redir(&rt->dst, peer)) |
| 1701 | return NULL; | 1707 | return NULL; |
| 1702 | } | 1708 | } |
| 1703 | } | 1709 | } |
| 1704 | 1710 | ||
| 1705 | rt->rt_peer_genid = rt_peer_genid(); | 1711 | rt->rt_peer_genid = rt_peer_genid(); |
| 1706 | } | 1712 | } |
| 1713 | return rt; | ||
| 1714 | } | ||
| 1715 | |||
| 1716 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | ||
| 1717 | { | ||
| 1718 | struct rtable *rt = (struct rtable *) dst; | ||
| 1719 | |||
| 1720 | if (rt_is_expired(rt)) | ||
| 1721 | return NULL; | ||
| 1722 | dst = (struct dst_entry *) ipv4_validate_peer(rt); | ||
| 1707 | return dst; | 1723 | return dst; |
| 1708 | } | 1724 | } |
| 1709 | 1725 | ||
| @@ -1851,6 +1867,8 @@ static void rt_init_metrics(struct rtable *rt, const struct flowi4 *fl4, | |||
| 1851 | dst_init_metrics(&rt->dst, peer->metrics, false); | 1867 | dst_init_metrics(&rt->dst, peer->metrics, false); |
| 1852 | 1868 | ||
| 1853 | check_peer_pmtu(&rt->dst, peer); | 1869 | check_peer_pmtu(&rt->dst, peer); |
| 1870 | if (peer->redirect_genid != redirect_genid) | ||
| 1871 | peer->redirect_learned.a4 = 0; | ||
| 1854 | if (peer->redirect_learned.a4 && | 1872 | if (peer->redirect_learned.a4 && |
| 1855 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1873 | peer->redirect_learned.a4 != rt->rt_gateway) { |
| 1856 | rt->rt_gateway = peer->redirect_learned.a4; | 1874 | rt->rt_gateway = peer->redirect_learned.a4; |
| @@ -2356,6 +2374,9 @@ int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 2356 | rth->rt_mark == skb->mark && | 2374 | rth->rt_mark == skb->mark && |
| 2357 | net_eq(dev_net(rth->dst.dev), net) && | 2375 | net_eq(dev_net(rth->dst.dev), net) && |
| 2358 | !rt_is_expired(rth)) { | 2376 | !rt_is_expired(rth)) { |
| 2377 | rth = ipv4_validate_peer(rth); | ||
| 2378 | if (!rth) | ||
| 2379 | continue; | ||
| 2359 | if (noref) { | 2380 | if (noref) { |
| 2360 | dst_use_noref(&rth->dst, jiffies); | 2381 | dst_use_noref(&rth->dst, jiffies); |
| 2361 | skb_dst_set_noref(skb, &rth->dst); | 2382 | skb_dst_set_noref(skb, &rth->dst); |
| @@ -2731,6 +2752,9 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *flp4) | |||
| 2731 | (IPTOS_RT_MASK | RTO_ONLINK)) && | 2752 | (IPTOS_RT_MASK | RTO_ONLINK)) && |
| 2732 | net_eq(dev_net(rth->dst.dev), net) && | 2753 | net_eq(dev_net(rth->dst.dev), net) && |
| 2733 | !rt_is_expired(rth)) { | 2754 | !rt_is_expired(rth)) { |
| 2755 | rth = ipv4_validate_peer(rth); | ||
| 2756 | if (!rth) | ||
| 2757 | continue; | ||
| 2734 | dst_use(&rth->dst, jiffies); | 2758 | dst_use(&rth->dst, jiffies); |
| 2735 | RT_CACHE_STAT_INC(out_hit); | 2759 | RT_CACHE_STAT_INC(out_hit); |
| 2736 | rcu_read_unlock_bh(); | 2760 | rcu_read_unlock_bh(); |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index b867ea23ece9..ad481b32f1e3 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1164,7 +1164,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1164 | struct inet_sock *inet = inet_sk(sk); | 1164 | struct inet_sock *inet = inet_sk(sk); |
| 1165 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; | 1165 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; |
| 1166 | struct sk_buff *skb; | 1166 | struct sk_buff *skb; |
| 1167 | unsigned int ulen; | 1167 | unsigned int ulen, copied; |
| 1168 | int peeked; | 1168 | int peeked; |
| 1169 | int err; | 1169 | int err; |
| 1170 | int is_udplite = IS_UDPLITE(sk); | 1170 | int is_udplite = IS_UDPLITE(sk); |
| @@ -1186,9 +1186,10 @@ try_again: | |||
| 1186 | goto out; | 1186 | goto out; |
| 1187 | 1187 | ||
| 1188 | ulen = skb->len - sizeof(struct udphdr); | 1188 | ulen = skb->len - sizeof(struct udphdr); |
| 1189 | if (len > ulen) | 1189 | copied = len; |
| 1190 | len = ulen; | 1190 | if (copied > ulen) |
| 1191 | else if (len < ulen) | 1191 | copied = ulen; |
| 1192 | else if (copied < ulen) | ||
| 1192 | msg->msg_flags |= MSG_TRUNC; | 1193 | msg->msg_flags |= MSG_TRUNC; |
| 1193 | 1194 | ||
| 1194 | /* | 1195 | /* |
| @@ -1197,14 +1198,14 @@ try_again: | |||
| 1197 | * coverage checksum (UDP-Lite), do it before the copy. | 1198 | * coverage checksum (UDP-Lite), do it before the copy. |
| 1198 | */ | 1199 | */ |
| 1199 | 1200 | ||
| 1200 | if (len < ulen || UDP_SKB_CB(skb)->partial_cov) { | 1201 | if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { |
| 1201 | if (udp_lib_checksum_complete(skb)) | 1202 | if (udp_lib_checksum_complete(skb)) |
| 1202 | goto csum_copy_err; | 1203 | goto csum_copy_err; |
| 1203 | } | 1204 | } |
| 1204 | 1205 | ||
| 1205 | if (skb_csum_unnecessary(skb)) | 1206 | if (skb_csum_unnecessary(skb)) |
| 1206 | err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), | 1207 | err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), |
| 1207 | msg->msg_iov, len); | 1208 | msg->msg_iov, copied); |
| 1208 | else { | 1209 | else { |
| 1209 | err = skb_copy_and_csum_datagram_iovec(skb, | 1210 | err = skb_copy_and_csum_datagram_iovec(skb, |
| 1210 | sizeof(struct udphdr), | 1211 | sizeof(struct udphdr), |
| @@ -1233,7 +1234,7 @@ try_again: | |||
| 1233 | if (inet->cmsg_flags) | 1234 | if (inet->cmsg_flags) |
| 1234 | ip_cmsg_recv(msg, skb); | 1235 | ip_cmsg_recv(msg, skb); |
| 1235 | 1236 | ||
| 1236 | err = len; | 1237 | err = copied; |
| 1237 | if (flags & MSG_TRUNC) | 1238 | if (flags & MSG_TRUNC) |
| 1238 | err = ulen; | 1239 | err = ulen; |
| 1239 | 1240 | ||
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 29993b7079a5..18a2719003c3 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
| @@ -503,7 +503,7 @@ done: | |||
| 503 | goto e_inval; | 503 | goto e_inval; |
| 504 | if (val > 255 || val < -1) | 504 | if (val > 255 || val < -1) |
| 505 | goto e_inval; | 505 | goto e_inval; |
| 506 | np->mcast_hops = val; | 506 | np->mcast_hops = (val == -1 ? IPV6_DEFAULT_MCASTHOPS : val); |
| 507 | retv = 0; | 507 | retv = 0; |
| 508 | break; | 508 | break; |
| 509 | 509 | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 84ec9db86ee0..adfe26a7fc63 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -340,7 +340,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 340 | struct ipv6_pinfo *np = inet6_sk(sk); | 340 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 341 | struct inet_sock *inet = inet_sk(sk); | 341 | struct inet_sock *inet = inet_sk(sk); |
| 342 | struct sk_buff *skb; | 342 | struct sk_buff *skb; |
| 343 | unsigned int ulen; | 343 | unsigned int ulen, copied; |
| 344 | int peeked; | 344 | int peeked; |
| 345 | int err; | 345 | int err; |
| 346 | int is_udplite = IS_UDPLITE(sk); | 346 | int is_udplite = IS_UDPLITE(sk); |
| @@ -363,9 +363,10 @@ try_again: | |||
| 363 | goto out; | 363 | goto out; |
| 364 | 364 | ||
| 365 | ulen = skb->len - sizeof(struct udphdr); | 365 | ulen = skb->len - sizeof(struct udphdr); |
| 366 | if (len > ulen) | 366 | copied = len; |
| 367 | len = ulen; | 367 | if (copied > ulen) |
| 368 | else if (len < ulen) | 368 | copied = ulen; |
| 369 | else if (copied < ulen) | ||
| 369 | msg->msg_flags |= MSG_TRUNC; | 370 | msg->msg_flags |= MSG_TRUNC; |
| 370 | 371 | ||
| 371 | is_udp4 = (skb->protocol == htons(ETH_P_IP)); | 372 | is_udp4 = (skb->protocol == htons(ETH_P_IP)); |
| @@ -376,14 +377,14 @@ try_again: | |||
| 376 | * coverage checksum (UDP-Lite), do it before the copy. | 377 | * coverage checksum (UDP-Lite), do it before the copy. |
| 377 | */ | 378 | */ |
| 378 | 379 | ||
| 379 | if (len < ulen || UDP_SKB_CB(skb)->partial_cov) { | 380 | if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { |
| 380 | if (udp_lib_checksum_complete(skb)) | 381 | if (udp_lib_checksum_complete(skb)) |
| 381 | goto csum_copy_err; | 382 | goto csum_copy_err; |
| 382 | } | 383 | } |
| 383 | 384 | ||
| 384 | if (skb_csum_unnecessary(skb)) | 385 | if (skb_csum_unnecessary(skb)) |
| 385 | err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), | 386 | err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), |
| 386 | msg->msg_iov,len); | 387 | msg->msg_iov, copied ); |
| 387 | else { | 388 | else { |
| 388 | err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov); | 389 | err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov); |
| 389 | if (err == -EINVAL) | 390 | if (err == -EINVAL) |
| @@ -431,7 +432,7 @@ try_again: | |||
| 431 | datagram_recv_ctl(sk, msg, skb); | 432 | datagram_recv_ctl(sk, msg, skb); |
| 432 | } | 433 | } |
| 433 | 434 | ||
| 434 | err = len; | 435 | err = copied; |
| 435 | if (flags & MSG_TRUNC) | 436 | if (flags & MSG_TRUNC) |
| 436 | err = ulen; | 437 | err = ulen; |
| 437 | 438 | ||
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index cf0f308abf5e..89ff8c67943e 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c | |||
| @@ -1072,7 +1072,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len | |||
| 1072 | 1072 | ||
| 1073 | /* Get routing info from the tunnel socket */ | 1073 | /* Get routing info from the tunnel socket */ |
| 1074 | skb_dst_drop(skb); | 1074 | skb_dst_drop(skb); |
| 1075 | skb_dst_set(skb, dst_clone(__sk_dst_get(sk))); | 1075 | skb_dst_set(skb, dst_clone(__sk_dst_check(sk, 0))); |
| 1076 | 1076 | ||
| 1077 | inet = inet_sk(sk); | 1077 | inet = inet_sk(sk); |
| 1078 | fl = &inet->cork.fl; | 1078 | fl = &inet->cork.fl; |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 39d72ccaffb3..556765749b9c 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
| @@ -162,6 +162,12 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
| 162 | return -ENOENT; | 162 | return -ENOENT; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | /* if we're already stopping ignore any new requests to stop */ | ||
| 166 | if (test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) { | ||
| 167 | spin_unlock_bh(&sta->lock); | ||
| 168 | return -EALREADY; | ||
| 169 | } | ||
| 170 | |||
| 165 | if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) { | 171 | if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) { |
| 166 | /* not even started yet! */ | 172 | /* not even started yet! */ |
| 167 | ieee80211_assign_tid_tx(sta, tid, NULL); | 173 | ieee80211_assign_tid_tx(sta, tid, NULL); |
| @@ -170,6 +176,8 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
| 170 | return 0; | 176 | return 0; |
| 171 | } | 177 | } |
| 172 | 178 | ||
| 179 | set_bit(HT_AGG_STATE_STOPPING, &tid_tx->state); | ||
| 180 | |||
| 173 | spin_unlock_bh(&sta->lock); | 181 | spin_unlock_bh(&sta->lock); |
| 174 | 182 | ||
| 175 | #ifdef CONFIG_MAC80211_HT_DEBUG | 183 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| @@ -177,8 +185,6 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
| 177 | sta->sta.addr, tid); | 185 | sta->sta.addr, tid); |
| 178 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 186 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
| 179 | 187 | ||
| 180 | set_bit(HT_AGG_STATE_STOPPING, &tid_tx->state); | ||
| 181 | |||
| 182 | del_timer_sync(&tid_tx->addba_resp_timer); | 188 | del_timer_sync(&tid_tx->addba_resp_timer); |
| 183 | 189 | ||
| 184 | /* | 190 | /* |
| @@ -188,6 +194,20 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
| 188 | */ | 194 | */ |
| 189 | clear_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state); | 195 | clear_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state); |
| 190 | 196 | ||
| 197 | /* | ||
| 198 | * There might be a few packets being processed right now (on | ||
| 199 | * another CPU) that have already gotten past the aggregation | ||
| 200 | * check when it was still OPERATIONAL and consequently have | ||
| 201 | * IEEE80211_TX_CTL_AMPDU set. In that case, this code might | ||
| 202 | * call into the driver at the same time or even before the | ||
| 203 | * TX paths calls into it, which could confuse the driver. | ||
| 204 | * | ||
| 205 | * Wait for all currently running TX paths to finish before | ||
| 206 | * telling the driver. New packets will not go through since | ||
| 207 | * the aggregation session is no longer OPERATIONAL. | ||
| 208 | */ | ||
| 209 | synchronize_net(); | ||
| 210 | |||
| 191 | tid_tx->stop_initiator = initiator; | 211 | tid_tx->stop_initiator = initiator; |
| 192 | tid_tx->tx_stop = tx; | 212 | tid_tx->tx_stop = tx; |
| 193 | 213 | ||
| @@ -753,11 +773,27 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, | |||
| 753 | goto out; | 773 | goto out; |
| 754 | } | 774 | } |
| 755 | 775 | ||
| 756 | del_timer(&tid_tx->addba_resp_timer); | 776 | del_timer_sync(&tid_tx->addba_resp_timer); |
| 757 | 777 | ||
| 758 | #ifdef CONFIG_MAC80211_HT_DEBUG | 778 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| 759 | printk(KERN_DEBUG "switched off addBA timer for tid %d\n", tid); | 779 | printk(KERN_DEBUG "switched off addBA timer for tid %d\n", tid); |
| 760 | #endif | 780 | #endif |
| 781 | |||
| 782 | /* | ||
| 783 | * addba_resp_timer may have fired before we got here, and | ||
| 784 | * caused WANT_STOP to be set. If the stop then was already | ||
| 785 | * processed further, STOPPING might be set. | ||
| 786 | */ | ||
| 787 | if (test_bit(HT_AGG_STATE_WANT_STOP, &tid_tx->state) || | ||
| 788 | test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) { | ||
| 789 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
| 790 | printk(KERN_DEBUG | ||
| 791 | "got addBA resp for tid %d but we already gave up\n", | ||
| 792 | tid); | ||
| 793 | #endif | ||
| 794 | goto out; | ||
| 795 | } | ||
| 796 | |||
| 761 | /* | 797 | /* |
| 762 | * IEEE 802.11-2007 7.3.1.14: | 798 | * IEEE 802.11-2007 7.3.1.14: |
| 763 | * In an ADDBA Response frame, when the Status Code field | 799 | * In an ADDBA Response frame, when the Status Code field |
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig index e8f379692294..d5597b759ba3 100644 --- a/net/netfilter/Kconfig +++ b/net/netfilter/Kconfig | |||
| @@ -201,7 +201,6 @@ config NF_CONNTRACK_BROADCAST | |||
| 201 | 201 | ||
| 202 | config NF_CONNTRACK_NETBIOS_NS | 202 | config NF_CONNTRACK_NETBIOS_NS |
| 203 | tristate "NetBIOS name service protocol support" | 203 | tristate "NetBIOS name service protocol support" |
| 204 | depends on NETFILTER_ADVANCED | ||
| 205 | select NF_CONNTRACK_BROADCAST | 204 | select NF_CONNTRACK_BROADCAST |
| 206 | help | 205 | help |
| 207 | NetBIOS name service requests are sent as broadcast messages from an | 206 | NetBIOS name service requests are sent as broadcast messages from an |
diff --git a/net/netfilter/ipset/ip_set_hash_ipport.c b/net/netfilter/ipset/ip_set_hash_ipport.c index 6ee10f5d59bd..37d667e3f6f8 100644 --- a/net/netfilter/ipset/ip_set_hash_ipport.c +++ b/net/netfilter/ipset/ip_set_hash_ipport.c | |||
| @@ -158,7 +158,7 @@ hash_ipport4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 158 | const struct ip_set_hash *h = set->data; | 158 | const struct ip_set_hash *h = set->data; |
| 159 | ipset_adtfn adtfn = set->variant->adt[adt]; | 159 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 160 | struct hash_ipport4_elem data = { }; | 160 | struct hash_ipport4_elem data = { }; |
| 161 | u32 ip, ip_to, p = 0, port, port_to; | 161 | u32 ip, ip_to = 0, p = 0, port, port_to; |
| 162 | u32 timeout = h->timeout; | 162 | u32 timeout = h->timeout; |
| 163 | bool with_ports = false; | 163 | bool with_ports = false; |
| 164 | int ret; | 164 | int ret; |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportip.c b/net/netfilter/ipset/ip_set_hash_ipportip.c index fb90e344e907..e69e2718fbe1 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportip.c +++ b/net/netfilter/ipset/ip_set_hash_ipportip.c | |||
| @@ -162,7 +162,7 @@ hash_ipportip4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 162 | const struct ip_set_hash *h = set->data; | 162 | const struct ip_set_hash *h = set->data; |
| 163 | ipset_adtfn adtfn = set->variant->adt[adt]; | 163 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 164 | struct hash_ipportip4_elem data = { }; | 164 | struct hash_ipportip4_elem data = { }; |
| 165 | u32 ip, ip_to, p = 0, port, port_to; | 165 | u32 ip, ip_to = 0, p = 0, port, port_to; |
| 166 | u32 timeout = h->timeout; | 166 | u32 timeout = h->timeout; |
| 167 | bool with_ports = false; | 167 | bool with_ports = false; |
| 168 | int ret; | 168 | int ret; |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportnet.c b/net/netfilter/ipset/ip_set_hash_ipportnet.c index deb3e3dfa5fc..64199b4e93c9 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportnet.c +++ b/net/netfilter/ipset/ip_set_hash_ipportnet.c | |||
| @@ -184,7 +184,7 @@ hash_ipportnet4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 184 | const struct ip_set_hash *h = set->data; | 184 | const struct ip_set_hash *h = set->data; |
| 185 | ipset_adtfn adtfn = set->variant->adt[adt]; | 185 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 186 | struct hash_ipportnet4_elem data = { .cidr = HOST_MASK }; | 186 | struct hash_ipportnet4_elem data = { .cidr = HOST_MASK }; |
| 187 | u32 ip, ip_to, p = 0, port, port_to; | 187 | u32 ip, ip_to = 0, p = 0, port, port_to; |
| 188 | u32 ip2_from = 0, ip2_to, ip2_last, ip2; | 188 | u32 ip2_from = 0, ip2_to, ip2_last, ip2; |
| 189 | u32 timeout = h->timeout; | 189 | u32 timeout = h->timeout; |
| 190 | bool with_ports = false; | 190 | bool with_ports = false; |
diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c index 6b368be937c6..b62c4148b921 100644 --- a/net/netfilter/nf_conntrack_ecache.c +++ b/net/netfilter/nf_conntrack_ecache.c | |||
| @@ -27,22 +27,17 @@ | |||
| 27 | 27 | ||
| 28 | static DEFINE_MUTEX(nf_ct_ecache_mutex); | 28 | static DEFINE_MUTEX(nf_ct_ecache_mutex); |
| 29 | 29 | ||
| 30 | struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb __read_mostly; | ||
| 31 | EXPORT_SYMBOL_GPL(nf_conntrack_event_cb); | ||
| 32 | |||
| 33 | struct nf_exp_event_notifier __rcu *nf_expect_event_cb __read_mostly; | ||
| 34 | EXPORT_SYMBOL_GPL(nf_expect_event_cb); | ||
| 35 | |||
| 36 | /* deliver cached events and clear cache entry - must be called with locally | 30 | /* deliver cached events and clear cache entry - must be called with locally |
| 37 | * disabled softirqs */ | 31 | * disabled softirqs */ |
| 38 | void nf_ct_deliver_cached_events(struct nf_conn *ct) | 32 | void nf_ct_deliver_cached_events(struct nf_conn *ct) |
| 39 | { | 33 | { |
| 34 | struct net *net = nf_ct_net(ct); | ||
| 40 | unsigned long events; | 35 | unsigned long events; |
| 41 | struct nf_ct_event_notifier *notify; | 36 | struct nf_ct_event_notifier *notify; |
| 42 | struct nf_conntrack_ecache *e; | 37 | struct nf_conntrack_ecache *e; |
| 43 | 38 | ||
| 44 | rcu_read_lock(); | 39 | rcu_read_lock(); |
| 45 | notify = rcu_dereference(nf_conntrack_event_cb); | 40 | notify = rcu_dereference(net->ct.nf_conntrack_event_cb); |
| 46 | if (notify == NULL) | 41 | if (notify == NULL) |
| 47 | goto out_unlock; | 42 | goto out_unlock; |
| 48 | 43 | ||
| @@ -83,19 +78,20 @@ out_unlock: | |||
| 83 | } | 78 | } |
| 84 | EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events); | 79 | EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events); |
| 85 | 80 | ||
| 86 | int nf_conntrack_register_notifier(struct nf_ct_event_notifier *new) | 81 | int nf_conntrack_register_notifier(struct net *net, |
| 82 | struct nf_ct_event_notifier *new) | ||
| 87 | { | 83 | { |
| 88 | int ret = 0; | 84 | int ret = 0; |
| 89 | struct nf_ct_event_notifier *notify; | 85 | struct nf_ct_event_notifier *notify; |
| 90 | 86 | ||
| 91 | mutex_lock(&nf_ct_ecache_mutex); | 87 | mutex_lock(&nf_ct_ecache_mutex); |
| 92 | notify = rcu_dereference_protected(nf_conntrack_event_cb, | 88 | notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb, |
| 93 | lockdep_is_held(&nf_ct_ecache_mutex)); | 89 | lockdep_is_held(&nf_ct_ecache_mutex)); |
| 94 | if (notify != NULL) { | 90 | if (notify != NULL) { |
| 95 | ret = -EBUSY; | 91 | ret = -EBUSY; |
| 96 | goto out_unlock; | 92 | goto out_unlock; |
| 97 | } | 93 | } |
| 98 | RCU_INIT_POINTER(nf_conntrack_event_cb, new); | 94 | RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, new); |
| 99 | mutex_unlock(&nf_ct_ecache_mutex); | 95 | mutex_unlock(&nf_ct_ecache_mutex); |
| 100 | return ret; | 96 | return ret; |
| 101 | 97 | ||
| @@ -105,32 +101,34 @@ out_unlock: | |||
| 105 | } | 101 | } |
| 106 | EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier); | 102 | EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier); |
| 107 | 103 | ||
| 108 | void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *new) | 104 | void nf_conntrack_unregister_notifier(struct net *net, |
| 105 | struct nf_ct_event_notifier *new) | ||
| 109 | { | 106 | { |
| 110 | struct nf_ct_event_notifier *notify; | 107 | struct nf_ct_event_notifier *notify; |
| 111 | 108 | ||
| 112 | mutex_lock(&nf_ct_ecache_mutex); | 109 | mutex_lock(&nf_ct_ecache_mutex); |
| 113 | notify = rcu_dereference_protected(nf_conntrack_event_cb, | 110 | notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb, |
| 114 | lockdep_is_held(&nf_ct_ecache_mutex)); | 111 | lockdep_is_held(&nf_ct_ecache_mutex)); |
| 115 | BUG_ON(notify != new); | 112 | BUG_ON(notify != new); |
| 116 | RCU_INIT_POINTER(nf_conntrack_event_cb, NULL); | 113 | RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL); |
| 117 | mutex_unlock(&nf_ct_ecache_mutex); | 114 | mutex_unlock(&nf_ct_ecache_mutex); |
| 118 | } | 115 | } |
| 119 | EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier); | 116 | EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier); |
| 120 | 117 | ||
| 121 | int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *new) | 118 | int nf_ct_expect_register_notifier(struct net *net, |
| 119 | struct nf_exp_event_notifier *new) | ||
| 122 | { | 120 | { |
| 123 | int ret = 0; | 121 | int ret = 0; |
| 124 | struct nf_exp_event_notifier *notify; | 122 | struct nf_exp_event_notifier *notify; |
| 125 | 123 | ||
| 126 | mutex_lock(&nf_ct_ecache_mutex); | 124 | mutex_lock(&nf_ct_ecache_mutex); |
| 127 | notify = rcu_dereference_protected(nf_expect_event_cb, | 125 | notify = rcu_dereference_protected(net->ct.nf_expect_event_cb, |
| 128 | lockdep_is_held(&nf_ct_ecache_mutex)); | 126 | lockdep_is_held(&nf_ct_ecache_mutex)); |
| 129 | if (notify != NULL) { | 127 | if (notify != NULL) { |
| 130 | ret = -EBUSY; | 128 | ret = -EBUSY; |
| 131 | goto out_unlock; | 129 | goto out_unlock; |
| 132 | } | 130 | } |
| 133 | RCU_INIT_POINTER(nf_expect_event_cb, new); | 131 | RCU_INIT_POINTER(net->ct.nf_expect_event_cb, new); |
| 134 | mutex_unlock(&nf_ct_ecache_mutex); | 132 | mutex_unlock(&nf_ct_ecache_mutex); |
| 135 | return ret; | 133 | return ret; |
| 136 | 134 | ||
| @@ -140,15 +138,16 @@ out_unlock: | |||
| 140 | } | 138 | } |
| 141 | EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier); | 139 | EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier); |
| 142 | 140 | ||
| 143 | void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *new) | 141 | void nf_ct_expect_unregister_notifier(struct net *net, |
| 142 | struct nf_exp_event_notifier *new) | ||
| 144 | { | 143 | { |
| 145 | struct nf_exp_event_notifier *notify; | 144 | struct nf_exp_event_notifier *notify; |
| 146 | 145 | ||
| 147 | mutex_lock(&nf_ct_ecache_mutex); | 146 | mutex_lock(&nf_ct_ecache_mutex); |
| 148 | notify = rcu_dereference_protected(nf_expect_event_cb, | 147 | notify = rcu_dereference_protected(net->ct.nf_expect_event_cb, |
| 149 | lockdep_is_held(&nf_ct_ecache_mutex)); | 148 | lockdep_is_held(&nf_ct_ecache_mutex)); |
| 150 | BUG_ON(notify != new); | 149 | BUG_ON(notify != new); |
| 151 | RCU_INIT_POINTER(nf_expect_event_cb, NULL); | 150 | RCU_INIT_POINTER(net->ct.nf_expect_event_cb, NULL); |
| 152 | mutex_unlock(&nf_ct_ecache_mutex); | 151 | mutex_unlock(&nf_ct_ecache_mutex); |
| 153 | } | 152 | } |
| 154 | EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier); | 153 | EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier); |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index e58aa9b1fe8a..ef21b221f036 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * (C) 2001 by Jay Schulist <jschlst@samba.org> | 4 | * (C) 2001 by Jay Schulist <jschlst@samba.org> |
| 5 | * (C) 2002-2006 by Harald Welte <laforge@gnumonks.org> | 5 | * (C) 2002-2006 by Harald Welte <laforge@gnumonks.org> |
| 6 | * (C) 2003 by Patrick Mchardy <kaber@trash.net> | 6 | * (C) 2003 by Patrick Mchardy <kaber@trash.net> |
| 7 | * (C) 2005-2008 by Pablo Neira Ayuso <pablo@netfilter.org> | 7 | * (C) 2005-2011 by Pablo Neira Ayuso <pablo@netfilter.org> |
| 8 | * | 8 | * |
| 9 | * Initial connection tracking via netlink development funded and | 9 | * Initial connection tracking via netlink development funded and |
| 10 | * generally made possible by Network Robots, Inc. (www.networkrobots.com) | 10 | * generally made possible by Network Robots, Inc. (www.networkrobots.com) |
| @@ -2163,6 +2163,54 @@ MODULE_ALIAS("ip_conntrack_netlink"); | |||
| 2163 | MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK); | 2163 | MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK); |
| 2164 | MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK_EXP); | 2164 | MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK_EXP); |
| 2165 | 2165 | ||
| 2166 | static int __net_init ctnetlink_net_init(struct net *net) | ||
| 2167 | { | ||
| 2168 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
| 2169 | int ret; | ||
| 2170 | |||
| 2171 | ret = nf_conntrack_register_notifier(net, &ctnl_notifier); | ||
| 2172 | if (ret < 0) { | ||
| 2173 | pr_err("ctnetlink_init: cannot register notifier.\n"); | ||
| 2174 | goto err_out; | ||
| 2175 | } | ||
| 2176 | |||
| 2177 | ret = nf_ct_expect_register_notifier(net, &ctnl_notifier_exp); | ||
| 2178 | if (ret < 0) { | ||
| 2179 | pr_err("ctnetlink_init: cannot expect register notifier.\n"); | ||
| 2180 | goto err_unreg_notifier; | ||
| 2181 | } | ||
| 2182 | #endif | ||
| 2183 | return 0; | ||
| 2184 | |||
| 2185 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
| 2186 | err_unreg_notifier: | ||
| 2187 | nf_conntrack_unregister_notifier(net, &ctnl_notifier); | ||
| 2188 | err_out: | ||
| 2189 | return ret; | ||
| 2190 | #endif | ||
| 2191 | } | ||
| 2192 | |||
| 2193 | static void ctnetlink_net_exit(struct net *net) | ||
| 2194 | { | ||
| 2195 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
| 2196 | nf_ct_expect_unregister_notifier(net, &ctnl_notifier_exp); | ||
| 2197 | nf_conntrack_unregister_notifier(net, &ctnl_notifier); | ||
| 2198 | #endif | ||
| 2199 | } | ||
| 2200 | |||
| 2201 | static void __net_exit ctnetlink_net_exit_batch(struct list_head *net_exit_list) | ||
| 2202 | { | ||
| 2203 | struct net *net; | ||
| 2204 | |||
| 2205 | list_for_each_entry(net, net_exit_list, exit_list) | ||
| 2206 | ctnetlink_net_exit(net); | ||
| 2207 | } | ||
| 2208 | |||
| 2209 | static struct pernet_operations ctnetlink_net_ops = { | ||
| 2210 | .init = ctnetlink_net_init, | ||
| 2211 | .exit_batch = ctnetlink_net_exit_batch, | ||
| 2212 | }; | ||
| 2213 | |||
| 2166 | static int __init ctnetlink_init(void) | 2214 | static int __init ctnetlink_init(void) |
| 2167 | { | 2215 | { |
| 2168 | int ret; | 2216 | int ret; |
| @@ -2180,28 +2228,15 @@ static int __init ctnetlink_init(void) | |||
| 2180 | goto err_unreg_subsys; | 2228 | goto err_unreg_subsys; |
| 2181 | } | 2229 | } |
| 2182 | 2230 | ||
| 2183 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | 2231 | if (register_pernet_subsys(&ctnetlink_net_ops)) { |
| 2184 | ret = nf_conntrack_register_notifier(&ctnl_notifier); | 2232 | pr_err("ctnetlink_init: cannot register pernet operations\n"); |
| 2185 | if (ret < 0) { | ||
| 2186 | pr_err("ctnetlink_init: cannot register notifier.\n"); | ||
| 2187 | goto err_unreg_exp_subsys; | 2233 | goto err_unreg_exp_subsys; |
| 2188 | } | 2234 | } |
| 2189 | 2235 | ||
| 2190 | ret = nf_ct_expect_register_notifier(&ctnl_notifier_exp); | ||
| 2191 | if (ret < 0) { | ||
| 2192 | pr_err("ctnetlink_init: cannot expect register notifier.\n"); | ||
| 2193 | goto err_unreg_notifier; | ||
| 2194 | } | ||
| 2195 | #endif | ||
| 2196 | |||
| 2197 | return 0; | 2236 | return 0; |
| 2198 | 2237 | ||
| 2199 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
| 2200 | err_unreg_notifier: | ||
| 2201 | nf_conntrack_unregister_notifier(&ctnl_notifier); | ||
| 2202 | err_unreg_exp_subsys: | 2238 | err_unreg_exp_subsys: |
| 2203 | nfnetlink_subsys_unregister(&ctnl_exp_subsys); | 2239 | nfnetlink_subsys_unregister(&ctnl_exp_subsys); |
| 2204 | #endif | ||
| 2205 | err_unreg_subsys: | 2240 | err_unreg_subsys: |
| 2206 | nfnetlink_subsys_unregister(&ctnl_subsys); | 2241 | nfnetlink_subsys_unregister(&ctnl_subsys); |
| 2207 | err_out: | 2242 | err_out: |
| @@ -2213,11 +2248,7 @@ static void __exit ctnetlink_exit(void) | |||
| 2213 | pr_info("ctnetlink: unregistering from nfnetlink.\n"); | 2248 | pr_info("ctnetlink: unregistering from nfnetlink.\n"); |
| 2214 | 2249 | ||
| 2215 | nf_ct_remove_userspace_expectations(); | 2250 | nf_ct_remove_userspace_expectations(); |
| 2216 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | 2251 | unregister_pernet_subsys(&ctnetlink_net_ops); |
| 2217 | nf_ct_expect_unregister_notifier(&ctnl_notifier_exp); | ||
| 2218 | nf_conntrack_unregister_notifier(&ctnl_notifier); | ||
| 2219 | #endif | ||
| 2220 | |||
| 2221 | nfnetlink_subsys_unregister(&ctnl_exp_subsys); | 2252 | nfnetlink_subsys_unregister(&ctnl_exp_subsys); |
| 2222 | nfnetlink_subsys_unregister(&ctnl_subsys); | 2253 | nfnetlink_subsys_unregister(&ctnl_subsys); |
| 2223 | } | 2254 | } |
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index 3735297c524d..5952237c0c86 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
| @@ -111,8 +111,6 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 111 | struct netlbl_domaddr_map *addrmap = NULL; | 111 | struct netlbl_domaddr_map *addrmap = NULL; |
| 112 | struct netlbl_domaddr4_map *map4 = NULL; | 112 | struct netlbl_domaddr4_map *map4 = NULL; |
| 113 | struct netlbl_domaddr6_map *map6 = NULL; | 113 | struct netlbl_domaddr6_map *map6 = NULL; |
| 114 | const struct in_addr *addr4, *mask4; | ||
| 115 | const struct in6_addr *addr6, *mask6; | ||
| 116 | 114 | ||
| 117 | entry = kzalloc(sizeof(*entry), GFP_ATOMIC); | 115 | entry = kzalloc(sizeof(*entry), GFP_ATOMIC); |
| 118 | if (entry == NULL) | 116 | if (entry == NULL) |
| @@ -133,9 +131,9 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 133 | INIT_LIST_HEAD(&addrmap->list6); | 131 | INIT_LIST_HEAD(&addrmap->list6); |
| 134 | 132 | ||
| 135 | switch (family) { | 133 | switch (family) { |
| 136 | case AF_INET: | 134 | case AF_INET: { |
| 137 | addr4 = addr; | 135 | const struct in_addr *addr4 = addr; |
| 138 | mask4 = mask; | 136 | const struct in_addr *mask4 = mask; |
| 139 | map4 = kzalloc(sizeof(*map4), GFP_ATOMIC); | 137 | map4 = kzalloc(sizeof(*map4), GFP_ATOMIC); |
| 140 | if (map4 == NULL) | 138 | if (map4 == NULL) |
| 141 | goto cfg_unlbl_map_add_failure; | 139 | goto cfg_unlbl_map_add_failure; |
| @@ -148,9 +146,11 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 148 | if (ret_val != 0) | 146 | if (ret_val != 0) |
| 149 | goto cfg_unlbl_map_add_failure; | 147 | goto cfg_unlbl_map_add_failure; |
| 150 | break; | 148 | break; |
| 151 | case AF_INET6: | 149 | } |
| 152 | addr6 = addr; | 150 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 153 | mask6 = mask; | 151 | case AF_INET6: { |
| 152 | const struct in6_addr *addr6 = addr; | ||
| 153 | const struct in6_addr *mask6 = mask; | ||
| 154 | map6 = kzalloc(sizeof(*map6), GFP_ATOMIC); | 154 | map6 = kzalloc(sizeof(*map6), GFP_ATOMIC); |
| 155 | if (map6 == NULL) | 155 | if (map6 == NULL) |
| 156 | goto cfg_unlbl_map_add_failure; | 156 | goto cfg_unlbl_map_add_failure; |
| @@ -167,6 +167,8 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 167 | if (ret_val != 0) | 167 | if (ret_val != 0) |
| 168 | goto cfg_unlbl_map_add_failure; | 168 | goto cfg_unlbl_map_add_failure; |
| 169 | break; | 169 | break; |
| 170 | } | ||
| 171 | #endif /* IPv6 */ | ||
| 170 | default: | 172 | default: |
| 171 | goto cfg_unlbl_map_add_failure; | 173 | goto cfg_unlbl_map_add_failure; |
| 172 | break; | 174 | break; |
| @@ -225,9 +227,11 @@ int netlbl_cfg_unlbl_static_add(struct net *net, | |||
| 225 | case AF_INET: | 227 | case AF_INET: |
| 226 | addr_len = sizeof(struct in_addr); | 228 | addr_len = sizeof(struct in_addr); |
| 227 | break; | 229 | break; |
| 230 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 228 | case AF_INET6: | 231 | case AF_INET6: |
| 229 | addr_len = sizeof(struct in6_addr); | 232 | addr_len = sizeof(struct in6_addr); |
| 230 | break; | 233 | break; |
| 234 | #endif /* IPv6 */ | ||
| 231 | default: | 235 | default: |
| 232 | return -EPFNOSUPPORT; | 236 | return -EPFNOSUPPORT; |
| 233 | } | 237 | } |
| @@ -266,9 +270,11 @@ int netlbl_cfg_unlbl_static_del(struct net *net, | |||
| 266 | case AF_INET: | 270 | case AF_INET: |
| 267 | addr_len = sizeof(struct in_addr); | 271 | addr_len = sizeof(struct in_addr); |
| 268 | break; | 272 | break; |
| 273 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 269 | case AF_INET6: | 274 | case AF_INET6: |
| 270 | addr_len = sizeof(struct in6_addr); | 275 | addr_len = sizeof(struct in6_addr); |
| 271 | break; | 276 | break; |
| 277 | #endif /* IPv6 */ | ||
| 272 | default: | 278 | default: |
| 273 | return -EPFNOSUPPORT; | 279 | return -EPFNOSUPPORT; |
| 274 | } | 280 | } |
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 6649463da1b6..d617161f8dd3 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c | |||
| @@ -209,8 +209,8 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt) | |||
| 209 | ctl->Plog, ctl->Scell_log, | 209 | ctl->Plog, ctl->Scell_log, |
| 210 | nla_data(tb[TCA_RED_STAB])); | 210 | nla_data(tb[TCA_RED_STAB])); |
| 211 | 211 | ||
| 212 | if (skb_queue_empty(&sch->q)) | 212 | if (!q->qdisc->q.qlen) |
| 213 | red_end_of_idle_period(&q->parms); | 213 | red_start_of_idle_period(&q->parms); |
| 214 | 214 | ||
| 215 | sch_tree_unlock(sch); | 215 | sch_tree_unlock(sch); |
| 216 | return 0; | 216 | return 0; |
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 283bfe3de59d..ed1336e15920 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
| @@ -225,11 +225,11 @@ static int teql_qdisc_init(struct Qdisc *sch, struct nlattr *opt) | |||
| 225 | 225 | ||
| 226 | 226 | ||
| 227 | static int | 227 | static int |
| 228 | __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device *dev) | 228 | __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, |
| 229 | struct net_device *dev, struct netdev_queue *txq, | ||
| 230 | struct neighbour *mn) | ||
| 229 | { | 231 | { |
| 230 | struct netdev_queue *dev_queue = netdev_get_tx_queue(dev, 0); | 232 | struct teql_sched_data *q = qdisc_priv(txq->qdisc); |
| 231 | struct teql_sched_data *q = qdisc_priv(dev_queue->qdisc); | ||
| 232 | struct neighbour *mn = dst_get_neighbour(skb_dst(skb)); | ||
| 233 | struct neighbour *n = q->ncache; | 233 | struct neighbour *n = q->ncache; |
| 234 | 234 | ||
| 235 | if (mn->tbl == NULL) | 235 | if (mn->tbl == NULL) |
| @@ -262,17 +262,26 @@ __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device * | |||
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | static inline int teql_resolve(struct sk_buff *skb, | 264 | static inline int teql_resolve(struct sk_buff *skb, |
| 265 | struct sk_buff *skb_res, struct net_device *dev) | 265 | struct sk_buff *skb_res, |
| 266 | struct net_device *dev, | ||
| 267 | struct netdev_queue *txq) | ||
| 266 | { | 268 | { |
| 267 | struct netdev_queue *txq = netdev_get_tx_queue(dev, 0); | 269 | struct dst_entry *dst = skb_dst(skb); |
| 270 | struct neighbour *mn; | ||
| 271 | int res; | ||
| 272 | |||
| 268 | if (txq->qdisc == &noop_qdisc) | 273 | if (txq->qdisc == &noop_qdisc) |
| 269 | return -ENODEV; | 274 | return -ENODEV; |
| 270 | 275 | ||
| 271 | if (dev->header_ops == NULL || | 276 | if (!dev->header_ops || !dst) |
| 272 | skb_dst(skb) == NULL || | ||
| 273 | dst_get_neighbour(skb_dst(skb)) == NULL) | ||
| 274 | return 0; | 277 | return 0; |
| 275 | return __teql_resolve(skb, skb_res, dev); | 278 | |
| 279 | rcu_read_lock(); | ||
| 280 | mn = dst_get_neighbour(dst); | ||
| 281 | res = mn ? __teql_resolve(skb, skb_res, dev, txq, mn) : 0; | ||
| 282 | rcu_read_unlock(); | ||
| 283 | |||
| 284 | return res; | ||
| 276 | } | 285 | } |
| 277 | 286 | ||
| 278 | static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev) | 287 | static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev) |
| @@ -307,7 +316,7 @@ restart: | |||
| 307 | continue; | 316 | continue; |
| 308 | } | 317 | } |
| 309 | 318 | ||
| 310 | switch (teql_resolve(skb, skb_res, slave)) { | 319 | switch (teql_resolve(skb, skb_res, slave, slave_txq)) { |
| 311 | case 0: | 320 | case 0: |
| 312 | if (__netif_tx_trylock(slave_txq)) { | 321 | if (__netif_tx_trylock(slave_txq)) { |
| 313 | unsigned int length = qdisc_pkt_len(skb); | 322 | unsigned int length = qdisc_pkt_len(skb); |
diff --git a/net/sctp/auth.c b/net/sctp/auth.c index 865e68fef21c..bf812048cf6f 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c | |||
| @@ -82,7 +82,7 @@ static struct sctp_auth_bytes *sctp_auth_create_key(__u32 key_len, gfp_t gfp) | |||
| 82 | struct sctp_auth_bytes *key; | 82 | struct sctp_auth_bytes *key; |
| 83 | 83 | ||
| 84 | /* Verify that we are not going to overflow INT_MAX */ | 84 | /* Verify that we are not going to overflow INT_MAX */ |
| 85 | if ((INT_MAX - key_len) < sizeof(struct sctp_auth_bytes)) | 85 | if (key_len > (INT_MAX - sizeof(struct sctp_auth_bytes))) |
| 86 | return NULL; | 86 | return NULL; |
| 87 | 87 | ||
| 88 | /* Allocate the shared key */ | 88 | /* Allocate the shared key */ |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index d7f97ef26590..55472c48825e 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -496,7 +496,7 @@ static int xs_nospace(struct rpc_task *task) | |||
| 496 | struct rpc_rqst *req = task->tk_rqstp; | 496 | struct rpc_rqst *req = task->tk_rqstp; |
| 497 | struct rpc_xprt *xprt = req->rq_xprt; | 497 | struct rpc_xprt *xprt = req->rq_xprt; |
| 498 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | 498 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
| 499 | int ret = 0; | 499 | int ret = -EAGAIN; |
| 500 | 500 | ||
| 501 | dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", | 501 | dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", |
| 502 | task->tk_pid, req->rq_slen - req->rq_bytes_sent, | 502 | task->tk_pid, req->rq_slen - req->rq_bytes_sent, |
| @@ -508,7 +508,6 @@ static int xs_nospace(struct rpc_task *task) | |||
| 508 | /* Don't race with disconnect */ | 508 | /* Don't race with disconnect */ |
| 509 | if (xprt_connected(xprt)) { | 509 | if (xprt_connected(xprt)) { |
| 510 | if (test_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags)) { | 510 | if (test_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags)) { |
| 511 | ret = -EAGAIN; | ||
| 512 | /* | 511 | /* |
| 513 | * Notify TCP that we're limited by the application | 512 | * Notify TCP that we're limited by the application |
| 514 | * window size | 513 | * window size |
| @@ -2530,8 +2529,10 @@ static struct rpc_xprt *xs_setup_xprt(struct xprt_create *args, | |||
| 2530 | int err; | 2529 | int err; |
| 2531 | err = xs_init_anyaddr(args->dstaddr->sa_family, | 2530 | err = xs_init_anyaddr(args->dstaddr->sa_family, |
| 2532 | (struct sockaddr *)&new->srcaddr); | 2531 | (struct sockaddr *)&new->srcaddr); |
| 2533 | if (err != 0) | 2532 | if (err != 0) { |
| 2533 | xprt_free(xprt); | ||
| 2534 | return ERR_PTR(err); | 2534 | return ERR_PTR(err); |
| 2535 | } | ||
| 2535 | } | 2536 | } |
| 2536 | 2537 | ||
| 2537 | return xprt; | 2538 | return xprt; |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 466fbcc5cf77..b595a3d8679f 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -1957,6 +1957,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1957 | if ((UNIXCB(skb).pid != siocb->scm->pid) || | 1957 | if ((UNIXCB(skb).pid != siocb->scm->pid) || |
| 1958 | (UNIXCB(skb).cred != siocb->scm->cred)) { | 1958 | (UNIXCB(skb).cred != siocb->scm->cred)) { |
| 1959 | skb_queue_head(&sk->sk_receive_queue, skb); | 1959 | skb_queue_head(&sk->sk_receive_queue, skb); |
| 1960 | sk->sk_data_ready(sk, skb->len); | ||
| 1960 | break; | 1961 | break; |
| 1961 | } | 1962 | } |
| 1962 | } else { | 1963 | } else { |
| @@ -1974,6 +1975,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1974 | chunk = min_t(unsigned int, skb->len, size); | 1975 | chunk = min_t(unsigned int, skb->len, size); |
| 1975 | if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { | 1976 | if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { |
| 1976 | skb_queue_head(&sk->sk_receive_queue, skb); | 1977 | skb_queue_head(&sk->sk_receive_queue, skb); |
| 1978 | sk->sk_data_ready(sk, skb->len); | ||
| 1977 | if (copied == 0) | 1979 | if (copied == 0) |
| 1978 | copied = -EFAULT; | 1980 | copied = -EFAULT; |
| 1979 | break; | 1981 | break; |
| @@ -1991,6 +1993,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1991 | /* put the skb back if we didn't use it up.. */ | 1993 | /* put the skb back if we didn't use it up.. */ |
| 1992 | if (skb->len) { | 1994 | if (skb->len) { |
| 1993 | skb_queue_head(&sk->sk_receive_queue, skb); | 1995 | skb_queue_head(&sk->sk_receive_queue, skb); |
| 1996 | sk->sk_data_ready(sk, skb->len); | ||
| 1994 | break; | 1997 | break; |
| 1995 | } | 1998 | } |
| 1996 | 1999 | ||
| @@ -2006,6 +2009,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 2006 | 2009 | ||
| 2007 | /* put message back and return */ | 2010 | /* put message back and return */ |
| 2008 | skb_queue_head(&sk->sk_receive_queue, skb); | 2011 | skb_queue_head(&sk->sk_receive_queue, skb); |
| 2012 | sk->sk_data_ready(sk, skb->len); | ||
| 2009 | break; | 2013 | break; |
| 2010 | } | 2014 | } |
| 2011 | } while (size); | 2015 | } while (size); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index a1cabde7cb5f..eee9ccc7adaf 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -89,8 +89,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { | |||
| 89 | [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, | 89 | [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, |
| 90 | [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, | 90 | [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, |
| 91 | 91 | ||
| 92 | [NL80211_ATTR_MAC] = { .type = NLA_BINARY, .len = ETH_ALEN }, | 92 | [NL80211_ATTR_MAC] = { .len = ETH_ALEN }, |
| 93 | [NL80211_ATTR_PREV_BSSID] = { .type = NLA_BINARY, .len = ETH_ALEN }, | 93 | [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN }, |
| 94 | 94 | ||
| 95 | [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, | 95 | [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, |
| 96 | [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, | 96 | [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, |
