]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - net/ipv6/tcp_ipv6.c
[PATCH] acpi build fix: x86 setup.c
[mirror_ubuntu-bionic-kernel.git] / net / ipv6 / tcp_ipv6.c
1 /*
2 * TCP over IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * $Id: tcp_ipv6.c,v 1.144 2002/02/01 22:01:04 davem Exp $
9 *
10 * Based on:
11 * linux/net/ipv4/tcp.c
12 * linux/net/ipv4/tcp_input.c
13 * linux/net/ipv4/tcp_output.c
14 *
15 * Fixes:
16 * Hideaki YOSHIFUJI : sin6_scope_id support
17 * YOSHIFUJI Hideaki @USAGI and: Support IPV6_V6ONLY socket option, which
18 * Alexey Kuznetsov allow both IPv4 and IPv6 sockets to bind
19 * a single port at the same time.
20 * YOSHIFUJI Hideaki @USAGI: convert /proc/net/tcp6 to seq_file.
21 *
22 * This program is free software; you can redistribute it and/or
23 * modify it under the terms of the GNU General Public License
24 * as published by the Free Software Foundation; either version
25 * 2 of the License, or (at your option) any later version.
26 */
27
28 #include <linux/module.h>
29 #include <linux/config.h>
30 #include <linux/errno.h>
31 #include <linux/types.h>
32 #include <linux/socket.h>
33 #include <linux/sockios.h>
34 #include <linux/net.h>
35 #include <linux/jiffies.h>
36 #include <linux/in.h>
37 #include <linux/in6.h>
38 #include <linux/netdevice.h>
39 #include <linux/init.h>
40 #include <linux/jhash.h>
41 #include <linux/ipsec.h>
42 #include <linux/times.h>
43
44 #include <linux/ipv6.h>
45 #include <linux/icmpv6.h>
46 #include <linux/random.h>
47
48 #include <net/tcp.h>
49 #include <net/ndisc.h>
50 #include <net/ipv6.h>
51 #include <net/transp_v6.h>
52 #include <net/addrconf.h>
53 #include <net/ip6_route.h>
54 #include <net/ip6_checksum.h>
55 #include <net/inet_ecn.h>
56 #include <net/protocol.h>
57 #include <net/xfrm.h>
58 #include <net/addrconf.h>
59 #include <net/snmp.h>
60 #include <net/dsfield.h>
61
62 #include <asm/uaccess.h>
63
64 #include <linux/proc_fs.h>
65 #include <linux/seq_file.h>
66
67 static void tcp_v6_send_reset(struct sk_buff *skb);
68 static void tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req);
69 static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len,
70 struct sk_buff *skb);
71
72 static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
73 static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok);
74
75 static struct tcp_func ipv6_mapped;
76 static struct tcp_func ipv6_specific;
77
78 /* I have no idea if this is a good hash for v6 or not. -DaveM */
79 static __inline__ int tcp_v6_hashfn(struct in6_addr *laddr, u16 lport,
80 struct in6_addr *faddr, u16 fport)
81 {
82 int hashent = (lport ^ fport);
83
84 hashent ^= (laddr->s6_addr32[3] ^ faddr->s6_addr32[3]);
85 hashent ^= hashent>>16;
86 hashent ^= hashent>>8;
87 return (hashent & (tcp_ehash_size - 1));
88 }
89
90 static __inline__ int tcp_v6_sk_hashfn(struct sock *sk)
91 {
92 struct inet_sock *inet = inet_sk(sk);
93 struct ipv6_pinfo *np = inet6_sk(sk);
94 struct in6_addr *laddr = &np->rcv_saddr;
95 struct in6_addr *faddr = &np->daddr;
96 __u16 lport = inet->num;
97 __u16 fport = inet->dport;
98 return tcp_v6_hashfn(laddr, lport, faddr, fport);
99 }
100
101 static inline int tcp_v6_bind_conflict(struct sock *sk,
102 struct tcp_bind_bucket *tb)
103 {
104 struct sock *sk2;
105 struct hlist_node *node;
106
107 /* We must walk the whole port owner list in this case. -DaveM */
108 sk_for_each_bound(sk2, node, &tb->owners) {
109 if (sk != sk2 &&
110 (!sk->sk_bound_dev_if ||
111 !sk2->sk_bound_dev_if ||
112 sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
113 (!sk->sk_reuse || !sk2->sk_reuse ||
114 sk2->sk_state == TCP_LISTEN) &&
115 ipv6_rcv_saddr_equal(sk, sk2))
116 break;
117 }
118
119 return node != NULL;
120 }
121
122 /* Grrr, addr_type already calculated by caller, but I don't want
123 * to add some silly "cookie" argument to this method just for that.
124 * But it doesn't matter, the recalculation is in the rarest path
125 * this function ever takes.
126 */
127 static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
128 {
129 struct tcp_bind_hashbucket *head;
130 struct tcp_bind_bucket *tb;
131 struct hlist_node *node;
132 int ret;
133
134 local_bh_disable();
135 if (snum == 0) {
136 int low = sysctl_local_port_range[0];
137 int high = sysctl_local_port_range[1];
138 int remaining = (high - low) + 1;
139 int rover;
140
141 spin_lock(&tcp_portalloc_lock);
142 if (tcp_port_rover < low)
143 rover = low;
144 else
145 rover = tcp_port_rover;
146 do { rover++;
147 if (rover > high)
148 rover = low;
149 head = &tcp_bhash[tcp_bhashfn(rover)];
150 spin_lock(&head->lock);
151 tb_for_each(tb, node, &head->chain)
152 if (tb->port == rover)
153 goto next;
154 break;
155 next:
156 spin_unlock(&head->lock);
157 } while (--remaining > 0);
158 tcp_port_rover = rover;
159 spin_unlock(&tcp_portalloc_lock);
160
161 /* Exhausted local port range during search? */
162 ret = 1;
163 if (remaining <= 0)
164 goto fail;
165
166 /* OK, here is the one we will use. */
167 snum = rover;
168 } else {
169 head = &tcp_bhash[tcp_bhashfn(snum)];
170 spin_lock(&head->lock);
171 tb_for_each(tb, node, &head->chain)
172 if (tb->port == snum)
173 goto tb_found;
174 }
175 tb = NULL;
176 goto tb_not_found;
177 tb_found:
178 if (tb && !hlist_empty(&tb->owners)) {
179 if (tb->fastreuse > 0 && sk->sk_reuse &&
180 sk->sk_state != TCP_LISTEN) {
181 goto success;
182 } else {
183 ret = 1;
184 if (tcp_v6_bind_conflict(sk, tb))
185 goto fail_unlock;
186 }
187 }
188 tb_not_found:
189 ret = 1;
190 if (!tb && (tb = tcp_bucket_create(head, snum)) == NULL)
191 goto fail_unlock;
192 if (hlist_empty(&tb->owners)) {
193 if (sk->sk_reuse && sk->sk_state != TCP_LISTEN)
194 tb->fastreuse = 1;
195 else
196 tb->fastreuse = 0;
197 } else if (tb->fastreuse &&
198 (!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
199 tb->fastreuse = 0;
200
201 success:
202 if (!tcp_sk(sk)->bind_hash)
203 tcp_bind_hash(sk, tb, snum);
204 BUG_TRAP(tcp_sk(sk)->bind_hash == tb);
205 ret = 0;
206
207 fail_unlock:
208 spin_unlock(&head->lock);
209 fail:
210 local_bh_enable();
211 return ret;
212 }
213
214 static __inline__ void __tcp_v6_hash(struct sock *sk)
215 {
216 struct hlist_head *list;
217 rwlock_t *lock;
218
219 BUG_TRAP(sk_unhashed(sk));
220
221 if (sk->sk_state == TCP_LISTEN) {
222 list = &tcp_listening_hash[tcp_sk_listen_hashfn(sk)];
223 lock = &tcp_lhash_lock;
224 tcp_listen_wlock();
225 } else {
226 sk->sk_hashent = tcp_v6_sk_hashfn(sk);
227 list = &tcp_ehash[sk->sk_hashent].chain;
228 lock = &tcp_ehash[sk->sk_hashent].lock;
229 write_lock(lock);
230 }
231
232 __sk_add_node(sk, list);
233 sock_prot_inc_use(sk->sk_prot);
234 write_unlock(lock);
235 }
236
237
238 static void tcp_v6_hash(struct sock *sk)
239 {
240 if (sk->sk_state != TCP_CLOSE) {
241 struct tcp_sock *tp = tcp_sk(sk);
242
243 if (tp->af_specific == &ipv6_mapped) {
244 tcp_prot.hash(sk);
245 return;
246 }
247 local_bh_disable();
248 __tcp_v6_hash(sk);
249 local_bh_enable();
250 }
251 }
252
253 static struct sock *tcp_v6_lookup_listener(struct in6_addr *daddr, unsigned short hnum, int dif)
254 {
255 struct sock *sk;
256 struct hlist_node *node;
257 struct sock *result = NULL;
258 int score, hiscore;
259
260 hiscore=0;
261 read_lock(&tcp_lhash_lock);
262 sk_for_each(sk, node, &tcp_listening_hash[tcp_lhashfn(hnum)]) {
263 if (inet_sk(sk)->num == hnum && sk->sk_family == PF_INET6) {
264 struct ipv6_pinfo *np = inet6_sk(sk);
265
266 score = 1;
267 if (!ipv6_addr_any(&np->rcv_saddr)) {
268 if (!ipv6_addr_equal(&np->rcv_saddr, daddr))
269 continue;
270 score++;
271 }
272 if (sk->sk_bound_dev_if) {
273 if (sk->sk_bound_dev_if != dif)
274 continue;
275 score++;
276 }
277 if (score == 3) {
278 result = sk;
279 break;
280 }
281 if (score > hiscore) {
282 hiscore = score;
283 result = sk;
284 }
285 }
286 }
287 if (result)
288 sock_hold(result);
289 read_unlock(&tcp_lhash_lock);
290 return result;
291 }
292
293 /* Sockets in TCP_CLOSE state are _always_ taken out of the hash, so
294 * we need not check it for TCP lookups anymore, thanks Alexey. -DaveM
295 *
296 * The sockhash lock must be held as a reader here.
297 */
298
299 static inline struct sock *__tcp_v6_lookup_established(struct in6_addr *saddr, u16 sport,
300 struct in6_addr *daddr, u16 hnum,
301 int dif)
302 {
303 struct tcp_ehash_bucket *head;
304 struct sock *sk;
305 struct hlist_node *node;
306 __u32 ports = TCP_COMBINED_PORTS(sport, hnum);
307 int hash;
308
309 /* Optimize here for direct hit, only listening connections can
310 * have wildcards anyways.
311 */
312 hash = tcp_v6_hashfn(daddr, hnum, saddr, sport);
313 head = &tcp_ehash[hash];
314 read_lock(&head->lock);
315 sk_for_each(sk, node, &head->chain) {
316 /* For IPV6 do the cheaper port and family tests first. */
317 if(TCP_IPV6_MATCH(sk, saddr, daddr, ports, dif))
318 goto hit; /* You sunk my battleship! */
319 }
320 /* Must check for a TIME_WAIT'er before going to listener hash. */
321 sk_for_each(sk, node, &(head + tcp_ehash_size)->chain) {
322 /* FIXME: acme: check this... */
323 struct tcp_tw_bucket *tw = (struct tcp_tw_bucket *)sk;
324
325 if(*((__u32 *)&(tw->tw_dport)) == ports &&
326 sk->sk_family == PF_INET6) {
327 if(ipv6_addr_equal(&tw->tw_v6_daddr, saddr) &&
328 ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) &&
329 (!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dif))
330 goto hit;
331 }
332 }
333 read_unlock(&head->lock);
334 return NULL;
335
336 hit:
337 sock_hold(sk);
338 read_unlock(&head->lock);
339 return sk;
340 }
341
342
343 static inline struct sock *__tcp_v6_lookup(struct in6_addr *saddr, u16 sport,
344 struct in6_addr *daddr, u16 hnum,
345 int dif)
346 {
347 struct sock *sk;
348
349 sk = __tcp_v6_lookup_established(saddr, sport, daddr, hnum, dif);
350
351 if (sk)
352 return sk;
353
354 return tcp_v6_lookup_listener(daddr, hnum, dif);
355 }
356
357 inline struct sock *tcp_v6_lookup(struct in6_addr *saddr, u16 sport,
358 struct in6_addr *daddr, u16 dport,
359 int dif)
360 {
361 struct sock *sk;
362
363 local_bh_disable();
364 sk = __tcp_v6_lookup(saddr, sport, daddr, ntohs(dport), dif);
365 local_bh_enable();
366
367 return sk;
368 }
369
370 EXPORT_SYMBOL_GPL(tcp_v6_lookup);
371
372
373 /*
374 * Open request hash tables.
375 */
376
377 static u32 tcp_v6_synq_hash(struct in6_addr *raddr, u16 rport, u32 rnd)
378 {
379 u32 a, b, c;
380
381 a = raddr->s6_addr32[0];
382 b = raddr->s6_addr32[1];
383 c = raddr->s6_addr32[2];
384
385 a += JHASH_GOLDEN_RATIO;
386 b += JHASH_GOLDEN_RATIO;
387 c += rnd;
388 __jhash_mix(a, b, c);
389
390 a += raddr->s6_addr32[3];
391 b += (u32) rport;
392 __jhash_mix(a, b, c);
393
394 return c & (TCP_SYNQ_HSIZE - 1);
395 }
396
397 static struct open_request *tcp_v6_search_req(struct tcp_sock *tp,
398 struct open_request ***prevp,
399 __u16 rport,
400 struct in6_addr *raddr,
401 struct in6_addr *laddr,
402 int iif)
403 {
404 struct tcp_listen_opt *lopt = tp->listen_opt;
405 struct open_request *req, **prev;
406
407 for (prev = &lopt->syn_table[tcp_v6_synq_hash(raddr, rport, lopt->hash_rnd)];
408 (req = *prev) != NULL;
409 prev = &req->dl_next) {
410 if (req->rmt_port == rport &&
411 req->class->family == AF_INET6 &&
412 ipv6_addr_equal(&req->af.v6_req.rmt_addr, raddr) &&
413 ipv6_addr_equal(&req->af.v6_req.loc_addr, laddr) &&
414 (!req->af.v6_req.iif || req->af.v6_req.iif == iif)) {
415 BUG_TRAP(req->sk == NULL);
416 *prevp = prev;
417 return req;
418 }
419 }
420
421 return NULL;
422 }
423
424 static __inline__ u16 tcp_v6_check(struct tcphdr *th, int len,
425 struct in6_addr *saddr,
426 struct in6_addr *daddr,
427 unsigned long base)
428 {
429 return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
430 }
431
432 static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb)
433 {
434 if (skb->protocol == htons(ETH_P_IPV6)) {
435 return secure_tcpv6_sequence_number(skb->nh.ipv6h->daddr.s6_addr32,
436 skb->nh.ipv6h->saddr.s6_addr32,
437 skb->h.th->dest,
438 skb->h.th->source);
439 } else {
440 return secure_tcp_sequence_number(skb->nh.iph->daddr,
441 skb->nh.iph->saddr,
442 skb->h.th->dest,
443 skb->h.th->source);
444 }
445 }
446
447 static int __tcp_v6_check_established(struct sock *sk, __u16 lport,
448 struct tcp_tw_bucket **twp)
449 {
450 struct inet_sock *inet = inet_sk(sk);
451 struct ipv6_pinfo *np = inet6_sk(sk);
452 struct in6_addr *daddr = &np->rcv_saddr;
453 struct in6_addr *saddr = &np->daddr;
454 int dif = sk->sk_bound_dev_if;
455 u32 ports = TCP_COMBINED_PORTS(inet->dport, lport);
456 int hash = tcp_v6_hashfn(daddr, inet->num, saddr, inet->dport);
457 struct tcp_ehash_bucket *head = &tcp_ehash[hash];
458 struct sock *sk2;
459 struct hlist_node *node;
460 struct tcp_tw_bucket *tw;
461
462 write_lock(&head->lock);
463
464 /* Check TIME-WAIT sockets first. */
465 sk_for_each(sk2, node, &(head + tcp_ehash_size)->chain) {
466 tw = (struct tcp_tw_bucket*)sk2;
467
468 if(*((__u32 *)&(tw->tw_dport)) == ports &&
469 sk2->sk_family == PF_INET6 &&
470 ipv6_addr_equal(&tw->tw_v6_daddr, saddr) &&
471 ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) &&
472 sk2->sk_bound_dev_if == sk->sk_bound_dev_if) {
473 struct tcp_sock *tp = tcp_sk(sk);
474
475 if (tw->tw_ts_recent_stamp &&
476 (!twp || (sysctl_tcp_tw_reuse &&
477 xtime.tv_sec -
478 tw->tw_ts_recent_stamp > 1))) {
479 /* See comment in tcp_ipv4.c */
480 tp->write_seq = tw->tw_snd_nxt + 65535 + 2;
481 if (!tp->write_seq)
482 tp->write_seq = 1;
483 tp->rx_opt.ts_recent = tw->tw_ts_recent;
484 tp->rx_opt.ts_recent_stamp = tw->tw_ts_recent_stamp;
485 sock_hold(sk2);
486 goto unique;
487 } else
488 goto not_unique;
489 }
490 }
491 tw = NULL;
492
493 /* And established part... */
494 sk_for_each(sk2, node, &head->chain) {
495 if(TCP_IPV6_MATCH(sk2, saddr, daddr, ports, dif))
496 goto not_unique;
497 }
498
499 unique:
500 BUG_TRAP(sk_unhashed(sk));
501 __sk_add_node(sk, &head->chain);
502 sk->sk_hashent = hash;
503 sock_prot_inc_use(sk->sk_prot);
504 write_unlock(&head->lock);
505
506 if (twp) {
507 *twp = tw;
508 NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
509 } else if (tw) {
510 /* Silly. Should hash-dance instead... */
511 tcp_tw_deschedule(tw);
512 NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
513
514 tcp_tw_put(tw);
515 }
516 return 0;
517
518 not_unique:
519 write_unlock(&head->lock);
520 return -EADDRNOTAVAIL;
521 }
522
523 static inline u32 tcpv6_port_offset(const struct sock *sk)
524 {
525 const struct inet_sock *inet = inet_sk(sk);
526 const struct ipv6_pinfo *np = inet6_sk(sk);
527
528 return secure_tcpv6_port_ephemeral(np->rcv_saddr.s6_addr32,
529 np->daddr.s6_addr32,
530 inet->dport);
531 }
532
533 static int tcp_v6_hash_connect(struct sock *sk)
534 {
535 unsigned short snum = inet_sk(sk)->num;
536 struct tcp_bind_hashbucket *head;
537 struct tcp_bind_bucket *tb;
538 int ret;
539
540 if (!snum) {
541 int low = sysctl_local_port_range[0];
542 int high = sysctl_local_port_range[1];
543 int range = high - low;
544 int i;
545 int port;
546 static u32 hint;
547 u32 offset = hint + tcpv6_port_offset(sk);
548 struct hlist_node *node;
549 struct tcp_tw_bucket *tw = NULL;
550
551 local_bh_disable();
552 for (i = 1; i <= range; i++) {
553 port = low + (i + offset) % range;
554 head = &tcp_bhash[tcp_bhashfn(port)];
555 spin_lock(&head->lock);
556
557 /* Does not bother with rcv_saddr checks,
558 * because the established check is already
559 * unique enough.
560 */
561 tb_for_each(tb, node, &head->chain) {
562 if (tb->port == port) {
563 BUG_TRAP(!hlist_empty(&tb->owners));
564 if (tb->fastreuse >= 0)
565 goto next_port;
566 if (!__tcp_v6_check_established(sk,
567 port,
568 &tw))
569 goto ok;
570 goto next_port;
571 }
572 }
573
574 tb = tcp_bucket_create(head, port);
575 if (!tb) {
576 spin_unlock(&head->lock);
577 break;
578 }
579 tb->fastreuse = -1;
580 goto ok;
581
582 next_port:
583 spin_unlock(&head->lock);
584 }
585 local_bh_enable();
586
587 return -EADDRNOTAVAIL;
588
589 ok:
590 hint += i;
591
592 /* Head lock still held and bh's disabled */
593 tcp_bind_hash(sk, tb, port);
594 if (sk_unhashed(sk)) {
595 inet_sk(sk)->sport = htons(port);
596 __tcp_v6_hash(sk);
597 }
598 spin_unlock(&head->lock);
599
600 if (tw) {
601 tcp_tw_deschedule(tw);
602 tcp_tw_put(tw);
603 }
604
605 ret = 0;
606 goto out;
607 }
608
609 head = &tcp_bhash[tcp_bhashfn(snum)];
610 tb = tcp_sk(sk)->bind_hash;
611 spin_lock_bh(&head->lock);
612
613 if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
614 __tcp_v6_hash(sk);
615 spin_unlock_bh(&head->lock);
616 return 0;
617 } else {
618 spin_unlock(&head->lock);
619 /* No definite answer... Walk to established hash table */
620 ret = __tcp_v6_check_established(sk, snum, NULL);
621 out:
622 local_bh_enable();
623 return ret;
624 }
625 }
626
627 static __inline__ int tcp_v6_iif(struct sk_buff *skb)
628 {
629 return IP6CB(skb)->iif;
630 }
631
632 static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
633 int addr_len)
634 {
635 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
636 struct inet_sock *inet = inet_sk(sk);
637 struct ipv6_pinfo *np = inet6_sk(sk);
638 struct tcp_sock *tp = tcp_sk(sk);
639 struct in6_addr *saddr = NULL, *final_p = NULL, final;
640 struct flowi fl;
641 struct dst_entry *dst;
642 int addr_type;
643 int err;
644
645 if (addr_len < SIN6_LEN_RFC2133)
646 return -EINVAL;
647
648 if (usin->sin6_family != AF_INET6)
649 return(-EAFNOSUPPORT);
650
651 memset(&fl, 0, sizeof(fl));
652
653 if (np->sndflow) {
654 fl.fl6_flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
655 IP6_ECN_flow_init(fl.fl6_flowlabel);
656 if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) {
657 struct ip6_flowlabel *flowlabel;
658 flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
659 if (flowlabel == NULL)
660 return -EINVAL;
661 ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
662 fl6_sock_release(flowlabel);
663 }
664 }
665
666 /*
667 * connect() to INADDR_ANY means loopback (BSD'ism).
668 */
669
670 if(ipv6_addr_any(&usin->sin6_addr))
671 usin->sin6_addr.s6_addr[15] = 0x1;
672
673 addr_type = ipv6_addr_type(&usin->sin6_addr);
674
675 if(addr_type & IPV6_ADDR_MULTICAST)
676 return -ENETUNREACH;
677
678 if (addr_type&IPV6_ADDR_LINKLOCAL) {
679 if (addr_len >= sizeof(struct sockaddr_in6) &&
680 usin->sin6_scope_id) {
681 /* If interface is set while binding, indices
682 * must coincide.
683 */
684 if (sk->sk_bound_dev_if &&
685 sk->sk_bound_dev_if != usin->sin6_scope_id)
686 return -EINVAL;
687
688 sk->sk_bound_dev_if = usin->sin6_scope_id;
689 }
690
691 /* Connect to link-local address requires an interface */
692 if (!sk->sk_bound_dev_if)
693 return -EINVAL;
694 }
695
696 if (tp->rx_opt.ts_recent_stamp &&
697 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
698 tp->rx_opt.ts_recent = 0;
699 tp->rx_opt.ts_recent_stamp = 0;
700 tp->write_seq = 0;
701 }
702
703 ipv6_addr_copy(&np->daddr, &usin->sin6_addr);
704 np->flow_label = fl.fl6_flowlabel;
705
706 /*
707 * TCP over IPv4
708 */
709
710 if (addr_type == IPV6_ADDR_MAPPED) {
711 u32 exthdrlen = tp->ext_header_len;
712 struct sockaddr_in sin;
713
714 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
715
716 if (__ipv6_only_sock(sk))
717 return -ENETUNREACH;
718
719 sin.sin_family = AF_INET;
720 sin.sin_port = usin->sin6_port;
721 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
722
723 tp->af_specific = &ipv6_mapped;
724 sk->sk_backlog_rcv = tcp_v4_do_rcv;
725
726 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
727
728 if (err) {
729 tp->ext_header_len = exthdrlen;
730 tp->af_specific = &ipv6_specific;
731 sk->sk_backlog_rcv = tcp_v6_do_rcv;
732 goto failure;
733 } else {
734 ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF),
735 inet->saddr);
736 ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF),
737 inet->rcv_saddr);
738 }
739
740 return err;
741 }
742
743 if (!ipv6_addr_any(&np->rcv_saddr))
744 saddr = &np->rcv_saddr;
745
746 fl.proto = IPPROTO_TCP;
747 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
748 ipv6_addr_copy(&fl.fl6_src,
749 (saddr ? saddr : &np->saddr));
750 fl.oif = sk->sk_bound_dev_if;
751 fl.fl_ip_dport = usin->sin6_port;
752 fl.fl_ip_sport = inet->sport;
753
754 if (np->opt && np->opt->srcrt) {
755 struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
756 ipv6_addr_copy(&final, &fl.fl6_dst);
757 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
758 final_p = &final;
759 }
760
761 err = ip6_dst_lookup(sk, &dst, &fl);
762 if (err)
763 goto failure;
764 if (final_p)
765 ipv6_addr_copy(&fl.fl6_dst, final_p);
766
767 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
768 dst_release(dst);
769 goto failure;
770 }
771
772 if (saddr == NULL) {
773 saddr = &fl.fl6_src;
774 ipv6_addr_copy(&np->rcv_saddr, saddr);
775 }
776
777 /* set the source address */
778 ipv6_addr_copy(&np->saddr, saddr);
779 inet->rcv_saddr = LOOPBACK4_IPV6;
780
781 ip6_dst_store(sk, dst, NULL);
782 sk->sk_route_caps = dst->dev->features &
783 ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
784
785 tp->ext_header_len = 0;
786 if (np->opt)
787 tp->ext_header_len = np->opt->opt_flen + np->opt->opt_nflen;
788
789 tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
790
791 inet->dport = usin->sin6_port;
792
793 tcp_set_state(sk, TCP_SYN_SENT);
794 err = tcp_v6_hash_connect(sk);
795 if (err)
796 goto late_failure;
797
798 if (!tp->write_seq)
799 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
800 np->daddr.s6_addr32,
801 inet->sport,
802 inet->dport);
803
804 err = tcp_connect(sk);
805 if (err)
806 goto late_failure;
807
808 return 0;
809
810 late_failure:
811 tcp_set_state(sk, TCP_CLOSE);
812 __sk_dst_reset(sk);
813 failure:
814 inet->dport = 0;
815 sk->sk_route_caps = 0;
816 return err;
817 }
818
819 static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
820 int type, int code, int offset, __u32 info)
821 {
822 struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
823 struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
824 struct ipv6_pinfo *np;
825 struct sock *sk;
826 int err;
827 struct tcp_sock *tp;
828 __u32 seq;
829
830 sk = tcp_v6_lookup(&hdr->daddr, th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
831
832 if (sk == NULL) {
833 ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
834 return;
835 }
836
837 if (sk->sk_state == TCP_TIME_WAIT) {
838 tcp_tw_put((struct tcp_tw_bucket*)sk);
839 return;
840 }
841
842 bh_lock_sock(sk);
843 if (sock_owned_by_user(sk))
844 NET_INC_STATS_BH(LINUX_MIB_LOCKDROPPEDICMPS);
845
846 if (sk->sk_state == TCP_CLOSE)
847 goto out;
848
849 tp = tcp_sk(sk);
850 seq = ntohl(th->seq);
851 if (sk->sk_state != TCP_LISTEN &&
852 !between(seq, tp->snd_una, tp->snd_nxt)) {
853 NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
854 goto out;
855 }
856
857 np = inet6_sk(sk);
858
859 if (type == ICMPV6_PKT_TOOBIG) {
860 struct dst_entry *dst = NULL;
861
862 if (sock_owned_by_user(sk))
863 goto out;
864 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
865 goto out;
866
867 /* icmp should have updated the destination cache entry */
868 dst = __sk_dst_check(sk, np->dst_cookie);
869
870 if (dst == NULL) {
871 struct inet_sock *inet = inet_sk(sk);
872 struct flowi fl;
873
874 /* BUGGG_FUTURE: Again, it is not clear how
875 to handle rthdr case. Ignore this complexity
876 for now.
877 */
878 memset(&fl, 0, sizeof(fl));
879 fl.proto = IPPROTO_TCP;
880 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
881 ipv6_addr_copy(&fl.fl6_src, &np->saddr);
882 fl.oif = sk->sk_bound_dev_if;
883 fl.fl_ip_dport = inet->dport;
884 fl.fl_ip_sport = inet->sport;
885
886 if ((err = ip6_dst_lookup(sk, &dst, &fl))) {
887 sk->sk_err_soft = -err;
888 goto out;
889 }
890
891 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
892 sk->sk_err_soft = -err;
893 goto out;
894 }
895
896 } else
897 dst_hold(dst);
898
899 if (tp->pmtu_cookie > dst_mtu(dst)) {
900 tcp_sync_mss(sk, dst_mtu(dst));
901 tcp_simple_retransmit(sk);
902 } /* else let the usual retransmit timer handle it */
903 dst_release(dst);
904 goto out;
905 }
906
907 icmpv6_err_convert(type, code, &err);
908
909 /* Might be for an open_request */
910 switch (sk->sk_state) {
911 struct open_request *req, **prev;
912 case TCP_LISTEN:
913 if (sock_owned_by_user(sk))
914 goto out;
915
916 req = tcp_v6_search_req(tp, &prev, th->dest, &hdr->daddr,
917 &hdr->saddr, tcp_v6_iif(skb));
918 if (!req)
919 goto out;
920
921 /* ICMPs are not backlogged, hence we cannot get
922 * an established socket here.
923 */
924 BUG_TRAP(req->sk == NULL);
925
926 if (seq != req->snt_isn) {
927 NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
928 goto out;
929 }
930
931 tcp_synq_drop(sk, req, prev);
932 goto out;
933
934 case TCP_SYN_SENT:
935 case TCP_SYN_RECV: /* Cannot happen.
936 It can, it SYNs are crossed. --ANK */
937 if (!sock_owned_by_user(sk)) {
938 TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
939 sk->sk_err = err;
940 sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
941
942 tcp_done(sk);
943 } else
944 sk->sk_err_soft = err;
945 goto out;
946 }
947
948 if (!sock_owned_by_user(sk) && np->recverr) {
949 sk->sk_err = err;
950 sk->sk_error_report(sk);
951 } else
952 sk->sk_err_soft = err;
953
954 out:
955 bh_unlock_sock(sk);
956 sock_put(sk);
957 }
958
959
960 static int tcp_v6_send_synack(struct sock *sk, struct open_request *req,
961 struct dst_entry *dst)
962 {
963 struct ipv6_pinfo *np = inet6_sk(sk);
964 struct sk_buff * skb;
965 struct ipv6_txoptions *opt = NULL;
966 struct in6_addr * final_p = NULL, final;
967 struct flowi fl;
968 int err = -1;
969
970 memset(&fl, 0, sizeof(fl));
971 fl.proto = IPPROTO_TCP;
972 ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr);
973 ipv6_addr_copy(&fl.fl6_src, &req->af.v6_req.loc_addr);
974 fl.fl6_flowlabel = 0;
975 fl.oif = req->af.v6_req.iif;
976 fl.fl_ip_dport = req->rmt_port;
977 fl.fl_ip_sport = inet_sk(sk)->sport;
978
979 if (dst == NULL) {
980 opt = np->opt;
981 if (opt == NULL &&
982 np->rxopt.bits.srcrt == 2 &&
983 req->af.v6_req.pktopts) {
984 struct sk_buff *pktopts = req->af.v6_req.pktopts;
985 struct inet6_skb_parm *rxopt = IP6CB(pktopts);
986 if (rxopt->srcrt)
987 opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(pktopts->nh.raw + rxopt->srcrt));
988 }
989
990 if (opt && opt->srcrt) {
991 struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
992 ipv6_addr_copy(&final, &fl.fl6_dst);
993 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
994 final_p = &final;
995 }
996
997 err = ip6_dst_lookup(sk, &dst, &fl);
998 if (err)
999 goto done;
1000 if (final_p)
1001 ipv6_addr_copy(&fl.fl6_dst, final_p);
1002 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
1003 goto done;
1004 }
1005
1006 skb = tcp_make_synack(sk, dst, req);
1007 if (skb) {
1008 struct tcphdr *th = skb->h.th;
1009
1010 th->check = tcp_v6_check(th, skb->len,
1011 &req->af.v6_req.loc_addr, &req->af.v6_req.rmt_addr,
1012 csum_partial((char *)th, skb->len, skb->csum));
1013
1014 ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr);
1015 err = ip6_xmit(sk, skb, &fl, opt, 0);
1016 if (err == NET_XMIT_CN)
1017 err = 0;
1018 }
1019
1020 done:
1021 dst_release(dst);
1022 if (opt && opt != np->opt)
1023 sock_kfree_s(sk, opt, opt->tot_len);
1024 return err;
1025 }
1026
1027 static void tcp_v6_or_free(struct open_request *req)
1028 {
1029 if (req->af.v6_req.pktopts)
1030 kfree_skb(req->af.v6_req.pktopts);
1031 }
1032
1033 static struct or_calltable or_ipv6 = {
1034 .family = AF_INET6,
1035 .rtx_syn_ack = tcp_v6_send_synack,
1036 .send_ack = tcp_v6_or_send_ack,
1037 .destructor = tcp_v6_or_free,
1038 .send_reset = tcp_v6_send_reset
1039 };
1040
1041 static int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
1042 {
1043 struct ipv6_pinfo *np = inet6_sk(sk);
1044 struct inet6_skb_parm *opt = IP6CB(skb);
1045
1046 if (np->rxopt.all) {
1047 if ((opt->hop && np->rxopt.bits.hopopts) ||
1048 ((IPV6_FLOWINFO_MASK&*(u32*)skb->nh.raw) &&
1049 np->rxopt.bits.rxflow) ||
1050 (opt->srcrt && np->rxopt.bits.srcrt) ||
1051 ((opt->dst1 || opt->dst0) && np->rxopt.bits.dstopts))
1052 return 1;
1053 }
1054 return 0;
1055 }
1056
1057
1058 static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len,
1059 struct sk_buff *skb)
1060 {
1061 struct ipv6_pinfo *np = inet6_sk(sk);
1062
1063 if (skb->ip_summed == CHECKSUM_HW) {
1064 th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0);
1065 skb->csum = offsetof(struct tcphdr, check);
1066 } else {
1067 th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,
1068 csum_partial((char *)th, th->doff<<2,
1069 skb->csum));
1070 }
1071 }
1072
1073
1074 static void tcp_v6_send_reset(struct sk_buff *skb)
1075 {
1076 struct tcphdr *th = skb->h.th, *t1;
1077 struct sk_buff *buff;
1078 struct flowi fl;
1079
1080 if (th->rst)
1081 return;
1082
1083 if (!ipv6_unicast_destination(skb))
1084 return;
1085
1086 /*
1087 * We need to grab some memory, and put together an RST,
1088 * and then put it into the queue to be sent.
1089 */
1090
1091 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + sizeof(struct tcphdr),
1092 GFP_ATOMIC);
1093 if (buff == NULL)
1094 return;
1095
1096 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + sizeof(struct tcphdr));
1097
1098 t1 = (struct tcphdr *) skb_push(buff,sizeof(struct tcphdr));
1099
1100 /* Swap the send and the receive. */
1101 memset(t1, 0, sizeof(*t1));
1102 t1->dest = th->source;
1103 t1->source = th->dest;
1104 t1->doff = sizeof(*t1)/4;
1105 t1->rst = 1;
1106
1107 if(th->ack) {
1108 t1->seq = th->ack_seq;
1109 } else {
1110 t1->ack = 1;
1111 t1->ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin
1112 + skb->len - (th->doff<<2));
1113 }
1114
1115 buff->csum = csum_partial((char *)t1, sizeof(*t1), 0);
1116
1117 memset(&fl, 0, sizeof(fl));
1118 ipv6_addr_copy(&fl.fl6_dst, &skb->nh.ipv6h->saddr);
1119 ipv6_addr_copy(&fl.fl6_src, &skb->nh.ipv6h->daddr);
1120
1121 t1->check = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
1122 sizeof(*t1), IPPROTO_TCP,
1123 buff->csum);
1124
1125 fl.proto = IPPROTO_TCP;
1126 fl.oif = tcp_v6_iif(skb);
1127 fl.fl_ip_dport = t1->dest;
1128 fl.fl_ip_sport = t1->source;
1129
1130 /* sk = NULL, but it is safe for now. RST socket required. */
1131 if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
1132
1133 if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) {
1134 dst_release(buff->dst);
1135 return;
1136 }
1137
1138 ip6_xmit(NULL, buff, &fl, NULL, 0);
1139 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
1140 TCP_INC_STATS_BH(TCP_MIB_OUTRSTS);
1141 return;
1142 }
1143
1144 kfree_skb(buff);
1145 }
1146
1147 static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts)
1148 {
1149 struct tcphdr *th = skb->h.th, *t1;
1150 struct sk_buff *buff;
1151 struct flowi fl;
1152 int tot_len = sizeof(struct tcphdr);
1153
1154 if (ts)
1155 tot_len += 3*4;
1156
1157 buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1158 GFP_ATOMIC);
1159 if (buff == NULL)
1160 return;
1161
1162 skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1163
1164 t1 = (struct tcphdr *) skb_push(buff,tot_len);
1165
1166 /* Swap the send and the receive. */
1167 memset(t1, 0, sizeof(*t1));
1168 t1->dest = th->source;
1169 t1->source = th->dest;
1170 t1->doff = tot_len/4;
1171 t1->seq = htonl(seq);
1172 t1->ack_seq = htonl(ack);
1173 t1->ack = 1;
1174 t1->window = htons(win);
1175
1176 if (ts) {
1177 u32 *ptr = (u32*)(t1 + 1);
1178 *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1179 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
1180 *ptr++ = htonl(tcp_time_stamp);
1181 *ptr = htonl(ts);
1182 }
1183
1184 buff->csum = csum_partial((char *)t1, tot_len, 0);
1185
1186 memset(&fl, 0, sizeof(fl));
1187 ipv6_addr_copy(&fl.fl6_dst, &skb->nh.ipv6h->saddr);
1188 ipv6_addr_copy(&fl.fl6_src, &skb->nh.ipv6h->daddr);
1189
1190 t1->check = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
1191 tot_len, IPPROTO_TCP,
1192 buff->csum);
1193
1194 fl.proto = IPPROTO_TCP;
1195 fl.oif = tcp_v6_iif(skb);
1196 fl.fl_ip_dport = t1->dest;
1197 fl.fl_ip_sport = t1->source;
1198
1199 if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
1200 if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) {
1201 dst_release(buff->dst);
1202 return;
1203 }
1204 ip6_xmit(NULL, buff, &fl, NULL, 0);
1205 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
1206 return;
1207 }
1208
1209 kfree_skb(buff);
1210 }
1211
1212 static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1213 {
1214 struct tcp_tw_bucket *tw = (struct tcp_tw_bucket *)sk;
1215
1216 tcp_v6_send_ack(skb, tw->tw_snd_nxt, tw->tw_rcv_nxt,
1217 tw->tw_rcv_wnd >> tw->tw_rcv_wscale, tw->tw_ts_recent);
1218
1219 tcp_tw_put(tw);
1220 }
1221
1222 static void tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req)
1223 {
1224 tcp_v6_send_ack(skb, req->snt_isn+1, req->rcv_isn+1, req->rcv_wnd, req->ts_recent);
1225 }
1226
1227
1228 static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
1229 {
1230 struct open_request *req, **prev;
1231 struct tcphdr *th = skb->h.th;
1232 struct tcp_sock *tp = tcp_sk(sk);
1233 struct sock *nsk;
1234
1235 /* Find possible connection requests. */
1236 req = tcp_v6_search_req(tp, &prev, th->source, &skb->nh.ipv6h->saddr,
1237 &skb->nh.ipv6h->daddr, tcp_v6_iif(skb));
1238 if (req)
1239 return tcp_check_req(sk, skb, req, prev);
1240
1241 nsk = __tcp_v6_lookup_established(&skb->nh.ipv6h->saddr,
1242 th->source,
1243 &skb->nh.ipv6h->daddr,
1244 ntohs(th->dest),
1245 tcp_v6_iif(skb));
1246
1247 if (nsk) {
1248 if (nsk->sk_state != TCP_TIME_WAIT) {
1249 bh_lock_sock(nsk);
1250 return nsk;
1251 }
1252 tcp_tw_put((struct tcp_tw_bucket*)nsk);
1253 return NULL;
1254 }
1255
1256 #if 0 /*def CONFIG_SYN_COOKIES*/
1257 if (!th->rst && !th->syn && th->ack)
1258 sk = cookie_v6_check(sk, skb, &(IPCB(skb)->opt));
1259 #endif
1260 return sk;
1261 }
1262
1263 static void tcp_v6_synq_add(struct sock *sk, struct open_request *req)
1264 {
1265 struct tcp_sock *tp = tcp_sk(sk);
1266 struct tcp_listen_opt *lopt = tp->listen_opt;
1267 u32 h = tcp_v6_synq_hash(&req->af.v6_req.rmt_addr, req->rmt_port, lopt->hash_rnd);
1268
1269 req->sk = NULL;
1270 req->expires = jiffies + TCP_TIMEOUT_INIT;
1271 req->retrans = 0;
1272 req->dl_next = lopt->syn_table[h];
1273
1274 write_lock(&tp->syn_wait_lock);
1275 lopt->syn_table[h] = req;
1276 write_unlock(&tp->syn_wait_lock);
1277
1278 tcp_synq_added(sk);
1279 }
1280
1281
1282 /* FIXME: this is substantially similar to the ipv4 code.
1283 * Can some kind of merge be done? -- erics
1284 */
1285 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1286 {
1287 struct ipv6_pinfo *np = inet6_sk(sk);
1288 struct tcp_options_received tmp_opt;
1289 struct tcp_sock *tp = tcp_sk(sk);
1290 struct open_request *req = NULL;
1291 __u32 isn = TCP_SKB_CB(skb)->when;
1292
1293 if (skb->protocol == htons(ETH_P_IP))
1294 return tcp_v4_conn_request(sk, skb);
1295
1296 if (!ipv6_unicast_destination(skb))
1297 goto drop;
1298
1299 /*
1300 * There are no SYN attacks on IPv6, yet...
1301 */
1302 if (tcp_synq_is_full(sk) && !isn) {
1303 if (net_ratelimit())
1304 printk(KERN_INFO "TCPv6: dropping request, synflood is possible\n");
1305 goto drop;
1306 }
1307
1308 if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1)
1309 goto drop;
1310
1311 req = tcp_openreq_alloc();
1312 if (req == NULL)
1313 goto drop;
1314
1315 tcp_clear_options(&tmp_opt);
1316 tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
1317 tmp_opt.user_mss = tp->rx_opt.user_mss;
1318
1319 tcp_parse_options(skb, &tmp_opt, 0);
1320
1321 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
1322 tcp_openreq_init(req, &tmp_opt, skb);
1323
1324 req->class = &or_ipv6;
1325 ipv6_addr_copy(&req->af.v6_req.rmt_addr, &skb->nh.ipv6h->saddr);
1326 ipv6_addr_copy(&req->af.v6_req.loc_addr, &skb->nh.ipv6h->daddr);
1327 TCP_ECN_create_request(req, skb->h.th);
1328 req->af.v6_req.pktopts = NULL;
1329 if (ipv6_opt_accepted(sk, skb) ||
1330 np->rxopt.bits.rxinfo ||
1331 np->rxopt.bits.rxhlim) {
1332 atomic_inc(&skb->users);
1333 req->af.v6_req.pktopts = skb;
1334 }
1335 req->af.v6_req.iif = sk->sk_bound_dev_if;
1336
1337 /* So that link locals have meaning */
1338 if (!sk->sk_bound_dev_if &&
1339 ipv6_addr_type(&req->af.v6_req.rmt_addr) & IPV6_ADDR_LINKLOCAL)
1340 req->af.v6_req.iif = tcp_v6_iif(skb);
1341
1342 if (isn == 0)
1343 isn = tcp_v6_init_sequence(sk,skb);
1344
1345 req->snt_isn = isn;
1346
1347 if (tcp_v6_send_synack(sk, req, NULL))
1348 goto drop;
1349
1350 tcp_v6_synq_add(sk, req);
1351
1352 return 0;
1353
1354 drop:
1355 if (req)
1356 tcp_openreq_free(req);
1357
1358 TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
1359 return 0; /* don't send reset */
1360 }
1361
1362 static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1363 struct open_request *req,
1364 struct dst_entry *dst)
1365 {
1366 struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1367 struct tcp6_sock *newtcp6sk;
1368 struct inet_sock *newinet;
1369 struct tcp_sock *newtp;
1370 struct sock *newsk;
1371 struct ipv6_txoptions *opt;
1372
1373 if (skb->protocol == htons(ETH_P_IP)) {
1374 /*
1375 * v6 mapped
1376 */
1377
1378 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
1379
1380 if (newsk == NULL)
1381 return NULL;
1382
1383 newtcp6sk = (struct tcp6_sock *)newsk;
1384 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1385
1386 newinet = inet_sk(newsk);
1387 newnp = inet6_sk(newsk);
1388 newtp = tcp_sk(newsk);
1389
1390 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1391
1392 ipv6_addr_set(&newnp->daddr, 0, 0, htonl(0x0000FFFF),
1393 newinet->daddr);
1394
1395 ipv6_addr_set(&newnp->saddr, 0, 0, htonl(0x0000FFFF),
1396 newinet->saddr);
1397
1398 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
1399
1400 newtp->af_specific = &ipv6_mapped;
1401 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
1402 newnp->pktoptions = NULL;
1403 newnp->opt = NULL;
1404 newnp->mcast_oif = tcp_v6_iif(skb);
1405 newnp->mcast_hops = skb->nh.ipv6h->hop_limit;
1406
1407 /* Charge newly allocated IPv6 socket. Though it is mapped,
1408 * it is IPv6 yet.
1409 */
1410 #ifdef INET_REFCNT_DEBUG
1411 atomic_inc(&inet6_sock_nr);
1412 #endif
1413
1414 /* It is tricky place. Until this moment IPv4 tcp
1415 worked with IPv6 af_tcp.af_specific.
1416 Sync it now.
1417 */
1418 tcp_sync_mss(newsk, newtp->pmtu_cookie);
1419
1420 return newsk;
1421 }
1422
1423 opt = np->opt;
1424
1425 if (sk_acceptq_is_full(sk))
1426 goto out_overflow;
1427
1428 if (np->rxopt.bits.srcrt == 2 &&
1429 opt == NULL && req->af.v6_req.pktopts) {
1430 struct inet6_skb_parm *rxopt = IP6CB(req->af.v6_req.pktopts);
1431 if (rxopt->srcrt)
1432 opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(req->af.v6_req.pktopts->nh.raw+rxopt->srcrt));
1433 }
1434
1435 if (dst == NULL) {
1436 struct in6_addr *final_p = NULL, final;
1437 struct flowi fl;
1438
1439 memset(&fl, 0, sizeof(fl));
1440 fl.proto = IPPROTO_TCP;
1441 ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr);
1442 if (opt && opt->srcrt) {
1443 struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
1444 ipv6_addr_copy(&final, &fl.fl6_dst);
1445 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
1446 final_p = &final;
1447 }
1448 ipv6_addr_copy(&fl.fl6_src, &req->af.v6_req.loc_addr);
1449 fl.oif = sk->sk_bound_dev_if;
1450 fl.fl_ip_dport = req->rmt_port;
1451 fl.fl_ip_sport = inet_sk(sk)->sport;
1452
1453 if (ip6_dst_lookup(sk, &dst, &fl))
1454 goto out;
1455
1456 if (final_p)
1457 ipv6_addr_copy(&fl.fl6_dst, final_p);
1458
1459 if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0)
1460 goto out;
1461 }
1462
1463 newsk = tcp_create_openreq_child(sk, req, skb);
1464 if (newsk == NULL)
1465 goto out;
1466
1467 /* Charge newly allocated IPv6 socket */
1468 #ifdef INET_REFCNT_DEBUG
1469 atomic_inc(&inet6_sock_nr);
1470 #endif
1471
1472 ip6_dst_store(newsk, dst, NULL);
1473 newsk->sk_route_caps = dst->dev->features &
1474 ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
1475
1476 newtcp6sk = (struct tcp6_sock *)newsk;
1477 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1478
1479 newtp = tcp_sk(newsk);
1480 newinet = inet_sk(newsk);
1481 newnp = inet6_sk(newsk);
1482
1483 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1484
1485 ipv6_addr_copy(&newnp->daddr, &req->af.v6_req.rmt_addr);
1486 ipv6_addr_copy(&newnp->saddr, &req->af.v6_req.loc_addr);
1487 ipv6_addr_copy(&newnp->rcv_saddr, &req->af.v6_req.loc_addr);
1488 newsk->sk_bound_dev_if = req->af.v6_req.iif;
1489
1490 /* Now IPv6 options...
1491
1492 First: no IPv4 options.
1493 */
1494 newinet->opt = NULL;
1495
1496 /* Clone RX bits */
1497 newnp->rxopt.all = np->rxopt.all;
1498
1499 /* Clone pktoptions received with SYN */
1500 newnp->pktoptions = NULL;
1501 if (req->af.v6_req.pktopts) {
1502 newnp->pktoptions = skb_clone(req->af.v6_req.pktopts,
1503 GFP_ATOMIC);
1504 kfree_skb(req->af.v6_req.pktopts);
1505 req->af.v6_req.pktopts = NULL;
1506 if (newnp->pktoptions)
1507 skb_set_owner_r(newnp->pktoptions, newsk);
1508 }
1509 newnp->opt = NULL;
1510 newnp->mcast_oif = tcp_v6_iif(skb);
1511 newnp->mcast_hops = skb->nh.ipv6h->hop_limit;
1512
1513 /* Clone native IPv6 options from listening socket (if any)
1514
1515 Yes, keeping reference count would be much more clever,
1516 but we make one more one thing there: reattach optmem
1517 to newsk.
1518 */
1519 if (opt) {
1520 newnp->opt = ipv6_dup_options(newsk, opt);
1521 if (opt != np->opt)
1522 sock_kfree_s(sk, opt, opt->tot_len);
1523 }
1524
1525 newtp->ext_header_len = 0;
1526 if (newnp->opt)
1527 newtp->ext_header_len = newnp->opt->opt_nflen +
1528 newnp->opt->opt_flen;
1529
1530 tcp_sync_mss(newsk, dst_mtu(dst));
1531 newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
1532 tcp_initialize_rcv_mss(newsk);
1533
1534 newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6;
1535
1536 __tcp_v6_hash(newsk);
1537 tcp_inherit_port(sk, newsk);
1538
1539 return newsk;
1540
1541 out_overflow:
1542 NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS);
1543 out:
1544 NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS);
1545 if (opt && opt != np->opt)
1546 sock_kfree_s(sk, opt, opt->tot_len);
1547 dst_release(dst);
1548 return NULL;
1549 }
1550
1551 static int tcp_v6_checksum_init(struct sk_buff *skb)
1552 {
1553 if (skb->ip_summed == CHECKSUM_HW) {
1554 skb->ip_summed = CHECKSUM_UNNECESSARY;
1555 if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
1556 &skb->nh.ipv6h->daddr,skb->csum))
1557 return 0;
1558 LIMIT_NETDEBUG(printk(KERN_DEBUG "hw tcp v6 csum failed\n"));
1559 }
1560 if (skb->len <= 76) {
1561 if (tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
1562 &skb->nh.ipv6h->daddr,skb_checksum(skb, 0, skb->len, 0)))
1563 return -1;
1564 skb->ip_summed = CHECKSUM_UNNECESSARY;
1565 } else {
1566 skb->csum = ~tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
1567 &skb->nh.ipv6h->daddr,0);
1568 }
1569 return 0;
1570 }
1571
1572 /* The socket must have it's spinlock held when we get
1573 * here.
1574 *
1575 * We have a potential double-lock case here, so even when
1576 * doing backlog processing we use the BH locking scheme.
1577 * This is because we cannot sleep with the original spinlock
1578 * held.
1579 */
1580 static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1581 {
1582 struct ipv6_pinfo *np = inet6_sk(sk);
1583 struct tcp_sock *tp;
1584 struct sk_buff *opt_skb = NULL;
1585
1586 /* Imagine: socket is IPv6. IPv4 packet arrives,
1587 goes to IPv4 receive handler and backlogged.
1588 From backlog it always goes here. Kerboom...
1589 Fortunately, tcp_rcv_established and rcv_established
1590 handle them correctly, but it is not case with
1591 tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK
1592 */
1593
1594 if (skb->protocol == htons(ETH_P_IP))
1595 return tcp_v4_do_rcv(sk, skb);
1596
1597 if (sk_filter(sk, skb, 0))
1598 goto discard;
1599
1600 /*
1601 * socket locking is here for SMP purposes as backlog rcv
1602 * is currently called with bh processing disabled.
1603 */
1604
1605 /* Do Stevens' IPV6_PKTOPTIONS.
1606
1607 Yes, guys, it is the only place in our code, where we
1608 may make it not affecting IPv4.
1609 The rest of code is protocol independent,
1610 and I do not like idea to uglify IPv4.
1611
1612 Actually, all the idea behind IPV6_PKTOPTIONS
1613 looks not very well thought. For now we latch
1614 options, received in the last packet, enqueued
1615 by tcp. Feel free to propose better solution.
1616 --ANK (980728)
1617 */
1618 if (np->rxopt.all)
1619 opt_skb = skb_clone(skb, GFP_ATOMIC);
1620
1621 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
1622 TCP_CHECK_TIMER(sk);
1623 if (tcp_rcv_established(sk, skb, skb->h.th, skb->len))
1624 goto reset;
1625 TCP_CHECK_TIMER(sk);
1626 if (opt_skb)
1627 goto ipv6_pktoptions;
1628 return 0;
1629 }
1630
1631 if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb))
1632 goto csum_err;
1633
1634 if (sk->sk_state == TCP_LISTEN) {
1635 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1636 if (!nsk)
1637 goto discard;
1638
1639 /*
1640 * Queue it on the new socket if the new socket is active,
1641 * otherwise we just shortcircuit this and continue with
1642 * the new socket..
1643 */
1644 if(nsk != sk) {
1645 if (tcp_child_process(sk, nsk, skb))
1646 goto reset;
1647 if (opt_skb)
1648 __kfree_skb(opt_skb);
1649 return 0;
1650 }
1651 }
1652
1653 TCP_CHECK_TIMER(sk);
1654 if (tcp_rcv_state_process(sk, skb, skb->h.th, skb->len))
1655 goto reset;
1656 TCP_CHECK_TIMER(sk);
1657 if (opt_skb)
1658 goto ipv6_pktoptions;
1659 return 0;
1660
1661 reset:
1662 tcp_v6_send_reset(skb);
1663 discard:
1664 if (opt_skb)
1665 __kfree_skb(opt_skb);
1666 kfree_skb(skb);
1667 return 0;
1668 csum_err:
1669 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1670 goto discard;
1671
1672
1673 ipv6_pktoptions:
1674 /* Do you ask, what is it?
1675
1676 1. skb was enqueued by tcp.
1677 2. skb is added to tail of read queue, rather than out of order.
1678 3. socket is not in passive state.
1679 4. Finally, it really contains options, which user wants to receive.
1680 */
1681 tp = tcp_sk(sk);
1682 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1683 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1684 if (np->rxopt.bits.rxinfo)
1685 np->mcast_oif = tcp_v6_iif(opt_skb);
1686 if (np->rxopt.bits.rxhlim)
1687 np->mcast_hops = opt_skb->nh.ipv6h->hop_limit;
1688 if (ipv6_opt_accepted(sk, opt_skb)) {
1689 skb_set_owner_r(opt_skb, sk);
1690 opt_skb = xchg(&np->pktoptions, opt_skb);
1691 } else {
1692 __kfree_skb(opt_skb);
1693 opt_skb = xchg(&np->pktoptions, NULL);
1694 }
1695 }
1696
1697 if (opt_skb)
1698 kfree_skb(opt_skb);
1699 return 0;
1700 }
1701
1702 static int tcp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
1703 {
1704 struct sk_buff *skb = *pskb;
1705 struct tcphdr *th;
1706 struct sock *sk;
1707 int ret;
1708
1709 if (skb->pkt_type != PACKET_HOST)
1710 goto discard_it;
1711
1712 /*
1713 * Count it even if it's bad.
1714 */
1715 TCP_INC_STATS_BH(TCP_MIB_INSEGS);
1716
1717 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1718 goto discard_it;
1719
1720 th = skb->h.th;
1721
1722 if (th->doff < sizeof(struct tcphdr)/4)
1723 goto bad_packet;
1724 if (!pskb_may_pull(skb, th->doff*4))
1725 goto discard_it;
1726
1727 if ((skb->ip_summed != CHECKSUM_UNNECESSARY &&
1728 tcp_v6_checksum_init(skb) < 0))
1729 goto bad_packet;
1730
1731 th = skb->h.th;
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(skb->nh.ipv6h);
1738 TCP_SKB_CB(skb)->sacked = 0;
1739
1740 sk = __tcp_v6_lookup(&skb->nh.ipv6h->saddr, th->source,
1741 &skb->nh.ipv6h->daddr, ntohs(th->dest), tcp_v6_iif(skb));
1742
1743 if (!sk)
1744 goto no_tcp_socket;
1745
1746 process:
1747 if (sk->sk_state == TCP_TIME_WAIT)
1748 goto do_time_wait;
1749
1750 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1751 goto discard_and_relse;
1752
1753 if (sk_filter(sk, skb, 0))
1754 goto discard_and_relse;
1755
1756 skb->dev = NULL;
1757
1758 bh_lock_sock(sk);
1759 ret = 0;
1760 if (!sock_owned_by_user(sk)) {
1761 if (!tcp_prequeue(sk, skb))
1762 ret = tcp_v6_do_rcv(sk, skb);
1763 } else
1764 sk_add_backlog(sk, skb);
1765 bh_unlock_sock(sk);
1766
1767 sock_put(sk);
1768 return ret ? -1 : 0;
1769
1770 no_tcp_socket:
1771 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1772 goto discard_it;
1773
1774 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1775 bad_packet:
1776 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1777 } else {
1778 tcp_v6_send_reset(skb);
1779 }
1780
1781 discard_it:
1782
1783 /*
1784 * Discard frame
1785 */
1786
1787 kfree_skb(skb);
1788 return 0;
1789
1790 discard_and_relse:
1791 sock_put(sk);
1792 goto discard_it;
1793
1794 do_time_wait:
1795 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
1796 tcp_tw_put((struct tcp_tw_bucket *) sk);
1797 goto discard_it;
1798 }
1799
1800 if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1801 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1802 tcp_tw_put((struct tcp_tw_bucket *) sk);
1803 goto discard_it;
1804 }
1805
1806 switch(tcp_timewait_state_process((struct tcp_tw_bucket *)sk,
1807 skb, th, skb->len)) {
1808 case TCP_TW_SYN:
1809 {
1810 struct sock *sk2;
1811
1812 sk2 = tcp_v6_lookup_listener(&skb->nh.ipv6h->daddr, ntohs(th->dest), tcp_v6_iif(skb));
1813 if (sk2 != NULL) {
1814 tcp_tw_deschedule((struct tcp_tw_bucket *)sk);
1815 tcp_tw_put((struct tcp_tw_bucket *)sk);
1816 sk = sk2;
1817 goto process;
1818 }
1819 /* Fall through to ACK */
1820 }
1821 case TCP_TW_ACK:
1822 tcp_v6_timewait_ack(sk, skb);
1823 break;
1824 case TCP_TW_RST:
1825 goto no_tcp_socket;
1826 case TCP_TW_SUCCESS:;
1827 }
1828 goto discard_it;
1829 }
1830
1831 static int tcp_v6_rebuild_header(struct sock *sk)
1832 {
1833 int err;
1834 struct dst_entry *dst;
1835 struct ipv6_pinfo *np = inet6_sk(sk);
1836
1837 dst = __sk_dst_check(sk, np->dst_cookie);
1838
1839 if (dst == NULL) {
1840 struct inet_sock *inet = inet_sk(sk);
1841 struct in6_addr *final_p = NULL, final;
1842 struct flowi fl;
1843
1844 memset(&fl, 0, sizeof(fl));
1845 fl.proto = IPPROTO_TCP;
1846 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
1847 ipv6_addr_copy(&fl.fl6_src, &np->saddr);
1848 fl.fl6_flowlabel = np->flow_label;
1849 fl.oif = sk->sk_bound_dev_if;
1850 fl.fl_ip_dport = inet->dport;
1851 fl.fl_ip_sport = inet->sport;
1852
1853 if (np->opt && np->opt->srcrt) {
1854 struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
1855 ipv6_addr_copy(&final, &fl.fl6_dst);
1856 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
1857 final_p = &final;
1858 }
1859
1860 err = ip6_dst_lookup(sk, &dst, &fl);
1861 if (err) {
1862 sk->sk_route_caps = 0;
1863 return err;
1864 }
1865 if (final_p)
1866 ipv6_addr_copy(&fl.fl6_dst, final_p);
1867
1868 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
1869 sk->sk_err_soft = -err;
1870 dst_release(dst);
1871 return err;
1872 }
1873
1874 ip6_dst_store(sk, dst, NULL);
1875 sk->sk_route_caps = dst->dev->features &
1876 ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
1877 }
1878
1879 return 0;
1880 }
1881
1882 static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
1883 {
1884 struct sock *sk = skb->sk;
1885 struct inet_sock *inet = inet_sk(sk);
1886 struct ipv6_pinfo *np = inet6_sk(sk);
1887 struct flowi fl;
1888 struct dst_entry *dst;
1889 struct in6_addr *final_p = NULL, final;
1890
1891 memset(&fl, 0, sizeof(fl));
1892 fl.proto = IPPROTO_TCP;
1893 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
1894 ipv6_addr_copy(&fl.fl6_src, &np->saddr);
1895 fl.fl6_flowlabel = np->flow_label;
1896 IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel);
1897 fl.oif = sk->sk_bound_dev_if;
1898 fl.fl_ip_sport = inet->sport;
1899 fl.fl_ip_dport = inet->dport;
1900
1901 if (np->opt && np->opt->srcrt) {
1902 struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
1903 ipv6_addr_copy(&final, &fl.fl6_dst);
1904 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
1905 final_p = &final;
1906 }
1907
1908 dst = __sk_dst_check(sk, np->dst_cookie);
1909
1910 if (dst == NULL) {
1911 int err = ip6_dst_lookup(sk, &dst, &fl);
1912
1913 if (err) {
1914 sk->sk_err_soft = -err;
1915 return err;
1916 }
1917
1918 if (final_p)
1919 ipv6_addr_copy(&fl.fl6_dst, final_p);
1920
1921 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
1922 sk->sk_route_caps = 0;
1923 dst_release(dst);
1924 return err;
1925 }
1926
1927 ip6_dst_store(sk, dst, NULL);
1928 sk->sk_route_caps = dst->dev->features &
1929 ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
1930 }
1931
1932 skb->dst = dst_clone(dst);
1933
1934 /* Restore final destination back after routing done */
1935 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
1936
1937 return ip6_xmit(sk, skb, &fl, np->opt, 0);
1938 }
1939
1940 static void v6_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
1941 {
1942 struct ipv6_pinfo *np = inet6_sk(sk);
1943 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr;
1944
1945 sin6->sin6_family = AF_INET6;
1946 ipv6_addr_copy(&sin6->sin6_addr, &np->daddr);
1947 sin6->sin6_port = inet_sk(sk)->dport;
1948 /* We do not store received flowlabel for TCP */
1949 sin6->sin6_flowinfo = 0;
1950 sin6->sin6_scope_id = 0;
1951 if (sk->sk_bound_dev_if &&
1952 ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
1953 sin6->sin6_scope_id = sk->sk_bound_dev_if;
1954 }
1955
1956 static int tcp_v6_remember_stamp(struct sock *sk)
1957 {
1958 /* Alas, not yet... */
1959 return 0;
1960 }
1961
1962 static struct tcp_func ipv6_specific = {
1963 .queue_xmit = tcp_v6_xmit,
1964 .send_check = tcp_v6_send_check,
1965 .rebuild_header = tcp_v6_rebuild_header,
1966 .conn_request = tcp_v6_conn_request,
1967 .syn_recv_sock = tcp_v6_syn_recv_sock,
1968 .remember_stamp = tcp_v6_remember_stamp,
1969 .net_header_len = sizeof(struct ipv6hdr),
1970
1971 .setsockopt = ipv6_setsockopt,
1972 .getsockopt = ipv6_getsockopt,
1973 .addr2sockaddr = v6_addr2sockaddr,
1974 .sockaddr_len = sizeof(struct sockaddr_in6)
1975 };
1976
1977 /*
1978 * TCP over IPv4 via INET6 API
1979 */
1980
1981 static struct tcp_func ipv6_mapped = {
1982 .queue_xmit = ip_queue_xmit,
1983 .send_check = tcp_v4_send_check,
1984 .rebuild_header = tcp_v4_rebuild_header,
1985 .conn_request = tcp_v6_conn_request,
1986 .syn_recv_sock = tcp_v6_syn_recv_sock,
1987 .remember_stamp = tcp_v4_remember_stamp,
1988 .net_header_len = sizeof(struct iphdr),
1989
1990 .setsockopt = ipv6_setsockopt,
1991 .getsockopt = ipv6_getsockopt,
1992 .addr2sockaddr = v6_addr2sockaddr,
1993 .sockaddr_len = sizeof(struct sockaddr_in6)
1994 };
1995
1996
1997
1998 /* NOTE: A lot of things set to zero explicitly by call to
1999 * sk_alloc() so need not be done here.
2000 */
2001 static int tcp_v6_init_sock(struct sock *sk)
2002 {
2003 struct tcp_sock *tp = tcp_sk(sk);
2004
2005 skb_queue_head_init(&tp->out_of_order_queue);
2006 tcp_init_xmit_timers(sk);
2007 tcp_prequeue_init(tp);
2008
2009 tp->rto = TCP_TIMEOUT_INIT;
2010 tp->mdev = TCP_TIMEOUT_INIT;
2011
2012 /* So many TCP implementations out there (incorrectly) count the
2013 * initial SYN frame in their delayed-ACK and congestion control
2014 * algorithms that we must have the following bandaid to talk
2015 * efficiently to them. -DaveM
2016 */
2017 tp->snd_cwnd = 2;
2018
2019 /* See draft-stevens-tcpca-spec-01 for discussion of the
2020 * initialization of these values.
2021 */
2022 tp->snd_ssthresh = 0x7fffffff;
2023 tp->snd_cwnd_clamp = ~0;
2024 tp->mss_cache_std = tp->mss_cache = 536;
2025
2026 tp->reordering = sysctl_tcp_reordering;
2027
2028 sk->sk_state = TCP_CLOSE;
2029
2030 tp->af_specific = &ipv6_specific;
2031
2032 sk->sk_write_space = sk_stream_write_space;
2033 sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
2034
2035 sk->sk_sndbuf = sysctl_tcp_wmem[1];
2036 sk->sk_rcvbuf = sysctl_tcp_rmem[1];
2037
2038 atomic_inc(&tcp_sockets_allocated);
2039
2040 return 0;
2041 }
2042
2043 static int tcp_v6_destroy_sock(struct sock *sk)
2044 {
2045 extern int tcp_v4_destroy_sock(struct sock *sk);
2046
2047 tcp_v4_destroy_sock(sk);
2048 return inet6_destroy_sock(sk);
2049 }
2050
2051 /* Proc filesystem TCPv6 sock list dumping. */
2052 static void get_openreq6(struct seq_file *seq,
2053 struct sock *sk, struct open_request *req, int i, int uid)
2054 {
2055 struct in6_addr *dest, *src;
2056 int ttd = req->expires - jiffies;
2057
2058 if (ttd < 0)
2059 ttd = 0;
2060
2061 src = &req->af.v6_req.loc_addr;
2062 dest = &req->af.v6_req.rmt_addr;
2063 seq_printf(seq,
2064 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2065 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2066 i,
2067 src->s6_addr32[0], src->s6_addr32[1],
2068 src->s6_addr32[2], src->s6_addr32[3],
2069 ntohs(inet_sk(sk)->sport),
2070 dest->s6_addr32[0], dest->s6_addr32[1],
2071 dest->s6_addr32[2], dest->s6_addr32[3],
2072 ntohs(req->rmt_port),
2073 TCP_SYN_RECV,
2074 0,0, /* could print option size, but that is af dependent. */
2075 1, /* timers active (only the expire timer) */
2076 jiffies_to_clock_t(ttd),
2077 req->retrans,
2078 uid,
2079 0, /* non standard timer */
2080 0, /* open_requests have no inode */
2081 0, req);
2082 }
2083
2084 static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
2085 {
2086 struct in6_addr *dest, *src;
2087 __u16 destp, srcp;
2088 int timer_active;
2089 unsigned long timer_expires;
2090 struct inet_sock *inet = inet_sk(sp);
2091 struct tcp_sock *tp = tcp_sk(sp);
2092 struct ipv6_pinfo *np = inet6_sk(sp);
2093
2094 dest = &np->daddr;
2095 src = &np->rcv_saddr;
2096 destp = ntohs(inet->dport);
2097 srcp = ntohs(inet->sport);
2098 if (tp->pending == TCP_TIME_RETRANS) {
2099 timer_active = 1;
2100 timer_expires = tp->timeout;
2101 } else if (tp->pending == TCP_TIME_PROBE0) {
2102 timer_active = 4;
2103 timer_expires = tp->timeout;
2104 } else if (timer_pending(&sp->sk_timer)) {
2105 timer_active = 2;
2106 timer_expires = sp->sk_timer.expires;
2107 } else {
2108 timer_active = 0;
2109 timer_expires = jiffies;
2110 }
2111
2112 seq_printf(seq,
2113 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2114 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %u %u %u %u %d\n",
2115 i,
2116 src->s6_addr32[0], src->s6_addr32[1],
2117 src->s6_addr32[2], src->s6_addr32[3], srcp,
2118 dest->s6_addr32[0], dest->s6_addr32[1],
2119 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2120 sp->sk_state,
2121 tp->write_seq-tp->snd_una, tp->rcv_nxt-tp->copied_seq,
2122 timer_active,
2123 jiffies_to_clock_t(timer_expires - jiffies),
2124 tp->retransmits,
2125 sock_i_uid(sp),
2126 tp->probes_out,
2127 sock_i_ino(sp),
2128 atomic_read(&sp->sk_refcnt), sp,
2129 tp->rto, tp->ack.ato, (tp->ack.quick<<1)|tp->ack.pingpong,
2130 tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh
2131 );
2132 }
2133
2134 static void get_timewait6_sock(struct seq_file *seq,
2135 struct tcp_tw_bucket *tw, int i)
2136 {
2137 struct in6_addr *dest, *src;
2138 __u16 destp, srcp;
2139 int ttd = tw->tw_ttd - jiffies;
2140
2141 if (ttd < 0)
2142 ttd = 0;
2143
2144 dest = &tw->tw_v6_daddr;
2145 src = &tw->tw_v6_rcv_saddr;
2146 destp = ntohs(tw->tw_dport);
2147 srcp = ntohs(tw->tw_sport);
2148
2149 seq_printf(seq,
2150 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2151 "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2152 i,
2153 src->s6_addr32[0], src->s6_addr32[1],
2154 src->s6_addr32[2], src->s6_addr32[3], srcp,
2155 dest->s6_addr32[0], dest->s6_addr32[1],
2156 dest->s6_addr32[2], dest->s6_addr32[3], destp,
2157 tw->tw_substate, 0, 0,
2158 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2159 atomic_read(&tw->tw_refcnt), tw);
2160 }
2161
2162 #ifdef CONFIG_PROC_FS
2163 static int tcp6_seq_show(struct seq_file *seq, void *v)
2164 {
2165 struct tcp_iter_state *st;
2166
2167 if (v == SEQ_START_TOKEN) {
2168 seq_puts(seq,
2169 " sl "
2170 "local_address "
2171 "remote_address "
2172 "st tx_queue rx_queue tr tm->when retrnsmt"
2173 " uid timeout inode\n");
2174 goto out;
2175 }
2176 st = seq->private;
2177
2178 switch (st->state) {
2179 case TCP_SEQ_STATE_LISTENING:
2180 case TCP_SEQ_STATE_ESTABLISHED:
2181 get_tcp6_sock(seq, v, st->num);
2182 break;
2183 case TCP_SEQ_STATE_OPENREQ:
2184 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
2185 break;
2186 case TCP_SEQ_STATE_TIME_WAIT:
2187 get_timewait6_sock(seq, v, st->num);
2188 break;
2189 }
2190 out:
2191 return 0;
2192 }
2193
2194 static struct file_operations tcp6_seq_fops;
2195 static struct tcp_seq_afinfo tcp6_seq_afinfo = {
2196 .owner = THIS_MODULE,
2197 .name = "tcp6",
2198 .family = AF_INET6,
2199 .seq_show = tcp6_seq_show,
2200 .seq_fops = &tcp6_seq_fops,
2201 };
2202
2203 int __init tcp6_proc_init(void)
2204 {
2205 return tcp_proc_register(&tcp6_seq_afinfo);
2206 }
2207
2208 void tcp6_proc_exit(void)
2209 {
2210 tcp_proc_unregister(&tcp6_seq_afinfo);
2211 }
2212 #endif
2213
2214 struct proto tcpv6_prot = {
2215 .name = "TCPv6",
2216 .owner = THIS_MODULE,
2217 .close = tcp_close,
2218 .connect = tcp_v6_connect,
2219 .disconnect = tcp_disconnect,
2220 .accept = tcp_accept,
2221 .ioctl = tcp_ioctl,
2222 .init = tcp_v6_init_sock,
2223 .destroy = tcp_v6_destroy_sock,
2224 .shutdown = tcp_shutdown,
2225 .setsockopt = tcp_setsockopt,
2226 .getsockopt = tcp_getsockopt,
2227 .sendmsg = tcp_sendmsg,
2228 .recvmsg = tcp_recvmsg,
2229 .backlog_rcv = tcp_v6_do_rcv,
2230 .hash = tcp_v6_hash,
2231 .unhash = tcp_unhash,
2232 .get_port = tcp_v6_get_port,
2233 .enter_memory_pressure = tcp_enter_memory_pressure,
2234 .sockets_allocated = &tcp_sockets_allocated,
2235 .memory_allocated = &tcp_memory_allocated,
2236 .memory_pressure = &tcp_memory_pressure,
2237 .sysctl_mem = sysctl_tcp_mem,
2238 .sysctl_wmem = sysctl_tcp_wmem,
2239 .sysctl_rmem = sysctl_tcp_rmem,
2240 .max_header = MAX_TCP_HEADER,
2241 .obj_size = sizeof(struct tcp6_sock),
2242 };
2243
2244 static struct inet6_protocol tcpv6_protocol = {
2245 .handler = tcp_v6_rcv,
2246 .err_handler = tcp_v6_err,
2247 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2248 };
2249
2250 extern struct proto_ops inet6_stream_ops;
2251
2252 static struct inet_protosw tcpv6_protosw = {
2253 .type = SOCK_STREAM,
2254 .protocol = IPPROTO_TCP,
2255 .prot = &tcpv6_prot,
2256 .ops = &inet6_stream_ops,
2257 .capability = -1,
2258 .no_check = 0,
2259 .flags = INET_PROTOSW_PERMANENT,
2260 };
2261
2262 void __init tcpv6_init(void)
2263 {
2264 /* register inet6 protocol */
2265 if (inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP) < 0)
2266 printk(KERN_ERR "tcpv6_init: Could not register protocol\n");
2267 inet6_register_protosw(&tcpv6_protosw);
2268 }