Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / ipv6 / tcp_ipv6.c
CommitLineData
1da177e4
LT
1/*
2 * TCP over IPv6
1ab1457c 3 * Linux INET6 implementation
1da177e4
LT
4 *
5 * Authors:
1ab1457c 6 * Pedro Roque <roque@di.fc.ul.pt>
1da177e4 7 *
1ab1457c 8 * Based on:
1da177e4
LT
9 * linux/net/ipv4/tcp.c
10 * linux/net/ipv4/tcp_input.c
11 * linux/net/ipv4/tcp_output.c
12 *
13 * Fixes:
14 * Hideaki YOSHIFUJI : sin6_scope_id support
15 * YOSHIFUJI Hideaki @USAGI and: Support IPV6_V6ONLY socket option, which
16 * Alexey Kuznetsov allow both IPv4 and IPv6 sockets to bind
17 * a single port at the same time.
18 * YOSHIFUJI Hideaki @USAGI: convert /proc/net/tcp6 to seq_file.
19 *
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License
22 * as published by the Free Software Foundation; either version
23 * 2 of the License, or (at your option) any later version.
24 */
25
eb4dea58 26#include <linux/bottom_half.h>
1da177e4 27#include <linux/module.h>
1da177e4
LT
28#include <linux/errno.h>
29#include <linux/types.h>
30#include <linux/socket.h>
31#include <linux/sockios.h>
32#include <linux/net.h>
33#include <linux/jiffies.h>
34#include <linux/in.h>
35#include <linux/in6.h>
36#include <linux/netdevice.h>
37#include <linux/init.h>
38#include <linux/jhash.h>
39#include <linux/ipsec.h>
40#include <linux/times.h>
5a0e3ad6 41#include <linux/slab.h>
1da177e4
LT
42
43#include <linux/ipv6.h>
44#include <linux/icmpv6.h>
45#include <linux/random.h>
46
47#include <net/tcp.h>
48#include <net/ndisc.h>
5324a040 49#include <net/inet6_hashtables.h>
8129765a 50#include <net/inet6_connection_sock.h>
1da177e4
LT
51#include <net/ipv6.h>
52#include <net/transp_v6.h>
53#include <net/addrconf.h>
54#include <net/ip6_route.h>
55#include <net/ip6_checksum.h>
56#include <net/inet_ecn.h>
57#include <net/protocol.h>
58#include <net/xfrm.h>
1da177e4
LT
59#include <net/snmp.h>
60#include <net/dsfield.h>
6d6ee43e 61#include <net/timewait_sock.h>
18134bed 62#include <net/netdma.h>
3d58b5fa 63#include <net/inet_common.h>
6e5714ea 64#include <net/secure_seq.h>
d1a4c0b3 65#include <net/tcp_memcontrol.h>
1da177e4
LT
66
67#include <asm/uaccess.h>
68
69#include <linux/proc_fs.h>
70#include <linux/seq_file.h>
71
cfb6eeb4
YH
72#include <linux/crypto.h>
73#include <linux/scatterlist.h>
74
cfb6eeb4 75static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
6edafaaf
GJ
76static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
77 struct request_sock *req);
1da177e4
LT
78
79static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
1da177e4 80
3b401a81
SH
81static const struct inet_connection_sock_af_ops ipv6_mapped;
82static const struct inet_connection_sock_af_ops ipv6_specific;
a928630a 83#ifdef CONFIG_TCP_MD5SIG
b2e4b3de
SH
84static const struct tcp_sock_af_ops tcp_sock_ipv6_specific;
85static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
9501f972
YH
86#else
87static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
b71d1d42 88 const struct in6_addr *addr)
9501f972
YH
89{
90 return NULL;
91}
a928630a 92#endif
1da177e4 93
fae6ef87
NC
94static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
95{
96 struct dst_entry *dst = skb_dst(skb);
97 const struct rt6_info *rt = (const struct rt6_info *)dst;
98
99 dst_hold(dst);
100 sk->sk_rx_dst = dst;
101 inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;
102 if (rt->rt6i_node)
103 inet6_sk(sk)->rx_dst_cookie = rt->rt6i_node->fn_sernum;
104}
105
1da177e4
LT
106static void tcp_v6_hash(struct sock *sk)
107{
108 if (sk->sk_state != TCP_CLOSE) {
8292a17a 109 if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
1da177e4
LT
110 tcp_prot.hash(sk);
111 return;
112 }
113 local_bh_disable();
9327f705 114 __inet6_hash(sk, NULL);
1da177e4
LT
115 local_bh_enable();
116 }
117}
118
cf533ea5 119static __u32 tcp_v6_init_sequence(const struct sk_buff *skb)
1da177e4 120{
0660e03f
ACM
121 return secure_tcpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
122 ipv6_hdr(skb)->saddr.s6_addr32,
aa8223c7
ACM
123 tcp_hdr(skb)->dest,
124 tcp_hdr(skb)->source);
1da177e4
LT
125}
126
1ab1457c 127static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
1da177e4
LT
128 int addr_len)
129{
130 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
1ab1457c 131 struct inet_sock *inet = inet_sk(sk);
d83d8461 132 struct inet_connection_sock *icsk = inet_csk(sk);
1da177e4
LT
133 struct ipv6_pinfo *np = inet6_sk(sk);
134 struct tcp_sock *tp = tcp_sk(sk);
20c59de2 135 struct in6_addr *saddr = NULL, *final_p, final;
493f377d 136 struct rt6_info *rt;
4c9483b2 137 struct flowi6 fl6;
1da177e4
LT
138 struct dst_entry *dst;
139 int addr_type;
140 int err;
141
1ab1457c 142 if (addr_len < SIN6_LEN_RFC2133)
1da177e4
LT
143 return -EINVAL;
144
1ab1457c 145 if (usin->sin6_family != AF_INET6)
a02cec21 146 return -EAFNOSUPPORT;
1da177e4 147
4c9483b2 148 memset(&fl6, 0, sizeof(fl6));
1da177e4
LT
149
150 if (np->sndflow) {
4c9483b2
DM
151 fl6.flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
152 IP6_ECN_flow_init(fl6.flowlabel);
153 if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
1da177e4 154 struct ip6_flowlabel *flowlabel;
4c9483b2 155 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
1da177e4
LT
156 if (flowlabel == NULL)
157 return -EINVAL;
4e3fd7a0 158 usin->sin6_addr = flowlabel->dst;
1da177e4
LT
159 fl6_sock_release(flowlabel);
160 }
161 }
162
163 /*
1ab1457c
YH
164 * connect() to INADDR_ANY means loopback (BSD'ism).
165 */
166
167 if(ipv6_addr_any(&usin->sin6_addr))
168 usin->sin6_addr.s6_addr[15] = 0x1;
1da177e4
LT
169
170 addr_type = ipv6_addr_type(&usin->sin6_addr);
171
172 if(addr_type & IPV6_ADDR_MULTICAST)
173 return -ENETUNREACH;
174
175 if (addr_type&IPV6_ADDR_LINKLOCAL) {
176 if (addr_len >= sizeof(struct sockaddr_in6) &&
177 usin->sin6_scope_id) {
178 /* If interface is set while binding, indices
179 * must coincide.
180 */
181 if (sk->sk_bound_dev_if &&
182 sk->sk_bound_dev_if != usin->sin6_scope_id)
183 return -EINVAL;
184
185 sk->sk_bound_dev_if = usin->sin6_scope_id;
186 }
187
188 /* Connect to link-local address requires an interface */
189 if (!sk->sk_bound_dev_if)
190 return -EINVAL;
191 }
192
193 if (tp->rx_opt.ts_recent_stamp &&
194 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
195 tp->rx_opt.ts_recent = 0;
196 tp->rx_opt.ts_recent_stamp = 0;
197 tp->write_seq = 0;
198 }
199
4e3fd7a0 200 np->daddr = usin->sin6_addr;
4c9483b2 201 np->flow_label = fl6.flowlabel;
1da177e4
LT
202
203 /*
204 * TCP over IPv4
205 */
206
207 if (addr_type == IPV6_ADDR_MAPPED) {
d83d8461 208 u32 exthdrlen = icsk->icsk_ext_hdr_len;
1da177e4
LT
209 struct sockaddr_in sin;
210
211 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
212
213 if (__ipv6_only_sock(sk))
214 return -ENETUNREACH;
215
216 sin.sin_family = AF_INET;
217 sin.sin_port = usin->sin6_port;
218 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
219
d83d8461 220 icsk->icsk_af_ops = &ipv6_mapped;
1da177e4 221 sk->sk_backlog_rcv = tcp_v4_do_rcv;
cfb6eeb4
YH
222#ifdef CONFIG_TCP_MD5SIG
223 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
224#endif
1da177e4
LT
225
226 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
227
228 if (err) {
d83d8461
ACM
229 icsk->icsk_ext_hdr_len = exthdrlen;
230 icsk->icsk_af_ops = &ipv6_specific;
1da177e4 231 sk->sk_backlog_rcv = tcp_v6_do_rcv;
cfb6eeb4
YH
232#ifdef CONFIG_TCP_MD5SIG
233 tp->af_specific = &tcp_sock_ipv6_specific;
234#endif
1da177e4
LT
235 goto failure;
236 } else {
c720c7e8
ED
237 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
238 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
239 &np->rcv_saddr);
1da177e4
LT
240 }
241
242 return err;
243 }
244
245 if (!ipv6_addr_any(&np->rcv_saddr))
246 saddr = &np->rcv_saddr;
247
4c9483b2 248 fl6.flowi6_proto = IPPROTO_TCP;
4e3fd7a0
AD
249 fl6.daddr = np->daddr;
250 fl6.saddr = saddr ? *saddr : np->saddr;
4c9483b2
DM
251 fl6.flowi6_oif = sk->sk_bound_dev_if;
252 fl6.flowi6_mark = sk->sk_mark;
1958b856
DM
253 fl6.fl6_dport = usin->sin6_port;
254 fl6.fl6_sport = inet->inet_sport;
1da177e4 255
4c9483b2 256 final_p = fl6_update_dst(&fl6, np->opt, &final);
1da177e4 257
4c9483b2 258 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
beb8d13b 259
4c9483b2 260 dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
68d0c6d3
DM
261 if (IS_ERR(dst)) {
262 err = PTR_ERR(dst);
1da177e4 263 goto failure;
14e50e57 264 }
1da177e4
LT
265
266 if (saddr == NULL) {
4c9483b2 267 saddr = &fl6.saddr;
4e3fd7a0 268 np->rcv_saddr = *saddr;
1da177e4
LT
269 }
270
271 /* set the source address */
4e3fd7a0 272 np->saddr = *saddr;
c720c7e8 273 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
1da177e4 274
f83ef8c0 275 sk->sk_gso_type = SKB_GSO_TCPV6;
8e1ef0a9 276 __ip6_dst_store(sk, dst, NULL, NULL);
1da177e4 277
493f377d
DM
278 rt = (struct rt6_info *) dst;
279 if (tcp_death_row.sysctl_tw_recycle &&
280 !tp->rx_opt.ts_recent_stamp &&
81166dd6
DM
281 ipv6_addr_equal(&rt->rt6i_dst.addr, &np->daddr))
282 tcp_fetch_timewait_stamp(sk, dst);
493f377d 283
d83d8461 284 icsk->icsk_ext_hdr_len = 0;
1da177e4 285 if (np->opt)
d83d8461
ACM
286 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
287 np->opt->opt_nflen);
1da177e4
LT
288
289 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
290
c720c7e8 291 inet->inet_dport = usin->sin6_port;
1da177e4
LT
292
293 tcp_set_state(sk, TCP_SYN_SENT);
d8313f5c 294 err = inet6_hash_connect(&tcp_death_row, sk);
1da177e4
LT
295 if (err)
296 goto late_failure;
297
298 if (!tp->write_seq)
299 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
300 np->daddr.s6_addr32,
c720c7e8
ED
301 inet->inet_sport,
302 inet->inet_dport);
1da177e4
LT
303
304 err = tcp_connect(sk);
305 if (err)
306 goto late_failure;
307
308 return 0;
309
310late_failure:
311 tcp_set_state(sk, TCP_CLOSE);
312 __sk_dst_reset(sk);
313failure:
c720c7e8 314 inet->inet_dport = 0;
1da177e4
LT
315 sk->sk_route_caps = 0;
316 return err;
317}
318
563d34d0
ED
319static void tcp_v6_mtu_reduced(struct sock *sk)
320{
321 struct dst_entry *dst;
322
323 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
324 return;
325
326 dst = inet6_csk_update_pmtu(sk, tcp_sk(sk)->mtu_info);
327 if (!dst)
328 return;
329
330 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
331 tcp_sync_mss(sk, dst_mtu(dst));
332 tcp_simple_retransmit(sk);
333 }
334}
335
1da177e4 336static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
d5fdd6ba 337 u8 type, u8 code, int offset, __be32 info)
1da177e4 338{
b71d1d42 339 const struct ipv6hdr *hdr = (const struct ipv6hdr*)skb->data;
505cbfc5 340 const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
1da177e4
LT
341 struct ipv6_pinfo *np;
342 struct sock *sk;
343 int err;
1ab1457c 344 struct tcp_sock *tp;
1da177e4 345 __u32 seq;
ca12a1a4 346 struct net *net = dev_net(skb->dev);
1da177e4 347
ca12a1a4 348 sk = inet6_lookup(net, &tcp_hashinfo, &hdr->daddr,
d86e0dac 349 th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
1da177e4
LT
350
351 if (sk == NULL) {
e41b5368
DL
352 ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev),
353 ICMP6_MIB_INERRORS);
1da177e4
LT
354 return;
355 }
356
357 if (sk->sk_state == TCP_TIME_WAIT) {
9469c7b4 358 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
359 return;
360 }
361
362 bh_lock_sock(sk);
563d34d0 363 if (sock_owned_by_user(sk) && type != ICMPV6_PKT_TOOBIG)
de0744af 364 NET_INC_STATS_BH(net, LINUX_MIB_LOCKDROPPEDICMPS);
1da177e4
LT
365
366 if (sk->sk_state == TCP_CLOSE)
367 goto out;
368
e802af9c
SH
369 if (ipv6_hdr(skb)->hop_limit < inet6_sk(sk)->min_hopcount) {
370 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
371 goto out;
372 }
373
1da177e4 374 tp = tcp_sk(sk);
1ab1457c 375 seq = ntohl(th->seq);
1da177e4
LT
376 if (sk->sk_state != TCP_LISTEN &&
377 !between(seq, tp->snd_una, tp->snd_nxt)) {
de0744af 378 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
1da177e4
LT
379 goto out;
380 }
381
382 np = inet6_sk(sk);
383
ec18d9a2
DM
384 if (type == NDISC_REDIRECT) {
385 struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
386
1ed5c48f 387 if (dst)
6700c270 388 dst->ops->redirect(dst, sk, skb);
ec18d9a2
DM
389 }
390
1da177e4 391 if (type == ICMPV6_PKT_TOOBIG) {
563d34d0
ED
392 tp->mtu_info = ntohl(info);
393 if (!sock_owned_by_user(sk))
394 tcp_v6_mtu_reduced(sk);
d013ef2a
JA
395 else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
396 &tp->tsq_flags))
397 sock_hold(sk);
1da177e4
LT
398 goto out;
399 }
400
401 icmpv6_err_convert(type, code, &err);
402
60236fdd 403 /* Might be for an request_sock */
1da177e4 404 switch (sk->sk_state) {
60236fdd 405 struct request_sock *req, **prev;
1da177e4
LT
406 case TCP_LISTEN:
407 if (sock_owned_by_user(sk))
408 goto out;
409
8129765a
ACM
410 req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
411 &hdr->saddr, inet6_iif(skb));
1da177e4
LT
412 if (!req)
413 goto out;
414
415 /* ICMPs are not backlogged, hence we cannot get
416 * an established socket here.
417 */
547b792c 418 WARN_ON(req->sk != NULL);
1da177e4 419
2e6599cb 420 if (seq != tcp_rsk(req)->snt_isn) {
de0744af 421 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
1da177e4
LT
422 goto out;
423 }
424
463c84b9 425 inet_csk_reqsk_queue_drop(sk, req, prev);
1da177e4
LT
426 goto out;
427
428 case TCP_SYN_SENT:
429 case TCP_SYN_RECV: /* Cannot happen.
1ab1457c 430 It can, it SYNs are crossed. --ANK */
1da177e4 431 if (!sock_owned_by_user(sk)) {
1da177e4
LT
432 sk->sk_err = err;
433 sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
434
435 tcp_done(sk);
436 } else
437 sk->sk_err_soft = err;
438 goto out;
439 }
440
441 if (!sock_owned_by_user(sk) && np->recverr) {
442 sk->sk_err = err;
443 sk->sk_error_report(sk);
444 } else
445 sk->sk_err_soft = err;
446
447out:
448 bh_unlock_sock(sk);
449 sock_put(sk);
450}
451
452
9f10d3f6
NC
453static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst,
454 struct flowi6 *fl6,
3840a06e 455 struct request_sock *req,
fff32699
ED
456 struct request_values *rvp,
457 u16 queue_mapping)
1da177e4 458{
ca304b61 459 struct inet6_request_sock *treq = inet6_rsk(req);
1da177e4
LT
460 struct ipv6_pinfo *np = inet6_sk(sk);
461 struct sk_buff * skb;
9494218f 462 int err = -ENOMEM;
1da177e4 463
9f10d3f6
NC
464 /* First, grab a route. */
465 if (!dst && (dst = inet6_csk_route_req(sk, fl6, req)) == NULL)
fd80eb94 466 goto done;
9494218f 467
8336886f 468 skb = tcp_make_synack(sk, dst, req, rvp, NULL);
9494218f 469
1da177e4 470 if (skb) {
8ad50d96 471 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
1da177e4 472
9f10d3f6 473 fl6->daddr = treq->rmt_addr;
fff32699 474 skb_set_queue_mapping(skb, queue_mapping);
43264e0b 475 err = ip6_xmit(sk, skb, fl6, np->opt, np->tclass);
b9df3cb8 476 err = net_xmit_eval(err);
1da177e4
LT
477 }
478
479done:
1da177e4
LT
480 return err;
481}
482
72659ecc
OP
483static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req,
484 struct request_values *rvp)
485{
9f10d3f6 486 struct flowi6 fl6;
e6c022a4 487 int res;
9f10d3f6 488
e6c022a4
ED
489 res = tcp_v6_send_synack(sk, NULL, &fl6, req, rvp, 0);
490 if (!res)
491 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
492 return res;
72659ecc
OP
493}
494
60236fdd 495static void tcp_v6_reqsk_destructor(struct request_sock *req)
1da177e4 496{
800d55f1 497 kfree_skb(inet6_rsk(req)->pktopts);
1da177e4
LT
498}
499
cfb6eeb4
YH
500#ifdef CONFIG_TCP_MD5SIG
501static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
b71d1d42 502 const struct in6_addr *addr)
cfb6eeb4 503{
a915da9b 504 return tcp_md5_do_lookup(sk, (union tcp_md5_addr *)addr, AF_INET6);
cfb6eeb4
YH
505}
506
507static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
508 struct sock *addr_sk)
509{
510 return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr);
511}
512
513static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
514 struct request_sock *req)
515{
516 return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
517}
518
cfb6eeb4
YH
519static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
520 int optlen)
521{
522 struct tcp_md5sig cmd;
523 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
cfb6eeb4
YH
524
525 if (optlen < sizeof(cmd))
526 return -EINVAL;
527
528 if (copy_from_user(&cmd, optval, sizeof(cmd)))
529 return -EFAULT;
530
531 if (sin6->sin6_family != AF_INET6)
532 return -EINVAL;
533
534 if (!cmd.tcpm_keylen) {
e773e4fa 535 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
a915da9b
ED
536 return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
537 AF_INET);
538 return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
539 AF_INET6);
cfb6eeb4
YH
540 }
541
542 if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
543 return -EINVAL;
544
a915da9b
ED
545 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
546 return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
547 AF_INET, cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
cfb6eeb4 548
a915da9b
ED
549 return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
550 AF_INET6, cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
cfb6eeb4
YH
551}
552
49a72dfb 553static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
b71d1d42
ED
554 const struct in6_addr *daddr,
555 const struct in6_addr *saddr, int nbytes)
cfb6eeb4 556{
cfb6eeb4 557 struct tcp6_pseudohdr *bp;
49a72dfb 558 struct scatterlist sg;
8d26d76d 559
cfb6eeb4 560 bp = &hp->md5_blk.ip6;
cfb6eeb4 561 /* 1. TCP pseudo-header (RFC2460) */
4e3fd7a0
AD
562 bp->saddr = *saddr;
563 bp->daddr = *daddr;
49a72dfb 564 bp->protocol = cpu_to_be32(IPPROTO_TCP);
00b1304c 565 bp->len = cpu_to_be32(nbytes);
cfb6eeb4 566
49a72dfb
AL
567 sg_init_one(&sg, bp, sizeof(*bp));
568 return crypto_hash_update(&hp->md5_desc, &sg, sizeof(*bp));
569}
c7da57a1 570
49a72dfb 571static int tcp_v6_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
b71d1d42 572 const struct in6_addr *daddr, struct in6_addr *saddr,
318cf7aa 573 const struct tcphdr *th)
49a72dfb
AL
574{
575 struct tcp_md5sig_pool *hp;
576 struct hash_desc *desc;
577
578 hp = tcp_get_md5sig_pool();
579 if (!hp)
580 goto clear_hash_noput;
581 desc = &hp->md5_desc;
582
583 if (crypto_hash_init(desc))
584 goto clear_hash;
585 if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, th->doff << 2))
586 goto clear_hash;
587 if (tcp_md5_hash_header(hp, th))
588 goto clear_hash;
589 if (tcp_md5_hash_key(hp, key))
590 goto clear_hash;
591 if (crypto_hash_final(desc, md5_hash))
cfb6eeb4 592 goto clear_hash;
cfb6eeb4 593
cfb6eeb4 594 tcp_put_md5sig_pool();
cfb6eeb4 595 return 0;
49a72dfb 596
cfb6eeb4
YH
597clear_hash:
598 tcp_put_md5sig_pool();
599clear_hash_noput:
600 memset(md5_hash, 0, 16);
49a72dfb 601 return 1;
cfb6eeb4
YH
602}
603
49a72dfb 604static int tcp_v6_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
318cf7aa
ED
605 const struct sock *sk,
606 const struct request_sock *req,
607 const struct sk_buff *skb)
cfb6eeb4 608{
b71d1d42 609 const struct in6_addr *saddr, *daddr;
49a72dfb
AL
610 struct tcp_md5sig_pool *hp;
611 struct hash_desc *desc;
318cf7aa 612 const struct tcphdr *th = tcp_hdr(skb);
cfb6eeb4
YH
613
614 if (sk) {
615 saddr = &inet6_sk(sk)->saddr;
616 daddr = &inet6_sk(sk)->daddr;
49a72dfb 617 } else if (req) {
cfb6eeb4
YH
618 saddr = &inet6_rsk(req)->loc_addr;
619 daddr = &inet6_rsk(req)->rmt_addr;
49a72dfb 620 } else {
b71d1d42 621 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
49a72dfb
AL
622 saddr = &ip6h->saddr;
623 daddr = &ip6h->daddr;
cfb6eeb4 624 }
49a72dfb
AL
625
626 hp = tcp_get_md5sig_pool();
627 if (!hp)
628 goto clear_hash_noput;
629 desc = &hp->md5_desc;
630
631 if (crypto_hash_init(desc))
632 goto clear_hash;
633
634 if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, skb->len))
635 goto clear_hash;
636 if (tcp_md5_hash_header(hp, th))
637 goto clear_hash;
638 if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))
639 goto clear_hash;
640 if (tcp_md5_hash_key(hp, key))
641 goto clear_hash;
642 if (crypto_hash_final(desc, md5_hash))
643 goto clear_hash;
644
645 tcp_put_md5sig_pool();
646 return 0;
647
648clear_hash:
649 tcp_put_md5sig_pool();
650clear_hash_noput:
651 memset(md5_hash, 0, 16);
652 return 1;
cfb6eeb4
YH
653}
654
318cf7aa 655static int tcp_v6_inbound_md5_hash(struct sock *sk, const struct sk_buff *skb)
cfb6eeb4 656{
cf533ea5 657 const __u8 *hash_location = NULL;
cfb6eeb4 658 struct tcp_md5sig_key *hash_expected;
b71d1d42 659 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
318cf7aa 660 const struct tcphdr *th = tcp_hdr(skb);
cfb6eeb4 661 int genhash;
cfb6eeb4
YH
662 u8 newhash[16];
663
664 hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);
7d5d5525 665 hash_location = tcp_parse_md5sig_option(th);
cfb6eeb4 666
785957d3
DM
667 /* We've parsed the options - do we have a hash? */
668 if (!hash_expected && !hash_location)
669 return 0;
670
671 if (hash_expected && !hash_location) {
672 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);
cfb6eeb4
YH
673 return 1;
674 }
675
785957d3
DM
676 if (!hash_expected && hash_location) {
677 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);
cfb6eeb4
YH
678 return 1;
679 }
680
681 /* check the signature */
49a72dfb
AL
682 genhash = tcp_v6_md5_hash_skb(newhash,
683 hash_expected,
684 NULL, NULL, skb);
685
cfb6eeb4 686 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
e87cc472
JP
687 net_info_ratelimited("MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
688 genhash ? "failed" : "mismatch",
689 &ip6h->saddr, ntohs(th->source),
690 &ip6h->daddr, ntohs(th->dest));
cfb6eeb4
YH
691 return 1;
692 }
693 return 0;
694}
695#endif
696
c6aefafb 697struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
1da177e4 698 .family = AF_INET6,
2e6599cb 699 .obj_size = sizeof(struct tcp6_request_sock),
72659ecc 700 .rtx_syn_ack = tcp_v6_rtx_synack,
60236fdd
ACM
701 .send_ack = tcp_v6_reqsk_send_ack,
702 .destructor = tcp_v6_reqsk_destructor,
72659ecc
OP
703 .send_reset = tcp_v6_send_reset,
704 .syn_ack_timeout = tcp_syn_ack_timeout,
1da177e4
LT
705};
706
cfb6eeb4 707#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 708static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
cfb6eeb4 709 .md5_lookup = tcp_v6_reqsk_md5_lookup,
e3afe7b7 710 .calc_md5_hash = tcp_v6_md5_hash_skb,
cfb6eeb4 711};
b6332e6c 712#endif
cfb6eeb4 713
626e264d 714static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
b903d324 715 u32 ts, struct tcp_md5sig_key *key, int rst, u8 tclass)
1da177e4 716{
cf533ea5
ED
717 const struct tcphdr *th = tcp_hdr(skb);
718 struct tcphdr *t1;
1da177e4 719 struct sk_buff *buff;
4c9483b2 720 struct flowi6 fl6;
adf30907 721 struct net *net = dev_net(skb_dst(skb)->dev);
e5047992 722 struct sock *ctl_sk = net->ipv6.tcp_sk;
77c676da 723 unsigned int tot_len = sizeof(struct tcphdr);
adf30907 724 struct dst_entry *dst;
81ada62d 725 __be32 *topt;
1da177e4 726
626e264d
IJ
727 if (ts)
728 tot_len += TCPOLEN_TSTAMP_ALIGNED;
cfb6eeb4 729#ifdef CONFIG_TCP_MD5SIG
cfb6eeb4
YH
730 if (key)
731 tot_len += TCPOLEN_MD5SIG_ALIGNED;
732#endif
733
cfb6eeb4 734 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1da177e4 735 GFP_ATOMIC);
1ab1457c
YH
736 if (buff == NULL)
737 return;
1da177e4 738
cfb6eeb4 739 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1da177e4 740
cfb6eeb4 741 t1 = (struct tcphdr *) skb_push(buff, tot_len);
6651ffc8 742 skb_reset_transport_header(buff);
1da177e4
LT
743
744 /* Swap the send and the receive. */
745 memset(t1, 0, sizeof(*t1));
746 t1->dest = th->source;
747 t1->source = th->dest;
cfb6eeb4 748 t1->doff = tot_len / 4;
626e264d
IJ
749 t1->seq = htonl(seq);
750 t1->ack_seq = htonl(ack);
751 t1->ack = !rst || !th->ack;
752 t1->rst = rst;
753 t1->window = htons(win);
1da177e4 754
81ada62d
IJ
755 topt = (__be32 *)(t1 + 1);
756
626e264d
IJ
757 if (ts) {
758 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
759 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
760 *topt++ = htonl(tcp_time_stamp);
761 *topt++ = htonl(ts);
762 }
763
cfb6eeb4
YH
764#ifdef CONFIG_TCP_MD5SIG
765 if (key) {
81ada62d
IJ
766 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
767 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
768 tcp_v6_md5_hash_hdr((__u8 *)topt, key,
78e645cb
IJ
769 &ipv6_hdr(skb)->saddr,
770 &ipv6_hdr(skb)->daddr, t1);
cfb6eeb4
YH
771 }
772#endif
773
4c9483b2 774 memset(&fl6, 0, sizeof(fl6));
4e3fd7a0
AD
775 fl6.daddr = ipv6_hdr(skb)->saddr;
776 fl6.saddr = ipv6_hdr(skb)->daddr;
1da177e4 777
e5700aff
DM
778 buff->ip_summed = CHECKSUM_PARTIAL;
779 buff->csum = 0;
780
4c9483b2 781 __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr);
1da177e4 782
4c9483b2 783 fl6.flowi6_proto = IPPROTO_TCP;
4c675258
AK
784 if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL)
785 fl6.flowi6_oif = inet6_iif(skb);
1958b856
DM
786 fl6.fl6_dport = t1->dest;
787 fl6.fl6_sport = t1->source;
4c9483b2 788 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 789
c20121ae
DL
790 /* Pass a socket to ip6_dst_lookup either it is for RST
791 * Underlying function will use this to retrieve the network
792 * namespace
793 */
4c9483b2 794 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
68d0c6d3
DM
795 if (!IS_ERR(dst)) {
796 skb_dst_set(buff, dst);
b903d324 797 ip6_xmit(ctl_sk, buff, &fl6, NULL, tclass);
68d0c6d3
DM
798 TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
799 if (rst)
800 TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
801 return;
1da177e4
LT
802 }
803
804 kfree_skb(buff);
805}
806
626e264d 807static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
1da177e4 808{
cf533ea5 809 const struct tcphdr *th = tcp_hdr(skb);
626e264d 810 u32 seq = 0, ack_seq = 0;
fa3e5b4e 811 struct tcp_md5sig_key *key = NULL;
658ddaaf
SL
812#ifdef CONFIG_TCP_MD5SIG
813 const __u8 *hash_location = NULL;
814 struct ipv6hdr *ipv6h = ipv6_hdr(skb);
815 unsigned char newhash[16];
816 int genhash;
817 struct sock *sk1 = NULL;
818#endif
1da177e4 819
626e264d 820 if (th->rst)
1da177e4
LT
821 return;
822
626e264d
IJ
823 if (!ipv6_unicast_destination(skb))
824 return;
1da177e4 825
cfb6eeb4 826#ifdef CONFIG_TCP_MD5SIG
658ddaaf
SL
827 hash_location = tcp_parse_md5sig_option(th);
828 if (!sk && hash_location) {
829 /*
830 * active side is lost. Try to find listening socket through
831 * source port, and then find md5 key through listening socket.
832 * we are not loose security here:
833 * Incoming packet is checked with md5 hash with finding key,
834 * no RST generated if md5 hash doesn't match.
835 */
836 sk1 = inet6_lookup_listener(dev_net(skb_dst(skb)->dev),
837 &tcp_hashinfo, &ipv6h->daddr,
838 ntohs(th->source), inet6_iif(skb));
839 if (!sk1)
840 return;
841
842 rcu_read_lock();
843 key = tcp_v6_md5_do_lookup(sk1, &ipv6h->saddr);
844 if (!key)
845 goto release_sk1;
846
847 genhash = tcp_v6_md5_hash_skb(newhash, key, NULL, NULL, skb);
848 if (genhash || memcmp(hash_location, newhash, 16) != 0)
849 goto release_sk1;
850 } else {
851 key = sk ? tcp_v6_md5_do_lookup(sk, &ipv6h->saddr) : NULL;
852 }
cfb6eeb4
YH
853#endif
854
626e264d
IJ
855 if (th->ack)
856 seq = ntohl(th->ack_seq);
857 else
858 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
859 (th->doff << 2);
1da177e4 860
b903d324 861 tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0);
658ddaaf
SL
862
863#ifdef CONFIG_TCP_MD5SIG
864release_sk1:
865 if (sk1) {
866 rcu_read_unlock();
867 sock_put(sk1);
868 }
869#endif
626e264d 870}
1da177e4 871
626e264d 872static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
b903d324 873 struct tcp_md5sig_key *key, u8 tclass)
626e264d 874{
b903d324 875 tcp_v6_send_response(skb, seq, ack, win, ts, key, 0, tclass);
1da177e4
LT
876}
877
878static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
879{
8feaf0c0 880 struct inet_timewait_sock *tw = inet_twsk(sk);
cfb6eeb4 881 struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1da177e4 882
9501f972 883 tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
8feaf0c0 884 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
b903d324
ED
885 tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw),
886 tw->tw_tclass);
1da177e4 887
8feaf0c0 888 inet_twsk_put(tw);
1da177e4
LT
889}
890
6edafaaf
GJ
891static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
892 struct request_sock *req)
1da177e4 893{
9501f972 894 tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
b903d324 895 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), 0);
1da177e4
LT
896}
897
898
899static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
900{
60236fdd 901 struct request_sock *req, **prev;
aa8223c7 902 const struct tcphdr *th = tcp_hdr(skb);
1da177e4
LT
903 struct sock *nsk;
904
905 /* Find possible connection requests. */
8129765a 906 req = inet6_csk_search_req(sk, &prev, th->source,
0660e03f
ACM
907 &ipv6_hdr(skb)->saddr,
908 &ipv6_hdr(skb)->daddr, inet6_iif(skb));
1da177e4 909 if (req)
8336886f 910 return tcp_check_req(sk, skb, req, prev, false);
1da177e4 911
3b1e0a65 912 nsk = __inet6_lookup_established(sock_net(sk), &tcp_hashinfo,
d86e0dac
PE
913 &ipv6_hdr(skb)->saddr, th->source,
914 &ipv6_hdr(skb)->daddr, ntohs(th->dest), inet6_iif(skb));
1da177e4
LT
915
916 if (nsk) {
917 if (nsk->sk_state != TCP_TIME_WAIT) {
918 bh_lock_sock(nsk);
919 return nsk;
920 }
9469c7b4 921 inet_twsk_put(inet_twsk(nsk));
1da177e4
LT
922 return NULL;
923 }
924
c6aefafb 925#ifdef CONFIG_SYN_COOKIES
af9b4738 926 if (!th->syn)
c6aefafb 927 sk = cookie_v6_check(sk, skb);
1da177e4
LT
928#endif
929 return sk;
930}
931
1da177e4
LT
932/* FIXME: this is substantially similar to the ipv4 code.
933 * Can some kind of merge be done? -- erics
934 */
935static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
936{
4957faad 937 struct tcp_extend_values tmp_ext;
e6b4d113 938 struct tcp_options_received tmp_opt;
cf533ea5 939 const u8 *hash_location;
e6b4d113 940 struct request_sock *req;
ca304b61 941 struct inet6_request_sock *treq;
1da177e4 942 struct ipv6_pinfo *np = inet6_sk(sk);
1da177e4 943 struct tcp_sock *tp = tcp_sk(sk);
e6b4d113 944 __u32 isn = TCP_SKB_CB(skb)->when;
493f377d 945 struct dst_entry *dst = NULL;
3840a06e 946 struct flowi6 fl6;
a2a385d6 947 bool want_cookie = false;
1da177e4
LT
948
949 if (skb->protocol == htons(ETH_P_IP))
950 return tcp_v4_conn_request(sk, skb);
951
952 if (!ipv6_unicast_destination(skb))
1ab1457c 953 goto drop;
1da177e4 954
463c84b9 955 if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
946cedcc
ED
956 want_cookie = tcp_syn_flood_action(sk, skb, "TCPv6");
957 if (!want_cookie)
958 goto drop;
1da177e4
LT
959 }
960
463c84b9 961 if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
1da177e4
LT
962 goto drop;
963
ca304b61 964 req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
1da177e4
LT
965 if (req == NULL)
966 goto drop;
967
cfb6eeb4
YH
968#ifdef CONFIG_TCP_MD5SIG
969 tcp_rsk(req)->af_specific = &tcp_request_sock_ipv6_ops;
970#endif
971
1da177e4
LT
972 tcp_clear_options(&tmp_opt);
973 tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
974 tmp_opt.user_mss = tp->rx_opt.user_mss;
2100c8d2 975 tcp_parse_options(skb, &tmp_opt, &hash_location, 0, NULL);
4957faad
WAS
976
977 if (tmp_opt.cookie_plus > 0 &&
978 tmp_opt.saw_tstamp &&
979 !tp->rx_opt.cookie_out_never &&
980 (sysctl_tcp_cookie_size > 0 ||
981 (tp->cookie_values != NULL &&
982 tp->cookie_values->cookie_desired > 0))) {
983 u8 *c;
984 u32 *d;
985 u32 *mess = &tmp_ext.cookie_bakery[COOKIE_DIGEST_WORDS];
986 int l = tmp_opt.cookie_plus - TCPOLEN_COOKIE_BASE;
987
988 if (tcp_cookie_generator(&tmp_ext.cookie_bakery[0]) != 0)
989 goto drop_and_free;
990
991 /* Secret recipe starts with IP addresses */
0eae88f3 992 d = (__force u32 *)&ipv6_hdr(skb)->daddr.s6_addr32[0];
4957faad
WAS
993 *mess++ ^= *d++;
994 *mess++ ^= *d++;
995 *mess++ ^= *d++;
996 *mess++ ^= *d++;
0eae88f3 997 d = (__force u32 *)&ipv6_hdr(skb)->saddr.s6_addr32[0];
4957faad
WAS
998 *mess++ ^= *d++;
999 *mess++ ^= *d++;
1000 *mess++ ^= *d++;
1001 *mess++ ^= *d++;
1002
1003 /* plus variable length Initiator Cookie */
1004 c = (u8 *)mess;
1005 while (l-- > 0)
1006 *c++ ^= *hash_location++;
1da177e4 1007
a2a385d6 1008 want_cookie = false; /* not our kind of cookie */
4957faad
WAS
1009 tmp_ext.cookie_out_never = 0; /* false */
1010 tmp_ext.cookie_plus = tmp_opt.cookie_plus;
1011 } else if (!tp->rx_opt.cookie_in_always) {
1012 /* redundant indications, but ensure initialization. */
1013 tmp_ext.cookie_out_never = 1; /* true */
1014 tmp_ext.cookie_plus = 0;
1015 } else {
1016 goto drop_and_free;
1017 }
1018 tmp_ext.cookie_in_always = tp->rx_opt.cookie_in_always;
1da177e4 1019
4dfc2817 1020 if (want_cookie && !tmp_opt.saw_tstamp)
c6aefafb 1021 tcp_clear_options(&tmp_opt);
c6aefafb 1022
1da177e4
LT
1023 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
1024 tcp_openreq_init(req, &tmp_opt, skb);
1025
ca304b61 1026 treq = inet6_rsk(req);
4e3fd7a0
AD
1027 treq->rmt_addr = ipv6_hdr(skb)->saddr;
1028 treq->loc_addr = ipv6_hdr(skb)->daddr;
172d69e6 1029 if (!want_cookie || tmp_opt.tstamp_ok)
bd14b1b2 1030 TCP_ECN_create_request(req, skb);
c6aefafb 1031
4d0fe50c
ED
1032 treq->iif = sk->sk_bound_dev_if;
1033
1034 /* So that link locals have meaning */
1035 if (!sk->sk_bound_dev_if &&
1036 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1037 treq->iif = inet6_iif(skb);
1038
2bbdf389 1039 if (!isn) {
c6aefafb
GG
1040 if (ipv6_opt_accepted(sk, skb) ||
1041 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1042 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1043 atomic_inc(&skb->users);
1044 treq->pktopts = skb;
1045 }
493f377d
DM
1046
1047 if (want_cookie) {
2bbdf389
FW
1048 isn = cookie_v6_init_sequence(sk, skb, &req->mss);
1049 req->cookie_ts = tmp_opt.tstamp_ok;
493f377d
DM
1050 goto have_isn;
1051 }
1052
1053 /* VJ's idea. We save last timestamp seen
1054 * from the destination in peer table, when entering
1055 * state TIME-WAIT, and check against it before
1056 * accepting new connection request.
1057 *
1058 * If "isn" is not zero, this request hit alive
1059 * timewait bucket, so that all the necessary checks
1060 * are made in the function processing timewait state.
1061 */
1062 if (tmp_opt.saw_tstamp &&
1063 tcp_death_row.sysctl_tw_recycle &&
81166dd6
DM
1064 (dst = inet6_csk_route_req(sk, &fl6, req)) != NULL) {
1065 if (!tcp_peer_is_proven(req, dst, true)) {
493f377d
DM
1066 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
1067 goto drop_and_release;
1068 }
1069 }
1070 /* Kill the following clause, if you dislike this way. */
1071 else if (!sysctl_tcp_syncookies &&
1072 (sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) <
1073 (sysctl_max_syn_backlog >> 2)) &&
81166dd6 1074 !tcp_peer_is_proven(req, dst, false)) {
493f377d
DM
1075 /* Without syncookies last quarter of
1076 * backlog is filled with destinations,
1077 * proven to be alive.
1078 * It means that we continue to communicate
1079 * to destinations, already remembered
1080 * to the moment of synflood.
1081 */
1082 LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open request from %pI6/%u\n",
1083 &treq->rmt_addr, ntohs(tcp_hdr(skb)->source));
1084 goto drop_and_release;
2bbdf389 1085 }
493f377d
DM
1086
1087 isn = tcp_v6_init_sequence(skb);
c6aefafb 1088 }
493f377d 1089have_isn:
2e6599cb 1090 tcp_rsk(req)->snt_isn = isn;
1da177e4 1091
437c5b53
NC
1092 if (security_inet_conn_request(sk, skb, req))
1093 goto drop_and_release;
4237c75c 1094
9f10d3f6 1095 if (tcp_v6_send_synack(sk, dst, &fl6, req,
fff32699
ED
1096 (struct request_values *)&tmp_ext,
1097 skb_get_queue_mapping(skb)) ||
4957faad 1098 want_cookie)
e6b4d113 1099 goto drop_and_free;
1da177e4 1100
016818d0 1101 tcp_rsk(req)->snt_synack = tcp_time_stamp;
8336886f 1102 tcp_rsk(req)->listener = NULL;
e6b4d113
WAS
1103 inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
1104 return 0;
1da177e4 1105
493f377d
DM
1106drop_and_release:
1107 dst_release(dst);
e6b4d113
WAS
1108drop_and_free:
1109 reqsk_free(req);
1da177e4 1110drop:
1da177e4
LT
1111 return 0; /* don't send reset */
1112}
1113
1114static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
60236fdd 1115 struct request_sock *req,
1da177e4
LT
1116 struct dst_entry *dst)
1117{
78d15e82 1118 struct inet6_request_sock *treq;
1da177e4
LT
1119 struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1120 struct tcp6_sock *newtcp6sk;
1121 struct inet_sock *newinet;
1122 struct tcp_sock *newtp;
1123 struct sock *newsk;
cfb6eeb4
YH
1124#ifdef CONFIG_TCP_MD5SIG
1125 struct tcp_md5sig_key *key;
1126#endif
3840a06e 1127 struct flowi6 fl6;
1da177e4
LT
1128
1129 if (skb->protocol == htons(ETH_P_IP)) {
1130 /*
1131 * v6 mapped
1132 */
1133
1134 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
1135
1ab1457c 1136 if (newsk == NULL)
1da177e4
LT
1137 return NULL;
1138
1139 newtcp6sk = (struct tcp6_sock *)newsk;
1140 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1141
1142 newinet = inet_sk(newsk);
1143 newnp = inet6_sk(newsk);
1144 newtp = tcp_sk(newsk);
1145
1146 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1147
c720c7e8 1148 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr);
1da177e4 1149
c720c7e8 1150 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1da177e4 1151
4e3fd7a0 1152 newnp->rcv_saddr = newnp->saddr;
1da177e4 1153
8292a17a 1154 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1da177e4 1155 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
cfb6eeb4
YH
1156#ifdef CONFIG_TCP_MD5SIG
1157 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1158#endif
1159
676a1184
YZ
1160 newnp->ipv6_ac_list = NULL;
1161 newnp->ipv6_fl_list = NULL;
1da177e4
LT
1162 newnp->pktoptions = NULL;
1163 newnp->opt = NULL;
505cbfc5 1164 newnp->mcast_oif = inet6_iif(skb);
0660e03f 1165 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
4c507d28 1166 newnp->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
1da177e4 1167
e6848976
ACM
1168 /*
1169 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
1170 * here, tcp_create_openreq_child now does this for us, see the comment in
1171 * that function for the gory details. -acme
1da177e4 1172 */
1da177e4
LT
1173
1174 /* It is tricky place. Until this moment IPv4 tcp
8292a17a 1175 worked with IPv6 icsk.icsk_af_ops.
1da177e4
LT
1176 Sync it now.
1177 */
d83d8461 1178 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1da177e4
LT
1179
1180 return newsk;
1181 }
1182
78d15e82 1183 treq = inet6_rsk(req);
1da177e4
LT
1184
1185 if (sk_acceptq_is_full(sk))
1186 goto out_overflow;
1187
493f377d 1188 if (!dst) {
3840a06e 1189 dst = inet6_csk_route_req(sk, &fl6, req);
493f377d 1190 if (!dst)
1da177e4 1191 goto out;
1ab1457c 1192 }
1da177e4
LT
1193
1194 newsk = tcp_create_openreq_child(sk, req, skb);
1195 if (newsk == NULL)
093d2823 1196 goto out_nonewsk;
1da177e4 1197
e6848976
ACM
1198 /*
1199 * No need to charge this sock to the relevant IPv6 refcnt debug socks
1200 * count here, tcp_create_openreq_child now does this for us, see the
1201 * comment in that function for the gory details. -acme
1202 */
1da177e4 1203
59eed279 1204 newsk->sk_gso_type = SKB_GSO_TCPV6;
8e1ef0a9 1205 __ip6_dst_store(newsk, dst, NULL, NULL);
fae6ef87 1206 inet6_sk_rx_dst_set(newsk, skb);
1da177e4
LT
1207
1208 newtcp6sk = (struct tcp6_sock *)newsk;
1209 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1210
1211 newtp = tcp_sk(newsk);
1212 newinet = inet_sk(newsk);
1213 newnp = inet6_sk(newsk);
1214
1215 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1216
4e3fd7a0
AD
1217 newnp->daddr = treq->rmt_addr;
1218 newnp->saddr = treq->loc_addr;
1219 newnp->rcv_saddr = treq->loc_addr;
2e6599cb 1220 newsk->sk_bound_dev_if = treq->iif;
1da177e4 1221
1ab1457c 1222 /* Now IPv6 options...
1da177e4
LT
1223
1224 First: no IPv4 options.
1225 */
f6d8bd05 1226 newinet->inet_opt = NULL;
676a1184 1227 newnp->ipv6_ac_list = NULL;
d35690be 1228 newnp->ipv6_fl_list = NULL;
1da177e4
LT
1229
1230 /* Clone RX bits */
1231 newnp->rxopt.all = np->rxopt.all;
1232
1233 /* Clone pktoptions received with SYN */
1234 newnp->pktoptions = NULL;
2e6599cb 1235 if (treq->pktopts != NULL) {
99a1dec7
MG
1236 newnp->pktoptions = skb_clone(treq->pktopts,
1237 sk_gfp_atomic(sk, GFP_ATOMIC));
ab185d7b 1238 consume_skb(treq->pktopts);
2e6599cb 1239 treq->pktopts = NULL;
1da177e4
LT
1240 if (newnp->pktoptions)
1241 skb_set_owner_r(newnp->pktoptions, newsk);
1242 }
1243 newnp->opt = NULL;
505cbfc5 1244 newnp->mcast_oif = inet6_iif(skb);
0660e03f 1245 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
4c507d28 1246 newnp->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
1da177e4
LT
1247
1248 /* Clone native IPv6 options from listening socket (if any)
1249
1250 Yes, keeping reference count would be much more clever,
1251 but we make one more one thing there: reattach optmem
1252 to newsk.
1253 */
43264e0b
RL
1254 if (np->opt)
1255 newnp->opt = ipv6_dup_options(newsk, np->opt);
1da177e4 1256
d83d8461 1257 inet_csk(newsk)->icsk_ext_hdr_len = 0;
1da177e4 1258 if (newnp->opt)
d83d8461
ACM
1259 inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
1260 newnp->opt->opt_flen);
1da177e4 1261
5d424d5a 1262 tcp_mtup_init(newsk);
1da177e4 1263 tcp_sync_mss(newsk, dst_mtu(dst));
0dbaee3b 1264 newtp->advmss = dst_metric_advmss(dst);
d135c522
NC
1265 if (tcp_sk(sk)->rx_opt.user_mss &&
1266 tcp_sk(sk)->rx_opt.user_mss < newtp->advmss)
1267 newtp->advmss = tcp_sk(sk)->rx_opt.user_mss;
1268
1da177e4 1269 tcp_initialize_rcv_mss(newsk);
623df484 1270 tcp_synack_rtt_meas(newsk, req);
e6c022a4 1271 newtp->total_retrans = req->num_retrans;
1da177e4 1272
c720c7e8
ED
1273 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
1274 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
1da177e4 1275
cfb6eeb4
YH
1276#ifdef CONFIG_TCP_MD5SIG
1277 /* Copy over the MD5 key from the original socket */
1278 if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) {
1279 /* We're using one, so create a matching key
1280 * on the newsk structure. If we fail to get
1281 * memory, then we end up not copying the key
1282 * across. Shucks.
1283 */
a915da9b 1284 tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newnp->daddr,
99a1dec7
MG
1285 AF_INET6, key->key, key->keylen,
1286 sk_gfp_atomic(sk, GFP_ATOMIC));
cfb6eeb4
YH
1287 }
1288#endif
1289
093d2823
BS
1290 if (__inet_inherit_port(sk, newsk) < 0) {
1291 sock_put(newsk);
1292 goto out;
1293 }
9327f705 1294 __inet6_hash(newsk, NULL);
1da177e4
LT
1295
1296 return newsk;
1297
1298out_overflow:
de0744af 1299 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
093d2823 1300out_nonewsk:
1da177e4 1301 dst_release(dst);
093d2823
BS
1302out:
1303 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1da177e4
LT
1304 return NULL;
1305}
1306
b51655b9 1307static __sum16 tcp_v6_checksum_init(struct sk_buff *skb)
1da177e4 1308{
84fa7933 1309 if (skb->ip_summed == CHECKSUM_COMPLETE) {
684f2176 1310 if (!tcp_v6_check(skb->len, &ipv6_hdr(skb)->saddr,
0660e03f 1311 &ipv6_hdr(skb)->daddr, skb->csum)) {
fb286bb2 1312 skb->ip_summed = CHECKSUM_UNNECESSARY;
1da177e4 1313 return 0;
fb286bb2 1314 }
1da177e4 1315 }
fb286bb2 1316
684f2176 1317 skb->csum = ~csum_unfold(tcp_v6_check(skb->len,
0660e03f
ACM
1318 &ipv6_hdr(skb)->saddr,
1319 &ipv6_hdr(skb)->daddr, 0));
fb286bb2 1320
1da177e4 1321 if (skb->len <= 76) {
fb286bb2 1322 return __skb_checksum_complete(skb);
1da177e4
LT
1323 }
1324 return 0;
1325}
1326
1327/* The socket must have it's spinlock held when we get
1328 * here.
1329 *
1330 * We have a potential double-lock case here, so even when
1331 * doing backlog processing we use the BH locking scheme.
1332 * This is because we cannot sleep with the original spinlock
1333 * held.
1334 */
1335static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1336{
1337 struct ipv6_pinfo *np = inet6_sk(sk);
1338 struct tcp_sock *tp;
1339 struct sk_buff *opt_skb = NULL;
1340
1341 /* Imagine: socket is IPv6. IPv4 packet arrives,
1342 goes to IPv4 receive handler and backlogged.
1343 From backlog it always goes here. Kerboom...
1344 Fortunately, tcp_rcv_established and rcv_established
1345 handle them correctly, but it is not case with
1346 tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK
1347 */
1348
1349 if (skb->protocol == htons(ETH_P_IP))
1350 return tcp_v4_do_rcv(sk, skb);
1351
cfb6eeb4
YH
1352#ifdef CONFIG_TCP_MD5SIG
1353 if (tcp_v6_inbound_md5_hash (sk, skb))
1354 goto discard;
1355#endif
1356
fda9ef5d 1357 if (sk_filter(sk, skb))
1da177e4
LT
1358 goto discard;
1359
1360 /*
1361 * socket locking is here for SMP purposes as backlog rcv
1362 * is currently called with bh processing disabled.
1363 */
1364
1365 /* Do Stevens' IPV6_PKTOPTIONS.
1366
1367 Yes, guys, it is the only place in our code, where we
1368 may make it not affecting IPv4.
1369 The rest of code is protocol independent,
1370 and I do not like idea to uglify IPv4.
1371
1372 Actually, all the idea behind IPV6_PKTOPTIONS
1373 looks not very well thought. For now we latch
1374 options, received in the last packet, enqueued
1375 by tcp. Feel free to propose better solution.
1ab1457c 1376 --ANK (980728)
1da177e4
LT
1377 */
1378 if (np->rxopt.all)
99a1dec7 1379 opt_skb = skb_clone(skb, sk_gfp_atomic(sk, GFP_ATOMIC));
1da177e4
LT
1380
1381 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
5d299f3d
ED
1382 struct dst_entry *dst = sk->sk_rx_dst;
1383
bdeab991 1384 sock_rps_save_rxhash(sk, skb);
5d299f3d
ED
1385 if (dst) {
1386 if (inet_sk(sk)->rx_dst_ifindex != skb->skb_iif ||
1387 dst->ops->check(dst, np->rx_dst_cookie) == NULL) {
1388 dst_release(dst);
1389 sk->sk_rx_dst = NULL;
1390 }
1391 }
1392
aa8223c7 1393 if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len))
1da177e4 1394 goto reset;
1da177e4
LT
1395 if (opt_skb)
1396 goto ipv6_pktoptions;
1397 return 0;
1398 }
1399
ab6a5bb6 1400 if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb))
1da177e4
LT
1401 goto csum_err;
1402
1ab1457c 1403 if (sk->sk_state == TCP_LISTEN) {
1da177e4
LT
1404 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1405 if (!nsk)
1406 goto discard;
1407
1408 /*
1409 * Queue it on the new socket if the new socket is active,
1410 * otherwise we just shortcircuit this and continue with
1411 * the new socket..
1412 */
1ab1457c 1413 if(nsk != sk) {
bdeab991 1414 sock_rps_save_rxhash(nsk, skb);
1da177e4
LT
1415 if (tcp_child_process(sk, nsk, skb))
1416 goto reset;
1417 if (opt_skb)
1418 __kfree_skb(opt_skb);
1419 return 0;
1420 }
47482f13 1421 } else
bdeab991 1422 sock_rps_save_rxhash(sk, skb);
1da177e4 1423
aa8223c7 1424 if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len))
1da177e4 1425 goto reset;
1da177e4
LT
1426 if (opt_skb)
1427 goto ipv6_pktoptions;
1428 return 0;
1429
1430reset:
cfb6eeb4 1431 tcp_v6_send_reset(sk, skb);
1da177e4
LT
1432discard:
1433 if (opt_skb)
1434 __kfree_skb(opt_skb);
1435 kfree_skb(skb);
1436 return 0;
1437csum_err:
63231bdd 1438 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
1da177e4
LT
1439 goto discard;
1440
1441
1442ipv6_pktoptions:
1443 /* Do you ask, what is it?
1444
1445 1. skb was enqueued by tcp.
1446 2. skb is added to tail of read queue, rather than out of order.
1447 3. socket is not in passive state.
1448 4. Finally, it really contains options, which user wants to receive.
1449 */
1450 tp = tcp_sk(sk);
1451 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1452 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
333fad53 1453 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
505cbfc5 1454 np->mcast_oif = inet6_iif(opt_skb);
333fad53 1455 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
0660e03f 1456 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
4c507d28
JB
1457 if (np->rxopt.bits.rxtclass)
1458 np->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
1da177e4
LT
1459 if (ipv6_opt_accepted(sk, opt_skb)) {
1460 skb_set_owner_r(opt_skb, sk);
1461 opt_skb = xchg(&np->pktoptions, opt_skb);
1462 } else {
1463 __kfree_skb(opt_skb);
1464 opt_skb = xchg(&np->pktoptions, NULL);
1465 }
1466 }
1467
800d55f1 1468 kfree_skb(opt_skb);
1da177e4
LT
1469 return 0;
1470}
1471
e5bbef20 1472static int tcp_v6_rcv(struct sk_buff *skb)
1da177e4 1473{
cf533ea5 1474 const struct tcphdr *th;
b71d1d42 1475 const struct ipv6hdr *hdr;
1da177e4
LT
1476 struct sock *sk;
1477 int ret;
a86b1e30 1478 struct net *net = dev_net(skb->dev);
1da177e4
LT
1479
1480 if (skb->pkt_type != PACKET_HOST)
1481 goto discard_it;
1482
1483 /*
1484 * Count it even if it's bad.
1485 */
63231bdd 1486 TCP_INC_STATS_BH(net, TCP_MIB_INSEGS);
1da177e4
LT
1487
1488 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1489 goto discard_it;
1490
aa8223c7 1491 th = tcp_hdr(skb);
1da177e4
LT
1492
1493 if (th->doff < sizeof(struct tcphdr)/4)
1494 goto bad_packet;
1495 if (!pskb_may_pull(skb, th->doff*4))
1496 goto discard_it;
1497
60476372 1498 if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb))
1da177e4
LT
1499 goto bad_packet;
1500
aa8223c7 1501 th = tcp_hdr(skb);
e802af9c 1502 hdr = ipv6_hdr(skb);
1da177e4
LT
1503 TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1504 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1505 skb->len - th->doff*4);
1506 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1507 TCP_SKB_CB(skb)->when = 0;
b82d1bb4 1508 TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr);
1da177e4
LT
1509 TCP_SKB_CB(skb)->sacked = 0;
1510
9a1f27c4 1511 sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
1da177e4
LT
1512 if (!sk)
1513 goto no_tcp_socket;
1514
1515process:
1516 if (sk->sk_state == TCP_TIME_WAIT)
1517 goto do_time_wait;
1518
e802af9c
SH
1519 if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) {
1520 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
1521 goto discard_and_relse;
1522 }
1523
1da177e4
LT
1524 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1525 goto discard_and_relse;
1526
fda9ef5d 1527 if (sk_filter(sk, skb))
1da177e4
LT
1528 goto discard_and_relse;
1529
1530 skb->dev = NULL;
1531
293b9c42 1532 bh_lock_sock_nested(sk);
1da177e4
LT
1533 ret = 0;
1534 if (!sock_owned_by_user(sk)) {
1a2449a8 1535#ifdef CONFIG_NET_DMA
1ab1457c 1536 struct tcp_sock *tp = tcp_sk(sk);
b4caea8a 1537 if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
a2bd1140 1538 tp->ucopy.dma_chan = net_dma_find_channel();
1ab1457c
YH
1539 if (tp->ucopy.dma_chan)
1540 ret = tcp_v6_do_rcv(sk, skb);
1541 else
1a2449a8
CL
1542#endif
1543 {
1544 if (!tcp_prequeue(sk, skb))
1545 ret = tcp_v6_do_rcv(sk, skb);
1546 }
da882c1f
ED
1547 } else if (unlikely(sk_add_backlog(sk, skb,
1548 sk->sk_rcvbuf + sk->sk_sndbuf))) {
6b03a53a 1549 bh_unlock_sock(sk);
6cce09f8 1550 NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP);
6b03a53a
ZY
1551 goto discard_and_relse;
1552 }
1da177e4
LT
1553 bh_unlock_sock(sk);
1554
1555 sock_put(sk);
1556 return ret ? -1 : 0;
1557
1558no_tcp_socket:
1559 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1560 goto discard_it;
1561
1562 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1563bad_packet:
63231bdd 1564 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
1da177e4 1565 } else {
cfb6eeb4 1566 tcp_v6_send_reset(NULL, skb);
1da177e4
LT
1567 }
1568
1569discard_it:
1570
1571 /*
1572 * Discard frame
1573 */
1574
1575 kfree_skb(skb);
1576 return 0;
1577
1578discard_and_relse:
1579 sock_put(sk);
1580 goto discard_it;
1581
1582do_time_wait:
1583 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
9469c7b4 1584 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
1585 goto discard_it;
1586 }
1587
1588 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
63231bdd 1589 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
9469c7b4 1590 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
1591 goto discard_it;
1592 }
1593
9469c7b4 1594 switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1da177e4
LT
1595 case TCP_TW_SYN:
1596 {
1597 struct sock *sk2;
1598
c346dca1 1599 sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
0660e03f 1600 &ipv6_hdr(skb)->daddr,
505cbfc5 1601 ntohs(th->dest), inet6_iif(skb));
1da177e4 1602 if (sk2 != NULL) {
295ff7ed
ACM
1603 struct inet_timewait_sock *tw = inet_twsk(sk);
1604 inet_twsk_deschedule(tw, &tcp_death_row);
1605 inet_twsk_put(tw);
1da177e4
LT
1606 sk = sk2;
1607 goto process;
1608 }
1609 /* Fall through to ACK */
1610 }
1611 case TCP_TW_ACK:
1612 tcp_v6_timewait_ack(sk, skb);
1613 break;
1614 case TCP_TW_RST:
1615 goto no_tcp_socket;
1616 case TCP_TW_SUCCESS:;
1617 }
1618 goto discard_it;
1619}
1620
c7109986
ED
1621static void tcp_v6_early_demux(struct sk_buff *skb)
1622{
1623 const struct ipv6hdr *hdr;
1624 const struct tcphdr *th;
1625 struct sock *sk;
1626
1627 if (skb->pkt_type != PACKET_HOST)
1628 return;
1629
1630 if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct tcphdr)))
1631 return;
1632
1633 hdr = ipv6_hdr(skb);
1634 th = tcp_hdr(skb);
1635
1636 if (th->doff < sizeof(struct tcphdr) / 4)
1637 return;
1638
1639 sk = __inet6_lookup_established(dev_net(skb->dev), &tcp_hashinfo,
1640 &hdr->saddr, th->source,
1641 &hdr->daddr, ntohs(th->dest),
1642 inet6_iif(skb));
1643 if (sk) {
1644 skb->sk = sk;
1645 skb->destructor = sock_edemux;
1646 if (sk->sk_state != TCP_TIME_WAIT) {
1647 struct dst_entry *dst = sk->sk_rx_dst;
f3f12135 1648
c7109986 1649 if (dst)
5d299f3d 1650 dst = dst_check(dst, inet6_sk(sk)->rx_dst_cookie);
c7109986 1651 if (dst &&
f3f12135 1652 inet_sk(sk)->rx_dst_ifindex == skb->skb_iif)
c7109986
ED
1653 skb_dst_set_noref(skb, dst);
1654 }
1655 }
1656}
1657
ccb7c410
DM
1658static struct timewait_sock_ops tcp6_timewait_sock_ops = {
1659 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
1660 .twsk_unique = tcp_twsk_unique,
1661 .twsk_destructor= tcp_twsk_destructor,
ccb7c410
DM
1662};
1663
3b401a81 1664static const struct inet_connection_sock_af_ops ipv6_specific = {
543d9cfe
ACM
1665 .queue_xmit = inet6_csk_xmit,
1666 .send_check = tcp_v6_send_check,
1667 .rebuild_header = inet6_sk_rebuild_header,
5d299f3d 1668 .sk_rx_dst_set = inet6_sk_rx_dst_set,
543d9cfe
ACM
1669 .conn_request = tcp_v6_conn_request,
1670 .syn_recv_sock = tcp_v6_syn_recv_sock,
543d9cfe 1671 .net_header_len = sizeof(struct ipv6hdr),
67469601 1672 .net_frag_header_len = sizeof(struct frag_hdr),
543d9cfe
ACM
1673 .setsockopt = ipv6_setsockopt,
1674 .getsockopt = ipv6_getsockopt,
1675 .addr2sockaddr = inet6_csk_addr2sockaddr,
1676 .sockaddr_len = sizeof(struct sockaddr_in6),
ab1e0a13 1677 .bind_conflict = inet6_csk_bind_conflict,
3fdadf7d 1678#ifdef CONFIG_COMPAT
543d9cfe
ACM
1679 .compat_setsockopt = compat_ipv6_setsockopt,
1680 .compat_getsockopt = compat_ipv6_getsockopt,
3fdadf7d 1681#endif
1da177e4
LT
1682};
1683
cfb6eeb4 1684#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 1685static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
cfb6eeb4 1686 .md5_lookup = tcp_v6_md5_lookup,
49a72dfb 1687 .calc_md5_hash = tcp_v6_md5_hash_skb,
cfb6eeb4 1688 .md5_parse = tcp_v6_parse_md5_keys,
cfb6eeb4 1689};
a928630a 1690#endif
cfb6eeb4 1691
1da177e4
LT
1692/*
1693 * TCP over IPv4 via INET6 API
1694 */
1695
3b401a81 1696static const struct inet_connection_sock_af_ops ipv6_mapped = {
543d9cfe
ACM
1697 .queue_xmit = ip_queue_xmit,
1698 .send_check = tcp_v4_send_check,
1699 .rebuild_header = inet_sk_rebuild_header,
63d02d15 1700 .sk_rx_dst_set = inet_sk_rx_dst_set,
543d9cfe
ACM
1701 .conn_request = tcp_v6_conn_request,
1702 .syn_recv_sock = tcp_v6_syn_recv_sock,
543d9cfe
ACM
1703 .net_header_len = sizeof(struct iphdr),
1704 .setsockopt = ipv6_setsockopt,
1705 .getsockopt = ipv6_getsockopt,
1706 .addr2sockaddr = inet6_csk_addr2sockaddr,
1707 .sockaddr_len = sizeof(struct sockaddr_in6),
ab1e0a13 1708 .bind_conflict = inet6_csk_bind_conflict,
3fdadf7d 1709#ifdef CONFIG_COMPAT
543d9cfe
ACM
1710 .compat_setsockopt = compat_ipv6_setsockopt,
1711 .compat_getsockopt = compat_ipv6_getsockopt,
3fdadf7d 1712#endif
1da177e4
LT
1713};
1714
cfb6eeb4 1715#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 1716static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
cfb6eeb4 1717 .md5_lookup = tcp_v4_md5_lookup,
49a72dfb 1718 .calc_md5_hash = tcp_v4_md5_hash_skb,
cfb6eeb4 1719 .md5_parse = tcp_v6_parse_md5_keys,
cfb6eeb4 1720};
a928630a 1721#endif
cfb6eeb4 1722
1da177e4
LT
1723/* NOTE: A lot of things set to zero explicitly by call to
1724 * sk_alloc() so need not be done here.
1725 */
1726static int tcp_v6_init_sock(struct sock *sk)
1727{
6687e988 1728 struct inet_connection_sock *icsk = inet_csk(sk);
1da177e4 1729
900f65d3 1730 tcp_init_sock(sk);
1da177e4 1731
8292a17a 1732 icsk->icsk_af_ops = &ipv6_specific;
1da177e4 1733
cfb6eeb4 1734#ifdef CONFIG_TCP_MD5SIG
ac807fa8 1735 tcp_sk(sk)->af_specific = &tcp_sock_ipv6_specific;
cfb6eeb4
YH
1736#endif
1737
1da177e4
LT
1738 return 0;
1739}
1740
7d06b2e0 1741static void tcp_v6_destroy_sock(struct sock *sk)
1da177e4 1742{
1da177e4 1743 tcp_v4_destroy_sock(sk);
7d06b2e0 1744 inet6_destroy_sock(sk);
1da177e4
LT
1745}
1746
952a10be 1747#ifdef CONFIG_PROC_FS
1da177e4 1748/* Proc filesystem TCPv6 sock list dumping. */
1ab1457c 1749static void get_openreq6(struct seq_file *seq,
a7cb5a49 1750 const struct sock *sk, struct request_sock *req, int i, kuid_t uid)
1da177e4 1751{
1da177e4 1752 int ttd = req->expires - jiffies;
b71d1d42
ED
1753 const struct in6_addr *src = &inet6_rsk(req)->loc_addr;
1754 const struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
1da177e4
LT
1755
1756 if (ttd < 0)
1757 ttd = 0;
1758
1da177e4
LT
1759 seq_printf(seq,
1760 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
71338aa7 1761 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK\n",
1da177e4
LT
1762 i,
1763 src->s6_addr32[0], src->s6_addr32[1],
1764 src->s6_addr32[2], src->s6_addr32[3],
fd507037 1765 ntohs(inet_rsk(req)->loc_port),
1da177e4
LT
1766 dest->s6_addr32[0], dest->s6_addr32[1],
1767 dest->s6_addr32[2], dest->s6_addr32[3],
2e6599cb 1768 ntohs(inet_rsk(req)->rmt_port),
1da177e4
LT
1769 TCP_SYN_RECV,
1770 0,0, /* could print option size, but that is af dependent. */
1ab1457c
YH
1771 1, /* timers active (only the expire timer) */
1772 jiffies_to_clock_t(ttd),
e6c022a4 1773 req->num_timeout,
a7cb5a49 1774 from_kuid_munged(seq_user_ns(seq), uid),
1ab1457c 1775 0, /* non standard timer */
1da177e4
LT
1776 0, /* open_requests have no inode */
1777 0, req);
1778}
1779
1780static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1781{
b71d1d42 1782 const struct in6_addr *dest, *src;
1da177e4
LT
1783 __u16 destp, srcp;
1784 int timer_active;
1785 unsigned long timer_expires;
cf533ea5
ED
1786 const struct inet_sock *inet = inet_sk(sp);
1787 const struct tcp_sock *tp = tcp_sk(sp);
463c84b9 1788 const struct inet_connection_sock *icsk = inet_csk(sp);
cf533ea5 1789 const struct ipv6_pinfo *np = inet6_sk(sp);
1da177e4
LT
1790
1791 dest = &np->daddr;
1792 src = &np->rcv_saddr;
c720c7e8
ED
1793 destp = ntohs(inet->inet_dport);
1794 srcp = ntohs(inet->inet_sport);
463c84b9
ACM
1795
1796 if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
1da177e4 1797 timer_active = 1;
463c84b9
ACM
1798 timer_expires = icsk->icsk_timeout;
1799 } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
1da177e4 1800 timer_active = 4;
463c84b9 1801 timer_expires = icsk->icsk_timeout;
1da177e4
LT
1802 } else if (timer_pending(&sp->sk_timer)) {
1803 timer_active = 2;
1804 timer_expires = sp->sk_timer.expires;
1805 } else {
1806 timer_active = 0;
1807 timer_expires = jiffies;
1808 }
1809
1810 seq_printf(seq,
1811 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
71338aa7 1812 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %pK %lu %lu %u %u %d\n",
1da177e4
LT
1813 i,
1814 src->s6_addr32[0], src->s6_addr32[1],
1815 src->s6_addr32[2], src->s6_addr32[3], srcp,
1816 dest->s6_addr32[0], dest->s6_addr32[1],
1817 dest->s6_addr32[2], dest->s6_addr32[3], destp,
1ab1457c 1818 sp->sk_state,
47da8ee6
SS
1819 tp->write_seq-tp->snd_una,
1820 (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
1da177e4 1821 timer_active,
a399a805 1822 jiffies_delta_to_clock_t(timer_expires - jiffies),
463c84b9 1823 icsk->icsk_retransmits,
a7cb5a49 1824 from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)),
6687e988 1825 icsk->icsk_probes_out,
1da177e4
LT
1826 sock_i_ino(sp),
1827 atomic_read(&sp->sk_refcnt), sp,
7be87351
SH
1828 jiffies_to_clock_t(icsk->icsk_rto),
1829 jiffies_to_clock_t(icsk->icsk_ack.ato),
463c84b9 1830 (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong,
0b6a05c1
IJ
1831 tp->snd_cwnd,
1832 tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh
1da177e4
LT
1833 );
1834}
1835
1ab1457c 1836static void get_timewait6_sock(struct seq_file *seq,
8feaf0c0 1837 struct inet_timewait_sock *tw, int i)
1da177e4 1838{
b71d1d42 1839 const struct in6_addr *dest, *src;
1da177e4 1840 __u16 destp, srcp;
cf533ea5 1841 const struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
a399a805 1842 long delta = tw->tw_ttd - jiffies;
1da177e4 1843
0fa1a53e
ACM
1844 dest = &tw6->tw_v6_daddr;
1845 src = &tw6->tw_v6_rcv_saddr;
1da177e4
LT
1846 destp = ntohs(tw->tw_dport);
1847 srcp = ntohs(tw->tw_sport);
1848
1849 seq_printf(seq,
1850 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
71338aa7 1851 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK\n",
1da177e4
LT
1852 i,
1853 src->s6_addr32[0], src->s6_addr32[1],
1854 src->s6_addr32[2], src->s6_addr32[3], srcp,
1855 dest->s6_addr32[0], dest->s6_addr32[1],
1856 dest->s6_addr32[2], dest->s6_addr32[3], destp,
1857 tw->tw_substate, 0, 0,
a399a805 1858 3, jiffies_delta_to_clock_t(delta), 0, 0, 0, 0,
1da177e4
LT
1859 atomic_read(&tw->tw_refcnt), tw);
1860}
1861
1da177e4
LT
1862static int tcp6_seq_show(struct seq_file *seq, void *v)
1863{
1864 struct tcp_iter_state *st;
1865
1866 if (v == SEQ_START_TOKEN) {
1867 seq_puts(seq,
1868 " sl "
1869 "local_address "
1870 "remote_address "
1871 "st tx_queue rx_queue tr tm->when retrnsmt"
1872 " uid timeout inode\n");
1873 goto out;
1874 }
1875 st = seq->private;
1876
1877 switch (st->state) {
1878 case TCP_SEQ_STATE_LISTENING:
1879 case TCP_SEQ_STATE_ESTABLISHED:
1880 get_tcp6_sock(seq, v, st->num);
1881 break;
1882 case TCP_SEQ_STATE_OPENREQ:
1883 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
1884 break;
1885 case TCP_SEQ_STATE_TIME_WAIT:
1886 get_timewait6_sock(seq, v, st->num);
1887 break;
1888 }
1889out:
1890 return 0;
1891}
1892
73cb88ec
AV
1893static const struct file_operations tcp6_afinfo_seq_fops = {
1894 .owner = THIS_MODULE,
1895 .open = tcp_seq_open,
1896 .read = seq_read,
1897 .llseek = seq_lseek,
1898 .release = seq_release_net
1899};
1900
1da177e4 1901static struct tcp_seq_afinfo tcp6_seq_afinfo = {
1da177e4
LT
1902 .name = "tcp6",
1903 .family = AF_INET6,
73cb88ec 1904 .seq_fops = &tcp6_afinfo_seq_fops,
9427c4b3
DL
1905 .seq_ops = {
1906 .show = tcp6_seq_show,
1907 },
1da177e4
LT
1908};
1909
2c8c1e72 1910int __net_init tcp6_proc_init(struct net *net)
1da177e4 1911{
6f8b13bc 1912 return tcp_proc_register(net, &tcp6_seq_afinfo);
1da177e4
LT
1913}
1914
6f8b13bc 1915void tcp6_proc_exit(struct net *net)
1da177e4 1916{
6f8b13bc 1917 tcp_proc_unregister(net, &tcp6_seq_afinfo);
1da177e4
LT
1918}
1919#endif
1920
1921struct proto tcpv6_prot = {
1922 .name = "TCPv6",
1923 .owner = THIS_MODULE,
1924 .close = tcp_close,
1925 .connect = tcp_v6_connect,
1926 .disconnect = tcp_disconnect,
463c84b9 1927 .accept = inet_csk_accept,
1da177e4
LT
1928 .ioctl = tcp_ioctl,
1929 .init = tcp_v6_init_sock,
1930 .destroy = tcp_v6_destroy_sock,
1931 .shutdown = tcp_shutdown,
1932 .setsockopt = tcp_setsockopt,
1933 .getsockopt = tcp_getsockopt,
1da177e4 1934 .recvmsg = tcp_recvmsg,
7ba42910
CG
1935 .sendmsg = tcp_sendmsg,
1936 .sendpage = tcp_sendpage,
1da177e4 1937 .backlog_rcv = tcp_v6_do_rcv,
46d3ceab 1938 .release_cb = tcp_release_cb,
563d34d0 1939 .mtu_reduced = tcp_v6_mtu_reduced,
1da177e4 1940 .hash = tcp_v6_hash,
ab1e0a13
ACM
1941 .unhash = inet_unhash,
1942 .get_port = inet_csk_get_port,
1da177e4
LT
1943 .enter_memory_pressure = tcp_enter_memory_pressure,
1944 .sockets_allocated = &tcp_sockets_allocated,
1945 .memory_allocated = &tcp_memory_allocated,
1946 .memory_pressure = &tcp_memory_pressure,
0a5578cf 1947 .orphan_count = &tcp_orphan_count,
1da177e4
LT
1948 .sysctl_wmem = sysctl_tcp_wmem,
1949 .sysctl_rmem = sysctl_tcp_rmem,
1950 .max_header = MAX_TCP_HEADER,
1951 .obj_size = sizeof(struct tcp6_sock),
3ab5aee7 1952 .slab_flags = SLAB_DESTROY_BY_RCU,
6d6ee43e 1953 .twsk_prot = &tcp6_timewait_sock_ops,
60236fdd 1954 .rsk_prot = &tcp6_request_sock_ops,
39d8cda7 1955 .h.hashinfo = &tcp_hashinfo,
7ba42910 1956 .no_autobind = true,
543d9cfe
ACM
1957#ifdef CONFIG_COMPAT
1958 .compat_setsockopt = compat_tcp_setsockopt,
1959 .compat_getsockopt = compat_tcp_getsockopt,
1960#endif
c255a458 1961#ifdef CONFIG_MEMCG_KMEM
d1a4c0b3
GC
1962 .proto_cgroup = tcp_proto_cgroup,
1963#endif
1da177e4
LT
1964};
1965
41135cc8 1966static const struct inet6_protocol tcpv6_protocol = {
c7109986 1967 .early_demux = tcp_v6_early_demux,
1da177e4
LT
1968 .handler = tcp_v6_rcv,
1969 .err_handler = tcp_v6_err,
1970 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
1971};
1972
1da177e4
LT
1973static struct inet_protosw tcpv6_protosw = {
1974 .type = SOCK_STREAM,
1975 .protocol = IPPROTO_TCP,
1976 .prot = &tcpv6_prot,
1977 .ops = &inet6_stream_ops,
1da177e4 1978 .no_check = 0,
d83d8461
ACM
1979 .flags = INET_PROTOSW_PERMANENT |
1980 INET_PROTOSW_ICSK,
1da177e4
LT
1981};
1982
2c8c1e72 1983static int __net_init tcpv6_net_init(struct net *net)
93ec926b 1984{
5677242f
DL
1985 return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
1986 SOCK_RAW, IPPROTO_TCP, net);
93ec926b
DL
1987}
1988
2c8c1e72 1989static void __net_exit tcpv6_net_exit(struct net *net)
93ec926b 1990{
5677242f 1991 inet_ctl_sock_destroy(net->ipv6.tcp_sk);
b099ce26
EB
1992}
1993
2c8c1e72 1994static void __net_exit tcpv6_net_exit_batch(struct list_head *net_exit_list)
b099ce26
EB
1995{
1996 inet_twsk_purge(&tcp_hashinfo, &tcp_death_row, AF_INET6);
93ec926b
DL
1997}
1998
1999static struct pernet_operations tcpv6_net_ops = {
b099ce26
EB
2000 .init = tcpv6_net_init,
2001 .exit = tcpv6_net_exit,
2002 .exit_batch = tcpv6_net_exit_batch,
93ec926b
DL
2003};
2004
7f4e4868 2005int __init tcpv6_init(void)
1da177e4 2006{
7f4e4868
DL
2007 int ret;
2008
3336288a
VY
2009 ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2010 if (ret)
c6b641a4 2011 goto out;
3336288a 2012
1da177e4 2013 /* register inet6 protocol */
7f4e4868
DL
2014 ret = inet6_register_protosw(&tcpv6_protosw);
2015 if (ret)
2016 goto out_tcpv6_protocol;
2017
93ec926b 2018 ret = register_pernet_subsys(&tcpv6_net_ops);
7f4e4868
DL
2019 if (ret)
2020 goto out_tcpv6_protosw;
2021out:
2022 return ret;
ae0f7d5f 2023
7f4e4868
DL
2024out_tcpv6_protosw:
2025 inet6_unregister_protosw(&tcpv6_protosw);
3336288a
VY
2026out_tcpv6_protocol:
2027 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
7f4e4868
DL
2028 goto out;
2029}
2030
09f7709f 2031void tcpv6_exit(void)
7f4e4868 2032{
93ec926b 2033 unregister_pernet_subsys(&tcpv6_net_ops);
7f4e4868
DL
2034 inet6_unregister_protosw(&tcpv6_protosw);
2035 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
1da177e4 2036}