[I/OAT]: TCP recv offload to I/OAT
[pandora-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/inet6_hashtables.h>
51 #include <net/inet6_connection_sock.h>
52 #include <net/ipv6.h>
53 #include <net/transp_v6.h>
54 #include <net/addrconf.h>
55 #include <net/ip6_route.h>
56 #include <net/ip6_checksum.h>
57 #include <net/inet_ecn.h>
58 #include <net/protocol.h>
59 #include <net/xfrm.h>
60 #include <net/addrconf.h>
61 #include <net/snmp.h>
62 #include <net/dsfield.h>
63 #include <net/timewait_sock.h>
64
65 #include <asm/uaccess.h>
66
67 #include <linux/proc_fs.h>
68 #include <linux/seq_file.h>
69
70 /* Socket used for sending RSTs and ACKs */
71 static struct socket *tcp6_socket;
72
73 static void     tcp_v6_send_reset(struct sk_buff *skb);
74 static void     tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req);
75 static void     tcp_v6_send_check(struct sock *sk, int len, 
76                                   struct sk_buff *skb);
77
78 static int      tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
79
80 static struct inet_connection_sock_af_ops ipv6_mapped;
81 static struct inet_connection_sock_af_ops ipv6_specific;
82
83 static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
84 {
85         return inet_csk_get_port(&tcp_hashinfo, sk, snum,
86                                  inet6_csk_bind_conflict);
87 }
88
89 static void tcp_v6_hash(struct sock *sk)
90 {
91         if (sk->sk_state != TCP_CLOSE) {
92                 if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
93                         tcp_prot.hash(sk);
94                         return;
95                 }
96                 local_bh_disable();
97                 __inet6_hash(&tcp_hashinfo, sk);
98                 local_bh_enable();
99         }
100 }
101
102 static __inline__ u16 tcp_v6_check(struct tcphdr *th, int len,
103                                    struct in6_addr *saddr, 
104                                    struct in6_addr *daddr, 
105                                    unsigned long base)
106 {
107         return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
108 }
109
110 static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb)
111 {
112         if (skb->protocol == htons(ETH_P_IPV6)) {
113                 return secure_tcpv6_sequence_number(skb->nh.ipv6h->daddr.s6_addr32,
114                                                     skb->nh.ipv6h->saddr.s6_addr32,
115                                                     skb->h.th->dest,
116                                                     skb->h.th->source);
117         } else {
118                 return secure_tcp_sequence_number(skb->nh.iph->daddr,
119                                                   skb->nh.iph->saddr,
120                                                   skb->h.th->dest,
121                                                   skb->h.th->source);
122         }
123 }
124
125 static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, 
126                           int addr_len)
127 {
128         struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
129         struct inet_sock *inet = inet_sk(sk);
130         struct inet_connection_sock *icsk = inet_csk(sk);
131         struct ipv6_pinfo *np = inet6_sk(sk);
132         struct tcp_sock *tp = tcp_sk(sk);
133         struct in6_addr *saddr = NULL, *final_p = NULL, final;
134         struct flowi fl;
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(&fl, 0, sizeof(fl));
146
147         if (np->sndflow) {
148                 fl.fl6_flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
149                 IP6_ECN_flow_init(fl.fl6_flowlabel);
150                 if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) {
151                         struct ip6_flowlabel *flowlabel;
152                         flowlabel = fl6_sock_lookup(sk, fl.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          *      connect() to INADDR_ANY means loopback (BSD'ism).
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                         /* If interface is set while binding, indices
176                          * must coincide.
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                 /* Connect to link-local address requires an interface */
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 = fl.fl6_flowlabel;
199
200         /*
201          *      TCP over IPv4
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
220                 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
221
222                 if (err) {
223                         icsk->icsk_ext_hdr_len = exthdrlen;
224                         icsk->icsk_af_ops = &ipv6_specific;
225                         sk->sk_backlog_rcv = tcp_v6_do_rcv;
226                         goto failure;
227                 } else {
228                         ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF),
229                                       inet->saddr);
230                         ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF),
231                                       inet->rcv_saddr);
232                 }
233
234                 return err;
235         }
236
237         if (!ipv6_addr_any(&np->rcv_saddr))
238                 saddr = &np->rcv_saddr;
239
240         fl.proto = IPPROTO_TCP;
241         ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
242         ipv6_addr_copy(&fl.fl6_src,
243                        (saddr ? saddr : &np->saddr));
244         fl.oif = sk->sk_bound_dev_if;
245         fl.fl_ip_dport = usin->sin6_port;
246         fl.fl_ip_sport = inet->sport;
247
248         if (np->opt && np->opt->srcrt) {
249                 struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
250                 ipv6_addr_copy(&final, &fl.fl6_dst);
251                 ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
252                 final_p = &final;
253         }
254
255         err = ip6_dst_lookup(sk, &dst, &fl);
256         if (err)
257                 goto failure;
258         if (final_p)
259                 ipv6_addr_copy(&fl.fl6_dst, final_p);
260
261         if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
262                 goto failure;
263
264         if (saddr == NULL) {
265                 saddr = &fl.fl6_src;
266                 ipv6_addr_copy(&np->rcv_saddr, saddr);
267         }
268
269         /* set the source address */
270         ipv6_addr_copy(&np->saddr, saddr);
271         inet->rcv_saddr = LOOPBACK4_IPV6;
272
273         ip6_dst_store(sk, dst, NULL);
274         sk->sk_route_caps = dst->dev->features &
275                 ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
276
277         icsk->icsk_ext_hdr_len = 0;
278         if (np->opt)
279                 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
280                                           np->opt->opt_nflen);
281
282         tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
283
284         inet->dport = usin->sin6_port;
285
286         tcp_set_state(sk, TCP_SYN_SENT);
287         err = inet6_hash_connect(&tcp_death_row, sk);
288         if (err)
289                 goto late_failure;
290
291         if (!tp->write_seq)
292                 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
293                                                              np->daddr.s6_addr32,
294                                                              inet->sport,
295                                                              inet->dport);
296
297         err = tcp_connect(sk);
298         if (err)
299                 goto late_failure;
300
301         return 0;
302
303 late_failure:
304         tcp_set_state(sk, TCP_CLOSE);
305         __sk_dst_reset(sk);
306 failure:
307         inet->dport = 0;
308         sk->sk_route_caps = 0;
309         return err;
310 }
311
312 static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
313                 int type, int code, int offset, __u32 info)
314 {
315         struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
316         const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
317         struct ipv6_pinfo *np;
318         struct sock *sk;
319         int err;
320         struct tcp_sock *tp; 
321         __u32 seq;
322
323         sk = inet6_lookup(&tcp_hashinfo, &hdr->daddr, th->dest, &hdr->saddr,
324                           th->source, skb->dev->ifindex);
325
326         if (sk == NULL) {
327                 ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
328                 return;
329         }
330
331         if (sk->sk_state == TCP_TIME_WAIT) {
332                 inet_twsk_put((struct inet_timewait_sock *)sk);
333                 return;
334         }
335
336         bh_lock_sock(sk);
337         if (sock_owned_by_user(sk))
338                 NET_INC_STATS_BH(LINUX_MIB_LOCKDROPPEDICMPS);
339
340         if (sk->sk_state == TCP_CLOSE)
341                 goto out;
342
343         tp = tcp_sk(sk);
344         seq = ntohl(th->seq); 
345         if (sk->sk_state != TCP_LISTEN &&
346             !between(seq, tp->snd_una, tp->snd_nxt)) {
347                 NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
348                 goto out;
349         }
350
351         np = inet6_sk(sk);
352
353         if (type == ICMPV6_PKT_TOOBIG) {
354                 struct dst_entry *dst = NULL;
355
356                 if (sock_owned_by_user(sk))
357                         goto out;
358                 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
359                         goto out;
360
361                 /* icmp should have updated the destination cache entry */
362                 dst = __sk_dst_check(sk, np->dst_cookie);
363
364                 if (dst == NULL) {
365                         struct inet_sock *inet = inet_sk(sk);
366                         struct flowi fl;
367
368                         /* BUGGG_FUTURE: Again, it is not clear how
369                            to handle rthdr case. Ignore this complexity
370                            for now.
371                          */
372                         memset(&fl, 0, sizeof(fl));
373                         fl.proto = IPPROTO_TCP;
374                         ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
375                         ipv6_addr_copy(&fl.fl6_src, &np->saddr);
376                         fl.oif = sk->sk_bound_dev_if;
377                         fl.fl_ip_dport = inet->dport;
378                         fl.fl_ip_sport = inet->sport;
379
380                         if ((err = ip6_dst_lookup(sk, &dst, &fl))) {
381                                 sk->sk_err_soft = -err;
382                                 goto out;
383                         }
384
385                         if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
386                                 sk->sk_err_soft = -err;
387                                 goto out;
388                         }
389
390                 } else
391                         dst_hold(dst);
392
393                 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
394                         tcp_sync_mss(sk, dst_mtu(dst));
395                         tcp_simple_retransmit(sk);
396                 } /* else let the usual retransmit timer handle it */
397                 dst_release(dst);
398                 goto out;
399         }
400
401         icmpv6_err_convert(type, code, &err);
402
403         /* Might be for an request_sock */
404         switch (sk->sk_state) {
405                 struct request_sock *req, **prev;
406         case TCP_LISTEN:
407                 if (sock_owned_by_user(sk))
408                         goto out;
409
410                 req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
411                                            &hdr->saddr, inet6_iif(skb));
412                 if (!req)
413                         goto out;
414
415                 /* ICMPs are not backlogged, hence we cannot get
416                  * an established socket here.
417                  */
418                 BUG_TRAP(req->sk == NULL);
419
420                 if (seq != tcp_rsk(req)->snt_isn) {
421                         NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
422                         goto out;
423                 }
424
425                 inet_csk_reqsk_queue_drop(sk, req, prev);
426                 goto out;
427
428         case TCP_SYN_SENT:
429         case TCP_SYN_RECV:  /* Cannot happen.
430                                It can, it SYNs are crossed. --ANK */ 
431                 if (!sock_owned_by_user(sk)) {
432                         TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
433                         sk->sk_err = err;
434                         sk->sk_error_report(sk);                /* Wake people up to see the error (see connect in sock.c) */
435
436                         tcp_done(sk);
437                 } else
438                         sk->sk_err_soft = err;
439                 goto out;
440         }
441
442         if (!sock_owned_by_user(sk) && np->recverr) {
443                 sk->sk_err = err;
444                 sk->sk_error_report(sk);
445         } else
446                 sk->sk_err_soft = err;
447
448 out:
449         bh_unlock_sock(sk);
450         sock_put(sk);
451 }
452
453
454 static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
455                               struct dst_entry *dst)
456 {
457         struct inet6_request_sock *treq = inet6_rsk(req);
458         struct ipv6_pinfo *np = inet6_sk(sk);
459         struct sk_buff * skb;
460         struct ipv6_txoptions *opt = NULL;
461         struct in6_addr * final_p = NULL, final;
462         struct flowi fl;
463         int err = -1;
464
465         memset(&fl, 0, sizeof(fl));
466         fl.proto = IPPROTO_TCP;
467         ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
468         ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
469         fl.fl6_flowlabel = 0;
470         fl.oif = treq->iif;
471         fl.fl_ip_dport = inet_rsk(req)->rmt_port;
472         fl.fl_ip_sport = inet_sk(sk)->sport;
473
474         if (dst == NULL) {
475                 opt = np->opt;
476                 if (opt == NULL &&
477                     np->rxopt.bits.osrcrt == 2 &&
478                     treq->pktopts) {
479                         struct sk_buff *pktopts = treq->pktopts;
480                         struct inet6_skb_parm *rxopt = IP6CB(pktopts);
481                         if (rxopt->srcrt)
482                                 opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(pktopts->nh.raw + rxopt->srcrt));
483                 }
484
485                 if (opt && opt->srcrt) {
486                         struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
487                         ipv6_addr_copy(&final, &fl.fl6_dst);
488                         ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
489                         final_p = &final;
490                 }
491
492                 err = ip6_dst_lookup(sk, &dst, &fl);
493                 if (err)
494                         goto done;
495                 if (final_p)
496                         ipv6_addr_copy(&fl.fl6_dst, final_p);
497                 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
498                         goto done;
499         }
500
501         skb = tcp_make_synack(sk, dst, req);
502         if (skb) {
503                 struct tcphdr *th = skb->h.th;
504
505                 th->check = tcp_v6_check(th, skb->len,
506                                          &treq->loc_addr, &treq->rmt_addr,
507                                          csum_partial((char *)th, skb->len, skb->csum));
508
509                 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
510                 err = ip6_xmit(sk, skb, &fl, opt, 0);
511                 if (err == NET_XMIT_CN)
512                         err = 0;
513         }
514
515 done:
516         if (opt && opt != np->opt)
517                 sock_kfree_s(sk, opt, opt->tot_len);
518         dst_release(dst);
519         return err;
520 }
521
522 static void tcp_v6_reqsk_destructor(struct request_sock *req)
523 {
524         if (inet6_rsk(req)->pktopts)
525                 kfree_skb(inet6_rsk(req)->pktopts);
526 }
527
528 static struct request_sock_ops tcp6_request_sock_ops = {
529         .family         =       AF_INET6,
530         .obj_size       =       sizeof(struct tcp6_request_sock),
531         .rtx_syn_ack    =       tcp_v6_send_synack,
532         .send_ack       =       tcp_v6_reqsk_send_ack,
533         .destructor     =       tcp_v6_reqsk_destructor,
534         .send_reset     =       tcp_v6_send_reset
535 };
536
537 static struct timewait_sock_ops tcp6_timewait_sock_ops = {
538         .twsk_obj_size  = sizeof(struct tcp6_timewait_sock),
539         .twsk_unique    = tcp_twsk_unique,
540 };
541
542 static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
543 {
544         struct ipv6_pinfo *np = inet6_sk(sk);
545         struct tcphdr *th = skb->h.th;
546
547         if (skb->ip_summed == CHECKSUM_HW) {
548                 th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,  0);
549                 skb->csum = offsetof(struct tcphdr, check);
550         } else {
551                 th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 
552                                             csum_partial((char *)th, th->doff<<2, 
553                                                          skb->csum));
554         }
555 }
556
557
558 static void tcp_v6_send_reset(struct sk_buff *skb)
559 {
560         struct tcphdr *th = skb->h.th, *t1; 
561         struct sk_buff *buff;
562         struct flowi fl;
563
564         if (th->rst)
565                 return;
566
567         if (!ipv6_unicast_destination(skb))
568                 return; 
569
570         /*
571          * We need to grab some memory, and put together an RST,
572          * and then put it into the queue to be sent.
573          */
574
575         buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + sizeof(struct tcphdr),
576                          GFP_ATOMIC);
577         if (buff == NULL) 
578                 return;
579
580         skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + sizeof(struct tcphdr));
581
582         t1 = (struct tcphdr *) skb_push(buff,sizeof(struct tcphdr));
583
584         /* Swap the send and the receive. */
585         memset(t1, 0, sizeof(*t1));
586         t1->dest = th->source;
587         t1->source = th->dest;
588         t1->doff = sizeof(*t1)/4;
589         t1->rst = 1;
590   
591         if(th->ack) {
592                 t1->seq = th->ack_seq;
593         } else {
594                 t1->ack = 1;
595                 t1->ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin
596                                     + skb->len - (th->doff<<2));
597         }
598
599         buff->csum = csum_partial((char *)t1, sizeof(*t1), 0);
600
601         memset(&fl, 0, sizeof(fl));
602         ipv6_addr_copy(&fl.fl6_dst, &skb->nh.ipv6h->saddr);
603         ipv6_addr_copy(&fl.fl6_src, &skb->nh.ipv6h->daddr);
604
605         t1->check = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
606                                     sizeof(*t1), IPPROTO_TCP,
607                                     buff->csum);
608
609         fl.proto = IPPROTO_TCP;
610         fl.oif = inet6_iif(skb);
611         fl.fl_ip_dport = t1->dest;
612         fl.fl_ip_sport = t1->source;
613
614         /* sk = NULL, but it is safe for now. RST socket required. */
615         if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
616
617                 if (xfrm_lookup(&buff->dst, &fl, NULL, 0) >= 0) {
618                         ip6_xmit(tcp6_socket->sk, buff, &fl, NULL, 0);
619                         TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
620                         TCP_INC_STATS_BH(TCP_MIB_OUTRSTS);
621                         return;
622                 }
623         }
624
625         kfree_skb(buff);
626 }
627
628 static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts)
629 {
630         struct tcphdr *th = skb->h.th, *t1;
631         struct sk_buff *buff;
632         struct flowi fl;
633         int tot_len = sizeof(struct tcphdr);
634
635         if (ts)
636                 tot_len += 3*4;
637
638         buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
639                          GFP_ATOMIC);
640         if (buff == NULL)
641                 return;
642
643         skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
644
645         t1 = (struct tcphdr *) skb_push(buff,tot_len);
646
647         /* Swap the send and the receive. */
648         memset(t1, 0, sizeof(*t1));
649         t1->dest = th->source;
650         t1->source = th->dest;
651         t1->doff = tot_len/4;
652         t1->seq = htonl(seq);
653         t1->ack_seq = htonl(ack);
654         t1->ack = 1;
655         t1->window = htons(win);
656         
657         if (ts) {
658                 u32 *ptr = (u32*)(t1 + 1);
659                 *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
660                                (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
661                 *ptr++ = htonl(tcp_time_stamp);
662                 *ptr = htonl(ts);
663         }
664
665         buff->csum = csum_partial((char *)t1, tot_len, 0);
666
667         memset(&fl, 0, sizeof(fl));
668         ipv6_addr_copy(&fl.fl6_dst, &skb->nh.ipv6h->saddr);
669         ipv6_addr_copy(&fl.fl6_src, &skb->nh.ipv6h->daddr);
670
671         t1->check = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
672                                     tot_len, IPPROTO_TCP,
673                                     buff->csum);
674
675         fl.proto = IPPROTO_TCP;
676         fl.oif = inet6_iif(skb);
677         fl.fl_ip_dport = t1->dest;
678         fl.fl_ip_sport = t1->source;
679
680         if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
681                 if (xfrm_lookup(&buff->dst, &fl, NULL, 0) >= 0) {
682                         ip6_xmit(tcp6_socket->sk, buff, &fl, NULL, 0);
683                         TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
684                         return;
685                 }
686         }
687
688         kfree_skb(buff);
689 }
690
691 static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
692 {
693         struct inet_timewait_sock *tw = inet_twsk(sk);
694         const struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
695
696         tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
697                         tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
698                         tcptw->tw_ts_recent);
699
700         inet_twsk_put(tw);
701 }
702
703 static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req)
704 {
705         tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent);
706 }
707
708
709 static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
710 {
711         struct request_sock *req, **prev;
712         const struct tcphdr *th = skb->h.th;
713         struct sock *nsk;
714
715         /* Find possible connection requests. */
716         req = inet6_csk_search_req(sk, &prev, th->source,
717                                    &skb->nh.ipv6h->saddr,
718                                    &skb->nh.ipv6h->daddr, inet6_iif(skb));
719         if (req)
720                 return tcp_check_req(sk, skb, req, prev);
721
722         nsk = __inet6_lookup_established(&tcp_hashinfo, &skb->nh.ipv6h->saddr,
723                                          th->source, &skb->nh.ipv6h->daddr,
724                                          ntohs(th->dest), inet6_iif(skb));
725
726         if (nsk) {
727                 if (nsk->sk_state != TCP_TIME_WAIT) {
728                         bh_lock_sock(nsk);
729                         return nsk;
730                 }
731                 inet_twsk_put((struct inet_timewait_sock *)nsk);
732                 return NULL;
733         }
734
735 #if 0 /*def CONFIG_SYN_COOKIES*/
736         if (!th->rst && !th->syn && th->ack)
737                 sk = cookie_v6_check(sk, skb, &(IPCB(skb)->opt));
738 #endif
739         return sk;
740 }
741
742 /* FIXME: this is substantially similar to the ipv4 code.
743  * Can some kind of merge be done? -- erics
744  */
745 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
746 {
747         struct inet6_request_sock *treq;
748         struct ipv6_pinfo *np = inet6_sk(sk);
749         struct tcp_options_received tmp_opt;
750         struct tcp_sock *tp = tcp_sk(sk);
751         struct request_sock *req = NULL;
752         __u32 isn = TCP_SKB_CB(skb)->when;
753
754         if (skb->protocol == htons(ETH_P_IP))
755                 return tcp_v4_conn_request(sk, skb);
756
757         if (!ipv6_unicast_destination(skb))
758                 goto drop; 
759
760         /*
761          *      There are no SYN attacks on IPv6, yet...        
762          */
763         if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
764                 if (net_ratelimit())
765                         printk(KERN_INFO "TCPv6: dropping request, synflood is possible\n");
766                 goto drop;              
767         }
768
769         if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
770                 goto drop;
771
772         req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
773         if (req == NULL)
774                 goto drop;
775
776         tcp_clear_options(&tmp_opt);
777         tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
778         tmp_opt.user_mss = tp->rx_opt.user_mss;
779
780         tcp_parse_options(skb, &tmp_opt, 0);
781
782         tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
783         tcp_openreq_init(req, &tmp_opt, skb);
784
785         treq = inet6_rsk(req);
786         ipv6_addr_copy(&treq->rmt_addr, &skb->nh.ipv6h->saddr);
787         ipv6_addr_copy(&treq->loc_addr, &skb->nh.ipv6h->daddr);
788         TCP_ECN_create_request(req, skb->h.th);
789         treq->pktopts = NULL;
790         if (ipv6_opt_accepted(sk, skb) ||
791             np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
792             np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
793                 atomic_inc(&skb->users);
794                 treq->pktopts = skb;
795         }
796         treq->iif = sk->sk_bound_dev_if;
797
798         /* So that link locals have meaning */
799         if (!sk->sk_bound_dev_if &&
800             ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
801                 treq->iif = inet6_iif(skb);
802
803         if (isn == 0) 
804                 isn = tcp_v6_init_sequence(sk,skb);
805
806         tcp_rsk(req)->snt_isn = isn;
807
808         if (tcp_v6_send_synack(sk, req, NULL))
809                 goto drop;
810
811         inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
812         return 0;
813
814 drop:
815         if (req)
816                 reqsk_free(req);
817
818         TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
819         return 0; /* don't send reset */
820 }
821
822 static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
823                                           struct request_sock *req,
824                                           struct dst_entry *dst)
825 {
826         struct inet6_request_sock *treq = inet6_rsk(req);
827         struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
828         struct tcp6_sock *newtcp6sk;
829         struct inet_sock *newinet;
830         struct tcp_sock *newtp;
831         struct sock *newsk;
832         struct ipv6_txoptions *opt;
833
834         if (skb->protocol == htons(ETH_P_IP)) {
835                 /*
836                  *      v6 mapped
837                  */
838
839                 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
840
841                 if (newsk == NULL) 
842                         return NULL;
843
844                 newtcp6sk = (struct tcp6_sock *)newsk;
845                 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
846
847                 newinet = inet_sk(newsk);
848                 newnp = inet6_sk(newsk);
849                 newtp = tcp_sk(newsk);
850
851                 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
852
853                 ipv6_addr_set(&newnp->daddr, 0, 0, htonl(0x0000FFFF),
854                               newinet->daddr);
855
856                 ipv6_addr_set(&newnp->saddr, 0, 0, htonl(0x0000FFFF),
857                               newinet->saddr);
858
859                 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
860
861                 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
862                 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
863                 newnp->pktoptions  = NULL;
864                 newnp->opt         = NULL;
865                 newnp->mcast_oif   = inet6_iif(skb);
866                 newnp->mcast_hops  = skb->nh.ipv6h->hop_limit;
867
868                 /*
869                  * No need to charge this sock to the relevant IPv6 refcnt debug socks count
870                  * here, tcp_create_openreq_child now does this for us, see the comment in
871                  * that function for the gory details. -acme
872                  */
873
874                 /* It is tricky place. Until this moment IPv4 tcp
875                    worked with IPv6 icsk.icsk_af_ops.
876                    Sync it now.
877                  */
878                 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
879
880                 return newsk;
881         }
882
883         opt = np->opt;
884
885         if (sk_acceptq_is_full(sk))
886                 goto out_overflow;
887
888         if (np->rxopt.bits.osrcrt == 2 &&
889             opt == NULL && treq->pktopts) {
890                 struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts);
891                 if (rxopt->srcrt)
892                         opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr *)(treq->pktopts->nh.raw + rxopt->srcrt));
893         }
894
895         if (dst == NULL) {
896                 struct in6_addr *final_p = NULL, final;
897                 struct flowi fl;
898
899                 memset(&fl, 0, sizeof(fl));
900                 fl.proto = IPPROTO_TCP;
901                 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
902                 if (opt && opt->srcrt) {
903                         struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
904                         ipv6_addr_copy(&final, &fl.fl6_dst);
905                         ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
906                         final_p = &final;
907                 }
908                 ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
909                 fl.oif = sk->sk_bound_dev_if;
910                 fl.fl_ip_dport = inet_rsk(req)->rmt_port;
911                 fl.fl_ip_sport = inet_sk(sk)->sport;
912
913                 if (ip6_dst_lookup(sk, &dst, &fl))
914                         goto out;
915
916                 if (final_p)
917                         ipv6_addr_copy(&fl.fl6_dst, final_p);
918
919                 if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0)
920                         goto out;
921         } 
922
923         newsk = tcp_create_openreq_child(sk, req, skb);
924         if (newsk == NULL)
925                 goto out;
926
927         /*
928          * No need to charge this sock to the relevant IPv6 refcnt debug socks
929          * count here, tcp_create_openreq_child now does this for us, see the
930          * comment in that function for the gory details. -acme
931          */
932
933         ip6_dst_store(newsk, dst, NULL);
934         newsk->sk_route_caps = dst->dev->features &
935                 ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
936
937         newtcp6sk = (struct tcp6_sock *)newsk;
938         inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
939
940         newtp = tcp_sk(newsk);
941         newinet = inet_sk(newsk);
942         newnp = inet6_sk(newsk);
943
944         memcpy(newnp, np, sizeof(struct ipv6_pinfo));
945
946         ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr);
947         ipv6_addr_copy(&newnp->saddr, &treq->loc_addr);
948         ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
949         newsk->sk_bound_dev_if = treq->iif;
950
951         /* Now IPv6 options... 
952
953            First: no IPv4 options.
954          */
955         newinet->opt = NULL;
956
957         /* Clone RX bits */
958         newnp->rxopt.all = np->rxopt.all;
959
960         /* Clone pktoptions received with SYN */
961         newnp->pktoptions = NULL;
962         if (treq->pktopts != NULL) {
963                 newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
964                 kfree_skb(treq->pktopts);
965                 treq->pktopts = NULL;
966                 if (newnp->pktoptions)
967                         skb_set_owner_r(newnp->pktoptions, newsk);
968         }
969         newnp->opt        = NULL;
970         newnp->mcast_oif  = inet6_iif(skb);
971         newnp->mcast_hops = skb->nh.ipv6h->hop_limit;
972
973         /* Clone native IPv6 options from listening socket (if any)
974
975            Yes, keeping reference count would be much more clever,
976            but we make one more one thing there: reattach optmem
977            to newsk.
978          */
979         if (opt) {
980                 newnp->opt = ipv6_dup_options(newsk, opt);
981                 if (opt != np->opt)
982                         sock_kfree_s(sk, opt, opt->tot_len);
983         }
984
985         inet_csk(newsk)->icsk_ext_hdr_len = 0;
986         if (newnp->opt)
987                 inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
988                                                      newnp->opt->opt_flen);
989
990         tcp_mtup_init(newsk);
991         tcp_sync_mss(newsk, dst_mtu(dst));
992         newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
993         tcp_initialize_rcv_mss(newsk);
994
995         newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6;
996
997         __inet6_hash(&tcp_hashinfo, newsk);
998         inet_inherit_port(&tcp_hashinfo, sk, newsk);
999
1000         return newsk;
1001
1002 out_overflow:
1003         NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS);
1004 out:
1005         NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS);
1006         if (opt && opt != np->opt)
1007                 sock_kfree_s(sk, opt, opt->tot_len);
1008         dst_release(dst);
1009         return NULL;
1010 }
1011
1012 static int tcp_v6_checksum_init(struct sk_buff *skb)
1013 {
1014         if (skb->ip_summed == CHECKSUM_HW) {
1015                 if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
1016                                   &skb->nh.ipv6h->daddr,skb->csum)) {
1017                         skb->ip_summed = CHECKSUM_UNNECESSARY;
1018                         return 0;
1019                 }
1020         }
1021
1022         skb->csum = ~tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
1023                                   &skb->nh.ipv6h->daddr, 0);
1024
1025         if (skb->len <= 76) {
1026                 return __skb_checksum_complete(skb);
1027         }
1028         return 0;
1029 }
1030
1031 /* The socket must have it's spinlock held when we get
1032  * here.
1033  *
1034  * We have a potential double-lock case here, so even when
1035  * doing backlog processing we use the BH locking scheme.
1036  * This is because we cannot sleep with the original spinlock
1037  * held.
1038  */
1039 static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1040 {
1041         struct ipv6_pinfo *np = inet6_sk(sk);
1042         struct tcp_sock *tp;
1043         struct sk_buff *opt_skb = NULL;
1044
1045         /* Imagine: socket is IPv6. IPv4 packet arrives,
1046            goes to IPv4 receive handler and backlogged.
1047            From backlog it always goes here. Kerboom...
1048            Fortunately, tcp_rcv_established and rcv_established
1049            handle them correctly, but it is not case with
1050            tcp_v6_hnd_req and tcp_v6_send_reset().   --ANK
1051          */
1052
1053         if (skb->protocol == htons(ETH_P_IP))
1054                 return tcp_v4_do_rcv(sk, skb);
1055
1056         if (sk_filter(sk, skb, 0))
1057                 goto discard;
1058
1059         /*
1060          *      socket locking is here for SMP purposes as backlog rcv
1061          *      is currently called with bh processing disabled.
1062          */
1063
1064         /* Do Stevens' IPV6_PKTOPTIONS.
1065
1066            Yes, guys, it is the only place in our code, where we
1067            may make it not affecting IPv4.
1068            The rest of code is protocol independent,
1069            and I do not like idea to uglify IPv4.
1070
1071            Actually, all the idea behind IPV6_PKTOPTIONS
1072            looks not very well thought. For now we latch
1073            options, received in the last packet, enqueued
1074            by tcp. Feel free to propose better solution.
1075                                                --ANK (980728)
1076          */
1077         if (np->rxopt.all)
1078                 opt_skb = skb_clone(skb, GFP_ATOMIC);
1079
1080         if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
1081                 TCP_CHECK_TIMER(sk);
1082                 if (tcp_rcv_established(sk, skb, skb->h.th, skb->len))
1083                         goto reset;
1084                 TCP_CHECK_TIMER(sk);
1085                 if (opt_skb)
1086                         goto ipv6_pktoptions;
1087                 return 0;
1088         }
1089
1090         if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb))
1091                 goto csum_err;
1092
1093         if (sk->sk_state == TCP_LISTEN) { 
1094                 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1095                 if (!nsk)
1096                         goto discard;
1097
1098                 /*
1099                  * Queue it on the new socket if the new socket is active,
1100                  * otherwise we just shortcircuit this and continue with
1101                  * the new socket..
1102                  */
1103                 if(nsk != sk) {
1104                         if (tcp_child_process(sk, nsk, skb))
1105                                 goto reset;
1106                         if (opt_skb)
1107                                 __kfree_skb(opt_skb);
1108                         return 0;
1109                 }
1110         }
1111
1112         TCP_CHECK_TIMER(sk);
1113         if (tcp_rcv_state_process(sk, skb, skb->h.th, skb->len))
1114                 goto reset;
1115         TCP_CHECK_TIMER(sk);
1116         if (opt_skb)
1117                 goto ipv6_pktoptions;
1118         return 0;
1119
1120 reset:
1121         tcp_v6_send_reset(skb);
1122 discard:
1123         if (opt_skb)
1124                 __kfree_skb(opt_skb);
1125         kfree_skb(skb);
1126         return 0;
1127 csum_err:
1128         TCP_INC_STATS_BH(TCP_MIB_INERRS);
1129         goto discard;
1130
1131
1132 ipv6_pktoptions:
1133         /* Do you ask, what is it?
1134
1135            1. skb was enqueued by tcp.
1136            2. skb is added to tail of read queue, rather than out of order.
1137            3. socket is not in passive state.
1138            4. Finally, it really contains options, which user wants to receive.
1139          */
1140         tp = tcp_sk(sk);
1141         if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1142             !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1143                 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
1144                         np->mcast_oif = inet6_iif(opt_skb);
1145                 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
1146                         np->mcast_hops = opt_skb->nh.ipv6h->hop_limit;
1147                 if (ipv6_opt_accepted(sk, opt_skb)) {
1148                         skb_set_owner_r(opt_skb, sk);
1149                         opt_skb = xchg(&np->pktoptions, opt_skb);
1150                 } else {
1151                         __kfree_skb(opt_skb);
1152                         opt_skb = xchg(&np->pktoptions, NULL);
1153                 }
1154         }
1155
1156         if (opt_skb)
1157                 kfree_skb(opt_skb);
1158         return 0;
1159 }
1160
1161 static int tcp_v6_rcv(struct sk_buff **pskb)
1162 {
1163         struct sk_buff *skb = *pskb;
1164         struct tcphdr *th;      
1165         struct sock *sk;
1166         int ret;
1167
1168         if (skb->pkt_type != PACKET_HOST)
1169                 goto discard_it;
1170
1171         /*
1172          *      Count it even if it's bad.
1173          */
1174         TCP_INC_STATS_BH(TCP_MIB_INSEGS);
1175
1176         if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1177                 goto discard_it;
1178
1179         th = skb->h.th;
1180
1181         if (th->doff < sizeof(struct tcphdr)/4)
1182                 goto bad_packet;
1183         if (!pskb_may_pull(skb, th->doff*4))
1184                 goto discard_it;
1185
1186         if ((skb->ip_summed != CHECKSUM_UNNECESSARY &&
1187              tcp_v6_checksum_init(skb)))
1188                 goto bad_packet;
1189
1190         th = skb->h.th;
1191         TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1192         TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1193                                     skb->len - th->doff*4);
1194         TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1195         TCP_SKB_CB(skb)->when = 0;
1196         TCP_SKB_CB(skb)->flags = ipv6_get_dsfield(skb->nh.ipv6h);
1197         TCP_SKB_CB(skb)->sacked = 0;
1198
1199         sk = __inet6_lookup(&tcp_hashinfo, &skb->nh.ipv6h->saddr, th->source,
1200                             &skb->nh.ipv6h->daddr, ntohs(th->dest),
1201                             inet6_iif(skb));
1202
1203         if (!sk)
1204                 goto no_tcp_socket;
1205
1206 process:
1207         if (sk->sk_state == TCP_TIME_WAIT)
1208                 goto do_time_wait;
1209
1210         if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1211                 goto discard_and_relse;
1212
1213         if (sk_filter(sk, skb, 0))
1214                 goto discard_and_relse;
1215
1216         skb->dev = NULL;
1217
1218         bh_lock_sock(sk);
1219         ret = 0;
1220         if (!sock_owned_by_user(sk)) {
1221 #ifdef CONFIG_NET_DMA
1222                 struct tcp_sock *tp = tcp_sk(sk);
1223                 if (tp->ucopy.dma_chan)
1224                         ret = tcp_v6_do_rcv(sk, skb);
1225                 else
1226 #endif
1227                 {
1228                         if (!tcp_prequeue(sk, skb))
1229                                 ret = tcp_v6_do_rcv(sk, skb);
1230                 }
1231         } else
1232                 sk_add_backlog(sk, skb);
1233         bh_unlock_sock(sk);
1234
1235         sock_put(sk);
1236         return ret ? -1 : 0;
1237
1238 no_tcp_socket:
1239         if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1240                 goto discard_it;
1241
1242         if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1243 bad_packet:
1244                 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1245         } else {
1246                 tcp_v6_send_reset(skb);
1247         }
1248
1249 discard_it:
1250
1251         /*
1252          *      Discard frame
1253          */
1254
1255         kfree_skb(skb);
1256         return 0;
1257
1258 discard_and_relse:
1259         sock_put(sk);
1260         goto discard_it;
1261
1262 do_time_wait:
1263         if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
1264                 inet_twsk_put((struct inet_timewait_sock *)sk);
1265                 goto discard_it;
1266         }
1267
1268         if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1269                 TCP_INC_STATS_BH(TCP_MIB_INERRS);
1270                 inet_twsk_put((struct inet_timewait_sock *)sk);
1271                 goto discard_it;
1272         }
1273
1274         switch (tcp_timewait_state_process((struct inet_timewait_sock *)sk,
1275                                            skb, th)) {
1276         case TCP_TW_SYN:
1277         {
1278                 struct sock *sk2;
1279
1280                 sk2 = inet6_lookup_listener(&tcp_hashinfo,
1281                                             &skb->nh.ipv6h->daddr,
1282                                             ntohs(th->dest), inet6_iif(skb));
1283                 if (sk2 != NULL) {
1284                         struct inet_timewait_sock *tw = inet_twsk(sk);
1285                         inet_twsk_deschedule(tw, &tcp_death_row);
1286                         inet_twsk_put(tw);
1287                         sk = sk2;
1288                         goto process;
1289                 }
1290                 /* Fall through to ACK */
1291         }
1292         case TCP_TW_ACK:
1293                 tcp_v6_timewait_ack(sk, skb);
1294                 break;
1295         case TCP_TW_RST:
1296                 goto no_tcp_socket;
1297         case TCP_TW_SUCCESS:;
1298         }
1299         goto discard_it;
1300 }
1301
1302 static int tcp_v6_remember_stamp(struct sock *sk)
1303 {
1304         /* Alas, not yet... */
1305         return 0;
1306 }
1307
1308 static struct inet_connection_sock_af_ops ipv6_specific = {
1309         .queue_xmit        = inet6_csk_xmit,
1310         .send_check        = tcp_v6_send_check,
1311         .rebuild_header    = inet6_sk_rebuild_header,
1312         .conn_request      = tcp_v6_conn_request,
1313         .syn_recv_sock     = tcp_v6_syn_recv_sock,
1314         .remember_stamp    = tcp_v6_remember_stamp,
1315         .net_header_len    = sizeof(struct ipv6hdr),
1316         .setsockopt        = ipv6_setsockopt,
1317         .getsockopt        = ipv6_getsockopt,
1318         .addr2sockaddr     = inet6_csk_addr2sockaddr,
1319         .sockaddr_len      = sizeof(struct sockaddr_in6),
1320 #ifdef CONFIG_COMPAT
1321         .compat_setsockopt = compat_ipv6_setsockopt,
1322         .compat_getsockopt = compat_ipv6_getsockopt,
1323 #endif
1324 };
1325
1326 /*
1327  *      TCP over IPv4 via INET6 API
1328  */
1329
1330 static struct inet_connection_sock_af_ops ipv6_mapped = {
1331         .queue_xmit        = ip_queue_xmit,
1332         .send_check        = tcp_v4_send_check,
1333         .rebuild_header    = inet_sk_rebuild_header,
1334         .conn_request      = tcp_v6_conn_request,
1335         .syn_recv_sock     = tcp_v6_syn_recv_sock,
1336         .remember_stamp    = tcp_v4_remember_stamp,
1337         .net_header_len    = sizeof(struct iphdr),
1338         .setsockopt        = ipv6_setsockopt,
1339         .getsockopt        = ipv6_getsockopt,
1340         .addr2sockaddr     = inet6_csk_addr2sockaddr,
1341         .sockaddr_len      = sizeof(struct sockaddr_in6),
1342 #ifdef CONFIG_COMPAT
1343         .compat_setsockopt = compat_ipv6_setsockopt,
1344         .compat_getsockopt = compat_ipv6_getsockopt,
1345 #endif
1346 };
1347
1348 /* NOTE: A lot of things set to zero explicitly by call to
1349  *       sk_alloc() so need not be done here.
1350  */
1351 static int tcp_v6_init_sock(struct sock *sk)
1352 {
1353         struct inet_connection_sock *icsk = inet_csk(sk);
1354         struct tcp_sock *tp = tcp_sk(sk);
1355
1356         skb_queue_head_init(&tp->out_of_order_queue);
1357         tcp_init_xmit_timers(sk);
1358         tcp_prequeue_init(tp);
1359
1360         icsk->icsk_rto = TCP_TIMEOUT_INIT;
1361         tp->mdev = TCP_TIMEOUT_INIT;
1362
1363         /* So many TCP implementations out there (incorrectly) count the
1364          * initial SYN frame in their delayed-ACK and congestion control
1365          * algorithms that we must have the following bandaid to talk
1366          * efficiently to them.  -DaveM
1367          */
1368         tp->snd_cwnd = 2;
1369
1370         /* See draft-stevens-tcpca-spec-01 for discussion of the
1371          * initialization of these values.
1372          */
1373         tp->snd_ssthresh = 0x7fffffff;
1374         tp->snd_cwnd_clamp = ~0;
1375         tp->mss_cache = 536;
1376
1377         tp->reordering = sysctl_tcp_reordering;
1378
1379         sk->sk_state = TCP_CLOSE;
1380
1381         icsk->icsk_af_ops = &ipv6_specific;
1382         icsk->icsk_ca_ops = &tcp_init_congestion_ops;
1383         icsk->icsk_sync_mss = tcp_sync_mss;
1384         sk->sk_write_space = sk_stream_write_space;
1385         sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
1386
1387         sk->sk_sndbuf = sysctl_tcp_wmem[1];
1388         sk->sk_rcvbuf = sysctl_tcp_rmem[1];
1389
1390         atomic_inc(&tcp_sockets_allocated);
1391
1392         return 0;
1393 }
1394
1395 static int tcp_v6_destroy_sock(struct sock *sk)
1396 {
1397         tcp_v4_destroy_sock(sk);
1398         return inet6_destroy_sock(sk);
1399 }
1400
1401 /* Proc filesystem TCPv6 sock list dumping. */
1402 static void get_openreq6(struct seq_file *seq, 
1403                          struct sock *sk, struct request_sock *req, int i, int uid)
1404 {
1405         int ttd = req->expires - jiffies;
1406         struct in6_addr *src = &inet6_rsk(req)->loc_addr;
1407         struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
1408
1409         if (ttd < 0)
1410                 ttd = 0;
1411
1412         seq_printf(seq,
1413                    "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1414                    "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
1415                    i,
1416                    src->s6_addr32[0], src->s6_addr32[1],
1417                    src->s6_addr32[2], src->s6_addr32[3],
1418                    ntohs(inet_sk(sk)->sport),
1419                    dest->s6_addr32[0], dest->s6_addr32[1],
1420                    dest->s6_addr32[2], dest->s6_addr32[3],
1421                    ntohs(inet_rsk(req)->rmt_port),
1422                    TCP_SYN_RECV,
1423                    0,0, /* could print option size, but that is af dependent. */
1424                    1,   /* timers active (only the expire timer) */  
1425                    jiffies_to_clock_t(ttd), 
1426                    req->retrans,
1427                    uid,
1428                    0,  /* non standard timer */  
1429                    0, /* open_requests have no inode */
1430                    0, req);
1431 }
1432
1433 static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1434 {
1435         struct in6_addr *dest, *src;
1436         __u16 destp, srcp;
1437         int timer_active;
1438         unsigned long timer_expires;
1439         struct inet_sock *inet = inet_sk(sp);
1440         struct tcp_sock *tp = tcp_sk(sp);
1441         const struct inet_connection_sock *icsk = inet_csk(sp);
1442         struct ipv6_pinfo *np = inet6_sk(sp);
1443
1444         dest  = &np->daddr;
1445         src   = &np->rcv_saddr;
1446         destp = ntohs(inet->dport);
1447         srcp  = ntohs(inet->sport);
1448
1449         if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
1450                 timer_active    = 1;
1451                 timer_expires   = icsk->icsk_timeout;
1452         } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
1453                 timer_active    = 4;
1454                 timer_expires   = icsk->icsk_timeout;
1455         } else if (timer_pending(&sp->sk_timer)) {
1456                 timer_active    = 2;
1457                 timer_expires   = sp->sk_timer.expires;
1458         } else {
1459                 timer_active    = 0;
1460                 timer_expires = jiffies;
1461         }
1462
1463         seq_printf(seq,
1464                    "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1465                    "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %u %u %u %u %d\n",
1466                    i,
1467                    src->s6_addr32[0], src->s6_addr32[1],
1468                    src->s6_addr32[2], src->s6_addr32[3], srcp,
1469                    dest->s6_addr32[0], dest->s6_addr32[1],
1470                    dest->s6_addr32[2], dest->s6_addr32[3], destp,
1471                    sp->sk_state, 
1472                    tp->write_seq-tp->snd_una, tp->rcv_nxt-tp->copied_seq,
1473                    timer_active,
1474                    jiffies_to_clock_t(timer_expires - jiffies),
1475                    icsk->icsk_retransmits,
1476                    sock_i_uid(sp),
1477                    icsk->icsk_probes_out,
1478                    sock_i_ino(sp),
1479                    atomic_read(&sp->sk_refcnt), sp,
1480                    icsk->icsk_rto,
1481                    icsk->icsk_ack.ato,
1482                    (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong,
1483                    tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh
1484                    );
1485 }
1486
1487 static void get_timewait6_sock(struct seq_file *seq, 
1488                                struct inet_timewait_sock *tw, int i)
1489 {
1490         struct in6_addr *dest, *src;
1491         __u16 destp, srcp;
1492         struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
1493         int ttd = tw->tw_ttd - jiffies;
1494
1495         if (ttd < 0)
1496                 ttd = 0;
1497
1498         dest = &tw6->tw_v6_daddr;
1499         src  = &tw6->tw_v6_rcv_saddr;
1500         destp = ntohs(tw->tw_dport);
1501         srcp  = ntohs(tw->tw_sport);
1502
1503         seq_printf(seq,
1504                    "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1505                    "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
1506                    i,
1507                    src->s6_addr32[0], src->s6_addr32[1],
1508                    src->s6_addr32[2], src->s6_addr32[3], srcp,
1509                    dest->s6_addr32[0], dest->s6_addr32[1],
1510                    dest->s6_addr32[2], dest->s6_addr32[3], destp,
1511                    tw->tw_substate, 0, 0,
1512                    3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
1513                    atomic_read(&tw->tw_refcnt), tw);
1514 }
1515
1516 #ifdef CONFIG_PROC_FS
1517 static int tcp6_seq_show(struct seq_file *seq, void *v)
1518 {
1519         struct tcp_iter_state *st;
1520
1521         if (v == SEQ_START_TOKEN) {
1522                 seq_puts(seq,
1523                          "  sl  "
1524                          "local_address                         "
1525                          "remote_address                        "
1526                          "st tx_queue rx_queue tr tm->when retrnsmt"
1527                          "   uid  timeout inode\n");
1528                 goto out;
1529         }
1530         st = seq->private;
1531
1532         switch (st->state) {
1533         case TCP_SEQ_STATE_LISTENING:
1534         case TCP_SEQ_STATE_ESTABLISHED:
1535                 get_tcp6_sock(seq, v, st->num);
1536                 break;
1537         case TCP_SEQ_STATE_OPENREQ:
1538                 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
1539                 break;
1540         case TCP_SEQ_STATE_TIME_WAIT:
1541                 get_timewait6_sock(seq, v, st->num);
1542                 break;
1543         }
1544 out:
1545         return 0;
1546 }
1547
1548 static struct file_operations tcp6_seq_fops;
1549 static struct tcp_seq_afinfo tcp6_seq_afinfo = {
1550         .owner          = THIS_MODULE,
1551         .name           = "tcp6",
1552         .family         = AF_INET6,
1553         .seq_show       = tcp6_seq_show,
1554         .seq_fops       = &tcp6_seq_fops,
1555 };
1556
1557 int __init tcp6_proc_init(void)
1558 {
1559         return tcp_proc_register(&tcp6_seq_afinfo);
1560 }
1561
1562 void tcp6_proc_exit(void)
1563 {
1564         tcp_proc_unregister(&tcp6_seq_afinfo);
1565 }
1566 #endif
1567
1568 struct proto tcpv6_prot = {
1569         .name                   = "TCPv6",
1570         .owner                  = THIS_MODULE,
1571         .close                  = tcp_close,
1572         .connect                = tcp_v6_connect,
1573         .disconnect             = tcp_disconnect,
1574         .accept                 = inet_csk_accept,
1575         .ioctl                  = tcp_ioctl,
1576         .init                   = tcp_v6_init_sock,
1577         .destroy                = tcp_v6_destroy_sock,
1578         .shutdown               = tcp_shutdown,
1579         .setsockopt             = tcp_setsockopt,
1580         .getsockopt             = tcp_getsockopt,
1581         .sendmsg                = tcp_sendmsg,
1582         .recvmsg                = tcp_recvmsg,
1583         .backlog_rcv            = tcp_v6_do_rcv,
1584         .hash                   = tcp_v6_hash,
1585         .unhash                 = tcp_unhash,
1586         .get_port               = tcp_v6_get_port,
1587         .enter_memory_pressure  = tcp_enter_memory_pressure,
1588         .sockets_allocated      = &tcp_sockets_allocated,
1589         .memory_allocated       = &tcp_memory_allocated,
1590         .memory_pressure        = &tcp_memory_pressure,
1591         .orphan_count           = &tcp_orphan_count,
1592         .sysctl_mem             = sysctl_tcp_mem,
1593         .sysctl_wmem            = sysctl_tcp_wmem,
1594         .sysctl_rmem            = sysctl_tcp_rmem,
1595         .max_header             = MAX_TCP_HEADER,
1596         .obj_size               = sizeof(struct tcp6_sock),
1597         .twsk_prot              = &tcp6_timewait_sock_ops,
1598         .rsk_prot               = &tcp6_request_sock_ops,
1599 #ifdef CONFIG_COMPAT
1600         .compat_setsockopt      = compat_tcp_setsockopt,
1601         .compat_getsockopt      = compat_tcp_getsockopt,
1602 #endif
1603 };
1604
1605 static struct inet6_protocol tcpv6_protocol = {
1606         .handler        =       tcp_v6_rcv,
1607         .err_handler    =       tcp_v6_err,
1608         .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
1609 };
1610
1611 static struct inet_protosw tcpv6_protosw = {
1612         .type           =       SOCK_STREAM,
1613         .protocol       =       IPPROTO_TCP,
1614         .prot           =       &tcpv6_prot,
1615         .ops            =       &inet6_stream_ops,
1616         .capability     =       -1,
1617         .no_check       =       0,
1618         .flags          =       INET_PROTOSW_PERMANENT |
1619                                 INET_PROTOSW_ICSK,
1620 };
1621
1622 void __init tcpv6_init(void)
1623 {
1624         /* register inet6 protocol */
1625         if (inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP) < 0)
1626                 printk(KERN_ERR "tcpv6_init: Could not register protocol\n");
1627         inet6_register_protosw(&tcpv6_protosw);
1628
1629         if (inet_csk_ctl_sock_create(&tcp6_socket, PF_INET6, SOCK_RAW,
1630                                      IPPROTO_TCP) < 0)
1631                 panic("Failed to create the TCPv6 control socket.\n");
1632 }