Annotation of linux/net/tcp/tcp.c, revision 1.1

1.1     ! root        1:  /* tcp.c */
        !             2:  /*
        !             3:      Copyright (C) 1992  Ross Biro
        !             4: 
        !             5:      This program is free software; you can redistribute it and/or modify
        !             6:      it under the terms of the GNU General Public License as published by
        !             7:      the Free Software Foundation; either version 2, or (at your option)
        !             8:      any later version.
        !             9: 
        !            10:      This program is distributed in the hope that it will be useful,
        !            11:      but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            12:      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            13:      GNU General Public License for more details.
        !            14: 
        !            15:      You should have received a copy of the GNU General Public License
        !            16:      along with this program; if not, write to the Free Software
        !            17:      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
        !            18: 
        !            19:      The Author may be reached as [email protected] or
        !            20:      C/O Department of Mathematics; Stanford University; Stanford, CA 94305
        !            21:  */
        !            22: 
        !            23: #include <linux/types.h>
        !            24: #include <linux/sched.h>
        !            25: #include <linux/mm.h>
        !            26: #include <asm/memory.h>
        !            27: #include <linux/socket.h>
        !            28: #include <netinet/in.h>
        !            29: #include <linux/fcntl.h>
        !            30: #include "timer.h"
        !            31: #include "ip.h"
        !            32: #include "icmp.h"
        !            33: #include "tcp.h"
        !            34: #include "sock.h"
        !            35: #include <linux/errno.h>
        !            36: #include <linux/timer.h>
        !            37: #include <asm/system.h>
        !            38: #include <asm/segment.h>
        !            39: /* #include <signal.h>*/
        !            40: #include "../kern_sock.h" /* for PRINTK */
        !            41: 
        !            42: #define tmax(a,b) (before ((a),(b)) ? (b) : (a))
        !            43: #define swap(a,b) {unsigned long c; c=a; a=b; b=c;}
        !            44: 
        !            45: extern struct proto tcp_prot;
        !            46: 
        !            47: static  int 
        !            48: min (unsigned int a, unsigned int b)
        !            49: {
        !            50:    if (a < b) return (a);
        !            51:    return (b);
        !            52: }
        !            53: 
        !            54: void
        !            55: print_th (struct tcp_header *th)
        !            56: {
        !            57:    unsigned char *ptr;
        !            58:    ptr = (unsigned char *)(th + 1);
        !            59:    PRINTK ("tcp header:\n");
        !            60:    PRINTK ("  source=%d, dest=%d, seq =%d, ack_seq = %d\n",
        !            61:           net16(th->source), net16(th->dest), net32(th->seq),
        !            62:           net32(th->ack_seq));
        !            63:    PRINTK ("  fin=%d, syn=%d, rst=%d, psh=%d, ack=%d, urg=%d res1=%d res2=%d\n"
        !            64:           ,th->fin, th->syn, th->rst, th->psh, th->ack, th->urg,
        !            65:           th->res1, th->res2);
        !            66:    PRINTK ("  window = %d, check = %d urg_ptr = %d\n",
        !            67:           net16(th->window), net16(th->check), net16(th->urg_ptr));
        !            68:    PRINTK ("  doff = %d\n",th->doff);
        !            69:    PRINTK ("options = %d %d %d %d\n", ptr[0], ptr[1], ptr[2], ptr[3]);
        !            70:  }
        !            71: 
        !            72:  /* This routine grabs the first thing off of a rcv queue. */
        !            73: static  struct sk_buff *
        !            74: get_firstr(volatile struct sock *sk)
        !            75: {
        !            76:    struct sk_buff *skb;
        !            77:    skb = sk->rqueue;
        !            78:    if (skb == NULL) return (NULL);
        !            79:    sk->rqueue = skb->next;
        !            80:    if (sk->rqueue == skb)
        !            81:      {
        !            82:        sk->rqueue = NULL;
        !            83:      }
        !            84:    else
        !            85:      {
        !            86:        sk->rqueue->prev=skb->prev;
        !            87:        sk->rqueue->prev->next = sk->rqueue;
        !            88:      }
        !            89:    return (skb);
        !            90: }
        !            91: 
        !            92: static  long
        !            93: diff (unsigned long seq1, unsigned long seq2)
        !            94: {
        !            95:    long d;
        !            96:    d=seq1-seq2;
        !            97:    if (d > 0) return (d);
        !            98:    /* I hope this returns what I want. */
        !            99:    return (~d+1);
        !           100: }
        !           101: 
        !           102:  /* enter the time wait state. */
        !           103: static  void
        !           104: tcp_time_wait (volatile struct sock *sk)
        !           105: {
        !           106:    sk->state = TCP_TIME_WAIT;
        !           107:    sk->time_wait.len = TCP_TIMEWAIT_LEN;
        !           108:    sk->timeout = TIME_CLOSE;
        !           109:    reset_timer ((struct timer *)&sk->time_wait);
        !           110: }
        !           111: 
        !           112: static void
        !           113: tcp_retransmit (volatile struct sock *sk, int all)
        !           114: {
        !           115:    if (all) 
        !           116:      {
        !           117:        ip_retransmit (sk, all);
        !           118:        return;
        !           119:      }
        !           120:    sk->rtt *= 2; /* exponential back off. */
        !           121:    if (sk->cong_window > 1)
        !           122:      sk->cong_window = sk->cong_window / 2;
        !           123:    sk->exp_growth = 0;
        !           124: 
        !           125:    /* do the actuall retransmit. */
        !           126:    ip_retransmit (sk, all);
        !           127:    
        !           128: }
        !           129: 
        !           130: /* this routine is called by the icmp module when it gets some
        !           131:    sort of error condition.  If err < 0 then the socket should
        !           132:    be closed and the error returned to the user.  If err > 0
        !           133:    it's just the icmp type << 8 | icmp code.  
        !           134:    header points to the first 8 bytes of the tcp header.  We need
        !           135:    to find the appropriate port. */
        !           136: 
        !           137: void
        !           138: tcp_err (int err, unsigned char *header, unsigned long daddr,
        !           139:         unsigned long saddr, struct ip_protocol *protocol)
        !           140: {
        !           141:    struct tcp_header *th;
        !           142:    volatile struct sock *sk;
        !           143:    
        !           144:    th = (struct tcp_header *)header;
        !           145:    sk = get_sock (&tcp_prot, net16(th->dest), saddr, th->source, daddr);
        !           146: 
        !           147:    if (sk == NULL) return;
        !           148: 
        !           149:    if (err & 0xff00 == (ICMP_SOURCE_QUENCH << 8))
        !           150:      {
        !           151:        /* for now we will just trigger a linear backoff. The slow start
        !           152:           code should cause a real backoff here. */
        !           153: 
        !           154:        if (sk->cong_window > 1)
        !           155:          sk->cong_window --;
        !           156: 
        !           157:        return;
        !           158:      }
        !           159: 
        !           160:    sk->err = icmp_err_convert[err & 0xff].errno;
        !           161:    if (icmp_err_convert[err & 0xff].fatal)
        !           162:      {
        !           163:        if (sk->state != TCP_ESTABLISHED)
        !           164:          sk->state = TCP_CLOSE;
        !           165:        sk->prot->close(sk, 0);
        !           166:      }
        !           167: 
        !           168:    return;
        !           169:    
        !           170: }
        !           171: 
        !           172: static int
        !           173: tcp_select (volatile struct sock *sk, int sel_type, select_table *wait)
        !           174: {
        !           175:   switch (sel_type)
        !           176:     {
        !           177:     case SEL_IN:
        !           178:        select_wait (sk->sleep, wait);
        !           179:        if (sk->rqueue != NULL &&
        !           180:           (between (sk->copied_seq, sk->rqueue->next->h.th->seq - 1,
        !           181:                     sk->rqueue->next->h.th->seq + sk->rqueue->next->len) ||
        !           182:            sk->state == TCP_LISTEN))
        !           183:         {
        !           184:            return (1);
        !           185:         }
        !           186: 
        !           187:       switch (sk->state)
        !           188:        {
        !           189:        case TCP_LISTEN:
        !           190:        case TCP_ESTABLISHED:
        !           191:        case TCP_SYN_SENT:
        !           192:        case TCP_SYN_RECV:
        !           193:           return (0);
        !           194:        default:
        !           195:           return (1);
        !           196:        }
        !           197: 
        !           198:     case SEL_OUT:
        !           199:        select_wait (sk->sleep, wait);
        !           200:        if (sk->state != TCP_ESTABLISHED) return (1);
        !           201:       /* hack so it will probably be able to write something
        !           202:         if it says it's ok to write. */
        !           203:       if (sk->prot->wspace(sk) >= MIN_WRITE_SPACE) return (1);
        !           204:       return (0);
        !           205: 
        !           206:     case SEL_EX:
        !           207:       select_wait(sk->sleep,wait);
        !           208:       if (sk->err) return (1);
        !           209:       if (sk->state == TCP_FIN_WAIT1 ||
        !           210:          sk->state == TCP_FIN_WAIT2 ||
        !           211:          sk->state == TCP_TIME_WAIT ||
        !           212:          sk->state == TCP_LAST_ACK)
        !           213:        return (1);
        !           214:       return (0);
        !           215:     }
        !           216:   return (0);
        !           217: }
        !           218: 
        !           219: static int
        !           220: tcp_ioctl (volatile struct sock *sk, int cmd, unsigned long arg)
        !           221: {
        !           222:    switch (cmd)
        !           223:      {
        !           224:        default:
        !           225:        return (-EINVAL);
        !           226: #if 0
        !           227:        case SIOCATMARK:
        !           228:        /* try to figure out if we need to read some urgent data. */
        !           229:        if (sk->rqueue && sk->rqueue->next->th.urg)
        !           230:          {
        !           231:             int offset;
        !           232:             struct sk_buff *skb;
        !           233:             skb = sk->rqueue->next;
        !           234:             offset = sk->copied_seq +1 - skb->th.seq - skb->th.syn;
        !           235:             /* now we know we are at the urgent data. */
        !           236:             if (offset >= skb->len)
        !           237:               {
        !           238:                  verify_area ((void *)arg, sizeof (int));
        !           239:                  put_fs_long(1, (unsigned long *)arg);
        !           240:                  return (0);
        !           241:               }
        !           242:          }
        !           243:        verify_area ((void *)arg, sizeof (int));
        !           244:        put_fs_long(0, (unsigned long *)arg);
        !           245:        return (0);
        !           246: #endif
        !           247:      }
        !           248: }
        !           249: 
        !           250: 
        !           251: /* this routine computes a tcp checksum */
        !           252: static  unsigned short
        !           253: tcp_check (struct tcp_header *th, int len, unsigned long saddr,
        !           254:           unsigned long daddr)
        !           255: {     
        !           256:    unsigned long sum;
        !           257:    
        !           258:    if (saddr == 0) saddr = MY_IP_ADDR;
        !           259:    print_th (th);
        !           260:    __asm__("\t addl %%ecx,%%ebx\n"
        !           261:           "\t adcl %%edx,%%ebx\n"
        !           262:           "\t adcl $0, %%ebx\n"
        !           263:           : "=b" (sum)
        !           264:           : "0" (daddr), "c" (saddr), "d" ((net16(len) << 16) + IP_TCP*256)
        !           265:           : "cx","bx","dx" );
        !           266:    
        !           267:    if (len > 3)
        !           268:      {
        !           269:        __asm__(
        !           270:                "\tclc\n"
        !           271:                "1:\n"
        !           272:                "\t lodsl\n"
        !           273:                "\t adcl %%eax, %%ebx\n"
        !           274:                "\t loop 1b\n"
        !           275:                "\t adcl $0, %%ebx\n"
        !           276:                : "=b" (sum) , "=S" (th)
        !           277:                : "0" (sum), "c" (len/4) ,"1" (th)
        !           278:                : "ax", "cx", "bx", "si" );
        !           279:      }
        !           280:    
        !           281:    /* convert from 32 bits to 16 bits. */
        !           282:    __asm__(
        !           283:           "\t movl %%ebx, %%ecx\n"
        !           284:           "\t shrl $16,%%ecx\n"
        !           285:           "\t addw %%cx, %%bx\n"
        !           286:           "\t adcw $0, %%bx\n"
        !           287:           : "=b" (sum)
        !           288:           : "0" (sum)
        !           289:           : "bx", "cx");
        !           290:    
        !           291:    /* check for an extra word. */
        !           292:    if ((len & 2) != 0)
        !           293:      {
        !           294:        __asm__("\t lodsw\n"
        !           295:                "\t addw %%ax,%%bx\n"
        !           296:                "\t adcw $0, %%bx\n"
        !           297:                : "=b" (sum), "=S" (th)
        !           298:                : "0" (sum) ,"1" (th)
        !           299:                : "si", "ax", "bx");
        !           300:      }
        !           301:    
        !           302:    /* now check for the extra byte. */
        !           303:    if ((len & 1) != 0)
        !           304:      {
        !           305:        __asm__("\t lodsb\n"
        !           306:                "\t movb $0,%%ah\n"
        !           307:                "\t addw %%ax,%%bx\n"
        !           308:                "\t adcw $0, %%bx\n"
        !           309:                : "=b" (sum)
        !           310:                : "0" (sum) ,"S" (th)
        !           311:                : "si", "ax", "bx");
        !           312:      }
        !           313:    
        !           314:    /* we only want the bottom 16 bits, but we never cleared
        !           315:       the top 16. */
        !           316:    return ((~sum) & 0xffff);
        !           317: }
        !           318: 
        !           319: 
        !           320: static  void
        !           321: tcp_send_check (struct tcp_header *th, unsigned long saddr, 
        !           322:                 unsigned long daddr, int len, volatile struct sock *sk)
        !           323:  {
        !           324: 
        !           325:    th->check = 0;
        !           326:    if (sk && sk->no_check) return;
        !           327:    th->check = tcp_check (th, len, saddr, daddr);
        !           328:    return;
        !           329: }
        !           330: 
        !           331:  /* This routine sends an ack and also updates the window. */
        !           332:  static  void
        !           333:  tcp_send_ack (unsigned long sequence, unsigned long ack,
        !           334:               volatile struct sock *sk,
        !           335:               struct tcp_header *th, unsigned long daddr)
        !           336:  {
        !           337:    struct sk_buff *buff;
        !           338:    struct tcp_header *t1;
        !           339:    struct device *dev=NULL;
        !           340:    int tmp;
        !           341: 
        !           342:    /* we need to grab some memory, and put together an ack, and then
        !           343:       put it into the queue to be sent. */
        !           344: 
        !           345:    buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1);
        !           346:    if (buff == NULL) 
        !           347:      {
        !           348:        /* force it to send an ack. */
        !           349:        sk->ack_backlog++;
        !           350:        if (sk->timeout != TIME_WRITE && sk->state < TCP_CLOSING)
        !           351:          {
        !           352:             sk->timeout = TIME_WRITE;
        !           353:             sk->time_wait.len = 10; /* got to do it quickly. */
        !           354:             reset_timer ((struct timer *)&sk->time_wait);
        !           355:          }
        !           356:        return;
        !           357:      }
        !           358: 
        !           359:    buff->mem_addr = buff;
        !           360:    buff->mem_len = MAX_ACK_SIZE;
        !           361:    buff->len=sizeof (struct tcp_header);
        !           362:    buff->sk = sk;
        !           363:    t1 = (struct tcp_header *)(buff + 1);
        !           364:    /* put in the ip_header and routing stuff. */
        !           365:    tmp = sk->prot->build_header (buff, sk->saddr, daddr, &dev,
        !           366:                                 IP_TCP, sk->opt, MAX_ACK_SIZE);
        !           367:    if (tmp < 0)
        !           368:      {
        !           369:        sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
        !           370:        return;
        !           371:      }
        !           372:    buff->len += tmp;
        !           373:    t1 = (struct tcp_header *)((char *)t1 +tmp);
        !           374: 
        !           375:    memcpy (t1, th, sizeof (*t1)); /* this should probably be removed. */
        !           376: 
        !           377:    /* swap the send and the receive. */
        !           378:    t1->dest = th->source;
        !           379:    t1->source = th->dest;
        !           380:    t1->seq = net32(sequence);
        !           381:    t1->ack = 1;
        !           382:    sk->window = sk->prot->rspace(sk);
        !           383:    t1->window = net16(sk->window);
        !           384:    t1->res1=0;
        !           385:    t1->res2=0;
        !           386:    t1->rst = 0;
        !           387:    t1->urg = 0;
        !           388:    t1->syn = 0;
        !           389:    t1->psh = 0;
        !           390:    t1->fin = 0;
        !           391:    if (ack == sk->acked_seq)
        !           392:      {
        !           393:        sk->ack_backlog = 0;
        !           394:        sk->bytes_rcv = 0;
        !           395:        sk->ack_timed = 0;
        !           396:        if (sk->send_head == NULL &&
        !           397:            sk->wfront == NULL)
        !           398:          {
        !           399:             delete_timer((struct timer *)&sk->time_wait);
        !           400:             sk->timeout = 0;
        !           401:          }
        !           402:        
        !           403:      }
        !           404:    t1->ack_seq = net32(ack);
        !           405:    t1->doff = sizeof (*t1)/4;
        !           406:    tcp_send_check (t1, sk->saddr, daddr, sizeof (*t1), sk);
        !           407:    sk->prot->queue_xmit(sk, dev, buff, 1);
        !           408: }
        !           409: 
        !           410: /* this routine builds a generic tcp header. */
        !           411: static  int
        !           412: tcp_build_header(struct tcp_header *th, volatile struct sock *sk, int push)
        !           413: {
        !           414: 
        !           415:  /* want to get rid of this. */
        !           416:   memcpy (th,(void *) &(sk->dummy_th), sizeof (*th));
        !           417:   th->seq = net32(sk->send_seq);
        !           418:   th->psh = (push == 0) ? 1 : 0;
        !           419:   th->doff = sizeof (*th)/4;
        !           420:   th->ack = 1;
        !           421:   th->fin = 0;
        !           422:   sk->ack_backlog = 0;
        !           423:   sk->bytes_rcv = 0;
        !           424:   sk->ack_timed = 0;
        !           425:   th->ack_seq = net32(sk->acked_seq);
        !           426:   sk->window = sk->prot->rspace(sk);
        !           427:   th->window = net16(sk->window);
        !           428: 
        !           429:   return (sizeof (*th));
        !           430: }
        !           431: 
        !           432: /* This routine copies from a user buffer into a socket, and starts
        !           433:    the transmit system. */
        !           434: 
        !           435: static int
        !           436: tcp_write(volatile struct sock *sk, unsigned char *from,
        !           437:          int len, int nonblock, unsigned flags)
        !           438: {
        !           439:   int copied=0;
        !           440:   int copy;
        !           441:   int tmp;
        !           442:   struct sk_buff *skb;
        !           443:   unsigned char *buff;
        !           444:   struct proto *prot;
        !           445:   struct device *dev=NULL;
        !           446: 
        !           447:   PRINTK ("in TCP_WRITE sk = %X:\n",sk);
        !           448:   print_sk (sk);
        !           449: 
        !           450:   sk->inuse = 1; /* no one else will use this socket. */
        !           451:   prot = sk->prot;
        !           452:   while (len > 0)
        !           453:     {
        !           454:        /* first thing we do is make sure that we are established. */    
        !           455: 
        !           456:       while (sk->state != TCP_ESTABLISHED)
        !           457:        {
        !           458:          if (sk->state != TCP_SYN_SENT &&
        !           459:              sk->state != TCP_SYN_RECV)
        !           460:           {
        !           461:              release_sock (sk);
        !           462:              if (sk->keepopen)
        !           463:                {
        !           464:                    send_sig (SIGPIPE, current, 0);
        !           465:                    return (-EINTR);
        !           466:                }
        !           467:              if (copied) return (copied);
        !           468:              if (sk->err) return (-sk->err);
        !           469:              return (-ENOTCONN);
        !           470:            }
        !           471: 
        !           472:          if (nonblock)
        !           473:            {
        !           474:              release_sock (sk);
        !           475:              return (-EAGAIN);
        !           476:            }
        !           477: 
        !           478:          /* now here is a race condition.
        !           479:             release_sock could cause the connection to
        !           480:             enter the established mode, if that is the
        !           481:             case, then we will block here for ever, because
        !           482:             we will have gotten our wakeup call before we
        !           483:             go to sleep. */
        !           484:          release_sock (sk);
        !           485:          cli();
        !           486:          if (sk->state != TCP_ESTABLISHED)
        !           487:            {
        !           488:              interruptible_sleep_on (sk->sleep);
        !           489:              if (current->signal & ~current->blocked)
        !           490:                {
        !           491:                   sti();
        !           492:                   if (copied) return (copied);
        !           493:                   return (-ERESTARTSYS);
        !           494:                }
        !           495:            }
        !           496:          sti();
        !           497:          sk->inuse = 1;
        !           498:        }
        !           499:       /* we also need to worry about the window.  The smallest we
        !           500:         will send is about 200 bytes. */
        !           501: 
        !           502:       copy = min (sk->mtu, diff(sk->window_seq, sk->send_seq));
        !           503:       if (copy < 200) copy = sk->mtu;
        !           504:       copy = min (copy, len);
        !           505: 
        !           506:       skb=prot->wmalloc (sk, copy + prot->max_header+sizeof (*skb),0);
        !           507: 
        !           508:       /* if we didn't get any memory, we need to sleep. */
        !           509:       if (skb == NULL)
        !           510:        {
        !           511:          if (nonblock ||  copied)
        !           512:            {
        !           513:              break;
        !           514:            }
        !           515:          /* here is another race condition. */
        !           516:          tmp = sk->wmem_alloc;
        !           517:          release_sock (sk);
        !           518:          /* again we will try to avoid it. */
        !           519:          cli ();
        !           520:          if (tmp <= sk->wmem_alloc)
        !           521:            {
        !           522:              interruptible_sleep_on (sk->sleep);
        !           523:              if (current->signal & ~current->blocked)
        !           524:                {
        !           525:                   sti();
        !           526:                   if (copied) return (copied);
        !           527:                   return (-ERESTARTSYS);
        !           528:                }
        !           529:            }
        !           530:          sti();
        !           531:          sk->inuse = 1;
        !           532:          continue;
        !           533:        }
        !           534:       skb->mem_addr = skb;
        !           535:       skb->mem_len = copy+prot->max_header+sizeof (*skb);
        !           536:       skb->len = 0;
        !           537:       skb->sk = sk;
        !           538:       buff =(unsigned char *)( skb+1);
        !           539:        /* we need to optimize this.  Perhaps some hints here
        !           540:          would be good. */
        !           541: 
        !           542:       tmp = prot->build_header (skb, sk->saddr, sk->daddr, &dev,
        !           543:                                IP_TCP, sk->opt, skb->mem_len);
        !           544:       if (tmp < 0 )
        !           545:        {
        !           546:          prot->wfree (sk, skb->mem_addr, skb->mem_len);
        !           547:          release_sock (sk);
        !           548:          return (tmp);
        !           549:        }
        !           550:       skb->len += tmp;
        !           551:       skb->dev = dev;
        !           552:       buff+=tmp;
        !           553:       tmp = tcp_build_header((struct tcp_header *)buff, sk, len-copy);
        !           554:       if (tmp < 0)
        !           555:        {
        !           556:          prot->wfree (sk, skb->mem_addr, skb->mem_len);
        !           557:          release_sock (sk);
        !           558:          return (tmp);
        !           559:        }
        !           560: 
        !           561:       if (flags & MSG_OOB)
        !           562:        {
        !           563:                ((struct tcp_header *)buff)->urg = 1;
        !           564:                ((struct tcp_header *)buff)->urg_ptr = copy;
        !           565:        }
        !           566:       skb->len += tmp;
        !           567:       memcpy_fromfs (buff+tmp, from, copy);
        !           568: 
        !           569:       tcp_send_check ((struct tcp_header *)buff, sk->saddr, sk->daddr,
        !           570:                       copy +sizeof (struct tcp_header), sk);
        !           571: 
        !           572:       from += copy;
        !           573:       copied += copy;
        !           574:       len -= copy;
        !           575:       skb->len += copy;
        !           576:       skb->free = 0;
        !           577:       sk->send_seq += copy;
        !           578:       skb->h.seq = sk->send_seq;
        !           579:       if (after (sk->send_seq , sk->window_seq) ||
        !           580:          sk->packets_out >= sk->cong_window)
        !           581:        {
        !           582:          PRINTK ("sk->cong_window = %d, sk->packets_out = %d\n",
        !           583:                  sk->cong_window, sk->packets_out);
        !           584:          PRINTK ("sk->send_seq = %d, sk->window_seq = %d\n",
        !           585:                  sk->send_seq, sk->window_seq);
        !           586:          skb->next = NULL;
        !           587:          if (sk->wback == NULL)
        !           588:            {
        !           589:              sk->wfront=skb;
        !           590:            }
        !           591:          else
        !           592:            {
        !           593:              sk->wback->next = skb;
        !           594:            }
        !           595:          sk->wback = skb;
        !           596:        }
        !           597:       else
        !           598:        {
        !           599:          prot->queue_xmit (sk, dev, skb,0);
        !           600:        }
        !           601:     }
        !           602:   sk->err = 0;
        !           603:   release_sock (sk);
        !           604:   return (copied);
        !           605: }
        !           606: 
        !           607: 
        !           608: static  void
        !           609: tcp_read_wakeup(volatile struct sock *sk)
        !           610: {
        !           611:   int tmp;
        !           612:   struct device *dev = NULL;
        !           613:   struct tcp_header *t1;
        !           614:   struct sk_buff *buff;
        !           615: 
        !           616:   if (!sk->ack_backlog ) return;
        !           617:   PRINTK ("in tcp read wakeup\n");
        !           618:   /* we need to put code here to prevent this routine from being called. */
        !           619:   /* being called once in a while is ok, so only check if this is the
        !           620:      second time in a row. */
        !           621: 
        !           622:   /* we need to grab some memory, and put together an ack, and then
        !           623:      put it into the queue to be sent. */
        !           624: 
        !           625:   buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1);
        !           626:   if (buff == NULL) 
        !           627:     {
        !           628:        /* try again real soon. */
        !           629:        sk->timeout = TIME_WRITE;
        !           630:        sk->time_wait.len = 10;
        !           631:        reset_timer((struct timer *) &sk->time_wait);
        !           632:        return;
        !           633:     }
        !           634: 
        !           635:   buff->mem_addr = buff;
        !           636:   buff->mem_len = MAX_ACK_SIZE;
        !           637:   buff->len=sizeof (struct tcp_header);
        !           638:   buff->sk = sk;
        !           639: 
        !           640:   /* put in the ip_header and routing stuff. */
        !           641:   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
        !           642:                                IP_TCP, sk->opt, MAX_ACK_SIZE);
        !           643:   if (tmp < 0)
        !           644:     {
        !           645:       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
        !           646:       return;
        !           647:     }
        !           648: 
        !           649:   buff->len += tmp;
        !           650:   t1 = (struct tcp_header *)((char *)(buff+1) +tmp);
        !           651: 
        !           652:   memcpy (t1,(void *) &sk->dummy_th, sizeof (*t1));
        !           653:   t1->seq = net32(sk->send_seq);
        !           654:   t1->ack = 1;
        !           655:   t1->res1=0;
        !           656:   t1->res2=0;
        !           657:   t1->rst = 0;
        !           658:   t1->urg = 0;
        !           659:   t1->syn = 0;
        !           660:   t1->psh = 0;
        !           661:   sk->ack_backlog = 0;
        !           662:   sk->bytes_rcv = 0;
        !           663:   sk->window = sk->prot->rspace(sk);
        !           664:   t1->window = net16(sk->window);
        !           665:   t1->ack_seq = net32(sk->acked_seq);
        !           666:   t1->doff = sizeof (*t1)/4;
        !           667:   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
        !           668:   sk->prot->queue_xmit(sk, dev, buff, 1);
        !           669: }
        !           670: 
        !           671: 
        !           672: /* This routine frees used buffers. */
        !           673: /* It should consider sending an ack to let the
        !           674:    other end know we now have a bigger window. */
        !           675: 
        !           676: static  void
        !           677: cleanup_rbuf (volatile struct sock *sk)
        !           678: {
        !           679:    PRINTK ("cleaning rbuf for sk=%X\n",sk);
        !           680:   /* we have to loop through all the buffer headers, and 
        !           681:      try to free up all the space we can. */
        !           682:   while (sk->rqueue != NULL )
        !           683:     {
        !           684:       struct sk_buff *skb;
        !           685:       skb=sk->rqueue->next;
        !           686:       if (!skb->used) break;
        !           687:       if (sk->rqueue == skb)
        !           688:        {
        !           689:          sk->rqueue = NULL;
        !           690:        }
        !           691:       else
        !           692:        {
        !           693:          skb->next->prev = skb->prev;
        !           694:          skb->prev->next = skb->next;
        !           695:        }
        !           696:       skb->sk = sk;
        !           697:       free_skb (skb, FREE_READ);
        !           698:     }
        !           699:    /* at this point we should send an ack if the difference in
        !           700:       the window, and the amount of space is bigger than
        !           701:       TCP_WINDOW_DIFF */
        !           702:    PRINTK ("sk->window left = %d, sk->prot->rspace(sk)=%d\n",
        !           703:           sk->window - sk->bytes_rcv, sk->prot->rspace(sk));
        !           704: 
        !           705:    if ((sk->prot->rspace(sk) >
        !           706:        (sk->window - sk->bytes_rcv + TCP_WINDOW_DIFF)) ||
        !           707:        (sk->window - sk->bytes_rcv < 2*sk->mtu)) 
        !           708:      {
        !           709:        /* force it to send an ack. */
        !           710:        sk->ack_backlog++;
        !           711:        if (sk->timeout != TIME_WRITE && sk->state == TCP_ESTABLISHED)
        !           712:          {
        !           713:             sk->time_wait.len = TCP_ACK_TIME;
        !           714:             sk->timeout=TIME_WRITE;
        !           715:             reset_timer ((struct timer *)&sk->time_wait);
        !           716:          }
        !           717:      }
        !           718: 
        !           719: }
        !           720: 
        !           721: /* handle reading urgent data. */
        !           722: static  int
        !           723: tcp_read_urg(volatile struct sock * sk,
        !           724:             unsigned char *to, int len, unsigned flags)
        !           725: {
        !           726:     int copied = 0;
        !           727:     struct sk_buff *skb;
        !           728:     PRINTK ("tcp_read_urg(sk=%X, to=%X, len=%d, flags=%X)\n",
        !           729:            sk, to, len, flags);
        !           730:     print_sk(sk);
        !           731:     while (len > 0)
        !           732:       {
        !           733:         sk->inuse = 1;
        !           734:          while (sk->urg==0 || sk->rqueue == NULL)
        !           735:            {
        !           736:               /* now at this point, we may have gotten some data. */
        !           737:               release_sock (sk);
        !           738:                if (sk->state > TCP_CLOSING)
        !           739:                  {
        !           740:                      if (copied) return (copied);
        !           741:                      return (-ENOTCONN);
        !           742:                  }
        !           743:               cli();
        !           744:               if (sk->urg == 0 || sk->rqueue == NULL)
        !           745:                 {
        !           746:                    interruptible_sleep_on (sk->sleep);
        !           747:                    if (current->signal & ~current->blocked)
        !           748:                      {
        !           749:                         sti();
        !           750:                         if (copied) return (copied);
        !           751:                         return (-ERESTARTSYS);
        !           752:                      }
        !           753:                 }
        !           754:               sti();
        !           755:               sk->inuse = 1;
        !           756:            }
        !           757:          /* now we have some urgent data, we must find it.*/
        !           758:          for (skb = sk->rqueue->next; skb->next != sk->rqueue;
        !           759:               skb = skb->next)
        !           760:            {
        !           761:                int offset;
        !           762:                int amt;
        !           763:                if (!skb->h.th->urg) continue;
        !           764:                offset = 0;
        !           765:                amt = min(skb->h.th->urg_ptr,len);
        !           766:                verify_area (to, amt);
        !           767:                memcpy_tofs (to, (unsigned char *)(skb->h.th) +
        !           768:                             skb->h.th->doff*4
        !           769:                             + offset, amt);
        !           770: 
        !           771:                if (!(flags & MSG_PEEK))
        !           772:                  {
        !           773:                     skb->urg_used = 1;
        !           774:                     sk->urg --;
        !           775:                  }
        !           776:                release_sock (sk);
        !           777:                copied += amt;
        !           778:                return (copied);
        !           779:            }
        !           780:       }
        !           781:     return (0);
        !           782: }
        !           783: 
        !           784: /* This routine copies from a sock struct into the user buffer. */
        !           785: static  int
        !           786: tcp_read(volatile struct sock *sk, unsigned char *to,
        !           787:         int len, int nonblock, unsigned flags)
        !           788: {
        !           789:     int copied=0; /* will be used to say how much has been copied. */
        !           790:     struct sk_buff *skb;
        !           791:     unsigned long offset;
        !           792:     unsigned long used;
        !           793: 
        !           794:     if (len == 0) return (0);
        !           795:     if (len < 0) 
        !           796:       {
        !           797:         return (-EINVAL);
        !           798:       }
        !           799:     
        !           800:     /* this error should be checked. */
        !           801:     if (sk->state == TCP_LISTEN) return (-ENOTCONN);
        !           802: 
        !           803:     /* urgent data needs to be handled specially. */
        !           804:     if ((flags & MSG_OOB))
        !           805:       return (tcp_read_urg (sk, to, len, flags));
        !           806: 
        !           807:     /* so no-one else will use this socket. */
        !           808:     sk->inuse = 1;
        !           809:     if (sk->rqueue != NULL)
        !           810:       skb=sk->rqueue->next;
        !           811:     else
        !           812:       skb = NULL;
        !           813: 
        !           814:     while ( len > 0)
        !           815:       {
        !           816:         PRINTK("tcp_read (sk=%X, to=%X, len=%d, nonblock=%d, flags=%X)\n",
        !           817:                sk, to, len, nonblock, flags);
        !           818:          while ( skb == NULL || before (sk->copied_seq+1, skb->h.th->seq) ||
        !           819:                 skb->used) /* skb->used just checks to see if we've
        !           820:                               gone all the way around. */
        !           821:            {
        !           822: 
        !           823:               PRINTK("skb = %X:\n",skb);
        !           824:               print_skb(skb);
        !           825:               print_sk (sk);
        !           826: 
        !           827:               cleanup_rbuf(sk);
        !           828: 
        !           829:                if (nonblock || ((flags & MSG_PEEK) && copied))
        !           830:                  {
        !           831:                     release_sock (sk);
        !           832:                     if (copied) return (copied);
        !           833:                     return (-EAGAIN);
        !           834:                  }
        !           835: 
        !           836:                release_sock (sk); /* now we may have some data waiting. */
        !           837: 
        !           838: 
        !           839:               PRINTK ("tcp_read about to sleep. state = %d\n",sk->state);
        !           840:               cli();
        !           841: 
        !           842:               if (sk->state == TCP_CLOSE || sk->state == TCP_TIME_WAIT)
        !           843:                   {
        !           844:                     sti();
        !           845:                     if (copied) return (copied);
        !           846:                     if (sk->err) return (-sk->err);
        !           847:                     if (!sk->done)
        !           848:                       {
        !           849:                          sk->done = 1;
        !           850:                          return (0);
        !           851:                       }
        !           852:                     return (-ENOTCONN);
        !           853:                  }
        !           854:                        
        !           855:                if ( sk->rqueue == NULL ||
        !           856:                    before (sk->copied_seq+1, sk->rqueue->next->h.th->seq))
        !           857:                  {
        !           858:                     interruptible_sleep_on (sk->sleep);
        !           859:                     if (current->signal & ~current->blocked)
        !           860:                       {
        !           861:                          sti ();
        !           862:                          if (copied) return (copied);
        !           863:                          return (-ERESTARTSYS);
        !           864:                       }
        !           865:                  }
        !           866:                sti();
        !           867:                PRINTK ("tcp_read woke up. \n");
        !           868: 
        !           869:                sk->inuse = 1;
        !           870: 
        !           871:                if (sk->rqueue != NULL)
        !           872:                  skb=sk->rqueue->next;
        !           873:                else
        !           874:                  skb = NULL;
        !           875: 
        !           876:            }
        !           877: 
        !           878:          /* Copy anything from the current block that needs to go
        !           879:             into the user buffer. */
        !           880: 
        !           881:         offset = sk->copied_seq+1 - skb->h.th->seq;
        !           882: 
        !           883:         if (skb->h.th->syn) offset --;
        !           884:         if (offset < skb->len )
        !           885:           {
        !           886:              /* if there is urgent data we must either return or skip
        !           887:                 over it. */
        !           888:              if (skb->h.th->urg)
        !           889:                {
        !           890:                   if (skb->urg_used)
        !           891:                     {
        !           892:                        if (flags & MSG_PEEK) break;
        !           893:                        sk->copied_seq += skb->h.th->urg_ptr;
        !           894:                        offset += skb->h.th->urg_ptr;
        !           895:                        if (offset > skb->len)
        !           896:                          {
        !           897:                             skb->used = 1;
        !           898:                             skb=skb->next;
        !           899:                             continue;
        !           900:                          }
        !           901:                     }
        !           902:                   else
        !           903:                     {
        !           904:                        break;
        !           905:                     }
        !           906:                }
        !           907:              used = min(skb->len - offset, len);
        !           908: 
        !           909:              verify_area (to, used);
        !           910:              memcpy_tofs(to, ((unsigned char *)skb->h.th) +
        !           911:                          skb->h.th->doff*4 +
        !           912:                          offset,
        !           913:                          used);
        !           914:              copied += used;
        !           915:              len -= used;
        !           916:              to += used;
        !           917:              if (!(flags & MSG_PEEK))
        !           918:                sk->copied_seq += used;
        !           919:              
        !           920:              /* mark this data used if we are really reading it, and if
        !           921:                 it doesn't contain any urgent data. And we have used all
        !           922:                 the data. */
        !           923:              if (!(flags & MSG_PEEK) &&
        !           924:                  (!skb->h.th->urg || skb->urg_used) &&
        !           925:                  (used + offset >= skb->len) )
        !           926:                skb->used = 1;
        !           927:              
        !           928:              /* see if this is the end of a message or if the remaining data
        !           929:                 is urgent. */
        !           930:              if ( skb->h.th->psh || skb->h.th->urg)
        !           931:                {
        !           932:                   break;
        !           933:                }
        !           934:           }
        !           935:         else /* already used this data, must be a retransmit. */
        !           936:           {
        !           937:              skb->used = 1;
        !           938:           }
        !           939:         skb=skb->next;
        !           940:       }
        !           941:     cleanup_rbuf (sk);
        !           942:     release_sock (sk);
        !           943:     if (copied == 0 && nonblock) return (-EAGAIN);
        !           944:     return (copied);
        !           945: }
        !           946: 
        !           947: /* this routine will send a reset to the other tcp. */
        !           948: static  void
        !           949: tcp_reset(unsigned long saddr, unsigned long daddr, struct tcp_header *th,
        !           950:           struct proto *prot, struct options *opt, struct device *dev)
        !           951: {
        !           952:   /* we need to grab some memory, and put together a reset, and then
        !           953:      put it into the queue to be sent. */
        !           954:   struct sk_buff *buff;
        !           955:   struct tcp_header *t1;
        !           956:   int tmp;
        !           957:   buff=prot->wmalloc(NULL, MAX_RESET_SIZE,1);
        !           958:   if (buff == NULL) return;
        !           959: 
        !           960:   PRINTK("tcp_reset buff = %X\n", buff);
        !           961:   buff->mem_addr = buff;
        !           962:   buff->mem_len = MAX_RESET_SIZE;
        !           963:   buff->len = sizeof (*t1);
        !           964:   buff->sk = NULL;
        !           965:   buff->dev = dev;
        !           966: 
        !           967:   t1=(struct tcp_header *)(buff + 1);
        !           968:   /* put in the ip_header and routing stuff. */
        !           969:   tmp = prot->build_header (buff, saddr, daddr, &dev, IP_TCP, opt,
        !           970:                            sizeof(struct tcp_header));
        !           971:   if (tmp < 0)
        !           972:     {
        !           973:       prot->wfree (NULL,buff->mem_addr, buff->mem_len);
        !           974:       return;
        !           975:     }
        !           976:   t1 = (struct tcp_header *)((char *)t1 +tmp);
        !           977:   buff->len += tmp;
        !           978:   memcpy (t1, th, sizeof (*t1));
        !           979:   /* swap the send and the receive. */
        !           980:   t1->dest = th->source;
        !           981:   t1->source = th->dest;
        !           982:   t1->seq = th->ack_seq; /* add one so it will be in
        !           983:                            the right range.*/
        !           984:   t1->rst = 1;
        !           985:   t1->ack = 0;
        !           986:   t1->syn = 0;
        !           987:   t1->urg = 0;
        !           988:   t1->fin = 0;
        !           989:   t1->psh = 0;
        !           990:   t1->doff = sizeof (*t1)/4;
        !           991:   tcp_send_check (t1, saddr, daddr, sizeof (*t1), NULL);
        !           992:   prot->queue_xmit(NULL, dev, buff, 1);
        !           993:   
        !           994: }
        !           995: 
        !           996: 
        !           997: /* This routine handles a connection request.  This should make sure
        !           998:    we haven't already responded. */
        !           999: /* Because of the way BSD works, we have to send a syn/ack now. This also
        !          1000:  means it will be harder to close a socket which is listening. */
        !          1001: 
        !          1002: static  void
        !          1003: tcp_conn_request(volatile struct sock *sk, struct sk_buff *skb,
        !          1004:                 unsigned long daddr,
        !          1005:                 unsigned long saddr, struct options *opt, struct device *dev)
        !          1006: {
        !          1007:   struct sk_buff *buff;
        !          1008:   struct tcp_header *t1;
        !          1009:   unsigned char *ptr;
        !          1010:   volatile struct sock *newsk;
        !          1011:   struct tcp_header *th;
        !          1012:   int tmp;
        !          1013:   th = skb->h.th;
        !          1014: 
        !          1015:   PRINTK ("tcp_conn_request (sk = %X, skb = %X, daddr = %X, sadd4= %X, \n"
        !          1016:          "                  opt = %X, dev = %X)\n",
        !          1017:          sk, skb, daddr, saddr, opt, dev);
        !          1018:   
        !          1019:   /* if the socket is dead, don't accept the connection. */
        !          1020:   if (!sk->dead)
        !          1021:     {
        !          1022:        wake_up(sk->sleep);
        !          1023:     }
        !          1024:   else
        !          1025:     {
        !          1026:        PRINTK ("tcp_conn_request on dead socket\n");
        !          1027:        tcp_reset (daddr, saddr, th, sk->prot, opt, dev);
        !          1028:        free_skb (skb, FREE_READ);
        !          1029:        return;
        !          1030:     }
        !          1031: 
        !          1032: 
        !          1033:   /* we need to build a new sock struct. */
        !          1034:   /* It is sort of bad to have a socket without an inode attached to
        !          1035:      it, but the wake_up's will just wake up the listening socket,
        !          1036:      and if the listening socket is destroyed before this is taken
        !          1037:      off of the queue, this will take care of it. */
        !          1038: 
        !          1039:   newsk = malloc(sizeof (struct sock));
        !          1040:   if (newsk == NULL) 
        !          1041:     {
        !          1042:        /* just ignore the syn.  It will get retransmitted. */
        !          1043:        free_skb (skb, FREE_READ);
        !          1044:        return;
        !          1045:     }
        !          1046: 
        !          1047: 
        !          1048:   PRINTK ("newsk = %X\n", newsk);
        !          1049:   memcpy ((void *)newsk, (void *)sk, sizeof (*newsk));
        !          1050:   newsk->wback = NULL;
        !          1051:   newsk->wfront = NULL;
        !          1052:   newsk->rqueue = NULL;
        !          1053:   newsk->send_head = NULL;
        !          1054:   newsk->send_tail = NULL;
        !          1055:   newsk->back_log = NULL;
        !          1056:   newsk->blog = 0;
        !          1057:   newsk->intr = 0;
        !          1058:   newsk->proc = 0;
        !          1059:   newsk->done = 0;
        !          1060: 
        !          1061:   newsk->pair = NULL;
        !          1062:   newsk->wmem_alloc = 0;
        !          1063:   newsk->rmem_alloc = 0;
        !          1064: 
        !          1065:   newsk->max_unacked = MAX_WINDOW - TCP_WINDOW_DIFF;
        !          1066: 
        !          1067:   newsk->err = 0;
        !          1068:   newsk->shutdown = 0;
        !          1069:   newsk->ack_backlog = 0;
        !          1070:   newsk->acked_seq = skb->h.th->seq+1;
        !          1071:   newsk->fin_seq = skb->h.th->seq;
        !          1072:   newsk->copied_seq = skb->h.th->seq;
        !          1073:   newsk->state = TCP_SYN_RECV;
        !          1074:   newsk->timeout = 0;
        !          1075:   newsk->send_seq = timer_seq*SEQ_TICK-seq_offset;
        !          1076:   newsk->rcv_ack_seq = newsk->send_seq;
        !          1077:   newsk->urg =0;
        !          1078:   newsk->retransmits = 0;
        !          1079:   newsk->destroy = 0;
        !          1080:   newsk->time_wait.sk = newsk;
        !          1081:   newsk->time_wait.next = NULL;
        !          1082:   newsk->dummy_th.source = skb->h.th->dest;
        !          1083:   newsk->dummy_th.dest = skb->h.th->source;
        !          1084:   /* swap these two, they are from our point of view. */
        !          1085:   newsk->daddr=saddr;
        !          1086:   newsk->saddr=daddr;
        !          1087: 
        !          1088:   put_sock (newsk->num,newsk);
        !          1089:   newsk->dummy_th.res1=0;
        !          1090:   newsk->dummy_th.doff=6;
        !          1091:   newsk->dummy_th.fin=0;
        !          1092:   newsk->dummy_th.syn=0;
        !          1093:   newsk->dummy_th.rst=0;
        !          1094:   newsk->dummy_th.psh=0;
        !          1095:   newsk->dummy_th.ack=0;
        !          1096:   newsk->dummy_th.urg=0;
        !          1097:   newsk->dummy_th.res2=0;
        !          1098:   newsk->acked_seq = skb->h.th->seq+1;
        !          1099:   newsk->copied_seq = skb->h.th->seq;
        !          1100: 
        !          1101:   if (skb->h.th->doff == 5)
        !          1102:     {
        !          1103:       newsk->mtu=dev->mtu-HEADER_SIZE;
        !          1104:     }
        !          1105:   else
        !          1106:     {
        !          1107:       ptr = (unsigned char *)(skb+1);
        !          1108:       if (ptr[0] != 2 || ptr[1] != 4)
        !          1109:        {
        !          1110:           newsk->mtu=576-HEADER_SIZE;
        !          1111:        }
        !          1112:       else
        !          1113:        {
        !          1114:          newsk->mtu = min (ptr[2]*256+ptr[3]-HEADER_SIZE,
        !          1115:                            dev->mtu-HEADER_SIZE);
        !          1116:        }
        !          1117:     }
        !          1118: 
        !          1119:   print_sk (newsk);
        !          1120:   buff=newsk->prot->wmalloc(newsk,MAX_SYN_SIZE,1);
        !          1121:   if (buff == NULL)
        !          1122:     {
        !          1123:        sk->err = -ENOMEM;
        !          1124:        newsk->dead = 1;
        !          1125:        release_sock (newsk);
        !          1126:        free_skb (skb, FREE_READ);
        !          1127:        return;
        !          1128:     }
        !          1129:   
        !          1130:   buff->mem_addr = buff;
        !          1131:   buff->mem_len = MAX_SYN_SIZE;
        !          1132:   buff->len=sizeof (struct tcp_header)+4;
        !          1133:   buff->sk = newsk;
        !          1134:   
        !          1135:   t1=(struct tcp_header *)(buff + 1);
        !          1136:   /* put in the ip_header and routing stuff. */
        !          1137: 
        !          1138:   tmp = sk->prot->build_header (buff, newsk->saddr, newsk->daddr, &dev,
        !          1139:                                IP_TCP, NULL, MAX_SYN_SIZE);
        !          1140: 
        !          1141:   /* something went wrong. */
        !          1142:   if (tmp < 0)
        !          1143:     {
        !          1144:        sk->err = tmp;
        !          1145:        sk->prot->wfree(newsk, buff->mem_addr, buff->mem_len);
        !          1146:        newsk->dead = 1;
        !          1147:        release_sock (newsk);
        !          1148:        free_skb (skb, FREE_READ);
        !          1149:        return;
        !          1150:     }
        !          1151: 
        !          1152:   buff->len += tmp;
        !          1153:   t1 = (struct tcp_header *)((char *)t1 +tmp);
        !          1154:   
        !          1155:   memcpy (t1, skb->h.th, sizeof (*t1));
        !          1156:   buff->h.seq = newsk->send_seq;
        !          1157:   /* swap the send and the receive. */
        !          1158:   t1->dest = skb->h.th->source;
        !          1159:   t1->source = newsk->dummy_th.source;
        !          1160:   t1->seq = net32(newsk->send_seq++);
        !          1161:   t1->ack = 1;
        !          1162:   newsk->window = sk->prot->rspace(newsk);
        !          1163:   t1->window = net16(newsk->window);
        !          1164:   t1->res1=0;
        !          1165:   t1->res2=0;
        !          1166:   t1->rst = 0;
        !          1167:   t1->urg = 0;
        !          1168:   t1->psh = 0;
        !          1169:   t1->syn = 1;
        !          1170:   t1->ack_seq = net32(skb->h.th->seq+1);
        !          1171:   t1->doff = sizeof (*t1)/4+1;
        !          1172: 
        !          1173:   ptr = (unsigned char *)(t1+1);
        !          1174:   ptr[0]=2;
        !          1175:   ptr[1]=4;
        !          1176:   ptr[2]=((dev->mtu - HEADER_SIZE) >> 8) & 0xff;
        !          1177:   ptr[3]=(dev->mtu - HEADER_SIZE) & 0xff;
        !          1178: 
        !          1179:   tcp_send_check (t1, daddr, saddr, sizeof (*t1)+4, newsk);
        !          1180:   newsk->prot->queue_xmit(newsk, dev, buff, 0);
        !          1181: 
        !          1182:   newsk->time_wait.len = TCP_CONNECT_TIME;
        !          1183:   PRINTK ("newsk->time_wait.sk = %X\n", newsk->time_wait.sk);
        !          1184:   reset_timer ((struct timer *)&newsk->time_wait);
        !          1185:   skb->sk = newsk;
        !          1186:   /* charge the sock_buff to newsk. */
        !          1187:   sk->rmem_alloc -= skb->mem_len;
        !          1188:   newsk->rmem_alloc += skb->mem_len;
        !          1189: 
        !          1190:   if (sk->rqueue == NULL)
        !          1191:     {
        !          1192:       skb->next = skb;
        !          1193:       skb->prev = skb;
        !          1194:       sk->rqueue = skb;
        !          1195:     }
        !          1196:   else
        !          1197:     {
        !          1198:       skb->next = sk->rqueue;
        !          1199:       skb->prev = sk->rqueue->prev;
        !          1200:       sk->rqueue->prev = skb;
        !          1201:       skb->prev->next = skb;
        !          1202:     }
        !          1203:   release_sock (newsk);
        !          1204: }
        !          1205: 
        !          1206: static  void
        !          1207: tcp_close (volatile struct sock *sk, int timeout)
        !          1208: {
        !          1209:   /* we need to grab some memory, and put together a fin, and then
        !          1210:      put it into the queue to be sent. */
        !          1211:   struct sk_buff *buff;
        !          1212:   int need_reset = 0;
        !          1213:   struct tcp_header *t1,*th;
        !          1214:   struct proto *prot;
        !          1215:   struct device *dev=NULL;
        !          1216:   int tmp;
        !          1217:   PRINTK ("tcp_close ((struct sock *)%X, %d)\n",sk, timeout);
        !          1218:   sk->inuse = 1;
        !          1219:   sk->keepopen = 0;
        !          1220:   sk->shutdown = SHUTDOWN_MASK;
        !          1221: 
        !          1222:   if (!sk->dead)
        !          1223:     wake_up (sk->sleep);
        !          1224: 
        !          1225: 
        !          1226:   /* we need to flush the recv. buffs. */
        !          1227:   
        !          1228:   if (sk->rqueue != NULL)
        !          1229:     {
        !          1230:        struct sk_buff *skb;
        !          1231:        struct sk_buff *skb2;
        !          1232:        skb = sk->rqueue;
        !          1233:        do {
        !          1234:          skb2=skb->next;
        !          1235:          free_skb (skb, FREE_READ);
        !          1236:          skb=skb2;
        !          1237:        } while (skb != sk->rqueue);
        !          1238:        need_reset = 1;
        !          1239:     }
        !          1240:   sk->rqueue = NULL;
        !          1241: 
        !          1242: 
        !          1243:   switch (sk->state)
        !          1244:     {
        !          1245:       case TCP_FIN_WAIT1:
        !          1246:       case TCP_FIN_WAIT2:
        !          1247:       case TCP_LAST_ACK:
        !          1248:        if (timeout)
        !          1249:         tcp_time_wait(sk);
        !          1250:        release_sock (sk);
        !          1251:        if (!need_reset)
        !          1252:         return;
        !          1253:        break;
        !          1254: 
        !          1255:       case TCP_TIME_WAIT:
        !          1256:        if (timeout)
        !          1257:         sk->state = TCP_CLOSE;
        !          1258:        release_sock (sk);
        !          1259:        return;
        !          1260: 
        !          1261:       case TCP_LISTEN:
        !          1262:        sk->state = TCP_CLOSE;
        !          1263:        release_sock(sk);
        !          1264:        return;
        !          1265: 
        !          1266:       case TCP_CLOSE:
        !          1267: 
        !          1268:        release_sock(sk);
        !          1269:        return;
        !          1270:        
        !          1271: 
        !          1272:     case TCP_ESTABLISHED:
        !          1273:     case TCP_SYN_SENT:
        !          1274:     case TCP_SYN_RECV:
        !          1275: 
        !          1276:       prot = (struct proto *)sk->prot;
        !          1277:       th=(struct tcp_header *)&sk->dummy_th;
        !          1278: 
        !          1279:        buff=prot->wmalloc(sk, MAX_FIN_SIZE,1);
        !          1280:        if (buff == NULL)
        !          1281:         {
        !          1282:            /* this will force it to try again later. */
        !          1283:            sk->state = TCP_ESTABLISHED;
        !          1284:            sk->timeout = TIME_CLOSE;
        !          1285:            sk->time_wait.len = 100; /* wait a second. */
        !          1286:            reset_timer ((struct timer *)&sk->time_wait);
        !          1287:            return;
        !          1288:         }
        !          1289: 
        !          1290:       buff->mem_addr = buff;
        !          1291:       buff->mem_len = MAX_FIN_SIZE;
        !          1292:       buff->sk = sk;
        !          1293:       buff->len = sizeof (*t1);
        !          1294:       t1=(struct tcp_header *)(buff + 1);
        !          1295:       /* put in the ip_header and routing stuff. */
        !          1296:       tmp = prot->build_header (buff,sk->saddr, sk->daddr, &dev,
        !          1297:                                IP_TCP, sk->opt,
        !          1298:                                sizeof(struct tcp_header));
        !          1299:       if (tmp < 0)
        !          1300:        {
        !          1301:          prot->wfree (sk,buff->mem_addr, buff->mem_len);
        !          1302:          PRINTK ("Unable to build header for fin.\n");
        !          1303:          release_sock(sk);
        !          1304:          return;
        !          1305:        }
        !          1306:       t1 = (struct tcp_header *)((char *)t1 +tmp);
        !          1307:       buff ->len += tmp;
        !          1308:       buff->dev = dev;
        !          1309:       memcpy (t1, th, sizeof (*t1));
        !          1310:       t1->seq = net32(sk->send_seq);
        !          1311:       sk->send_seq++;
        !          1312:       buff->h.seq = sk->send_seq;
        !          1313:       t1->ack = 1;
        !          1314:        /* ack everything immediately from now on. */
        !          1315:       sk->delay_acks = 0;
        !          1316:       t1->ack_seq = net32(sk->acked_seq);
        !          1317:       t1->window = net16(sk->prot->rspace(sk));
        !          1318:       t1->fin = 1;
        !          1319:       t1->rst = need_reset;
        !          1320:       t1->doff = sizeof (*t1)/4;
        !          1321:       tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
        !          1322: 
        !          1323:       if (sk->wfront == NULL)
        !          1324:        {
        !          1325:          prot->queue_xmit(sk, dev, buff, 0);
        !          1326:        }
        !          1327:       else
        !          1328:        {
        !          1329:           sk->time_wait.len = sk->rtt;
        !          1330:           sk->timeout = TIME_WRITE;
        !          1331:           reset_timer ((struct timer *)&sk->time_wait);
        !          1332:           buff->next = NULL;
        !          1333:           if (sk->wback == NULL)
        !          1334:             {
        !          1335:                sk->wfront=buff;
        !          1336:             }
        !          1337:           else
        !          1338:             {
        !          1339:                sk->wback->next = buff;
        !          1340:             }
        !          1341:           sk->wback = buff;
        !          1342:           
        !          1343:        }
        !          1344:       sk->state = TCP_FIN_WAIT1;
        !          1345:     }
        !          1346:   release_sock (sk);
        !          1347: }
        !          1348: 
        !          1349: 
        !          1350: /* This routine takes stuff off of the write queue, and puts it in the
        !          1351:    xmit queue. */
        !          1352: static  void
        !          1353: tcp_write_xmit (volatile struct sock *sk)
        !          1354: {
        !          1355:   struct sk_buff *skb;
        !          1356:   while (sk->wfront != NULL && before (sk->wfront->h.seq, sk->window_seq) &&
        !          1357:         sk->packets_out < sk->cong_window)
        !          1358:     {
        !          1359:       skb = sk->wfront;
        !          1360:       sk->wfront = skb->next;
        !          1361:       if (sk->wfront == NULL)
        !          1362:        sk->wback = NULL;
        !          1363:       sk->prot->queue_xmit (sk, skb->dev, skb, skb->free);
        !          1364:     }
        !          1365: }
        !          1366: 
        !          1367: 
        !          1368: 
        !          1369: /* This routine deals with incoming acks, but not outgoing ones. */
        !          1370: 
        !          1371: static  int
        !          1372: tcp_ack (volatile struct sock *sk, struct tcp_header *th, unsigned long saddr)
        !          1373: {
        !          1374:   unsigned long ack;
        !          1375:   ack = net32(th->ack_seq);
        !          1376: 
        !          1377:   if (!between (ack , sk->rcv_ack_seq, sk->send_seq)) 
        !          1378:     {
        !          1379:       if (after (ack, sk->send_seq) || sk->state != TCP_ESTABLISHED) 
        !          1380:        {
        !          1381:          return (0);
        !          1382:        }
        !          1383:       if (sk->keepopen)
        !          1384:        reset_timer ((struct timer *)&sk->time_wait);
        !          1385:       sk->retransmits = 0;
        !          1386:       return (1);
        !          1387:     }
        !          1388: 
        !          1389:   sk->window_seq = ack + net16(th->window);
        !          1390: 
        !          1391: 
        !          1392:   /* we don't want too many packets out there. */
        !          1393:   if (sk->cong_window < 2048 && ack != sk->rcv_ack_seq)
        !          1394:     {
        !          1395:        if (sk->exp_growth)
        !          1396:         sk->cong_window *= 2;
        !          1397:        else
        !          1398:         sk->cong_window++;
        !          1399:     }
        !          1400: 
        !          1401:   sk->rcv_ack_seq = ack;
        !          1402: 
        !          1403:   /* see if we can take anything off of the retransmit queue. */
        !          1404:   while (sk->send_head != NULL)
        !          1405:     {
        !          1406:       if (before (sk->send_head->h.seq, ack+1))
        !          1407:        {
        !          1408:          struct sk_buff *oskb;
        !          1409:          /* we have one less packet out there. */
        !          1410:          sk->packets_out --;
        !          1411:          cli();
        !          1412:          oskb = sk->send_head;
        !          1413:          /* estimate the rtt. */
        !          1414:          sk->rtt += ((jiffies - oskb->when) - sk->rtt)/2;
        !          1415:          if (sk->rtt < 30) sk->rtt = 30;
        !          1416:          sk->send_head = oskb->link3;
        !          1417:          if (sk->send_head == NULL) 
        !          1418:            {
        !          1419:              sk->send_tail = NULL;
        !          1420:            }
        !          1421:          /* we may need to remove this from the dev send list. */
        !          1422:          if (oskb->next != NULL)
        !          1423:            {
        !          1424:               if (oskb->next != oskb)
        !          1425:                 {
        !          1426:                    oskb->next->prev = oskb->prev;
        !          1427:                    oskb->prev->next = oskb->next;
        !          1428:                 }
        !          1429:               else
        !          1430:                 {
        !          1431:                    int i;
        !          1432:                    for (i = 0; i < DEV_NUMBUFFS; i++)
        !          1433:                      {
        !          1434:                         if (oskb->dev->buffs[i] = oskb)
        !          1435:                           {
        !          1436:                              oskb->dev->buffs[i]= NULL;
        !          1437:                              break;
        !          1438:                           }
        !          1439:                      }
        !          1440:                 }
        !          1441:            }
        !          1442:          free_skb  (oskb, FREE_WRITE); /* write. */
        !          1443:          sti();
        !          1444:          if (!sk->dead)
        !          1445:            wake_up(sk->sleep);
        !          1446:        }
        !          1447:       else
        !          1448:        {
        !          1449:          break;
        !          1450:        }
        !          1451: 
        !          1452:     }
        !          1453: 
        !          1454: 
        !          1455:   /* at this point we need to check to see if we have anything
        !          1456:      which needs to be retransmiteed.  If we have failed to get
        !          1457:      some acks i.e. had to retransmit something, and we succeded, we
        !          1458:      should then attempt to retransmit everything right now. */
        !          1459: 
        !          1460:   if (sk->retransmits && sk->send_head != NULL)
        !          1461:     {
        !          1462:       sk->prot->retransmit (sk,1);
        !          1463:     }
        !          1464:   sk->retransmits = 0;
        !          1465: 
        !          1466:   /* maybe we can take some stuff off of the write queue, and put it onto
        !          1467:      the xmit queue. */
        !          1468:   if (sk->wfront != NULL && sk->packets_out < sk->cong_window)
        !          1469:     {
        !          1470:       if (after (sk->window_seq, sk->wfront->h.seq))
        !          1471:        {
        !          1472:          tcp_write_xmit (sk);
        !          1473:        }
        !          1474:     }
        !          1475:   else
        !          1476:     {
        !          1477:        if (sk->send_head == NULL && sk->ack_backlog == 0 &&
        !          1478:           sk->state != TCP_TIME_WAIT)
        !          1479:         {
        !          1480:            delete_timer((struct timer *)&sk->time_wait);
        !          1481:            sk->timeout = 0;
        !          1482:         }
        !          1483:        else
        !          1484:         {
        !          1485:            if (sk->state == TCP_TIME_WAIT)
        !          1486:              {
        !          1487:                 sk->time_wait.len = TCP_TIMEWAIT_LEN;
        !          1488:                 sk->timeout = TIME_CLOSE;
        !          1489:              }
        !          1490:            reset_timer ((struct timer *)&sk->time_wait);
        !          1491:         }
        !          1492:     }
        !          1493: 
        !          1494:   /* see if we are done. */
        !          1495:   if ( sk->state == TCP_TIME_WAIT)
        !          1496:     {
        !          1497:        if (sk->rcv_ack_seq == sk->send_seq &&   
        !          1498:           sk->acked_seq == sk->fin_seq);
        !          1499:        if (!sk->dead) wake_up (sk->sleep);
        !          1500:        sk->state = TCP_CLOSE;
        !          1501:     }
        !          1502: 
        !          1503:   if (sk->state == TCP_FIN_WAIT1)
        !          1504:     {
        !          1505:       if (sk->rcv_ack_seq == sk->send_seq)
        !          1506:        sk->state = TCP_FIN_WAIT2;
        !          1507:     }
        !          1508:   
        !          1509:   if (sk->state == TCP_LAST_ACK)
        !          1510:     {
        !          1511:       if (sk->rcv_ack_seq == sk->send_seq)
        !          1512:        {
        !          1513:           if (sk->acked_seq != sk->fin_seq)
        !          1514:             {
        !          1515:                tcp_time_wait(sk);
        !          1516:             }
        !          1517:           else
        !          1518:             {
        !          1519:                sk->state = TCP_CLOSE;
        !          1520:             }
        !          1521:        }
        !          1522:       if (!sk->dead) wake_up (sk->sleep);
        !          1523:     }
        !          1524: 
        !          1525:   return (1);
        !          1526: }
        !          1527: 
        !          1528: /* This routine handles the data.  If there is room in the buffer, it
        !          1529:    will be have already been moved into it.  If there is no room,
        !          1530:    then we will just have to discard the packet. */
        !          1531: 
        !          1532: static  int
        !          1533: tcp_data (struct sk_buff *skb, volatile struct sock *sk, 
        !          1534:          unsigned long saddr, unsigned short len)
        !          1535: {
        !          1536:   struct sk_buff *skb1, *skb2;
        !          1537:   struct tcp_header *th;
        !          1538: 
        !          1539:   th = skb->h.th;
        !          1540:   print_th (th);
        !          1541:   skb->len = len - (th->doff*4);
        !          1542: 
        !          1543:   PRINTK("tcp_data len = %d sk = %X:\n",skb->len, sk);
        !          1544:   print_sk(sk);
        !          1545: 
        !          1546:   sk->bytes_rcv += skb->len;
        !          1547: 
        !          1548:   if (skb->len == 0 && !th->fin && !th->urg && !th->psh)
        !          1549:     {
        !          1550:       /* don't want to keep passing ack's back and fourth. */
        !          1551:       if (!th->ack)
        !          1552:        tcp_send_ack (sk->send_seq, sk->acked_seq,sk, th, saddr);
        !          1553:       free_skb(skb, FREE_READ);
        !          1554:       return (0);
        !          1555:     }
        !          1556: 
        !          1557:   if (sk->shutdown & RCV_SHUTDOWN)
        !          1558:     {
        !          1559:        /* just ack everything. */
        !          1560:        sk->acked_seq = th->seq + skb->len + th->syn + th->fin;
        !          1561:        tcp_send_ack (sk->send_seq, sk->acked_seq, sk, skb->h.th, saddr);
        !          1562:        free_skb (skb, FREE_READ);
        !          1563:        if (sk->state == TCP_TIME_WAIT && sk->acked_seq == sk->fin_seq)
        !          1564:         {
        !          1565:            if (!sk->dead) wake_up (sk->sleep);
        !          1566:            sk->state = TCP_CLOSE;
        !          1567:         }
        !          1568:        return (0);
        !          1569:     }
        !          1570: 
        !          1571:   /* now we have to walk the chain, and figure out where this one
        !          1572:      goes into it.  This is set up so that the last packet we received
        !          1573:      will be the first one we look at, that way if everything comes
        !          1574:      in order, there will be no performance loss, and if they come
        !          1575:      out of order we will be able to fit things in nicely. */
        !          1576:   
        !          1577:   if (sk->rqueue == NULL)
        !          1578:     {
        !          1579:        PRINTK ("tcp_data: skb = %X:\n",skb);
        !          1580:        print_skb (skb);
        !          1581: 
        !          1582:        sk->rqueue = skb;
        !          1583:        skb->next = skb;
        !          1584:        skb->prev = skb;
        !          1585:        skb1= NULL;
        !          1586:     }
        !          1587:   else
        !          1588:     {
        !          1589:       PRINTK ("tcp_data adding to chain sk = %X:\n",sk);
        !          1590:       print_sk (sk);
        !          1591: 
        !          1592:       for (skb1=sk->rqueue; ; skb1=skb1->prev)
        !          1593:        {
        !          1594:          PRINTK ("skb1=%X\n",skb1);
        !          1595:          print_skb(skb1);
        !          1596:          PRINTK ("skb1->h.th->seq = %d\n", skb1->h.th->seq);
        !          1597:          if (after ( th->seq+1, skb1->h.th->seq))
        !          1598:            {
        !          1599:              skb->prev = skb1;
        !          1600:              skb->next = skb1->next;
        !          1601:              skb->next->prev = skb;
        !          1602:              skb1->next = skb;
        !          1603:              if (skb1 == sk->rqueue)
        !          1604:                sk->rqueue = skb;
        !          1605:              break;
        !          1606:            }
        !          1607:          if  ( skb1->prev == sk->rqueue)
        !          1608:            {
        !          1609:               skb->next= skb1;
        !          1610:               skb->prev = skb1->prev;
        !          1611:               skb->prev->next = skb;
        !          1612:               skb1->prev = skb;
        !          1613:               skb1 = NULL; /* so we know we might be able to ack stuff. */
        !          1614:               break;
        !          1615:            }
        !          1616:        }
        !          1617: 
        !          1618:       PRINTK ("skb = %X:\n",skb);
        !          1619:       print_skb (skb);
        !          1620:       PRINTK ("sk now equals:\n");
        !          1621:       print_sk (sk);
        !          1622: 
        !          1623:     }
        !          1624: 
        !          1625:   th->ack_seq = th->seq + skb->len;
        !          1626:   if (th->syn) th->ack_seq ++;
        !          1627:   if (th->fin) th->ack_seq ++;
        !          1628: 
        !          1629:   if (before (sk->acked_seq, sk->copied_seq))
        !          1630:     {
        !          1631:        printk ("*** tcp.c:tcp_data bug acked < copied\n");
        !          1632:        sk->acked_seq = sk->copied_seq;
        !          1633:     }
        !          1634: 
        !          1635:   /* now figure out if we can ack anything. */
        !          1636:   if (skb1 == NULL || skb1->acked || before (th->seq, sk->acked_seq+1))
        !          1637:     {
        !          1638:       if (before (th->seq, sk->acked_seq+1))
        !          1639:        {
        !          1640:          sk->acked_seq = th->ack_seq;
        !          1641:          skb->acked = 1;
        !          1642:          
        !          1643:          for (skb2=skb->next; skb2 != sk->rqueue->next; skb2=skb2->next)
        !          1644:            {
        !          1645:               if (before(skb2->h.th->seq, sk->acked_seq+1))
        !          1646:                 {
        !          1647:                    sk->acked_seq = skb2->h.th->ack_seq;
        !          1648:                    skb2->acked = 1;
        !          1649:                    /* force an immediate ack. */
        !          1650:                    sk->ack_backlog = sk->max_ack_backlog;
        !          1651:                 }
        !          1652:               else
        !          1653:                 break;
        !          1654:            }
        !          1655: 
        !          1656:          /* this also takes care of updating the window. */
        !          1657:          /* this if statement needs to be simplified. */
        !          1658: 
        !          1659:          if (!sk->delay_acks || 
        !          1660:              sk->ack_backlog >= sk->max_ack_backlog || 
        !          1661:              sk->window < 2*sk->mtu + sk->bytes_rcv ||
        !          1662:              sk->bytes_rcv > sk->max_unacked || 
        !          1663:              th->fin)
        !          1664:            {
        !          1665:                tcp_send_ack (sk->send_seq, sk->acked_seq,sk,th, saddr);
        !          1666:            }
        !          1667:          else
        !          1668:            {
        !          1669:               sk->ack_backlog++;
        !          1670:               sk->time_wait.len = TCP_ACK_TIME;
        !          1671:               sk->timeout = TIME_WRITE;
        !          1672:               reset_timer ((struct timer *)&sk->time_wait);
        !          1673:            }
        !          1674:        }
        !          1675:    }
        !          1676:   else
        !          1677:     {
        !          1678:        /* we missed a packet.  Send an ack to try to resync things. */
        !          1679:        tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr);
        !          1680:     }
        !          1681: 
        !          1682:   /* now tell the user we may have some data. */
        !          1683:   if (!sk->dead)
        !          1684:     {
        !          1685:        wake_up (sk->sleep);
        !          1686:     }
        !          1687:   else
        !          1688:     {
        !          1689:        PRINTK ("data received on dead socket. \n");
        !          1690:     }
        !          1691: 
        !          1692:   if (sk->state > TCP_CLOSING && sk->acked_seq == sk->fin_seq)
        !          1693:     {
        !          1694:        sk->state = TCP_CLOSE;
        !          1695:     }
        !          1696: 
        !          1697:   return (0);
        !          1698: }
        !          1699: 
        !          1700: static  int
        !          1701: tcp_urg (volatile struct sock *sk, struct tcp_header *th, unsigned long saddr)
        !          1702: {
        !          1703:     extern int kill_pg (int pg, int sig, int priv);
        !          1704:     extern int kill_proc (int pid, int sig, int priv);
        !          1705:     
        !          1706:     if (!sk->dead)
        !          1707:       wake_up(sk->sleep);
        !          1708:     
        !          1709:     if (sk->urginline)
        !          1710:       {
        !          1711:          th->urg = 0;
        !          1712:          th->psh = 1;
        !          1713:          return (0);
        !          1714:       }
        !          1715: 
        !          1716:     sk->urg++;
        !          1717: 
        !          1718:     if (!sk->urg)
        !          1719:       {
        !          1720:          /* so if we get more urgent data, we don't 
        !          1721:             signal the user again. */
        !          1722:          if (sk->proc == 0) return (0);
        !          1723:          if (sk->proc > 0)
        !          1724:            {
        !          1725:                kill_proc (sk->proc, SIGURG, 1);
        !          1726:            }
        !          1727:          else 
        !          1728:            {
        !          1729:                kill_pg (-sk->proc, SIGURG, 1);
        !          1730:            }
        !          1731:       }
        !          1732:     return (0);
        !          1733: }
        !          1734: 
        !          1735: /* this deals with incoming fins. */
        !          1736: static  int
        !          1737: tcp_fin (volatile struct sock *sk, struct tcp_header *th, 
        !          1738:         unsigned long saddr, struct device *dev)
        !          1739: {
        !          1740:   struct sk_buff *buff;
        !          1741:   struct tcp_header *t1;
        !          1742:   int tmp;
        !          1743:   PRINTK ("tcp_fin (sk=%X, th=%X, saddr=%X, dev=%X)\n",
        !          1744:          sk, th, saddr, dev);
        !          1745:   
        !          1746:   if (!sk->dead)
        !          1747:     {
        !          1748:       wake_up (sk->sleep);
        !          1749:     }
        !          1750: 
        !          1751:   /* after sending the fin, we aren't allowed to write anymore. */
        !          1752:   sk->shutdown |= SEND_SHUTDOWN;
        !          1753: 
        !          1754:   sk->err = 0;
        !          1755:   switch (sk->state)
        !          1756:     {
        !          1757:     case TCP_SYN_RECV:
        !          1758:     case TCP_SYN_SENT:
        !          1759:     case TCP_ESTABLISHED:
        !          1760:       sk->state = TCP_LAST_ACK;
        !          1761:       break;
        !          1762: 
        !          1763:      default:
        !          1764:     case TCP_FIN_WAIT1:
        !          1765:     case TCP_TIME_WAIT:
        !          1766:       sk->state = TCP_LAST_ACK;
        !          1767:       /* start the timers. */
        !          1768:       sk->time_wait.len = TCP_TIMEWAIT_LEN;
        !          1769:       sk->timeout = TIME_CLOSE;
        !          1770:       reset_timer ((struct timer *)&sk->time_wait);
        !          1771:       return (0);
        !          1772: 
        !          1773:     case TCP_FIN_WAIT2:
        !          1774:       sk->state = TCP_CLOSE;
        !          1775:       return (0);
        !          1776:     }
        !          1777: 
        !          1778:   /* send an ack and our own fin. */
        !          1779:   buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1);
        !          1780:   if (buff == NULL)
        !          1781:     {
        !          1782:        /* we will ignore the fin.  That way it will be sent again. */
        !          1783:        return (1);
        !          1784:     }
        !          1785: 
        !          1786:   buff->mem_addr = buff;
        !          1787:   buff->mem_len = MAX_ACK_SIZE;
        !          1788:   buff->len=sizeof (struct tcp_header);
        !          1789:   buff->sk = sk;
        !          1790: 
        !          1791:   t1 = (struct tcp_header *)(buff + 1);
        !          1792:   /* put in the ip_header and routing stuff. */
        !          1793:   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
        !          1794:                                IP_TCP,  sk->opt, MAX_ACK_SIZE);
        !          1795:   if (tmp < 0)
        !          1796:     {
        !          1797:       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
        !          1798:       return (0);
        !          1799:     }
        !          1800: 
        !          1801:   buff->len += tmp;
        !          1802:   t1 = (struct tcp_header *)((char *)t1 +tmp);
        !          1803:   
        !          1804:   memcpy (t1, th, sizeof (*t1));
        !          1805: 
        !          1806:   /* swap the send and the receive. */
        !          1807:   t1->dest = th->source;
        !          1808:   t1->source = th->dest;
        !          1809: 
        !          1810: 
        !          1811:   t1->seq = net32(sk->send_seq++);
        !          1812: 
        !          1813:   /* contains the one that needs to be acked. */
        !          1814:   sk->fin_seq = th->seq+1;
        !          1815: 
        !          1816:   buff->h.seq = sk->send_seq;
        !          1817:   t1->window = net16(sk->prot->rspace(sk));
        !          1818: 
        !          1819:   t1->res1=0;
        !          1820:   t1->res2=0;
        !          1821:   t1->rst = 0;
        !          1822:   t1->urg = 0;
        !          1823:   t1->syn = 0;
        !          1824:   t1->psh = 0;
        !          1825:   t1->ack = 1; 
        !          1826:   t1->fin = 1;
        !          1827:   t1->ack_seq = net32(sk->acked_seq);
        !          1828: 
        !          1829:   t1->doff = sizeof (*t1)/4;
        !          1830:   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
        !          1831: 
        !          1832:   /* can't just queue this up.  It should go at the end of
        !          1833:      the write queue. */
        !          1834:   if (sk->wback != NULL)
        !          1835:     {
        !          1836:       buff->next = NULL;
        !          1837:       sk->wback->next = buff;
        !          1838:       sk->wback = buff;
        !          1839:     }
        !          1840:   else
        !          1841:     {
        !          1842:       sk->prot->queue_xmit (sk, dev, buff,0);
        !          1843:     }
        !          1844: 
        !          1845:   return (0);
        !          1846: }
        !          1847: 
        !          1848: 
        !          1849: /* this will accept the next outstanding connection. */
        !          1850: 
        !          1851: static volatile struct sock *
        !          1852: tcp_accept (volatile struct sock *sk, int flags)
        !          1853: {
        !          1854:   volatile struct sock *newsk;
        !          1855:   struct sk_buff *skb;
        !          1856:   
        !          1857:   PRINTK ("tcp_accept(sk=%X, flags=%X)\n", sk, flags);
        !          1858:   print_sk(sk);
        !          1859:   /* we need to make sure that this socket is listening, and that
        !          1860:      it has something pending. */
        !          1861:   
        !          1862:   if (sk->state != TCP_LISTEN)
        !          1863:     {
        !          1864:       sk->err = EINVAL;
        !          1865:       return (NULL); 
        !          1866:     }
        !          1867:   /* avoid the race. */
        !          1868: 
        !          1869:   sk->inuse = 1;
        !          1870:   cli();
        !          1871:   while ( (skb = get_firstr(sk)) == NULL )
        !          1872:     {
        !          1873:       if (flags & O_NONBLOCK)
        !          1874:        {
        !          1875:          sti();
        !          1876:          release_sock (sk);
        !          1877:          sk->err = EAGAIN;
        !          1878:          return (NULL);
        !          1879:        }
        !          1880: 
        !          1881:       release_sock (sk);
        !          1882:       interruptible_sleep_on (sk->sleep);
        !          1883:       if (current->signal & ~current->blocked)
        !          1884:        {
        !          1885:           sti();
        !          1886:           sk->err = ERESTARTSYS;
        !          1887:           return (NULL);
        !          1888:        }
        !          1889: 
        !          1890:       sk->inuse = 1;
        !          1891:     }
        !          1892:   sti();
        !          1893: 
        !          1894:   /* now all we need to do is return skb->sk. */
        !          1895:   newsk = skb->sk;
        !          1896:   free_skb (skb, FREE_READ);
        !          1897:   release_sock (sk);
        !          1898:   return (newsk);
        !          1899: }
        !          1900: 
        !          1901: 
        !          1902: 
        !          1903: /* this will initiate an outgoing connection. */
        !          1904: static int
        !          1905: tcp_connect (volatile struct sock *sk, struct sockaddr_in *usin, int addr_len)
        !          1906: {
        !          1907:   struct sk_buff *buff;
        !          1908:   struct sockaddr_in sin;
        !          1909:   struct device *dev=NULL;
        !          1910:   unsigned char *ptr;
        !          1911:   int tmp;
        !          1912:   struct tcp_header *t1;
        !          1913:   if (sk->state != TCP_CLOSE) return (-EISCONN);
        !          1914:   if (addr_len < 8) return (-EINVAL);
        !          1915: 
        !          1916:   verify_area (usin, addr_len);
        !          1917:   memcpy_fromfs (&sin,usin, min(sizeof (sin), addr_len));
        !          1918: 
        !          1919:   if (sin.sin_family && sin.sin_family != AF_INET) return (-EAFNOSUPPORT);
        !          1920: 
        !          1921:   sk->daddr = sin.sin_addr.s_addr;
        !          1922:   sk->send_seq = timer_seq*SEQ_TICK-seq_offset;
        !          1923:   sk->rcv_ack_seq = sk->send_seq -1;
        !          1924:   sk->err = 0;
        !          1925:   sk->dummy_th.dest = sin.sin_port;
        !          1926: 
        !          1927:   buff=sk->prot->wmalloc(sk,MAX_SYN_SIZE,0);
        !          1928:   if (buff == NULL) 
        !          1929:     {
        !          1930:       return (-ENOMEM);
        !          1931:     }
        !          1932:   sk->inuse = 1;
        !          1933:   buff->mem_addr = buff;
        !          1934:   buff->mem_len = MAX_SYN_SIZE;
        !          1935:   buff->len=24;
        !          1936:   buff->sk = sk;
        !          1937:   t1=(struct tcp_header *)(buff + 1);
        !          1938:   /* put in the ip_header and routing stuff. */
        !          1939:   /* We need to build the routing stuff fromt the things saved
        !          1940:      in skb. */
        !          1941:   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
        !          1942:                                IP_TCP, NULL, MAX_SYN_SIZE);
        !          1943:   if (tmp < 0)
        !          1944:     {
        !          1945:       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
        !          1946:       release_sock (sk);
        !          1947:       return (-ENETUNREACH);
        !          1948:     }
        !          1949:   buff->len += tmp;
        !          1950:   t1 = (struct tcp_header *)((char *)t1 +tmp);
        !          1951: 
        !          1952:   memcpy (t1, (void *)&(sk->dummy_th), sizeof (*t1));
        !          1953:   t1->seq = net32(sk->send_seq++);
        !          1954:   buff->h.seq = sk->send_seq;
        !          1955:   t1->ack = 0;
        !          1956:   t1->window = 2;
        !          1957:   t1->res1=0;
        !          1958:   t1->res2=0;
        !          1959:   t1->rst = 0;
        !          1960:   t1->urg = 0;
        !          1961:   t1->psh = 0;
        !          1962:   t1->syn = 1;
        !          1963:   t1->urg_ptr = 0;
        !          1964:   t1->doff =6;
        !          1965:   /* put in the tcp options to say mtu. */
        !          1966:   ptr=(unsigned char *)(t1+1);
        !          1967:   ptr[0]=2;
        !          1968:   ptr[1]=4;
        !          1969:   ptr[2]=(dev->mtu- HEADER_SIZE) >> 8;
        !          1970:   ptr[3]=(dev->mtu- HEADER_SIZE) & 0xff;
        !          1971:   sk->mtu = dev->mtu - HEADER_SIZE;
        !          1972:   tcp_send_check (t1, sk->saddr, sk->daddr,
        !          1973:                  sizeof (struct tcp_header) + 4, sk);
        !          1974:   /* this must go first otherwise a really quick response will
        !          1975:      get reset. */
        !          1976:   sk->state = TCP_SYN_SENT;
        !          1977: 
        !          1978:   sk->prot->queue_xmit(sk, dev, buff, 0);
        !          1979:   
        !          1980:   sk->time_wait.len = TCP_CONNECT_TIME;
        !          1981:   reset_timer ((struct timer *)&sk->time_wait);
        !          1982:   sk->retransmits = TCP_RETR1 - TCP_SYN_RETRIES;
        !          1983:   release_sock (sk);
        !          1984:   return (0);
        !          1985: }
        !          1986: 
        !          1987: 
        !          1988: /* this functions checks to see if the tcp header is actually
        !          1989:    acceptible. */
        !          1990: 
        !          1991: static  int
        !          1992: tcp_sequence (volatile struct sock *sk, struct tcp_header *th, short len,
        !          1993:              struct options *opt, unsigned long saddr)
        !          1994: {
        !          1995:    /* this isn't quite right.  sk->acked_seq could be more recent
        !          1996:       than sk->window.  This is however close enough.  We will accept
        !          1997:       slightly more packets than we should, but it should not cause
        !          1998:       problems unless someone is trying to forge packets. */
        !          1999: 
        !          2000:   if (between(th->seq, sk->acked_seq, sk->acked_seq + sk->window)||
        !          2001:       between(th->seq + len-sizeof (*th), sk->acked_seq+1, 
        !          2002:              sk->acked_seq + sk->window))
        !          2003:     {
        !          2004:        return (1);
        !          2005:     }
        !          2006: 
        !          2007:   /* if it's too far ahead, send an ack to let the other end
        !          2008:      know what we expect. */
        !          2009:   if (after (th->seq, sk->acked_seq + sk->window))
        !          2010:     {
        !          2011:        tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr);
        !          2012:        return (0);
        !          2013:     }
        !          2014: 
        !          2015:   if (!th->rst)
        !          2016:     {
        !          2017:        if (len != th->doff*4 || th->fin || th->syn)
        !          2018:         {
        !          2019:            sk->delay_acks = 0;
        !          2020:         }
        !          2021: 
        !          2022:        /* try to resync things. */
        !          2023:        tcp_send_ack (net32(th->ack_seq), sk->acked_seq, sk, th, saddr);
        !          2024:     }
        !          2025: 
        !          2026:   /* in case it's just a late ack, let it through */
        !          2027:   if (th->ack && len == th->doff*4 && after (th->seq, sk->acked_seq - 4096) &&
        !          2028:       !th->fin && !th->syn) return (1);
        !          2029: 
        !          2030:   return (0);
        !          2031: }
        !          2032: 
        !          2033: /* This deals with the tcp option.  It isn't very general yet. */
        !          2034: static void
        !          2035: tcp_options (volatile struct sock *sk, struct tcp_header *th)
        !          2036: {
        !          2037:   unsigned char *ptr;
        !          2038:   ptr = (unsigned char *)(th + 1);
        !          2039:   if (ptr[0] != 2 || ptr[1] != 4)
        !          2040:     {
        !          2041:        sk->mtu = min (sk->mtu, 576-HEADER_SIZE);
        !          2042:        return;
        !          2043:     }
        !          2044:   sk->mtu = min (sk->mtu, ptr[2]*256 + ptr[3] - HEADER_SIZE);
        !          2045: }
        !          2046: 
        !          2047: int
        !          2048: tcp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
        !          2049:        unsigned long daddr, unsigned short len,
        !          2050:        unsigned long saddr, int redo, struct ip_protocol * protocol)
        !          2051: {
        !          2052:   struct tcp_header *th;
        !          2053:   volatile struct sock *sk;
        !          2054: 
        !          2055:   th = skb->h.th;
        !          2056:   /* find the socket. */
        !          2057:   sk=get_sock(&tcp_prot, net16(th->dest), saddr, th->source, daddr);
        !          2058:   PRINTK("<<\n");
        !          2059:   PRINTK("len = %d, redo = %d, skb=%X\n", len, redo, skb);
        !          2060: 
        !          2061:   if (sk)
        !          2062:     {
        !          2063:       PRINTK ("sk = %X:\n",sk);
        !          2064:       print_sk (sk);
        !          2065:     }
        !          2066: 
        !          2067:   if (!redo)
        !          2068:     {
        !          2069:        if (th->check && tcp_check (th, len, saddr, daddr ))
        !          2070:         {
        !          2071:            skb->sk = NULL;
        !          2072:            free_skb (skb, 0);
        !          2073:            /* we don't release the socket because it was never
        !          2074:               marked in use. */
        !          2075:            return (0);
        !          2076:         }
        !          2077: 
        !          2078:        /*See if we know about the socket. */
        !          2079:        if (sk == NULL)
        !          2080:        {
        !          2081:          if (!th->rst)
        !          2082:            tcp_reset (daddr, saddr, th, &tcp_prot, opt,dev);
        !          2083:          skb->sk = NULL;
        !          2084:          free_skb (skb, 0);
        !          2085:          return (0);
        !          2086:        }
        !          2087: 
        !          2088:        skb->len = len;
        !          2089:        skb->sk = sk;
        !          2090:        skb->acked = 0;
        !          2091:        skb->used = 0;
        !          2092:        skb->free = 0;
        !          2093:        skb->urg_used = 0;
        !          2094:        skb->saddr = daddr;
        !          2095:        skb->daddr = saddr;
        !          2096: 
        !          2097:        th->seq = net32(th->seq);
        !          2098: 
        !          2099:        cli();
        !          2100: 
        !          2101:        /* we may need to add it to the backlog here. */
        !          2102:        if (sk->inuse)
        !          2103:         {
        !          2104:            if (sk->back_log == NULL)
        !          2105:              {
        !          2106:                 sk->back_log = skb;
        !          2107:                 skb->next = skb;
        !          2108:                 skb->prev = skb;
        !          2109:              }
        !          2110:            else
        !          2111:              {
        !          2112:                 skb->next = sk->back_log;
        !          2113:                 skb->prev = sk->back_log->prev;
        !          2114:                 skb->prev->next = skb;
        !          2115:                 skb->next->prev = skb;
        !          2116:              }
        !          2117:            sti();
        !          2118:            return (0);
        !          2119:         }
        !          2120:        sk->inuse = 1;
        !          2121:        sti();
        !          2122:     }
        !          2123: 
        !          2124:   /* charge the memory to the socket. */
        !          2125:   if (sk->rmem_alloc + skb->mem_len >= SK_RMEM_MAX)
        !          2126:     {
        !          2127:        skb->sk = NULL;
        !          2128:        free_skb (skb, 0);
        !          2129:        release_sock (sk);
        !          2130:        return (0);
        !          2131:     }
        !          2132:        
        !          2133:   sk->rmem_alloc += skb->mem_len;
        !          2134: 
        !          2135:   PRINTK ("About to do switch. \n");
        !          2136: 
        !          2137:   /* now deal with it. */
        !          2138: 
        !          2139:   switch (sk->state)
        !          2140:     {
        !          2141:        /* this should close the system down if it's waiting for an
        !          2142:          ack that is never going to be sent. */
        !          2143:     case TCP_LAST_ACK:
        !          2144:       if (th->rst)
        !          2145:        {
        !          2146:          sk->err = ECONNRESET;
        !          2147:          sk->state = TCP_CLOSE;
        !          2148:          if (!sk->dead)
        !          2149:            {
        !          2150:              wake_up (sk->sleep);
        !          2151:            }
        !          2152:          free_skb (skb, FREE_READ);
        !          2153:          release_sock(sk);
        !          2154:          return (0);
        !          2155:        }
        !          2156: 
        !          2157:     case TCP_ESTABLISHED:
        !          2158:     case TCP_FIN_WAIT1:
        !          2159:     case TCP_FIN_WAIT2:
        !          2160:     case TCP_TIME_WAIT:
        !          2161:    
        !          2162:       if (!tcp_sequence (sk, th, len, opt, saddr))
        !          2163:        {
        !          2164:           free_skb (skb, FREE_READ);
        !          2165:           release_sock(sk);
        !          2166:           return (0);
        !          2167:        }
        !          2168:       if (th->rst)
        !          2169:        {
        !          2170:          sk->err = ECONNRESET;
        !          2171:          sk->state = TCP_CLOSE;
        !          2172:          if (!sk->dead)
        !          2173:            {
        !          2174:              wake_up (sk->sleep);
        !          2175:            }
        !          2176:          free_skb (skb, FREE_READ);
        !          2177:          release_sock(sk);
        !          2178:          return (0);
        !          2179:        }
        !          2180: 
        !          2181:       if (opt->security != 0 || opt->compartment != 0 || th->syn)
        !          2182:        {
        !          2183:           sk->err = ECONNRESET;
        !          2184:           sk->state = TCP_CLOSE;
        !          2185:           tcp_reset (daddr, saddr,  th, sk->prot, opt,dev);
        !          2186:           if (!sk->dead)
        !          2187:             {
        !          2188:                wake_up (sk->sleep);
        !          2189:             }
        !          2190:           free_skb (skb, FREE_READ);
        !          2191:           release_sock(sk);
        !          2192:           return (0);
        !          2193:        }
        !          2194: 
        !          2195:       if (th->ack)
        !          2196:        {
        !          2197:           if(!tcp_ack (sk, th, saddr))
        !          2198:            {
        !          2199:               free_skb (skb, FREE_READ);
        !          2200:               release_sock(sk);
        !          2201:               return (0);
        !          2202:           }
        !          2203:        }
        !          2204:       if (th->urg)
        !          2205:        {
        !          2206:          if (tcp_urg (sk, th, saddr))
        !          2207:            {
        !          2208:               free_skb (skb, FREE_READ);
        !          2209:               release_sock(sk);
        !          2210:               return (0);
        !          2211:            }
        !          2212:        }
        !          2213: 
        !          2214:       if ( tcp_data (skb, sk, saddr, len))
        !          2215:        {
        !          2216:           free_skb (skb, FREE_READ);
        !          2217:           release_sock(sk);
        !          2218:           return (0);
        !          2219:        }
        !          2220: 
        !          2221:       if (!th->fin)
        !          2222:        {
        !          2223:          release_sock(sk);
        !          2224:          return (0);
        !          2225:        }
        !          2226: 
        !          2227:       tcp_fin (sk, th, saddr, dev);
        !          2228:       release_sock(sk);
        !          2229:       return (0);
        !          2230: 
        !          2231:     case TCP_CLOSE:
        !          2232: 
        !          2233:       if (sk->dead || sk->daddr)
        !          2234:        {
        !          2235:           PRINTK ("packet received for closed,dead socket\n");
        !          2236:           free_skb (skb, FREE_READ);
        !          2237:           release_sock (sk);
        !          2238:           return (0);
        !          2239:        }
        !          2240: 
        !          2241:       if (!th->rst)
        !          2242:        {
        !          2243:          if (!th->ack)
        !          2244:            th->ack_seq=0;
        !          2245:          tcp_reset (daddr, saddr, th, sk->prot, opt,dev);
        !          2246:        }
        !          2247:       free_skb (skb, FREE_READ);
        !          2248:       release_sock(sk);
        !          2249:       return (0);
        !          2250: 
        !          2251:     case TCP_LISTEN:
        !          2252:       if (th->rst)
        !          2253:        {
        !          2254:           free_skb (skb, FREE_READ);
        !          2255:           release_sock(sk);
        !          2256:           return (0);
        !          2257:        }
        !          2258:       if (th->ack)
        !          2259:        {
        !          2260:          tcp_reset (daddr, saddr, th, sk->prot, opt,dev );
        !          2261:          free_skb (skb, FREE_READ);
        !          2262:          release_sock(sk);
        !          2263:          return (0);
        !          2264:        }
        !          2265: 
        !          2266:       if (th->syn)
        !          2267:        {
        !          2268: /*       if (opt->security != 0 || opt->compartment != 0)
        !          2269:            {
        !          2270:              tcp_reset (daddr, saddr, th, prot, opt,dev);
        !          2271:              release_sock(sk);
        !          2272:              return (0);
        !          2273:            } */
        !          2274: 
        !          2275:          /* now we just put the whole thing including the header
        !          2276:             and saddr, and protocol pointer into the buffer.
        !          2277:             We can't respond until the user tells us to accept
        !          2278:             the connection. */
        !          2279: 
        !          2280:          tcp_conn_request (sk, skb, daddr, saddr, opt, dev);
        !          2281: 
        !          2282:          release_sock(sk);
        !          2283:          return (0);
        !          2284:        }
        !          2285: 
        !          2286:       free_skb (skb, FREE_READ);
        !          2287:       release_sock(sk);
        !          2288:       return (0);
        !          2289: 
        !          2290:     default:
        !          2291:       if (!tcp_sequence (sk, th, len, opt, saddr)) 
        !          2292:        {
        !          2293:           free_skb (skb, FREE_READ);
        !          2294:           release_sock(sk);
        !          2295:           return (0);
        !          2296:        }
        !          2297: 
        !          2298:     case TCP_SYN_SENT:
        !          2299:       if (th->rst)
        !          2300:        {
        !          2301:          sk->err = ECONNREFUSED;
        !          2302:          sk->state = TCP_CLOSE;
        !          2303:          if (!sk->dead)
        !          2304:            {
        !          2305:              wake_up (sk->sleep);
        !          2306:            }
        !          2307:          free_skb (skb, FREE_READ);
        !          2308:          release_sock(sk);
        !          2309:          return (0);
        !          2310:        }
        !          2311: /*      if (opt->security != 0 || opt->compartment != 0 )
        !          2312:        {
        !          2313:          sk->err = ECONNRESET;
        !          2314:          sk->state = TCP_CLOSE;
        !          2315:          tcp_reset (daddr, saddr,  th, sk->prot, opt, dev);
        !          2316:          if (!sk->dead)
        !          2317:          {
        !          2318:          wake_up (sk->sleep);
        !          2319:          }
        !          2320:          free_skb (skb, FREE_READ);
        !          2321:          release_sock(sk);
        !          2322:          return (0);
        !          2323:        } */
        !          2324: 
        !          2325:       if (!th->ack) 
        !          2326:        {
        !          2327:          if (th->syn)
        !          2328:            {
        !          2329:              sk->state = TCP_SYN_RECV;
        !          2330:            }
        !          2331: 
        !          2332:          free_skb (skb, FREE_READ);
        !          2333:          release_sock(sk);
        !          2334:          return (0);
        !          2335:        }
        !          2336: 
        !          2337:       switch (sk->state)
        !          2338:        {
        !          2339:        case TCP_SYN_SENT:
        !          2340:          if (!tcp_ack(sk, th, saddr))
        !          2341:            {
        !          2342:              tcp_reset(daddr, saddr, th, sk->prot, opt,dev);
        !          2343:              free_skb (skb, FREE_READ);
        !          2344:              release_sock(sk);
        !          2345:              return (0);
        !          2346:            }
        !          2347: 
        !          2348:          /* if the syn bit is also set, switch to tcp_syn_recv,
        !          2349:             and then to established. */
        !          2350:              
        !          2351:          if (!th->syn) 
        !          2352:            {
        !          2353:              free_skb (skb, FREE_READ);
        !          2354:              release_sock (sk);
        !          2355:              return (0);
        !          2356:            }
        !          2357: 
        !          2358:          /* ack the syn and fall through. */
        !          2359:          sk->acked_seq = th->seq+1;
        !          2360:          sk->fin_seq = th->seq;
        !          2361:          tcp_send_ack (sk->send_seq, th->seq+1, sk, 
        !          2362:                             th, sk->daddr);
        !          2363:        
        !          2364:        case TCP_SYN_RECV:
        !          2365:          if (!tcp_ack(sk, th, saddr))
        !          2366:            {
        !          2367:              tcp_reset(daddr, saddr, th, sk->prot, opt, dev);
        !          2368:              free_skb (skb, FREE_READ);
        !          2369:              release_sock(sk);
        !          2370:              return (0);
        !          2371:            }
        !          2372: 
        !          2373:          sk->state = TCP_ESTABLISHED;
        !          2374:          /* now we need to finish filling out some of the tcp
        !          2375:             header. */
        !          2376: 
        !          2377:          /* we need to check for mtu info. */
        !          2378:          tcp_options(sk, th);
        !          2379:          sk->dummy_th.dest = th->source;
        !          2380:          sk->copied_seq = sk->acked_seq-1;
        !          2381:          if (!sk->dead)
        !          2382:            {
        !          2383:              wake_up (sk->sleep);
        !          2384:            }
        !          2385: 
        !          2386:          /* now process the rest like we were already in the established
        !          2387:             state. */
        !          2388:          if (th->urg)
        !          2389:            if (tcp_urg (sk, th, saddr))
        !          2390:              {
        !          2391:                 free_skb (skb, FREE_READ);
        !          2392:                 release_sock(sk);
        !          2393:                 return (0);
        !          2394:              }
        !          2395:          if (tcp_data (skb, sk, saddr, len))
        !          2396:            free_skb (skb, FREE_READ);
        !          2397:          
        !          2398:          if (th->fin)
        !          2399:            tcp_fin(sk, th, saddr, dev);
        !          2400: 
        !          2401:          release_sock(sk);
        !          2402:          return (0);
        !          2403:        }
        !          2404: 
        !          2405:       if (th->urg)
        !          2406:        {
        !          2407:          if (tcp_urg (sk, th, saddr))
        !          2408:            {
        !          2409:               free_skb (skb, FREE_READ);
        !          2410:               release_sock (sk);
        !          2411:               return (0);
        !          2412:            }
        !          2413:        }
        !          2414: 
        !          2415:       if (tcp_data (skb, sk, saddr, len))
        !          2416:        {
        !          2417:           free_skb (skb, FREE_READ);
        !          2418:           release_sock (sk);
        !          2419:           return (0);
        !          2420:        }
        !          2421: 
        !          2422:       if (!th->fin)
        !          2423:        {
        !          2424:          release_sock(sk);
        !          2425:          return (0);
        !          2426:        }
        !          2427:       tcp_fin (sk, th, saddr, dev);
        !          2428:       release_sock(sk);
        !          2429:       return (0);
        !          2430:     }
        !          2431: }
        !          2432: 
        !          2433: 
        !          2434: /* this routine sends a packet with an out of date sequence number. It
        !          2435:    assumes the other end will try to ack it. */
        !          2436: 
        !          2437: static  void
        !          2438: tcp_write_wakeup(volatile struct sock *sk)
        !          2439: {
        !          2440:   struct sk_buff *buff;
        !          2441:   struct tcp_header *t1;
        !          2442:   struct device *dev=NULL;
        !          2443:   int tmp;
        !          2444:   if (sk -> state != TCP_ESTABLISHED) return;
        !          2445: 
        !          2446:   buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1);
        !          2447:   /* no big loss. */
        !          2448:   if (buff == NULL) return;
        !          2449: 
        !          2450:   buff->mem_addr = buff;
        !          2451:   buff->mem_len = MAX_ACK_SIZE;
        !          2452:   buff->len=sizeof (struct tcp_header);
        !          2453:   buff->free = 1;
        !          2454:   buff->sk = sk;
        !          2455:   PRINTK ("in tcp_write_wakeup\n");
        !          2456:   t1=(struct tcp_header *)(buff + 1);
        !          2457: 
        !          2458:   /* put in the ip_header and routing stuff. */
        !          2459:   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
        !          2460:                                IP_TCP, sk->opt, MAX_ACK_SIZE);
        !          2461:   if (tmp < 0)
        !          2462:     {
        !          2463:       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
        !          2464:       return;
        !          2465:     }
        !          2466: 
        !          2467:   buff->len += tmp;
        !          2468:   t1 = (struct tcp_header *)((char *)t1 +tmp);
        !          2469: 
        !          2470:   memcpy (t1,(void *) &sk->dummy_th, sizeof (*t1));
        !          2471: 
        !          2472:   /* use a previous sequence.  This should cause the other end
        !          2473:      to send an ack. */
        !          2474:   t1->seq = net32(sk->send_seq-1);
        !          2475:   t1->ack = 1; 
        !          2476:   t1->res1= 0;
        !          2477:   t1->res2= 0;
        !          2478:   t1->rst = 0;
        !          2479:   t1->urg = 0;
        !          2480:   t1->psh = 0;
        !          2481:   t1->fin = 0;
        !          2482:   t1->syn = 0;
        !          2483:   t1->ack_seq = net32(sk->acked_seq);
        !          2484:   t1->window = net16(sk->prot->rspace(sk));
        !          2485:   t1->doff = sizeof (*t1)/4;
        !          2486:   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
        !          2487:   /* send it and free it.  This will prevent the timer from 
        !          2488:      automatically being restarted. */
        !          2489:   sk->prot->queue_xmit(sk, dev, buff, 1);
        !          2490: 
        !          2491: }
        !          2492: 
        !          2493: struct proto tcp_prot =
        !          2494: {
        !          2495:   sock_wmalloc,
        !          2496:   sock_rmalloc,
        !          2497:   sock_wfree,
        !          2498:   sock_rfree,
        !          2499:   sock_rspace,
        !          2500:   sock_wspace,
        !          2501:   tcp_close,
        !          2502:   tcp_read,
        !          2503:   tcp_write,
        !          2504:   NULL,
        !          2505:   NULL,
        !          2506:   ip_build_header,
        !          2507:   tcp_connect,
        !          2508:   tcp_accept,
        !          2509:   ip_queue_xmit,
        !          2510:   tcp_retransmit,
        !          2511:   tcp_write_wakeup,
        !          2512:   tcp_read_wakeup,
        !          2513:   tcp_rcv,
        !          2514:   tcp_select,
        !          2515:   tcp_ioctl,
        !          2516:   NULL,
        !          2517:   128,
        !          2518:   0,
        !          2519:   {NULL,}
        !          2520: };
        !          2521: 
        !          2522: 
        !          2523: 
        !          2524: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.