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