mac8390: raise error logging priority
[linux-2.6-block.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>
1da177e4
LT
64
65#include <asm/uaccess.h>
66
67#include <linux/proc_fs.h>
68#include <linux/seq_file.h>
69
cfb6eeb4
YH
70#include <linux/crypto.h>
71#include <linux/scatterlist.h>
72
cfb6eeb4 73static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
6edafaaf
GJ
74static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
75 struct request_sock *req);
1da177e4
LT
76
77static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
8ad50d96
HX
78static void __tcp_v6_send_check(struct sk_buff *skb,
79 struct in6_addr *saddr,
80 struct in6_addr *daddr);
1da177e4 81
3b401a81
SH
82static const struct inet_connection_sock_af_ops ipv6_mapped;
83static const struct inet_connection_sock_af_ops ipv6_specific;
a928630a 84#ifdef CONFIG_TCP_MD5SIG
b2e4b3de
SH
85static const struct tcp_sock_af_ops tcp_sock_ipv6_specific;
86static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
9501f972
YH
87#else
88static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
89 struct in6_addr *addr)
90{
91 return NULL;
92}
a928630a 93#endif
1da177e4 94
1da177e4
LT
95static void tcp_v6_hash(struct sock *sk)
96{
97 if (sk->sk_state != TCP_CLOSE) {
8292a17a 98 if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
1da177e4
LT
99 tcp_prot.hash(sk);
100 return;
101 }
102 local_bh_disable();
9327f705 103 __inet6_hash(sk, NULL);
1da177e4
LT
104 local_bh_enable();
105 }
106}
107
684f2176 108static __inline__ __sum16 tcp_v6_check(int len,
1ab1457c
YH
109 struct in6_addr *saddr,
110 struct in6_addr *daddr,
868c86bc 111 __wsum base)
1da177e4
LT
112{
113 return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
114}
115
a94f723d 116static __u32 tcp_v6_init_sequence(struct sk_buff *skb)
1da177e4 117{
0660e03f
ACM
118 return secure_tcpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
119 ipv6_hdr(skb)->saddr.s6_addr32,
aa8223c7
ACM
120 tcp_hdr(skb)->dest,
121 tcp_hdr(skb)->source);
1da177e4
LT
122}
123
1ab1457c 124static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
1da177e4
LT
125 int addr_len)
126{
127 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
1ab1457c 128 struct inet_sock *inet = inet_sk(sk);
d83d8461 129 struct inet_connection_sock *icsk = inet_csk(sk);
1da177e4
LT
130 struct ipv6_pinfo *np = inet6_sk(sk);
131 struct tcp_sock *tp = tcp_sk(sk);
132 struct in6_addr *saddr = NULL, *final_p = NULL, final;
133 struct flowi fl;
134 struct dst_entry *dst;
135 int addr_type;
136 int err;
137
1ab1457c 138 if (addr_len < SIN6_LEN_RFC2133)
1da177e4
LT
139 return -EINVAL;
140
1ab1457c 141 if (usin->sin6_family != AF_INET6)
1da177e4
LT
142 return(-EAFNOSUPPORT);
143
144 memset(&fl, 0, sizeof(fl));
145
146 if (np->sndflow) {
147 fl.fl6_flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
148 IP6_ECN_flow_init(fl.fl6_flowlabel);
149 if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) {
150 struct ip6_flowlabel *flowlabel;
151 flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
152 if (flowlabel == NULL)
153 return -EINVAL;
154 ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
155 fl6_sock_release(flowlabel);
156 }
157 }
158
159 /*
1ab1457c
YH
160 * connect() to INADDR_ANY means loopback (BSD'ism).
161 */
162
163 if(ipv6_addr_any(&usin->sin6_addr))
164 usin->sin6_addr.s6_addr[15] = 0x1;
1da177e4
LT
165
166 addr_type = ipv6_addr_type(&usin->sin6_addr);
167
168 if(addr_type & IPV6_ADDR_MULTICAST)
169 return -ENETUNREACH;
170
171 if (addr_type&IPV6_ADDR_LINKLOCAL) {
172 if (addr_len >= sizeof(struct sockaddr_in6) &&
173 usin->sin6_scope_id) {
174 /* If interface is set while binding, indices
175 * must coincide.
176 */
177 if (sk->sk_bound_dev_if &&
178 sk->sk_bound_dev_if != usin->sin6_scope_id)
179 return -EINVAL;
180
181 sk->sk_bound_dev_if = usin->sin6_scope_id;
182 }
183
184 /* Connect to link-local address requires an interface */
185 if (!sk->sk_bound_dev_if)
186 return -EINVAL;
187 }
188
189 if (tp->rx_opt.ts_recent_stamp &&
190 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
191 tp->rx_opt.ts_recent = 0;
192 tp->rx_opt.ts_recent_stamp = 0;
193 tp->write_seq = 0;
194 }
195
196 ipv6_addr_copy(&np->daddr, &usin->sin6_addr);
197 np->flow_label = fl.fl6_flowlabel;
198
199 /*
200 * TCP over IPv4
201 */
202
203 if (addr_type == IPV6_ADDR_MAPPED) {
d83d8461 204 u32 exthdrlen = icsk->icsk_ext_hdr_len;
1da177e4
LT
205 struct sockaddr_in sin;
206
207 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
208
209 if (__ipv6_only_sock(sk))
210 return -ENETUNREACH;
211
212 sin.sin_family = AF_INET;
213 sin.sin_port = usin->sin6_port;
214 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
215
d83d8461 216 icsk->icsk_af_ops = &ipv6_mapped;
1da177e4 217 sk->sk_backlog_rcv = tcp_v4_do_rcv;
cfb6eeb4
YH
218#ifdef CONFIG_TCP_MD5SIG
219 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
220#endif
1da177e4
LT
221
222 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
223
224 if (err) {
d83d8461
ACM
225 icsk->icsk_ext_hdr_len = exthdrlen;
226 icsk->icsk_af_ops = &ipv6_specific;
1da177e4 227 sk->sk_backlog_rcv = tcp_v6_do_rcv;
cfb6eeb4
YH
228#ifdef CONFIG_TCP_MD5SIG
229 tp->af_specific = &tcp_sock_ipv6_specific;
230#endif
1da177e4
LT
231 goto failure;
232 } else {
c720c7e8
ED
233 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
234 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
235 &np->rcv_saddr);
1da177e4
LT
236 }
237
238 return err;
239 }
240
241 if (!ipv6_addr_any(&np->rcv_saddr))
242 saddr = &np->rcv_saddr;
243
244 fl.proto = IPPROTO_TCP;
245 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
246 ipv6_addr_copy(&fl.fl6_src,
247 (saddr ? saddr : &np->saddr));
248 fl.oif = sk->sk_bound_dev_if;
51953d5b 249 fl.mark = sk->sk_mark;
1da177e4 250 fl.fl_ip_dport = usin->sin6_port;
c720c7e8 251 fl.fl_ip_sport = inet->inet_sport;
1da177e4
LT
252
253 if (np->opt && np->opt->srcrt) {
254 struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
255 ipv6_addr_copy(&final, &fl.fl6_dst);
256 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
257 final_p = &final;
258 }
259
beb8d13b
VY
260 security_sk_classify_flow(sk, &fl);
261
1da177e4
LT
262 err = ip6_dst_lookup(sk, &dst, &fl);
263 if (err)
264 goto failure;
265 if (final_p)
266 ipv6_addr_copy(&fl.fl6_dst, final_p);
267
52479b62
AD
268 err = __xfrm_lookup(sock_net(sk), &dst, &fl, sk, XFRM_LOOKUP_WAIT);
269 if (err < 0) {
14e50e57
DM
270 if (err == -EREMOTE)
271 err = ip6_dst_blackhole(sk, &dst, &fl);
272 if (err < 0)
273 goto failure;
274 }
1da177e4
LT
275
276 if (saddr == NULL) {
277 saddr = &fl.fl6_src;
278 ipv6_addr_copy(&np->rcv_saddr, saddr);
279 }
280
281 /* set the source address */
282 ipv6_addr_copy(&np->saddr, saddr);
c720c7e8 283 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
1da177e4 284
f83ef8c0 285 sk->sk_gso_type = SKB_GSO_TCPV6;
8e1ef0a9 286 __ip6_dst_store(sk, dst, NULL, NULL);
1da177e4 287
d83d8461 288 icsk->icsk_ext_hdr_len = 0;
1da177e4 289 if (np->opt)
d83d8461
ACM
290 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
291 np->opt->opt_nflen);
1da177e4
LT
292
293 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
294
c720c7e8 295 inet->inet_dport = usin->sin6_port;
1da177e4
LT
296
297 tcp_set_state(sk, TCP_SYN_SENT);
d8313f5c 298 err = inet6_hash_connect(&tcp_death_row, sk);
1da177e4
LT
299 if (err)
300 goto late_failure;
301
302 if (!tp->write_seq)
303 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
304 np->daddr.s6_addr32,
c720c7e8
ED
305 inet->inet_sport,
306 inet->inet_dport);
1da177e4
LT
307
308 err = tcp_connect(sk);
309 if (err)
310 goto late_failure;
311
312 return 0;
313
314late_failure:
315 tcp_set_state(sk, TCP_CLOSE);
316 __sk_dst_reset(sk);
317failure:
c720c7e8 318 inet->inet_dport = 0;
1da177e4
LT
319 sk->sk_route_caps = 0;
320 return err;
321}
322
323static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
d5fdd6ba 324 u8 type, u8 code, int offset, __be32 info)
1da177e4
LT
325{
326 struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
505cbfc5 327 const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
1da177e4
LT
328 struct ipv6_pinfo *np;
329 struct sock *sk;
330 int err;
1ab1457c 331 struct tcp_sock *tp;
1da177e4 332 __u32 seq;
ca12a1a4 333 struct net *net = dev_net(skb->dev);
1da177e4 334
ca12a1a4 335 sk = inet6_lookup(net, &tcp_hashinfo, &hdr->daddr,
d86e0dac 336 th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
1da177e4
LT
337
338 if (sk == NULL) {
e41b5368
DL
339 ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev),
340 ICMP6_MIB_INERRORS);
1da177e4
LT
341 return;
342 }
343
344 if (sk->sk_state == TCP_TIME_WAIT) {
9469c7b4 345 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
346 return;
347 }
348
349 bh_lock_sock(sk);
350 if (sock_owned_by_user(sk))
de0744af 351 NET_INC_STATS_BH(net, LINUX_MIB_LOCKDROPPEDICMPS);
1da177e4
LT
352
353 if (sk->sk_state == TCP_CLOSE)
354 goto out;
355
e802af9c
SH
356 if (ipv6_hdr(skb)->hop_limit < inet6_sk(sk)->min_hopcount) {
357 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
358 goto out;
359 }
360
1da177e4 361 tp = tcp_sk(sk);
1ab1457c 362 seq = ntohl(th->seq);
1da177e4
LT
363 if (sk->sk_state != TCP_LISTEN &&
364 !between(seq, tp->snd_una, tp->snd_nxt)) {
de0744af 365 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
1da177e4
LT
366 goto out;
367 }
368
369 np = inet6_sk(sk);
370
371 if (type == ICMPV6_PKT_TOOBIG) {
372 struct dst_entry *dst = NULL;
373
374 if (sock_owned_by_user(sk))
375 goto out;
376 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
377 goto out;
378
379 /* icmp should have updated the destination cache entry */
380 dst = __sk_dst_check(sk, np->dst_cookie);
381
382 if (dst == NULL) {
383 struct inet_sock *inet = inet_sk(sk);
384 struct flowi fl;
385
386 /* BUGGG_FUTURE: Again, it is not clear how
387 to handle rthdr case. Ignore this complexity
388 for now.
389 */
390 memset(&fl, 0, sizeof(fl));
391 fl.proto = IPPROTO_TCP;
392 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
393 ipv6_addr_copy(&fl.fl6_src, &np->saddr);
394 fl.oif = sk->sk_bound_dev_if;
51953d5b 395 fl.mark = sk->sk_mark;
c720c7e8
ED
396 fl.fl_ip_dport = inet->inet_dport;
397 fl.fl_ip_sport = inet->inet_sport;
beb8d13b 398 security_skb_classify_flow(skb, &fl);
1da177e4
LT
399
400 if ((err = ip6_dst_lookup(sk, &dst, &fl))) {
401 sk->sk_err_soft = -err;
402 goto out;
403 }
404
52479b62 405 if ((err = xfrm_lookup(net, &dst, &fl, sk, 0)) < 0) {
1da177e4
LT
406 sk->sk_err_soft = -err;
407 goto out;
408 }
409
410 } else
411 dst_hold(dst);
412
d83d8461 413 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
1da177e4
LT
414 tcp_sync_mss(sk, dst_mtu(dst));
415 tcp_simple_retransmit(sk);
416 } /* else let the usual retransmit timer handle it */
417 dst_release(dst);
418 goto out;
419 }
420
421 icmpv6_err_convert(type, code, &err);
422
60236fdd 423 /* Might be for an request_sock */
1da177e4 424 switch (sk->sk_state) {
60236fdd 425 struct request_sock *req, **prev;
1da177e4
LT
426 case TCP_LISTEN:
427 if (sock_owned_by_user(sk))
428 goto out;
429
8129765a
ACM
430 req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
431 &hdr->saddr, inet6_iif(skb));
1da177e4
LT
432 if (!req)
433 goto out;
434
435 /* ICMPs are not backlogged, hence we cannot get
436 * an established socket here.
437 */
547b792c 438 WARN_ON(req->sk != NULL);
1da177e4 439
2e6599cb 440 if (seq != tcp_rsk(req)->snt_isn) {
de0744af 441 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
1da177e4
LT
442 goto out;
443 }
444
463c84b9 445 inet_csk_reqsk_queue_drop(sk, req, prev);
1da177e4
LT
446 goto out;
447
448 case TCP_SYN_SENT:
449 case TCP_SYN_RECV: /* Cannot happen.
1ab1457c 450 It can, it SYNs are crossed. --ANK */
1da177e4 451 if (!sock_owned_by_user(sk)) {
1da177e4
LT
452 sk->sk_err = err;
453 sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
454
455 tcp_done(sk);
456 } else
457 sk->sk_err_soft = err;
458 goto out;
459 }
460
461 if (!sock_owned_by_user(sk) && np->recverr) {
462 sk->sk_err = err;
463 sk->sk_error_report(sk);
464 } else
465 sk->sk_err_soft = err;
466
467out:
468 bh_unlock_sock(sk);
469 sock_put(sk);
470}
471
472
e6b4d113
WAS
473static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
474 struct request_values *rvp)
1da177e4 475{
ca304b61 476 struct inet6_request_sock *treq = inet6_rsk(req);
1da177e4
LT
477 struct ipv6_pinfo *np = inet6_sk(sk);
478 struct sk_buff * skb;
479 struct ipv6_txoptions *opt = NULL;
480 struct in6_addr * final_p = NULL, final;
481 struct flowi fl;
fd80eb94 482 struct dst_entry *dst;
1da177e4
LT
483 int err = -1;
484
485 memset(&fl, 0, sizeof(fl));
486 fl.proto = IPPROTO_TCP;
2e6599cb
ACM
487 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
488 ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
1da177e4 489 fl.fl6_flowlabel = 0;
2e6599cb 490 fl.oif = treq->iif;
51953d5b 491 fl.mark = sk->sk_mark;
2e6599cb 492 fl.fl_ip_dport = inet_rsk(req)->rmt_port;
fd507037 493 fl.fl_ip_sport = inet_rsk(req)->loc_port;
4237c75c 494 security_req_classify_flow(req, &fl);
1da177e4 495
fd80eb94
DL
496 opt = np->opt;
497 if (opt && opt->srcrt) {
498 struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
499 ipv6_addr_copy(&final, &fl.fl6_dst);
500 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
501 final_p = &final;
1da177e4
LT
502 }
503
fd80eb94
DL
504 err = ip6_dst_lookup(sk, &dst, &fl);
505 if (err)
506 goto done;
507 if (final_p)
508 ipv6_addr_copy(&fl.fl6_dst, final_p);
52479b62 509 if ((err = xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0)
fd80eb94
DL
510 goto done;
511
e6b4d113 512 skb = tcp_make_synack(sk, dst, req, rvp);
1da177e4 513 if (skb) {
8ad50d96 514 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
1da177e4 515
2e6599cb 516 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
4e15ed4d 517 err = ip6_xmit(sk, skb, &fl, opt);
b9df3cb8 518 err = net_xmit_eval(err);
1da177e4
LT
519 }
520
521done:
1ab1457c 522 if (opt && opt != np->opt)
1da177e4 523 sock_kfree_s(sk, opt, opt->tot_len);
78b91042 524 dst_release(dst);
1da177e4
LT
525 return err;
526}
527
72659ecc
OP
528static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req,
529 struct request_values *rvp)
530{
531 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
532 return tcp_v6_send_synack(sk, req, rvp);
533}
534
c6aefafb
GG
535static inline void syn_flood_warning(struct sk_buff *skb)
536{
537#ifdef CONFIG_SYN_COOKIES
538 if (sysctl_tcp_syncookies)
539 printk(KERN_INFO
540 "TCPv6: Possible SYN flooding on port %d. "
541 "Sending cookies.\n", ntohs(tcp_hdr(skb)->dest));
542 else
543#endif
544 printk(KERN_INFO
545 "TCPv6: Possible SYN flooding on port %d. "
546 "Dropping request.\n", ntohs(tcp_hdr(skb)->dest));
547}
548
60236fdd 549static void tcp_v6_reqsk_destructor(struct request_sock *req)
1da177e4 550{
800d55f1 551 kfree_skb(inet6_rsk(req)->pktopts);
1da177e4
LT
552}
553
cfb6eeb4
YH
554#ifdef CONFIG_TCP_MD5SIG
555static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
556 struct in6_addr *addr)
557{
558 struct tcp_sock *tp = tcp_sk(sk);
559 int i;
560
561 BUG_ON(tp == NULL);
562
563 if (!tp->md5sig_info || !tp->md5sig_info->entries6)
564 return NULL;
565
566 for (i = 0; i < tp->md5sig_info->entries6; i++) {
caad295f 567 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, addr))
f8ab18d2 568 return &tp->md5sig_info->keys6[i].base;
cfb6eeb4
YH
569 }
570 return NULL;
571}
572
573static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
574 struct sock *addr_sk)
575{
576 return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr);
577}
578
579static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
580 struct request_sock *req)
581{
582 return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
583}
584
585static int tcp_v6_md5_do_add(struct sock *sk, struct in6_addr *peer,
586 char *newkey, u8 newkeylen)
587{
588 /* Add key to the list */
b0a713e9 589 struct tcp_md5sig_key *key;
cfb6eeb4
YH
590 struct tcp_sock *tp = tcp_sk(sk);
591 struct tcp6_md5sig_key *keys;
592
b0a713e9 593 key = tcp_v6_md5_do_lookup(sk, peer);
cfb6eeb4
YH
594 if (key) {
595 /* modify existing entry - just update that one */
b0a713e9
MD
596 kfree(key->key);
597 key->key = newkey;
598 key->keylen = newkeylen;
cfb6eeb4
YH
599 } else {
600 /* reallocate new list if current one is full. */
601 if (!tp->md5sig_info) {
602 tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC);
603 if (!tp->md5sig_info) {
604 kfree(newkey);
605 return -ENOMEM;
606 }
a465419b 607 sk_nocaps_add(sk, NETIF_F_GSO_MASK);
cfb6eeb4 608 }
aa133076 609 if (tcp_alloc_md5sig_pool(sk) == NULL) {
aacbe8c8
YH
610 kfree(newkey);
611 return -ENOMEM;
612 }
cfb6eeb4
YH
613 if (tp->md5sig_info->alloced6 == tp->md5sig_info->entries6) {
614 keys = kmalloc((sizeof (tp->md5sig_info->keys6[0]) *
615 (tp->md5sig_info->entries6 + 1)), GFP_ATOMIC);
616
617 if (!keys) {
618 tcp_free_md5sig_pool();
619 kfree(newkey);
620 return -ENOMEM;
621 }
622
623 if (tp->md5sig_info->entries6)
624 memmove(keys, tp->md5sig_info->keys6,
625 (sizeof (tp->md5sig_info->keys6[0]) *
626 tp->md5sig_info->entries6));
627
628 kfree(tp->md5sig_info->keys6);
629 tp->md5sig_info->keys6 = keys;
630 tp->md5sig_info->alloced6++;
631 }
632
633 ipv6_addr_copy(&tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr,
634 peer);
f8ab18d2
DM
635 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey;
636 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen;
cfb6eeb4
YH
637
638 tp->md5sig_info->entries6++;
639 }
640 return 0;
641}
642
643static int tcp_v6_md5_add_func(struct sock *sk, struct sock *addr_sk,
644 u8 *newkey, __u8 newkeylen)
645{
646 return tcp_v6_md5_do_add(sk, &inet6_sk(addr_sk)->daddr,
647 newkey, newkeylen);
648}
649
650static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
651{
652 struct tcp_sock *tp = tcp_sk(sk);
653 int i;
654
655 for (i = 0; i < tp->md5sig_info->entries6; i++) {
caad295f 656 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, peer)) {
cfb6eeb4 657 /* Free the key */
f8ab18d2 658 kfree(tp->md5sig_info->keys6[i].base.key);
cfb6eeb4
YH
659 tp->md5sig_info->entries6--;
660
661 if (tp->md5sig_info->entries6 == 0) {
662 kfree(tp->md5sig_info->keys6);
663 tp->md5sig_info->keys6 = NULL;
ca983cef 664 tp->md5sig_info->alloced6 = 0;
cfb6eeb4
YH
665 } else {
666 /* shrink the database */
667 if (tp->md5sig_info->entries6 != i)
668 memmove(&tp->md5sig_info->keys6[i],
669 &tp->md5sig_info->keys6[i+1],
670 (tp->md5sig_info->entries6 - i)
671 * sizeof (tp->md5sig_info->keys6[0]));
672 }
77adefdc
YH
673 tcp_free_md5sig_pool();
674 return 0;
cfb6eeb4
YH
675 }
676 }
677 return -ENOENT;
678}
679
680static void tcp_v6_clear_md5_list (struct sock *sk)
681{
682 struct tcp_sock *tp = tcp_sk(sk);
683 int i;
684
685 if (tp->md5sig_info->entries6) {
686 for (i = 0; i < tp->md5sig_info->entries6; i++)
f8ab18d2 687 kfree(tp->md5sig_info->keys6[i].base.key);
cfb6eeb4
YH
688 tp->md5sig_info->entries6 = 0;
689 tcp_free_md5sig_pool();
690 }
691
692 kfree(tp->md5sig_info->keys6);
693 tp->md5sig_info->keys6 = NULL;
694 tp->md5sig_info->alloced6 = 0;
695
696 if (tp->md5sig_info->entries4) {
697 for (i = 0; i < tp->md5sig_info->entries4; i++)
f8ab18d2 698 kfree(tp->md5sig_info->keys4[i].base.key);
cfb6eeb4
YH
699 tp->md5sig_info->entries4 = 0;
700 tcp_free_md5sig_pool();
701 }
702
703 kfree(tp->md5sig_info->keys4);
704 tp->md5sig_info->keys4 = NULL;
705 tp->md5sig_info->alloced4 = 0;
706}
707
708static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
709 int optlen)
710{
711 struct tcp_md5sig cmd;
712 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
713 u8 *newkey;
714
715 if (optlen < sizeof(cmd))
716 return -EINVAL;
717
718 if (copy_from_user(&cmd, optval, sizeof(cmd)))
719 return -EFAULT;
720
721 if (sin6->sin6_family != AF_INET6)
722 return -EINVAL;
723
724 if (!cmd.tcpm_keylen) {
725 if (!tcp_sk(sk)->md5sig_info)
726 return -ENOENT;
e773e4fa 727 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
cfb6eeb4
YH
728 return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]);
729 return tcp_v6_md5_do_del(sk, &sin6->sin6_addr);
730 }
731
732 if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
733 return -EINVAL;
734
735 if (!tcp_sk(sk)->md5sig_info) {
736 struct tcp_sock *tp = tcp_sk(sk);
737 struct tcp_md5sig_info *p;
738
739 p = kzalloc(sizeof(struct tcp_md5sig_info), GFP_KERNEL);
740 if (!p)
741 return -ENOMEM;
742
743 tp->md5sig_info = p;
a465419b 744 sk_nocaps_add(sk, NETIF_F_GSO_MASK);
cfb6eeb4
YH
745 }
746
af879cc7 747 newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
cfb6eeb4
YH
748 if (!newkey)
749 return -ENOMEM;
e773e4fa 750 if (ipv6_addr_v4mapped(&sin6->sin6_addr)) {
cfb6eeb4
YH
751 return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
752 newkey, cmd.tcpm_keylen);
753 }
754 return tcp_v6_md5_do_add(sk, &sin6->sin6_addr, newkey, cmd.tcpm_keylen);
755}
756
49a72dfb
AL
757static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
758 struct in6_addr *daddr,
759 struct in6_addr *saddr, int nbytes)
cfb6eeb4 760{
cfb6eeb4 761 struct tcp6_pseudohdr *bp;
49a72dfb 762 struct scatterlist sg;
8d26d76d 763
cfb6eeb4 764 bp = &hp->md5_blk.ip6;
cfb6eeb4
YH
765 /* 1. TCP pseudo-header (RFC2460) */
766 ipv6_addr_copy(&bp->saddr, saddr);
767 ipv6_addr_copy(&bp->daddr, daddr);
49a72dfb 768 bp->protocol = cpu_to_be32(IPPROTO_TCP);
00b1304c 769 bp->len = cpu_to_be32(nbytes);
cfb6eeb4 770
49a72dfb
AL
771 sg_init_one(&sg, bp, sizeof(*bp));
772 return crypto_hash_update(&hp->md5_desc, &sg, sizeof(*bp));
773}
c7da57a1 774
49a72dfb
AL
775static int tcp_v6_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
776 struct in6_addr *daddr, struct in6_addr *saddr,
777 struct tcphdr *th)
778{
779 struct tcp_md5sig_pool *hp;
780 struct hash_desc *desc;
781
782 hp = tcp_get_md5sig_pool();
783 if (!hp)
784 goto clear_hash_noput;
785 desc = &hp->md5_desc;
786
787 if (crypto_hash_init(desc))
788 goto clear_hash;
789 if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, th->doff << 2))
790 goto clear_hash;
791 if (tcp_md5_hash_header(hp, th))
792 goto clear_hash;
793 if (tcp_md5_hash_key(hp, key))
794 goto clear_hash;
795 if (crypto_hash_final(desc, md5_hash))
cfb6eeb4 796 goto clear_hash;
cfb6eeb4 797
cfb6eeb4 798 tcp_put_md5sig_pool();
cfb6eeb4 799 return 0;
49a72dfb 800
cfb6eeb4
YH
801clear_hash:
802 tcp_put_md5sig_pool();
803clear_hash_noput:
804 memset(md5_hash, 0, 16);
49a72dfb 805 return 1;
cfb6eeb4
YH
806}
807
49a72dfb
AL
808static int tcp_v6_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
809 struct sock *sk, struct request_sock *req,
810 struct sk_buff *skb)
cfb6eeb4
YH
811{
812 struct in6_addr *saddr, *daddr;
49a72dfb
AL
813 struct tcp_md5sig_pool *hp;
814 struct hash_desc *desc;
815 struct tcphdr *th = tcp_hdr(skb);
cfb6eeb4
YH
816
817 if (sk) {
818 saddr = &inet6_sk(sk)->saddr;
819 daddr = &inet6_sk(sk)->daddr;
49a72dfb 820 } else if (req) {
cfb6eeb4
YH
821 saddr = &inet6_rsk(req)->loc_addr;
822 daddr = &inet6_rsk(req)->rmt_addr;
49a72dfb
AL
823 } else {
824 struct ipv6hdr *ip6h = ipv6_hdr(skb);
825 saddr = &ip6h->saddr;
826 daddr = &ip6h->daddr;
cfb6eeb4 827 }
49a72dfb
AL
828
829 hp = tcp_get_md5sig_pool();
830 if (!hp)
831 goto clear_hash_noput;
832 desc = &hp->md5_desc;
833
834 if (crypto_hash_init(desc))
835 goto clear_hash;
836
837 if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, skb->len))
838 goto clear_hash;
839 if (tcp_md5_hash_header(hp, th))
840 goto clear_hash;
841 if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))
842 goto clear_hash;
843 if (tcp_md5_hash_key(hp, key))
844 goto clear_hash;
845 if (crypto_hash_final(desc, md5_hash))
846 goto clear_hash;
847
848 tcp_put_md5sig_pool();
849 return 0;
850
851clear_hash:
852 tcp_put_md5sig_pool();
853clear_hash_noput:
854 memset(md5_hash, 0, 16);
855 return 1;
cfb6eeb4
YH
856}
857
858static int tcp_v6_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)
859{
860 __u8 *hash_location = NULL;
861 struct tcp_md5sig_key *hash_expected;
0660e03f 862 struct ipv6hdr *ip6h = ipv6_hdr(skb);
aa8223c7 863 struct tcphdr *th = tcp_hdr(skb);
cfb6eeb4 864 int genhash;
cfb6eeb4
YH
865 u8 newhash[16];
866
867 hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);
7d5d5525 868 hash_location = tcp_parse_md5sig_option(th);
cfb6eeb4 869
785957d3
DM
870 /* We've parsed the options - do we have a hash? */
871 if (!hash_expected && !hash_location)
872 return 0;
873
874 if (hash_expected && !hash_location) {
875 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);
cfb6eeb4
YH
876 return 1;
877 }
878
785957d3
DM
879 if (!hash_expected && hash_location) {
880 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);
cfb6eeb4
YH
881 return 1;
882 }
883
884 /* check the signature */
49a72dfb
AL
885 genhash = tcp_v6_md5_hash_skb(newhash,
886 hash_expected,
887 NULL, NULL, skb);
888
cfb6eeb4
YH
889 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
890 if (net_ratelimit()) {
5856b606 891 printk(KERN_INFO "MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
cfb6eeb4 892 genhash ? "failed" : "mismatch",
0c6ce78a
HH
893 &ip6h->saddr, ntohs(th->source),
894 &ip6h->daddr, ntohs(th->dest));
cfb6eeb4
YH
895 }
896 return 1;
897 }
898 return 0;
899}
900#endif
901
c6aefafb 902struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
1da177e4 903 .family = AF_INET6,
2e6599cb 904 .obj_size = sizeof(struct tcp6_request_sock),
72659ecc 905 .rtx_syn_ack = tcp_v6_rtx_synack,
60236fdd
ACM
906 .send_ack = tcp_v6_reqsk_send_ack,
907 .destructor = tcp_v6_reqsk_destructor,
72659ecc
OP
908 .send_reset = tcp_v6_send_reset,
909 .syn_ack_timeout = tcp_syn_ack_timeout,
1da177e4
LT
910};
911
cfb6eeb4 912#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 913static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
cfb6eeb4 914 .md5_lookup = tcp_v6_reqsk_md5_lookup,
e3afe7b7 915 .calc_md5_hash = tcp_v6_md5_hash_skb,
cfb6eeb4 916};
b6332e6c 917#endif
cfb6eeb4 918
6d6ee43e
ACM
919static struct timewait_sock_ops tcp6_timewait_sock_ops = {
920 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
921 .twsk_unique = tcp_twsk_unique,
cfb6eeb4 922 .twsk_destructor= tcp_twsk_destructor,
6d6ee43e
ACM
923};
924
8ad50d96
HX
925static void __tcp_v6_send_check(struct sk_buff *skb,
926 struct in6_addr *saddr, struct in6_addr *daddr)
1da177e4 927{
aa8223c7 928 struct tcphdr *th = tcp_hdr(skb);
1da177e4 929
84fa7933 930 if (skb->ip_summed == CHECKSUM_PARTIAL) {
8ad50d96 931 th->check = ~tcp_v6_check(skb->len, saddr, daddr, 0);
663ead3b 932 skb->csum_start = skb_transport_header(skb) - skb->head;
ff1dcadb 933 skb->csum_offset = offsetof(struct tcphdr, check);
1da177e4 934 } else {
8ad50d96
HX
935 th->check = tcp_v6_check(skb->len, saddr, daddr,
936 csum_partial(th, th->doff << 2,
937 skb->csum));
1da177e4
LT
938 }
939}
940
bb296246 941static void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
8ad50d96
HX
942{
943 struct ipv6_pinfo *np = inet6_sk(sk);
944
945 __tcp_v6_send_check(skb, &np->saddr, &np->daddr);
946}
947
a430a43d
HX
948static int tcp_v6_gso_send_check(struct sk_buff *skb)
949{
950 struct ipv6hdr *ipv6h;
951 struct tcphdr *th;
952
953 if (!pskb_may_pull(skb, sizeof(*th)))
954 return -EINVAL;
955
0660e03f 956 ipv6h = ipv6_hdr(skb);
aa8223c7 957 th = tcp_hdr(skb);
a430a43d
HX
958
959 th->check = 0;
84fa7933 960 skb->ip_summed = CHECKSUM_PARTIAL;
8ad50d96 961 __tcp_v6_send_check(skb, &ipv6h->saddr, &ipv6h->daddr);
a430a43d
HX
962 return 0;
963}
1da177e4 964
36990673
HX
965static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
966 struct sk_buff *skb)
684f2176 967{
36e7b1b8 968 struct ipv6hdr *iph = skb_gro_network_header(skb);
684f2176
HX
969
970 switch (skb->ip_summed) {
971 case CHECKSUM_COMPLETE:
86911732 972 if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr,
684f2176
HX
973 skb->csum)) {
974 skb->ip_summed = CHECKSUM_UNNECESSARY;
975 break;
976 }
977
978 /* fall through */
979 case CHECKSUM_NONE:
980 NAPI_GRO_CB(skb)->flush = 1;
981 return NULL;
982 }
983
984 return tcp_gro_receive(head, skb);
985}
684f2176 986
36990673 987static int tcp6_gro_complete(struct sk_buff *skb)
684f2176
HX
988{
989 struct ipv6hdr *iph = ipv6_hdr(skb);
990 struct tcphdr *th = tcp_hdr(skb);
991
992 th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
993 &iph->saddr, &iph->daddr, 0);
994 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
995
996 return tcp_gro_complete(skb);
997}
684f2176 998
626e264d
IJ
999static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
1000 u32 ts, struct tcp_md5sig_key *key, int rst)
1da177e4 1001{
aa8223c7 1002 struct tcphdr *th = tcp_hdr(skb), *t1;
1da177e4
LT
1003 struct sk_buff *buff;
1004 struct flowi fl;
adf30907 1005 struct net *net = dev_net(skb_dst(skb)->dev);
e5047992 1006 struct sock *ctl_sk = net->ipv6.tcp_sk;
77c676da 1007 unsigned int tot_len = sizeof(struct tcphdr);
adf30907 1008 struct dst_entry *dst;
81ada62d 1009 __be32 *topt;
1da177e4 1010
626e264d
IJ
1011 if (ts)
1012 tot_len += TCPOLEN_TSTAMP_ALIGNED;
cfb6eeb4 1013#ifdef CONFIG_TCP_MD5SIG
cfb6eeb4
YH
1014 if (key)
1015 tot_len += TCPOLEN_MD5SIG_ALIGNED;
1016#endif
1017
cfb6eeb4 1018 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1da177e4 1019 GFP_ATOMIC);
1ab1457c
YH
1020 if (buff == NULL)
1021 return;
1da177e4 1022
cfb6eeb4 1023 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1da177e4 1024
cfb6eeb4 1025 t1 = (struct tcphdr *) skb_push(buff, tot_len);
6651ffc8 1026 skb_reset_transport_header(buff);
1da177e4
LT
1027
1028 /* Swap the send and the receive. */
1029 memset(t1, 0, sizeof(*t1));
1030 t1->dest = th->source;
1031 t1->source = th->dest;
cfb6eeb4 1032 t1->doff = tot_len / 4;
626e264d
IJ
1033 t1->seq = htonl(seq);
1034 t1->ack_seq = htonl(ack);
1035 t1->ack = !rst || !th->ack;
1036 t1->rst = rst;
1037 t1->window = htons(win);
1da177e4 1038
81ada62d
IJ
1039 topt = (__be32 *)(t1 + 1);
1040
626e264d
IJ
1041 if (ts) {
1042 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1043 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
1044 *topt++ = htonl(tcp_time_stamp);
1045 *topt++ = htonl(ts);
1046 }
1047
cfb6eeb4
YH
1048#ifdef CONFIG_TCP_MD5SIG
1049 if (key) {
81ada62d
IJ
1050 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1051 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
1052 tcp_v6_md5_hash_hdr((__u8 *)topt, key,
78e645cb
IJ
1053 &ipv6_hdr(skb)->saddr,
1054 &ipv6_hdr(skb)->daddr, t1);
cfb6eeb4
YH
1055 }
1056#endif
1057
1da177e4 1058 memset(&fl, 0, sizeof(fl));
0660e03f
ACM
1059 ipv6_addr_copy(&fl.fl6_dst, &ipv6_hdr(skb)->saddr);
1060 ipv6_addr_copy(&fl.fl6_src, &ipv6_hdr(skb)->daddr);
1da177e4 1061
e5700aff
DM
1062 buff->ip_summed = CHECKSUM_PARTIAL;
1063 buff->csum = 0;
1064
8ad50d96 1065 __tcp_v6_send_check(buff, &fl.fl6_src, &fl.fl6_dst);
1da177e4
LT
1066
1067 fl.proto = IPPROTO_TCP;
505cbfc5 1068 fl.oif = inet6_iif(skb);
1da177e4
LT
1069 fl.fl_ip_dport = t1->dest;
1070 fl.fl_ip_sport = t1->source;
beb8d13b 1071 security_skb_classify_flow(skb, &fl);
1da177e4 1072
c20121ae
DL
1073 /* Pass a socket to ip6_dst_lookup either it is for RST
1074 * Underlying function will use this to retrieve the network
1075 * namespace
1076 */
adf30907
ED
1077 if (!ip6_dst_lookup(ctl_sk, &dst, &fl)) {
1078 if (xfrm_lookup(net, &dst, &fl, NULL, 0) >= 0) {
1079 skb_dst_set(buff, dst);
4e15ed4d 1080 ip6_xmit(ctl_sk, buff, &fl, NULL);
63231bdd 1081 TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
626e264d
IJ
1082 if (rst)
1083 TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
1da177e4 1084 return;
ecc51b6d 1085 }
1da177e4
LT
1086 }
1087
1088 kfree_skb(buff);
1089}
1090
626e264d 1091static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
1da177e4 1092{
626e264d
IJ
1093 struct tcphdr *th = tcp_hdr(skb);
1094 u32 seq = 0, ack_seq = 0;
fa3e5b4e 1095 struct tcp_md5sig_key *key = NULL;
1da177e4 1096
626e264d 1097 if (th->rst)
1da177e4
LT
1098 return;
1099
626e264d
IJ
1100 if (!ipv6_unicast_destination(skb))
1101 return;
1da177e4 1102
cfb6eeb4 1103#ifdef CONFIG_TCP_MD5SIG
626e264d
IJ
1104 if (sk)
1105 key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr);
cfb6eeb4
YH
1106#endif
1107
626e264d
IJ
1108 if (th->ack)
1109 seq = ntohl(th->ack_seq);
1110 else
1111 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
1112 (th->doff << 2);
1da177e4 1113
626e264d
IJ
1114 tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1);
1115}
1da177e4 1116
626e264d
IJ
1117static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
1118 struct tcp_md5sig_key *key)
1119{
1120 tcp_v6_send_response(skb, seq, ack, win, ts, key, 0);
1da177e4
LT
1121}
1122
1123static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1124{
8feaf0c0 1125 struct inet_timewait_sock *tw = inet_twsk(sk);
cfb6eeb4 1126 struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1da177e4 1127
9501f972 1128 tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
8feaf0c0 1129 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
9501f972 1130 tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw));
1da177e4 1131
8feaf0c0 1132 inet_twsk_put(tw);
1da177e4
LT
1133}
1134
6edafaaf
GJ
1135static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
1136 struct request_sock *req)
1da177e4 1137{
9501f972 1138 tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
6edafaaf 1139 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr));
1da177e4
LT
1140}
1141
1142
1143static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
1144{
60236fdd 1145 struct request_sock *req, **prev;
aa8223c7 1146 const struct tcphdr *th = tcp_hdr(skb);
1da177e4
LT
1147 struct sock *nsk;
1148
1149 /* Find possible connection requests. */
8129765a 1150 req = inet6_csk_search_req(sk, &prev, th->source,
0660e03f
ACM
1151 &ipv6_hdr(skb)->saddr,
1152 &ipv6_hdr(skb)->daddr, inet6_iif(skb));
1da177e4
LT
1153 if (req)
1154 return tcp_check_req(sk, skb, req, prev);
1155
3b1e0a65 1156 nsk = __inet6_lookup_established(sock_net(sk), &tcp_hashinfo,
d86e0dac
PE
1157 &ipv6_hdr(skb)->saddr, th->source,
1158 &ipv6_hdr(skb)->daddr, ntohs(th->dest), inet6_iif(skb));
1da177e4
LT
1159
1160 if (nsk) {
1161 if (nsk->sk_state != TCP_TIME_WAIT) {
1162 bh_lock_sock(nsk);
1163 return nsk;
1164 }
9469c7b4 1165 inet_twsk_put(inet_twsk(nsk));
1da177e4
LT
1166 return NULL;
1167 }
1168
c6aefafb 1169#ifdef CONFIG_SYN_COOKIES
1da177e4 1170 if (!th->rst && !th->syn && th->ack)
c6aefafb 1171 sk = cookie_v6_check(sk, skb);
1da177e4
LT
1172#endif
1173 return sk;
1174}
1175
1da177e4
LT
1176/* FIXME: this is substantially similar to the ipv4 code.
1177 * Can some kind of merge be done? -- erics
1178 */
1179static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1180{
4957faad 1181 struct tcp_extend_values tmp_ext;
e6b4d113 1182 struct tcp_options_received tmp_opt;
4957faad 1183 u8 *hash_location;
e6b4d113 1184 struct request_sock *req;
ca304b61 1185 struct inet6_request_sock *treq;
1da177e4 1186 struct ipv6_pinfo *np = inet6_sk(sk);
1da177e4 1187 struct tcp_sock *tp = tcp_sk(sk);
e6b4d113 1188 __u32 isn = TCP_SKB_CB(skb)->when;
c6aefafb
GG
1189#ifdef CONFIG_SYN_COOKIES
1190 int want_cookie = 0;
1191#else
1192#define want_cookie 0
1193#endif
1da177e4
LT
1194
1195 if (skb->protocol == htons(ETH_P_IP))
1196 return tcp_v4_conn_request(sk, skb);
1197
1198 if (!ipv6_unicast_destination(skb))
1ab1457c 1199 goto drop;
1da177e4 1200
463c84b9 1201 if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
1da177e4 1202 if (net_ratelimit())
c6aefafb
GG
1203 syn_flood_warning(skb);
1204#ifdef CONFIG_SYN_COOKIES
1205 if (sysctl_tcp_syncookies)
1206 want_cookie = 1;
1207 else
1208#endif
1ab1457c 1209 goto drop;
1da177e4
LT
1210 }
1211
463c84b9 1212 if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
1da177e4
LT
1213 goto drop;
1214
ca304b61 1215 req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
1da177e4
LT
1216 if (req == NULL)
1217 goto drop;
1218
cfb6eeb4
YH
1219#ifdef CONFIG_TCP_MD5SIG
1220 tcp_rsk(req)->af_specific = &tcp_request_sock_ipv6_ops;
1221#endif
1222
1da177e4
LT
1223 tcp_clear_options(&tmp_opt);
1224 tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
1225 tmp_opt.user_mss = tp->rx_opt.user_mss;
bb5b7c11 1226 tcp_parse_options(skb, &tmp_opt, &hash_location, 0);
4957faad
WAS
1227
1228 if (tmp_opt.cookie_plus > 0 &&
1229 tmp_opt.saw_tstamp &&
1230 !tp->rx_opt.cookie_out_never &&
1231 (sysctl_tcp_cookie_size > 0 ||
1232 (tp->cookie_values != NULL &&
1233 tp->cookie_values->cookie_desired > 0))) {
1234 u8 *c;
1235 u32 *d;
1236 u32 *mess = &tmp_ext.cookie_bakery[COOKIE_DIGEST_WORDS];
1237 int l = tmp_opt.cookie_plus - TCPOLEN_COOKIE_BASE;
1238
1239 if (tcp_cookie_generator(&tmp_ext.cookie_bakery[0]) != 0)
1240 goto drop_and_free;
1241
1242 /* Secret recipe starts with IP addresses */
0eae88f3 1243 d = (__force u32 *)&ipv6_hdr(skb)->daddr.s6_addr32[0];
4957faad
WAS
1244 *mess++ ^= *d++;
1245 *mess++ ^= *d++;
1246 *mess++ ^= *d++;
1247 *mess++ ^= *d++;
0eae88f3 1248 d = (__force u32 *)&ipv6_hdr(skb)->saddr.s6_addr32[0];
4957faad
WAS
1249 *mess++ ^= *d++;
1250 *mess++ ^= *d++;
1251 *mess++ ^= *d++;
1252 *mess++ ^= *d++;
1253
1254 /* plus variable length Initiator Cookie */
1255 c = (u8 *)mess;
1256 while (l-- > 0)
1257 *c++ ^= *hash_location++;
1da177e4 1258
4957faad
WAS
1259#ifdef CONFIG_SYN_COOKIES
1260 want_cookie = 0; /* not our kind of cookie */
1261#endif
1262 tmp_ext.cookie_out_never = 0; /* false */
1263 tmp_ext.cookie_plus = tmp_opt.cookie_plus;
1264 } else if (!tp->rx_opt.cookie_in_always) {
1265 /* redundant indications, but ensure initialization. */
1266 tmp_ext.cookie_out_never = 1; /* true */
1267 tmp_ext.cookie_plus = 0;
1268 } else {
1269 goto drop_and_free;
1270 }
1271 tmp_ext.cookie_in_always = tp->rx_opt.cookie_in_always;
1da177e4 1272
4dfc2817 1273 if (want_cookie && !tmp_opt.saw_tstamp)
c6aefafb 1274 tcp_clear_options(&tmp_opt);
c6aefafb 1275
1da177e4
LT
1276 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
1277 tcp_openreq_init(req, &tmp_opt, skb);
1278
ca304b61 1279 treq = inet6_rsk(req);
0660e03f
ACM
1280 ipv6_addr_copy(&treq->rmt_addr, &ipv6_hdr(skb)->saddr);
1281 ipv6_addr_copy(&treq->loc_addr, &ipv6_hdr(skb)->daddr);
c6aefafb
GG
1282 if (!want_cookie)
1283 TCP_ECN_create_request(req, tcp_hdr(skb));
1284
1285 if (want_cookie) {
1286 isn = cookie_v6_init_sequence(sk, skb, &req->mss);
4dfc2817 1287 req->cookie_ts = tmp_opt.tstamp_ok;
c6aefafb
GG
1288 } else if (!isn) {
1289 if (ipv6_opt_accepted(sk, skb) ||
1290 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1291 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1292 atomic_inc(&skb->users);
1293 treq->pktopts = skb;
1294 }
1295 treq->iif = sk->sk_bound_dev_if;
1da177e4 1296
c6aefafb
GG
1297 /* So that link locals have meaning */
1298 if (!sk->sk_bound_dev_if &&
1299 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1300 treq->iif = inet6_iif(skb);
1da177e4 1301
a94f723d 1302 isn = tcp_v6_init_sequence(skb);
c6aefafb 1303 }
2e6599cb 1304 tcp_rsk(req)->snt_isn = isn;
1da177e4 1305
4237c75c
VY
1306 security_inet_conn_request(sk, skb, req);
1307
4957faad
WAS
1308 if (tcp_v6_send_synack(sk, req,
1309 (struct request_values *)&tmp_ext) ||
1310 want_cookie)
e6b4d113 1311 goto drop_and_free;
1da177e4 1312
e6b4d113
WAS
1313 inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
1314 return 0;
1da177e4 1315
e6b4d113
WAS
1316drop_and_free:
1317 reqsk_free(req);
1da177e4 1318drop:
1da177e4
LT
1319 return 0; /* don't send reset */
1320}
1321
1322static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
60236fdd 1323 struct request_sock *req,
1da177e4
LT
1324 struct dst_entry *dst)
1325{
78d15e82 1326 struct inet6_request_sock *treq;
1da177e4
LT
1327 struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1328 struct tcp6_sock *newtcp6sk;
1329 struct inet_sock *newinet;
1330 struct tcp_sock *newtp;
1331 struct sock *newsk;
1332 struct ipv6_txoptions *opt;
cfb6eeb4
YH
1333#ifdef CONFIG_TCP_MD5SIG
1334 struct tcp_md5sig_key *key;
1335#endif
1da177e4
LT
1336
1337 if (skb->protocol == htons(ETH_P_IP)) {
1338 /*
1339 * v6 mapped
1340 */
1341
1342 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
1343
1ab1457c 1344 if (newsk == NULL)
1da177e4
LT
1345 return NULL;
1346
1347 newtcp6sk = (struct tcp6_sock *)newsk;
1348 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1349
1350 newinet = inet_sk(newsk);
1351 newnp = inet6_sk(newsk);
1352 newtp = tcp_sk(newsk);
1353
1354 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1355
c720c7e8 1356 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr);
1da177e4 1357
c720c7e8 1358 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1da177e4
LT
1359
1360 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
1361
8292a17a 1362 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1da177e4 1363 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
cfb6eeb4
YH
1364#ifdef CONFIG_TCP_MD5SIG
1365 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1366#endif
1367
1da177e4
LT
1368 newnp->pktoptions = NULL;
1369 newnp->opt = NULL;
505cbfc5 1370 newnp->mcast_oif = inet6_iif(skb);
0660e03f 1371 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1da177e4 1372
e6848976
ACM
1373 /*
1374 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
1375 * here, tcp_create_openreq_child now does this for us, see the comment in
1376 * that function for the gory details. -acme
1da177e4 1377 */
1da177e4
LT
1378
1379 /* It is tricky place. Until this moment IPv4 tcp
8292a17a 1380 worked with IPv6 icsk.icsk_af_ops.
1da177e4
LT
1381 Sync it now.
1382 */
d83d8461 1383 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1da177e4
LT
1384
1385 return newsk;
1386 }
1387
78d15e82 1388 treq = inet6_rsk(req);
1da177e4
LT
1389 opt = np->opt;
1390
1391 if (sk_acceptq_is_full(sk))
1392 goto out_overflow;
1393
1da177e4
LT
1394 if (dst == NULL) {
1395 struct in6_addr *final_p = NULL, final;
1396 struct flowi fl;
1397
1398 memset(&fl, 0, sizeof(fl));
1399 fl.proto = IPPROTO_TCP;
2e6599cb 1400 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
1da177e4
LT
1401 if (opt && opt->srcrt) {
1402 struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
1403 ipv6_addr_copy(&final, &fl.fl6_dst);
1404 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
1405 final_p = &final;
1406 }
2e6599cb 1407 ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
1da177e4 1408 fl.oif = sk->sk_bound_dev_if;
51953d5b 1409 fl.mark = sk->sk_mark;
2e6599cb 1410 fl.fl_ip_dport = inet_rsk(req)->rmt_port;
fd507037 1411 fl.fl_ip_sport = inet_rsk(req)->loc_port;
4237c75c 1412 security_req_classify_flow(req, &fl);
1da177e4
LT
1413
1414 if (ip6_dst_lookup(sk, &dst, &fl))
1415 goto out;
1416
1417 if (final_p)
1418 ipv6_addr_copy(&fl.fl6_dst, final_p);
1419
52479b62 1420 if ((xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0)
1da177e4 1421 goto out;
1ab1457c 1422 }
1da177e4
LT
1423
1424 newsk = tcp_create_openreq_child(sk, req, skb);
1425 if (newsk == NULL)
1426 goto out;
1427
e6848976
ACM
1428 /*
1429 * No need to charge this sock to the relevant IPv6 refcnt debug socks
1430 * count here, tcp_create_openreq_child now does this for us, see the
1431 * comment in that function for the gory details. -acme
1432 */
1da177e4 1433
59eed279 1434 newsk->sk_gso_type = SKB_GSO_TCPV6;
8e1ef0a9 1435 __ip6_dst_store(newsk, dst, NULL, NULL);
1da177e4
LT
1436
1437 newtcp6sk = (struct tcp6_sock *)newsk;
1438 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1439
1440 newtp = tcp_sk(newsk);
1441 newinet = inet_sk(newsk);
1442 newnp = inet6_sk(newsk);
1443
1444 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1445
2e6599cb
ACM
1446 ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr);
1447 ipv6_addr_copy(&newnp->saddr, &treq->loc_addr);
1448 ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
1449 newsk->sk_bound_dev_if = treq->iif;
1da177e4 1450
1ab1457c 1451 /* Now IPv6 options...
1da177e4
LT
1452
1453 First: no IPv4 options.
1454 */
1455 newinet->opt = NULL;
d35690be 1456 newnp->ipv6_fl_list = NULL;
1da177e4
LT
1457
1458 /* Clone RX bits */
1459 newnp->rxopt.all = np->rxopt.all;
1460
1461 /* Clone pktoptions received with SYN */
1462 newnp->pktoptions = NULL;
2e6599cb
ACM
1463 if (treq->pktopts != NULL) {
1464 newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
1465 kfree_skb(treq->pktopts);
1466 treq->pktopts = NULL;
1da177e4
LT
1467 if (newnp->pktoptions)
1468 skb_set_owner_r(newnp->pktoptions, newsk);
1469 }
1470 newnp->opt = NULL;
505cbfc5 1471 newnp->mcast_oif = inet6_iif(skb);
0660e03f 1472 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1da177e4
LT
1473
1474 /* Clone native IPv6 options from listening socket (if any)
1475
1476 Yes, keeping reference count would be much more clever,
1477 but we make one more one thing there: reattach optmem
1478 to newsk.
1479 */
1480 if (opt) {
1481 newnp->opt = ipv6_dup_options(newsk, opt);
1482 if (opt != np->opt)
1483 sock_kfree_s(sk, opt, opt->tot_len);
1484 }
1485
d83d8461 1486 inet_csk(newsk)->icsk_ext_hdr_len = 0;
1da177e4 1487 if (newnp->opt)
d83d8461
ACM
1488 inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
1489 newnp->opt->opt_flen);
1da177e4 1490
5d424d5a 1491 tcp_mtup_init(newsk);
1da177e4
LT
1492 tcp_sync_mss(newsk, dst_mtu(dst));
1493 newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
1494 tcp_initialize_rcv_mss(newsk);
1495
c720c7e8
ED
1496 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
1497 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
1da177e4 1498
cfb6eeb4
YH
1499#ifdef CONFIG_TCP_MD5SIG
1500 /* Copy over the MD5 key from the original socket */
1501 if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) {
1502 /* We're using one, so create a matching key
1503 * on the newsk structure. If we fail to get
1504 * memory, then we end up not copying the key
1505 * across. Shucks.
1506 */
af879cc7
ACM
1507 char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
1508 if (newkey != NULL)
e547bc1e 1509 tcp_v6_md5_do_add(newsk, &newnp->daddr,
cfb6eeb4 1510 newkey, key->keylen);
cfb6eeb4
YH
1511 }
1512#endif
1513
9327f705 1514 __inet6_hash(newsk, NULL);
e56d8b8a 1515 __inet_inherit_port(sk, newsk);
1da177e4
LT
1516
1517 return newsk;
1518
1519out_overflow:
de0744af 1520 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
1da177e4 1521out:
de0744af 1522 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1da177e4
LT
1523 if (opt && opt != np->opt)
1524 sock_kfree_s(sk, opt, opt->tot_len);
1525 dst_release(dst);
1526 return NULL;
1527}
1528
b51655b9 1529static __sum16 tcp_v6_checksum_init(struct sk_buff *skb)
1da177e4 1530{
84fa7933 1531 if (skb->ip_summed == CHECKSUM_COMPLETE) {
684f2176 1532 if (!tcp_v6_check(skb->len, &ipv6_hdr(skb)->saddr,
0660e03f 1533 &ipv6_hdr(skb)->daddr, skb->csum)) {
fb286bb2 1534 skb->ip_summed = CHECKSUM_UNNECESSARY;
1da177e4 1535 return 0;
fb286bb2 1536 }
1da177e4 1537 }
fb286bb2 1538
684f2176 1539 skb->csum = ~csum_unfold(tcp_v6_check(skb->len,
0660e03f
ACM
1540 &ipv6_hdr(skb)->saddr,
1541 &ipv6_hdr(skb)->daddr, 0));
fb286bb2 1542
1da177e4 1543 if (skb->len <= 76) {
fb286bb2 1544 return __skb_checksum_complete(skb);
1da177e4
LT
1545 }
1546 return 0;
1547}
1548
1549/* The socket must have it's spinlock held when we get
1550 * here.
1551 *
1552 * We have a potential double-lock case here, so even when
1553 * doing backlog processing we use the BH locking scheme.
1554 * This is because we cannot sleep with the original spinlock
1555 * held.
1556 */
1557static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1558{
1559 struct ipv6_pinfo *np = inet6_sk(sk);
1560 struct tcp_sock *tp;
1561 struct sk_buff *opt_skb = NULL;
1562
1563 /* Imagine: socket is IPv6. IPv4 packet arrives,
1564 goes to IPv4 receive handler and backlogged.
1565 From backlog it always goes here. Kerboom...
1566 Fortunately, tcp_rcv_established and rcv_established
1567 handle them correctly, but it is not case with
1568 tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK
1569 */
1570
1571 if (skb->protocol == htons(ETH_P_IP))
1572 return tcp_v4_do_rcv(sk, skb);
1573
cfb6eeb4
YH
1574#ifdef CONFIG_TCP_MD5SIG
1575 if (tcp_v6_inbound_md5_hash (sk, skb))
1576 goto discard;
1577#endif
1578
fda9ef5d 1579 if (sk_filter(sk, skb))
1da177e4
LT
1580 goto discard;
1581
1582 /*
1583 * socket locking is here for SMP purposes as backlog rcv
1584 * is currently called with bh processing disabled.
1585 */
1586
1587 /* Do Stevens' IPV6_PKTOPTIONS.
1588
1589 Yes, guys, it is the only place in our code, where we
1590 may make it not affecting IPv4.
1591 The rest of code is protocol independent,
1592 and I do not like idea to uglify IPv4.
1593
1594 Actually, all the idea behind IPV6_PKTOPTIONS
1595 looks not very well thought. For now we latch
1596 options, received in the last packet, enqueued
1597 by tcp. Feel free to propose better solution.
1ab1457c 1598 --ANK (980728)
1da177e4
LT
1599 */
1600 if (np->rxopt.all)
1601 opt_skb = skb_clone(skb, GFP_ATOMIC);
1602
1603 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
1604 TCP_CHECK_TIMER(sk);
aa8223c7 1605 if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len))
1da177e4
LT
1606 goto reset;
1607 TCP_CHECK_TIMER(sk);
1608 if (opt_skb)
1609 goto ipv6_pktoptions;
1610 return 0;
1611 }
1612
ab6a5bb6 1613 if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb))
1da177e4
LT
1614 goto csum_err;
1615
1ab1457c 1616 if (sk->sk_state == TCP_LISTEN) {
1da177e4
LT
1617 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1618 if (!nsk)
1619 goto discard;
1620
1621 /*
1622 * Queue it on the new socket if the new socket is active,
1623 * otherwise we just shortcircuit this and continue with
1624 * the new socket..
1625 */
1ab1457c 1626 if(nsk != sk) {
1da177e4
LT
1627 if (tcp_child_process(sk, nsk, skb))
1628 goto reset;
1629 if (opt_skb)
1630 __kfree_skb(opt_skb);
1631 return 0;
1632 }
1633 }
1634
1635 TCP_CHECK_TIMER(sk);
aa8223c7 1636 if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len))
1da177e4
LT
1637 goto reset;
1638 TCP_CHECK_TIMER(sk);
1639 if (opt_skb)
1640 goto ipv6_pktoptions;
1641 return 0;
1642
1643reset:
cfb6eeb4 1644 tcp_v6_send_reset(sk, skb);
1da177e4
LT
1645discard:
1646 if (opt_skb)
1647 __kfree_skb(opt_skb);
1648 kfree_skb(skb);
1649 return 0;
1650csum_err:
63231bdd 1651 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
1da177e4
LT
1652 goto discard;
1653
1654
1655ipv6_pktoptions:
1656 /* Do you ask, what is it?
1657
1658 1. skb was enqueued by tcp.
1659 2. skb is added to tail of read queue, rather than out of order.
1660 3. socket is not in passive state.
1661 4. Finally, it really contains options, which user wants to receive.
1662 */
1663 tp = tcp_sk(sk);
1664 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1665 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
333fad53 1666 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
505cbfc5 1667 np->mcast_oif = inet6_iif(opt_skb);
333fad53 1668 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
0660e03f 1669 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
1da177e4
LT
1670 if (ipv6_opt_accepted(sk, opt_skb)) {
1671 skb_set_owner_r(opt_skb, sk);
1672 opt_skb = xchg(&np->pktoptions, opt_skb);
1673 } else {
1674 __kfree_skb(opt_skb);
1675 opt_skb = xchg(&np->pktoptions, NULL);
1676 }
1677 }
1678
800d55f1 1679 kfree_skb(opt_skb);
1da177e4
LT
1680 return 0;
1681}
1682
e5bbef20 1683static int tcp_v6_rcv(struct sk_buff *skb)
1da177e4 1684{
1ab1457c 1685 struct tcphdr *th;
e802af9c 1686 struct ipv6hdr *hdr;
1da177e4
LT
1687 struct sock *sk;
1688 int ret;
a86b1e30 1689 struct net *net = dev_net(skb->dev);
1da177e4
LT
1690
1691 if (skb->pkt_type != PACKET_HOST)
1692 goto discard_it;
1693
1694 /*
1695 * Count it even if it's bad.
1696 */
63231bdd 1697 TCP_INC_STATS_BH(net, TCP_MIB_INSEGS);
1da177e4
LT
1698
1699 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1700 goto discard_it;
1701
aa8223c7 1702 th = tcp_hdr(skb);
1da177e4
LT
1703
1704 if (th->doff < sizeof(struct tcphdr)/4)
1705 goto bad_packet;
1706 if (!pskb_may_pull(skb, th->doff*4))
1707 goto discard_it;
1708
60476372 1709 if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb))
1da177e4
LT
1710 goto bad_packet;
1711
aa8223c7 1712 th = tcp_hdr(skb);
e802af9c 1713 hdr = ipv6_hdr(skb);
1da177e4
LT
1714 TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1715 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1716 skb->len - th->doff*4);
1717 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1718 TCP_SKB_CB(skb)->when = 0;
e802af9c 1719 TCP_SKB_CB(skb)->flags = ipv6_get_dsfield(hdr);
1da177e4
LT
1720 TCP_SKB_CB(skb)->sacked = 0;
1721
9a1f27c4 1722 sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
1da177e4
LT
1723 if (!sk)
1724 goto no_tcp_socket;
1725
1726process:
1727 if (sk->sk_state == TCP_TIME_WAIT)
1728 goto do_time_wait;
1729
e802af9c
SH
1730 if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) {
1731 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
1732 goto discard_and_relse;
1733 }
1734
1da177e4
LT
1735 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1736 goto discard_and_relse;
1737
fda9ef5d 1738 if (sk_filter(sk, skb))
1da177e4
LT
1739 goto discard_and_relse;
1740
1741 skb->dev = NULL;
1742
293b9c42 1743 bh_lock_sock_nested(sk);
1da177e4
LT
1744 ret = 0;
1745 if (!sock_owned_by_user(sk)) {
1a2449a8 1746#ifdef CONFIG_NET_DMA
1ab1457c 1747 struct tcp_sock *tp = tcp_sk(sk);
b4caea8a 1748 if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
f67b4599 1749 tp->ucopy.dma_chan = dma_find_channel(DMA_MEMCPY);
1ab1457c
YH
1750 if (tp->ucopy.dma_chan)
1751 ret = tcp_v6_do_rcv(sk, skb);
1752 else
1a2449a8
CL
1753#endif
1754 {
1755 if (!tcp_prequeue(sk, skb))
1756 ret = tcp_v6_do_rcv(sk, skb);
1757 }
6cce09f8 1758 } else if (unlikely(sk_add_backlog(sk, skb))) {
6b03a53a 1759 bh_unlock_sock(sk);
6cce09f8 1760 NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP);
6b03a53a
ZY
1761 goto discard_and_relse;
1762 }
1da177e4
LT
1763 bh_unlock_sock(sk);
1764
1765 sock_put(sk);
1766 return ret ? -1 : 0;
1767
1768no_tcp_socket:
1769 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1770 goto discard_it;
1771
1772 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1773bad_packet:
63231bdd 1774 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
1da177e4 1775 } else {
cfb6eeb4 1776 tcp_v6_send_reset(NULL, skb);
1da177e4
LT
1777 }
1778
1779discard_it:
1780
1781 /*
1782 * Discard frame
1783 */
1784
1785 kfree_skb(skb);
1786 return 0;
1787
1788discard_and_relse:
1789 sock_put(sk);
1790 goto discard_it;
1791
1792do_time_wait:
1793 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
9469c7b4 1794 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
1795 goto discard_it;
1796 }
1797
1798 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
63231bdd 1799 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
9469c7b4 1800 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
1801 goto discard_it;
1802 }
1803
9469c7b4 1804 switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1da177e4
LT
1805 case TCP_TW_SYN:
1806 {
1807 struct sock *sk2;
1808
c346dca1 1809 sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
0660e03f 1810 &ipv6_hdr(skb)->daddr,
505cbfc5 1811 ntohs(th->dest), inet6_iif(skb));
1da177e4 1812 if (sk2 != NULL) {
295ff7ed
ACM
1813 struct inet_timewait_sock *tw = inet_twsk(sk);
1814 inet_twsk_deschedule(tw, &tcp_death_row);
1815 inet_twsk_put(tw);
1da177e4
LT
1816 sk = sk2;
1817 goto process;
1818 }
1819 /* Fall through to ACK */
1820 }
1821 case TCP_TW_ACK:
1822 tcp_v6_timewait_ack(sk, skb);
1823 break;
1824 case TCP_TW_RST:
1825 goto no_tcp_socket;
1826 case TCP_TW_SUCCESS:;
1827 }
1828 goto discard_it;
1829}
1830
1da177e4
LT
1831static int tcp_v6_remember_stamp(struct sock *sk)
1832{
1833 /* Alas, not yet... */
1834 return 0;
1835}
1836
3b401a81 1837static const struct inet_connection_sock_af_ops ipv6_specific = {
543d9cfe
ACM
1838 .queue_xmit = inet6_csk_xmit,
1839 .send_check = tcp_v6_send_check,
1840 .rebuild_header = inet6_sk_rebuild_header,
1841 .conn_request = tcp_v6_conn_request,
1842 .syn_recv_sock = tcp_v6_syn_recv_sock,
1843 .remember_stamp = tcp_v6_remember_stamp,
1844 .net_header_len = sizeof(struct ipv6hdr),
1845 .setsockopt = ipv6_setsockopt,
1846 .getsockopt = ipv6_getsockopt,
1847 .addr2sockaddr = inet6_csk_addr2sockaddr,
1848 .sockaddr_len = sizeof(struct sockaddr_in6),
ab1e0a13 1849 .bind_conflict = inet6_csk_bind_conflict,
3fdadf7d 1850#ifdef CONFIG_COMPAT
543d9cfe
ACM
1851 .compat_setsockopt = compat_ipv6_setsockopt,
1852 .compat_getsockopt = compat_ipv6_getsockopt,
3fdadf7d 1853#endif
1da177e4
LT
1854};
1855
cfb6eeb4 1856#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 1857static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
cfb6eeb4 1858 .md5_lookup = tcp_v6_md5_lookup,
49a72dfb 1859 .calc_md5_hash = tcp_v6_md5_hash_skb,
cfb6eeb4
YH
1860 .md5_add = tcp_v6_md5_add_func,
1861 .md5_parse = tcp_v6_parse_md5_keys,
cfb6eeb4 1862};
a928630a 1863#endif
cfb6eeb4 1864
1da177e4
LT
1865/*
1866 * TCP over IPv4 via INET6 API
1867 */
1868
3b401a81 1869static const struct inet_connection_sock_af_ops ipv6_mapped = {
543d9cfe
ACM
1870 .queue_xmit = ip_queue_xmit,
1871 .send_check = tcp_v4_send_check,
1872 .rebuild_header = inet_sk_rebuild_header,
1873 .conn_request = tcp_v6_conn_request,
1874 .syn_recv_sock = tcp_v6_syn_recv_sock,
1875 .remember_stamp = tcp_v4_remember_stamp,
1876 .net_header_len = sizeof(struct iphdr),
1877 .setsockopt = ipv6_setsockopt,
1878 .getsockopt = ipv6_getsockopt,
1879 .addr2sockaddr = inet6_csk_addr2sockaddr,
1880 .sockaddr_len = sizeof(struct sockaddr_in6),
ab1e0a13 1881 .bind_conflict = inet6_csk_bind_conflict,
3fdadf7d 1882#ifdef CONFIG_COMPAT
543d9cfe
ACM
1883 .compat_setsockopt = compat_ipv6_setsockopt,
1884 .compat_getsockopt = compat_ipv6_getsockopt,
3fdadf7d 1885#endif
1da177e4
LT
1886};
1887
cfb6eeb4 1888#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 1889static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
cfb6eeb4 1890 .md5_lookup = tcp_v4_md5_lookup,
49a72dfb 1891 .calc_md5_hash = tcp_v4_md5_hash_skb,
cfb6eeb4
YH
1892 .md5_add = tcp_v6_md5_add_func,
1893 .md5_parse = tcp_v6_parse_md5_keys,
cfb6eeb4 1894};
a928630a 1895#endif
cfb6eeb4 1896
1da177e4
LT
1897/* NOTE: A lot of things set to zero explicitly by call to
1898 * sk_alloc() so need not be done here.
1899 */
1900static int tcp_v6_init_sock(struct sock *sk)
1901{
6687e988 1902 struct inet_connection_sock *icsk = inet_csk(sk);
1da177e4
LT
1903 struct tcp_sock *tp = tcp_sk(sk);
1904
1905 skb_queue_head_init(&tp->out_of_order_queue);
1906 tcp_init_xmit_timers(sk);
1907 tcp_prequeue_init(tp);
1908
6687e988 1909 icsk->icsk_rto = TCP_TIMEOUT_INIT;
1da177e4
LT
1910 tp->mdev = TCP_TIMEOUT_INIT;
1911
1912 /* So many TCP implementations out there (incorrectly) count the
1913 * initial SYN frame in their delayed-ACK and congestion control
1914 * algorithms that we must have the following bandaid to talk
1915 * efficiently to them. -DaveM
1916 */
1917 tp->snd_cwnd = 2;
1918
1919 /* See draft-stevens-tcpca-spec-01 for discussion of the
1920 * initialization of these values.
1921 */
0b6a05c1 1922 tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
1da177e4 1923 tp->snd_cwnd_clamp = ~0;
bee7ca9e 1924 tp->mss_cache = TCP_MSS_DEFAULT;
1da177e4
LT
1925
1926 tp->reordering = sysctl_tcp_reordering;
1927
1928 sk->sk_state = TCP_CLOSE;
1929
8292a17a 1930 icsk->icsk_af_ops = &ipv6_specific;
6687e988 1931 icsk->icsk_ca_ops = &tcp_init_congestion_ops;
d83d8461 1932 icsk->icsk_sync_mss = tcp_sync_mss;
1da177e4
LT
1933 sk->sk_write_space = sk_stream_write_space;
1934 sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
1935
cfb6eeb4
YH
1936#ifdef CONFIG_TCP_MD5SIG
1937 tp->af_specific = &tcp_sock_ipv6_specific;
1938#endif
1939
435cf559
WAS
1940 /* TCP Cookie Transactions */
1941 if (sysctl_tcp_cookie_size > 0) {
1942 /* Default, cookies without s_data_payload. */
1943 tp->cookie_values =
1944 kzalloc(sizeof(*tp->cookie_values),
1945 sk->sk_allocation);
1946 if (tp->cookie_values != NULL)
1947 kref_init(&tp->cookie_values->kref);
1948 }
1949 /* Presumed zeroed, in order of appearance:
1950 * cookie_in_always, cookie_out_never,
1951 * s_data_constant, s_data_in, s_data_out
1952 */
1da177e4
LT
1953 sk->sk_sndbuf = sysctl_tcp_wmem[1];
1954 sk->sk_rcvbuf = sysctl_tcp_rmem[1];
1955
eb4dea58 1956 local_bh_disable();
1748376b 1957 percpu_counter_inc(&tcp_sockets_allocated);
eb4dea58 1958 local_bh_enable();
1da177e4
LT
1959
1960 return 0;
1961}
1962
7d06b2e0 1963static void tcp_v6_destroy_sock(struct sock *sk)
1da177e4 1964{
cfb6eeb4
YH
1965#ifdef CONFIG_TCP_MD5SIG
1966 /* Clean up the MD5 key list */
1967 if (tcp_sk(sk)->md5sig_info)
1968 tcp_v6_clear_md5_list(sk);
1969#endif
1da177e4 1970 tcp_v4_destroy_sock(sk);
7d06b2e0 1971 inet6_destroy_sock(sk);
1da177e4
LT
1972}
1973
952a10be 1974#ifdef CONFIG_PROC_FS
1da177e4 1975/* Proc filesystem TCPv6 sock list dumping. */
1ab1457c 1976static void get_openreq6(struct seq_file *seq,
60236fdd 1977 struct sock *sk, struct request_sock *req, int i, int uid)
1da177e4 1978{
1da177e4 1979 int ttd = req->expires - jiffies;
ca304b61
ACM
1980 struct in6_addr *src = &inet6_rsk(req)->loc_addr;
1981 struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
1da177e4
LT
1982
1983 if (ttd < 0)
1984 ttd = 0;
1985
1da177e4
LT
1986 seq_printf(seq,
1987 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1988 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
1989 i,
1990 src->s6_addr32[0], src->s6_addr32[1],
1991 src->s6_addr32[2], src->s6_addr32[3],
fd507037 1992 ntohs(inet_rsk(req)->loc_port),
1da177e4
LT
1993 dest->s6_addr32[0], dest->s6_addr32[1],
1994 dest->s6_addr32[2], dest->s6_addr32[3],
2e6599cb 1995 ntohs(inet_rsk(req)->rmt_port),
1da177e4
LT
1996 TCP_SYN_RECV,
1997 0,0, /* could print option size, but that is af dependent. */
1ab1457c
YH
1998 1, /* timers active (only the expire timer) */
1999 jiffies_to_clock_t(ttd),
1da177e4
LT
2000 req->retrans,
2001 uid,
1ab1457c 2002 0, /* non standard timer */
1da177e4
LT
2003 0, /* open_requests have no inode */
2004 0, req);
2005}
2006
2007static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
2008{
2009 struct in6_addr *dest, *src;
2010 __u16 destp, srcp;
2011 int timer_active;
2012 unsigned long timer_expires;
2013 struct inet_sock *inet = inet_sk(sp);
2014 struct tcp_sock *tp = tcp_sk(sp);
463c84b9 2015 const struct inet_connection_sock *icsk = inet_csk(sp);
1da177e4
LT
2016 struct ipv6_pinfo *np = inet6_sk(sp);
2017
2018 dest = &np->daddr;
2019 src = &np->rcv_saddr;
c720c7e8
ED
2020 destp = ntohs(inet->inet_dport);
2021 srcp = ntohs(inet->inet_sport);
463c84b9
ACM
2022
2023 if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
1da177e4 2024 timer_active = 1;
463c84b9
ACM
2025 timer_expires = icsk->icsk_timeout;
2026 } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
1da177e4 2027 timer_active = 4;
463c84b9 2028 timer_expires = icsk->icsk_timeout;
1da177e4
LT
2029 } else if (timer_pending(&sp->sk_timer)) {
2030 timer_active = 2;
2031 timer_expires = sp->sk_timer.expires;
2032 } else {
2033 timer_active = 0;
2034 timer_expires = jiffies;
2035 }
2036
2037 seq_printf(seq,
2038 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
7be87351 2039 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %lu %lu %u %u %d\n",
1da177e4
LT
2040 i,
2041 src->s6_addr32[0], src->s6_addr32[1],
2042 src->s6_addr32[2], src->s6_addr32[3], srcp,
2043 dest->s6_addr32[0], dest->s6_addr32[1],
2044 dest->s6_addr32[2], dest->s6_addr32[3], destp,
1ab1457c 2045 sp->sk_state,
47da8ee6
SS
2046 tp->write_seq-tp->snd_una,
2047 (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
1da177e4
LT
2048 timer_active,
2049 jiffies_to_clock_t(timer_expires - jiffies),
463c84b9 2050 icsk->icsk_retransmits,
1da177e4 2051 sock_i_uid(sp),
6687e988 2052 icsk->icsk_probes_out,
1da177e4
LT
2053 sock_i_ino(sp),
2054 atomic_read(&sp->sk_refcnt), sp,
7be87351
SH
2055 jiffies_to_clock_t(icsk->icsk_rto),
2056 jiffies_to_clock_t(icsk->icsk_ack.ato),
463c84b9 2057 (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong,
0b6a05c1
IJ
2058 tp->snd_cwnd,
2059 tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh
1da177e4
LT
2060 );
2061}
2062
1ab1457c 2063static void get_timewait6_sock(struct seq_file *seq,
8feaf0c0 2064 struct inet_timewait_sock *tw, int i)
1da177e4
LT
2065{
2066 struct in6_addr *dest, *src;
2067 __u16 destp, srcp;
0fa1a53e 2068 struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
1da177e4
LT
2069 int ttd = tw->tw_ttd - jiffies;
2070
2071 if (ttd < 0)
2072 ttd = 0;
2073
0fa1a53e
ACM
2074 dest = &tw6->tw_v6_daddr;
2075 src = &tw6->tw_v6_rcv_saddr;
1da177e4
LT
2076 destp = ntohs(tw->tw_dport);
2077 srcp = ntohs(tw->tw_sport);
2078
2079 seq_printf(seq,
2080 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2081 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2082 i,
2083 src->s6_addr32[0], src->s6_addr32[1],
2084 src->s6_addr32[2], src->s6_addr32[3], srcp,
2085 dest->s6_addr32[0], dest->s6_addr32[1],
2086 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2087 tw->tw_substate, 0, 0,
2088 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2089 atomic_read(&tw->tw_refcnt), tw);
2090}
2091
1da177e4
LT
2092static int tcp6_seq_show(struct seq_file *seq, void *v)
2093{
2094 struct tcp_iter_state *st;
2095
2096 if (v == SEQ_START_TOKEN) {
2097 seq_puts(seq,
2098 " sl "
2099 "local_address "
2100 "remote_address "
2101 "st tx_queue rx_queue tr tm->when retrnsmt"
2102 " uid timeout inode\n");
2103 goto out;
2104 }
2105 st = seq->private;
2106
2107 switch (st->state) {
2108 case TCP_SEQ_STATE_LISTENING:
2109 case TCP_SEQ_STATE_ESTABLISHED:
2110 get_tcp6_sock(seq, v, st->num);
2111 break;
2112 case TCP_SEQ_STATE_OPENREQ:
2113 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
2114 break;
2115 case TCP_SEQ_STATE_TIME_WAIT:
2116 get_timewait6_sock(seq, v, st->num);
2117 break;
2118 }
2119out:
2120 return 0;
2121}
2122
1da177e4 2123static struct tcp_seq_afinfo tcp6_seq_afinfo = {
1da177e4
LT
2124 .name = "tcp6",
2125 .family = AF_INET6,
5f4472c5
DL
2126 .seq_fops = {
2127 .owner = THIS_MODULE,
2128 },
9427c4b3
DL
2129 .seq_ops = {
2130 .show = tcp6_seq_show,
2131 },
1da177e4
LT
2132};
2133
2c8c1e72 2134int __net_init tcp6_proc_init(struct net *net)
1da177e4 2135{
6f8b13bc 2136 return tcp_proc_register(net, &tcp6_seq_afinfo);
1da177e4
LT
2137}
2138
6f8b13bc 2139void tcp6_proc_exit(struct net *net)
1da177e4 2140{
6f8b13bc 2141 tcp_proc_unregister(net, &tcp6_seq_afinfo);
1da177e4
LT
2142}
2143#endif
2144
2145struct proto tcpv6_prot = {
2146 .name = "TCPv6",
2147 .owner = THIS_MODULE,
2148 .close = tcp_close,
2149 .connect = tcp_v6_connect,
2150 .disconnect = tcp_disconnect,
463c84b9 2151 .accept = inet_csk_accept,
1da177e4
LT
2152 .ioctl = tcp_ioctl,
2153 .init = tcp_v6_init_sock,
2154 .destroy = tcp_v6_destroy_sock,
2155 .shutdown = tcp_shutdown,
2156 .setsockopt = tcp_setsockopt,
2157 .getsockopt = tcp_getsockopt,
1da177e4
LT
2158 .recvmsg = tcp_recvmsg,
2159 .backlog_rcv = tcp_v6_do_rcv,
2160 .hash = tcp_v6_hash,
ab1e0a13
ACM
2161 .unhash = inet_unhash,
2162 .get_port = inet_csk_get_port,
1da177e4
LT
2163 .enter_memory_pressure = tcp_enter_memory_pressure,
2164 .sockets_allocated = &tcp_sockets_allocated,
2165 .memory_allocated = &tcp_memory_allocated,
2166 .memory_pressure = &tcp_memory_pressure,
0a5578cf 2167 .orphan_count = &tcp_orphan_count,
1da177e4
LT
2168 .sysctl_mem = sysctl_tcp_mem,
2169 .sysctl_wmem = sysctl_tcp_wmem,
2170 .sysctl_rmem = sysctl_tcp_rmem,
2171 .max_header = MAX_TCP_HEADER,
2172 .obj_size = sizeof(struct tcp6_sock),
3ab5aee7 2173 .slab_flags = SLAB_DESTROY_BY_RCU,
6d6ee43e 2174 .twsk_prot = &tcp6_timewait_sock_ops,
60236fdd 2175 .rsk_prot = &tcp6_request_sock_ops,
39d8cda7 2176 .h.hashinfo = &tcp_hashinfo,
543d9cfe
ACM
2177#ifdef CONFIG_COMPAT
2178 .compat_setsockopt = compat_tcp_setsockopt,
2179 .compat_getsockopt = compat_tcp_getsockopt,
2180#endif
1da177e4
LT
2181};
2182
41135cc8 2183static const struct inet6_protocol tcpv6_protocol = {
1da177e4
LT
2184 .handler = tcp_v6_rcv,
2185 .err_handler = tcp_v6_err,
a430a43d 2186 .gso_send_check = tcp_v6_gso_send_check,
adcfc7d0 2187 .gso_segment = tcp_tso_segment,
684f2176
HX
2188 .gro_receive = tcp6_gro_receive,
2189 .gro_complete = tcp6_gro_complete,
1da177e4
LT
2190 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2191};
2192
1da177e4
LT
2193static struct inet_protosw tcpv6_protosw = {
2194 .type = SOCK_STREAM,
2195 .protocol = IPPROTO_TCP,
2196 .prot = &tcpv6_prot,
2197 .ops = &inet6_stream_ops,
1da177e4 2198 .no_check = 0,
d83d8461
ACM
2199 .flags = INET_PROTOSW_PERMANENT |
2200 INET_PROTOSW_ICSK,
1da177e4
LT
2201};
2202
2c8c1e72 2203static int __net_init tcpv6_net_init(struct net *net)
93ec926b 2204{
5677242f
DL
2205 return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
2206 SOCK_RAW, IPPROTO_TCP, net);
93ec926b
DL
2207}
2208
2c8c1e72 2209static void __net_exit tcpv6_net_exit(struct net *net)
93ec926b 2210{
5677242f 2211 inet_ctl_sock_destroy(net->ipv6.tcp_sk);
b099ce26
EB
2212}
2213
2c8c1e72 2214static void __net_exit tcpv6_net_exit_batch(struct list_head *net_exit_list)
b099ce26
EB
2215{
2216 inet_twsk_purge(&tcp_hashinfo, &tcp_death_row, AF_INET6);
93ec926b
DL
2217}
2218
2219static struct pernet_operations tcpv6_net_ops = {
b099ce26
EB
2220 .init = tcpv6_net_init,
2221 .exit = tcpv6_net_exit,
2222 .exit_batch = tcpv6_net_exit_batch,
93ec926b
DL
2223};
2224
7f4e4868 2225int __init tcpv6_init(void)
1da177e4 2226{
7f4e4868
DL
2227 int ret;
2228
2229 ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2230 if (ret)
2231 goto out;
2232
1da177e4 2233 /* register inet6 protocol */
7f4e4868
DL
2234 ret = inet6_register_protosw(&tcpv6_protosw);
2235 if (ret)
2236 goto out_tcpv6_protocol;
2237
93ec926b 2238 ret = register_pernet_subsys(&tcpv6_net_ops);
7f4e4868
DL
2239 if (ret)
2240 goto out_tcpv6_protosw;
2241out:
2242 return ret;
ae0f7d5f 2243
7f4e4868
DL
2244out_tcpv6_protocol:
2245 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2246out_tcpv6_protosw:
2247 inet6_unregister_protosw(&tcpv6_protosw);
2248 goto out;
2249}
2250
09f7709f 2251void tcpv6_exit(void)
7f4e4868 2252{
93ec926b 2253 unregister_pernet_subsys(&tcpv6_net_ops);
7f4e4868
DL
2254 inet6_unregister_protosw(&tcpv6_protosw);
2255 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
1da177e4 2256}