]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - net/ipv6/tcp_ipv6.c
net: Convert protocol error handlers from void to int
[mirror_ubuntu-jammy-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>
4aa956d8 42#include <linux/uaccess.h>
1da177e4
LT
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>
3d58b5fa 62#include <net/inet_common.h>
6e5714ea 63#include <net/secure_seq.h>
076bb0c8 64#include <net/busy_poll.h>
1da177e4 65
1da177e4
LT
66#include <linux/proc_fs.h>
67#include <linux/seq_file.h>
68
cf80e0e4 69#include <crypto/hash.h>
cfb6eeb4
YH
70#include <linux/scatterlist.h>
71
c24b14c4
SL
72#include <trace/events/tcp.h>
73
a00e7444
ED
74static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb);
75static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
6edafaaf 76 struct request_sock *req);
1da177e4
LT
77
78static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
1da177e4 79
3b401a81
SH
80static const struct inet_connection_sock_af_ops ipv6_mapped;
81static const struct inet_connection_sock_af_ops ipv6_specific;
a928630a 82#ifdef CONFIG_TCP_MD5SIG
b2e4b3de
SH
83static const struct tcp_sock_af_ops tcp_sock_ipv6_specific;
84static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
9501f972 85#else
51723935 86static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(const struct sock *sk,
b71d1d42 87 const struct in6_addr *addr)
9501f972
YH
88{
89 return NULL;
90}
a928630a 91#endif
1da177e4 92
fae6ef87
NC
93static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
94{
95 struct dst_entry *dst = skb_dst(skb);
fae6ef87 96
5037e9ef 97 if (dst && dst_hold_safe(dst)) {
ca777eff
ED
98 const struct rt6_info *rt = (const struct rt6_info *)dst;
99
ca777eff
ED
100 sk->sk_rx_dst = dst;
101 inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;
b197df4f 102 inet6_sk(sk)->rx_dst_cookie = rt6_get_cookie(rt);
ca777eff 103 }
fae6ef87
NC
104}
105
84b114b9 106static u32 tcp_v6_init_seq(const struct sk_buff *skb)
1da177e4 107{
84b114b9
ED
108 return secure_tcpv6_seq(ipv6_hdr(skb)->daddr.s6_addr32,
109 ipv6_hdr(skb)->saddr.s6_addr32,
110 tcp_hdr(skb)->dest,
111 tcp_hdr(skb)->source);
112}
113
5d2ed052 114static u32 tcp_v6_init_ts_off(const struct net *net, const struct sk_buff *skb)
84b114b9 115{
5d2ed052 116 return secure_tcpv6_ts_off(net, ipv6_hdr(skb)->daddr.s6_addr32,
84b114b9 117 ipv6_hdr(skb)->saddr.s6_addr32);
1da177e4
LT
118}
119
d74bad4e
AI
120static int tcp_v6_pre_connect(struct sock *sk, struct sockaddr *uaddr,
121 int addr_len)
122{
123 /* This check is replicated from tcp_v6_connect() and intended to
124 * prevent BPF program called below from accessing bytes that are out
125 * of the bound specified by user in addr_len.
126 */
127 if (addr_len < SIN6_LEN_RFC2133)
128 return -EINVAL;
129
130 sock_owned_by_me(sk);
131
132 return BPF_CGROUP_RUN_PROG_INET6_CONNECT(sk, uaddr);
133}
134
1ab1457c 135static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
1da177e4
LT
136 int addr_len)
137{
138 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
1ab1457c 139 struct inet_sock *inet = inet_sk(sk);
d83d8461 140 struct inet_connection_sock *icsk = inet_csk(sk);
1da177e4
LT
141 struct ipv6_pinfo *np = inet6_sk(sk);
142 struct tcp_sock *tp = tcp_sk(sk);
20c59de2 143 struct in6_addr *saddr = NULL, *final_p, final;
45f6fad8 144 struct ipv6_txoptions *opt;
4c9483b2 145 struct flowi6 fl6;
1da177e4
LT
146 struct dst_entry *dst;
147 int addr_type;
148 int err;
1946e672 149 struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row;
1da177e4 150
1ab1457c 151 if (addr_len < SIN6_LEN_RFC2133)
1da177e4
LT
152 return -EINVAL;
153
1ab1457c 154 if (usin->sin6_family != AF_INET6)
a02cec21 155 return -EAFNOSUPPORT;
1da177e4 156
4c9483b2 157 memset(&fl6, 0, sizeof(fl6));
1da177e4
LT
158
159 if (np->sndflow) {
4c9483b2
DM
160 fl6.flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
161 IP6_ECN_flow_init(fl6.flowlabel);
162 if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
1da177e4 163 struct ip6_flowlabel *flowlabel;
4c9483b2 164 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
63159f29 165 if (!flowlabel)
1da177e4 166 return -EINVAL;
1da177e4
LT
167 fl6_sock_release(flowlabel);
168 }
169 }
170
171 /*
1ab1457c
YH
172 * connect() to INADDR_ANY means loopback (BSD'ism).
173 */
174
052d2369
JL
175 if (ipv6_addr_any(&usin->sin6_addr)) {
176 if (ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))
177 ipv6_addr_set_v4mapped(htonl(INADDR_LOOPBACK),
178 &usin->sin6_addr);
179 else
180 usin->sin6_addr = in6addr_loopback;
181 }
1da177e4
LT
182
183 addr_type = ipv6_addr_type(&usin->sin6_addr);
184
4c99aa40 185 if (addr_type & IPV6_ADDR_MULTICAST)
1da177e4
LT
186 return -ENETUNREACH;
187
188 if (addr_type&IPV6_ADDR_LINKLOCAL) {
189 if (addr_len >= sizeof(struct sockaddr_in6) &&
190 usin->sin6_scope_id) {
191 /* If interface is set while binding, indices
192 * must coincide.
193 */
54dc3e33 194 if (!sk_dev_equal_l3scope(sk, usin->sin6_scope_id))
1da177e4
LT
195 return -EINVAL;
196
197 sk->sk_bound_dev_if = usin->sin6_scope_id;
198 }
199
200 /* Connect to link-local address requires an interface */
201 if (!sk->sk_bound_dev_if)
202 return -EINVAL;
203 }
204
205 if (tp->rx_opt.ts_recent_stamp &&
efe4208f 206 !ipv6_addr_equal(&sk->sk_v6_daddr, &usin->sin6_addr)) {
1da177e4
LT
207 tp->rx_opt.ts_recent = 0;
208 tp->rx_opt.ts_recent_stamp = 0;
209 tp->write_seq = 0;
210 }
211
efe4208f 212 sk->sk_v6_daddr = usin->sin6_addr;
4c9483b2 213 np->flow_label = fl6.flowlabel;
1da177e4
LT
214
215 /*
216 * TCP over IPv4
217 */
218
052d2369 219 if (addr_type & IPV6_ADDR_MAPPED) {
d83d8461 220 u32 exthdrlen = icsk->icsk_ext_hdr_len;
1da177e4
LT
221 struct sockaddr_in sin;
222
223 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
224
225 if (__ipv6_only_sock(sk))
226 return -ENETUNREACH;
227
228 sin.sin_family = AF_INET;
229 sin.sin_port = usin->sin6_port;
230 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
231
d83d8461 232 icsk->icsk_af_ops = &ipv6_mapped;
1da177e4 233 sk->sk_backlog_rcv = tcp_v4_do_rcv;
cfb6eeb4
YH
234#ifdef CONFIG_TCP_MD5SIG
235 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
236#endif
1da177e4
LT
237
238 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
239
240 if (err) {
d83d8461
ACM
241 icsk->icsk_ext_hdr_len = exthdrlen;
242 icsk->icsk_af_ops = &ipv6_specific;
1da177e4 243 sk->sk_backlog_rcv = tcp_v6_do_rcv;
cfb6eeb4
YH
244#ifdef CONFIG_TCP_MD5SIG
245 tp->af_specific = &tcp_sock_ipv6_specific;
246#endif
1da177e4 247 goto failure;
1da177e4 248 }
d1e559d0 249 np->saddr = sk->sk_v6_rcv_saddr;
1da177e4
LT
250
251 return err;
252 }
253
efe4208f
ED
254 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
255 saddr = &sk->sk_v6_rcv_saddr;
1da177e4 256
4c9483b2 257 fl6.flowi6_proto = IPPROTO_TCP;
efe4208f 258 fl6.daddr = sk->sk_v6_daddr;
4e3fd7a0 259 fl6.saddr = saddr ? *saddr : np->saddr;
4c9483b2
DM
260 fl6.flowi6_oif = sk->sk_bound_dev_if;
261 fl6.flowi6_mark = sk->sk_mark;
1958b856
DM
262 fl6.fl6_dport = usin->sin6_port;
263 fl6.fl6_sport = inet->inet_sport;
e2d118a1 264 fl6.flowi6_uid = sk->sk_uid;
1da177e4 265
1e1d04e6 266 opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
45f6fad8 267 final_p = fl6_update_dst(&fl6, opt, &final);
1da177e4 268
4c9483b2 269 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
beb8d13b 270
0e0d44ab 271 dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
68d0c6d3
DM
272 if (IS_ERR(dst)) {
273 err = PTR_ERR(dst);
1da177e4 274 goto failure;
14e50e57 275 }
1da177e4 276
63159f29 277 if (!saddr) {
4c9483b2 278 saddr = &fl6.saddr;
efe4208f 279 sk->sk_v6_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;
6bd4f355 287 ip6_dst_store(sk, dst, NULL, NULL);
1da177e4 288
d83d8461 289 icsk->icsk_ext_hdr_len = 0;
45f6fad8
ED
290 if (opt)
291 icsk->icsk_ext_hdr_len = opt->opt_flen +
292 opt->opt_nflen;
1da177e4
LT
293
294 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
295
c720c7e8 296 inet->inet_dport = usin->sin6_port;
1da177e4
LT
297
298 tcp_set_state(sk, TCP_SYN_SENT);
1946e672 299 err = inet6_hash_connect(tcp_death_row, sk);
1da177e4
LT
300 if (err)
301 goto late_failure;
302
877d1f62 303 sk_set_txhash(sk);
9e7ceb06 304
00355fa5 305 if (likely(!tp->repair)) {
00355fa5 306 if (!tp->write_seq)
84b114b9
ED
307 tp->write_seq = secure_tcpv6_seq(np->saddr.s6_addr32,
308 sk->sk_v6_daddr.s6_addr32,
309 inet->inet_sport,
310 inet->inet_dport);
5d2ed052
ED
311 tp->tsoffset = secure_tcpv6_ts_off(sock_net(sk),
312 np->saddr.s6_addr32,
84b114b9 313 sk->sk_v6_daddr.s6_addr32);
00355fa5 314 }
1da177e4 315
19f6d3f3
WW
316 if (tcp_fastopen_defer_connect(sk, &err))
317 return err;
318 if (err)
319 goto late_failure;
320
1da177e4
LT
321 err = tcp_connect(sk);
322 if (err)
323 goto late_failure;
324
325 return 0;
326
327late_failure:
328 tcp_set_state(sk, TCP_CLOSE);
1da177e4 329failure:
c720c7e8 330 inet->inet_dport = 0;
1da177e4
LT
331 sk->sk_route_caps = 0;
332 return err;
333}
334
563d34d0
ED
335static void tcp_v6_mtu_reduced(struct sock *sk)
336{
337 struct dst_entry *dst;
338
339 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
340 return;
341
342 dst = inet6_csk_update_pmtu(sk, tcp_sk(sk)->mtu_info);
343 if (!dst)
344 return;
345
346 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
347 tcp_sync_mss(sk, dst_mtu(dst));
348 tcp_simple_retransmit(sk);
349 }
350}
351
32bbd879 352static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
d5fdd6ba 353 u8 type, u8 code, int offset, __be32 info)
1da177e4 354{
4c99aa40 355 const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
505cbfc5 356 const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
2215089b
ED
357 struct net *net = dev_net(skb->dev);
358 struct request_sock *fastopen;
1da177e4 359 struct ipv6_pinfo *np;
1ab1457c 360 struct tcp_sock *tp;
0a672f74 361 __u32 seq, snd_una;
2215089b 362 struct sock *sk;
9cf74903 363 bool fatal;
2215089b 364 int err;
1da177e4 365
2215089b
ED
366 sk = __inet6_lookup_established(net, &tcp_hashinfo,
367 &hdr->daddr, th->dest,
368 &hdr->saddr, ntohs(th->source),
4297a0ef 369 skb->dev->ifindex, inet6_sdif(skb));
1da177e4 370
2215089b 371 if (!sk) {
a16292a0
ED
372 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev),
373 ICMP6_MIB_INERRORS);
32bbd879 374 return -ENOENT;
1da177e4
LT
375 }
376
377 if (sk->sk_state == TCP_TIME_WAIT) {
9469c7b4 378 inet_twsk_put(inet_twsk(sk));
32bbd879 379 return 0;
1da177e4 380 }
2215089b 381 seq = ntohl(th->seq);
9cf74903 382 fatal = icmpv6_err_convert(type, code, &err);
32bbd879
SB
383 if (sk->sk_state == TCP_NEW_SYN_RECV) {
384 tcp_req_err(sk, seq, fatal);
385 return 0;
386 }
1da177e4
LT
387
388 bh_lock_sock(sk);
563d34d0 389 if (sock_owned_by_user(sk) && type != ICMPV6_PKT_TOOBIG)
02a1d6e7 390 __NET_INC_STATS(net, LINUX_MIB_LOCKDROPPEDICMPS);
1da177e4
LT
391
392 if (sk->sk_state == TCP_CLOSE)
393 goto out;
394
e802af9c 395 if (ipv6_hdr(skb)->hop_limit < inet6_sk(sk)->min_hopcount) {
02a1d6e7 396 __NET_INC_STATS(net, LINUX_MIB_TCPMINTTLDROP);
e802af9c
SH
397 goto out;
398 }
399
1da177e4 400 tp = tcp_sk(sk);
0a672f74
YC
401 /* XXX (TFO) - tp->snd_una should be ISN (tcp_create_openreq_child() */
402 fastopen = tp->fastopen_rsk;
403 snd_una = fastopen ? tcp_rsk(fastopen)->snt_isn : tp->snd_una;
1da177e4 404 if (sk->sk_state != TCP_LISTEN &&
0a672f74 405 !between(seq, snd_una, tp->snd_nxt)) {
02a1d6e7 406 __NET_INC_STATS(net, LINUX_MIB_OUTOFWINDOWICMPS);
1da177e4
LT
407 goto out;
408 }
409
410 np = inet6_sk(sk);
411
ec18d9a2 412 if (type == NDISC_REDIRECT) {
45caeaa5
JM
413 if (!sock_owned_by_user(sk)) {
414 struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
ec18d9a2 415
45caeaa5
JM
416 if (dst)
417 dst->ops->redirect(dst, sk, skb);
418 }
50a75a89 419 goto out;
ec18d9a2
DM
420 }
421
1da177e4 422 if (type == ICMPV6_PKT_TOOBIG) {
0d4f0608
ED
423 /* We are not interested in TCP_LISTEN and open_requests
424 * (SYN-ACKs send out by Linux are always <576bytes so
425 * they should go through unfragmented).
426 */
427 if (sk->sk_state == TCP_LISTEN)
428 goto out;
429
93b36cf3
HFS
430 if (!ip6_sk_accept_pmtu(sk))
431 goto out;
432
563d34d0
ED
433 tp->mtu_info = ntohl(info);
434 if (!sock_owned_by_user(sk))
435 tcp_v6_mtu_reduced(sk);
d013ef2a 436 else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
7aa5470c 437 &sk->sk_tsq_flags))
d013ef2a 438 sock_hold(sk);
1da177e4
LT
439 goto out;
440 }
441
1da177e4 442
60236fdd 443 /* Might be for an request_sock */
1da177e4 444 switch (sk->sk_state) {
1da177e4 445 case TCP_SYN_SENT:
0a672f74
YC
446 case TCP_SYN_RECV:
447 /* Only in fast or simultaneous open. If a fast open socket is
448 * is already accepted it is treated as a connected one below.
449 */
63159f29 450 if (fastopen && !fastopen->sk)
0a672f74
YC
451 break;
452
1da177e4 453 if (!sock_owned_by_user(sk)) {
1da177e4
LT
454 sk->sk_err = err;
455 sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
456
457 tcp_done(sk);
458 } else
459 sk->sk_err_soft = err;
460 goto out;
461 }
462
463 if (!sock_owned_by_user(sk) && np->recverr) {
464 sk->sk_err = err;
465 sk->sk_error_report(sk);
466 } else
467 sk->sk_err_soft = err;
468
469out:
470 bh_unlock_sock(sk);
471 sock_put(sk);
32bbd879 472 return 0;
1da177e4
LT
473}
474
475
0f935dbe 476static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
d6274bd8 477 struct flowi *fl,
3840a06e 478 struct request_sock *req,
ca6fb065 479 struct tcp_fastopen_cookie *foc,
b3d05147 480 enum tcp_synack_type synack_type)
1da177e4 481{
634fb979 482 struct inet_request_sock *ireq = inet_rsk(req);
1da177e4 483 struct ipv6_pinfo *np = inet6_sk(sk);
56ac42bc 484 struct ipv6_txoptions *opt;
d6274bd8 485 struct flowi6 *fl6 = &fl->u.ip6;
4c99aa40 486 struct sk_buff *skb;
9494218f 487 int err = -ENOMEM;
1da177e4 488
9f10d3f6 489 /* First, grab a route. */
f76b33c3
ED
490 if (!dst && (dst = inet6_csk_route_req(sk, fl6, req,
491 IPPROTO_TCP)) == NULL)
fd80eb94 492 goto done;
9494218f 493
b3d05147 494 skb = tcp_make_synack(sk, dst, req, foc, synack_type);
9494218f 495
1da177e4 496 if (skb) {
634fb979
ED
497 __tcp_v6_send_check(skb, &ireq->ir_v6_loc_addr,
498 &ireq->ir_v6_rmt_addr);
1da177e4 499
634fb979 500 fl6->daddr = ireq->ir_v6_rmt_addr;
53b24b8f 501 if (np->repflow && ireq->pktopts)
df3687ff
FF
502 fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts));
503
3e4006f0 504 rcu_read_lock();
56ac42bc
HD
505 opt = ireq->ipv6_opt;
506 if (!opt)
507 opt = rcu_dereference(np->opt);
92e55f41 508 err = ip6_xmit(sk, skb, fl6, sk->sk_mark, opt, np->tclass);
3e4006f0 509 rcu_read_unlock();
b9df3cb8 510 err = net_xmit_eval(err);
1da177e4
LT
511 }
512
513done:
1da177e4
LT
514 return err;
515}
516
72659ecc 517
60236fdd 518static void tcp_v6_reqsk_destructor(struct request_sock *req)
1da177e4 519{
56ac42bc 520 kfree(inet_rsk(req)->ipv6_opt);
634fb979 521 kfree_skb(inet_rsk(req)->pktopts);
1da177e4
LT
522}
523
cfb6eeb4 524#ifdef CONFIG_TCP_MD5SIG
b83e3deb 525static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(const struct sock *sk,
b71d1d42 526 const struct in6_addr *addr)
cfb6eeb4 527{
a915da9b 528 return tcp_md5_do_lookup(sk, (union tcp_md5_addr *)addr, AF_INET6);
cfb6eeb4
YH
529}
530
b83e3deb 531static struct tcp_md5sig_key *tcp_v6_md5_lookup(const struct sock *sk,
fd3a154a 532 const struct sock *addr_sk)
cfb6eeb4 533{
efe4208f 534 return tcp_v6_md5_do_lookup(sk, &addr_sk->sk_v6_daddr);
cfb6eeb4
YH
535}
536
8917a777
ID
537static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
538 char __user *optval, int optlen)
cfb6eeb4
YH
539{
540 struct tcp_md5sig cmd;
541 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
8917a777 542 u8 prefixlen;
cfb6eeb4
YH
543
544 if (optlen < sizeof(cmd))
545 return -EINVAL;
546
547 if (copy_from_user(&cmd, optval, sizeof(cmd)))
548 return -EFAULT;
549
550 if (sin6->sin6_family != AF_INET6)
551 return -EINVAL;
552
8917a777
ID
553 if (optname == TCP_MD5SIG_EXT &&
554 cmd.tcpm_flags & TCP_MD5SIG_FLAG_PREFIX) {
555 prefixlen = cmd.tcpm_prefixlen;
556 if (prefixlen > 128 || (ipv6_addr_v4mapped(&sin6->sin6_addr) &&
557 prefixlen > 32))
558 return -EINVAL;
559 } else {
560 prefixlen = ipv6_addr_v4mapped(&sin6->sin6_addr) ? 32 : 128;
561 }
562
cfb6eeb4 563 if (!cmd.tcpm_keylen) {
e773e4fa 564 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
a915da9b 565 return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
8917a777 566 AF_INET, prefixlen);
a915da9b 567 return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
8917a777 568 AF_INET6, prefixlen);
cfb6eeb4
YH
569 }
570
571 if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
572 return -EINVAL;
573
a915da9b
ED
574 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
575 return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
8917a777 576 AF_INET, prefixlen, cmd.tcpm_key,
6797318e 577 cmd.tcpm_keylen, GFP_KERNEL);
cfb6eeb4 578
a915da9b 579 return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
8917a777
ID
580 AF_INET6, prefixlen, cmd.tcpm_key,
581 cmd.tcpm_keylen, GFP_KERNEL);
cfb6eeb4
YH
582}
583
19689e38
ED
584static int tcp_v6_md5_hash_headers(struct tcp_md5sig_pool *hp,
585 const struct in6_addr *daddr,
586 const struct in6_addr *saddr,
587 const struct tcphdr *th, int nbytes)
cfb6eeb4 588{
cfb6eeb4 589 struct tcp6_pseudohdr *bp;
49a72dfb 590 struct scatterlist sg;
19689e38 591 struct tcphdr *_th;
8d26d76d 592
19689e38 593 bp = hp->scratch;
cfb6eeb4 594 /* 1. TCP pseudo-header (RFC2460) */
4e3fd7a0
AD
595 bp->saddr = *saddr;
596 bp->daddr = *daddr;
49a72dfb 597 bp->protocol = cpu_to_be32(IPPROTO_TCP);
00b1304c 598 bp->len = cpu_to_be32(nbytes);
cfb6eeb4 599
19689e38
ED
600 _th = (struct tcphdr *)(bp + 1);
601 memcpy(_th, th, sizeof(*th));
602 _th->check = 0;
603
604 sg_init_one(&sg, bp, sizeof(*bp) + sizeof(*th));
605 ahash_request_set_crypt(hp->md5_req, &sg, NULL,
606 sizeof(*bp) + sizeof(*th));
cf80e0e4 607 return crypto_ahash_update(hp->md5_req);
49a72dfb 608}
c7da57a1 609
19689e38 610static int tcp_v6_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,
b71d1d42 611 const struct in6_addr *daddr, struct in6_addr *saddr,
318cf7aa 612 const struct tcphdr *th)
49a72dfb
AL
613{
614 struct tcp_md5sig_pool *hp;
cf80e0e4 615 struct ahash_request *req;
49a72dfb
AL
616
617 hp = tcp_get_md5sig_pool();
618 if (!hp)
619 goto clear_hash_noput;
cf80e0e4 620 req = hp->md5_req;
49a72dfb 621
cf80e0e4 622 if (crypto_ahash_init(req))
49a72dfb 623 goto clear_hash;
19689e38 624 if (tcp_v6_md5_hash_headers(hp, daddr, saddr, th, th->doff << 2))
49a72dfb
AL
625 goto clear_hash;
626 if (tcp_md5_hash_key(hp, key))
627 goto clear_hash;
cf80e0e4
HX
628 ahash_request_set_crypt(req, NULL, md5_hash, 0);
629 if (crypto_ahash_final(req))
cfb6eeb4 630 goto clear_hash;
cfb6eeb4 631
cfb6eeb4 632 tcp_put_md5sig_pool();
cfb6eeb4 633 return 0;
49a72dfb 634
cfb6eeb4
YH
635clear_hash:
636 tcp_put_md5sig_pool();
637clear_hash_noput:
638 memset(md5_hash, 0, 16);
49a72dfb 639 return 1;
cfb6eeb4
YH
640}
641
39f8e58e
ED
642static int tcp_v6_md5_hash_skb(char *md5_hash,
643 const struct tcp_md5sig_key *key,
318cf7aa 644 const struct sock *sk,
318cf7aa 645 const struct sk_buff *skb)
cfb6eeb4 646{
b71d1d42 647 const struct in6_addr *saddr, *daddr;
49a72dfb 648 struct tcp_md5sig_pool *hp;
cf80e0e4 649 struct ahash_request *req;
318cf7aa 650 const struct tcphdr *th = tcp_hdr(skb);
cfb6eeb4 651
39f8e58e
ED
652 if (sk) { /* valid for establish/request sockets */
653 saddr = &sk->sk_v6_rcv_saddr;
efe4208f 654 daddr = &sk->sk_v6_daddr;
49a72dfb 655 } else {
b71d1d42 656 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
49a72dfb
AL
657 saddr = &ip6h->saddr;
658 daddr = &ip6h->daddr;
cfb6eeb4 659 }
49a72dfb
AL
660
661 hp = tcp_get_md5sig_pool();
662 if (!hp)
663 goto clear_hash_noput;
cf80e0e4 664 req = hp->md5_req;
49a72dfb 665
cf80e0e4 666 if (crypto_ahash_init(req))
49a72dfb
AL
667 goto clear_hash;
668
19689e38 669 if (tcp_v6_md5_hash_headers(hp, daddr, saddr, th, skb->len))
49a72dfb
AL
670 goto clear_hash;
671 if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))
672 goto clear_hash;
673 if (tcp_md5_hash_key(hp, key))
674 goto clear_hash;
cf80e0e4
HX
675 ahash_request_set_crypt(req, NULL, md5_hash, 0);
676 if (crypto_ahash_final(req))
49a72dfb
AL
677 goto clear_hash;
678
679 tcp_put_md5sig_pool();
680 return 0;
681
682clear_hash:
683 tcp_put_md5sig_pool();
684clear_hash_noput:
685 memset(md5_hash, 0, 16);
686 return 1;
cfb6eeb4
YH
687}
688
ba8e275a
ED
689#endif
690
691static bool tcp_v6_inbound_md5_hash(const struct sock *sk,
692 const struct sk_buff *skb)
cfb6eeb4 693{
ba8e275a 694#ifdef CONFIG_TCP_MD5SIG
cf533ea5 695 const __u8 *hash_location = NULL;
cfb6eeb4 696 struct tcp_md5sig_key *hash_expected;
b71d1d42 697 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
318cf7aa 698 const struct tcphdr *th = tcp_hdr(skb);
cfb6eeb4 699 int genhash;
cfb6eeb4
YH
700 u8 newhash[16];
701
702 hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);
7d5d5525 703 hash_location = tcp_parse_md5sig_option(th);
cfb6eeb4 704
785957d3
DM
705 /* We've parsed the options - do we have a hash? */
706 if (!hash_expected && !hash_location)
ff74e23f 707 return false;
785957d3
DM
708
709 if (hash_expected && !hash_location) {
c10d9310 710 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);
ff74e23f 711 return true;
cfb6eeb4
YH
712 }
713
785957d3 714 if (!hash_expected && hash_location) {
c10d9310 715 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);
ff74e23f 716 return true;
cfb6eeb4
YH
717 }
718
719 /* check the signature */
49a72dfb
AL
720 genhash = tcp_v6_md5_hash_skb(newhash,
721 hash_expected,
39f8e58e 722 NULL, skb);
49a72dfb 723
cfb6eeb4 724 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
72145a68 725 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5FAILURE);
e87cc472
JP
726 net_info_ratelimited("MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
727 genhash ? "failed" : "mismatch",
728 &ip6h->saddr, ntohs(th->source),
729 &ip6h->daddr, ntohs(th->dest));
ff74e23f 730 return true;
cfb6eeb4 731 }
ba8e275a 732#endif
ff74e23f 733 return false;
cfb6eeb4 734}
cfb6eeb4 735
b40cf18e
ED
736static void tcp_v6_init_req(struct request_sock *req,
737 const struct sock *sk_listener,
16bea70a
OP
738 struct sk_buff *skb)
739{
740 struct inet_request_sock *ireq = inet_rsk(req);
b40cf18e 741 const struct ipv6_pinfo *np = inet6_sk(sk_listener);
16bea70a
OP
742
743 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
744 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
745
16bea70a 746 /* So that link locals have meaning */
b40cf18e 747 if (!sk_listener->sk_bound_dev_if &&
16bea70a 748 ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
870c3151 749 ireq->ir_iif = tcp_v6_iif(skb);
16bea70a 750
04317daf 751 if (!TCP_SKB_CB(skb)->tcp_tw_isn &&
b40cf18e 752 (ipv6_opt_accepted(sk_listener, skb, &TCP_SKB_CB(skb)->header.h6) ||
a224772d 753 np->rxopt.bits.rxinfo ||
16bea70a
OP
754 np->rxopt.bits.rxoinfo || np->rxopt.bits.rxhlim ||
755 np->rxopt.bits.rxohlim || np->repflow)) {
63354797 756 refcount_inc(&skb->users);
16bea70a
OP
757 ireq->pktopts = skb;
758 }
759}
760
f964629e
ED
761static struct dst_entry *tcp_v6_route_req(const struct sock *sk,
762 struct flowi *fl,
4396e461 763 const struct request_sock *req)
d94e0417 764{
f76b33c3 765 return inet6_csk_route_req(sk, &fl->u.ip6, req, IPPROTO_TCP);
d94e0417
OP
766}
767
c6aefafb 768struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
1da177e4 769 .family = AF_INET6,
2e6599cb 770 .obj_size = sizeof(struct tcp6_request_sock),
5db92c99 771 .rtx_syn_ack = tcp_rtx_synack,
60236fdd
ACM
772 .send_ack = tcp_v6_reqsk_send_ack,
773 .destructor = tcp_v6_reqsk_destructor,
72659ecc 774 .send_reset = tcp_v6_send_reset,
4aa956d8 775 .syn_ack_timeout = tcp_syn_ack_timeout,
1da177e4
LT
776};
777
b2e4b3de 778static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
2aec4a29
OP
779 .mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) -
780 sizeof(struct ipv6hdr),
16bea70a 781#ifdef CONFIG_TCP_MD5SIG
fd3a154a 782 .req_md5_lookup = tcp_v6_md5_lookup,
e3afe7b7 783 .calc_md5_hash = tcp_v6_md5_hash_skb,
b6332e6c 784#endif
16bea70a 785 .init_req = tcp_v6_init_req,
fb7b37a7
OP
786#ifdef CONFIG_SYN_COOKIES
787 .cookie_init_seq = cookie_v6_init_sequence,
788#endif
d94e0417 789 .route_req = tcp_v6_route_req,
84b114b9
ED
790 .init_seq = tcp_v6_init_seq,
791 .init_ts_off = tcp_v6_init_ts_off,
d6274bd8 792 .send_synack = tcp_v6_send_synack,
16bea70a 793};
cfb6eeb4 794
a00e7444 795static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32 seq,
0f85feae
ED
796 u32 ack, u32 win, u32 tsval, u32 tsecr,
797 int oif, struct tcp_md5sig_key *key, int rst,
5119bd16 798 u8 tclass, __be32 label)
1da177e4 799{
cf533ea5
ED
800 const struct tcphdr *th = tcp_hdr(skb);
801 struct tcphdr *t1;
1da177e4 802 struct sk_buff *buff;
4c9483b2 803 struct flowi6 fl6;
0f85feae 804 struct net *net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
e5047992 805 struct sock *ctl_sk = net->ipv6.tcp_sk;
77c676da 806 unsigned int tot_len = sizeof(struct tcphdr);
adf30907 807 struct dst_entry *dst;
81ada62d 808 __be32 *topt;
00483690 809 __u32 mark = 0;
1da177e4 810
ee684b6f 811 if (tsecr)
626e264d 812 tot_len += TCPOLEN_TSTAMP_ALIGNED;
cfb6eeb4 813#ifdef CONFIG_TCP_MD5SIG
cfb6eeb4
YH
814 if (key)
815 tot_len += TCPOLEN_MD5SIG_ALIGNED;
816#endif
817
cfb6eeb4 818 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1da177e4 819 GFP_ATOMIC);
63159f29 820 if (!buff)
1ab1457c 821 return;
1da177e4 822
cfb6eeb4 823 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1da177e4 824
d58ff351 825 t1 = skb_push(buff, tot_len);
6651ffc8 826 skb_reset_transport_header(buff);
1da177e4
LT
827
828 /* Swap the send and the receive. */
829 memset(t1, 0, sizeof(*t1));
830 t1->dest = th->source;
831 t1->source = th->dest;
cfb6eeb4 832 t1->doff = tot_len / 4;
626e264d
IJ
833 t1->seq = htonl(seq);
834 t1->ack_seq = htonl(ack);
835 t1->ack = !rst || !th->ack;
836 t1->rst = rst;
837 t1->window = htons(win);
1da177e4 838
81ada62d
IJ
839 topt = (__be32 *)(t1 + 1);
840
ee684b6f 841 if (tsecr) {
626e264d
IJ
842 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
843 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
ee684b6f
AV
844 *topt++ = htonl(tsval);
845 *topt++ = htonl(tsecr);
626e264d
IJ
846 }
847
cfb6eeb4
YH
848#ifdef CONFIG_TCP_MD5SIG
849 if (key) {
81ada62d
IJ
850 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
851 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
852 tcp_v6_md5_hash_hdr((__u8 *)topt, key,
78e645cb
IJ
853 &ipv6_hdr(skb)->saddr,
854 &ipv6_hdr(skb)->daddr, t1);
cfb6eeb4
YH
855 }
856#endif
857
4c9483b2 858 memset(&fl6, 0, sizeof(fl6));
4e3fd7a0
AD
859 fl6.daddr = ipv6_hdr(skb)->saddr;
860 fl6.saddr = ipv6_hdr(skb)->daddr;
1d13a96c 861 fl6.flowlabel = label;
1da177e4 862
e5700aff
DM
863 buff->ip_summed = CHECKSUM_PARTIAL;
864 buff->csum = 0;
865
4c9483b2 866 __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr);
1da177e4 867
4c9483b2 868 fl6.flowi6_proto = IPPROTO_TCP;
a36dbdb2 869 if (rt6_need_strict(&fl6.daddr) && !oif)
870c3151 870 fl6.flowi6_oif = tcp_v6_iif(skb);
9b6c14d5
DA
871 else {
872 if (!oif && netif_index_is_l3_master(net, skb->skb_iif))
873 oif = skb->skb_iif;
874
875 fl6.flowi6_oif = oif;
876 }
1d2f7b2d 877
00483690
JM
878 if (sk)
879 mark = (sk->sk_state == TCP_TIME_WAIT) ?
880 inet_twsk(sk)->tw_mark : sk->sk_mark;
881 fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark) ?: mark;
1958b856
DM
882 fl6.fl6_dport = t1->dest;
883 fl6.fl6_sport = t1->source;
e2d118a1 884 fl6.flowi6_uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);
4c9483b2 885 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 886
c20121ae
DL
887 /* Pass a socket to ip6_dst_lookup either it is for RST
888 * Underlying function will use this to retrieve the network
889 * namespace
890 */
0e0d44ab 891 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL);
68d0c6d3
DM
892 if (!IS_ERR(dst)) {
893 skb_dst_set(buff, dst);
92e55f41 894 ip6_xmit(ctl_sk, buff, &fl6, fl6.flowi6_mark, NULL, tclass);
c10d9310 895 TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
68d0c6d3 896 if (rst)
c10d9310 897 TCP_INC_STATS(net, TCP_MIB_OUTRSTS);
68d0c6d3 898 return;
1da177e4
LT
899 }
900
901 kfree_skb(buff);
902}
903
a00e7444 904static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb)
1da177e4 905{
cf533ea5 906 const struct tcphdr *th = tcp_hdr(skb);
626e264d 907 u32 seq = 0, ack_seq = 0;
fa3e5b4e 908 struct tcp_md5sig_key *key = NULL;
658ddaaf
SL
909#ifdef CONFIG_TCP_MD5SIG
910 const __u8 *hash_location = NULL;
911 struct ipv6hdr *ipv6h = ipv6_hdr(skb);
912 unsigned char newhash[16];
913 int genhash;
914 struct sock *sk1 = NULL;
915#endif
c24b14c4 916 int oif = 0;
1da177e4 917
626e264d 918 if (th->rst)
1da177e4
LT
919 return;
920
c3658e8d
ED
921 /* If sk not NULL, it means we did a successful lookup and incoming
922 * route had to be correct. prequeue might have dropped our dst.
923 */
924 if (!sk && !ipv6_unicast_destination(skb))
626e264d 925 return;
1da177e4 926
cfb6eeb4 927#ifdef CONFIG_TCP_MD5SIG
3b24d854 928 rcu_read_lock();
658ddaaf 929 hash_location = tcp_parse_md5sig_option(th);
271c3b9b 930 if (sk && sk_fullsock(sk)) {
e46787f0
FW
931 key = tcp_v6_md5_do_lookup(sk, &ipv6h->saddr);
932 } else if (hash_location) {
658ddaaf
SL
933 /*
934 * active side is lost. Try to find listening socket through
935 * source port, and then find md5 key through listening socket.
936 * we are not loose security here:
937 * Incoming packet is checked with md5 hash with finding key,
938 * no RST generated if md5 hash doesn't match.
939 */
940 sk1 = inet6_lookup_listener(dev_net(skb_dst(skb)->dev),
a583636a
CG
941 &tcp_hashinfo, NULL, 0,
942 &ipv6h->saddr,
5ba24953 943 th->source, &ipv6h->daddr,
24b711ed
DA
944 ntohs(th->source),
945 tcp_v6_iif_l3_slave(skb),
4297a0ef 946 tcp_v6_sdif(skb));
658ddaaf 947 if (!sk1)
3b24d854 948 goto out;
658ddaaf 949
658ddaaf
SL
950 key = tcp_v6_md5_do_lookup(sk1, &ipv6h->saddr);
951 if (!key)
3b24d854 952 goto out;
658ddaaf 953
39f8e58e 954 genhash = tcp_v6_md5_hash_skb(newhash, key, NULL, skb);
658ddaaf 955 if (genhash || memcmp(hash_location, newhash, 16) != 0)
3b24d854 956 goto out;
658ddaaf 957 }
cfb6eeb4
YH
958#endif
959
626e264d
IJ
960 if (th->ack)
961 seq = ntohl(th->ack_seq);
962 else
963 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
964 (th->doff << 2);
1da177e4 965
c24b14c4
SL
966 if (sk) {
967 oif = sk->sk_bound_dev_if;
5c487bb9
SL
968 if (sk_fullsock(sk))
969 trace_tcp_send_reset(sk, skb);
c24b14c4
SL
970 }
971
0f85feae 972 tcp_v6_send_response(sk, skb, seq, ack_seq, 0, 0, 0, oif, key, 1, 0, 0);
658ddaaf
SL
973
974#ifdef CONFIG_TCP_MD5SIG
3b24d854
ED
975out:
976 rcu_read_unlock();
658ddaaf 977#endif
626e264d 978}
1da177e4 979
a00e7444 980static void tcp_v6_send_ack(const struct sock *sk, struct sk_buff *skb, u32 seq,
0f85feae 981 u32 ack, u32 win, u32 tsval, u32 tsecr, int oif,
1d13a96c 982 struct tcp_md5sig_key *key, u8 tclass,
5119bd16 983 __be32 label)
626e264d 984{
0f85feae
ED
985 tcp_v6_send_response(sk, skb, seq, ack, win, tsval, tsecr, oif, key, 0,
986 tclass, label);
1da177e4
LT
987}
988
989static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
990{
8feaf0c0 991 struct inet_timewait_sock *tw = inet_twsk(sk);
cfb6eeb4 992 struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1da177e4 993
0f85feae 994 tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
8feaf0c0 995 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
9a568de4 996 tcp_time_stamp_raw() + tcptw->tw_ts_offset,
9c76a114 997 tcptw->tw_ts_recent, tw->tw_bound_dev_if, tcp_twsk_md5_key(tcptw),
21858cd0 998 tw->tw_tclass, cpu_to_be32(tw->tw_flowlabel));
1da177e4 999
8feaf0c0 1000 inet_twsk_put(tw);
1da177e4
LT
1001}
1002
a00e7444 1003static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
6edafaaf 1004 struct request_sock *req)
1da177e4 1005{
3a19ce0e
DL
1006 /* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV
1007 * sk->sk_state == TCP_SYN_RECV -> for Fast Open.
1008 */
20a2b49f
ED
1009 /* RFC 7323 2.3
1010 * The window field (SEG.WND) of every outgoing segment, with the
1011 * exception of <SYN> segments, MUST be right-shifted by
1012 * Rcv.Wind.Shift bits:
1013 */
0f85feae 1014 tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?
3a19ce0e 1015 tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,
20a2b49f
ED
1016 tcp_rsk(req)->rcv_nxt,
1017 req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale,
9a568de4 1018 tcp_time_stamp_raw() + tcp_rsk(req)->ts_off,
95a22cae 1019 req->ts_recent, sk->sk_bound_dev_if,
30791ac4 1020 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr),
1d13a96c 1021 0, 0);
1da177e4
LT
1022}
1023
1024
079096f1 1025static struct sock *tcp_v6_cookie_check(struct sock *sk, struct sk_buff *skb)
1da177e4 1026{
079096f1 1027#ifdef CONFIG_SYN_COOKIES
aa8223c7 1028 const struct tcphdr *th = tcp_hdr(skb);
1da177e4 1029
af9b4738 1030 if (!th->syn)
c6aefafb 1031 sk = cookie_v6_check(sk, skb);
1da177e4
LT
1032#endif
1033 return sk;
1034}
1035
1da177e4
LT
1036static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1037{
1da177e4
LT
1038 if (skb->protocol == htons(ETH_P_IP))
1039 return tcp_v4_conn_request(sk, skb);
1040
1041 if (!ipv6_unicast_destination(skb))
1ab1457c 1042 goto drop;
1da177e4 1043
1fb6f159
OP
1044 return tcp_conn_request(&tcp6_request_sock_ops,
1045 &tcp_request_sock_ipv6_ops, sk, skb);
1da177e4
LT
1046
1047drop:
9caad864 1048 tcp_listendrop(sk);
1da177e4
LT
1049 return 0; /* don't send reset */
1050}
1051
ebf6c9cb
ED
1052static void tcp_v6_restore_cb(struct sk_buff *skb)
1053{
1054 /* We need to move header back to the beginning if xfrm6_policy_check()
1055 * and tcp_v6_fill_cb() are going to be called again.
1056 * ip6_datagram_recv_specific_ctl() also expects IP6CB to be there.
1057 */
1058 memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6,
1059 sizeof(struct inet6_skb_parm));
1060}
1061
0c27171e 1062static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
4c99aa40 1063 struct request_sock *req,
5e0724d0
ED
1064 struct dst_entry *dst,
1065 struct request_sock *req_unhash,
1066 bool *own_req)
1da177e4 1067{
634fb979 1068 struct inet_request_sock *ireq;
0c27171e
ED
1069 struct ipv6_pinfo *newnp;
1070 const struct ipv6_pinfo *np = inet6_sk(sk);
45f6fad8 1071 struct ipv6_txoptions *opt;
1da177e4
LT
1072 struct tcp6_sock *newtcp6sk;
1073 struct inet_sock *newinet;
1074 struct tcp_sock *newtp;
1075 struct sock *newsk;
cfb6eeb4
YH
1076#ifdef CONFIG_TCP_MD5SIG
1077 struct tcp_md5sig_key *key;
1078#endif
3840a06e 1079 struct flowi6 fl6;
1da177e4
LT
1080
1081 if (skb->protocol == htons(ETH_P_IP)) {
1082 /*
1083 * v6 mapped
1084 */
1085
5e0724d0
ED
1086 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst,
1087 req_unhash, own_req);
1da177e4 1088
63159f29 1089 if (!newsk)
1da177e4
LT
1090 return NULL;
1091
1092 newtcp6sk = (struct tcp6_sock *)newsk;
1093 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1094
1095 newinet = inet_sk(newsk);
1096 newnp = inet6_sk(newsk);
1097 newtp = tcp_sk(newsk);
1098
1099 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1100
d1e559d0 1101 newnp->saddr = newsk->sk_v6_rcv_saddr;
1da177e4 1102
8292a17a 1103 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1da177e4 1104 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
cfb6eeb4
YH
1105#ifdef CONFIG_TCP_MD5SIG
1106 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1107#endif
1108
83eaddab 1109 newnp->ipv6_mc_list = NULL;
676a1184
YZ
1110 newnp->ipv6_ac_list = NULL;
1111 newnp->ipv6_fl_list = NULL;
1da177e4
LT
1112 newnp->pktoptions = NULL;
1113 newnp->opt = NULL;
870c3151 1114 newnp->mcast_oif = tcp_v6_iif(skb);
0660e03f 1115 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1397ed35 1116 newnp->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(skb));
df3687ff
FF
1117 if (np->repflow)
1118 newnp->flow_label = ip6_flowlabel(ipv6_hdr(skb));
1da177e4 1119
e6848976
ACM
1120 /*
1121 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
1122 * here, tcp_create_openreq_child now does this for us, see the comment in
1123 * that function for the gory details. -acme
1da177e4 1124 */
1da177e4
LT
1125
1126 /* It is tricky place. Until this moment IPv4 tcp
8292a17a 1127 worked with IPv6 icsk.icsk_af_ops.
1da177e4
LT
1128 Sync it now.
1129 */
d83d8461 1130 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1da177e4
LT
1131
1132 return newsk;
1133 }
1134
634fb979 1135 ireq = inet_rsk(req);
1da177e4
LT
1136
1137 if (sk_acceptq_is_full(sk))
1138 goto out_overflow;
1139
493f377d 1140 if (!dst) {
f76b33c3 1141 dst = inet6_csk_route_req(sk, &fl6, req, IPPROTO_TCP);
493f377d 1142 if (!dst)
1da177e4 1143 goto out;
1ab1457c 1144 }
1da177e4
LT
1145
1146 newsk = tcp_create_openreq_child(sk, req, skb);
63159f29 1147 if (!newsk)
093d2823 1148 goto out_nonewsk;
1da177e4 1149
e6848976
ACM
1150 /*
1151 * No need to charge this sock to the relevant IPv6 refcnt debug socks
1152 * count here, tcp_create_openreq_child now does this for us, see the
1153 * comment in that function for the gory details. -acme
1154 */
1da177e4 1155
59eed279 1156 newsk->sk_gso_type = SKB_GSO_TCPV6;
6bd4f355 1157 ip6_dst_store(newsk, dst, NULL, NULL);
fae6ef87 1158 inet6_sk_rx_dst_set(newsk, skb);
1da177e4
LT
1159
1160 newtcp6sk = (struct tcp6_sock *)newsk;
1161 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1162
1163 newtp = tcp_sk(newsk);
1164 newinet = inet_sk(newsk);
1165 newnp = inet6_sk(newsk);
1166
1167 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1168
634fb979
ED
1169 newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr;
1170 newnp->saddr = ireq->ir_v6_loc_addr;
1171 newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr;
1172 newsk->sk_bound_dev_if = ireq->ir_iif;
1da177e4 1173
1ab1457c 1174 /* Now IPv6 options...
1da177e4
LT
1175
1176 First: no IPv4 options.
1177 */
f6d8bd05 1178 newinet->inet_opt = NULL;
83eaddab 1179 newnp->ipv6_mc_list = NULL;
676a1184 1180 newnp->ipv6_ac_list = NULL;
d35690be 1181 newnp->ipv6_fl_list = NULL;
1da177e4
LT
1182
1183 /* Clone RX bits */
1184 newnp->rxopt.all = np->rxopt.all;
1185
1da177e4 1186 newnp->pktoptions = NULL;
1da177e4 1187 newnp->opt = NULL;
870c3151 1188 newnp->mcast_oif = tcp_v6_iif(skb);
0660e03f 1189 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1397ed35 1190 newnp->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(skb));
df3687ff
FF
1191 if (np->repflow)
1192 newnp->flow_label = ip6_flowlabel(ipv6_hdr(skb));
1da177e4
LT
1193
1194 /* Clone native IPv6 options from listening socket (if any)
1195
1196 Yes, keeping reference count would be much more clever,
1197 but we make one more one thing there: reattach optmem
1198 to newsk.
1199 */
56ac42bc
HD
1200 opt = ireq->ipv6_opt;
1201 if (!opt)
1202 opt = rcu_dereference(np->opt);
45f6fad8
ED
1203 if (opt) {
1204 opt = ipv6_dup_options(newsk, opt);
1205 RCU_INIT_POINTER(newnp->opt, opt);
1206 }
d83d8461 1207 inet_csk(newsk)->icsk_ext_hdr_len = 0;
45f6fad8
ED
1208 if (opt)
1209 inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen +
1210 opt->opt_flen;
1da177e4 1211
81164413
DB
1212 tcp_ca_openreq_child(newsk, dst);
1213
1da177e4 1214 tcp_sync_mss(newsk, dst_mtu(dst));
3541f9e8 1215 newtp->advmss = tcp_mss_clamp(tcp_sk(sk), dst_metric_advmss(dst));
d135c522 1216
1da177e4
LT
1217 tcp_initialize_rcv_mss(newsk);
1218
c720c7e8
ED
1219 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
1220 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
1da177e4 1221
cfb6eeb4
YH
1222#ifdef CONFIG_TCP_MD5SIG
1223 /* Copy over the MD5 key from the original socket */
4aa956d8 1224 key = tcp_v6_md5_do_lookup(sk, &newsk->sk_v6_daddr);
53b24b8f 1225 if (key) {
cfb6eeb4
YH
1226 /* We're using one, so create a matching key
1227 * on the newsk structure. If we fail to get
1228 * memory, then we end up not copying the key
1229 * across. Shucks.
1230 */
efe4208f 1231 tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newsk->sk_v6_daddr,
6797318e 1232 AF_INET6, 128, key->key, key->keylen,
7450aaf6 1233 sk_gfp_mask(sk, GFP_ATOMIC));
cfb6eeb4
YH
1234 }
1235#endif
1236
093d2823 1237 if (__inet_inherit_port(sk, newsk) < 0) {
e337e24d
CP
1238 inet_csk_prepare_forced_close(newsk);
1239 tcp_done(newsk);
093d2823
BS
1240 goto out;
1241 }
5e0724d0 1242 *own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash));
805c4bc0 1243 if (*own_req) {
49a496c9 1244 tcp_move_syn(newtp, req);
805c4bc0
ED
1245
1246 /* Clone pktoptions received with SYN, if we own the req */
1247 if (ireq->pktopts) {
1248 newnp->pktoptions = skb_clone(ireq->pktopts,
7450aaf6 1249 sk_gfp_mask(sk, GFP_ATOMIC));
805c4bc0
ED
1250 consume_skb(ireq->pktopts);
1251 ireq->pktopts = NULL;
ebf6c9cb
ED
1252 if (newnp->pktoptions) {
1253 tcp_v6_restore_cb(newnp->pktoptions);
805c4bc0 1254 skb_set_owner_r(newnp->pktoptions, newsk);
ebf6c9cb 1255 }
805c4bc0 1256 }
ce105008 1257 }
1da177e4
LT
1258
1259 return newsk;
1260
1261out_overflow:
02a1d6e7 1262 __NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
093d2823 1263out_nonewsk:
1da177e4 1264 dst_release(dst);
093d2823 1265out:
9caad864 1266 tcp_listendrop(sk);
1da177e4
LT
1267 return NULL;
1268}
1269
1da177e4 1270/* The socket must have it's spinlock held when we get
e994b2f0 1271 * here, unless it is a TCP_LISTEN socket.
1da177e4
LT
1272 *
1273 * We have a potential double-lock case here, so even when
1274 * doing backlog processing we use the BH locking scheme.
1275 * This is because we cannot sleep with the original spinlock
1276 * held.
1277 */
1278static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1279{
1280 struct ipv6_pinfo *np = inet6_sk(sk);
1281 struct tcp_sock *tp;
1282 struct sk_buff *opt_skb = NULL;
1283
1284 /* Imagine: socket is IPv6. IPv4 packet arrives,
1285 goes to IPv4 receive handler and backlogged.
1286 From backlog it always goes here. Kerboom...
1287 Fortunately, tcp_rcv_established and rcv_established
1288 handle them correctly, but it is not case with
1289 tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK
1290 */
1291
1292 if (skb->protocol == htons(ETH_P_IP))
1293 return tcp_v4_do_rcv(sk, skb);
1294
1da177e4
LT
1295 /*
1296 * socket locking is here for SMP purposes as backlog rcv
1297 * is currently called with bh processing disabled.
1298 */
1299
1300 /* Do Stevens' IPV6_PKTOPTIONS.
1301
1302 Yes, guys, it is the only place in our code, where we
1303 may make it not affecting IPv4.
1304 The rest of code is protocol independent,
1305 and I do not like idea to uglify IPv4.
1306
1307 Actually, all the idea behind IPV6_PKTOPTIONS
1308 looks not very well thought. For now we latch
1309 options, received in the last packet, enqueued
1310 by tcp. Feel free to propose better solution.
1ab1457c 1311 --ANK (980728)
1da177e4
LT
1312 */
1313 if (np->rxopt.all)
7450aaf6 1314 opt_skb = skb_clone(skb, sk_gfp_mask(sk, GFP_ATOMIC));
1da177e4
LT
1315
1316 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
5d299f3d
ED
1317 struct dst_entry *dst = sk->sk_rx_dst;
1318
bdeab991 1319 sock_rps_save_rxhash(sk, skb);
3d97379a 1320 sk_mark_napi_id(sk, skb);
5d299f3d
ED
1321 if (dst) {
1322 if (inet_sk(sk)->rx_dst_ifindex != skb->skb_iif ||
1323 dst->ops->check(dst, np->rx_dst_cookie) == NULL) {
1324 dst_release(dst);
1325 sk->sk_rx_dst = NULL;
1326 }
1327 }
1328
3d97d88e 1329 tcp_rcv_established(sk, skb);
1da177e4
LT
1330 if (opt_skb)
1331 goto ipv6_pktoptions;
1332 return 0;
1333 }
1334
12e25e10 1335 if (tcp_checksum_complete(skb))
1da177e4
LT
1336 goto csum_err;
1337
1ab1457c 1338 if (sk->sk_state == TCP_LISTEN) {
079096f1
ED
1339 struct sock *nsk = tcp_v6_cookie_check(sk, skb);
1340
1da177e4
LT
1341 if (!nsk)
1342 goto discard;
1343
4c99aa40 1344 if (nsk != sk) {
1da177e4
LT
1345 if (tcp_child_process(sk, nsk, skb))
1346 goto reset;
1347 if (opt_skb)
1348 __kfree_skb(opt_skb);
1349 return 0;
1350 }
47482f13 1351 } else
bdeab991 1352 sock_rps_save_rxhash(sk, skb);
1da177e4 1353
72ab4a86 1354 if (tcp_rcv_state_process(sk, skb))
1da177e4 1355 goto reset;
1da177e4
LT
1356 if (opt_skb)
1357 goto ipv6_pktoptions;
1358 return 0;
1359
1360reset:
cfb6eeb4 1361 tcp_v6_send_reset(sk, skb);
1da177e4
LT
1362discard:
1363 if (opt_skb)
1364 __kfree_skb(opt_skb);
1365 kfree_skb(skb);
1366 return 0;
1367csum_err:
c10d9310
ED
1368 TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS);
1369 TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
1da177e4
LT
1370 goto discard;
1371
1372
1373ipv6_pktoptions:
1374 /* Do you ask, what is it?
1375
1376 1. skb was enqueued by tcp.
1377 2. skb is added to tail of read queue, rather than out of order.
1378 3. socket is not in passive state.
1379 4. Finally, it really contains options, which user wants to receive.
1380 */
1381 tp = tcp_sk(sk);
1382 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1383 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
333fad53 1384 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
870c3151 1385 np->mcast_oif = tcp_v6_iif(opt_skb);
333fad53 1386 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
0660e03f 1387 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
82e9f105 1388 if (np->rxopt.bits.rxflow || np->rxopt.bits.rxtclass)
1397ed35 1389 np->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(opt_skb));
df3687ff
FF
1390 if (np->repflow)
1391 np->flow_label = ip6_flowlabel(ipv6_hdr(opt_skb));
a224772d 1392 if (ipv6_opt_accepted(sk, opt_skb, &TCP_SKB_CB(opt_skb)->header.h6)) {
1da177e4 1393 skb_set_owner_r(opt_skb, sk);
8ce48623 1394 tcp_v6_restore_cb(opt_skb);
1da177e4
LT
1395 opt_skb = xchg(&np->pktoptions, opt_skb);
1396 } else {
1397 __kfree_skb(opt_skb);
1398 opt_skb = xchg(&np->pktoptions, NULL);
1399 }
1400 }
1401
800d55f1 1402 kfree_skb(opt_skb);
1da177e4
LT
1403 return 0;
1404}
1405
2dc49d16
ND
1406static void tcp_v6_fill_cb(struct sk_buff *skb, const struct ipv6hdr *hdr,
1407 const struct tcphdr *th)
1408{
1409 /* This is tricky: we move IP6CB at its correct location into
1410 * TCP_SKB_CB(). It must be done after xfrm6_policy_check(), because
1411 * _decode_session6() uses IP6CB().
1412 * barrier() makes sure compiler won't play aliasing games.
1413 */
1414 memmove(&TCP_SKB_CB(skb)->header.h6, IP6CB(skb),
1415 sizeof(struct inet6_skb_parm));
1416 barrier();
1417
1418 TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1419 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1420 skb->len - th->doff*4);
1421 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1422 TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th);
1423 TCP_SKB_CB(skb)->tcp_tw_isn = 0;
1424 TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr);
1425 TCP_SKB_CB(skb)->sacked = 0;
98aaa913
MM
1426 TCP_SKB_CB(skb)->has_rxtstamp =
1427 skb->tstamp || skb_hwtstamps(skb)->hwtstamp;
2dc49d16
ND
1428}
1429
e5bbef20 1430static int tcp_v6_rcv(struct sk_buff *skb)
1da177e4 1431{
4297a0ef 1432 int sdif = inet6_sdif(skb);
cf533ea5 1433 const struct tcphdr *th;
b71d1d42 1434 const struct ipv6hdr *hdr;
3b24d854 1435 bool refcounted;
1da177e4
LT
1436 struct sock *sk;
1437 int ret;
a86b1e30 1438 struct net *net = dev_net(skb->dev);
1da177e4
LT
1439
1440 if (skb->pkt_type != PACKET_HOST)
1441 goto discard_it;
1442
1443 /*
1444 * Count it even if it's bad.
1445 */
90bbcc60 1446 __TCP_INC_STATS(net, TCP_MIB_INSEGS);
1da177e4
LT
1447
1448 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1449 goto discard_it;
1450
ea1627c2 1451 th = (const struct tcphdr *)skb->data;
1da177e4 1452
ea1627c2 1453 if (unlikely(th->doff < sizeof(struct tcphdr)/4))
1da177e4
LT
1454 goto bad_packet;
1455 if (!pskb_may_pull(skb, th->doff*4))
1456 goto discard_it;
1457
e4f45b7f 1458 if (skb_checksum_init(skb, IPPROTO_TCP, ip6_compute_pseudo))
6a5dc9e5 1459 goto csum_error;
1da177e4 1460
ea1627c2 1461 th = (const struct tcphdr *)skb->data;
e802af9c 1462 hdr = ipv6_hdr(skb);
1da177e4 1463
4bdc3d66 1464lookup:
a583636a 1465 sk = __inet6_lookup_skb(&tcp_hashinfo, skb, __tcp_hdrlen(th),
4297a0ef 1466 th->source, th->dest, inet6_iif(skb), sdif,
3b24d854 1467 &refcounted);
1da177e4
LT
1468 if (!sk)
1469 goto no_tcp_socket;
1470
1471process:
1472 if (sk->sk_state == TCP_TIME_WAIT)
1473 goto do_time_wait;
1474
079096f1
ED
1475 if (sk->sk_state == TCP_NEW_SYN_RECV) {
1476 struct request_sock *req = inet_reqsk(sk);
e0f9759f 1477 bool req_stolen = false;
7716682c 1478 struct sock *nsk;
079096f1
ED
1479
1480 sk = req->rsk_listener;
079096f1 1481 if (tcp_v6_inbound_md5_hash(sk, skb)) {
e65c332d 1482 sk_drops_add(sk, skb);
079096f1
ED
1483 reqsk_put(req);
1484 goto discard_it;
1485 }
4fd44a98
FL
1486 if (tcp_checksum_complete(skb)) {
1487 reqsk_put(req);
1488 goto csum_error;
1489 }
7716682c 1490 if (unlikely(sk->sk_state != TCP_LISTEN)) {
f03f2e15 1491 inet_csk_reqsk_queue_drop_and_put(sk, req);
4bdc3d66
ED
1492 goto lookup;
1493 }
7716682c 1494 sock_hold(sk);
3b24d854 1495 refcounted = true;
1f3b359f 1496 nsk = NULL;
eeea10b8
ED
1497 if (!tcp_filter(sk, skb)) {
1498 th = (const struct tcphdr *)skb->data;
1499 hdr = ipv6_hdr(skb);
1500 tcp_v6_fill_cb(skb, hdr, th);
e0f9759f 1501 nsk = tcp_check_req(sk, skb, req, false, &req_stolen);
eeea10b8 1502 }
079096f1
ED
1503 if (!nsk) {
1504 reqsk_put(req);
e0f9759f
ED
1505 if (req_stolen) {
1506 /* Another cpu got exclusive access to req
1507 * and created a full blown socket.
1508 * Try to feed this packet to this socket
1509 * instead of discarding it.
1510 */
1511 tcp_v6_restore_cb(skb);
1512 sock_put(sk);
1513 goto lookup;
1514 }
7716682c 1515 goto discard_and_relse;
079096f1
ED
1516 }
1517 if (nsk == sk) {
079096f1
ED
1518 reqsk_put(req);
1519 tcp_v6_restore_cb(skb);
1520 } else if (tcp_child_process(sk, nsk, skb)) {
1521 tcp_v6_send_reset(nsk, skb);
7716682c 1522 goto discard_and_relse;
079096f1 1523 } else {
7716682c 1524 sock_put(sk);
079096f1
ED
1525 return 0;
1526 }
1527 }
e802af9c 1528 if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) {
02a1d6e7 1529 __NET_INC_STATS(net, LINUX_MIB_TCPMINTTLDROP);
e802af9c
SH
1530 goto discard_and_relse;
1531 }
1532
1da177e4
LT
1533 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1534 goto discard_and_relse;
1535
9ea88a15
DP
1536 if (tcp_v6_inbound_md5_hash(sk, skb))
1537 goto discard_and_relse;
9ea88a15 1538
ac6e7800 1539 if (tcp_filter(sk, skb))
1da177e4 1540 goto discard_and_relse;
ac6e7800
ED
1541 th = (const struct tcphdr *)skb->data;
1542 hdr = ipv6_hdr(skb);
eeea10b8 1543 tcp_v6_fill_cb(skb, hdr, th);
1da177e4
LT
1544
1545 skb->dev = NULL;
1546
e994b2f0
ED
1547 if (sk->sk_state == TCP_LISTEN) {
1548 ret = tcp_v6_do_rcv(sk, skb);
1549 goto put_and_return;
1550 }
1551
1552 sk_incoming_cpu_update(sk);
1553
293b9c42 1554 bh_lock_sock_nested(sk);
a44d6eac 1555 tcp_segs_in(tcp_sk(sk), skb);
1da177e4
LT
1556 ret = 0;
1557 if (!sock_owned_by_user(sk)) {
e7942d06 1558 ret = tcp_v6_do_rcv(sk, skb);
c9c33212 1559 } else if (tcp_add_backlog(sk, skb)) {
6b03a53a
ZY
1560 goto discard_and_relse;
1561 }
1da177e4
LT
1562 bh_unlock_sock(sk);
1563
e994b2f0 1564put_and_return:
3b24d854
ED
1565 if (refcounted)
1566 sock_put(sk);
1da177e4
LT
1567 return ret ? -1 : 0;
1568
1569no_tcp_socket:
1570 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1571 goto discard_it;
1572
2dc49d16
ND
1573 tcp_v6_fill_cb(skb, hdr, th);
1574
12e25e10 1575 if (tcp_checksum_complete(skb)) {
6a5dc9e5 1576csum_error:
90bbcc60 1577 __TCP_INC_STATS(net, TCP_MIB_CSUMERRORS);
1da177e4 1578bad_packet:
90bbcc60 1579 __TCP_INC_STATS(net, TCP_MIB_INERRS);
1da177e4 1580 } else {
cfb6eeb4 1581 tcp_v6_send_reset(NULL, skb);
1da177e4
LT
1582 }
1583
1584discard_it:
1da177e4
LT
1585 kfree_skb(skb);
1586 return 0;
1587
1588discard_and_relse:
532182cd 1589 sk_drops_add(sk, skb);
3b24d854
ED
1590 if (refcounted)
1591 sock_put(sk);
1da177e4
LT
1592 goto discard_it;
1593
1594do_time_wait:
1595 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
9469c7b4 1596 inet_twsk_put(inet_twsk(sk));
1da177e4
LT
1597 goto discard_it;
1598 }
1599
2dc49d16
ND
1600 tcp_v6_fill_cb(skb, hdr, th);
1601
6a5dc9e5
ED
1602 if (tcp_checksum_complete(skb)) {
1603 inet_twsk_put(inet_twsk(sk));
1604 goto csum_error;
1da177e4
LT
1605 }
1606
9469c7b4 1607 switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1da177e4
LT
1608 case TCP_TW_SYN:
1609 {
1610 struct sock *sk2;
1611
c346dca1 1612 sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
a583636a 1613 skb, __tcp_hdrlen(th),
5ba24953 1614 &ipv6_hdr(skb)->saddr, th->source,
0660e03f 1615 &ipv6_hdr(skb)->daddr,
24b711ed
DA
1616 ntohs(th->dest),
1617 tcp_v6_iif_l3_slave(skb),
4297a0ef 1618 sdif);
53b24b8f 1619 if (sk2) {
295ff7ed 1620 struct inet_timewait_sock *tw = inet_twsk(sk);
dbe7faa4 1621 inet_twsk_deschedule_put(tw);
1da177e4 1622 sk = sk2;
4ad19de8 1623 tcp_v6_restore_cb(skb);
3b24d854 1624 refcounted = false;
1da177e4
LT
1625 goto process;
1626 }
1da177e4 1627 }
275757e6
GS
1628 /* to ACK */
1629 /* fall through */
1da177e4
LT
1630 case TCP_TW_ACK:
1631 tcp_v6_timewait_ack(sk, skb);
1632 break;
1633 case TCP_TW_RST:
271c3b9b
FW
1634 tcp_v6_send_reset(sk, skb);
1635 inet_twsk_deschedule_put(inet_twsk(sk));
1636 goto discard_it;
4aa956d8
WY
1637 case TCP_TW_SUCCESS:
1638 ;
1da177e4
LT
1639 }
1640 goto discard_it;
1641}
1642
c7109986
ED
1643static void tcp_v6_early_demux(struct sk_buff *skb)
1644{
1645 const struct ipv6hdr *hdr;
1646 const struct tcphdr *th;
1647 struct sock *sk;
1648
1649 if (skb->pkt_type != PACKET_HOST)
1650 return;
1651
1652 if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct tcphdr)))
1653 return;
1654
1655 hdr = ipv6_hdr(skb);
1656 th = tcp_hdr(skb);
1657
1658 if (th->doff < sizeof(struct tcphdr) / 4)
1659 return;
1660
870c3151 1661 /* Note : We use inet6_iif() here, not tcp_v6_iif() */
c7109986
ED
1662 sk = __inet6_lookup_established(dev_net(skb->dev), &tcp_hashinfo,
1663 &hdr->saddr, th->source,
1664 &hdr->daddr, ntohs(th->dest),
4297a0ef 1665 inet6_iif(skb), inet6_sdif(skb));
c7109986
ED
1666 if (sk) {
1667 skb->sk = sk;
1668 skb->destructor = sock_edemux;
f7e4eb03 1669 if (sk_fullsock(sk)) {
d0c294c5 1670 struct dst_entry *dst = READ_ONCE(sk->sk_rx_dst);
f3f12135 1671
c7109986 1672 if (dst)
5d299f3d 1673 dst = dst_check(dst, inet6_sk(sk)->rx_dst_cookie);
c7109986 1674 if (dst &&
f3f12135 1675 inet_sk(sk)->rx_dst_ifindex == skb->skb_iif)
c7109986
ED
1676 skb_dst_set_noref(skb, dst);
1677 }
1678 }
1679}
1680
ccb7c410
DM
1681static struct timewait_sock_ops tcp6_timewait_sock_ops = {
1682 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
1683 .twsk_unique = tcp_twsk_unique,
4aa956d8 1684 .twsk_destructor = tcp_twsk_destructor,
ccb7c410
DM
1685};
1686
3b401a81 1687static const struct inet_connection_sock_af_ops ipv6_specific = {
543d9cfe
ACM
1688 .queue_xmit = inet6_csk_xmit,
1689 .send_check = tcp_v6_send_check,
1690 .rebuild_header = inet6_sk_rebuild_header,
5d299f3d 1691 .sk_rx_dst_set = inet6_sk_rx_dst_set,
543d9cfe
ACM
1692 .conn_request = tcp_v6_conn_request,
1693 .syn_recv_sock = tcp_v6_syn_recv_sock,
543d9cfe 1694 .net_header_len = sizeof(struct ipv6hdr),
67469601 1695 .net_frag_header_len = sizeof(struct frag_hdr),
543d9cfe
ACM
1696 .setsockopt = ipv6_setsockopt,
1697 .getsockopt = ipv6_getsockopt,
1698 .addr2sockaddr = inet6_csk_addr2sockaddr,
1699 .sockaddr_len = sizeof(struct sockaddr_in6),
3fdadf7d 1700#ifdef CONFIG_COMPAT
543d9cfe
ACM
1701 .compat_setsockopt = compat_ipv6_setsockopt,
1702 .compat_getsockopt = compat_ipv6_getsockopt,
3fdadf7d 1703#endif
4fab9071 1704 .mtu_reduced = tcp_v6_mtu_reduced,
1da177e4
LT
1705};
1706
cfb6eeb4 1707#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 1708static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
cfb6eeb4 1709 .md5_lookup = tcp_v6_md5_lookup,
49a72dfb 1710 .calc_md5_hash = tcp_v6_md5_hash_skb,
cfb6eeb4 1711 .md5_parse = tcp_v6_parse_md5_keys,
cfb6eeb4 1712};
a928630a 1713#endif
cfb6eeb4 1714
1da177e4
LT
1715/*
1716 * TCP over IPv4 via INET6 API
1717 */
3b401a81 1718static const struct inet_connection_sock_af_ops ipv6_mapped = {
543d9cfe
ACM
1719 .queue_xmit = ip_queue_xmit,
1720 .send_check = tcp_v4_send_check,
1721 .rebuild_header = inet_sk_rebuild_header,
63d02d15 1722 .sk_rx_dst_set = inet_sk_rx_dst_set,
543d9cfe
ACM
1723 .conn_request = tcp_v6_conn_request,
1724 .syn_recv_sock = tcp_v6_syn_recv_sock,
543d9cfe
ACM
1725 .net_header_len = sizeof(struct iphdr),
1726 .setsockopt = ipv6_setsockopt,
1727 .getsockopt = ipv6_getsockopt,
1728 .addr2sockaddr = inet6_csk_addr2sockaddr,
1729 .sockaddr_len = sizeof(struct sockaddr_in6),
3fdadf7d 1730#ifdef CONFIG_COMPAT
543d9cfe
ACM
1731 .compat_setsockopt = compat_ipv6_setsockopt,
1732 .compat_getsockopt = compat_ipv6_getsockopt,
3fdadf7d 1733#endif
4fab9071 1734 .mtu_reduced = tcp_v4_mtu_reduced,
1da177e4
LT
1735};
1736
cfb6eeb4 1737#ifdef CONFIG_TCP_MD5SIG
b2e4b3de 1738static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
cfb6eeb4 1739 .md5_lookup = tcp_v4_md5_lookup,
49a72dfb 1740 .calc_md5_hash = tcp_v4_md5_hash_skb,
cfb6eeb4 1741 .md5_parse = tcp_v6_parse_md5_keys,
cfb6eeb4 1742};
a928630a 1743#endif
cfb6eeb4 1744
1da177e4
LT
1745/* NOTE: A lot of things set to zero explicitly by call to
1746 * sk_alloc() so need not be done here.
1747 */
1748static int tcp_v6_init_sock(struct sock *sk)
1749{
6687e988 1750 struct inet_connection_sock *icsk = inet_csk(sk);
1da177e4 1751
900f65d3 1752 tcp_init_sock(sk);
1da177e4 1753
8292a17a 1754 icsk->icsk_af_ops = &ipv6_specific;
1da177e4 1755
cfb6eeb4 1756#ifdef CONFIG_TCP_MD5SIG
ac807fa8 1757 tcp_sk(sk)->af_specific = &tcp_sock_ipv6_specific;
cfb6eeb4
YH
1758#endif
1759
1da177e4
LT
1760 return 0;
1761}
1762
7d06b2e0 1763static void tcp_v6_destroy_sock(struct sock *sk)
1da177e4 1764{
1da177e4 1765 tcp_v4_destroy_sock(sk);
7d06b2e0 1766 inet6_destroy_sock(sk);
1da177e4
LT
1767}
1768
952a10be 1769#ifdef CONFIG_PROC_FS
1da177e4 1770/* Proc filesystem TCPv6 sock list dumping. */
1ab1457c 1771static void get_openreq6(struct seq_file *seq,
aa3a0c8c 1772 const struct request_sock *req, int i)
1da177e4 1773{
fa76ce73 1774 long ttd = req->rsk_timer.expires - jiffies;
634fb979
ED
1775 const struct in6_addr *src = &inet_rsk(req)->ir_v6_loc_addr;
1776 const struct in6_addr *dest = &inet_rsk(req)->ir_v6_rmt_addr;
1da177e4
LT
1777
1778 if (ttd < 0)
1779 ttd = 0;
1780
1da177e4
LT
1781 seq_printf(seq,
1782 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
d14c5ab6 1783 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %d %d %pK\n",
1da177e4
LT
1784 i,
1785 src->s6_addr32[0], src->s6_addr32[1],
1786 src->s6_addr32[2], src->s6_addr32[3],
b44084c2 1787 inet_rsk(req)->ir_num,
1da177e4
LT
1788 dest->s6_addr32[0], dest->s6_addr32[1],
1789 dest->s6_addr32[2], dest->s6_addr32[3],
634fb979 1790 ntohs(inet_rsk(req)->ir_rmt_port),
1da177e4 1791 TCP_SYN_RECV,
4c99aa40 1792 0, 0, /* could print option size, but that is af dependent. */
1ab1457c
YH
1793 1, /* timers active (only the expire timer) */
1794 jiffies_to_clock_t(ttd),
e6c022a4 1795 req->num_timeout,
aa3a0c8c
ED
1796 from_kuid_munged(seq_user_ns(seq),
1797 sock_i_uid(req->rsk_listener)),
1ab1457c 1798 0, /* non standard timer */
1da177e4
LT
1799 0, /* open_requests have no inode */
1800 0, req);
1801}
1802
1803static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1804{
b71d1d42 1805 const struct in6_addr *dest, *src;
1da177e4
LT
1806 __u16 destp, srcp;
1807 int timer_active;
1808 unsigned long timer_expires;
cf533ea5
ED
1809 const struct inet_sock *inet = inet_sk(sp);
1810 const struct tcp_sock *tp = tcp_sk(sp);
463c84b9 1811 const struct inet_connection_sock *icsk = inet_csk(sp);
0536fcc0 1812 const struct fastopen_queue *fastopenq = &icsk->icsk_accept_queue.fastopenq;
00fd38d9
ED
1813 int rx_queue;
1814 int state;
1da177e4 1815
efe4208f
ED
1816 dest = &sp->sk_v6_daddr;
1817 src = &sp->sk_v6_rcv_saddr;
c720c7e8
ED
1818 destp = ntohs(inet->inet_dport);
1819 srcp = ntohs(inet->inet_sport);
463c84b9 1820
ce3cf4ec 1821 if (icsk->icsk_pending == ICSK_TIME_RETRANS ||
57dde7f7 1822 icsk->icsk_pending == ICSK_TIME_REO_TIMEOUT ||
ce3cf4ec 1823 icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) {
1da177e4 1824 timer_active = 1;
463c84b9
ACM
1825 timer_expires = icsk->icsk_timeout;
1826 } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
1da177e4 1827 timer_active = 4;
463c84b9 1828 timer_expires = icsk->icsk_timeout;
1da177e4
LT
1829 } else if (timer_pending(&sp->sk_timer)) {
1830 timer_active = 2;
1831 timer_expires = sp->sk_timer.expires;
1832 } else {
1833 timer_active = 0;
1834 timer_expires = jiffies;
1835 }
1836
986ffdfd 1837 state = inet_sk_state_load(sp);
00fd38d9
ED
1838 if (state == TCP_LISTEN)
1839 rx_queue = sp->sk_ack_backlog;
1840 else
1841 /* Because we don't lock the socket,
1842 * we might find a transient negative value.
1843 */
1844 rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0);
1845
1da177e4
LT
1846 seq_printf(seq,
1847 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
d14c5ab6 1848 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %lu %lu %u %u %d\n",
1da177e4
LT
1849 i,
1850 src->s6_addr32[0], src->s6_addr32[1],
1851 src->s6_addr32[2], src->s6_addr32[3], srcp,
1852 dest->s6_addr32[0], dest->s6_addr32[1],
1853 dest->s6_addr32[2], dest->s6_addr32[3], destp,
00fd38d9
ED
1854 state,
1855 tp->write_seq - tp->snd_una,
1856 rx_queue,
1da177e4 1857 timer_active,
a399a805 1858 jiffies_delta_to_clock_t(timer_expires - jiffies),
463c84b9 1859 icsk->icsk_retransmits,
a7cb5a49 1860 from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)),
6687e988 1861 icsk->icsk_probes_out,
1da177e4 1862 sock_i_ino(sp),
41c6d650 1863 refcount_read(&sp->sk_refcnt), sp,
7be87351
SH
1864 jiffies_to_clock_t(icsk->icsk_rto),
1865 jiffies_to_clock_t(icsk->icsk_ack.ato),
4c99aa40 1866 (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong,
0b6a05c1 1867 tp->snd_cwnd,
00fd38d9 1868 state == TCP_LISTEN ?
0536fcc0 1869 fastopenq->max_qlen :
0a672f74 1870 (tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh)
1da177e4
LT
1871 );
1872}
1873
1ab1457c 1874static void get_timewait6_sock(struct seq_file *seq,
8feaf0c0 1875 struct inet_timewait_sock *tw, int i)
1da177e4 1876{
789f558c 1877 long delta = tw->tw_timer.expires - jiffies;
b71d1d42 1878 const struct in6_addr *dest, *src;
1da177e4 1879 __u16 destp, srcp;
1da177e4 1880
efe4208f
ED
1881 dest = &tw->tw_v6_daddr;
1882 src = &tw->tw_v6_rcv_saddr;
1da177e4
LT
1883 destp = ntohs(tw->tw_dport);
1884 srcp = ntohs(tw->tw_sport);
1885
1886 seq_printf(seq,
1887 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
71338aa7 1888 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK\n",
1da177e4
LT
1889 i,
1890 src->s6_addr32[0], src->s6_addr32[1],
1891 src->s6_addr32[2], src->s6_addr32[3], srcp,
1892 dest->s6_addr32[0], dest->s6_addr32[1],
1893 dest->s6_addr32[2], dest->s6_addr32[3], destp,
1894 tw->tw_substate, 0, 0,
a399a805 1895 3, jiffies_delta_to_clock_t(delta), 0, 0, 0, 0,
41c6d650 1896 refcount_read(&tw->tw_refcnt), tw);
1da177e4
LT
1897}
1898
1da177e4
LT
1899static int tcp6_seq_show(struct seq_file *seq, void *v)
1900{
1901 struct tcp_iter_state *st;
05dbc7b5 1902 struct sock *sk = v;
1da177e4
LT
1903
1904 if (v == SEQ_START_TOKEN) {
1905 seq_puts(seq,
1906 " sl "
1907 "local_address "
1908 "remote_address "
1909 "st tx_queue rx_queue tr tm->when retrnsmt"
1910 " uid timeout inode\n");
1911 goto out;
1912 }
1913 st = seq->private;
1914
079096f1
ED
1915 if (sk->sk_state == TCP_TIME_WAIT)
1916 get_timewait6_sock(seq, v, st->num);
1917 else if (sk->sk_state == TCP_NEW_SYN_RECV)
aa3a0c8c 1918 get_openreq6(seq, v, st->num);
079096f1
ED
1919 else
1920 get_tcp6_sock(seq, v, st->num);
1da177e4
LT
1921out:
1922 return 0;
1923}
1924
37d849bb
CH
1925static const struct seq_operations tcp6_seq_ops = {
1926 .show = tcp6_seq_show,
1927 .start = tcp_seq_start,
1928 .next = tcp_seq_next,
1929 .stop = tcp_seq_stop,
1930};
1931
1da177e4 1932static struct tcp_seq_afinfo tcp6_seq_afinfo = {
1da177e4 1933 .family = AF_INET6,
1da177e4
LT
1934};
1935
2c8c1e72 1936int __net_init tcp6_proc_init(struct net *net)
1da177e4 1937{
c3506372
CH
1938 if (!proc_create_net_data("tcp6", 0444, net->proc_net, &tcp6_seq_ops,
1939 sizeof(struct tcp_iter_state), &tcp6_seq_afinfo))
37d849bb
CH
1940 return -ENOMEM;
1941 return 0;
1da177e4
LT
1942}
1943
6f8b13bc 1944void tcp6_proc_exit(struct net *net)
1da177e4 1945{
37d849bb 1946 remove_proc_entry("tcp6", net->proc_net);
1da177e4
LT
1947}
1948#endif
1949
1950struct proto tcpv6_prot = {
1951 .name = "TCPv6",
1952 .owner = THIS_MODULE,
1953 .close = tcp_close,
d74bad4e 1954 .pre_connect = tcp_v6_pre_connect,
1da177e4
LT
1955 .connect = tcp_v6_connect,
1956 .disconnect = tcp_disconnect,
463c84b9 1957 .accept = inet_csk_accept,
1da177e4
LT
1958 .ioctl = tcp_ioctl,
1959 .init = tcp_v6_init_sock,
1960 .destroy = tcp_v6_destroy_sock,
1961 .shutdown = tcp_shutdown,
1962 .setsockopt = tcp_setsockopt,
1963 .getsockopt = tcp_getsockopt,
4b9d07a4 1964 .keepalive = tcp_set_keepalive,
1da177e4 1965 .recvmsg = tcp_recvmsg,
7ba42910
CG
1966 .sendmsg = tcp_sendmsg,
1967 .sendpage = tcp_sendpage,
1da177e4 1968 .backlog_rcv = tcp_v6_do_rcv,
46d3ceab 1969 .release_cb = tcp_release_cb,
496611d7 1970 .hash = inet6_hash,
ab1e0a13
ACM
1971 .unhash = inet_unhash,
1972 .get_port = inet_csk_get_port,
1da177e4 1973 .enter_memory_pressure = tcp_enter_memory_pressure,
06044751 1974 .leave_memory_pressure = tcp_leave_memory_pressure,
c9bee3b7 1975 .stream_memory_free = tcp_stream_memory_free,
1da177e4
LT
1976 .sockets_allocated = &tcp_sockets_allocated,
1977 .memory_allocated = &tcp_memory_allocated,
1978 .memory_pressure = &tcp_memory_pressure,
0a5578cf 1979 .orphan_count = &tcp_orphan_count,
a4fe34bf 1980 .sysctl_mem = sysctl_tcp_mem,
356d1833
ED
1981 .sysctl_wmem_offset = offsetof(struct net, ipv4.sysctl_tcp_wmem),
1982 .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_tcp_rmem),
1da177e4
LT
1983 .max_header = MAX_TCP_HEADER,
1984 .obj_size = sizeof(struct tcp6_sock),
5f0d5a3a 1985 .slab_flags = SLAB_TYPESAFE_BY_RCU,
6d6ee43e 1986 .twsk_prot = &tcp6_timewait_sock_ops,
60236fdd 1987 .rsk_prot = &tcp6_request_sock_ops,
39d8cda7 1988 .h.hashinfo = &tcp_hashinfo,
7ba42910 1989 .no_autobind = true,
543d9cfe
ACM
1990#ifdef CONFIG_COMPAT
1991 .compat_setsockopt = compat_tcp_setsockopt,
1992 .compat_getsockopt = compat_tcp_getsockopt,
d1a4c0b3 1993#endif
c1e64e29 1994 .diag_destroy = tcp_abort,
1da177e4
LT
1995};
1996
a8e3bb34
DA
1997/* thinking of making this const? Don't.
1998 * early_demux can change based on sysctl.
1999 */
39294c3d 2000static struct inet6_protocol tcpv6_protocol = {
c7109986 2001 .early_demux = tcp_v6_early_demux,
dddb64bc 2002 .early_demux_handler = tcp_v6_early_demux,
1da177e4
LT
2003 .handler = tcp_v6_rcv,
2004 .err_handler = tcp_v6_err,
2005 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2006};
2007
1da177e4
LT
2008static struct inet_protosw tcpv6_protosw = {
2009 .type = SOCK_STREAM,
2010 .protocol = IPPROTO_TCP,
2011 .prot = &tcpv6_prot,
2012 .ops = &inet6_stream_ops,
d83d8461
ACM
2013 .flags = INET_PROTOSW_PERMANENT |
2014 INET_PROTOSW_ICSK,
1da177e4
LT
2015};
2016
2c8c1e72 2017static int __net_init tcpv6_net_init(struct net *net)
93ec926b 2018{
5677242f
DL
2019 return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
2020 SOCK_RAW, IPPROTO_TCP, net);
93ec926b
DL
2021}
2022
2c8c1e72 2023static void __net_exit tcpv6_net_exit(struct net *net)
93ec926b 2024{
5677242f 2025 inet_ctl_sock_destroy(net->ipv6.tcp_sk);
b099ce26
EB
2026}
2027
2c8c1e72 2028static void __net_exit tcpv6_net_exit_batch(struct list_head *net_exit_list)
b099ce26 2029{
1946e672 2030 inet_twsk_purge(&tcp_hashinfo, AF_INET6);
93ec926b
DL
2031}
2032
2033static struct pernet_operations tcpv6_net_ops = {
b099ce26
EB
2034 .init = tcpv6_net_init,
2035 .exit = tcpv6_net_exit,
2036 .exit_batch = tcpv6_net_exit_batch,
93ec926b
DL
2037};
2038
7f4e4868 2039int __init tcpv6_init(void)
1da177e4 2040{
7f4e4868
DL
2041 int ret;
2042
3336288a
VY
2043 ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2044 if (ret)
c6b641a4 2045 goto out;
3336288a 2046
1da177e4 2047 /* register inet6 protocol */
7f4e4868
DL
2048 ret = inet6_register_protosw(&tcpv6_protosw);
2049 if (ret)
2050 goto out_tcpv6_protocol;
2051
93ec926b 2052 ret = register_pernet_subsys(&tcpv6_net_ops);
7f4e4868
DL
2053 if (ret)
2054 goto out_tcpv6_protosw;
2055out:
2056 return ret;
ae0f7d5f 2057
7f4e4868
DL
2058out_tcpv6_protosw:
2059 inet6_unregister_protosw(&tcpv6_protosw);
3336288a
VY
2060out_tcpv6_protocol:
2061 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
7f4e4868
DL
2062 goto out;
2063}
2064
09f7709f 2065void tcpv6_exit(void)
7f4e4868 2066{
93ec926b 2067 unregister_pernet_subsys(&tcpv6_net_ops);
7f4e4868
DL
2068 inet6_unregister_protosw(&tcpv6_protosw);
2069 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
1da177e4 2070}