1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/bottom_half.h>
27#include <linux/module.h>
28#include <linux/errno.h>
29#include <linux/types.h>
30#include <linux/socket.h>
31#include <linux/sockios.h>
32#include <linux/net.h>
33#include <linux/jiffies.h>
34#include <linux/in.h>
35#include <linux/in6.h>
36#include <linux/netdevice.h>
37#include <linux/init.h>
38#include <linux/jhash.h>
39#include <linux/ipsec.h>
40#include <linux/times.h>
41#include <linux/slab.h>
42
43#include <linux/ipv6.h>
44#include <linux/icmpv6.h>
45#include <linux/random.h>
46
47#include <net/tcp.h>
48#include <net/ndisc.h>
49#include <net/inet6_hashtables.h>
50#include <net/inet6_connection_sock.h>
51#include <net/ipv6.h>
52#include <net/transp_v6.h>
53#include <net/addrconf.h>
54#include <net/ip6_route.h>
55#include <net/ip6_checksum.h>
56#include <net/inet_ecn.h>
57#include <net/protocol.h>
58#include <net/xfrm.h>
59#include <net/snmp.h>
60#include <net/dsfield.h>
61#include <net/timewait_sock.h>
62#include <net/netdma.h>
63#include <net/inet_common.h>
64
65#include <asm/uaccess.h>
66
67#include <linux/proc_fs.h>
68#include <linux/seq_file.h>
69
70#include <linux/crypto.h>
71#include <linux/scatterlist.h>
72
73static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
74static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
75 struct request_sock *req);
76
77static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
78static void __tcp_v6_send_check(struct sk_buff *skb,
79 struct in6_addr *saddr,
80 struct in6_addr *daddr);
81
82static const struct inet_connection_sock_af_ops ipv6_mapped;
83static const struct inet_connection_sock_af_ops ipv6_specific;
84#ifdef CONFIG_TCP_MD5SIG
85static const struct tcp_sock_af_ops tcp_sock_ipv6_specific;
86static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
87#else
88static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
89 struct in6_addr *addr)
90{
91 return NULL;
92}
93#endif
94
95static void tcp_v6_hash(struct sock *sk)
96{
97 if (sk->sk_state != TCP_CLOSE) {
98 if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
99 tcp_prot.hash(sk);
100 return;
101 }
102 local_bh_disable();
103 __inet6_hash(sk, NULL);
104 local_bh_enable();
105 }
106}
107
108static __inline__ __sum16 tcp_v6_check(int len,
109 struct in6_addr *saddr,
110 struct in6_addr *daddr,
111 __wsum base)
112{
113 return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
114}
115
116static __u32 tcp_v6_init_sequence(struct sk_buff *skb)
117{
118 return secure_tcpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
119 ipv6_hdr(skb)->saddr.s6_addr32,
120 tcp_hdr(skb)->dest,
121 tcp_hdr(skb)->source);
122}
123
124static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
125 int addr_len)
126{
127 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
128 struct inet_sock *inet = inet_sk(sk);
129 struct inet_connection_sock *icsk = inet_csk(sk);
130 struct ipv6_pinfo *np = inet6_sk(sk);
131 struct tcp_sock *tp = tcp_sk(sk);
132 struct in6_addr *saddr = NULL, *final_p, final;
133 struct rt6_info *rt;
134 struct flowi6 fl6;
135 struct dst_entry *dst;
136 int addr_type;
137 int err;
138
139 if (addr_len < SIN6_LEN_RFC2133)
140 return -EINVAL;
141
142 if (usin->sin6_family != AF_INET6)
143 return -EAFNOSUPPORT;
144
145 memset(&fl6, 0, sizeof(fl6));
146
147 if (np->sndflow) {
148 fl6.flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
149 IP6_ECN_flow_init(fl6.flowlabel);
150 if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
151 struct ip6_flowlabel *flowlabel;
152 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
153 if (flowlabel == NULL)
154 return -EINVAL;
155 ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
156 fl6_sock_release(flowlabel);
157 }
158 }
159
160
161
162
163
164 if(ipv6_addr_any(&usin->sin6_addr))
165 usin->sin6_addr.s6_addr[15] = 0x1;
166
167 addr_type = ipv6_addr_type(&usin->sin6_addr);
168
169 if(addr_type & IPV6_ADDR_MULTICAST)
170 return -ENETUNREACH;
171
172 if (addr_type&IPV6_ADDR_LINKLOCAL) {
173 if (addr_len >= sizeof(struct sockaddr_in6) &&
174 usin->sin6_scope_id) {
175
176
177
178 if (sk->sk_bound_dev_if &&
179 sk->sk_bound_dev_if != usin->sin6_scope_id)
180 return -EINVAL;
181
182 sk->sk_bound_dev_if = usin->sin6_scope_id;
183 }
184
185
186 if (!sk->sk_bound_dev_if)
187 return -EINVAL;
188 }
189
190 if (tp->rx_opt.ts_recent_stamp &&
191 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
192 tp->rx_opt.ts_recent = 0;
193 tp->rx_opt.ts_recent_stamp = 0;
194 tp->write_seq = 0;
195 }
196
197 ipv6_addr_copy(&np->daddr, &usin->sin6_addr);
198 np->flow_label = fl6.flowlabel;
199
200
201
202
203
204 if (addr_type == IPV6_ADDR_MAPPED) {
205 u32 exthdrlen = icsk->icsk_ext_hdr_len;
206 struct sockaddr_in sin;
207
208 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
209
210 if (__ipv6_only_sock(sk))
211 return -ENETUNREACH;
212
213 sin.sin_family = AF_INET;
214 sin.sin_port = usin->sin6_port;
215 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
216
217 icsk->icsk_af_ops = &ipv6_mapped;
218 sk->sk_backlog_rcv = tcp_v4_do_rcv;
219#ifdef CONFIG_TCP_MD5SIG
220 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
221#endif
222
223 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
224
225 if (err) {
226 icsk->icsk_ext_hdr_len = exthdrlen;
227 icsk->icsk_af_ops = &ipv6_specific;
228 sk->sk_backlog_rcv = tcp_v6_do_rcv;
229#ifdef CONFIG_TCP_MD5SIG
230 tp->af_specific = &tcp_sock_ipv6_specific;
231#endif
232 goto failure;
233 } else {
234 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
235 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
236 &np->rcv_saddr);
237 }
238
239 return err;
240 }
241
242 if (!ipv6_addr_any(&np->rcv_saddr))
243 saddr = &np->rcv_saddr;
244
245 fl6.flowi6_proto = IPPROTO_TCP;
246 ipv6_addr_copy(&fl6.daddr, &np->daddr);
247 ipv6_addr_copy(&fl6.saddr,
248 (saddr ? saddr : &np->saddr));
249 fl6.flowi6_oif = sk->sk_bound_dev_if;
250 fl6.flowi6_mark = sk->sk_mark;
251 fl6.fl6_dport = usin->sin6_port;
252 fl6.fl6_sport = inet->inet_sport;
253
254 final_p = fl6_update_dst(&fl6, np->opt, &final);
255
256 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
257
258 dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
259 if (IS_ERR(dst)) {
260 err = PTR_ERR(dst);
261 goto failure;
262 }
263
264 if (saddr == NULL) {
265 saddr = &fl6.saddr;
266 ipv6_addr_copy(&np->rcv_saddr, saddr);
267 }
268
269
270 ipv6_addr_copy(&np->saddr, saddr);
271 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
272
273 sk->sk_gso_type = SKB_GSO_TCPV6;
274 __ip6_dst_store(sk, dst, NULL, NULL);
275
276 rt = (struct rt6_info *) dst;
277 if (tcp_death_row.sysctl_tw_recycle &&
278 !tp->rx_opt.ts_recent_stamp &&
279 ipv6_addr_equal(&rt->rt6i_dst.addr, &np->daddr)) {
280 struct inet_peer *peer = rt6_get_peer(rt);
281
282
283
284
285
286
287 if (peer) {
288 inet_peer_refcheck(peer);
289 if ((u32)get_seconds() - peer->tcp_ts_stamp <= TCP_PAWS_MSL) {
290 tp->rx_opt.ts_recent_stamp = peer->tcp_ts_stamp;
291 tp->rx_opt.ts_recent = peer->tcp_ts;
292 }
293 }
294 }
295
296 icsk->icsk_ext_hdr_len = 0;
297 if (np->opt)
298 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
299 np->opt->opt_nflen);
300
301 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
302
303 inet->inet_dport = usin->sin6_port;
304
305 tcp_set_state(sk, TCP_SYN_SENT);
306 err = inet6_hash_connect(&tcp_death_row, sk);
307 if (err)
308 goto late_failure;
309
310 if (!tp->write_seq)
311 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
312 np->daddr.s6_addr32,
313 inet->inet_sport,
314 inet->inet_dport);
315
316 err = tcp_connect(sk);
317 if (err)
318 goto late_failure;
319
320 return 0;
321
322late_failure:
323 tcp_set_state(sk, TCP_CLOSE);
324 __sk_dst_reset(sk);
325failure:
326 inet->inet_dport = 0;
327 sk->sk_route_caps = 0;
328 return err;
329}
330
331static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
332 u8 type, u8 code, int offset, __be32 info)
333{
334 struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
335 const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
336 struct ipv6_pinfo *np;
337 struct sock *sk;
338 int err;
339 struct tcp_sock *tp;
340 __u32 seq;
341 struct net *net = dev_net(skb->dev);
342
343 sk = inet6_lookup(net, &tcp_hashinfo, &hdr->daddr,
344 th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
345
346 if (sk == NULL) {
347 ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev),
348 ICMP6_MIB_INERRORS);
349 return;
350 }
351
352 if (sk->sk_state == TCP_TIME_WAIT) {
353 inet_twsk_put(inet_twsk(sk));
354 return;
355 }
356
357 bh_lock_sock(sk);
358 if (sock_owned_by_user(sk))
359 NET_INC_STATS_BH(net, LINUX_MIB_LOCKDROPPEDICMPS);
360
361 if (sk->sk_state == TCP_CLOSE)
362 goto out;
363
364 if (ipv6_hdr(skb)->hop_limit < inet6_sk(sk)->min_hopcount) {
365 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
366 goto out;
367 }
368
369 tp = tcp_sk(sk);
370 seq = ntohl(th->seq);
371 if (sk->sk_state != TCP_LISTEN &&
372 !between(seq, tp->snd_una, tp->snd_nxt)) {
373 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
374 goto out;
375 }
376
377 np = inet6_sk(sk);
378
379 if (type == ICMPV6_PKT_TOOBIG) {
380 struct dst_entry *dst;
381
382 if (sock_owned_by_user(sk))
383 goto out;
384 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
385 goto out;
386
387
388 dst = __sk_dst_check(sk, np->dst_cookie);
389
390 if (dst == NULL) {
391 struct inet_sock *inet = inet_sk(sk);
392 struct flowi6 fl6;
393
394
395
396
397
398 memset(&fl6, 0, sizeof(fl6));
399 fl6.flowi6_proto = IPPROTO_TCP;
400 ipv6_addr_copy(&fl6.daddr, &np->daddr);
401 ipv6_addr_copy(&fl6.saddr, &np->saddr);
402 fl6.flowi6_oif = sk->sk_bound_dev_if;
403 fl6.flowi6_mark = sk->sk_mark;
404 fl6.fl6_dport = inet->inet_dport;
405 fl6.fl6_sport = inet->inet_sport;
406 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
407
408 dst = ip6_dst_lookup_flow(sk, &fl6, NULL, false);
409 if (IS_ERR(dst)) {
410 sk->sk_err_soft = -PTR_ERR(dst);
411 goto out;
412 }
413
414 } else
415 dst_hold(dst);
416
417 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
418 tcp_sync_mss(sk, dst_mtu(dst));
419 tcp_simple_retransmit(sk);
420 }
421 dst_release(dst);
422 goto out;
423 }
424
425 icmpv6_err_convert(type, code, &err);
426
427
428 switch (sk->sk_state) {
429 struct request_sock *req, **prev;
430 case TCP_LISTEN:
431 if (sock_owned_by_user(sk))
432 goto out;
433
434 req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
435 &hdr->saddr, inet6_iif(skb));
436 if (!req)
437 goto out;
438
439
440
441
442 WARN_ON(req->sk != NULL);
443
444 if (seq != tcp_rsk(req)->snt_isn) {
445 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
446 goto out;
447 }
448
449 inet_csk_reqsk_queue_drop(sk, req, prev);
450 goto out;
451
452 case TCP_SYN_SENT:
453 case TCP_SYN_RECV:
454
455 if (!sock_owned_by_user(sk)) {
456 sk->sk_err = err;
457 sk->sk_error_report(sk);
458
459 tcp_done(sk);
460 } else
461 sk->sk_err_soft = err;
462 goto out;
463 }
464
465 if (!sock_owned_by_user(sk) && np->recverr) {
466 sk->sk_err = err;
467 sk->sk_error_report(sk);
468 } else
469 sk->sk_err_soft = err;
470
471out:
472 bh_unlock_sock(sk);
473 sock_put(sk);
474}
475
476
477static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
478 struct request_values *rvp)
479{
480 struct inet6_request_sock *treq = inet6_rsk(req);
481 struct ipv6_pinfo *np = inet6_sk(sk);
482 struct sk_buff * skb;
483 struct ipv6_txoptions *opt = NULL;
484 struct in6_addr * final_p, final;
485 struct flowi6 fl6;
486 struct dst_entry *dst;
487 int err;
488
489 memset(&fl6, 0, sizeof(fl6));
490 fl6.flowi6_proto = IPPROTO_TCP;
491 ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr);
492 ipv6_addr_copy(&fl6.saddr, &treq->loc_addr);
493 fl6.flowlabel = 0;
494 fl6.flowi6_oif = treq->iif;
495 fl6.flowi6_mark = sk->sk_mark;
496 fl6.fl6_dport = inet_rsk(req)->rmt_port;
497 fl6.fl6_sport = inet_rsk(req)->loc_port;
498 security_req_classify_flow(req, flowi6_to_flowi(&fl6));
499
500 opt = np->opt;
501 final_p = fl6_update_dst(&fl6, opt, &final);
502
503 dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false);
504 if (IS_ERR(dst)) {
505 err = PTR_ERR(dst);
506 dst = NULL;
507 goto done;
508 }
509 skb = tcp_make_synack(sk, dst, req, rvp);
510 err = -ENOMEM;
511 if (skb) {
512 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
513
514 ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr);
515 err = ip6_xmit(sk, skb, &fl6, opt);
516 err = net_xmit_eval(err);
517 }
518
519done:
520 if (opt && opt != np->opt)
521 sock_kfree_s(sk, opt, opt->tot_len);
522 dst_release(dst);
523 return err;
524}
525
526static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req,
527 struct request_values *rvp)
528{
529 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
530 return tcp_v6_send_synack(sk, req, rvp);
531}
532
533static inline void syn_flood_warning(struct sk_buff *skb)
534{
535#ifdef CONFIG_SYN_COOKIES
536 if (sysctl_tcp_syncookies)
537 printk(KERN_INFO
538 "TCPv6: Possible SYN flooding on port %d. "
539 "Sending cookies.\n", ntohs(tcp_hdr(skb)->dest));
540 else
541#endif
542 printk(KERN_INFO
543 "TCPv6: Possible SYN flooding on port %d. "
544 "Dropping request.\n", ntohs(tcp_hdr(skb)->dest));
545}
546
547static void tcp_v6_reqsk_destructor(struct request_sock *req)
548{
549 kfree_skb(inet6_rsk(req)->pktopts);
550}
551
552#ifdef CONFIG_TCP_MD5SIG
553static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
554 struct in6_addr *addr)
555{
556 struct tcp_sock *tp = tcp_sk(sk);
557 int i;
558
559 BUG_ON(tp == NULL);
560
561 if (!tp->md5sig_info || !tp->md5sig_info->entries6)
562 return NULL;
563
564 for (i = 0; i < tp->md5sig_info->entries6; i++) {
565 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, addr))
566 return &tp->md5sig_info->keys6[i].base;
567 }
568 return NULL;
569}
570
571static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
572 struct sock *addr_sk)
573{
574 return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr);
575}
576
577static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
578 struct request_sock *req)
579{
580 return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
581}
582
583static int tcp_v6_md5_do_add(struct sock *sk, struct in6_addr *peer,
584 char *newkey, u8 newkeylen)
585{
586
587 struct tcp_md5sig_key *key;
588 struct tcp_sock *tp = tcp_sk(sk);
589 struct tcp6_md5sig_key *keys;
590
591 key = tcp_v6_md5_do_lookup(sk, peer);
592 if (key) {
593
594 kfree(key->key);
595 key->key = newkey;
596 key->keylen = newkeylen;
597 } else {
598
599 if (!tp->md5sig_info) {
600 tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC);
601 if (!tp->md5sig_info) {
602 kfree(newkey);
603 return -ENOMEM;
604 }
605 sk_nocaps_add(sk, NETIF_F_GSO_MASK);
606 }
607 if (tcp_alloc_md5sig_pool(sk) == NULL) {
608 kfree(newkey);
609 return -ENOMEM;
610 }
611 if (tp->md5sig_info->alloced6 == tp->md5sig_info->entries6) {
612 keys = kmalloc((sizeof (tp->md5sig_info->keys6[0]) *
613 (tp->md5sig_info->entries6 + 1)), GFP_ATOMIC);
614
615 if (!keys) {
616 tcp_free_md5sig_pool();
617 kfree(newkey);
618 return -ENOMEM;
619 }
620
621 if (tp->md5sig_info->entries6)
622 memmove(keys, tp->md5sig_info->keys6,
623 (sizeof (tp->md5sig_info->keys6[0]) *
624 tp->md5sig_info->entries6));
625
626 kfree(tp->md5sig_info->keys6);
627 tp->md5sig_info->keys6 = keys;
628 tp->md5sig_info->alloced6++;
629 }
630
631 ipv6_addr_copy(&tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr,
632 peer);
633 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey;
634 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen;
635
636 tp->md5sig_info->entries6++;
637 }
638 return 0;
639}
640
641static int tcp_v6_md5_add_func(struct sock *sk, struct sock *addr_sk,
642 u8 *newkey, __u8 newkeylen)
643{
644 return tcp_v6_md5_do_add(sk, &inet6_sk(addr_sk)->daddr,
645 newkey, newkeylen);
646}
647
648static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
649{
650 struct tcp_sock *tp = tcp_sk(sk);
651 int i;
652
653 for (i = 0; i < tp->md5sig_info->entries6; i++) {
654 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, peer)) {
655
656 kfree(tp->md5sig_info->keys6[i].base.key);
657 tp->md5sig_info->entries6--;
658
659 if (tp->md5sig_info->entries6 == 0) {
660 kfree(tp->md5sig_info->keys6);
661 tp->md5sig_info->keys6 = NULL;
662 tp->md5sig_info->alloced6 = 0;
663 } else {
664
665 if (tp->md5sig_info->entries6 != i)
666 memmove(&tp->md5sig_info->keys6[i],
667 &tp->md5sig_info->keys6[i+1],
668 (tp->md5sig_info->entries6 - i)
669 * sizeof (tp->md5sig_info->keys6[0]));
670 }
671 tcp_free_md5sig_pool();
672 return 0;
673 }
674 }
675 return -ENOENT;
676}
677
678static void tcp_v6_clear_md5_list (struct sock *sk)
679{
680 struct tcp_sock *tp = tcp_sk(sk);
681 int i;
682
683 if (tp->md5sig_info->entries6) {
684 for (i = 0; i < tp->md5sig_info->entries6; i++)
685 kfree(tp->md5sig_info->keys6[i].base.key);
686 tp->md5sig_info->entries6 = 0;
687 tcp_free_md5sig_pool();
688 }
689
690 kfree(tp->md5sig_info->keys6);
691 tp->md5sig_info->keys6 = NULL;
692 tp->md5sig_info->alloced6 = 0;
693
694 if (tp->md5sig_info->entries4) {
695 for (i = 0; i < tp->md5sig_info->entries4; i++)
696 kfree(tp->md5sig_info->keys4[i].base.key);
697 tp->md5sig_info->entries4 = 0;
698 tcp_free_md5sig_pool();
699 }
700
701 kfree(tp->md5sig_info->keys4);
702 tp->md5sig_info->keys4 = NULL;
703 tp->md5sig_info->alloced4 = 0;
704}
705
706static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
707 int optlen)
708{
709 struct tcp_md5sig cmd;
710 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
711 u8 *newkey;
712
713 if (optlen < sizeof(cmd))
714 return -EINVAL;
715
716 if (copy_from_user(&cmd, optval, sizeof(cmd)))
717 return -EFAULT;
718
719 if (sin6->sin6_family != AF_INET6)
720 return -EINVAL;
721
722 if (!cmd.tcpm_keylen) {
723 if (!tcp_sk(sk)->md5sig_info)
724 return -ENOENT;
725 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
726 return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]);
727 return tcp_v6_md5_do_del(sk, &sin6->sin6_addr);
728 }
729
730 if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
731 return -EINVAL;
732
733 if (!tcp_sk(sk)->md5sig_info) {
734 struct tcp_sock *tp = tcp_sk(sk);
735 struct tcp_md5sig_info *p;
736
737 p = kzalloc(sizeof(struct tcp_md5sig_info), GFP_KERNEL);
738 if (!p)
739 return -ENOMEM;
740
741 tp->md5sig_info = p;
742 sk_nocaps_add(sk, NETIF_F_GSO_MASK);
743 }
744
745 newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
746 if (!newkey)
747 return -ENOMEM;
748 if (ipv6_addr_v4mapped(&sin6->sin6_addr)) {
749 return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
750 newkey, cmd.tcpm_keylen);
751 }
752 return tcp_v6_md5_do_add(sk, &sin6->sin6_addr, newkey, cmd.tcpm_keylen);
753}
754
755static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
756 struct in6_addr *daddr,
757 struct in6_addr *saddr, int nbytes)
758{
759 struct tcp6_pseudohdr *bp;
760 struct scatterlist sg;
761
762 bp = &hp->md5_blk.ip6;
763
764 ipv6_addr_copy(&bp->saddr, saddr);
765 ipv6_addr_copy(&bp->daddr, daddr);
766 bp->protocol = cpu_to_be32(IPPROTO_TCP);
767 bp->len = cpu_to_be32(nbytes);
768
769 sg_init_one(&sg, bp, sizeof(*bp));
770 return crypto_hash_update(&hp->md5_desc, &sg, sizeof(*bp));
771}
772
773static int tcp_v6_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
774 struct in6_addr *daddr, struct in6_addr *saddr,
775 struct tcphdr *th)
776{
777 struct tcp_md5sig_pool *hp;
778 struct hash_desc *desc;
779
780 hp = tcp_get_md5sig_pool();
781 if (!hp)
782 goto clear_hash_noput;
783 desc = &hp->md5_desc;
784
785 if (crypto_hash_init(desc))
786 goto clear_hash;
787 if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, th->doff << 2))
788 goto clear_hash;
789 if (tcp_md5_hash_header(hp, th))
790 goto clear_hash;
791 if (tcp_md5_hash_key(hp, key))
792 goto clear_hash;
793 if (crypto_hash_final(desc, md5_hash))
794 goto clear_hash;
795
796 tcp_put_md5sig_pool();
797 return 0;
798
799clear_hash:
800 tcp_put_md5sig_pool();
801clear_hash_noput:
802 memset(md5_hash, 0, 16);
803 return 1;
804}
805
806static int tcp_v6_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
807 struct sock *sk, struct request_sock *req,
808 struct sk_buff *skb)
809{
810 struct in6_addr *saddr, *daddr;
811 struct tcp_md5sig_pool *hp;
812 struct hash_desc *desc;
813 struct tcphdr *th = tcp_hdr(skb);
814
815 if (sk) {
816 saddr = &inet6_sk(sk)->saddr;
817 daddr = &inet6_sk(sk)->daddr;
818 } else if (req) {
819 saddr = &inet6_rsk(req)->loc_addr;
820 daddr = &inet6_rsk(req)->rmt_addr;
821 } else {
822 struct ipv6hdr *ip6h = ipv6_hdr(skb);
823 saddr = &ip6h->saddr;
824 daddr = &ip6h->daddr;
825 }
826
827 hp = tcp_get_md5sig_pool();
828 if (!hp)
829 goto clear_hash_noput;
830 desc = &hp->md5_desc;
831
832 if (crypto_hash_init(desc))
833 goto clear_hash;
834
835 if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, skb->len))
836 goto clear_hash;
837 if (tcp_md5_hash_header(hp, th))
838 goto clear_hash;
839 if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))
840 goto clear_hash;
841 if (tcp_md5_hash_key(hp, key))
842 goto clear_hash;
843 if (crypto_hash_final(desc, md5_hash))
844 goto clear_hash;
845
846 tcp_put_md5sig_pool();
847 return 0;
848
849clear_hash:
850 tcp_put_md5sig_pool();
851clear_hash_noput:
852 memset(md5_hash, 0, 16);
853 return 1;
854}
855
856static int tcp_v6_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)
857{
858 __u8 *hash_location = NULL;
859 struct tcp_md5sig_key *hash_expected;
860 struct ipv6hdr *ip6h = ipv6_hdr(skb);
861 struct tcphdr *th = tcp_hdr(skb);
862 int genhash;
863 u8 newhash[16];
864
865 hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);
866 hash_location = tcp_parse_md5sig_option(th);
867
868
869 if (!hash_expected && !hash_location)
870 return 0;
871
872 if (hash_expected && !hash_location) {
873 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);
874 return 1;
875 }
876
877 if (!hash_expected && hash_location) {
878 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);
879 return 1;
880 }
881
882
883 genhash = tcp_v6_md5_hash_skb(newhash,
884 hash_expected,
885 NULL, NULL, skb);
886
887 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
888 if (net_ratelimit()) {
889 printk(KERN_INFO "MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
890 genhash ? "failed" : "mismatch",
891 &ip6h->saddr, ntohs(th->source),
892 &ip6h->daddr, ntohs(th->dest));
893 }
894 return 1;
895 }
896 return 0;
897}
898#endif
899
900struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
901 .family = AF_INET6,
902 .obj_size = sizeof(struct tcp6_request_sock),
903 .rtx_syn_ack = tcp_v6_rtx_synack,
904 .send_ack = tcp_v6_reqsk_send_ack,
905 .destructor = tcp_v6_reqsk_destructor,
906 .send_reset = tcp_v6_send_reset,
907 .syn_ack_timeout = tcp_syn_ack_timeout,
908};
909
910#ifdef CONFIG_TCP_MD5SIG
911static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
912 .md5_lookup = tcp_v6_reqsk_md5_lookup,
913 .calc_md5_hash = tcp_v6_md5_hash_skb,
914};
915#endif
916
917static void __tcp_v6_send_check(struct sk_buff *skb,
918 struct in6_addr *saddr, struct in6_addr *daddr)
919{
920 struct tcphdr *th = tcp_hdr(skb);
921
922 if (skb->ip_summed == CHECKSUM_PARTIAL) {
923 th->check = ~tcp_v6_check(skb->len, saddr, daddr, 0);
924 skb->csum_start = skb_transport_header(skb) - skb->head;
925 skb->csum_offset = offsetof(struct tcphdr, check);
926 } else {
927 th->check = tcp_v6_check(skb->len, saddr, daddr,
928 csum_partial(th, th->doff << 2,
929 skb->csum));
930 }
931}
932
933static void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
934{
935 struct ipv6_pinfo *np = inet6_sk(sk);
936
937 __tcp_v6_send_check(skb, &np->saddr, &np->daddr);
938}
939
940static int tcp_v6_gso_send_check(struct sk_buff *skb)
941{
942 struct ipv6hdr *ipv6h;
943 struct tcphdr *th;
944
945 if (!pskb_may_pull(skb, sizeof(*th)))
946 return -EINVAL;
947
948 ipv6h = ipv6_hdr(skb);
949 th = tcp_hdr(skb);
950
951 th->check = 0;
952 skb->ip_summed = CHECKSUM_PARTIAL;
953 __tcp_v6_send_check(skb, &ipv6h->saddr, &ipv6h->daddr);
954 return 0;
955}
956
957static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
958 struct sk_buff *skb)
959{
960 struct ipv6hdr *iph = skb_gro_network_header(skb);
961
962 switch (skb->ip_summed) {
963 case CHECKSUM_COMPLETE:
964 if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr,
965 skb->csum)) {
966 skb->ip_summed = CHECKSUM_UNNECESSARY;
967 break;
968 }
969
970
971 case CHECKSUM_NONE:
972 NAPI_GRO_CB(skb)->flush = 1;
973 return NULL;
974 }
975
976 return tcp_gro_receive(head, skb);
977}
978
979static int tcp6_gro_complete(struct sk_buff *skb)
980{
981 struct ipv6hdr *iph = ipv6_hdr(skb);
982 struct tcphdr *th = tcp_hdr(skb);
983
984 th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
985 &iph->saddr, &iph->daddr, 0);
986 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
987
988 return tcp_gro_complete(skb);
989}
990
991static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
992 u32 ts, struct tcp_md5sig_key *key, int rst)
993{
994 struct tcphdr *th = tcp_hdr(skb), *t1;
995 struct sk_buff *buff;
996 struct flowi6 fl6;
997 struct net *net = dev_net(skb_dst(skb)->dev);
998 struct sock *ctl_sk = net->ipv6.tcp_sk;
999 unsigned int tot_len = sizeof(struct tcphdr);
1000 struct dst_entry *dst;
1001 __be32 *topt;
1002
1003 if (ts)
1004 tot_len += TCPOLEN_TSTAMP_ALIGNED;
1005#ifdef CONFIG_TCP_MD5SIG
1006 if (key)
1007 tot_len += TCPOLEN_MD5SIG_ALIGNED;
1008#endif
1009
1010 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1011 GFP_ATOMIC);
1012 if (buff == NULL)
1013 return;
1014
1015 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1016
1017 t1 = (struct tcphdr *) skb_push(buff, tot_len);
1018 skb_reset_transport_header(buff);
1019
1020
1021 memset(t1, 0, sizeof(*t1));
1022 t1->dest = th->source;
1023 t1->source = th->dest;
1024 t1->doff = tot_len / 4;
1025 t1->seq = htonl(seq);
1026 t1->ack_seq = htonl(ack);
1027 t1->ack = !rst || !th->ack;
1028 t1->rst = rst;
1029 t1->window = htons(win);
1030
1031 topt = (__be32 *)(t1 + 1);
1032
1033 if (ts) {
1034 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1035 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
1036 *topt++ = htonl(tcp_time_stamp);
1037 *topt++ = htonl(ts);
1038 }
1039
1040#ifdef CONFIG_TCP_MD5SIG
1041 if (key) {
1042 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1043 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
1044 tcp_v6_md5_hash_hdr((__u8 *)topt, key,
1045 &ipv6_hdr(skb)->saddr,
1046 &ipv6_hdr(skb)->daddr, t1);
1047 }
1048#endif
1049
1050 memset(&fl6, 0, sizeof(fl6));
1051 ipv6_addr_copy(&fl6.daddr, &ipv6_hdr(skb)->saddr);
1052 ipv6_addr_copy(&fl6.saddr, &ipv6_hdr(skb)->daddr);
1053
1054 buff->ip_summed = CHECKSUM_PARTIAL;
1055 buff->csum = 0;
1056
1057 __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr);
1058
1059 fl6.flowi6_proto = IPPROTO_TCP;
1060 fl6.flowi6_oif = inet6_iif(skb);
1061 fl6.fl6_dport = t1->dest;
1062 fl6.fl6_sport = t1->source;
1063 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1064
1065
1066
1067
1068
1069 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
1070 if (!IS_ERR(dst)) {
1071 skb_dst_set(buff, dst);
1072 ip6_xmit(ctl_sk, buff, &fl6, NULL);
1073 TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
1074 if (rst)
1075 TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
1076 return;
1077 }
1078
1079 kfree_skb(buff);
1080}
1081
1082static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
1083{
1084 struct tcphdr *th = tcp_hdr(skb);
1085 u32 seq = 0, ack_seq = 0;
1086 struct tcp_md5sig_key *key = NULL;
1087
1088 if (th->rst)
1089 return;
1090
1091 if (!ipv6_unicast_destination(skb))
1092 return;
1093
1094#ifdef CONFIG_TCP_MD5SIG
1095 if (sk)
1096 key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr);
1097#endif
1098
1099 if (th->ack)
1100 seq = ntohl(th->ack_seq);
1101 else
1102 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
1103 (th->doff << 2);
1104
1105 tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1);
1106}
1107
1108static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
1109 struct tcp_md5sig_key *key)
1110{
1111 tcp_v6_send_response(skb, seq, ack, win, ts, key, 0);
1112}
1113
1114static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1115{
1116 struct inet_timewait_sock *tw = inet_twsk(sk);
1117 struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1118
1119 tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
1120 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
1121 tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw));
1122
1123 inet_twsk_put(tw);
1124}
1125
1126static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
1127 struct request_sock *req)
1128{
1129 tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
1130 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr));
1131}
1132
1133
1134static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
1135{
1136 struct request_sock *req, **prev;
1137 const struct tcphdr *th = tcp_hdr(skb);
1138 struct sock *nsk;
1139
1140
1141 req = inet6_csk_search_req(sk, &prev, th->source,
1142 &ipv6_hdr(skb)->saddr,
1143 &ipv6_hdr(skb)->daddr, inet6_iif(skb));
1144 if (req)
1145 return tcp_check_req(sk, skb, req, prev);
1146
1147 nsk = __inet6_lookup_established(sock_net(sk), &tcp_hashinfo,
1148 &ipv6_hdr(skb)->saddr, th->source,
1149 &ipv6_hdr(skb)->daddr, ntohs(th->dest), inet6_iif(skb));
1150
1151 if (nsk) {
1152 if (nsk->sk_state != TCP_TIME_WAIT) {
1153 bh_lock_sock(nsk);
1154 return nsk;
1155 }
1156 inet_twsk_put(inet_twsk(nsk));
1157 return NULL;
1158 }
1159
1160#ifdef CONFIG_SYN_COOKIES
1161 if (!th->syn)
1162 sk = cookie_v6_check(sk, skb);
1163#endif
1164 return sk;
1165}
1166
1167
1168
1169
1170static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1171{
1172 struct tcp_extend_values tmp_ext;
1173 struct tcp_options_received tmp_opt;
1174 u8 *hash_location;
1175 struct request_sock *req;
1176 struct inet6_request_sock *treq;
1177 struct ipv6_pinfo *np = inet6_sk(sk);
1178 struct tcp_sock *tp = tcp_sk(sk);
1179 __u32 isn = TCP_SKB_CB(skb)->when;
1180 struct dst_entry *dst = NULL;
1181#ifdef CONFIG_SYN_COOKIES
1182 int want_cookie = 0;
1183#else
1184#define want_cookie 0
1185#endif
1186
1187 if (skb->protocol == htons(ETH_P_IP))
1188 return tcp_v4_conn_request(sk, skb);
1189
1190 if (!ipv6_unicast_destination(skb))
1191 goto drop;
1192
1193 if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
1194 if (net_ratelimit())
1195 syn_flood_warning(skb);
1196#ifdef CONFIG_SYN_COOKIES
1197 if (sysctl_tcp_syncookies)
1198 want_cookie = 1;
1199 else
1200#endif
1201 goto drop;
1202 }
1203
1204 if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
1205 goto drop;
1206
1207 req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
1208 if (req == NULL)
1209 goto drop;
1210
1211#ifdef CONFIG_TCP_MD5SIG
1212 tcp_rsk(req)->af_specific = &tcp_request_sock_ipv6_ops;
1213#endif
1214
1215 tcp_clear_options(&tmp_opt);
1216 tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
1217 tmp_opt.user_mss = tp->rx_opt.user_mss;
1218 tcp_parse_options(skb, &tmp_opt, &hash_location, 0);
1219
1220 if (tmp_opt.cookie_plus > 0 &&
1221 tmp_opt.saw_tstamp &&
1222 !tp->rx_opt.cookie_out_never &&
1223 (sysctl_tcp_cookie_size > 0 ||
1224 (tp->cookie_values != NULL &&
1225 tp->cookie_values->cookie_desired > 0))) {
1226 u8 *c;
1227 u32 *d;
1228 u32 *mess = &tmp_ext.cookie_bakery[COOKIE_DIGEST_WORDS];
1229 int l = tmp_opt.cookie_plus - TCPOLEN_COOKIE_BASE;
1230
1231 if (tcp_cookie_generator(&tmp_ext.cookie_bakery[0]) != 0)
1232 goto drop_and_free;
1233
1234
1235 d = (__force u32 *)&ipv6_hdr(skb)->daddr.s6_addr32[0];
1236 *mess++ ^= *d++;
1237 *mess++ ^= *d++;
1238 *mess++ ^= *d++;
1239 *mess++ ^= *d++;
1240 d = (__force u32 *)&ipv6_hdr(skb)->saddr.s6_addr32[0];
1241 *mess++ ^= *d++;
1242 *mess++ ^= *d++;
1243 *mess++ ^= *d++;
1244 *mess++ ^= *d++;
1245
1246
1247 c = (u8 *)mess;
1248 while (l-- > 0)
1249 *c++ ^= *hash_location++;
1250
1251#ifdef CONFIG_SYN_COOKIES
1252 want_cookie = 0;
1253#endif
1254 tmp_ext.cookie_out_never = 0;
1255 tmp_ext.cookie_plus = tmp_opt.cookie_plus;
1256 } else if (!tp->rx_opt.cookie_in_always) {
1257
1258 tmp_ext.cookie_out_never = 1;
1259 tmp_ext.cookie_plus = 0;
1260 } else {
1261 goto drop_and_free;
1262 }
1263 tmp_ext.cookie_in_always = tp->rx_opt.cookie_in_always;
1264
1265 if (want_cookie && !tmp_opt.saw_tstamp)
1266 tcp_clear_options(&tmp_opt);
1267
1268 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
1269 tcp_openreq_init(req, &tmp_opt, skb);
1270
1271 treq = inet6_rsk(req);
1272 ipv6_addr_copy(&treq->rmt_addr, &ipv6_hdr(skb)->saddr);
1273 ipv6_addr_copy(&treq->loc_addr, &ipv6_hdr(skb)->daddr);
1274 if (!want_cookie || tmp_opt.tstamp_ok)
1275 TCP_ECN_create_request(req, tcp_hdr(skb));
1276
1277 if (!isn) {
1278 struct inet_peer *peer = NULL;
1279
1280 if (ipv6_opt_accepted(sk, skb) ||
1281 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1282 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1283 atomic_inc(&skb->users);
1284 treq->pktopts = skb;
1285 }
1286 treq->iif = sk->sk_bound_dev_if;
1287
1288
1289 if (!sk->sk_bound_dev_if &&
1290 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1291 treq->iif = inet6_iif(skb);
1292
1293 if (want_cookie) {
1294 isn = cookie_v6_init_sequence(sk, skb, &req->mss);
1295 req->cookie_ts = tmp_opt.tstamp_ok;
1296 goto have_isn;
1297 }
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308 if (tmp_opt.saw_tstamp &&
1309 tcp_death_row.sysctl_tw_recycle &&
1310 (dst = inet6_csk_route_req(sk, req)) != NULL &&
1311 (peer = rt6_get_peer((struct rt6_info *)dst)) != NULL &&
1312 ipv6_addr_equal((struct in6_addr *)peer->daddr.addr.a6,
1313 &treq->rmt_addr)) {
1314 inet_peer_refcheck(peer);
1315 if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL &&
1316 (s32)(peer->tcp_ts - req->ts_recent) >
1317 TCP_PAWS_WINDOW) {
1318 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
1319 goto drop_and_release;
1320 }
1321 }
1322
1323 else if (!sysctl_tcp_syncookies &&
1324 (sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) <
1325 (sysctl_max_syn_backlog >> 2)) &&
1326 (!peer || !peer->tcp_ts_stamp) &&
1327 (!dst || !dst_metric(dst, RTAX_RTT))) {
1328
1329
1330
1331
1332
1333
1334
1335 LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open request from %pI6/%u\n",
1336 &treq->rmt_addr, ntohs(tcp_hdr(skb)->source));
1337 goto drop_and_release;
1338 }
1339
1340 isn = tcp_v6_init_sequence(skb);
1341 }
1342have_isn:
1343 tcp_rsk(req)->snt_isn = isn;
1344
1345 security_inet_conn_request(sk, skb, req);
1346
1347 if (tcp_v6_send_synack(sk, req,
1348 (struct request_values *)&tmp_ext) ||
1349 want_cookie)
1350 goto drop_and_free;
1351
1352 inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
1353 return 0;
1354
1355drop_and_release:
1356 dst_release(dst);
1357drop_and_free:
1358 reqsk_free(req);
1359drop:
1360 return 0;
1361}
1362
1363static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1364 struct request_sock *req,
1365 struct dst_entry *dst)
1366{
1367 struct inet6_request_sock *treq;
1368 struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1369 struct tcp6_sock *newtcp6sk;
1370 struct inet_sock *newinet;
1371 struct tcp_sock *newtp;
1372 struct sock *newsk;
1373 struct ipv6_txoptions *opt;
1374#ifdef CONFIG_TCP_MD5SIG
1375 struct tcp_md5sig_key *key;
1376#endif
1377
1378 if (skb->protocol == htons(ETH_P_IP)) {
1379
1380
1381
1382
1383 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
1384
1385 if (newsk == NULL)
1386 return NULL;
1387
1388 newtcp6sk = (struct tcp6_sock *)newsk;
1389 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1390
1391 newinet = inet_sk(newsk);
1392 newnp = inet6_sk(newsk);
1393 newtp = tcp_sk(newsk);
1394
1395 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1396
1397 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr);
1398
1399 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1400
1401 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
1402
1403 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1404 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
1405#ifdef CONFIG_TCP_MD5SIG
1406 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1407#endif
1408
1409 newnp->pktoptions = NULL;
1410 newnp->opt = NULL;
1411 newnp->mcast_oif = inet6_iif(skb);
1412 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1425
1426 return newsk;
1427 }
1428
1429 treq = inet6_rsk(req);
1430 opt = np->opt;
1431
1432 if (sk_acceptq_is_full(sk))
1433 goto out_overflow;
1434
1435 if (!dst) {
1436 dst = inet6_csk_route_req(sk, req);
1437 if (!dst)
1438 goto out;
1439 }
1440
1441 newsk = tcp_create_openreq_child(sk, req, skb);
1442 if (newsk == NULL)
1443 goto out_nonewsk;
1444
1445
1446
1447
1448
1449
1450
1451 newsk->sk_gso_type = SKB_GSO_TCPV6;
1452 __ip6_dst_store(newsk, dst, NULL, NULL);
1453
1454 newtcp6sk = (struct tcp6_sock *)newsk;
1455 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1456
1457 newtp = tcp_sk(newsk);
1458 newinet = inet_sk(newsk);
1459 newnp = inet6_sk(newsk);
1460
1461 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1462
1463 ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr);
1464 ipv6_addr_copy(&newnp->saddr, &treq->loc_addr);
1465 ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
1466 newsk->sk_bound_dev_if = treq->iif;
1467
1468
1469
1470
1471
1472 newinet->opt = NULL;
1473 newnp->ipv6_fl_list = NULL;
1474
1475
1476 newnp->rxopt.all = np->rxopt.all;
1477
1478
1479 newnp->pktoptions = NULL;
1480 if (treq->pktopts != NULL) {
1481 newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
1482 kfree_skb(treq->pktopts);
1483 treq->pktopts = NULL;
1484 if (newnp->pktoptions)
1485 skb_set_owner_r(newnp->pktoptions, newsk);
1486 }
1487 newnp->opt = NULL;
1488 newnp->mcast_oif = inet6_iif(skb);
1489 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1490
1491
1492
1493
1494
1495
1496
1497 if (opt) {
1498 newnp->opt = ipv6_dup_options(newsk, opt);
1499 if (opt != np->opt)
1500 sock_kfree_s(sk, opt, opt->tot_len);
1501 }
1502
1503 inet_csk(newsk)->icsk_ext_hdr_len = 0;
1504 if (newnp->opt)
1505 inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
1506 newnp->opt->opt_flen);
1507
1508 tcp_mtup_init(newsk);
1509 tcp_sync_mss(newsk, dst_mtu(dst));
1510 newtp->advmss = dst_metric_advmss(dst);
1511 tcp_initialize_rcv_mss(newsk);
1512
1513 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
1514 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
1515
1516#ifdef CONFIG_TCP_MD5SIG
1517
1518 if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) {
1519
1520
1521
1522
1523
1524 char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
1525 if (newkey != NULL)
1526 tcp_v6_md5_do_add(newsk, &newnp->daddr,
1527 newkey, key->keylen);
1528 }
1529#endif
1530
1531 if (__inet_inherit_port(sk, newsk) < 0) {
1532 sock_put(newsk);
1533 goto out;
1534 }
1535 __inet6_hash(newsk, NULL);
1536
1537 return newsk;
1538
1539out_overflow:
1540 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
1541out_nonewsk:
1542 if (opt && opt != np->opt)
1543 sock_kfree_s(sk, opt, opt->tot_len);
1544 dst_release(dst);
1545out:
1546 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1547 return NULL;
1548}
1549
1550static __sum16 tcp_v6_checksum_init(struct sk_buff *skb)
1551{
1552 if (skb->ip_summed == CHECKSUM_COMPLETE) {
1553 if (!tcp_v6_check(skb->len, &ipv6_hdr(skb)->saddr,
1554 &ipv6_hdr(skb)->daddr, skb->csum)) {
1555 skb->ip_summed = CHECKSUM_UNNECESSARY;
1556 return 0;
1557 }
1558 }
1559
1560 skb->csum = ~csum_unfold(tcp_v6_check(skb->len,
1561 &ipv6_hdr(skb)->saddr,
1562 &ipv6_hdr(skb)->daddr, 0));
1563
1564 if (skb->len <= 76) {
1565 return __skb_checksum_complete(skb);
1566 }
1567 return 0;
1568}
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1579{
1580 struct ipv6_pinfo *np = inet6_sk(sk);
1581 struct tcp_sock *tp;
1582 struct sk_buff *opt_skb = NULL;
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592 if (skb->protocol == htons(ETH_P_IP))
1593 return tcp_v4_do_rcv(sk, skb);
1594
1595#ifdef CONFIG_TCP_MD5SIG
1596 if (tcp_v6_inbound_md5_hash (sk, skb))
1597 goto discard;
1598#endif
1599
1600 if (sk_filter(sk, skb))
1601 goto discard;
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621 if (np->rxopt.all)
1622 opt_skb = skb_clone(skb, GFP_ATOMIC);
1623
1624 if (sk->sk_state == TCP_ESTABLISHED) {
1625 sock_rps_save_rxhash(sk, skb->rxhash);
1626 if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len))
1627 goto reset;
1628 if (opt_skb)
1629 goto ipv6_pktoptions;
1630 return 0;
1631 }
1632
1633 if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb))
1634 goto csum_err;
1635
1636 if (sk->sk_state == TCP_LISTEN) {
1637 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1638 if (!nsk)
1639 goto discard;
1640
1641
1642
1643
1644
1645
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;
1652 }
1653 } else
1654 sock_rps_save_rxhash(sk, skb->rxhash);
1655
1656 if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len))
1657 goto reset;
1658 if (opt_skb)
1659 goto ipv6_pktoptions;
1660 return 0;
1661
1662reset:
1663 tcp_v6_send_reset(sk, skb);
1664discard:
1665 if (opt_skb)
1666 __kfree_skb(opt_skb);
1667 kfree_skb(skb);
1668 return 0;
1669csum_err:
1670 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
1671 goto discard;
1672
1673
1674ipv6_pktoptions:
1675
1676
1677
1678
1679
1680
1681
1682 tp = tcp_sk(sk);
1683 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1684 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1685 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
1686 np->mcast_oif = inet6_iif(opt_skb);
1687 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
1688 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
1689 if (ipv6_opt_accepted(sk, opt_skb)) {
1690 skb_set_owner_r(opt_skb, sk);
1691 opt_skb = xchg(&np->pktoptions, opt_skb);
1692 } else {
1693 __kfree_skb(opt_skb);
1694 opt_skb = xchg(&np->pktoptions, NULL);
1695 }
1696 }
1697
1698 kfree_skb(opt_skb);
1699 return 0;
1700}
1701
1702static int tcp_v6_rcv(struct sk_buff *skb)
1703{
1704 struct tcphdr *th;
1705 struct ipv6hdr *hdr;
1706 struct sock *sk;
1707 int ret;
1708 struct net *net = dev_net(skb->dev);
1709
1710 if (skb->pkt_type != PACKET_HOST)
1711 goto discard_it;
1712
1713
1714
1715
1716 TCP_INC_STATS_BH(net, TCP_MIB_INSEGS);
1717
1718 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1719 goto discard_it;
1720
1721 th = tcp_hdr(skb);
1722
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;
1727
1728 if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb))
1729 goto bad_packet;
1730
1731 th = tcp_hdr(skb);
1732 hdr = ipv6_hdr(skb);
1733 TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1734 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1735 skb->len - th->doff*4);
1736 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1737 TCP_SKB_CB(skb)->when = 0;
1738 TCP_SKB_CB(skb)->flags = ipv6_get_dsfield(hdr);
1739 TCP_SKB_CB(skb)->sacked = 0;
1740
1741 sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
1742 if (!sk)
1743 goto no_tcp_socket;
1744
1745process:
1746 if (sk->sk_state == TCP_TIME_WAIT)
1747 goto do_time_wait;
1748
1749 if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) {
1750 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
1751 goto discard_and_relse;
1752 }
1753
1754 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1755 goto discard_and_relse;
1756
1757 if (sk_filter(sk, skb))
1758 goto discard_and_relse;
1759
1760 skb->dev = NULL;
1761
1762 bh_lock_sock_nested(sk);
1763 ret = 0;
1764 if (!sock_owned_by_user(sk)) {
1765#ifdef CONFIG_NET_DMA
1766 struct tcp_sock *tp = tcp_sk(sk);
1767 if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
1768 tp->ucopy.dma_chan = dma_find_channel(DMA_MEMCPY);
1769 if (tp->ucopy.dma_chan)
1770 ret = tcp_v6_do_rcv(sk, skb);
1771 else
1772#endif
1773 {
1774 if (!tcp_prequeue(sk, skb))
1775 ret = tcp_v6_do_rcv(sk, skb);
1776 }
1777 } else if (unlikely(sk_add_backlog(sk, skb))) {
1778 bh_unlock_sock(sk);
1779 NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP);
1780 goto discard_and_relse;
1781 }
1782 bh_unlock_sock(sk);
1783
1784 sock_put(sk);
1785 return ret ? -1 : 0;
1786
1787no_tcp_socket:
1788 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1789 goto discard_it;
1790
1791 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1792bad_packet:
1793 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
1794 } else {
1795 tcp_v6_send_reset(NULL, skb);
1796 }
1797
1798discard_it:
1799
1800
1801
1802
1803
1804 kfree_skb(skb);
1805 return 0;
1806
1807discard_and_relse:
1808 sock_put(sk);
1809 goto discard_it;
1810
1811do_time_wait:
1812 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
1813 inet_twsk_put(inet_twsk(sk));
1814 goto discard_it;
1815 }
1816
1817 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1818 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
1819 inet_twsk_put(inet_twsk(sk));
1820 goto discard_it;
1821 }
1822
1823 switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1824 case TCP_TW_SYN:
1825 {
1826 struct sock *sk2;
1827
1828 sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
1829 &ipv6_hdr(skb)->daddr,
1830 ntohs(th->dest), inet6_iif(skb));
1831 if (sk2 != NULL) {
1832 struct inet_timewait_sock *tw = inet_twsk(sk);
1833 inet_twsk_deschedule(tw, &tcp_death_row);
1834 inet_twsk_put(tw);
1835 sk = sk2;
1836 goto process;
1837 }
1838
1839 }
1840 case TCP_TW_ACK:
1841 tcp_v6_timewait_ack(sk, skb);
1842 break;
1843 case TCP_TW_RST:
1844 goto no_tcp_socket;
1845 case TCP_TW_SUCCESS:;
1846 }
1847 goto discard_it;
1848}
1849
1850static struct inet_peer *tcp_v6_get_peer(struct sock *sk, bool *release_it)
1851{
1852 struct rt6_info *rt = (struct rt6_info *) __sk_dst_get(sk);
1853 struct ipv6_pinfo *np = inet6_sk(sk);
1854 struct inet_peer *peer;
1855
1856 if (!rt ||
1857 !ipv6_addr_equal(&np->daddr, &rt->rt6i_dst.addr)) {
1858 peer = inet_getpeer_v6(&np->daddr, 1);
1859 *release_it = true;
1860 } else {
1861 if (!rt->rt6i_peer)
1862 rt6_bind_peer(rt, 1);
1863 peer = rt->rt6i_peer;
1864 *release_it = false;
1865 }
1866
1867 return peer;
1868}
1869
1870static void *tcp_v6_tw_get_peer(struct sock *sk)
1871{
1872 struct inet6_timewait_sock *tw6 = inet6_twsk(sk);
1873 struct inet_timewait_sock *tw = inet_twsk(sk);
1874
1875 if (tw->tw_family == AF_INET)
1876 return tcp_v4_tw_get_peer(sk);
1877
1878 return inet_getpeer_v6(&tw6->tw_v6_daddr, 1);
1879}
1880
1881static struct timewait_sock_ops tcp6_timewait_sock_ops = {
1882 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
1883 .twsk_unique = tcp_twsk_unique,
1884 .twsk_destructor= tcp_twsk_destructor,
1885 .twsk_getpeer = tcp_v6_tw_get_peer,
1886};
1887
1888static 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 .conn_request = tcp_v6_conn_request,
1893 .syn_recv_sock = tcp_v6_syn_recv_sock,
1894 .get_peer = tcp_v6_get_peer,
1895 .net_header_len = sizeof(struct ipv6hdr),
1896 .setsockopt = ipv6_setsockopt,
1897 .getsockopt = ipv6_getsockopt,
1898 .addr2sockaddr = inet6_csk_addr2sockaddr,
1899 .sockaddr_len = sizeof(struct sockaddr_in6),
1900 .bind_conflict = inet6_csk_bind_conflict,
1901#ifdef CONFIG_COMPAT
1902 .compat_setsockopt = compat_ipv6_setsockopt,
1903 .compat_getsockopt = compat_ipv6_getsockopt,
1904#endif
1905};
1906
1907#ifdef CONFIG_TCP_MD5SIG
1908static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
1909 .md5_lookup = tcp_v6_md5_lookup,
1910 .calc_md5_hash = tcp_v6_md5_hash_skb,
1911 .md5_add = tcp_v6_md5_add_func,
1912 .md5_parse = tcp_v6_parse_md5_keys,
1913};
1914#endif
1915
1916
1917
1918
1919
1920static const struct inet_connection_sock_af_ops ipv6_mapped = {
1921 .queue_xmit = ip_queue_xmit,
1922 .send_check = tcp_v4_send_check,
1923 .rebuild_header = inet_sk_rebuild_header,
1924 .conn_request = tcp_v6_conn_request,
1925 .syn_recv_sock = tcp_v6_syn_recv_sock,
1926 .get_peer = tcp_v4_get_peer,
1927 .net_header_len = sizeof(struct iphdr),
1928 .setsockopt = ipv6_setsockopt,
1929 .getsockopt = ipv6_getsockopt,
1930 .addr2sockaddr = inet6_csk_addr2sockaddr,
1931 .sockaddr_len = sizeof(struct sockaddr_in6),
1932 .bind_conflict = inet6_csk_bind_conflict,
1933#ifdef CONFIG_COMPAT
1934 .compat_setsockopt = compat_ipv6_setsockopt,
1935 .compat_getsockopt = compat_ipv6_getsockopt,
1936#endif
1937};
1938
1939#ifdef CONFIG_TCP_MD5SIG
1940static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
1941 .md5_lookup = tcp_v4_md5_lookup,
1942 .calc_md5_hash = tcp_v4_md5_hash_skb,
1943 .md5_add = tcp_v6_md5_add_func,
1944 .md5_parse = tcp_v6_parse_md5_keys,
1945};
1946#endif
1947
1948
1949
1950
1951static int tcp_v6_init_sock(struct sock *sk)
1952{
1953 struct inet_connection_sock *icsk = inet_csk(sk);
1954 struct tcp_sock *tp = tcp_sk(sk);
1955
1956 skb_queue_head_init(&tp->out_of_order_queue);
1957 tcp_init_xmit_timers(sk);
1958 tcp_prequeue_init(tp);
1959
1960 icsk->icsk_rto = TCP_TIMEOUT_INIT;
1961 tp->mdev = TCP_TIMEOUT_INIT;
1962
1963
1964
1965
1966
1967
1968 tp->snd_cwnd = 2;
1969
1970
1971
1972
1973 tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
1974 tp->snd_cwnd_clamp = ~0;
1975 tp->mss_cache = TCP_MSS_DEFAULT;
1976
1977 tp->reordering = sysctl_tcp_reordering;
1978
1979 sk->sk_state = TCP_CLOSE;
1980
1981 icsk->icsk_af_ops = &ipv6_specific;
1982 icsk->icsk_ca_ops = &tcp_init_congestion_ops;
1983 icsk->icsk_sync_mss = tcp_sync_mss;
1984 sk->sk_write_space = sk_stream_write_space;
1985 sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
1986
1987#ifdef CONFIG_TCP_MD5SIG
1988 tp->af_specific = &tcp_sock_ipv6_specific;
1989#endif
1990
1991
1992 if (sysctl_tcp_cookie_size > 0) {
1993
1994 tp->cookie_values =
1995 kzalloc(sizeof(*tp->cookie_values),
1996 sk->sk_allocation);
1997 if (tp->cookie_values != NULL)
1998 kref_init(&tp->cookie_values->kref);
1999 }
2000
2001
2002
2003
2004 sk->sk_sndbuf = sysctl_tcp_wmem[1];
2005 sk->sk_rcvbuf = sysctl_tcp_rmem[1];
2006
2007 local_bh_disable();
2008 percpu_counter_inc(&tcp_sockets_allocated);
2009 local_bh_enable();
2010
2011 return 0;
2012}
2013
2014static void tcp_v6_destroy_sock(struct sock *sk)
2015{
2016#ifdef CONFIG_TCP_MD5SIG
2017
2018 if (tcp_sk(sk)->md5sig_info)
2019 tcp_v6_clear_md5_list(sk);
2020#endif
2021 tcp_v4_destroy_sock(sk);
2022 inet6_destroy_sock(sk);
2023}
2024
2025#ifdef CONFIG_PROC_FS
2026
2027static void get_openreq6(struct seq_file *seq,
2028 struct sock *sk, struct request_sock *req, int i, int uid)
2029{
2030 int ttd = req->expires - jiffies;
2031 struct in6_addr *src = &inet6_rsk(req)->loc_addr;
2032 struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
2033
2034 if (ttd < 0)
2035 ttd = 0;
2036
2037 seq_printf(seq,
2038 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2039 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2040 i,
2041 src->s6_addr32[0], src->s6_addr32[1],
2042 src->s6_addr32[2], src->s6_addr32[3],
2043 ntohs(inet_rsk(req)->loc_port),
2044 dest->s6_addr32[0], dest->s6_addr32[1],
2045 dest->s6_addr32[2], dest->s6_addr32[3],
2046 ntohs(inet_rsk(req)->rmt_port),
2047 TCP_SYN_RECV,
2048 0,0,
2049 1,
2050 jiffies_to_clock_t(ttd),
2051 req->retrans,
2052 uid,
2053 0,
2054 0,
2055 0, req);
2056}
2057
2058static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
2059{
2060 struct in6_addr *dest, *src;
2061 __u16 destp, srcp;
2062 int timer_active;
2063 unsigned long timer_expires;
2064 struct inet_sock *inet = inet_sk(sp);
2065 struct tcp_sock *tp = tcp_sk(sp);
2066 const struct inet_connection_sock *icsk = inet_csk(sp);
2067 struct ipv6_pinfo *np = inet6_sk(sp);
2068
2069 dest = &np->daddr;
2070 src = &np->rcv_saddr;
2071 destp = ntohs(inet->inet_dport);
2072 srcp = ntohs(inet->inet_sport);
2073
2074 if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
2075 timer_active = 1;
2076 timer_expires = icsk->icsk_timeout;
2077 } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
2078 timer_active = 4;
2079 timer_expires = icsk->icsk_timeout;
2080 } else if (timer_pending(&sp->sk_timer)) {
2081 timer_active = 2;
2082 timer_expires = sp->sk_timer.expires;
2083 } else {
2084 timer_active = 0;
2085 timer_expires = jiffies;
2086 }
2087
2088 seq_printf(seq,
2089 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2090 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %lu %lu %u %u %d\n",
2091 i,
2092 src->s6_addr32[0], src->s6_addr32[1],
2093 src->s6_addr32[2], src->s6_addr32[3], srcp,
2094 dest->s6_addr32[0], dest->s6_addr32[1],
2095 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2096 sp->sk_state,
2097 tp->write_seq-tp->snd_una,
2098 (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
2099 timer_active,
2100 jiffies_to_clock_t(timer_expires - jiffies),
2101 icsk->icsk_retransmits,
2102 sock_i_uid(sp),
2103 icsk->icsk_probes_out,
2104 sock_i_ino(sp),
2105 atomic_read(&sp->sk_refcnt), sp,
2106 jiffies_to_clock_t(icsk->icsk_rto),
2107 jiffies_to_clock_t(icsk->icsk_ack.ato),
2108 (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong,
2109 tp->snd_cwnd,
2110 tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh
2111 );
2112}
2113
2114static void get_timewait6_sock(struct seq_file *seq,
2115 struct inet_timewait_sock *tw, int i)
2116{
2117 struct in6_addr *dest, *src;
2118 __u16 destp, srcp;
2119 struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
2120 int ttd = tw->tw_ttd - jiffies;
2121
2122 if (ttd < 0)
2123 ttd = 0;
2124
2125 dest = &tw6->tw_v6_daddr;
2126 src = &tw6->tw_v6_rcv_saddr;
2127 destp = ntohs(tw->tw_dport);
2128 srcp = ntohs(tw->tw_sport);
2129
2130 seq_printf(seq,
2131 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2132 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2133 i,
2134 src->s6_addr32[0], src->s6_addr32[1],
2135 src->s6_addr32[2], src->s6_addr32[3], srcp,
2136 dest->s6_addr32[0], dest->s6_addr32[1],
2137 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2138 tw->tw_substate, 0, 0,
2139 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2140 atomic_read(&tw->tw_refcnt), tw);
2141}
2142
2143static int tcp6_seq_show(struct seq_file *seq, void *v)
2144{
2145 struct tcp_iter_state *st;
2146
2147 if (v == SEQ_START_TOKEN) {
2148 seq_puts(seq,
2149 " sl "
2150 "local_address "
2151 "remote_address "
2152 "st tx_queue rx_queue tr tm->when retrnsmt"
2153 " uid timeout inode\n");
2154 goto out;
2155 }
2156 st = seq->private;
2157
2158 switch (st->state) {
2159 case TCP_SEQ_STATE_LISTENING:
2160 case TCP_SEQ_STATE_ESTABLISHED:
2161 get_tcp6_sock(seq, v, st->num);
2162 break;
2163 case TCP_SEQ_STATE_OPENREQ:
2164 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
2165 break;
2166 case TCP_SEQ_STATE_TIME_WAIT:
2167 get_timewait6_sock(seq, v, st->num);
2168 break;
2169 }
2170out:
2171 return 0;
2172}
2173
2174static struct tcp_seq_afinfo tcp6_seq_afinfo = {
2175 .name = "tcp6",
2176 .family = AF_INET6,
2177 .seq_fops = {
2178 .owner = THIS_MODULE,
2179 },
2180 .seq_ops = {
2181 .show = tcp6_seq_show,
2182 },
2183};
2184
2185int __net_init tcp6_proc_init(struct net *net)
2186{
2187 return tcp_proc_register(net, &tcp6_seq_afinfo);
2188}
2189
2190void tcp6_proc_exit(struct net *net)
2191{
2192 tcp_proc_unregister(net, &tcp6_seq_afinfo);
2193}
2194#endif
2195
2196struct proto tcpv6_prot = {
2197 .name = "TCPv6",
2198 .owner = THIS_MODULE,
2199 .close = tcp_close,
2200 .connect = tcp_v6_connect,
2201 .disconnect = tcp_disconnect,
2202 .accept = inet_csk_accept,
2203 .ioctl = tcp_ioctl,
2204 .init = tcp_v6_init_sock,
2205 .destroy = tcp_v6_destroy_sock,
2206 .shutdown = tcp_shutdown,
2207 .setsockopt = tcp_setsockopt,
2208 .getsockopt = tcp_getsockopt,
2209 .recvmsg = tcp_recvmsg,
2210 .sendmsg = tcp_sendmsg,
2211 .sendpage = tcp_sendpage,
2212 .backlog_rcv = tcp_v6_do_rcv,
2213 .hash = tcp_v6_hash,
2214 .unhash = inet_unhash,
2215 .get_port = inet_csk_get_port,
2216 .enter_memory_pressure = tcp_enter_memory_pressure,
2217 .sockets_allocated = &tcp_sockets_allocated,
2218 .memory_allocated = &tcp_memory_allocated,
2219 .memory_pressure = &tcp_memory_pressure,
2220 .orphan_count = &tcp_orphan_count,
2221 .sysctl_mem = sysctl_tcp_mem,
2222 .sysctl_wmem = sysctl_tcp_wmem,
2223 .sysctl_rmem = sysctl_tcp_rmem,
2224 .max_header = MAX_TCP_HEADER,
2225 .obj_size = sizeof(struct tcp6_sock),
2226 .slab_flags = SLAB_DESTROY_BY_RCU,
2227 .twsk_prot = &tcp6_timewait_sock_ops,
2228 .rsk_prot = &tcp6_request_sock_ops,
2229 .h.hashinfo = &tcp_hashinfo,
2230 .no_autobind = true,
2231#ifdef CONFIG_COMPAT
2232 .compat_setsockopt = compat_tcp_setsockopt,
2233 .compat_getsockopt = compat_tcp_getsockopt,
2234#endif
2235};
2236
2237static const struct inet6_protocol tcpv6_protocol = {
2238 .handler = tcp_v6_rcv,
2239 .err_handler = tcp_v6_err,
2240 .gso_send_check = tcp_v6_gso_send_check,
2241 .gso_segment = tcp_tso_segment,
2242 .gro_receive = tcp6_gro_receive,
2243 .gro_complete = tcp6_gro_complete,
2244 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2245};
2246
2247static struct inet_protosw tcpv6_protosw = {
2248 .type = SOCK_STREAM,
2249 .protocol = IPPROTO_TCP,
2250 .prot = &tcpv6_prot,
2251 .ops = &inet6_stream_ops,
2252 .no_check = 0,
2253 .flags = INET_PROTOSW_PERMANENT |
2254 INET_PROTOSW_ICSK,
2255};
2256
2257static int __net_init tcpv6_net_init(struct net *net)
2258{
2259 return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
2260 SOCK_RAW, IPPROTO_TCP, net);
2261}
2262
2263static void __net_exit tcpv6_net_exit(struct net *net)
2264{
2265 inet_ctl_sock_destroy(net->ipv6.tcp_sk);
2266}
2267
2268static void __net_exit tcpv6_net_exit_batch(struct list_head *net_exit_list)
2269{
2270 inet_twsk_purge(&tcp_hashinfo, &tcp_death_row, AF_INET6);
2271}
2272
2273static struct pernet_operations tcpv6_net_ops = {
2274 .init = tcpv6_net_init,
2275 .exit = tcpv6_net_exit,
2276 .exit_batch = tcpv6_net_exit_batch,
2277};
2278
2279int __init tcpv6_init(void)
2280{
2281 int ret;
2282
2283 ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2284 if (ret)
2285 goto out;
2286
2287
2288 ret = inet6_register_protosw(&tcpv6_protosw);
2289 if (ret)
2290 goto out_tcpv6_protocol;
2291
2292 ret = register_pernet_subsys(&tcpv6_net_ops);
2293 if (ret)
2294 goto out_tcpv6_protosw;
2295out:
2296 return ret;
2297
2298out_tcpv6_protocol:
2299 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2300out_tcpv6_protosw:
2301 inet6_unregister_protosw(&tcpv6_protosw);
2302 goto out;
2303}
2304
2305void tcpv6_exit(void)
2306{
2307 unregister_pernet_subsys(&tcpv6_net_ops);
2308 inet6_unregister_protosw(&tcpv6_protosw);
2309 inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2310}
2311