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