diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:15 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:59 -0400 |
| commit | 07f9479a40cc778bc1462ada11f95b01360ae4ff (patch) | |
| tree | 0676cf38df3844004bb3ebfd99dfa67a4a8998f5 /net/ipv6 | |
| parent | 9d5e6bdb3013acfb311ab407eeca0b6a6a3dedbf (diff) | |
| parent | cd2e49e90f1cae7726c9a2c54488d881d7f1cd1c (diff) | |
Merge branch 'master' into for-next
Fast-forwarded to current state of Linus' tree as there are patches to be
applied for files that didn't exist on the old branch.
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
| -rw-r--r-- | net/ipv6/af_inet6.c | 2 | ||||
| -rw-r--r-- | net/ipv6/inet6_connection_sock.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ip6_output.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ip6mr.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 2 | ||||
| -rw-r--r-- | net/ipv6/netfilter.c | 13 | ||||
| -rw-r--r-- | net/ipv6/netfilter/ip6_tables.c | 6 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 2 | ||||
| -rw-r--r-- | net/ipv6/route.c | 2 | ||||
| -rw-r--r-- | net/ipv6/sysctl_net_ipv6.c | 18 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 5 | ||||
| -rw-r--r-- | net/ipv6/udp.c | 3 |
13 files changed, 42 insertions, 21 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 3daaf3c7703c..1493534116df 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1084,7 +1084,7 @@ static int ipv6_get_saddr_eval(struct net *net, | |||
| 1084 | case IPV6_SADDR_RULE_PRIVACY: | 1084 | case IPV6_SADDR_RULE_PRIVACY: |
| 1085 | { | 1085 | { |
| 1086 | /* Rule 7: Prefer public address | 1086 | /* Rule 7: Prefer public address |
| 1087 | * Note: prefer temprary address if use_tempaddr >= 2 | 1087 | * Note: prefer temporary address if use_tempaddr >= 2 |
| 1088 | */ | 1088 | */ |
| 1089 | int preftmp = dst->prefs & (IPV6_PREFER_SRC_PUBLIC|IPV6_PREFER_SRC_TMP) ? | 1089 | int preftmp = dst->prefs & (IPV6_PREFER_SRC_PUBLIC|IPV6_PREFER_SRC_TMP) ? |
| 1090 | !!(dst->prefs & IPV6_PREFER_SRC_TMP) : | 1090 | !!(dst->prefs & IPV6_PREFER_SRC_TMP) : |
| @@ -1968,7 +1968,7 @@ ok: | |||
| 1968 | * to the stored lifetime since we'll | 1968 | * to the stored lifetime since we'll |
| 1969 | * be updating the timestamp below, | 1969 | * be updating the timestamp below, |
| 1970 | * else we'll set it back to the | 1970 | * else we'll set it back to the |
| 1971 | * minumum. | 1971 | * minimum. |
| 1972 | */ | 1972 | */ |
| 1973 | if (prefered_lft != ifp->prefered_lft) { | 1973 | if (prefered_lft != ifp->prefered_lft) { |
| 1974 | valid_lft = stored_lft; | 1974 | valid_lft = stored_lft; |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 4b13d5d8890e..afcc7099f96d 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -1113,7 +1113,7 @@ static int __init inet6_init(void) | |||
| 1113 | /* | 1113 | /* |
| 1114 | * ipngwg API draft makes clear that the correct semantics | 1114 | * ipngwg API draft makes clear that the correct semantics |
| 1115 | * for TCP and UDP is to consider one TCP and UDP instance | 1115 | * for TCP and UDP is to consider one TCP and UDP instance |
| 1116 | * in a host availiable by both INET and INET6 APIs and | 1116 | * in a host available by both INET and INET6 APIs and |
| 1117 | * able to communicate via both network protocols. | 1117 | * able to communicate via both network protocols. |
| 1118 | */ | 1118 | */ |
| 1119 | 1119 | ||
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 166054650466..f2c5b0fc0f21 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
| @@ -44,7 +44,7 @@ int inet6_csk_bind_conflict(const struct sock *sk, | |||
| 44 | !sk2->sk_bound_dev_if || | 44 | !sk2->sk_bound_dev_if || |
| 45 | sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && | 45 | sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && |
| 46 | (!sk->sk_reuse || !sk2->sk_reuse || | 46 | (!sk->sk_reuse || !sk2->sk_reuse || |
| 47 | ((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) && | 47 | sk2->sk_state == TCP_LISTEN) && |
| 48 | ipv6_rcv_saddr_equal(sk, sk2)) | 48 | ipv6_rcv_saddr_equal(sk, sk2)) |
| 49 | break; | 49 | break; |
| 50 | } | 50 | } |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 18208876aa8a..46cf7bea6769 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -779,7 +779,7 @@ slow_path: | |||
| 779 | /* IF: it doesn't fit, use 'mtu' - the data space left */ | 779 | /* IF: it doesn't fit, use 'mtu' - the data space left */ |
| 780 | if (len > mtu) | 780 | if (len > mtu) |
| 781 | len = mtu; | 781 | len = mtu; |
| 782 | /* IF: we are not sending upto and including the packet end | 782 | /* IF: we are not sending up to and including the packet end |
| 783 | then align the next start on an eight byte boundary */ | 783 | then align the next start on an eight byte boundary */ |
| 784 | if (len < left) { | 784 | if (len < left) { |
| 785 | len &= ~7; | 785 | len &= ~7; |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 7ff0343e05c7..29e48593bf22 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -663,7 +663,7 @@ static int pim6_rcv(struct sk_buff *skb) | |||
| 663 | skb_pull(skb, (u8 *)encap - skb->data); | 663 | skb_pull(skb, (u8 *)encap - skb->data); |
| 664 | skb_reset_network_header(skb); | 664 | skb_reset_network_header(skb); |
| 665 | skb->protocol = htons(ETH_P_IPV6); | 665 | skb->protocol = htons(ETH_P_IPV6); |
| 666 | skb->ip_summed = 0; | 666 | skb->ip_summed = CHECKSUM_NONE; |
| 667 | skb->pkt_type = PACKET_HOST; | 667 | skb->pkt_type = PACKET_HOST; |
| 668 | 668 | ||
| 669 | skb_tunnel_rx(skb, reg_dev); | 669 | skb_tunnel_rx(skb, reg_dev); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 0e49c9db3c98..92f952d093db 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -341,6 +341,8 @@ int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int d | |||
| 341 | case ARPHRD_INFINIBAND: | 341 | case ARPHRD_INFINIBAND: |
| 342 | ipv6_ib_mc_map(addr, dev->broadcast, buf); | 342 | ipv6_ib_mc_map(addr, dev->broadcast, buf); |
| 343 | return 0; | 343 | return 0; |
| 344 | case ARPHRD_IPGRE: | ||
| 345 | return ipv6_ipgre_mc_map(addr, dev->broadcast, buf); | ||
| 344 | default: | 346 | default: |
| 345 | if (dir) { | 347 | if (dir) { |
| 346 | memcpy(buf, dev->broadcast, dev->addr_len); | 348 | memcpy(buf, dev->broadcast, dev->addr_len); |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 39aaca2b4fd2..28bc1f644b7b 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
| @@ -90,9 +90,18 @@ static int nf_ip6_reroute(struct sk_buff *skb, | |||
| 90 | return 0; | 90 | return 0; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static int nf_ip6_route(struct dst_entry **dst, struct flowi *fl) | 93 | static int nf_ip6_route(struct net *net, struct dst_entry **dst, |
| 94 | struct flowi *fl, bool strict) | ||
| 94 | { | 95 | { |
| 95 | *dst = ip6_route_output(&init_net, NULL, &fl->u.ip6); | 96 | static const struct ipv6_pinfo fake_pinfo; |
| 97 | static const struct inet_sock fake_sk = { | ||
| 98 | /* makes ip6_route_output set RT6_LOOKUP_F_IFACE: */ | ||
| 99 | .sk.sk_bound_dev_if = 1, | ||
| 100 | .pinet6 = (struct ipv6_pinfo *) &fake_pinfo, | ||
| 101 | }; | ||
| 102 | const void *sk = strict ? &fake_sk : NULL; | ||
| 103 | |||
| 104 | *dst = ip6_route_output(net, sk, &fl->u.ip6); | ||
| 96 | return (*dst)->error; | 105 | return (*dst)->error; |
| 97 | } | 106 | } |
| 98 | 107 | ||
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index c9598a9067d7..5a1c6f27ffaf 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
| @@ -410,7 +410,7 @@ ip6t_do_table(struct sk_buff *skb, | |||
| 410 | verdict = (unsigned)(-v) - 1; | 410 | verdict = (unsigned)(-v) - 1; |
| 411 | break; | 411 | break; |
| 412 | } | 412 | } |
| 413 | if (*stackptr == 0) | 413 | if (*stackptr <= origptr) |
| 414 | e = get_entry(table_base, | 414 | e = get_entry(table_base, |
| 415 | private->underflow[hook]); | 415 | private->underflow[hook]); |
| 416 | else | 416 | else |
| @@ -441,8 +441,8 @@ ip6t_do_table(struct sk_buff *skb, | |||
| 441 | break; | 441 | break; |
| 442 | } while (!acpar.hotdrop); | 442 | } while (!acpar.hotdrop); |
| 443 | 443 | ||
| 444 | xt_info_rdunlock_bh(); | ||
| 445 | *stackptr = origptr; | 444 | *stackptr = origptr; |
| 445 | xt_info_rdunlock_bh(); | ||
| 446 | 446 | ||
| 447 | #ifdef DEBUG_ALLOW_ALL | 447 | #ifdef DEBUG_ALLOW_ALL |
| 448 | return NF_ACCEPT; | 448 | return NF_ACCEPT; |
| @@ -2248,7 +2248,7 @@ static int __init ip6_tables_init(void) | |||
| 2248 | if (ret < 0) | 2248 | if (ret < 0) |
| 2249 | goto err1; | 2249 | goto err1; |
| 2250 | 2250 | ||
| 2251 | /* Noone else will be downing sem now, so we won't sleep */ | 2251 | /* No one else will be downing sem now, so we won't sleep */ |
| 2252 | ret = xt_register_targets(ip6t_builtin_tg, ARRAY_SIZE(ip6t_builtin_tg)); | 2252 | ret = xt_register_targets(ip6t_builtin_tg, ARRAY_SIZE(ip6t_builtin_tg)); |
| 2253 | if (ret < 0) | 2253 | if (ret < 0) |
| 2254 | goto err2; | 2254 | goto err2; |
diff --git a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c index 97c5b21b9674..cdd6d045e42e 100644 --- a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c +++ b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | |||
| @@ -71,7 +71,7 @@ static unsigned int ipv6_defrag(unsigned int hooknum, | |||
| 71 | if (reasm == NULL) | 71 | if (reasm == NULL) |
| 72 | return NF_STOLEN; | 72 | return NF_STOLEN; |
| 73 | 73 | ||
| 74 | /* error occured or not fragmented */ | 74 | /* error occurred or not fragmented */ |
| 75 | if (reasm == skb) | 75 | if (reasm == skb) |
| 76 | return NF_ACCEPT; | 76 | return NF_ACCEPT; |
| 77 | 77 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 6814c8722fa7..843406f14d7b 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -854,7 +854,7 @@ static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table | |||
| 854 | return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, flags); | 854 | return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, flags); |
| 855 | } | 855 | } |
| 856 | 856 | ||
| 857 | struct dst_entry * ip6_route_output(struct net *net, struct sock *sk, | 857 | struct dst_entry * ip6_route_output(struct net *net, const struct sock *sk, |
| 858 | struct flowi6 *fl6) | 858 | struct flowi6 *fl6) |
| 859 | { | 859 | { |
| 860 | int flags = 0; | 860 | int flags = 0; |
diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c index 7cb65ef79f9c..6dcf5e7d661b 100644 --- a/net/ipv6/sysctl_net_ipv6.c +++ b/net/ipv6/sysctl_net_ipv6.c | |||
| @@ -17,6 +17,16 @@ | |||
| 17 | 17 | ||
| 18 | static struct ctl_table empty[1]; | 18 | static struct ctl_table empty[1]; |
| 19 | 19 | ||
| 20 | static ctl_table ipv6_static_skeleton[] = { | ||
| 21 | { | ||
| 22 | .procname = "neigh", | ||
| 23 | .maxlen = 0, | ||
| 24 | .mode = 0555, | ||
| 25 | .child = empty, | ||
| 26 | }, | ||
| 27 | { } | ||
| 28 | }; | ||
| 29 | |||
| 20 | static ctl_table ipv6_table_template[] = { | 30 | static ctl_table ipv6_table_template[] = { |
| 21 | { | 31 | { |
| 22 | .procname = "route", | 32 | .procname = "route", |
| @@ -37,12 +47,6 @@ static ctl_table ipv6_table_template[] = { | |||
| 37 | .mode = 0644, | 47 | .mode = 0644, |
| 38 | .proc_handler = proc_dointvec | 48 | .proc_handler = proc_dointvec |
| 39 | }, | 49 | }, |
| 40 | { | ||
| 41 | .procname = "neigh", | ||
| 42 | .maxlen = 0, | ||
| 43 | .mode = 0555, | ||
| 44 | .child = empty, | ||
| 45 | }, | ||
| 46 | { } | 50 | { } |
| 47 | }; | 51 | }; |
| 48 | 52 | ||
| @@ -160,7 +164,7 @@ static struct ctl_table_header *ip6_base; | |||
| 160 | 164 | ||
| 161 | int ipv6_static_sysctl_register(void) | 165 | int ipv6_static_sysctl_register(void) |
| 162 | { | 166 | { |
| 163 | ip6_base = register_sysctl_paths(net_ipv6_ctl_path, empty); | 167 | ip6_base = register_sysctl_paths(net_ipv6_ctl_path, ipv6_static_skeleton); |
| 164 | if (ip6_base == NULL) | 168 | if (ip6_base == NULL) |
| 165 | return -ENOMEM; | 169 | return -ENOMEM; |
| 166 | return 0; | 170 | return 0; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 2b0c186862c8..4f49e5dd41bb 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -503,6 +503,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | |||
| 503 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false); | 503 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false); |
| 504 | if (IS_ERR(dst)) { | 504 | if (IS_ERR(dst)) { |
| 505 | err = PTR_ERR(dst); | 505 | err = PTR_ERR(dst); |
| 506 | dst = NULL; | ||
| 506 | goto done; | 507 | goto done; |
| 507 | } | 508 | } |
| 508 | skb = tcp_make_synack(sk, dst, req, rvp); | 509 | skb = tcp_make_synack(sk, dst, req, rvp); |
| @@ -1621,6 +1622,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 1621 | opt_skb = skb_clone(skb, GFP_ATOMIC); | 1622 | opt_skb = skb_clone(skb, GFP_ATOMIC); |
| 1622 | 1623 | ||
| 1623 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ | 1624 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ |
| 1625 | sock_rps_save_rxhash(sk, skb->rxhash); | ||
| 1624 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) | 1626 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) |
| 1625 | goto reset; | 1627 | goto reset; |
| 1626 | if (opt_skb) | 1628 | if (opt_skb) |
| @@ -1648,7 +1650,8 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 1648 | __kfree_skb(opt_skb); | 1650 | __kfree_skb(opt_skb); |
| 1649 | return 0; | 1651 | return 0; |
| 1650 | } | 1652 | } |
| 1651 | } | 1653 | } else |
| 1654 | sock_rps_save_rxhash(sk, skb->rxhash); | ||
| 1652 | 1655 | ||
| 1653 | if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) | 1656 | if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) |
| 1654 | goto reset; | 1657 | goto reset; |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index d7037c006e13..15c37746845e 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -505,6 +505,9 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb) | |||
| 505 | int rc; | 505 | int rc; |
| 506 | int is_udplite = IS_UDPLITE(sk); | 506 | int is_udplite = IS_UDPLITE(sk); |
| 507 | 507 | ||
| 508 | if (!ipv6_addr_any(&inet6_sk(sk)->daddr)) | ||
| 509 | sock_rps_save_rxhash(sk, skb->rxhash); | ||
| 510 | |||
| 508 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) | 511 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) |
| 509 | goto drop; | 512 | goto drop; |
| 510 | 513 | ||
