net: remove CVS keywords
[linux-2.6/kvm.git] / net / ipv6 / tcp_ipv6.c
blob155499197fc5618dfe614383dfdd24b7a3dfcd64
1 /*
2 * TCP over IPv6
3 * Linux INET6 implementation
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
8 * Based on:
9 * linux/net/ipv4/tcp.c
10 * linux/net/ipv4/tcp_input.c
11 * linux/net/ipv4/tcp_output.c
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.
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.
26 #include <linux/module.h>
27 #include <linux/errno.h>
28 #include <linux/types.h>
29 #include <linux/socket.h>
30 #include <linux/sockios.h>
31 #include <linux/net.h>
32 #include <linux/jiffies.h>
33 #include <linux/in.h>
34 #include <linux/in6.h>
35 #include <linux/netdevice.h>
36 #include <linux/init.h>
37 #include <linux/jhash.h>
38 #include <linux/ipsec.h>
39 #include <linux/times.h>
41 #include <linux/ipv6.h>
42 #include <linux/icmpv6.h>
43 #include <linux/random.h>
45 #include <net/tcp.h>
46 #include <net/ndisc.h>
47 #include <net/inet6_hashtables.h>
48 #include <net/inet6_connection_sock.h>
49 #include <net/ipv6.h>
50 #include <net/transp_v6.h>
51 #include <net/addrconf.h>
52 #include <net/ip6_route.h>
53 #include <net/ip6_checksum.h>
54 #include <net/inet_ecn.h>
55 #include <net/protocol.h>
56 #include <net/xfrm.h>
57 #include <net/snmp.h>
58 #include <net/dsfield.h>
59 #include <net/timewait_sock.h>
60 #include <net/netdma.h>
61 #include <net/inet_common.h>
63 #include <asm/uaccess.h>
65 #include <linux/proc_fs.h>
66 #include <linux/seq_file.h>
68 #include <linux/crypto.h>
69 #include <linux/scatterlist.h>
71 static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
72 static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req);
73 static void tcp_v6_send_check(struct sock *sk, int len,
74 struct sk_buff *skb);
76 static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
78 static struct inet_connection_sock_af_ops ipv6_mapped;
79 static struct inet_connection_sock_af_ops ipv6_specific;
80 #ifdef CONFIG_TCP_MD5SIG
81 static struct tcp_sock_af_ops tcp_sock_ipv6_specific;
82 static struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
83 #endif
85 static void tcp_v6_hash(struct sock *sk)
87 if (sk->sk_state != TCP_CLOSE) {
88 if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
89 tcp_prot.hash(sk);
90 return;
92 local_bh_disable();
93 __inet6_hash(sk);
94 local_bh_enable();
98 static __inline__ __sum16 tcp_v6_check(struct tcphdr *th, int len,
99 struct in6_addr *saddr,
100 struct in6_addr *daddr,
101 __wsum base)
103 return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
106 static __u32 tcp_v6_init_sequence(struct sk_buff *skb)
108 return secure_tcpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
109 ipv6_hdr(skb)->saddr.s6_addr32,
110 tcp_hdr(skb)->dest,
111 tcp_hdr(skb)->source);
114 static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
115 int addr_len)
117 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
118 struct inet_sock *inet = inet_sk(sk);
119 struct inet_connection_sock *icsk = inet_csk(sk);
120 struct ipv6_pinfo *np = inet6_sk(sk);
121 struct tcp_sock *tp = tcp_sk(sk);
122 struct in6_addr *saddr = NULL, *final_p = NULL, final;
123 struct flowi fl;
124 struct dst_entry *dst;
125 int addr_type;
126 int err;
128 if (addr_len < SIN6_LEN_RFC2133)
129 return -EINVAL;
131 if (usin->sin6_family != AF_INET6)
132 return(-EAFNOSUPPORT);
134 memset(&fl, 0, sizeof(fl));
136 if (np->sndflow) {
137 fl.fl6_flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
138 IP6_ECN_flow_init(fl.fl6_flowlabel);
139 if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) {
140 struct ip6_flowlabel *flowlabel;
141 flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
142 if (flowlabel == NULL)
143 return -EINVAL;
144 ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
145 fl6_sock_release(flowlabel);
150 * connect() to INADDR_ANY means loopback (BSD'ism).
153 if(ipv6_addr_any(&usin->sin6_addr))
154 usin->sin6_addr.s6_addr[15] = 0x1;
156 addr_type = ipv6_addr_type(&usin->sin6_addr);
158 if(addr_type & IPV6_ADDR_MULTICAST)
159 return -ENETUNREACH;
161 if (addr_type&IPV6_ADDR_LINKLOCAL) {
162 if (addr_len >= sizeof(struct sockaddr_in6) &&
163 usin->sin6_scope_id) {
164 /* If interface is set while binding, indices
165 * must coincide.
167 if (sk->sk_bound_dev_if &&
168 sk->sk_bound_dev_if != usin->sin6_scope_id)
169 return -EINVAL;
171 sk->sk_bound_dev_if = usin->sin6_scope_id;
174 /* Connect to link-local address requires an interface */
175 if (!sk->sk_bound_dev_if)
176 return -EINVAL;
179 if (tp->rx_opt.ts_recent_stamp &&
180 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
181 tp->rx_opt.ts_recent = 0;
182 tp->rx_opt.ts_recent_stamp = 0;
183 tp->write_seq = 0;
186 ipv6_addr_copy(&np->daddr, &usin->sin6_addr);
187 np->flow_label = fl.fl6_flowlabel;
190 * TCP over IPv4
193 if (addr_type == IPV6_ADDR_MAPPED) {
194 u32 exthdrlen = icsk->icsk_ext_hdr_len;
195 struct sockaddr_in sin;
197 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
199 if (__ipv6_only_sock(sk))
200 return -ENETUNREACH;
202 sin.sin_family = AF_INET;
203 sin.sin_port = usin->sin6_port;
204 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
206 icsk->icsk_af_ops = &ipv6_mapped;
207 sk->sk_backlog_rcv = tcp_v4_do_rcv;
208 #ifdef CONFIG_TCP_MD5SIG
209 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
210 #endif
212 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
214 if (err) {
215 icsk->icsk_ext_hdr_len = exthdrlen;
216 icsk->icsk_af_ops = &ipv6_specific;
217 sk->sk_backlog_rcv = tcp_v6_do_rcv;
218 #ifdef CONFIG_TCP_MD5SIG
219 tp->af_specific = &tcp_sock_ipv6_specific;
220 #endif
221 goto failure;
222 } else {
223 ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF),
224 inet->saddr);
225 ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF),
226 inet->rcv_saddr);
229 return err;
232 if (!ipv6_addr_any(&np->rcv_saddr))
233 saddr = &np->rcv_saddr;
235 fl.proto = IPPROTO_TCP;
236 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
237 ipv6_addr_copy(&fl.fl6_src,
238 (saddr ? saddr : &np->saddr));
239 fl.oif = sk->sk_bound_dev_if;
240 fl.fl_ip_dport = usin->sin6_port;
241 fl.fl_ip_sport = inet->sport;
243 if (np->opt && np->opt->srcrt) {
244 struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
245 ipv6_addr_copy(&final, &fl.fl6_dst);
246 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
247 final_p = &final;
250 security_sk_classify_flow(sk, &fl);
252 err = ip6_dst_lookup(sk, &dst, &fl);
253 if (err)
254 goto failure;
255 if (final_p)
256 ipv6_addr_copy(&fl.fl6_dst, final_p);
258 if ((err = __xfrm_lookup(&dst, &fl, sk, XFRM_LOOKUP_WAIT)) < 0) {
259 if (err == -EREMOTE)
260 err = ip6_dst_blackhole(sk, &dst, &fl);
261 if (err < 0)
262 goto failure;
265 if (saddr == NULL) {
266 saddr = &fl.fl6_src;
267 ipv6_addr_copy(&np->rcv_saddr, saddr);
270 /* set the source address */
271 ipv6_addr_copy(&np->saddr, saddr);
272 inet->rcv_saddr = LOOPBACK4_IPV6;
274 sk->sk_gso_type = SKB_GSO_TCPV6;
275 __ip6_dst_store(sk, dst, NULL, NULL);
277 icsk->icsk_ext_hdr_len = 0;
278 if (np->opt)
279 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
280 np->opt->opt_nflen);
282 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
284 inet->dport = usin->sin6_port;
286 tcp_set_state(sk, TCP_SYN_SENT);
287 err = inet6_hash_connect(&tcp_death_row, sk);
288 if (err)
289 goto late_failure;
291 if (!tp->write_seq)
292 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
293 np->daddr.s6_addr32,
294 inet->sport,
295 inet->dport);
297 err = tcp_connect(sk);
298 if (err)
299 goto late_failure;
301 return 0;
303 late_failure:
304 tcp_set_state(sk, TCP_CLOSE);
305 __sk_dst_reset(sk);
306 failure:
307 inet->dport = 0;
308 sk->sk_route_caps = 0;
309 return err;
312 static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
313 int type, int code, int offset, __be32 info)
315 struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
316 const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
317 struct ipv6_pinfo *np;
318 struct sock *sk;
319 int err;
320 struct tcp_sock *tp;
321 __u32 seq;
323 sk = inet6_lookup(dev_net(skb->dev), &tcp_hashinfo, &hdr->daddr,
324 th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
326 if (sk == NULL) {
327 ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
328 return;
331 if (sk->sk_state == TCP_TIME_WAIT) {
332 inet_twsk_put(inet_twsk(sk));
333 return;
336 bh_lock_sock(sk);
337 if (sock_owned_by_user(sk))
338 NET_INC_STATS_BH(LINUX_MIB_LOCKDROPPEDICMPS);
340 if (sk->sk_state == TCP_CLOSE)
341 goto out;
343 tp = tcp_sk(sk);
344 seq = ntohl(th->seq);
345 if (sk->sk_state != TCP_LISTEN &&
346 !between(seq, tp->snd_una, tp->snd_nxt)) {
347 NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
348 goto out;
351 np = inet6_sk(sk);
353 if (type == ICMPV6_PKT_TOOBIG) {
354 struct dst_entry *dst = NULL;
356 if (sock_owned_by_user(sk))
357 goto out;
358 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
359 goto out;
361 /* icmp should have updated the destination cache entry */
362 dst = __sk_dst_check(sk, np->dst_cookie);
364 if (dst == NULL) {
365 struct inet_sock *inet = inet_sk(sk);
366 struct flowi fl;
368 /* BUGGG_FUTURE: Again, it is not clear how
369 to handle rthdr case. Ignore this complexity
370 for now.
372 memset(&fl, 0, sizeof(fl));
373 fl.proto = IPPROTO_TCP;
374 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
375 ipv6_addr_copy(&fl.fl6_src, &np->saddr);
376 fl.oif = sk->sk_bound_dev_if;
377 fl.fl_ip_dport = inet->dport;
378 fl.fl_ip_sport = inet->sport;
379 security_skb_classify_flow(skb, &fl);
381 if ((err = ip6_dst_lookup(sk, &dst, &fl))) {
382 sk->sk_err_soft = -err;
383 goto out;
386 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
387 sk->sk_err_soft = -err;
388 goto out;
391 } else
392 dst_hold(dst);
394 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
395 tcp_sync_mss(sk, dst_mtu(dst));
396 tcp_simple_retransmit(sk);
397 } /* else let the usual retransmit timer handle it */
398 dst_release(dst);
399 goto out;
402 icmpv6_err_convert(type, code, &err);
404 /* Might be for an request_sock */
405 switch (sk->sk_state) {
406 struct request_sock *req, **prev;
407 case TCP_LISTEN:
408 if (sock_owned_by_user(sk))
409 goto out;
411 req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
412 &hdr->saddr, inet6_iif(skb));
413 if (!req)
414 goto out;
416 /* ICMPs are not backlogged, hence we cannot get
417 * an established socket here.
419 BUG_TRAP(req->sk == NULL);
421 if (seq != tcp_rsk(req)->snt_isn) {
422 NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
423 goto out;
426 inet_csk_reqsk_queue_drop(sk, req, prev);
427 goto out;
429 case TCP_SYN_SENT:
430 case TCP_SYN_RECV: /* Cannot happen.
431 It can, it SYNs are crossed. --ANK */
432 if (!sock_owned_by_user(sk)) {
433 sk->sk_err = err;
434 sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
436 tcp_done(sk);
437 } else
438 sk->sk_err_soft = err;
439 goto out;
442 if (!sock_owned_by_user(sk) && np->recverr) {
443 sk->sk_err = err;
444 sk->sk_error_report(sk);
445 } else
446 sk->sk_err_soft = err;
448 out:
449 bh_unlock_sock(sk);
450 sock_put(sk);
454 static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req)
456 struct inet6_request_sock *treq = inet6_rsk(req);
457 struct ipv6_pinfo *np = inet6_sk(sk);
458 struct sk_buff * skb;
459 struct ipv6_txoptions *opt = NULL;
460 struct in6_addr * final_p = NULL, final;
461 struct flowi fl;
462 struct dst_entry *dst;
463 int err = -1;
465 memset(&fl, 0, sizeof(fl));
466 fl.proto = IPPROTO_TCP;
467 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
468 ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
469 fl.fl6_flowlabel = 0;
470 fl.oif = treq->iif;
471 fl.fl_ip_dport = inet_rsk(req)->rmt_port;
472 fl.fl_ip_sport = inet_sk(sk)->sport;
473 security_req_classify_flow(req, &fl);
475 opt = np->opt;
476 if (opt && opt->srcrt) {
477 struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
478 ipv6_addr_copy(&final, &fl.fl6_dst);
479 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
480 final_p = &final;
483 err = ip6_dst_lookup(sk, &dst, &fl);
484 if (err)
485 goto done;
486 if (final_p)
487 ipv6_addr_copy(&fl.fl6_dst, final_p);
488 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
489 goto done;
491 skb = tcp_make_synack(sk, dst, req);
492 if (skb) {
493 struct tcphdr *th = tcp_hdr(skb);
495 th->check = tcp_v6_check(th, skb->len,
496 &treq->loc_addr, &treq->rmt_addr,
497 csum_partial((char *)th, skb->len, skb->csum));
499 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
500 err = ip6_xmit(sk, skb, &fl, opt, 0);
501 err = net_xmit_eval(err);
504 done:
505 if (opt && opt != np->opt)
506 sock_kfree_s(sk, opt, opt->tot_len);
507 dst_release(dst);
508 return err;
511 static inline void syn_flood_warning(struct sk_buff *skb)
513 #ifdef CONFIG_SYN_COOKIES
514 if (sysctl_tcp_syncookies)
515 printk(KERN_INFO
516 "TCPv6: Possible SYN flooding on port %d. "
517 "Sending cookies.\n", ntohs(tcp_hdr(skb)->dest));
518 else
519 #endif
520 printk(KERN_INFO
521 "TCPv6: Possible SYN flooding on port %d. "
522 "Dropping request.\n", ntohs(tcp_hdr(skb)->dest));
525 static void tcp_v6_reqsk_destructor(struct request_sock *req)
527 if (inet6_rsk(req)->pktopts)
528 kfree_skb(inet6_rsk(req)->pktopts);
531 #ifdef CONFIG_TCP_MD5SIG
532 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
533 struct in6_addr *addr)
535 struct tcp_sock *tp = tcp_sk(sk);
536 int i;
538 BUG_ON(tp == NULL);
540 if (!tp->md5sig_info || !tp->md5sig_info->entries6)
541 return NULL;
543 for (i = 0; i < tp->md5sig_info->entries6; i++) {
544 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, addr))
545 return &tp->md5sig_info->keys6[i].base;
547 return NULL;
550 static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
551 struct sock *addr_sk)
553 return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr);
556 static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
557 struct request_sock *req)
559 return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
562 static int tcp_v6_md5_do_add(struct sock *sk, struct in6_addr *peer,
563 char *newkey, u8 newkeylen)
565 /* Add key to the list */
566 struct tcp_md5sig_key *key;
567 struct tcp_sock *tp = tcp_sk(sk);
568 struct tcp6_md5sig_key *keys;
570 key = tcp_v6_md5_do_lookup(sk, peer);
571 if (key) {
572 /* modify existing entry - just update that one */
573 kfree(key->key);
574 key->key = newkey;
575 key->keylen = newkeylen;
576 } else {
577 /* reallocate new list if current one is full. */
578 if (!tp->md5sig_info) {
579 tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC);
580 if (!tp->md5sig_info) {
581 kfree(newkey);
582 return -ENOMEM;
584 sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
586 if (tcp_alloc_md5sig_pool() == NULL) {
587 kfree(newkey);
588 return -ENOMEM;
590 if (tp->md5sig_info->alloced6 == tp->md5sig_info->entries6) {
591 keys = kmalloc((sizeof (tp->md5sig_info->keys6[0]) *
592 (tp->md5sig_info->entries6 + 1)), GFP_ATOMIC);
594 if (!keys) {
595 tcp_free_md5sig_pool();
596 kfree(newkey);
597 return -ENOMEM;
600 if (tp->md5sig_info->entries6)
601 memmove(keys, tp->md5sig_info->keys6,
602 (sizeof (tp->md5sig_info->keys6[0]) *
603 tp->md5sig_info->entries6));
605 kfree(tp->md5sig_info->keys6);
606 tp->md5sig_info->keys6 = keys;
607 tp->md5sig_info->alloced6++;
610 ipv6_addr_copy(&tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr,
611 peer);
612 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey;
613 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen;
615 tp->md5sig_info->entries6++;
617 return 0;
620 static int tcp_v6_md5_add_func(struct sock *sk, struct sock *addr_sk,
621 u8 *newkey, __u8 newkeylen)
623 return tcp_v6_md5_do_add(sk, &inet6_sk(addr_sk)->daddr,
624 newkey, newkeylen);
627 static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
629 struct tcp_sock *tp = tcp_sk(sk);
630 int i;
632 for (i = 0; i < tp->md5sig_info->entries6; i++) {
633 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, peer)) {
634 /* Free the key */
635 kfree(tp->md5sig_info->keys6[i].base.key);
636 tp->md5sig_info->entries6--;
638 if (tp->md5sig_info->entries6 == 0) {
639 kfree(tp->md5sig_info->keys6);
640 tp->md5sig_info->keys6 = NULL;
641 tp->md5sig_info->alloced6 = 0;
642 } else {
643 /* shrink the database */
644 if (tp->md5sig_info->entries6 != i)
645 memmove(&tp->md5sig_info->keys6[i],
646 &tp->md5sig_info->keys6[i+1],
647 (tp->md5sig_info->entries6 - i)
648 * sizeof (tp->md5sig_info->keys6[0]));
650 tcp_free_md5sig_pool();
651 return 0;
654 return -ENOENT;
657 static void tcp_v6_clear_md5_list (struct sock *sk)
659 struct tcp_sock *tp = tcp_sk(sk);
660 int i;
662 if (tp->md5sig_info->entries6) {
663 for (i = 0; i < tp->md5sig_info->entries6; i++)
664 kfree(tp->md5sig_info->keys6[i].base.key);
665 tp->md5sig_info->entries6 = 0;
666 tcp_free_md5sig_pool();
669 kfree(tp->md5sig_info->keys6);
670 tp->md5sig_info->keys6 = NULL;
671 tp->md5sig_info->alloced6 = 0;
673 if (tp->md5sig_info->entries4) {
674 for (i = 0; i < tp->md5sig_info->entries4; i++)
675 kfree(tp->md5sig_info->keys4[i].base.key);
676 tp->md5sig_info->entries4 = 0;
677 tcp_free_md5sig_pool();
680 kfree(tp->md5sig_info->keys4);
681 tp->md5sig_info->keys4 = NULL;
682 tp->md5sig_info->alloced4 = 0;
685 static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
686 int optlen)
688 struct tcp_md5sig cmd;
689 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
690 u8 *newkey;
692 if (optlen < sizeof(cmd))
693 return -EINVAL;
695 if (copy_from_user(&cmd, optval, sizeof(cmd)))
696 return -EFAULT;
698 if (sin6->sin6_family != AF_INET6)
699 return -EINVAL;
701 if (!cmd.tcpm_keylen) {
702 if (!tcp_sk(sk)->md5sig_info)
703 return -ENOENT;
704 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
705 return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]);
706 return tcp_v6_md5_do_del(sk, &sin6->sin6_addr);
709 if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
710 return -EINVAL;
712 if (!tcp_sk(sk)->md5sig_info) {
713 struct tcp_sock *tp = tcp_sk(sk);
714 struct tcp_md5sig_info *p;
716 p = kzalloc(sizeof(struct tcp_md5sig_info), GFP_KERNEL);
717 if (!p)
718 return -ENOMEM;
720 tp->md5sig_info = p;
721 sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
724 newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
725 if (!newkey)
726 return -ENOMEM;
727 if (ipv6_addr_v4mapped(&sin6->sin6_addr)) {
728 return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
729 newkey, cmd.tcpm_keylen);
731 return tcp_v6_md5_do_add(sk, &sin6->sin6_addr, newkey, cmd.tcpm_keylen);
734 static int tcp_v6_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
735 struct in6_addr *saddr,
736 struct in6_addr *daddr,
737 struct tcphdr *th, int protocol,
738 unsigned int tcplen)
740 struct scatterlist sg[4];
741 __u16 data_len;
742 int block = 0;
743 __sum16 cksum;
744 struct tcp_md5sig_pool *hp;
745 struct tcp6_pseudohdr *bp;
746 struct hash_desc *desc;
747 int err;
748 unsigned int nbytes = 0;
750 hp = tcp_get_md5sig_pool();
751 if (!hp) {
752 printk(KERN_WARNING "%s(): hash pool not found...\n", __func__);
753 goto clear_hash_noput;
755 bp = &hp->md5_blk.ip6;
756 desc = &hp->md5_desc;
758 /* 1. TCP pseudo-header (RFC2460) */
759 ipv6_addr_copy(&bp->saddr, saddr);
760 ipv6_addr_copy(&bp->daddr, daddr);
761 bp->len = htonl(tcplen);
762 bp->protocol = htonl(protocol);
764 sg_init_table(sg, 4);
766 sg_set_buf(&sg[block++], bp, sizeof(*bp));
767 nbytes += sizeof(*bp);
769 /* 2. TCP header, excluding options */
770 cksum = th->check;
771 th->check = 0;
772 sg_set_buf(&sg[block++], th, sizeof(*th));
773 nbytes += sizeof(*th);
775 /* 3. TCP segment data (if any) */
776 data_len = tcplen - (th->doff << 2);
777 if (data_len > 0) {
778 u8 *data = (u8 *)th + (th->doff << 2);
779 sg_set_buf(&sg[block++], data, data_len);
780 nbytes += data_len;
783 /* 4. shared key */
784 sg_set_buf(&sg[block++], key->key, key->keylen);
785 nbytes += key->keylen;
787 sg_mark_end(&sg[block - 1]);
789 /* Now store the hash into the packet */
790 err = crypto_hash_init(desc);
791 if (err) {
792 printk(KERN_WARNING "%s(): hash_init failed\n", __func__);
793 goto clear_hash;
795 err = crypto_hash_update(desc, sg, nbytes);
796 if (err) {
797 printk(KERN_WARNING "%s(): hash_update failed\n", __func__);
798 goto clear_hash;
800 err = crypto_hash_final(desc, md5_hash);
801 if (err) {
802 printk(KERN_WARNING "%s(): hash_final failed\n", __func__);
803 goto clear_hash;
806 /* Reset header, and free up the crypto */
807 tcp_put_md5sig_pool();
808 th->check = cksum;
809 out:
810 return 0;
811 clear_hash:
812 tcp_put_md5sig_pool();
813 clear_hash_noput:
814 memset(md5_hash, 0, 16);
815 goto out;
818 static int tcp_v6_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
819 struct sock *sk,
820 struct dst_entry *dst,
821 struct request_sock *req,
822 struct tcphdr *th, int protocol,
823 unsigned int tcplen)
825 struct in6_addr *saddr, *daddr;
827 if (sk) {
828 saddr = &inet6_sk(sk)->saddr;
829 daddr = &inet6_sk(sk)->daddr;
830 } else {
831 saddr = &inet6_rsk(req)->loc_addr;
832 daddr = &inet6_rsk(req)->rmt_addr;
834 return tcp_v6_do_calc_md5_hash(md5_hash, key,
835 saddr, daddr,
836 th, protocol, tcplen);
839 static int tcp_v6_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)
841 __u8 *hash_location = NULL;
842 struct tcp_md5sig_key *hash_expected;
843 struct ipv6hdr *ip6h = ipv6_hdr(skb);
844 struct tcphdr *th = tcp_hdr(skb);
845 int length = (th->doff << 2) - sizeof (*th);
846 int genhash;
847 u8 *ptr;
848 u8 newhash[16];
850 hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);
852 /* If the TCP option is too short, we can short cut */
853 if (length < TCPOLEN_MD5SIG)
854 return hash_expected ? 1 : 0;
856 /* parse options */
857 ptr = (u8*)(th + 1);
858 while (length > 0) {
859 int opcode = *ptr++;
860 int opsize;
862 switch(opcode) {
863 case TCPOPT_EOL:
864 goto done_opts;
865 case TCPOPT_NOP:
866 length--;
867 continue;
868 default:
869 opsize = *ptr++;
870 if (opsize < 2 || opsize > length)
871 goto done_opts;
872 if (opcode == TCPOPT_MD5SIG) {
873 hash_location = ptr;
874 goto done_opts;
877 ptr += opsize - 2;
878 length -= opsize;
881 done_opts:
882 /* do we have a hash as expected? */
883 if (!hash_expected) {
884 if (!hash_location)
885 return 0;
886 if (net_ratelimit()) {
887 printk(KERN_INFO "MD5 Hash NOT expected but found "
888 "(" NIP6_FMT ", %u)->"
889 "(" NIP6_FMT ", %u)\n",
890 NIP6(ip6h->saddr), ntohs(th->source),
891 NIP6(ip6h->daddr), ntohs(th->dest));
893 return 1;
896 if (!hash_location) {
897 if (net_ratelimit()) {
898 printk(KERN_INFO "MD5 Hash expected but NOT found "
899 "(" NIP6_FMT ", %u)->"
900 "(" NIP6_FMT ", %u)\n",
901 NIP6(ip6h->saddr), ntohs(th->source),
902 NIP6(ip6h->daddr), ntohs(th->dest));
904 return 1;
907 /* check the signature */
908 genhash = tcp_v6_do_calc_md5_hash(newhash,
909 hash_expected,
910 &ip6h->saddr, &ip6h->daddr,
911 th, sk->sk_protocol,
912 skb->len);
913 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
914 if (net_ratelimit()) {
915 printk(KERN_INFO "MD5 Hash %s for "
916 "(" NIP6_FMT ", %u)->"
917 "(" NIP6_FMT ", %u)\n",
918 genhash ? "failed" : "mismatch",
919 NIP6(ip6h->saddr), ntohs(th->source),
920 NIP6(ip6h->daddr), ntohs(th->dest));
922 return 1;
924 return 0;
926 #endif
928 struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
929 .family = AF_INET6,
930 .obj_size = sizeof(struct tcp6_request_sock),
931 .rtx_syn_ack = tcp_v6_send_synack,
932 .send_ack = tcp_v6_reqsk_send_ack,
933 .destructor = tcp_v6_reqsk_destructor,
934 .send_reset = tcp_v6_send_reset
937 #ifdef CONFIG_TCP_MD5SIG
938 static struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
939 .md5_lookup = tcp_v6_reqsk_md5_lookup,
941 #endif
943 static struct timewait_sock_ops tcp6_timewait_sock_ops = {
944 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
945 .twsk_unique = tcp_twsk_unique,
946 .twsk_destructor= tcp_twsk_destructor,
949 static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
951 struct ipv6_pinfo *np = inet6_sk(sk);
952 struct tcphdr *th = tcp_hdr(skb);
954 if (skb->ip_summed == CHECKSUM_PARTIAL) {
955 th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0);
956 skb->csum_start = skb_transport_header(skb) - skb->head;
957 skb->csum_offset = offsetof(struct tcphdr, check);
958 } else {
959 th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,
960 csum_partial((char *)th, th->doff<<2,
961 skb->csum));
965 static int tcp_v6_gso_send_check(struct sk_buff *skb)
967 struct ipv6hdr *ipv6h;
968 struct tcphdr *th;
970 if (!pskb_may_pull(skb, sizeof(*th)))
971 return -EINVAL;
973 ipv6h = ipv6_hdr(skb);
974 th = tcp_hdr(skb);
976 th->check = 0;
977 th->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, skb->len,
978 IPPROTO_TCP, 0);
979 skb->csum_start = skb_transport_header(skb) - skb->head;
980 skb->csum_offset = offsetof(struct tcphdr, check);
981 skb->ip_summed = CHECKSUM_PARTIAL;
982 return 0;
985 static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
987 struct tcphdr *th = tcp_hdr(skb), *t1;
988 struct sk_buff *buff;
989 struct flowi fl;
990 struct net *net = dev_net(skb->dst->dev);
991 struct sock *ctl_sk = net->ipv6.tcp_sk;
992 unsigned int tot_len = sizeof(*th);
993 #ifdef CONFIG_TCP_MD5SIG
994 struct tcp_md5sig_key *key;
995 #endif
997 if (th->rst)
998 return;
1000 if (!ipv6_unicast_destination(skb))
1001 return;
1003 #ifdef CONFIG_TCP_MD5SIG
1004 if (sk)
1005 key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr);
1006 else
1007 key = NULL;
1009 if (key)
1010 tot_len += TCPOLEN_MD5SIG_ALIGNED;
1011 #endif
1014 * We need to grab some memory, and put together an RST,
1015 * and then put it into the queue to be sent.
1018 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1019 GFP_ATOMIC);
1020 if (buff == NULL)
1021 return;
1023 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1025 t1 = (struct tcphdr *) skb_push(buff, tot_len);
1027 /* Swap the send and the receive. */
1028 memset(t1, 0, sizeof(*t1));
1029 t1->dest = th->source;
1030 t1->source = th->dest;
1031 t1->doff = tot_len / 4;
1032 t1->rst = 1;
1034 if(th->ack) {
1035 t1->seq = th->ack_seq;
1036 } else {
1037 t1->ack = 1;
1038 t1->ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin
1039 + skb->len - (th->doff<<2));
1042 #ifdef CONFIG_TCP_MD5SIG
1043 if (key) {
1044 __be32 *opt = (__be32*)(t1 + 1);
1045 opt[0] = htonl((TCPOPT_NOP << 24) |
1046 (TCPOPT_NOP << 16) |
1047 (TCPOPT_MD5SIG << 8) |
1048 TCPOLEN_MD5SIG);
1049 tcp_v6_do_calc_md5_hash((__u8 *)&opt[1], key,
1050 &ipv6_hdr(skb)->daddr,
1051 &ipv6_hdr(skb)->saddr,
1052 t1, IPPROTO_TCP, tot_len);
1054 #endif
1056 buff->csum = csum_partial((char *)t1, sizeof(*t1), 0);
1058 memset(&fl, 0, sizeof(fl));
1059 ipv6_addr_copy(&fl.fl6_dst, &ipv6_hdr(skb)->saddr);
1060 ipv6_addr_copy(&fl.fl6_src, &ipv6_hdr(skb)->daddr);
1062 t1->check = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
1063 sizeof(*t1), IPPROTO_TCP,
1064 buff->csum);
1066 fl.proto = IPPROTO_TCP;
1067 fl.oif = inet6_iif(skb);
1068 fl.fl_ip_dport = t1->dest;
1069 fl.fl_ip_sport = t1->source;
1070 security_skb_classify_flow(skb, &fl);
1072 /* Pass a socket to ip6_dst_lookup either it is for RST
1073 * Underlying function will use this to retrieve the network
1074 * namespace
1076 if (!ip6_dst_lookup(ctl_sk, &buff->dst, &fl)) {
1078 if (xfrm_lookup(&buff->dst, &fl, NULL, 0) >= 0) {
1079 ip6_xmit(ctl_sk, buff, &fl, NULL, 0);
1080 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
1081 TCP_INC_STATS_BH(TCP_MIB_OUTRSTS);
1082 return;
1086 kfree_skb(buff);
1089 static void tcp_v6_send_ack(struct tcp_timewait_sock *tw,
1090 struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts)
1092 struct tcphdr *th = tcp_hdr(skb), *t1;
1093 struct sk_buff *buff;
1094 struct flowi fl;
1095 struct net *net = dev_net(skb->dev);
1096 struct sock *ctl_sk = net->ipv6.tcp_sk;
1097 unsigned int tot_len = sizeof(struct tcphdr);
1098 __be32 *topt;
1099 #ifdef CONFIG_TCP_MD5SIG
1100 struct tcp_md5sig_key *key;
1101 struct tcp_md5sig_key tw_key;
1102 #endif
1104 #ifdef CONFIG_TCP_MD5SIG
1105 if (!tw && skb->sk) {
1106 key = tcp_v6_md5_do_lookup(skb->sk, &ipv6_hdr(skb)->daddr);
1107 } else if (tw && tw->tw_md5_keylen) {
1108 tw_key.key = tw->tw_md5_key;
1109 tw_key.keylen = tw->tw_md5_keylen;
1110 key = &tw_key;
1111 } else {
1112 key = NULL;
1114 #endif
1116 if (ts)
1117 tot_len += TCPOLEN_TSTAMP_ALIGNED;
1118 #ifdef CONFIG_TCP_MD5SIG
1119 if (key)
1120 tot_len += TCPOLEN_MD5SIG_ALIGNED;
1121 #endif
1123 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1124 GFP_ATOMIC);
1125 if (buff == NULL)
1126 return;
1128 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1130 t1 = (struct tcphdr *) skb_push(buff,tot_len);
1132 /* Swap the send and the receive. */
1133 memset(t1, 0, sizeof(*t1));
1134 t1->dest = th->source;
1135 t1->source = th->dest;
1136 t1->doff = tot_len/4;
1137 t1->seq = htonl(seq);
1138 t1->ack_seq = htonl(ack);
1139 t1->ack = 1;
1140 t1->window = htons(win);
1142 topt = (__be32 *)(t1 + 1);
1144 if (ts) {
1145 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1146 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
1147 *topt++ = htonl(tcp_time_stamp);
1148 *topt = htonl(ts);
1151 #ifdef CONFIG_TCP_MD5SIG
1152 if (key) {
1153 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1154 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
1155 tcp_v6_do_calc_md5_hash((__u8 *)topt, key,
1156 &ipv6_hdr(skb)->daddr,
1157 &ipv6_hdr(skb)->saddr,
1158 t1, IPPROTO_TCP, tot_len);
1160 #endif
1162 buff->csum = csum_partial((char *)t1, tot_len, 0);
1164 memset(&fl, 0, sizeof(fl));
1165 ipv6_addr_copy(&fl.fl6_dst, &ipv6_hdr(skb)->saddr);
1166 ipv6_addr_copy(&fl.fl6_src, &ipv6_hdr(skb)->daddr);
1168 t1->check = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
1169 tot_len, IPPROTO_TCP,
1170 buff->csum);
1172 fl.proto = IPPROTO_TCP;
1173 fl.oif = inet6_iif(skb);
1174 fl.fl_ip_dport = t1->dest;
1175 fl.fl_ip_sport = t1->source;
1176 security_skb_classify_flow(skb, &fl);
1178 if (!ip6_dst_lookup(ctl_sk, &buff->dst, &fl)) {
1179 if (xfrm_lookup(&buff->dst, &fl, NULL, 0) >= 0) {
1180 ip6_xmit(ctl_sk, buff, &fl, NULL, 0);
1181 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
1182 return;
1186 kfree_skb(buff);
1189 static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1191 struct inet_timewait_sock *tw = inet_twsk(sk);
1192 struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1194 tcp_v6_send_ack(tcptw, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
1195 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
1196 tcptw->tw_ts_recent);
1198 inet_twsk_put(tw);
1201 static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req)
1203 tcp_v6_send_ack(NULL, skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent);
1207 static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
1209 struct request_sock *req, **prev;
1210 const struct tcphdr *th = tcp_hdr(skb);
1211 struct sock *nsk;
1213 /* Find possible connection requests. */
1214 req = inet6_csk_search_req(sk, &prev, th->source,
1215 &ipv6_hdr(skb)->saddr,
1216 &ipv6_hdr(skb)->daddr, inet6_iif(skb));
1217 if (req)
1218 return tcp_check_req(sk, skb, req, prev);
1220 nsk = __inet6_lookup_established(sock_net(sk), &tcp_hashinfo,
1221 &ipv6_hdr(skb)->saddr, th->source,
1222 &ipv6_hdr(skb)->daddr, ntohs(th->dest), inet6_iif(skb));
1224 if (nsk) {
1225 if (nsk->sk_state != TCP_TIME_WAIT) {
1226 bh_lock_sock(nsk);
1227 return nsk;
1229 inet_twsk_put(inet_twsk(nsk));
1230 return NULL;
1233 #ifdef CONFIG_SYN_COOKIES
1234 if (!th->rst && !th->syn && th->ack)
1235 sk = cookie_v6_check(sk, skb);
1236 #endif
1237 return sk;
1240 /* FIXME: this is substantially similar to the ipv4 code.
1241 * Can some kind of merge be done? -- erics
1243 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1245 struct inet6_request_sock *treq;
1246 struct ipv6_pinfo *np = inet6_sk(sk);
1247 struct tcp_options_received tmp_opt;
1248 struct tcp_sock *tp = tcp_sk(sk);
1249 struct request_sock *req = NULL;
1250 __u32 isn = TCP_SKB_CB(skb)->when;
1251 #ifdef CONFIG_SYN_COOKIES
1252 int want_cookie = 0;
1253 #else
1254 #define want_cookie 0
1255 #endif
1257 if (skb->protocol == htons(ETH_P_IP))
1258 return tcp_v4_conn_request(sk, skb);
1260 if (!ipv6_unicast_destination(skb))
1261 goto drop;
1263 if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
1264 if (net_ratelimit())
1265 syn_flood_warning(skb);
1266 #ifdef CONFIG_SYN_COOKIES
1267 if (sysctl_tcp_syncookies)
1268 want_cookie = 1;
1269 else
1270 #endif
1271 goto drop;
1274 if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
1275 goto drop;
1277 req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
1278 if (req == NULL)
1279 goto drop;
1281 #ifdef CONFIG_TCP_MD5SIG
1282 tcp_rsk(req)->af_specific = &tcp_request_sock_ipv6_ops;
1283 #endif
1285 tcp_clear_options(&tmp_opt);
1286 tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
1287 tmp_opt.user_mss = tp->rx_opt.user_mss;
1289 tcp_parse_options(skb, &tmp_opt, 0);
1291 if (want_cookie && !tmp_opt.saw_tstamp)
1292 tcp_clear_options(&tmp_opt);
1294 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
1295 tcp_openreq_init(req, &tmp_opt, skb);
1297 treq = inet6_rsk(req);
1298 ipv6_addr_copy(&treq->rmt_addr, &ipv6_hdr(skb)->saddr);
1299 ipv6_addr_copy(&treq->loc_addr, &ipv6_hdr(skb)->daddr);
1300 treq->pktopts = NULL;
1301 if (!want_cookie)
1302 TCP_ECN_create_request(req, tcp_hdr(skb));
1304 if (want_cookie) {
1305 isn = cookie_v6_init_sequence(sk, skb, &req->mss);
1306 req->cookie_ts = tmp_opt.tstamp_ok;
1307 } else if (!isn) {
1308 if (ipv6_opt_accepted(sk, skb) ||
1309 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1310 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1311 atomic_inc(&skb->users);
1312 treq->pktopts = skb;
1314 treq->iif = sk->sk_bound_dev_if;
1316 /* So that link locals have meaning */
1317 if (!sk->sk_bound_dev_if &&
1318 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1319 treq->iif = inet6_iif(skb);
1321 isn = tcp_v6_init_sequence(skb);
1324 tcp_rsk(req)->snt_isn = isn;
1326 security_inet_conn_request(sk, skb, req);
1328 if (tcp_v6_send_synack(sk, req))
1329 goto drop;
1331 if (!want_cookie) {
1332 inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
1333 return 0;
1336 drop:
1337 if (req)
1338 reqsk_free(req);
1340 return 0; /* don't send reset */
1343 static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1344 struct request_sock *req,
1345 struct dst_entry *dst)
1347 struct inet6_request_sock *treq = inet6_rsk(req);
1348 struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1349 struct tcp6_sock *newtcp6sk;
1350 struct inet_sock *newinet;
1351 struct tcp_sock *newtp;
1352 struct sock *newsk;
1353 struct ipv6_txoptions *opt;
1354 #ifdef CONFIG_TCP_MD5SIG
1355 struct tcp_md5sig_key *key;
1356 #endif
1358 if (skb->protocol == htons(ETH_P_IP)) {
1360 * v6 mapped
1363 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
1365 if (newsk == NULL)
1366 return NULL;
1368 newtcp6sk = (struct tcp6_sock *)newsk;
1369 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1371 newinet = inet_sk(newsk);
1372 newnp = inet6_sk(newsk);
1373 newtp = tcp_sk(newsk);
1375 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1377 ipv6_addr_set(&newnp->daddr, 0, 0, htonl(0x0000FFFF),
1378 newinet->daddr);
1380 ipv6_addr_set(&newnp->saddr, 0, 0, htonl(0x0000FFFF),
1381 newinet->saddr);
1383 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
1385 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1386 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
1387 #ifdef CONFIG_TCP_MD5SIG
1388 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1389 #endif
1391 newnp->pktoptions = NULL;
1392 newnp->opt = NULL;
1393 newnp->mcast_oif = inet6_iif(skb);
1394 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1397 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
1398 * here, tcp_create_openreq_child now does this for us, see the comment in
1399 * that function for the gory details. -acme
1402 /* It is tricky place. Until this moment IPv4 tcp
1403 worked with IPv6 icsk.icsk_af_ops.
1404 Sync it now.
1406 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1408 return newsk;
1411 opt = np->opt;
1413 if (sk_acceptq_is_full(sk))
1414 goto out_overflow;
1416 if (dst == NULL) {
1417 struct in6_addr *final_p = NULL, final;
1418 struct flowi fl;
1420 memset(&fl, 0, sizeof(fl));
1421 fl.proto = IPPROTO_TCP;
1422 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
1423 if (opt && opt->srcrt) {
1424 struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
1425 ipv6_addr_copy(&final, &fl.fl6_dst);
1426 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
1427 final_p = &final;
1429 ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
1430 fl.oif = sk->sk_bound_dev_if;
1431 fl.fl_ip_dport = inet_rsk(req)->rmt_port;
1432 fl.fl_ip_sport = inet_sk(sk)->sport;
1433 security_req_classify_flow(req, &fl);
1435 if (ip6_dst_lookup(sk, &dst, &fl))
1436 goto out;
1438 if (final_p)
1439 ipv6_addr_copy(&fl.fl6_dst, final_p);
1441 if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0)
1442 goto out;
1445 newsk = tcp_create_openreq_child(sk, req, skb);
1446 if (newsk == NULL)
1447 goto out;
1450 * No need to charge this sock to the relevant IPv6 refcnt debug socks
1451 * count here, tcp_create_openreq_child now does this for us, see the
1452 * comment in that function for the gory details. -acme
1455 newsk->sk_gso_type = SKB_GSO_TCPV6;
1456 __ip6_dst_store(newsk, dst, NULL, NULL);
1458 newtcp6sk = (struct tcp6_sock *)newsk;
1459 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1461 newtp = tcp_sk(newsk);
1462 newinet = inet_sk(newsk);
1463 newnp = inet6_sk(newsk);
1465 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1467 ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr);
1468 ipv6_addr_copy(&newnp->saddr, &treq->loc_addr);
1469 ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
1470 newsk->sk_bound_dev_if = treq->iif;
1472 /* Now IPv6 options...
1474 First: no IPv4 options.
1476 newinet->opt = NULL;
1477 newnp->ipv6_fl_list = NULL;
1479 /* Clone RX bits */
1480 newnp->rxopt.all = np->rxopt.all;
1482 /* Clone pktoptions received with SYN */
1483 newnp->pktoptions = NULL;
1484 if (treq->pktopts != NULL) {
1485 newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
1486 kfree_skb(treq->pktopts);
1487 treq->pktopts = NULL;
1488 if (newnp->pktoptions)
1489 skb_set_owner_r(newnp->pktoptions, newsk);
1491 newnp->opt = NULL;
1492 newnp->mcast_oif = inet6_iif(skb);
1493 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1495 /* Clone native IPv6 options from listening socket (if any)
1497 Yes, keeping reference count would be much more clever,
1498 but we make one more one thing there: reattach optmem
1499 to newsk.
1501 if (opt) {
1502 newnp->opt = ipv6_dup_options(newsk, opt);
1503 if (opt != np->opt)
1504 sock_kfree_s(sk, opt, opt->tot_len);
1507 inet_csk(newsk)->icsk_ext_hdr_len = 0;
1508 if (newnp->opt)
1509 inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
1510 newnp->opt->opt_flen);
1512 tcp_mtup_init(newsk);
1513 tcp_sync_mss(newsk, dst_mtu(dst));
1514 newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
1515 tcp_initialize_rcv_mss(newsk);
1517 newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6;
1519 #ifdef CONFIG_TCP_MD5SIG
1520 /* Copy over the MD5 key from the original socket */
1521 if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) {
1522 /* We're using one, so create a matching key
1523 * on the newsk structure. If we fail to get
1524 * memory, then we end up not copying the key
1525 * across. Shucks.
1527 char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
1528 if (newkey != NULL)
1529 tcp_v6_md5_do_add(newsk, &inet6_sk(sk)->daddr,
1530 newkey, key->keylen);
1532 #endif
1534 __inet6_hash(newsk);
1535 __inet_inherit_port(sk, newsk);
1537 return newsk;
1539 out_overflow:
1540 NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS);
1541 out:
1542 NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS);
1543 if (opt && opt != np->opt)
1544 sock_kfree_s(sk, opt, opt->tot_len);
1545 dst_release(dst);
1546 return NULL;
1549 static __sum16 tcp_v6_checksum_init(struct sk_buff *skb)
1551 if (skb->ip_summed == CHECKSUM_COMPLETE) {
1552 if (!tcp_v6_check(tcp_hdr(skb), skb->len, &ipv6_hdr(skb)->saddr,
1553 &ipv6_hdr(skb)->daddr, skb->csum)) {
1554 skb->ip_summed = CHECKSUM_UNNECESSARY;
1555 return 0;
1559 skb->csum = ~csum_unfold(tcp_v6_check(tcp_hdr(skb), skb->len,
1560 &ipv6_hdr(skb)->saddr,
1561 &ipv6_hdr(skb)->daddr, 0));
1563 if (skb->len <= 76) {
1564 return __skb_checksum_complete(skb);
1566 return 0;
1569 /* The socket must have it's spinlock held when we get
1570 * here.
1572 * We have a potential double-lock case here, so even when
1573 * doing backlog processing we use the BH locking scheme.
1574 * This is because we cannot sleep with the original spinlock
1575 * held.
1577 static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1579 struct ipv6_pinfo *np = inet6_sk(sk);
1580 struct tcp_sock *tp;
1581 struct sk_buff *opt_skb = NULL;
1583 /* Imagine: socket is IPv6. IPv4 packet arrives,
1584 goes to IPv4 receive handler and backlogged.
1585 From backlog it always goes here. Kerboom...
1586 Fortunately, tcp_rcv_established and rcv_established
1587 handle them correctly, but it is not case with
1588 tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK
1591 if (skb->protocol == htons(ETH_P_IP))
1592 return tcp_v4_do_rcv(sk, skb);
1594 #ifdef CONFIG_TCP_MD5SIG
1595 if (tcp_v6_inbound_md5_hash (sk, skb))
1596 goto discard;
1597 #endif
1599 if (sk_filter(sk, skb))
1600 goto discard;
1603 * socket locking is here for SMP purposes as backlog rcv
1604 * is currently called with bh processing disabled.
1607 /* Do Stevens' IPV6_PKTOPTIONS.
1609 Yes, guys, it is the only place in our code, where we
1610 may make it not affecting IPv4.
1611 The rest of code is protocol independent,
1612 and I do not like idea to uglify IPv4.
1614 Actually, all the idea behind IPV6_PKTOPTIONS
1615 looks not very well thought. For now we latch
1616 options, received in the last packet, enqueued
1617 by tcp. Feel free to propose better solution.
1618 --ANK (980728)
1620 if (np->rxopt.all)
1621 opt_skb = skb_clone(skb, GFP_ATOMIC);
1623 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
1624 TCP_CHECK_TIMER(sk);
1625 if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len))
1626 goto reset;
1627 TCP_CHECK_TIMER(sk);
1628 if (opt_skb)
1629 goto ipv6_pktoptions;
1630 return 0;
1633 if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb))
1634 goto csum_err;
1636 if (sk->sk_state == TCP_LISTEN) {
1637 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1638 if (!nsk)
1639 goto discard;
1642 * Queue it on the new socket if the new socket is active,
1643 * otherwise we just shortcircuit this and continue with
1644 * the new socket..
1646 if(nsk != sk) {
1647 if (tcp_child_process(sk, nsk, skb))
1648 goto reset;
1649 if (opt_skb)
1650 __kfree_skb(opt_skb);
1651 return 0;
1655 TCP_CHECK_TIMER(sk);
1656 if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len))
1657 goto reset;
1658 TCP_CHECK_TIMER(sk);
1659 if (opt_skb)
1660 goto ipv6_pktoptions;
1661 return 0;
1663 reset:
1664 tcp_v6_send_reset(sk, skb);
1665 discard:
1666 if (opt_skb)
1667 __kfree_skb(opt_skb);
1668 kfree_skb(skb);
1669 return 0;
1670 csum_err:
1671 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1672 goto discard;
1675 ipv6_pktoptions:
1676 /* Do you ask, what is it?
1678 1. skb was enqueued by tcp.
1679 2. skb is added to tail of read queue, rather than out of order.
1680 3. socket is not in passive state.
1681 4. Finally, it really contains options, which user wants to receive.
1683 tp = tcp_sk(sk);
1684 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1685 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1686 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
1687 np->mcast_oif = inet6_iif(opt_skb);
1688 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
1689 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
1690 if (ipv6_opt_accepted(sk, opt_skb)) {
1691 skb_set_owner_r(opt_skb, sk);
1692 opt_skb = xchg(&np->pktoptions, opt_skb);
1693 } else {
1694 __kfree_skb(opt_skb);
1695 opt_skb = xchg(&np->pktoptions, NULL);
1699 if (opt_skb)
1700 kfree_skb(opt_skb);
1701 return 0;
1704 static int tcp_v6_rcv(struct sk_buff *skb)
1706 struct tcphdr *th;
1707 struct sock *sk;
1708 int ret;
1710 if (skb->pkt_type != PACKET_HOST)
1711 goto discard_it;
1714 * Count it even if it's bad.
1716 TCP_INC_STATS_BH(TCP_MIB_INSEGS);
1718 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1719 goto discard_it;
1721 th = tcp_hdr(skb);
1723 if (th->doff < sizeof(struct tcphdr)/4)
1724 goto bad_packet;
1725 if (!pskb_may_pull(skb, th->doff*4))
1726 goto discard_it;
1728 if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb))
1729 goto bad_packet;
1731 th = tcp_hdr(skb);
1732 TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1733 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1734 skb->len - th->doff*4);
1735 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1736 TCP_SKB_CB(skb)->when = 0;
1737 TCP_SKB_CB(skb)->flags = ipv6_get_dsfield(ipv6_hdr(skb));
1738 TCP_SKB_CB(skb)->sacked = 0;
1740 sk = __inet6_lookup(dev_net(skb->dev), &tcp_hashinfo,
1741 &ipv6_hdr(skb)->saddr, th->source,
1742 &ipv6_hdr(skb)->daddr, ntohs(th->dest),
1743 inet6_iif(skb));
1745 if (!sk)
1746 goto no_tcp_socket;
1748 process:
1749 if (sk->sk_state == TCP_TIME_WAIT)
1750 goto do_time_wait;
1752 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1753 goto discard_and_relse;
1755 if (sk_filter(sk, skb))
1756 goto discard_and_relse;
1758 skb->dev = NULL;
1760 bh_lock_sock_nested(sk);
1761 ret = 0;
1762 if (!sock_owned_by_user(sk)) {
1763 #ifdef CONFIG_NET_DMA
1764 struct tcp_sock *tp = tcp_sk(sk);
1765 if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
1766 tp->ucopy.dma_chan = get_softnet_dma();
1767 if (tp->ucopy.dma_chan)
1768 ret = tcp_v6_do_rcv(sk, skb);
1769 else
1770 #endif
1772 if (!tcp_prequeue(sk, skb))
1773 ret = tcp_v6_do_rcv(sk, skb);
1775 } else
1776 sk_add_backlog(sk, skb);
1777 bh_unlock_sock(sk);
1779 sock_put(sk);
1780 return ret ? -1 : 0;
1782 no_tcp_socket:
1783 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1784 goto discard_it;
1786 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1787 bad_packet:
1788 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1789 } else {
1790 tcp_v6_send_reset(NULL, skb);
1793 discard_it:
1796 * Discard frame
1799 kfree_skb(skb);
1800 return 0;
1802 discard_and_relse:
1803 sock_put(sk);
1804 goto discard_it;
1806 do_time_wait:
1807 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
1808 inet_twsk_put(inet_twsk(sk));
1809 goto discard_it;
1812 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1813 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1814 inet_twsk_put(inet_twsk(sk));
1815 goto discard_it;
1818 switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1819 case TCP_TW_SYN:
1821 struct sock *sk2;
1823 sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
1824 &ipv6_hdr(skb)->daddr,
1825 ntohs(th->dest), inet6_iif(skb));
1826 if (sk2 != NULL) {
1827 struct inet_timewait_sock *tw = inet_twsk(sk);
1828 inet_twsk_deschedule(tw, &tcp_death_row);
1829 inet_twsk_put(tw);
1830 sk = sk2;
1831 goto process;
1833 /* Fall through to ACK */
1835 case TCP_TW_ACK:
1836 tcp_v6_timewait_ack(sk, skb);
1837 break;
1838 case TCP_TW_RST:
1839 goto no_tcp_socket;
1840 case TCP_TW_SUCCESS:;
1842 goto discard_it;
1845 static int tcp_v6_remember_stamp(struct sock *sk)
1847 /* Alas, not yet... */
1848 return 0;
1851 static struct inet_connection_sock_af_ops ipv6_specific = {
1852 .queue_xmit = inet6_csk_xmit,
1853 .send_check = tcp_v6_send_check,
1854 .rebuild_header = inet6_sk_rebuild_header,
1855 .conn_request = tcp_v6_conn_request,
1856 .syn_recv_sock = tcp_v6_syn_recv_sock,
1857 .remember_stamp = tcp_v6_remember_stamp,
1858 .net_header_len = sizeof(struct ipv6hdr),
1859 .setsockopt = ipv6_setsockopt,
1860 .getsockopt = ipv6_getsockopt,
1861 .addr2sockaddr = inet6_csk_addr2sockaddr,
1862 .sockaddr_len = sizeof(struct sockaddr_in6),
1863 .bind_conflict = inet6_csk_bind_conflict,
1864 #ifdef CONFIG_COMPAT
1865 .compat_setsockopt = compat_ipv6_setsockopt,
1866 .compat_getsockopt = compat_ipv6_getsockopt,
1867 #endif
1870 #ifdef CONFIG_TCP_MD5SIG
1871 static struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
1872 .md5_lookup = tcp_v6_md5_lookup,
1873 .calc_md5_hash = tcp_v6_calc_md5_hash,
1874 .md5_add = tcp_v6_md5_add_func,
1875 .md5_parse = tcp_v6_parse_md5_keys,
1877 #endif
1880 * TCP over IPv4 via INET6 API
1883 static struct inet_connection_sock_af_ops ipv6_mapped = {
1884 .queue_xmit = ip_queue_xmit,
1885 .send_check = tcp_v4_send_check,
1886 .rebuild_header = inet_sk_rebuild_header,
1887 .conn_request = tcp_v6_conn_request,
1888 .syn_recv_sock = tcp_v6_syn_recv_sock,
1889 .remember_stamp = tcp_v4_remember_stamp,
1890 .net_header_len = sizeof(struct iphdr),
1891 .setsockopt = ipv6_setsockopt,
1892 .getsockopt = ipv6_getsockopt,
1893 .addr2sockaddr = inet6_csk_addr2sockaddr,
1894 .sockaddr_len = sizeof(struct sockaddr_in6),
1895 .bind_conflict = inet6_csk_bind_conflict,
1896 #ifdef CONFIG_COMPAT
1897 .compat_setsockopt = compat_ipv6_setsockopt,
1898 .compat_getsockopt = compat_ipv6_getsockopt,
1899 #endif
1902 #ifdef CONFIG_TCP_MD5SIG
1903 static struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
1904 .md5_lookup = tcp_v4_md5_lookup,
1905 .calc_md5_hash = tcp_v4_calc_md5_hash,
1906 .md5_add = tcp_v6_md5_add_func,
1907 .md5_parse = tcp_v6_parse_md5_keys,
1909 #endif
1911 /* NOTE: A lot of things set to zero explicitly by call to
1912 * sk_alloc() so need not be done here.
1914 static int tcp_v6_init_sock(struct sock *sk)
1916 struct inet_connection_sock *icsk = inet_csk(sk);
1917 struct tcp_sock *tp = tcp_sk(sk);
1919 skb_queue_head_init(&tp->out_of_order_queue);
1920 tcp_init_xmit_timers(sk);
1921 tcp_prequeue_init(tp);
1923 icsk->icsk_rto = TCP_TIMEOUT_INIT;
1924 tp->mdev = TCP_TIMEOUT_INIT;
1926 /* So many TCP implementations out there (incorrectly) count the
1927 * initial SYN frame in their delayed-ACK and congestion control
1928 * algorithms that we must have the following bandaid to talk
1929 * efficiently to them. -DaveM
1931 tp->snd_cwnd = 2;
1933 /* See draft-stevens-tcpca-spec-01 for discussion of the
1934 * initialization of these values.
1936 tp->snd_ssthresh = 0x7fffffff;
1937 tp->snd_cwnd_clamp = ~0;
1938 tp->mss_cache = 536;
1940 tp->reordering = sysctl_tcp_reordering;
1942 sk->sk_state = TCP_CLOSE;
1944 icsk->icsk_af_ops = &ipv6_specific;
1945 icsk->icsk_ca_ops = &tcp_init_congestion_ops;
1946 icsk->icsk_sync_mss = tcp_sync_mss;
1947 sk->sk_write_space = sk_stream_write_space;
1948 sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
1950 #ifdef CONFIG_TCP_MD5SIG
1951 tp->af_specific = &tcp_sock_ipv6_specific;
1952 #endif
1954 sk->sk_sndbuf = sysctl_tcp_wmem[1];
1955 sk->sk_rcvbuf = sysctl_tcp_rmem[1];
1957 atomic_inc(&tcp_sockets_allocated);
1959 return 0;
1962 static int tcp_v6_destroy_sock(struct sock *sk)
1964 #ifdef CONFIG_TCP_MD5SIG
1965 /* Clean up the MD5 key list */
1966 if (tcp_sk(sk)->md5sig_info)
1967 tcp_v6_clear_md5_list(sk);
1968 #endif
1969 tcp_v4_destroy_sock(sk);
1970 return inet6_destroy_sock(sk);
1973 #ifdef CONFIG_PROC_FS
1974 /* Proc filesystem TCPv6 sock list dumping. */
1975 static void get_openreq6(struct seq_file *seq,
1976 struct sock *sk, struct request_sock *req, int i, int uid)
1978 int ttd = req->expires - jiffies;
1979 struct in6_addr *src = &inet6_rsk(req)->loc_addr;
1980 struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
1982 if (ttd < 0)
1983 ttd = 0;
1985 seq_printf(seq,
1986 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1987 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
1989 src->s6_addr32[0], src->s6_addr32[1],
1990 src->s6_addr32[2], src->s6_addr32[3],
1991 ntohs(inet_sk(sk)->sport),
1992 dest->s6_addr32[0], dest->s6_addr32[1],
1993 dest->s6_addr32[2], dest->s6_addr32[3],
1994 ntohs(inet_rsk(req)->rmt_port),
1995 TCP_SYN_RECV,
1996 0,0, /* could print option size, but that is af dependent. */
1997 1, /* timers active (only the expire timer) */
1998 jiffies_to_clock_t(ttd),
1999 req->retrans,
2000 uid,
2001 0, /* non standard timer */
2002 0, /* open_requests have no inode */
2003 0, req);
2006 static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
2008 struct in6_addr *dest, *src;
2009 __u16 destp, srcp;
2010 int timer_active;
2011 unsigned long timer_expires;
2012 struct inet_sock *inet = inet_sk(sp);
2013 struct tcp_sock *tp = tcp_sk(sp);
2014 const struct inet_connection_sock *icsk = inet_csk(sp);
2015 struct ipv6_pinfo *np = inet6_sk(sp);
2017 dest = &np->daddr;
2018 src = &np->rcv_saddr;
2019 destp = ntohs(inet->dport);
2020 srcp = ntohs(inet->sport);
2022 if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
2023 timer_active = 1;
2024 timer_expires = icsk->icsk_timeout;
2025 } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
2026 timer_active = 4;
2027 timer_expires = icsk->icsk_timeout;
2028 } else if (timer_pending(&sp->sk_timer)) {
2029 timer_active = 2;
2030 timer_expires = sp->sk_timer.expires;
2031 } else {
2032 timer_active = 0;
2033 timer_expires = jiffies;
2036 seq_printf(seq,
2037 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2038 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %u %u %u %u %d\n",
2040 src->s6_addr32[0], src->s6_addr32[1],
2041 src->s6_addr32[2], src->s6_addr32[3], srcp,
2042 dest->s6_addr32[0], dest->s6_addr32[1],
2043 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2044 sp->sk_state,
2045 tp->write_seq-tp->snd_una,
2046 (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
2047 timer_active,
2048 jiffies_to_clock_t(timer_expires - jiffies),
2049 icsk->icsk_retransmits,
2050 sock_i_uid(sp),
2051 icsk->icsk_probes_out,
2052 sock_i_ino(sp),
2053 atomic_read(&sp->sk_refcnt), sp,
2054 icsk->icsk_rto,
2055 icsk->icsk_ack.ato,
2056 (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong,
2057 tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh
2061 static void get_timewait6_sock(struct seq_file *seq,
2062 struct inet_timewait_sock *tw, int i)
2064 struct in6_addr *dest, *src;
2065 __u16 destp, srcp;
2066 struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
2067 int ttd = tw->tw_ttd - jiffies;
2069 if (ttd < 0)
2070 ttd = 0;
2072 dest = &tw6->tw_v6_daddr;
2073 src = &tw6->tw_v6_rcv_saddr;
2074 destp = ntohs(tw->tw_dport);
2075 srcp = ntohs(tw->tw_sport);
2077 seq_printf(seq,
2078 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2079 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2081 src->s6_addr32[0], src->s6_addr32[1],
2082 src->s6_addr32[2], src->s6_addr32[3], srcp,
2083 dest->s6_addr32[0], dest->s6_addr32[1],
2084 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2085 tw->tw_substate, 0, 0,
2086 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2087 atomic_read(&tw->tw_refcnt), tw);
2090 static int tcp6_seq_show(struct seq_file *seq, void *v)
2092 struct tcp_iter_state *st;
2094 if (v == SEQ_START_TOKEN) {
2095 seq_puts(seq,
2096 " sl "
2097 "local_address "
2098 "remote_address "
2099 "st tx_queue rx_queue tr tm->when retrnsmt"
2100 " uid timeout inode\n");
2101 goto out;
2103 st = seq->private;
2105 switch (st->state) {
2106 case TCP_SEQ_STATE_LISTENING:
2107 case TCP_SEQ_STATE_ESTABLISHED:
2108 get_tcp6_sock(seq, v, st->num);
2109 break;
2110 case TCP_SEQ_STATE_OPENREQ:
2111 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
2112 break;
2113 case TCP_SEQ_STATE_TIME_WAIT:
2114 get_timewait6_sock(seq, v, st->num);
2115 break;
2117 out:
2118 return 0;
2121 static struct tcp_seq_afinfo tcp6_seq_afinfo = {
2122 .name = "tcp6",
2123 .family = AF_INET6,
2124 .seq_fops = {
2125 .owner = THIS_MODULE,
2127 .seq_ops = {
2128 .show = tcp6_seq_show,
2132 int tcp6_proc_init(struct net *net)
2134 return tcp_proc_register(net, &tcp6_seq_afinfo);
2137 void tcp6_proc_exit(struct net *net)
2139 tcp_proc_unregister(net, &tcp6_seq_afinfo);
2141 #endif
2143 struct proto tcpv6_prot = {
2144 .name = "TCPv6",
2145 .owner = THIS_MODULE,
2146 .close = tcp_close,
2147 .connect = tcp_v6_connect,
2148 .disconnect = tcp_disconnect,
2149 .accept = inet_csk_accept,
2150 .ioctl = tcp_ioctl,
2151 .init = tcp_v6_init_sock,
2152 .destroy = tcp_v6_destroy_sock,
2153 .shutdown = tcp_shutdown,
2154 .setsockopt = tcp_setsockopt,
2155 .getsockopt = tcp_getsockopt,
2156 .recvmsg = tcp_recvmsg,
2157 .backlog_rcv = tcp_v6_do_rcv,
2158 .hash = tcp_v6_hash,
2159 .unhash = inet_unhash,
2160 .get_port = inet_csk_get_port,
2161 .enter_memory_pressure = tcp_enter_memory_pressure,
2162 .sockets_allocated = &tcp_sockets_allocated,
2163 .memory_allocated = &tcp_memory_allocated,
2164 .memory_pressure = &tcp_memory_pressure,
2165 .orphan_count = &tcp_orphan_count,
2166 .sysctl_mem = sysctl_tcp_mem,
2167 .sysctl_wmem = sysctl_tcp_wmem,
2168 .sysctl_rmem = sysctl_tcp_rmem,
2169 .max_header = MAX_TCP_HEADER,
2170 .obj_size = sizeof(struct tcp6_sock),
2171 .twsk_prot = &tcp6_timewait_sock_ops,
2172 .rsk_prot = &tcp6_request_sock_ops,
2173 .h.hashinfo = &tcp_hashinfo,
2174 #ifdef CONFIG_COMPAT
2175 .compat_setsockopt = compat_tcp_setsockopt,
2176 .compat_getsockopt = compat_tcp_getsockopt,
2177 #endif
2180 static struct inet6_protocol tcpv6_protocol = {
2181 .handler = tcp_v6_rcv,
2182 .err_handler = tcp_v6_err,
2183 .gso_send_check = tcp_v6_gso_send_check,
2184 .gso_segment = tcp_tso_segment,
2185 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2188 static struct inet_protosw tcpv6_protosw = {
2189 .type = SOCK_STREAM,
2190 .protocol = IPPROTO_TCP,
2191 .prot = &tcpv6_prot,
2192 .ops = &inet6_stream_ops,
2193 .capability = -1,
2194 .no_check = 0,
2195 .flags = INET_PROTOSW_PERMANENT |
2196 INET_PROTOSW_ICSK,
2199 static int tcpv6_net_init(struct net *net)
2201 return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
2202 SOCK_RAW, IPPROTO_TCP, net);
2205 static void tcpv6_net_exit(struct net *net)
2207 inet_ctl_sock_destroy(net->ipv6.tcp_sk);
2210 static struct pernet_operations tcpv6_net_ops = {
2211 .init = tcpv6_net_init,
2212 .exit = tcpv6_net_exit,
2215 int __init tcpv6_init(void)
2217 int ret;
2219 ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2220 if (ret)
2221 goto out;
2223 /* register inet6 protocol */
2224 ret = inet6_register_protosw(&tcpv6_protosw);
2225 if (ret)
2226 goto out_tcpv6_protocol;
2228 ret = register_pernet_subsys(&tcpv6_net_ops);
2229 if (ret)
2230 goto out_tcpv6_protosw;
2231 out:
2232 return ret;
2234 out_tcpv6_protocol:
2235 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2236 out_tcpv6_protosw:
2237 inet6_unregister_protosw(&tcpv6_protosw);
2238 goto out;
2241 void tcpv6_exit(void)
2243 unregister_pernet_subsys(&tcpv6_net_ops);
2244 inet6_unregister_protosw(&tcpv6_protosw);
2245 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);