aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/tcp_ipv6.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2012-03-19 20:02:01 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2012-03-19 20:02:01 -0400
commit10ce3cc919f50c2043b41ca968b43c26a3672600 (patch)
treeea409366a5208aced495bc0516a08b81fd43222e /net/ipv6/tcp_ipv6.c
parent24e3e5ae1e4c2a3a32f5b1f96b4e3fd721806acd (diff)
parent5c6a7a62c130afef3d61c1dee153012231ff5cd9 (diff)
Merge branch 'next' into for-linus
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r--net/ipv6/tcp_ipv6.c69
1 files changed, 36 insertions, 33 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 36131d122a6f..3edd05ae4388 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -62,6 +62,7 @@
62#include <net/netdma.h> 62#include <net/netdma.h>
63#include <net/inet_common.h> 63#include <net/inet_common.h>
64#include <net/secure_seq.h> 64#include <net/secure_seq.h>
65#include <net/tcp_memcontrol.h>
65 66
66#include <asm/uaccess.h> 67#include <asm/uaccess.h>
67 68
@@ -153,7 +154,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
153 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); 154 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
154 if (flowlabel == NULL) 155 if (flowlabel == NULL)
155 return -EINVAL; 156 return -EINVAL;
156 ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst); 157 usin->sin6_addr = flowlabel->dst;
157 fl6_sock_release(flowlabel); 158 fl6_sock_release(flowlabel);
158 } 159 }
159 } 160 }
@@ -195,7 +196,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
195 tp->write_seq = 0; 196 tp->write_seq = 0;
196 } 197 }
197 198
198 ipv6_addr_copy(&np->daddr, &usin->sin6_addr); 199 np->daddr = usin->sin6_addr;
199 np->flow_label = fl6.flowlabel; 200 np->flow_label = fl6.flowlabel;
200 201
201 /* 202 /*
@@ -244,9 +245,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
244 saddr = &np->rcv_saddr; 245 saddr = &np->rcv_saddr;
245 246
246 fl6.flowi6_proto = IPPROTO_TCP; 247 fl6.flowi6_proto = IPPROTO_TCP;
247 ipv6_addr_copy(&fl6.daddr, &np->daddr); 248 fl6.daddr = np->daddr;
248 ipv6_addr_copy(&fl6.saddr, 249 fl6.saddr = saddr ? *saddr : np->saddr;
249 (saddr ? saddr : &np->saddr));
250 fl6.flowi6_oif = sk->sk_bound_dev_if; 250 fl6.flowi6_oif = sk->sk_bound_dev_if;
251 fl6.flowi6_mark = sk->sk_mark; 251 fl6.flowi6_mark = sk->sk_mark;
252 fl6.fl6_dport = usin->sin6_port; 252 fl6.fl6_dport = usin->sin6_port;
@@ -264,11 +264,11 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
264 264
265 if (saddr == NULL) { 265 if (saddr == NULL) {
266 saddr = &fl6.saddr; 266 saddr = &fl6.saddr;
267 ipv6_addr_copy(&np->rcv_saddr, saddr); 267 np->rcv_saddr = *saddr;
268 } 268 }
269 269
270 /* set the source address */ 270 /* set the source address */
271 ipv6_addr_copy(&np->saddr, saddr); 271 np->saddr = *saddr;
272 inet->inet_rcv_saddr = LOOPBACK4_IPV6; 272 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
273 273
274 sk->sk_gso_type = SKB_GSO_TCPV6; 274 sk->sk_gso_type = SKB_GSO_TCPV6;
@@ -398,8 +398,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
398 */ 398 */
399 memset(&fl6, 0, sizeof(fl6)); 399 memset(&fl6, 0, sizeof(fl6));
400 fl6.flowi6_proto = IPPROTO_TCP; 400 fl6.flowi6_proto = IPPROTO_TCP;
401 ipv6_addr_copy(&fl6.daddr, &np->daddr); 401 fl6.daddr = np->daddr;
402 ipv6_addr_copy(&fl6.saddr, &np->saddr); 402 fl6.saddr = np->saddr;
403 fl6.flowi6_oif = sk->sk_bound_dev_if; 403 fl6.flowi6_oif = sk->sk_bound_dev_if;
404 fl6.flowi6_mark = sk->sk_mark; 404 fl6.flowi6_mark = sk->sk_mark;
405 fl6.fl6_dport = inet->inet_dport; 405 fl6.fl6_dport = inet->inet_dport;
@@ -489,8 +489,8 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
489 489
490 memset(&fl6, 0, sizeof(fl6)); 490 memset(&fl6, 0, sizeof(fl6));
491 fl6.flowi6_proto = IPPROTO_TCP; 491 fl6.flowi6_proto = IPPROTO_TCP;
492 ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr); 492 fl6.daddr = treq->rmt_addr;
493 ipv6_addr_copy(&fl6.saddr, &treq->loc_addr); 493 fl6.saddr = treq->loc_addr;
494 fl6.flowlabel = 0; 494 fl6.flowlabel = 0;
495 fl6.flowi6_oif = treq->iif; 495 fl6.flowi6_oif = treq->iif;
496 fl6.flowi6_mark = sk->sk_mark; 496 fl6.flowi6_mark = sk->sk_mark;
@@ -512,7 +512,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
512 if (skb) { 512 if (skb) {
513 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); 513 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
514 514
515 ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr); 515 fl6.daddr = treq->rmt_addr;
516 err = ip6_xmit(sk, skb, &fl6, opt, np->tclass); 516 err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
517 err = net_xmit_eval(err); 517 err = net_xmit_eval(err);
518 } 518 }
@@ -617,8 +617,7 @@ static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,
617 tp->md5sig_info->alloced6++; 617 tp->md5sig_info->alloced6++;
618 } 618 }
619 619
620 ipv6_addr_copy(&tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr, 620 tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr = *peer;
621 peer);
622 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey; 621 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey;
623 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen; 622 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen;
624 623
@@ -750,8 +749,8 @@ static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
750 749
751 bp = &hp->md5_blk.ip6; 750 bp = &hp->md5_blk.ip6;
752 /* 1. TCP pseudo-header (RFC2460) */ 751 /* 1. TCP pseudo-header (RFC2460) */
753 ipv6_addr_copy(&bp->saddr, saddr); 752 bp->saddr = *saddr;
754 ipv6_addr_copy(&bp->daddr, daddr); 753 bp->daddr = *daddr;
755 bp->protocol = cpu_to_be32(IPPROTO_TCP); 754 bp->protocol = cpu_to_be32(IPPROTO_TCP);
756 bp->len = cpu_to_be32(nbytes); 755 bp->len = cpu_to_be32(nbytes);
757 756
@@ -1039,8 +1038,8 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
1039#endif 1038#endif
1040 1039
1041 memset(&fl6, 0, sizeof(fl6)); 1040 memset(&fl6, 0, sizeof(fl6));
1042 ipv6_addr_copy(&fl6.daddr, &ipv6_hdr(skb)->saddr); 1041 fl6.daddr = ipv6_hdr(skb)->saddr;
1043 ipv6_addr_copy(&fl6.saddr, &ipv6_hdr(skb)->daddr); 1042 fl6.saddr = ipv6_hdr(skb)->daddr;
1044 1043
1045 buff->ip_summed = CHECKSUM_PARTIAL; 1044 buff->ip_summed = CHECKSUM_PARTIAL;
1046 buff->csum = 0; 1045 buff->csum = 0;
@@ -1084,7 +1083,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
1084 1083
1085#ifdef CONFIG_TCP_MD5SIG 1084#ifdef CONFIG_TCP_MD5SIG
1086 if (sk) 1085 if (sk)
1087 key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr); 1086 key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr);
1088#endif 1087#endif
1089 1088
1090 if (th->ack) 1089 if (th->ack)
@@ -1250,11 +1249,18 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1250 tcp_openreq_init(req, &tmp_opt, skb); 1249 tcp_openreq_init(req, &tmp_opt, skb);
1251 1250
1252 treq = inet6_rsk(req); 1251 treq = inet6_rsk(req);
1253 ipv6_addr_copy(&treq->rmt_addr, &ipv6_hdr(skb)->saddr); 1252 treq->rmt_addr = ipv6_hdr(skb)->saddr;
1254 ipv6_addr_copy(&treq->loc_addr, &ipv6_hdr(skb)->daddr); 1253 treq->loc_addr = ipv6_hdr(skb)->daddr;
1255 if (!want_cookie || tmp_opt.tstamp_ok) 1254 if (!want_cookie || tmp_opt.tstamp_ok)
1256 TCP_ECN_create_request(req, tcp_hdr(skb)); 1255 TCP_ECN_create_request(req, tcp_hdr(skb));
1257 1256
1257 treq->iif = sk->sk_bound_dev_if;
1258
1259 /* So that link locals have meaning */
1260 if (!sk->sk_bound_dev_if &&
1261 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1262 treq->iif = inet6_iif(skb);
1263
1258 if (!isn) { 1264 if (!isn) {
1259 struct inet_peer *peer = NULL; 1265 struct inet_peer *peer = NULL;
1260 1266
@@ -1264,12 +1270,6 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1264 atomic_inc(&skb->users); 1270 atomic_inc(&skb->users);
1265 treq->pktopts = skb; 1271 treq->pktopts = skb;
1266 } 1272 }
1267 treq->iif = sk->sk_bound_dev_if;
1268
1269 /* So that link locals have meaning */
1270 if (!sk->sk_bound_dev_if &&
1271 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1272 treq->iif = inet6_iif(skb);
1273 1273
1274 if (want_cookie) { 1274 if (want_cookie) {
1275 isn = cookie_v6_init_sequence(sk, skb, &req->mss); 1275 isn = cookie_v6_init_sequence(sk, skb, &req->mss);
@@ -1380,7 +1380,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1380 1380
1381 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr); 1381 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1382 1382
1383 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr); 1383 newnp->rcv_saddr = newnp->saddr;
1384 1384
1385 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped; 1385 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1386 newsk->sk_backlog_rcv = tcp_v4_do_rcv; 1386 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
@@ -1444,9 +1444,9 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1444 1444
1445 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 1445 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1446 1446
1447 ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr); 1447 newnp->daddr = treq->rmt_addr;
1448 ipv6_addr_copy(&newnp->saddr, &treq->loc_addr); 1448 newnp->saddr = treq->loc_addr;
1449 ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr); 1449 newnp->rcv_saddr = treq->loc_addr;
1450 newsk->sk_bound_dev_if = treq->iif; 1450 newsk->sk_bound_dev_if = treq->iif;
1451 1451
1452 /* Now IPv6 options... 1452 /* Now IPv6 options...
@@ -1995,7 +1995,8 @@ static int tcp_v6_init_sock(struct sock *sk)
1995 sk->sk_rcvbuf = sysctl_tcp_rmem[1]; 1995 sk->sk_rcvbuf = sysctl_tcp_rmem[1];
1996 1996
1997 local_bh_disable(); 1997 local_bh_disable();
1998 percpu_counter_inc(&tcp_sockets_allocated); 1998 sock_update_memcg(sk);
1999 sk_sockets_allocated_inc(sk);
1999 local_bh_enable(); 2000 local_bh_enable();
2000 2001
2001 return 0; 2002 return 0;
@@ -2214,7 +2215,6 @@ struct proto tcpv6_prot = {
2214 .memory_allocated = &tcp_memory_allocated, 2215 .memory_allocated = &tcp_memory_allocated,
2215 .memory_pressure = &tcp_memory_pressure, 2216 .memory_pressure = &tcp_memory_pressure,
2216 .orphan_count = &tcp_orphan_count, 2217 .orphan_count = &tcp_orphan_count,
2217 .sysctl_mem = sysctl_tcp_mem,
2218 .sysctl_wmem = sysctl_tcp_wmem, 2218 .sysctl_wmem = sysctl_tcp_wmem,
2219 .sysctl_rmem = sysctl_tcp_rmem, 2219 .sysctl_rmem = sysctl_tcp_rmem,
2220 .max_header = MAX_TCP_HEADER, 2220 .max_header = MAX_TCP_HEADER,
@@ -2228,6 +2228,9 @@ struct proto tcpv6_prot = {
2228 .compat_setsockopt = compat_tcp_setsockopt, 2228 .compat_setsockopt = compat_tcp_setsockopt,
2229 .compat_getsockopt = compat_tcp_getsockopt, 2229 .compat_getsockopt = compat_tcp_getsockopt,
2230#endif 2230#endif
2231#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
2232 .proto_cgroup = tcp_proto_cgroup,
2233#endif
2231}; 2234};
2232 2235
2233static const struct inet6_protocol tcpv6_protocol = { 2236static const struct inet6_protocol tcpv6_protocol = {