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