1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Linux INET6 implementation
10 * linux/net/ipv4/tcp.c
11 * linux/net/ipv4/tcp_input.c
12 * linux/net/ipv4/tcp_output.c
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.
22 #include <linux/bottom_half.h>
23 #include <linux/module.h>
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>
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>
37 #include <linux/slab.h>
38 #include <linux/uaccess.h>
39 #include <linux/ipv6.h>
40 #include <linux/icmpv6.h>
41 #include <linux/random.h>
42 #include <linux/indirect_call_wrapper.h>
45 #include <net/ndisc.h>
46 #include <net/inet6_hashtables.h>
47 #include <net/inet6_connection_sock.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>
57 #include <net/dsfield.h>
58 #include <net/timewait_sock.h>
59 #include <net/inet_common.h>
60 #include <net/secure_seq.h>
61 #include <net/busy_poll.h>
63 #include <linux/proc_fs.h>
64 #include <linux/seq_file.h>
66 #include <crypto/hash.h>
67 #include <linux/scatterlist.h>
69 #include <trace/events/tcp.h>
71 static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb);
72 static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
73 struct request_sock *req);
75 INDIRECT_CALLABLE_SCOPE int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
77 static const struct inet_connection_sock_af_ops ipv6_mapped;
78 const struct inet_connection_sock_af_ops ipv6_specific;
79 #ifdef CONFIG_TCP_MD5SIG
80 static const struct tcp_sock_af_ops tcp_sock_ipv6_specific;
81 static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
83 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(const struct sock *sk,
84 const struct in6_addr *addr,
91 /* Helper returning the inet6 address from a given tcp socket.
92 * It can be used in TCP stack instead of inet6_sk(sk).
93 * This avoids a dereference and allow compiler optimizations.
94 * It is a specialized version of inet6_sk_generic().
96 static struct ipv6_pinfo *tcp_inet6_sk(const struct sock *sk)
98 unsigned int offset = sizeof(struct tcp6_sock) - sizeof(struct ipv6_pinfo);
100 return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
103 static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
105 struct dst_entry *dst = skb_dst(skb);
107 if (dst && dst_hold_safe(dst)) {
108 const struct rt6_info *rt = (const struct rt6_info *)dst;
110 rcu_assign_pointer(sk->sk_rx_dst, dst);
111 sk->sk_rx_dst_ifindex = skb->skb_iif;
112 sk->sk_rx_dst_cookie = rt6_get_cookie(rt);
116 static u32 tcp_v6_init_seq(const struct sk_buff *skb)
118 return secure_tcpv6_seq(ipv6_hdr(skb)->daddr.s6_addr32,
119 ipv6_hdr(skb)->saddr.s6_addr32,
121 tcp_hdr(skb)->source);
124 static u32 tcp_v6_init_ts_off(const struct net *net, const struct sk_buff *skb)
126 return secure_tcpv6_ts_off(net, ipv6_hdr(skb)->daddr.s6_addr32,
127 ipv6_hdr(skb)->saddr.s6_addr32);
130 static int tcp_v6_pre_connect(struct sock *sk, struct sockaddr *uaddr,
133 /* This check is replicated from tcp_v6_connect() and intended to
134 * prevent BPF program called below from accessing bytes that are out
135 * of the bound specified by user in addr_len.
137 if (addr_len < SIN6_LEN_RFC2133)
140 sock_owned_by_me(sk);
142 return BPF_CGROUP_RUN_PROG_INET6_CONNECT(sk, uaddr);
145 static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
148 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
149 struct inet_connection_sock *icsk = inet_csk(sk);
150 struct in6_addr *saddr = NULL, *final_p, final;
151 struct inet_timewait_death_row *tcp_death_row;
152 struct ipv6_pinfo *np = tcp_inet6_sk(sk);
153 struct inet_sock *inet = inet_sk(sk);
154 struct tcp_sock *tp = tcp_sk(sk);
155 struct net *net = sock_net(sk);
156 struct ipv6_txoptions *opt;
157 struct dst_entry *dst;
162 if (addr_len < SIN6_LEN_RFC2133)
165 if (usin->sin6_family != AF_INET6)
166 return -EAFNOSUPPORT;
168 memset(&fl6, 0, sizeof(fl6));
171 fl6.flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
172 IP6_ECN_flow_init(fl6.flowlabel);
173 if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
174 struct ip6_flowlabel *flowlabel;
175 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
176 if (IS_ERR(flowlabel))
178 fl6_sock_release(flowlabel);
183 * connect() to INADDR_ANY means loopback (BSD'ism).
186 if (ipv6_addr_any(&usin->sin6_addr)) {
187 if (ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))
188 ipv6_addr_set_v4mapped(htonl(INADDR_LOOPBACK),
191 usin->sin6_addr = in6addr_loopback;
194 addr_type = ipv6_addr_type(&usin->sin6_addr);
196 if (addr_type & IPV6_ADDR_MULTICAST)
199 if (addr_type&IPV6_ADDR_LINKLOCAL) {
200 if (addr_len >= sizeof(struct sockaddr_in6) &&
201 usin->sin6_scope_id) {
202 /* If interface is set while binding, indices
205 if (!sk_dev_equal_l3scope(sk, usin->sin6_scope_id))
208 sk->sk_bound_dev_if = usin->sin6_scope_id;
211 /* Connect to link-local address requires an interface */
212 if (!sk->sk_bound_dev_if)
216 if (tp->rx_opt.ts_recent_stamp &&
217 !ipv6_addr_equal(&sk->sk_v6_daddr, &usin->sin6_addr)) {
218 tp->rx_opt.ts_recent = 0;
219 tp->rx_opt.ts_recent_stamp = 0;
220 WRITE_ONCE(tp->write_seq, 0);
223 sk->sk_v6_daddr = usin->sin6_addr;
224 np->flow_label = fl6.flowlabel;
230 if (addr_type & IPV6_ADDR_MAPPED) {
231 u32 exthdrlen = icsk->icsk_ext_hdr_len;
232 struct sockaddr_in sin;
234 if (ipv6_only_sock(sk))
237 sin.sin_family = AF_INET;
238 sin.sin_port = usin->sin6_port;
239 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
241 /* Paired with READ_ONCE() in tcp_(get|set)sockopt() */
242 WRITE_ONCE(icsk->icsk_af_ops, &ipv6_mapped);
244 mptcpv6_handle_mapped(sk, true);
245 sk->sk_backlog_rcv = tcp_v4_do_rcv;
246 #ifdef CONFIG_TCP_MD5SIG
247 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
250 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
253 icsk->icsk_ext_hdr_len = exthdrlen;
254 /* Paired with READ_ONCE() in tcp_(get|set)sockopt() */
255 WRITE_ONCE(icsk->icsk_af_ops, &ipv6_specific);
257 mptcpv6_handle_mapped(sk, false);
258 sk->sk_backlog_rcv = tcp_v6_do_rcv;
259 #ifdef CONFIG_TCP_MD5SIG
260 tp->af_specific = &tcp_sock_ipv6_specific;
264 np->saddr = sk->sk_v6_rcv_saddr;
269 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
270 saddr = &sk->sk_v6_rcv_saddr;
272 fl6.flowi6_proto = IPPROTO_TCP;
273 fl6.daddr = sk->sk_v6_daddr;
274 fl6.saddr = saddr ? *saddr : np->saddr;
275 fl6.flowi6_oif = sk->sk_bound_dev_if;
276 fl6.flowi6_mark = sk->sk_mark;
277 fl6.fl6_dport = usin->sin6_port;
278 fl6.fl6_sport = inet->inet_sport;
279 fl6.flowi6_uid = sk->sk_uid;
281 opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
282 final_p = fl6_update_dst(&fl6, opt, &final);
284 security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
286 dst = ip6_dst_lookup_flow(net, sk, &fl6, final_p);
292 tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row;
297 err = inet_bhash2_update_saddr(sk, saddr, AF_INET6);
302 /* set the source address */
304 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
306 sk->sk_gso_type = SKB_GSO_TCPV6;
307 ip6_dst_store(sk, dst, NULL, NULL);
309 icsk->icsk_ext_hdr_len = 0;
311 icsk->icsk_ext_hdr_len = opt->opt_flen +
314 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
316 inet->inet_dport = usin->sin6_port;
318 tcp_set_state(sk, TCP_SYN_SENT);
319 err = inet6_hash_connect(tcp_death_row, sk);
325 if (likely(!tp->repair)) {
327 WRITE_ONCE(tp->write_seq,
328 secure_tcpv6_seq(np->saddr.s6_addr32,
329 sk->sk_v6_daddr.s6_addr32,
332 tp->tsoffset = secure_tcpv6_ts_off(net, np->saddr.s6_addr32,
333 sk->sk_v6_daddr.s6_addr32);
336 if (tcp_fastopen_defer_connect(sk, &err))
341 err = tcp_connect(sk);
348 tcp_set_state(sk, TCP_CLOSE);
349 inet_bhash2_reset_saddr(sk);
351 inet->inet_dport = 0;
352 sk->sk_route_caps = 0;
356 static void tcp_v6_mtu_reduced(struct sock *sk)
358 struct dst_entry *dst;
361 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
364 mtu = READ_ONCE(tcp_sk(sk)->mtu_info);
366 /* Drop requests trying to increase our current mss.
367 * Check done in __ip6_rt_update_pmtu() is too late.
369 if (tcp_mtu_to_mss(sk, mtu) >= tcp_sk(sk)->mss_cache)
372 dst = inet6_csk_update_pmtu(sk, mtu);
376 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
377 tcp_sync_mss(sk, dst_mtu(dst));
378 tcp_simple_retransmit(sk);
382 static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
383 u8 type, u8 code, int offset, __be32 info)
385 const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
386 const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
387 struct net *net = dev_net(skb->dev);
388 struct request_sock *fastopen;
389 struct ipv6_pinfo *np;
396 sk = __inet6_lookup_established(net, net->ipv4.tcp_death_row.hashinfo,
397 &hdr->daddr, th->dest,
398 &hdr->saddr, ntohs(th->source),
399 skb->dev->ifindex, inet6_sdif(skb));
402 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev),
407 if (sk->sk_state == TCP_TIME_WAIT) {
408 inet_twsk_put(inet_twsk(sk));
411 seq = ntohl(th->seq);
412 fatal = icmpv6_err_convert(type, code, &err);
413 if (sk->sk_state == TCP_NEW_SYN_RECV) {
414 tcp_req_err(sk, seq, fatal);
419 if (sock_owned_by_user(sk) && type != ICMPV6_PKT_TOOBIG)
420 __NET_INC_STATS(net, LINUX_MIB_LOCKDROPPEDICMPS);
422 if (sk->sk_state == TCP_CLOSE)
425 if (static_branch_unlikely(&ip6_min_hopcount)) {
426 /* min_hopcount can be changed concurrently from do_ipv6_setsockopt() */
427 if (ipv6_hdr(skb)->hop_limit < READ_ONCE(tcp_inet6_sk(sk)->min_hopcount)) {
428 __NET_INC_STATS(net, LINUX_MIB_TCPMINTTLDROP);
434 /* XXX (TFO) - tp->snd_una should be ISN (tcp_create_openreq_child() */
435 fastopen = rcu_dereference(tp->fastopen_rsk);
436 snd_una = fastopen ? tcp_rsk(fastopen)->snt_isn : tp->snd_una;
437 if (sk->sk_state != TCP_LISTEN &&
438 !between(seq, snd_una, tp->snd_nxt)) {
439 __NET_INC_STATS(net, LINUX_MIB_OUTOFWINDOWICMPS);
443 np = tcp_inet6_sk(sk);
445 if (type == NDISC_REDIRECT) {
446 if (!sock_owned_by_user(sk)) {
447 struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
450 dst->ops->redirect(dst, sk, skb);
455 if (type == ICMPV6_PKT_TOOBIG) {
456 u32 mtu = ntohl(info);
458 /* We are not interested in TCP_LISTEN and open_requests
459 * (SYN-ACKs send out by Linux are always <576bytes so
460 * they should go through unfragmented).
462 if (sk->sk_state == TCP_LISTEN)
465 if (!ip6_sk_accept_pmtu(sk))
468 if (mtu < IPV6_MIN_MTU)
471 WRITE_ONCE(tp->mtu_info, mtu);
473 if (!sock_owned_by_user(sk))
474 tcp_v6_mtu_reduced(sk);
475 else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
482 /* Might be for an request_sock */
483 switch (sk->sk_state) {
486 /* Only in fast or simultaneous open. If a fast open socket is
487 * already accepted it is treated as a connected one below.
489 if (fastopen && !fastopen->sk)
492 ipv6_icmp_error(sk, skb, err, th->dest, ntohl(info), (u8 *)th);
494 if (!sock_owned_by_user(sk)) {
496 sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
500 sk->sk_err_soft = err;
505 /* check if this ICMP message allows revert of backoff.
508 if (!fastopen && type == ICMPV6_DEST_UNREACH &&
509 code == ICMPV6_NOROUTE)
510 tcp_ld_RTO_revert(sk, seq);
513 if (!sock_owned_by_user(sk) && np->recverr) {
517 sk->sk_err_soft = err;
526 static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
528 struct request_sock *req,
529 struct tcp_fastopen_cookie *foc,
530 enum tcp_synack_type synack_type,
531 struct sk_buff *syn_skb)
533 struct inet_request_sock *ireq = inet_rsk(req);
534 struct ipv6_pinfo *np = tcp_inet6_sk(sk);
535 struct ipv6_txoptions *opt;
536 struct flowi6 *fl6 = &fl->u.ip6;
541 /* First, grab a route. */
542 if (!dst && (dst = inet6_csk_route_req(sk, fl6, req,
543 IPPROTO_TCP)) == NULL)
546 skb = tcp_make_synack(sk, dst, req, foc, synack_type, syn_skb);
549 __tcp_v6_send_check(skb, &ireq->ir_v6_loc_addr,
550 &ireq->ir_v6_rmt_addr);
552 fl6->daddr = ireq->ir_v6_rmt_addr;
553 if (np->repflow && ireq->pktopts)
554 fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts));
556 tclass = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_reflect_tos) ?
557 (tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
558 (np->tclass & INET_ECN_MASK) :
561 if (!INET_ECN_is_capable(tclass) &&
562 tcp_bpf_ca_needs_ecn((struct sock *)req))
563 tclass |= INET_ECN_ECT_0;
566 opt = ireq->ipv6_opt;
568 opt = rcu_dereference(np->opt);
569 err = ip6_xmit(sk, skb, fl6, skb->mark ? : sk->sk_mark, opt,
570 tclass, sk->sk_priority);
572 err = net_xmit_eval(err);
580 static void tcp_v6_reqsk_destructor(struct request_sock *req)
582 kfree(inet_rsk(req)->ipv6_opt);
583 consume_skb(inet_rsk(req)->pktopts);
586 #ifdef CONFIG_TCP_MD5SIG
587 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(const struct sock *sk,
588 const struct in6_addr *addr,
591 return tcp_md5_do_lookup(sk, l3index,
592 (union tcp_md5_addr *)addr, AF_INET6);
595 static struct tcp_md5sig_key *tcp_v6_md5_lookup(const struct sock *sk,
596 const struct sock *addr_sk)
600 l3index = l3mdev_master_ifindex_by_index(sock_net(sk),
601 addr_sk->sk_bound_dev_if);
602 return tcp_v6_md5_do_lookup(sk, &addr_sk->sk_v6_daddr,
606 static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
607 sockptr_t optval, int optlen)
609 struct tcp_md5sig cmd;
610 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
615 if (optlen < sizeof(cmd))
618 if (copy_from_sockptr(&cmd, optval, sizeof(cmd)))
621 if (sin6->sin6_family != AF_INET6)
624 flags = cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX;
626 if (optname == TCP_MD5SIG_EXT &&
627 cmd.tcpm_flags & TCP_MD5SIG_FLAG_PREFIX) {
628 prefixlen = cmd.tcpm_prefixlen;
629 if (prefixlen > 128 || (ipv6_addr_v4mapped(&sin6->sin6_addr) &&
633 prefixlen = ipv6_addr_v4mapped(&sin6->sin6_addr) ? 32 : 128;
636 if (optname == TCP_MD5SIG_EXT && cmd.tcpm_ifindex &&
637 cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX) {
638 struct net_device *dev;
641 dev = dev_get_by_index_rcu(sock_net(sk), cmd.tcpm_ifindex);
642 if (dev && netif_is_l3_master(dev))
643 l3index = dev->ifindex;
646 /* ok to reference set/not set outside of rcu;
647 * right now device MUST be an L3 master
649 if (!dev || !l3index)
653 if (!cmd.tcpm_keylen) {
654 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
655 return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
658 return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
659 AF_INET6, prefixlen, l3index, flags);
662 if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
665 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
666 return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
667 AF_INET, prefixlen, l3index, flags,
668 cmd.tcpm_key, cmd.tcpm_keylen);
670 return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
671 AF_INET6, prefixlen, l3index, flags,
672 cmd.tcpm_key, cmd.tcpm_keylen);
675 static int tcp_v6_md5_hash_headers(struct tcp_md5sig_pool *hp,
676 const struct in6_addr *daddr,
677 const struct in6_addr *saddr,
678 const struct tcphdr *th, int nbytes)
680 struct tcp6_pseudohdr *bp;
681 struct scatterlist sg;
685 /* 1. TCP pseudo-header (RFC2460) */
688 bp->protocol = cpu_to_be32(IPPROTO_TCP);
689 bp->len = cpu_to_be32(nbytes);
691 _th = (struct tcphdr *)(bp + 1);
692 memcpy(_th, th, sizeof(*th));
695 sg_init_one(&sg, bp, sizeof(*bp) + sizeof(*th));
696 ahash_request_set_crypt(hp->md5_req, &sg, NULL,
697 sizeof(*bp) + sizeof(*th));
698 return crypto_ahash_update(hp->md5_req);
701 static int tcp_v6_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,
702 const struct in6_addr *daddr, struct in6_addr *saddr,
703 const struct tcphdr *th)
705 struct tcp_md5sig_pool *hp;
706 struct ahash_request *req;
708 hp = tcp_get_md5sig_pool();
710 goto clear_hash_noput;
713 if (crypto_ahash_init(req))
715 if (tcp_v6_md5_hash_headers(hp, daddr, saddr, th, th->doff << 2))
717 if (tcp_md5_hash_key(hp, key))
719 ahash_request_set_crypt(req, NULL, md5_hash, 0);
720 if (crypto_ahash_final(req))
723 tcp_put_md5sig_pool();
727 tcp_put_md5sig_pool();
729 memset(md5_hash, 0, 16);
733 static int tcp_v6_md5_hash_skb(char *md5_hash,
734 const struct tcp_md5sig_key *key,
735 const struct sock *sk,
736 const struct sk_buff *skb)
738 const struct in6_addr *saddr, *daddr;
739 struct tcp_md5sig_pool *hp;
740 struct ahash_request *req;
741 const struct tcphdr *th = tcp_hdr(skb);
743 if (sk) { /* valid for establish/request sockets */
744 saddr = &sk->sk_v6_rcv_saddr;
745 daddr = &sk->sk_v6_daddr;
747 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
748 saddr = &ip6h->saddr;
749 daddr = &ip6h->daddr;
752 hp = tcp_get_md5sig_pool();
754 goto clear_hash_noput;
757 if (crypto_ahash_init(req))
760 if (tcp_v6_md5_hash_headers(hp, daddr, saddr, th, skb->len))
762 if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))
764 if (tcp_md5_hash_key(hp, key))
766 ahash_request_set_crypt(req, NULL, md5_hash, 0);
767 if (crypto_ahash_final(req))
770 tcp_put_md5sig_pool();
774 tcp_put_md5sig_pool();
776 memset(md5_hash, 0, 16);
782 static void tcp_v6_init_req(struct request_sock *req,
783 const struct sock *sk_listener,
786 bool l3_slave = ipv6_l3mdev_skb(TCP_SKB_CB(skb)->header.h6.flags);
787 struct inet_request_sock *ireq = inet_rsk(req);
788 const struct ipv6_pinfo *np = tcp_inet6_sk(sk_listener);
790 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
791 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
793 /* So that link locals have meaning */
794 if ((!sk_listener->sk_bound_dev_if || l3_slave) &&
795 ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
796 ireq->ir_iif = tcp_v6_iif(skb);
798 if (!TCP_SKB_CB(skb)->tcp_tw_isn &&
799 (ipv6_opt_accepted(sk_listener, skb, &TCP_SKB_CB(skb)->header.h6) ||
800 np->rxopt.bits.rxinfo ||
801 np->rxopt.bits.rxoinfo || np->rxopt.bits.rxhlim ||
802 np->rxopt.bits.rxohlim || np->repflow)) {
803 refcount_inc(&skb->users);
808 static struct dst_entry *tcp_v6_route_req(const struct sock *sk,
811 struct request_sock *req)
813 tcp_v6_init_req(req, sk, skb);
815 if (security_inet_conn_request(sk, skb, req))
818 return inet6_csk_route_req(sk, &fl->u.ip6, req, IPPROTO_TCP);
821 struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
823 .obj_size = sizeof(struct tcp6_request_sock),
824 .rtx_syn_ack = tcp_rtx_synack,
825 .send_ack = tcp_v6_reqsk_send_ack,
826 .destructor = tcp_v6_reqsk_destructor,
827 .send_reset = tcp_v6_send_reset,
828 .syn_ack_timeout = tcp_syn_ack_timeout,
831 const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
832 .mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) -
833 sizeof(struct ipv6hdr),
834 #ifdef CONFIG_TCP_MD5SIG
835 .req_md5_lookup = tcp_v6_md5_lookup,
836 .calc_md5_hash = tcp_v6_md5_hash_skb,
838 #ifdef CONFIG_SYN_COOKIES
839 .cookie_init_seq = cookie_v6_init_sequence,
841 .route_req = tcp_v6_route_req,
842 .init_seq = tcp_v6_init_seq,
843 .init_ts_off = tcp_v6_init_ts_off,
844 .send_synack = tcp_v6_send_synack,
847 static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32 seq,
848 u32 ack, u32 win, u32 tsval, u32 tsecr,
849 int oif, struct tcp_md5sig_key *key, int rst,
850 u8 tclass, __be32 label, u32 priority, u32 txhash)
852 const struct tcphdr *th = tcp_hdr(skb);
854 struct sk_buff *buff;
856 struct net *net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
857 struct sock *ctl_sk = net->ipv6.tcp_sk;
858 unsigned int tot_len = sizeof(struct tcphdr);
859 __be32 mrst = 0, *topt;
860 struct dst_entry *dst;
864 tot_len += TCPOLEN_TSTAMP_ALIGNED;
865 #ifdef CONFIG_TCP_MD5SIG
867 tot_len += TCPOLEN_MD5SIG_ALIGNED;
872 mrst = mptcp_reset_option(skb);
875 tot_len += sizeof(__be32);
879 buff = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC);
883 skb_reserve(buff, MAX_TCP_HEADER);
885 t1 = skb_push(buff, tot_len);
886 skb_reset_transport_header(buff);
888 /* Swap the send and the receive. */
889 memset(t1, 0, sizeof(*t1));
890 t1->dest = th->source;
891 t1->source = th->dest;
892 t1->doff = tot_len / 4;
893 t1->seq = htonl(seq);
894 t1->ack_seq = htonl(ack);
895 t1->ack = !rst || !th->ack;
897 t1->window = htons(win);
899 topt = (__be32 *)(t1 + 1);
902 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
903 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
904 *topt++ = htonl(tsval);
905 *topt++ = htonl(tsecr);
911 #ifdef CONFIG_TCP_MD5SIG
913 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
914 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
915 tcp_v6_md5_hash_hdr((__u8 *)topt, key,
916 &ipv6_hdr(skb)->saddr,
917 &ipv6_hdr(skb)->daddr, t1);
921 memset(&fl6, 0, sizeof(fl6));
922 fl6.daddr = ipv6_hdr(skb)->saddr;
923 fl6.saddr = ipv6_hdr(skb)->daddr;
924 fl6.flowlabel = label;
926 buff->ip_summed = CHECKSUM_PARTIAL;
928 __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr);
930 fl6.flowi6_proto = IPPROTO_TCP;
931 if (rt6_need_strict(&fl6.daddr) && !oif)
932 fl6.flowi6_oif = tcp_v6_iif(skb);
934 if (!oif && netif_index_is_l3_master(net, skb->skb_iif))
937 fl6.flowi6_oif = oif;
941 if (sk->sk_state == TCP_TIME_WAIT)
942 mark = inet_twsk(sk)->tw_mark;
945 skb_set_delivery_time(buff, tcp_transmit_time(sk), true);
948 /* autoflowlabel/skb_get_hash_flowi6 rely on buff->hash */
949 skb_set_hash(buff, txhash, PKT_HASH_TYPE_L4);
951 fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark) ?: mark;
952 fl6.fl6_dport = t1->dest;
953 fl6.fl6_sport = t1->source;
954 fl6.flowi6_uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);
955 security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6));
957 /* Pass a socket to ip6_dst_lookup either it is for RST
958 * Underlying function will use this to retrieve the network
961 if (sk && sk->sk_state != TCP_TIME_WAIT)
962 dst = ip6_dst_lookup_flow(net, sk, &fl6, NULL); /*sk's xfrm_policy can be referred*/
964 dst = ip6_dst_lookup_flow(net, ctl_sk, &fl6, NULL);
966 skb_dst_set(buff, dst);
967 ip6_xmit(ctl_sk, buff, &fl6, fl6.flowi6_mark, NULL,
968 tclass & ~INET_ECN_MASK, priority);
969 TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
971 TCP_INC_STATS(net, TCP_MIB_OUTRSTS);
978 static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb)
980 const struct tcphdr *th = tcp_hdr(skb);
981 struct ipv6hdr *ipv6h = ipv6_hdr(skb);
982 u32 seq = 0, ack_seq = 0;
983 struct tcp_md5sig_key *key = NULL;
984 #ifdef CONFIG_TCP_MD5SIG
985 const __u8 *hash_location = NULL;
986 unsigned char newhash[16];
988 struct sock *sk1 = NULL;
999 /* If sk not NULL, it means we did a successful lookup and incoming
1000 * route had to be correct. prequeue might have dropped our dst.
1002 if (!sk && !ipv6_unicast_destination(skb))
1005 net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
1006 #ifdef CONFIG_TCP_MD5SIG
1008 hash_location = tcp_parse_md5sig_option(th);
1009 if (sk && sk_fullsock(sk)) {
1012 /* sdif set, means packet ingressed via a device
1013 * in an L3 domain and inet_iif is set to it.
1015 l3index = tcp_v6_sdif(skb) ? tcp_v6_iif_l3_slave(skb) : 0;
1016 key = tcp_v6_md5_do_lookup(sk, &ipv6h->saddr, l3index);
1017 } else if (hash_location) {
1018 int dif = tcp_v6_iif_l3_slave(skb);
1019 int sdif = tcp_v6_sdif(skb);
1023 * active side is lost. Try to find listening socket through
1024 * source port, and then find md5 key through listening socket.
1025 * we are not loose security here:
1026 * Incoming packet is checked with md5 hash with finding key,
1027 * no RST generated if md5 hash doesn't match.
1029 sk1 = inet6_lookup_listener(net, net->ipv4.tcp_death_row.hashinfo,
1030 NULL, 0, &ipv6h->saddr, th->source,
1031 &ipv6h->daddr, ntohs(th->source),
1036 /* sdif set, means packet ingressed via a device
1037 * in an L3 domain and dif is set to it.
1039 l3index = tcp_v6_sdif(skb) ? dif : 0;
1041 key = tcp_v6_md5_do_lookup(sk1, &ipv6h->saddr, l3index);
1045 genhash = tcp_v6_md5_hash_skb(newhash, key, NULL, skb);
1046 if (genhash || memcmp(hash_location, newhash, 16) != 0)
1052 seq = ntohl(th->ack_seq);
1054 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
1058 oif = sk->sk_bound_dev_if;
1059 if (sk_fullsock(sk)) {
1060 const struct ipv6_pinfo *np = tcp_inet6_sk(sk);
1062 trace_tcp_send_reset(sk, skb);
1064 label = ip6_flowlabel(ipv6h);
1065 priority = sk->sk_priority;
1066 txhash = sk->sk_hash;
1068 if (sk->sk_state == TCP_TIME_WAIT) {
1069 label = cpu_to_be32(inet_twsk(sk)->tw_flowlabel);
1070 priority = inet_twsk(sk)->tw_priority;
1071 txhash = inet_twsk(sk)->tw_txhash;
1074 if (net->ipv6.sysctl.flowlabel_reflect & FLOWLABEL_REFLECT_TCP_RESET)
1075 label = ip6_flowlabel(ipv6h);
1078 tcp_v6_send_response(sk, skb, seq, ack_seq, 0, 0, 0, oif, key, 1,
1079 ipv6_get_dsfield(ipv6h), label, priority, txhash);
1081 #ifdef CONFIG_TCP_MD5SIG
1087 static void tcp_v6_send_ack(const struct sock *sk, struct sk_buff *skb, u32 seq,
1088 u32 ack, u32 win, u32 tsval, u32 tsecr, int oif,
1089 struct tcp_md5sig_key *key, u8 tclass,
1090 __be32 label, u32 priority, u32 txhash)
1092 tcp_v6_send_response(sk, skb, seq, ack, win, tsval, tsecr, oif, key, 0,
1093 tclass, label, priority, txhash);
1096 static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1098 struct inet_timewait_sock *tw = inet_twsk(sk);
1099 struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1101 tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
1102 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
1103 tcp_time_stamp_raw() + tcptw->tw_ts_offset,
1104 tcptw->tw_ts_recent, tw->tw_bound_dev_if, tcp_twsk_md5_key(tcptw),
1105 tw->tw_tclass, cpu_to_be32(tw->tw_flowlabel), tw->tw_priority,
1111 static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
1112 struct request_sock *req)
1116 l3index = tcp_v6_sdif(skb) ? tcp_v6_iif_l3_slave(skb) : 0;
1118 /* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV
1119 * sk->sk_state == TCP_SYN_RECV -> for Fast Open.
1122 * The window field (SEG.WND) of every outgoing segment, with the
1123 * exception of <SYN> segments, MUST be right-shifted by
1124 * Rcv.Wind.Shift bits:
1126 tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?
1127 tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,
1128 tcp_rsk(req)->rcv_nxt,
1129 req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale,
1130 tcp_time_stamp_raw() + tcp_rsk(req)->ts_off,
1131 req->ts_recent, sk->sk_bound_dev_if,
1132 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr, l3index),
1133 ipv6_get_dsfield(ipv6_hdr(skb)), 0, sk->sk_priority,
1134 tcp_rsk(req)->txhash);
1138 static struct sock *tcp_v6_cookie_check(struct sock *sk, struct sk_buff *skb)
1140 #ifdef CONFIG_SYN_COOKIES
1141 const struct tcphdr *th = tcp_hdr(skb);
1144 sk = cookie_v6_check(sk, skb);
1149 u16 tcp_v6_get_syncookie(struct sock *sk, struct ipv6hdr *iph,
1150 struct tcphdr *th, u32 *cookie)
1153 #ifdef CONFIG_SYN_COOKIES
1154 mss = tcp_get_syncookie_mss(&tcp6_request_sock_ops,
1155 &tcp_request_sock_ipv6_ops, sk, th);
1157 *cookie = __cookie_v6_init_sequence(iph, th, &mss);
1158 tcp_synq_overflow(sk);
1164 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1166 if (skb->protocol == htons(ETH_P_IP))
1167 return tcp_v4_conn_request(sk, skb);
1169 if (!ipv6_unicast_destination(skb))
1172 if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) {
1173 __IP6_INC_STATS(sock_net(sk), NULL, IPSTATS_MIB_INHDRERRORS);
1177 return tcp_conn_request(&tcp6_request_sock_ops,
1178 &tcp_request_sock_ipv6_ops, sk, skb);
1182 return 0; /* don't send reset */
1185 static void tcp_v6_restore_cb(struct sk_buff *skb)
1187 /* We need to move header back to the beginning if xfrm6_policy_check()
1188 * and tcp_v6_fill_cb() are going to be called again.
1189 * ip6_datagram_recv_specific_ctl() also expects IP6CB to be there.
1191 memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6,
1192 sizeof(struct inet6_skb_parm));
1195 static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
1196 struct request_sock *req,
1197 struct dst_entry *dst,
1198 struct request_sock *req_unhash,
1201 struct inet_request_sock *ireq;
1202 struct ipv6_pinfo *newnp;
1203 const struct ipv6_pinfo *np = tcp_inet6_sk(sk);
1204 struct ipv6_txoptions *opt;
1205 struct inet_sock *newinet;
1206 bool found_dup_sk = false;
1207 struct tcp_sock *newtp;
1209 #ifdef CONFIG_TCP_MD5SIG
1210 struct tcp_md5sig_key *key;
1215 if (skb->protocol == htons(ETH_P_IP)) {
1220 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst,
1221 req_unhash, own_req);
1226 inet_sk(newsk)->pinet6 = tcp_inet6_sk(newsk);
1228 newnp = tcp_inet6_sk(newsk);
1229 newtp = tcp_sk(newsk);
1231 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1233 newnp->saddr = newsk->sk_v6_rcv_saddr;
1235 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1236 if (sk_is_mptcp(newsk))
1237 mptcpv6_handle_mapped(newsk, true);
1238 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
1239 #ifdef CONFIG_TCP_MD5SIG
1240 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1243 newnp->ipv6_mc_list = NULL;
1244 newnp->ipv6_ac_list = NULL;
1245 newnp->ipv6_fl_list = NULL;
1246 newnp->pktoptions = NULL;
1248 newnp->mcast_oif = inet_iif(skb);
1249 newnp->mcast_hops = ip_hdr(skb)->ttl;
1250 newnp->rcv_flowinfo = 0;
1252 newnp->flow_label = 0;
1255 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
1256 * here, tcp_create_openreq_child now does this for us, see the comment in
1257 * that function for the gory details. -acme
1260 /* It is tricky place. Until this moment IPv4 tcp
1261 worked with IPv6 icsk.icsk_af_ops.
1264 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1269 ireq = inet_rsk(req);
1271 if (sk_acceptq_is_full(sk))
1275 dst = inet6_csk_route_req(sk, &fl6, req, IPPROTO_TCP);
1280 newsk = tcp_create_openreq_child(sk, req, skb);
1285 * No need to charge this sock to the relevant IPv6 refcnt debug socks
1286 * count here, tcp_create_openreq_child now does this for us, see the
1287 * comment in that function for the gory details. -acme
1290 newsk->sk_gso_type = SKB_GSO_TCPV6;
1291 ip6_dst_store(newsk, dst, NULL, NULL);
1292 inet6_sk_rx_dst_set(newsk, skb);
1294 inet_sk(newsk)->pinet6 = tcp_inet6_sk(newsk);
1296 newtp = tcp_sk(newsk);
1297 newinet = inet_sk(newsk);
1298 newnp = tcp_inet6_sk(newsk);
1300 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1302 newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr;
1303 newnp->saddr = ireq->ir_v6_loc_addr;
1304 newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr;
1305 newsk->sk_bound_dev_if = ireq->ir_iif;
1307 /* Now IPv6 options...
1309 First: no IPv4 options.
1311 newinet->inet_opt = NULL;
1312 newnp->ipv6_mc_list = NULL;
1313 newnp->ipv6_ac_list = NULL;
1314 newnp->ipv6_fl_list = NULL;
1317 newnp->rxopt.all = np->rxopt.all;
1319 newnp->pktoptions = NULL;
1321 newnp->mcast_oif = tcp_v6_iif(skb);
1322 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1323 newnp->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(skb));
1325 newnp->flow_label = ip6_flowlabel(ipv6_hdr(skb));
1327 /* Set ToS of the new socket based upon the value of incoming SYN.
1328 * ECT bits are set later in tcp_init_transfer().
1330 if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_reflect_tos))
1331 newnp->tclass = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
1333 /* Clone native IPv6 options from listening socket (if any)
1335 Yes, keeping reference count would be much more clever,
1336 but we make one more one thing there: reattach optmem
1339 opt = ireq->ipv6_opt;
1341 opt = rcu_dereference(np->opt);
1343 opt = ipv6_dup_options(newsk, opt);
1344 RCU_INIT_POINTER(newnp->opt, opt);
1346 inet_csk(newsk)->icsk_ext_hdr_len = 0;
1348 inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen +
1351 tcp_ca_openreq_child(newsk, dst);
1353 tcp_sync_mss(newsk, dst_mtu(dst));
1354 newtp->advmss = tcp_mss_clamp(tcp_sk(sk), dst_metric_advmss(dst));
1356 tcp_initialize_rcv_mss(newsk);
1358 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
1359 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
1361 #ifdef CONFIG_TCP_MD5SIG
1362 l3index = l3mdev_master_ifindex_by_index(sock_net(sk), ireq->ir_iif);
1364 /* Copy over the MD5 key from the original socket */
1365 key = tcp_v6_md5_do_lookup(sk, &newsk->sk_v6_daddr, l3index);
1367 const union tcp_md5_addr *addr;
1369 addr = (union tcp_md5_addr *)&newsk->sk_v6_daddr;
1370 if (tcp_md5_key_copy(newsk, addr, AF_INET6, 128, l3index, key)) {
1371 inet_csk_prepare_forced_close(newsk);
1378 if (__inet_inherit_port(sk, newsk) < 0) {
1379 inet_csk_prepare_forced_close(newsk);
1383 *own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash),
1386 tcp_move_syn(newtp, req);
1388 /* Clone pktoptions received with SYN, if we own the req */
1389 if (ireq->pktopts) {
1390 newnp->pktoptions = skb_clone(ireq->pktopts,
1391 sk_gfp_mask(sk, GFP_ATOMIC));
1392 consume_skb(ireq->pktopts);
1393 ireq->pktopts = NULL;
1394 if (newnp->pktoptions) {
1395 tcp_v6_restore_cb(newnp->pktoptions);
1396 skb_set_owner_r(newnp->pktoptions, newsk);
1400 if (!req_unhash && found_dup_sk) {
1401 /* This code path should only be executed in the
1402 * syncookie case only
1404 bh_unlock_sock(newsk);
1413 __NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
1421 INDIRECT_CALLABLE_DECLARE(struct dst_entry *ipv4_dst_check(struct dst_entry *,
1423 /* The socket must have it's spinlock held when we get
1424 * here, unless it is a TCP_LISTEN socket.
1426 * We have a potential double-lock case here, so even when
1427 * doing backlog processing we use the BH locking scheme.
1428 * This is because we cannot sleep with the original spinlock
1431 INDIRECT_CALLABLE_SCOPE
1432 int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1434 struct ipv6_pinfo *np = tcp_inet6_sk(sk);
1435 struct sk_buff *opt_skb = NULL;
1436 enum skb_drop_reason reason;
1437 struct tcp_sock *tp;
1439 /* Imagine: socket is IPv6. IPv4 packet arrives,
1440 goes to IPv4 receive handler and backlogged.
1441 From backlog it always goes here. Kerboom...
1442 Fortunately, tcp_rcv_established and rcv_established
1443 handle them correctly, but it is not case with
1444 tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK
1447 if (skb->protocol == htons(ETH_P_IP))
1448 return tcp_v4_do_rcv(sk, skb);
1451 * socket locking is here for SMP purposes as backlog rcv
1452 * is currently called with bh processing disabled.
1455 /* Do Stevens' IPV6_PKTOPTIONS.
1457 Yes, guys, it is the only place in our code, where we
1458 may make it not affecting IPv4.
1459 The rest of code is protocol independent,
1460 and I do not like idea to uglify IPv4.
1462 Actually, all the idea behind IPV6_PKTOPTIONS
1463 looks not very well thought. For now we latch
1464 options, received in the last packet, enqueued
1465 by tcp. Feel free to propose better solution.
1469 opt_skb = skb_clone(skb, sk_gfp_mask(sk, GFP_ATOMIC));
1471 reason = SKB_DROP_REASON_NOT_SPECIFIED;
1472 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
1473 struct dst_entry *dst;
1475 dst = rcu_dereference_protected(sk->sk_rx_dst,
1476 lockdep_sock_is_held(sk));
1478 sock_rps_save_rxhash(sk, skb);
1479 sk_mark_napi_id(sk, skb);
1481 if (sk->sk_rx_dst_ifindex != skb->skb_iif ||
1482 INDIRECT_CALL_1(dst->ops->check, ip6_dst_check,
1483 dst, sk->sk_rx_dst_cookie) == NULL) {
1484 RCU_INIT_POINTER(sk->sk_rx_dst, NULL);
1489 tcp_rcv_established(sk, skb);
1491 goto ipv6_pktoptions;
1495 if (tcp_checksum_complete(skb))
1498 if (sk->sk_state == TCP_LISTEN) {
1499 struct sock *nsk = tcp_v6_cookie_check(sk, skb);
1505 if (tcp_child_process(sk, nsk, skb))
1508 __kfree_skb(opt_skb);
1512 sock_rps_save_rxhash(sk, skb);
1514 if (tcp_rcv_state_process(sk, skb))
1517 goto ipv6_pktoptions;
1521 tcp_v6_send_reset(sk, skb);
1524 __kfree_skb(opt_skb);
1525 kfree_skb_reason(skb, reason);
1528 reason = SKB_DROP_REASON_TCP_CSUM;
1529 trace_tcp_bad_csum(skb);
1530 TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS);
1531 TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
1536 /* Do you ask, what is it?
1538 1. skb was enqueued by tcp.
1539 2. skb is added to tail of read queue, rather than out of order.
1540 3. socket is not in passive state.
1541 4. Finally, it really contains options, which user wants to receive.
1544 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1545 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1546 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
1547 np->mcast_oif = tcp_v6_iif(opt_skb);
1548 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
1549 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
1550 if (np->rxopt.bits.rxflow || np->rxopt.bits.rxtclass)
1551 np->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(opt_skb));
1553 np->flow_label = ip6_flowlabel(ipv6_hdr(opt_skb));
1554 if (ipv6_opt_accepted(sk, opt_skb, &TCP_SKB_CB(opt_skb)->header.h6)) {
1555 skb_set_owner_r(opt_skb, sk);
1556 tcp_v6_restore_cb(opt_skb);
1557 opt_skb = xchg(&np->pktoptions, opt_skb);
1559 __kfree_skb(opt_skb);
1560 opt_skb = xchg(&np->pktoptions, NULL);
1564 consume_skb(opt_skb);
1568 static void tcp_v6_fill_cb(struct sk_buff *skb, const struct ipv6hdr *hdr,
1569 const struct tcphdr *th)
1571 /* This is tricky: we move IP6CB at its correct location into
1572 * TCP_SKB_CB(). It must be done after xfrm6_policy_check(), because
1573 * _decode_session6() uses IP6CB().
1574 * barrier() makes sure compiler won't play aliasing games.
1576 memmove(&TCP_SKB_CB(skb)->header.h6, IP6CB(skb),
1577 sizeof(struct inet6_skb_parm));
1580 TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1581 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1582 skb->len - th->doff*4);
1583 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1584 TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th);
1585 TCP_SKB_CB(skb)->tcp_tw_isn = 0;
1586 TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr);
1587 TCP_SKB_CB(skb)->sacked = 0;
1588 TCP_SKB_CB(skb)->has_rxtstamp =
1589 skb->tstamp || skb_hwtstamps(skb)->hwtstamp;
1592 INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
1594 enum skb_drop_reason drop_reason;
1595 int sdif = inet6_sdif(skb);
1596 int dif = inet6_iif(skb);
1597 const struct tcphdr *th;
1598 const struct ipv6hdr *hdr;
1602 struct net *net = dev_net(skb->dev);
1604 drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
1605 if (skb->pkt_type != PACKET_HOST)
1609 * Count it even if it's bad.
1611 __TCP_INC_STATS(net, TCP_MIB_INSEGS);
1613 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1616 th = (const struct tcphdr *)skb->data;
1618 if (unlikely(th->doff < sizeof(struct tcphdr) / 4)) {
1619 drop_reason = SKB_DROP_REASON_PKT_TOO_SMALL;
1622 if (!pskb_may_pull(skb, th->doff*4))
1625 if (skb_checksum_init(skb, IPPROTO_TCP, ip6_compute_pseudo))
1628 th = (const struct tcphdr *)skb->data;
1629 hdr = ipv6_hdr(skb);
1632 sk = __inet6_lookup_skb(net->ipv4.tcp_death_row.hashinfo, skb, __tcp_hdrlen(th),
1633 th->source, th->dest, inet6_iif(skb), sdif,
1639 if (sk->sk_state == TCP_TIME_WAIT)
1642 if (sk->sk_state == TCP_NEW_SYN_RECV) {
1643 struct request_sock *req = inet_reqsk(sk);
1644 bool req_stolen = false;
1647 sk = req->rsk_listener;
1648 drop_reason = tcp_inbound_md5_hash(sk, skb,
1649 &hdr->saddr, &hdr->daddr,
1650 AF_INET6, dif, sdif);
1652 sk_drops_add(sk, skb);
1656 if (tcp_checksum_complete(skb)) {
1660 if (unlikely(sk->sk_state != TCP_LISTEN)) {
1661 nsk = reuseport_migrate_sock(sk, req_to_sk(req), skb);
1663 inet_csk_reqsk_queue_drop_and_put(sk, req);
1667 /* reuseport_migrate_sock() has already held one sk_refcnt
1675 if (!tcp_filter(sk, skb)) {
1676 th = (const struct tcphdr *)skb->data;
1677 hdr = ipv6_hdr(skb);
1678 tcp_v6_fill_cb(skb, hdr, th);
1679 nsk = tcp_check_req(sk, skb, req, false, &req_stolen);
1681 drop_reason = SKB_DROP_REASON_SOCKET_FILTER;
1686 /* Another cpu got exclusive access to req
1687 * and created a full blown socket.
1688 * Try to feed this packet to this socket
1689 * instead of discarding it.
1691 tcp_v6_restore_cb(skb);
1695 goto discard_and_relse;
1699 tcp_v6_restore_cb(skb);
1700 } else if (tcp_child_process(sk, nsk, skb)) {
1701 tcp_v6_send_reset(nsk, skb);
1702 goto discard_and_relse;
1709 if (static_branch_unlikely(&ip6_min_hopcount)) {
1710 /* min_hopcount can be changed concurrently from do_ipv6_setsockopt() */
1711 if (hdr->hop_limit < READ_ONCE(tcp_inet6_sk(sk)->min_hopcount)) {
1712 __NET_INC_STATS(net, LINUX_MIB_TCPMINTTLDROP);
1713 goto discard_and_relse;
1717 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
1718 drop_reason = SKB_DROP_REASON_XFRM_POLICY;
1719 goto discard_and_relse;
1722 drop_reason = tcp_inbound_md5_hash(sk, skb, &hdr->saddr, &hdr->daddr,
1723 AF_INET6, dif, sdif);
1725 goto discard_and_relse;
1727 if (tcp_filter(sk, skb)) {
1728 drop_reason = SKB_DROP_REASON_SOCKET_FILTER;
1729 goto discard_and_relse;
1731 th = (const struct tcphdr *)skb->data;
1732 hdr = ipv6_hdr(skb);
1733 tcp_v6_fill_cb(skb, hdr, th);
1737 if (sk->sk_state == TCP_LISTEN) {
1738 ret = tcp_v6_do_rcv(sk, skb);
1739 goto put_and_return;
1742 sk_incoming_cpu_update(sk);
1744 bh_lock_sock_nested(sk);
1745 tcp_segs_in(tcp_sk(sk), skb);
1747 if (!sock_owned_by_user(sk)) {
1748 ret = tcp_v6_do_rcv(sk, skb);
1750 if (tcp_add_backlog(sk, skb, &drop_reason))
1751 goto discard_and_relse;
1757 return ret ? -1 : 0;
1760 drop_reason = SKB_DROP_REASON_NO_SOCKET;
1761 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1764 tcp_v6_fill_cb(skb, hdr, th);
1766 if (tcp_checksum_complete(skb)) {
1768 drop_reason = SKB_DROP_REASON_TCP_CSUM;
1769 trace_tcp_bad_csum(skb);
1770 __TCP_INC_STATS(net, TCP_MIB_CSUMERRORS);
1772 __TCP_INC_STATS(net, TCP_MIB_INERRS);
1774 tcp_v6_send_reset(NULL, skb);
1778 SKB_DR_OR(drop_reason, NOT_SPECIFIED);
1779 kfree_skb_reason(skb, drop_reason);
1783 sk_drops_add(sk, skb);
1789 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
1790 drop_reason = SKB_DROP_REASON_XFRM_POLICY;
1791 inet_twsk_put(inet_twsk(sk));
1795 tcp_v6_fill_cb(skb, hdr, th);
1797 if (tcp_checksum_complete(skb)) {
1798 inet_twsk_put(inet_twsk(sk));
1802 switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1807 sk2 = inet6_lookup_listener(net, net->ipv4.tcp_death_row.hashinfo,
1808 skb, __tcp_hdrlen(th),
1809 &ipv6_hdr(skb)->saddr, th->source,
1810 &ipv6_hdr(skb)->daddr,
1812 tcp_v6_iif_l3_slave(skb),
1815 struct inet_timewait_sock *tw = inet_twsk(sk);
1816 inet_twsk_deschedule_put(tw);
1818 tcp_v6_restore_cb(skb);
1826 tcp_v6_timewait_ack(sk, skb);
1829 tcp_v6_send_reset(sk, skb);
1830 inet_twsk_deschedule_put(inet_twsk(sk));
1832 case TCP_TW_SUCCESS:
1838 void tcp_v6_early_demux(struct sk_buff *skb)
1840 struct net *net = dev_net(skb->dev);
1841 const struct ipv6hdr *hdr;
1842 const struct tcphdr *th;
1845 if (skb->pkt_type != PACKET_HOST)
1848 if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct tcphdr)))
1851 hdr = ipv6_hdr(skb);
1854 if (th->doff < sizeof(struct tcphdr) / 4)
1857 /* Note : We use inet6_iif() here, not tcp_v6_iif() */
1858 sk = __inet6_lookup_established(net, net->ipv4.tcp_death_row.hashinfo,
1859 &hdr->saddr, th->source,
1860 &hdr->daddr, ntohs(th->dest),
1861 inet6_iif(skb), inet6_sdif(skb));
1864 skb->destructor = sock_edemux;
1865 if (sk_fullsock(sk)) {
1866 struct dst_entry *dst = rcu_dereference(sk->sk_rx_dst);
1869 dst = dst_check(dst, sk->sk_rx_dst_cookie);
1871 sk->sk_rx_dst_ifindex == skb->skb_iif)
1872 skb_dst_set_noref(skb, dst);
1877 static struct timewait_sock_ops tcp6_timewait_sock_ops = {
1878 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
1879 .twsk_unique = tcp_twsk_unique,
1880 .twsk_destructor = tcp_twsk_destructor,
1883 INDIRECT_CALLABLE_SCOPE void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
1885 __tcp_v6_send_check(skb, &sk->sk_v6_rcv_saddr, &sk->sk_v6_daddr);
1888 const struct inet_connection_sock_af_ops ipv6_specific = {
1889 .queue_xmit = inet6_csk_xmit,
1890 .send_check = tcp_v6_send_check,
1891 .rebuild_header = inet6_sk_rebuild_header,
1892 .sk_rx_dst_set = inet6_sk_rx_dst_set,
1893 .conn_request = tcp_v6_conn_request,
1894 .syn_recv_sock = tcp_v6_syn_recv_sock,
1895 .net_header_len = sizeof(struct ipv6hdr),
1896 .net_frag_header_len = sizeof(struct frag_hdr),
1897 .setsockopt = ipv6_setsockopt,
1898 .getsockopt = ipv6_getsockopt,
1899 .addr2sockaddr = inet6_csk_addr2sockaddr,
1900 .sockaddr_len = sizeof(struct sockaddr_in6),
1901 .mtu_reduced = tcp_v6_mtu_reduced,
1904 #ifdef CONFIG_TCP_MD5SIG
1905 static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
1906 .md5_lookup = tcp_v6_md5_lookup,
1907 .calc_md5_hash = tcp_v6_md5_hash_skb,
1908 .md5_parse = tcp_v6_parse_md5_keys,
1913 * TCP over IPv4 via INET6 API
1915 static const struct inet_connection_sock_af_ops ipv6_mapped = {
1916 .queue_xmit = ip_queue_xmit,
1917 .send_check = tcp_v4_send_check,
1918 .rebuild_header = inet_sk_rebuild_header,
1919 .sk_rx_dst_set = inet_sk_rx_dst_set,
1920 .conn_request = tcp_v6_conn_request,
1921 .syn_recv_sock = tcp_v6_syn_recv_sock,
1922 .net_header_len = sizeof(struct iphdr),
1923 .setsockopt = ipv6_setsockopt,
1924 .getsockopt = ipv6_getsockopt,
1925 .addr2sockaddr = inet6_csk_addr2sockaddr,
1926 .sockaddr_len = sizeof(struct sockaddr_in6),
1927 .mtu_reduced = tcp_v4_mtu_reduced,
1930 #ifdef CONFIG_TCP_MD5SIG
1931 static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
1932 .md5_lookup = tcp_v4_md5_lookup,
1933 .calc_md5_hash = tcp_v4_md5_hash_skb,
1934 .md5_parse = tcp_v6_parse_md5_keys,
1938 /* NOTE: A lot of things set to zero explicitly by call to
1939 * sk_alloc() so need not be done here.
1941 static int tcp_v6_init_sock(struct sock *sk)
1943 struct inet_connection_sock *icsk = inet_csk(sk);
1947 icsk->icsk_af_ops = &ipv6_specific;
1949 #ifdef CONFIG_TCP_MD5SIG
1950 tcp_sk(sk)->af_specific = &tcp_sock_ipv6_specific;
1956 #ifdef CONFIG_PROC_FS
1957 /* Proc filesystem TCPv6 sock list dumping. */
1958 static void get_openreq6(struct seq_file *seq,
1959 const struct request_sock *req, int i)
1961 long ttd = req->rsk_timer.expires - jiffies;
1962 const struct in6_addr *src = &inet_rsk(req)->ir_v6_loc_addr;
1963 const struct in6_addr *dest = &inet_rsk(req)->ir_v6_rmt_addr;
1969 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1970 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %d %d %pK\n",
1972 src->s6_addr32[0], src->s6_addr32[1],
1973 src->s6_addr32[2], src->s6_addr32[3],
1974 inet_rsk(req)->ir_num,
1975 dest->s6_addr32[0], dest->s6_addr32[1],
1976 dest->s6_addr32[2], dest->s6_addr32[3],
1977 ntohs(inet_rsk(req)->ir_rmt_port),
1979 0, 0, /* could print option size, but that is af dependent. */
1980 1, /* timers active (only the expire timer) */
1981 jiffies_to_clock_t(ttd),
1983 from_kuid_munged(seq_user_ns(seq),
1984 sock_i_uid(req->rsk_listener)),
1985 0, /* non standard timer */
1986 0, /* open_requests have no inode */
1990 static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1992 const struct in6_addr *dest, *src;
1995 unsigned long timer_expires;
1996 const struct inet_sock *inet = inet_sk(sp);
1997 const struct tcp_sock *tp = tcp_sk(sp);
1998 const struct inet_connection_sock *icsk = inet_csk(sp);
1999 const struct fastopen_queue *fastopenq = &icsk->icsk_accept_queue.fastopenq;
2003 dest = &sp->sk_v6_daddr;
2004 src = &sp->sk_v6_rcv_saddr;
2005 destp = ntohs(inet->inet_dport);
2006 srcp = ntohs(inet->inet_sport);
2008 if (icsk->icsk_pending == ICSK_TIME_RETRANS ||
2009 icsk->icsk_pending == ICSK_TIME_REO_TIMEOUT ||
2010 icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) {
2012 timer_expires = icsk->icsk_timeout;
2013 } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
2015 timer_expires = icsk->icsk_timeout;
2016 } else if (timer_pending(&sp->sk_timer)) {
2018 timer_expires = sp->sk_timer.expires;
2021 timer_expires = jiffies;
2024 state = inet_sk_state_load(sp);
2025 if (state == TCP_LISTEN)
2026 rx_queue = READ_ONCE(sp->sk_ack_backlog);
2028 /* Because we don't lock the socket,
2029 * we might find a transient negative value.
2031 rx_queue = max_t(int, READ_ONCE(tp->rcv_nxt) -
2032 READ_ONCE(tp->copied_seq), 0);
2035 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2036 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %lu %lu %u %u %d\n",
2038 src->s6_addr32[0], src->s6_addr32[1],
2039 src->s6_addr32[2], src->s6_addr32[3], srcp,
2040 dest->s6_addr32[0], dest->s6_addr32[1],
2041 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2043 READ_ONCE(tp->write_seq) - tp->snd_una,
2046 jiffies_delta_to_clock_t(timer_expires - jiffies),
2047 icsk->icsk_retransmits,
2048 from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)),
2049 icsk->icsk_probes_out,
2051 refcount_read(&sp->sk_refcnt), sp,
2052 jiffies_to_clock_t(icsk->icsk_rto),
2053 jiffies_to_clock_t(icsk->icsk_ack.ato),
2054 (icsk->icsk_ack.quick << 1) | inet_csk_in_pingpong_mode(sp),
2056 state == TCP_LISTEN ?
2057 fastopenq->max_qlen :
2058 (tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh)
2062 static void get_timewait6_sock(struct seq_file *seq,
2063 struct inet_timewait_sock *tw, int i)
2065 long delta = tw->tw_timer.expires - jiffies;
2066 const struct in6_addr *dest, *src;
2069 dest = &tw->tw_v6_daddr;
2070 src = &tw->tw_v6_rcv_saddr;
2071 destp = ntohs(tw->tw_dport);
2072 srcp = ntohs(tw->tw_sport);
2075 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2076 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK\n",
2078 src->s6_addr32[0], src->s6_addr32[1],
2079 src->s6_addr32[2], src->s6_addr32[3], srcp,
2080 dest->s6_addr32[0], dest->s6_addr32[1],
2081 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2082 tw->tw_substate, 0, 0,
2083 3, jiffies_delta_to_clock_t(delta), 0, 0, 0, 0,
2084 refcount_read(&tw->tw_refcnt), tw);
2087 static int tcp6_seq_show(struct seq_file *seq, void *v)
2089 struct tcp_iter_state *st;
2090 struct sock *sk = v;
2092 if (v == SEQ_START_TOKEN) {
2097 "st tx_queue rx_queue tr tm->when retrnsmt"
2098 " uid timeout inode\n");
2103 if (sk->sk_state == TCP_TIME_WAIT)
2104 get_timewait6_sock(seq, v, st->num);
2105 else if (sk->sk_state == TCP_NEW_SYN_RECV)
2106 get_openreq6(seq, v, st->num);
2108 get_tcp6_sock(seq, v, st->num);
2113 static const struct seq_operations tcp6_seq_ops = {
2114 .show = tcp6_seq_show,
2115 .start = tcp_seq_start,
2116 .next = tcp_seq_next,
2117 .stop = tcp_seq_stop,
2120 static struct tcp_seq_afinfo tcp6_seq_afinfo = {
2124 int __net_init tcp6_proc_init(struct net *net)
2126 if (!proc_create_net_data("tcp6", 0444, net->proc_net, &tcp6_seq_ops,
2127 sizeof(struct tcp_iter_state), &tcp6_seq_afinfo))
2132 void tcp6_proc_exit(struct net *net)
2134 remove_proc_entry("tcp6", net->proc_net);
2138 struct proto tcpv6_prot = {
2140 .owner = THIS_MODULE,
2142 .pre_connect = tcp_v6_pre_connect,
2143 .connect = tcp_v6_connect,
2144 .disconnect = tcp_disconnect,
2145 .accept = inet_csk_accept,
2147 .init = tcp_v6_init_sock,
2148 .destroy = tcp_v4_destroy_sock,
2149 .shutdown = tcp_shutdown,
2150 .setsockopt = tcp_setsockopt,
2151 .getsockopt = tcp_getsockopt,
2152 .bpf_bypass_getsockopt = tcp_bpf_bypass_getsockopt,
2153 .keepalive = tcp_set_keepalive,
2154 .recvmsg = tcp_recvmsg,
2155 .sendmsg = tcp_sendmsg,
2156 .sendpage = tcp_sendpage,
2157 .backlog_rcv = tcp_v6_do_rcv,
2158 .release_cb = tcp_release_cb,
2160 .unhash = inet_unhash,
2161 .get_port = inet_csk_get_port,
2162 .put_port = inet_put_port,
2163 #ifdef CONFIG_BPF_SYSCALL
2164 .psock_update_sk_prot = tcp_bpf_update_proto,
2166 .enter_memory_pressure = tcp_enter_memory_pressure,
2167 .leave_memory_pressure = tcp_leave_memory_pressure,
2168 .stream_memory_free = tcp_stream_memory_free,
2169 .sockets_allocated = &tcp_sockets_allocated,
2171 .memory_allocated = &tcp_memory_allocated,
2172 .per_cpu_fw_alloc = &tcp_memory_per_cpu_fw_alloc,
2174 .memory_pressure = &tcp_memory_pressure,
2175 .orphan_count = &tcp_orphan_count,
2176 .sysctl_mem = sysctl_tcp_mem,
2177 .sysctl_wmem_offset = offsetof(struct net, ipv4.sysctl_tcp_wmem),
2178 .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_tcp_rmem),
2179 .max_header = MAX_TCP_HEADER,
2180 .obj_size = sizeof(struct tcp6_sock),
2181 .slab_flags = SLAB_TYPESAFE_BY_RCU,
2182 .twsk_prot = &tcp6_timewait_sock_ops,
2183 .rsk_prot = &tcp6_request_sock_ops,
2185 .no_autobind = true,
2186 .diag_destroy = tcp_abort,
2188 EXPORT_SYMBOL_GPL(tcpv6_prot);
2190 static const struct inet6_protocol tcpv6_protocol = {
2191 .handler = tcp_v6_rcv,
2192 .err_handler = tcp_v6_err,
2193 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2196 static struct inet_protosw tcpv6_protosw = {
2197 .type = SOCK_STREAM,
2198 .protocol = IPPROTO_TCP,
2199 .prot = &tcpv6_prot,
2200 .ops = &inet6_stream_ops,
2201 .flags = INET_PROTOSW_PERMANENT |
2205 static int __net_init tcpv6_net_init(struct net *net)
2207 return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
2208 SOCK_RAW, IPPROTO_TCP, net);
2211 static void __net_exit tcpv6_net_exit(struct net *net)
2213 inet_ctl_sock_destroy(net->ipv6.tcp_sk);
2216 static void __net_exit tcpv6_net_exit_batch(struct list_head *net_exit_list)
2218 tcp_twsk_purge(net_exit_list, AF_INET6);
2221 static struct pernet_operations tcpv6_net_ops = {
2222 .init = tcpv6_net_init,
2223 .exit = tcpv6_net_exit,
2224 .exit_batch = tcpv6_net_exit_batch,
2227 int __init tcpv6_init(void)
2231 ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2235 /* register inet6 protocol */
2236 ret = inet6_register_protosw(&tcpv6_protosw);
2238 goto out_tcpv6_protocol;
2240 ret = register_pernet_subsys(&tcpv6_net_ops);
2242 goto out_tcpv6_protosw;
2244 ret = mptcpv6_init();
2246 goto out_tcpv6_pernet_subsys;
2251 out_tcpv6_pernet_subsys:
2252 unregister_pernet_subsys(&tcpv6_net_ops);
2254 inet6_unregister_protosw(&tcpv6_protosw);
2256 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2260 void tcpv6_exit(void)
2262 unregister_pernet_subsys(&tcpv6_net_ops);
2263 inet6_unregister_protosw(&tcpv6_protosw);
2264 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);