This source file includes following definitions.
- min
 
- print_th
 
- get_firstr
 
- diff
 
- tcp_time_wait
 
- tcp_retransmit
 
- tcp_err
 
- tcp_select
 
- tcp_ioctl
 
- tcp_check
 
- tcp_send_check
 
- tcp_send_partial
 
- tcp_send_ack
 
- tcp_build_header
 
- tcp_write
 
- tcp_sendto
 
- tcp_read_wakeup
 
- cleanup_rbuf
 
- tcp_read_urg
 
- tcp_read
 
- tcp_shutdown
 
- tcp_recvfrom
 
- tcp_reset
 
- tcp_conn_request
 
- tcp_close
 
- tcp_write_xmit
 
- tcp_ack
 
- tcp_data
 
- tcp_urg
 
- tcp_fin
 
- tcp_accept
 
- tcp_connect
 
- tcp_sequence
 
- tcp_options
 
- tcp_rcv
 
- tcp_write_wakeup
 
   1  
   2  
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 #include <linux/types.h>
  68 #include <linux/sched.h>
  69 #include <linux/mm.h>
  70 #include <linux/string.h>
  71 #include <linux/socket.h>
  72 #include <netinet/in.h>
  73 #include <linux/fcntl.h>
  74 #include "timer.h"
  75 #include "ip.h"
  76 #include "icmp.h"
  77 #include "tcp.h"
  78 #include "sock.h"
  79 #include "arp.h"
  80 #include <linux/errno.h>
  81 #include <linux/timer.h>
  82 #include <asm/system.h>
  83 #include <asm/segment.h>
  84 #include <linux/mm.h>
  85 
  86 #include <linux/termios.h> 
  87 
  88 #ifdef PRINTK
  89 #undef PRINTK
  90 #endif
  91 
  92 #undef TCP_DEBUG
  93 
  94 #ifdef TCP_DEBUG
  95 #define PRINTK printk
  96 #else
  97 #define PRINTK dummy_routine
  98 #endif
  99 
 100 #define tmax(a,b) (before ((a),(b)) ? (b) : (a))
 101 #define swap(a,b) {unsigned long c; c=a; a=b; b=c;}
 102 
 103 extern struct proto tcp_prot;
 104 
 105 static  int 
 106 min (unsigned int a, unsigned int b)
     
 107 {
 108    if (a < b) return (a);
 109    return (b);
 110 }
 111 
 112 void
 113 print_th (struct tcp_header *th)
     
 114 {
 115    unsigned char *ptr;
 116    ptr = (unsigned char *)(th + 1);
 117    PRINTK ("tcp header:\n");
 118    PRINTK ("  source=%d, dest=%d, seq =%d, ack_seq = %d\n",
 119            net16(th->source), net16(th->dest), net32(th->seq),
 120            net32(th->ack_seq));
 121    PRINTK ("  fin=%d, syn=%d, rst=%d, psh=%d, ack=%d, urg=%d res1=%d res2=%d\n"
 122            ,th->fin, th->syn, th->rst, th->psh, th->ack, th->urg,
 123            th->res1, th->res2);
 124    PRINTK ("  window = %d, check = %d urg_ptr = %d\n",
 125            net16(th->window), net16(th->check), net16(th->urg_ptr));
 126    PRINTK ("  doff = %d\n",th->doff);
 127    PRINTK ("options = %d %d %d %d\n", ptr[0], ptr[1], ptr[2], ptr[3]);
 128  }
 129 
 130  
 131 static  struct sk_buff *
 132 get_firstr(volatile struct sock *sk)
     
 133 {
 134    struct sk_buff *skb;
 135    skb = sk->rqueue;
 136    if (skb == NULL) return (NULL);
 137    sk->rqueue = skb->next;
 138    if (sk->rqueue == skb)
 139      {
 140        sk->rqueue = NULL;
 141      }
 142    else
 143      {
 144        sk->rqueue->prev=skb->prev;
 145        sk->rqueue->prev->next = sk->rqueue;
 146      }
 147    return (skb);
 148 }
 149 
 150 static  long
 151 diff (unsigned long seq1, unsigned long seq2)
     
 152 {
 153    long d;
 154    d=seq1-seq2;
 155    if (d > 0) return (d);
 156    
 157    return (~d+1);
 158 }
 159 
 160  
 161 static  void
 162 tcp_time_wait (volatile struct sock *sk)
     
 163 {
 164    sk->state = TCP_TIME_WAIT;
 165    sk->time_wait.len = TCP_TIMEWAIT_LEN;
 166    sk->timeout = TIME_CLOSE;
 167    reset_timer ((struct timer *)&sk->time_wait);
 168 }
 169 
 170 static void
 171 tcp_retransmit (volatile struct sock *sk, int all)
     
 172 {
 173    if (all) 
 174      {
 175         ip_retransmit (sk, all);
 176         return;
 177      }
 178    sk->rtt *= 2; 
 179    if (sk->cong_window > 1)
 180      sk->cong_window = sk->cong_window / 2;
 181    sk->exp_growth = 0;
 182 
 183    
 184    ip_retransmit (sk, all);
 185    
 186 }
 187 
 188 
 189 
 190 
 191 
 192 
 193 
 194 
 195 void
 196 tcp_err (int err, unsigned char *header, unsigned long daddr,
     
 197          unsigned long saddr, struct ip_protocol *protocol)
 198 {
 199    struct tcp_header *th;
 200    volatile struct sock *sk;
 201    
 202    PRINTK ("tcp_err(err=%d, header=%X, daddr=%X saddr=%X, protocol=%X)\n",
 203            err, header, daddr, saddr, protocol);
 204 
 205    th = (struct tcp_header *)header;
 206    sk = get_sock (&tcp_prot, net16(th->dest), saddr, th->source, daddr);
 207    print_th (th);
 208 
 209    if (sk == NULL) return;
 210 
 211    if (err & 0xff00 == (ICMP_SOURCE_QUENCH << 8))
 212      {
 213         
 214 
 215 
 216         if (sk->cong_window > 1)
 217           sk->cong_window --;
 218 
 219         return;
 220      }
 221 
 222    sk->err = icmp_err_convert[err & 0xff].errno;
 223    if (icmp_err_convert[err & 0xff].fatal)
 224      {
 225         if (sk->state != TCP_ESTABLISHED)
 226           sk->state = TCP_CLOSE;
 227         sk->prot->close(sk, 0);
 228      }
 229 
 230    return;
 231    
 232 }
 233 
 234 static int
 235 tcp_select (volatile struct sock *sk, int sel_type, select_table *wait)
     
 236 {
 237   switch (sel_type)
 238     {
 239     case SEL_IN:
 240        select_wait (sk->sleep, wait);
 241        if (sk->rqueue != NULL &&
 242            (between (sk->copied_seq, sk->rqueue->next->h.th->seq - 1,
 243                      sk->rqueue->next->h.th->seq + sk->rqueue->next->len) ||
 244             sk->state == TCP_LISTEN))
 245          {
 246             return (1);
 247          }
 248 
 249       switch (sk->state)
 250         {
 251         case TCP_LISTEN:
 252         case TCP_ESTABLISHED:
 253         case TCP_FIN_WAIT1:
 254         case TCP_SYN_SENT:
 255         case TCP_SYN_RECV:
 256         case TCP_FIN_WAIT2:
 257            return (0);
 258         default:
 259            return (1);
 260         }
 261 
 262     case SEL_OUT:
 263        select_wait (sk->sleep, wait);
 264 
 265        switch(sk->state)
 266          {
 267          default:
 268            return (1);
 269 
 270          case TCP_SYN_SENT:
 271          case TCP_SYN_RECV:
 272            return (0);
 273 
 274          case TCP_ESTABLISHED:
 275          case TCP_CLOSE_WAIT:
 276            
 277 
 278            if (sk->prot->wspace(sk) >= MIN_WRITE_SPACE) return (1);
 279            return (0);
 280          }
 281 
 282     case SEL_EX:
 283       select_wait(sk->sleep,wait);
 284       if (sk->err) return (1);
 285       if (sk->state == TCP_TIME_WAIT ||
 286           sk->state == TCP_LAST_ACK)
 287         return (1);
 288       return (0);
 289     }
 290   return (0);
 291 }
 292 
 293 static int
 294 tcp_ioctl (volatile struct sock *sk, int cmd, unsigned long arg)
     
 295 {
 296   PRINTK ("tcp_ioctl (sk=%X, cmd = %d, arg=%X)\n", sk, cmd, arg);
 297    switch (cmd)
 298      {
 299        default:
 300         return (-EINVAL);
 301 
 302       case TIOCINQ:
 303 
 304         {
 305           unsigned long amount;
 306           unsigned long counted;
 307           int sum;
 308           struct sk_buff *skb;
 309 
 310           if (sk->state == TCP_LISTEN)
 311             return (-EINVAL);
 312 
 313           counted = sk->copied_seq;
 314           amount = 0;
 315           if (sk->rqueue != NULL)
 316             {
 317               skb = sk->rqueue->next;
 318               
 319               do {
 320                 if (before (counted+1, skb->h.th->seq)) break;
 321                 sum = skb->len + skb->h.th->seq - counted;
 322                 if (sum > 0)
 323                   {
 324                     amount += sum;
 325                     counted += sum;
 326                   }
 327                 if (skb->h.th->psh) break;
 328                 skb = skb->next;
 329                 
 330               } while (skb != sk->rqueue->next);
 331             }
 332           PRINTK ("returning %d\n", amount);
 333           verify_area ((void *)arg, sizeof (unsigned long));
 334           put_fs_long (amount, (unsigned long *)arg);
 335           return (0);
 336         }
 337 
 338        case SIOCATMARK:
 339         {
 340           struct sk_buff *skb;
 341           int answ=0;
 342           
 343           if (sk->rqueue != NULL)
 344             {
 345               skb = sk->rqueue->next;
 346               if (sk->copied_seq+1 == skb->h.th->seq && skb->h.th->urg)
 347                 answ = 1;
 348             }
 349           verify_area ((void *) arg, sizeof (unsigned long));
 350           put_fs_long (answ, (void *) arg);
 351           return (0);
 352         }
 353        
 354       case TIOCOUTQ:
 355         {
 356           unsigned long amount;
 357           if (sk->state == TCP_LISTEN)
 358             return (-EINVAL);
 359           amount = sk->prot->wspace(sk)/2;
 360           verify_area ((void *)arg, sizeof (unsigned long));
 361           put_fs_long (amount, (unsigned long *)arg);
 362           return (0);
 363         }
 364 
 365      }
 366 }
 367 
 368 
 369 
 370 static  unsigned short
 371 tcp_check (struct tcp_header *th, int len, unsigned long saddr,
     
 372            unsigned long daddr)
 373 {     
 374    unsigned long sum;
 375    
 376    if (saddr == 0) saddr = MY_IP_ADDR;
 377    print_th (th);
 378    __asm__("\t addl %%ecx,%%ebx\n"
 379            "\t adcl %%edx,%%ebx\n"
 380            "\t adcl $0, %%ebx\n"
 381            : "=b" (sum)
 382            : "0" (daddr), "c" (saddr), "d" ((net16(len) << 16) + IPPROTO_TCP*256)
 383            : "cx","bx","dx" );
 384    
 385    if (len > 3)
 386      {
 387         __asm__(
 388                 "\tclc\n"
 389                 "1:\n"
 390                 "\t lodsl\n"
 391                 "\t adcl %%eax, %%ebx\n"
 392                 "\t loop 1b\n"
 393                 "\t adcl $0, %%ebx\n"
 394                 : "=b" (sum) , "=S" (th)
 395                 : "0" (sum), "c" (len/4) ,"1" (th)
 396                 : "ax", "cx", "bx", "si" );
 397      }
 398    
 399    
 400    __asm__(
 401            "\t movl %%ebx, %%ecx\n"
 402            "\t shrl $16,%%ecx\n"
 403            "\t addw %%cx, %%bx\n"
 404            "\t adcw $0, %%bx\n"
 405            : "=b" (sum)
 406            : "0" (sum)
 407            : "bx", "cx");
 408    
 409    
 410    if ((len & 2) != 0)
 411      {
 412         __asm__("\t lodsw\n"
 413                 "\t addw %%ax,%%bx\n"
 414                 "\t adcw $0, %%bx\n"
 415                 : "=b" (sum), "=S" (th)
 416                 : "0" (sum) ,"1" (th)
 417                 : "si", "ax", "bx");
 418      }
 419    
 420    
 421    if ((len & 1) != 0)
 422      {
 423         __asm__("\t lodsb\n"
 424                 "\t movb $0,%%ah\n"
 425                 "\t addw %%ax,%%bx\n"
 426                 "\t adcw $0, %%bx\n"
 427                 : "=b" (sum)
 428                 : "0" (sum) ,"S" (th)
 429                 : "si", "ax", "bx");
 430      }
 431    
 432    
 433 
 434    return ((~sum) & 0xffff);
 435 }
 436 
 437 
 438 static  void
 439 tcp_send_check (struct tcp_header *th, unsigned long saddr, 
     
 440                  unsigned long daddr, int len, volatile struct sock *sk)
 441 {
 442 
 443    th->check = 0;
 444    if (sk && sk->no_check) return;
 445    th->check = tcp_check (th, len, saddr, daddr);
 446    return;
 447 }
 448 
 449 static void
 450 tcp_send_partial(volatile struct sock *sk)
     
 451 {
 452   struct sk_buff *skb;
 453   
 454   if (sk == NULL || sk->send_tmp == NULL) return;
 455   
 456   skb = sk->send_tmp;
 457   
 458   tcp_send_check (skb->h.th, sk->saddr, sk->daddr,
 459                   skb->len-(unsigned long)skb->h.th +
 460                   (unsigned long)(skb+1), sk);
 461   
 462   skb->h.seq = sk->send_seq;
 463   if (after (sk->send_seq , sk->window_seq) ||
 464       sk->packets_out >= sk->cong_window)
 465     {
 466       PRINTK ("sk->cong_window = %d, sk->packets_out = %d\n",
 467               sk->cong_window, sk->packets_out);
 468       PRINTK ("sk->send_seq = %d, sk->window_seq = %d\n",
 469               sk->send_seq, sk->window_seq);
 470       skb->next = NULL;
 471       skb->magic = TCP_WRITE_QUEUE_MAGIC;
 472       if (sk->wback == NULL)
 473         {
 474           sk->wfront=skb;
 475         }
 476       else
 477         {
 478           sk->wback->next = skb;
 479         }
 480       sk->wback = skb;
 481     }
 482   else
 483     {
 484       sk->prot->queue_xmit (sk, skb->dev, skb,0);
 485     }
 486   sk->send_tmp = NULL;
 487 }
 488 
 489 
 490 
 491 
 492 static  void
 493 tcp_send_ack (unsigned long sequence, unsigned long ack,
     
 494                volatile struct sock *sk,
 495                struct tcp_header *th, unsigned long daddr)
 496 {
 497    struct sk_buff *buff;
 498    struct tcp_header *t1;
 499    struct device *dev=NULL;
 500    int tmp;
 501 
 502    
 503 
 504 
 505    buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1, GFP_ATOMIC);
 506    if (buff == NULL) 
 507      {
 508         
 509         sk->ack_backlog++;
 510         if (sk->timeout != TIME_WRITE && tcp_connected (sk->state))
 511           {
 512              sk->timeout = TIME_WRITE;
 513              sk->time_wait.len = 10; 
 514              reset_timer ((struct timer *)&sk->time_wait);
 515           }
 516         return;
 517      }
 518 
 519    buff->mem_addr = buff;
 520    buff->mem_len = MAX_ACK_SIZE;
 521    buff->lock = 0;
 522    buff->len=sizeof (struct tcp_header);
 523    buff->sk = sk;
 524    t1 = (struct tcp_header *)(buff + 1);
 525    
 526    tmp = sk->prot->build_header (buff, sk->saddr, daddr, &dev,
 527                                  IPPROTO_TCP, sk->opt, MAX_ACK_SIZE);
 528    if (tmp < 0)
 529      {
 530        sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
 531        return;
 532      }
 533    buff->len += tmp;
 534    t1 = (struct tcp_header *)((char *)t1 +tmp);
 535 
 536    memcpy (t1, th, sizeof (*t1)); 
 537 
 538    
 539    t1->dest = th->source;
 540    t1->source = th->dest;
 541    t1->seq = net32(sequence);
 542    t1->ack = 1;
 543    sk->window = sk->prot->rspace(sk);
 544    t1->window = net16(sk->window);
 545    t1->res1=0;
 546    t1->res2=0;
 547    t1->rst = 0;
 548    t1->urg = 0;
 549    t1->syn = 0;
 550    t1->psh = 0;
 551    t1->fin = 0;
 552    if (ack == sk->acked_seq)
 553      {
 554         sk->ack_backlog = 0;
 555         sk->bytes_rcv = 0;
 556         sk->ack_timed = 0;
 557         if (sk->send_head == NULL &&
 558             sk->wfront == NULL)
 559           {
 560              delete_timer((struct timer *)&sk->time_wait);
 561              sk->timeout = 0;
 562           }
 563         
 564      }
 565    t1->ack_seq = net32(ack);
 566    t1->doff = sizeof (*t1)/4;
 567    tcp_send_check (t1, sk->saddr, daddr, sizeof (*t1), sk);
 568    sk->prot->queue_xmit(sk, dev, buff, 1);
 569 }
 570 
 571 
 572 static  int
 573 tcp_build_header(struct tcp_header *th, volatile struct sock *sk, int push)
     
 574 {
 575 
 576  
 577   memcpy (th,(void *) &(sk->dummy_th), sizeof (*th));
 578   th->seq = net32(sk->send_seq);
 579   th->psh = (push == 0) ? 1 : 0;
 580   th->doff = sizeof (*th)/4;
 581   th->ack = 1;
 582   th->fin = 0;
 583   sk->ack_backlog = 0;
 584   sk->bytes_rcv = 0;
 585   sk->ack_timed = 0;
 586   th->ack_seq = net32(sk->acked_seq);
 587   sk->window = sk->prot->rspace(sk);
 588   th->window = net16(sk->window);
 589 
 590   return (sizeof (*th));
 591 }
 592 
 593 
 594 
 595 
 596 static int
 597 tcp_write (volatile struct sock *sk, unsigned char *from,
     
 598            int len, int nonblock, unsigned flags)
 599 {
 600   int copied=0;
 601   int copy;
 602   int tmp;
 603   struct sk_buff *skb;
 604   unsigned char *buff;
 605   struct proto *prot;
 606   struct device *dev=NULL;
 607 
 608   PRINTK ("tcp_write (sk=%X, from=%X, len=%d, nonblock=%d, flags=%X)\n",
 609           sk, from, len, nonblock, flags);
 610 
 611   print_sk (sk);
 612 
 613   prot = sk->prot;
 614   while (len > 0)
 615     {
 616             
 617 
 618       sk->inuse = 1; 
 619       while (sk->state != TCP_ESTABLISHED && sk->state != TCP_CLOSE_WAIT)
 620         {
 621           if (sk->state != TCP_SYN_SENT &&
 622               sk->state != TCP_SYN_RECV)
 623            {
 624               release_sock (sk);
 625               PRINTK ("tcp_write: return 1\n");
 626               if (copied) return (copied);
 627 
 628               if (sk->err)
 629                 {
 630                   tmp = -sk->err;
 631                   sk->err = 0;
 632                   return (tmp);
 633                 }
 634 
 635               if (sk->keepopen)
 636                 {
 637                     send_sig (SIGPIPE, current, 0);
 638                 }
 639               return (-EPIPE);
 640             }
 641 
 642           if (nonblock)
 643             {
 644               PRINTK ("tcp_write: return 2\n");
 645               release_sock (sk);
 646               if (copied) return (copied);
 647               return (-EAGAIN);
 648             }
 649 
 650           
 651 
 652 
 653 
 654 
 655 
 656           release_sock (sk);
 657           cli();
 658           if (sk->state != TCP_ESTABLISHED && sk->state != TCP_CLOSE_WAIT)
 659             {
 660               interruptible_sleep_on (sk->sleep);
 661               if (current->signal & ~current->blocked)
 662                 {
 663                    sti();
 664                    PRINTK ("tcp_write: return 3\n");
 665                    if (copied) return (copied);
 666                    return (-ERESTARTSYS);
 667                 }
 668             }
 669           sti();
 670           sk->inuse = 1;
 671         }
 672 
 673       
 674       if (sk->send_tmp != NULL)
 675         {
 676           
 677           
 678           skb = sk->send_tmp;
 679           if (!(flags & MSG_OOB))
 680             {
 681               copy = min (sk->mss - skb->len + 128 + prot->max_header, len);
 682               
 683               
 684               if (copy <= 0)
 685                 copy = 0;
 686           
 687               memcpy_fromfs ((unsigned char *)(skb+1) + skb->len, from, copy);
 688               skb->len += copy;
 689               from += copy;
 690               copied += copy;
 691               len -= copy;
 692               sk->send_seq += copy;
 693             }
 694 
 695           if (skb->len - (unsigned long)skb->h.th +
 696               (unsigned long)(skb+1) >= sk->mss
 697               || (flags & MSG_OOB))
 698             {
 699               tcp_send_partial (sk);
 700             }
 701           continue;
 702           
 703         }
 704 
 705       
 706 
 707 
 708       copy = min (sk->mtu, diff(sk->window_seq, sk->send_seq));
 709 
 710       
 711       if (copy < 200 || copy > sk->mtu) copy = sk->mtu;
 712       copy = min (copy, len);
 713 
 714       
 715       if (sk->packets_out && copy < sk->mss && !(flags & MSG_OOB)) 
 716         {
 717           
 718           release_sock (sk);
 719           skb=prot->wmalloc (sk,
 720                              sk->mss + 128 + prot->max_header + sizeof (*skb),
 721                              0, GFP_KERNEL);
 722           sk->inuse = 1;
 723           sk->send_tmp = skb;
 724           if (skb != NULL)
 725             skb->mem_len = sk->mss + 128 + prot->max_header+sizeof (*skb);
 726         }
 727       else
 728         {
 729           
 730           release_sock (sk);
 731           skb=prot->wmalloc (sk, copy + prot->max_header+sizeof (*skb),0,
 732                              GFP_KERNEL);
 733           sk->inuse = 1;
 734           if (skb != NULL)
 735             skb->mem_len = copy+prot->max_header+sizeof (*skb);
 736         }
 737 
 738       
 739       if (skb == NULL)
 740         {
 741           if (nonblock)
 742             {
 743               release_sock (sk);
 744               PRINTK ("tcp_write: return 4\n");
 745               if (copied) return (copied);
 746               return (-EAGAIN);
 747             }
 748 
 749           
 750           tmp = sk->wmem_alloc;
 751           release_sock (sk);
 752 
 753           
 754           cli ();
 755           if (tmp <= sk->wmem_alloc)
 756             {
 757               interruptible_sleep_on (sk->sleep);
 758               if (current->signal & ~current->blocked)
 759                 {
 760                    sti();
 761                    PRINTK ("tcp_write: return 5\n");
 762                    if (copied) return (copied);
 763                    return (-ERESTARTSYS);
 764                 }
 765             }
 766           sk->inuse = 1;
 767           sti();
 768           continue;
 769         }
 770 
 771       skb->mem_addr = skb;
 772       skb->len = 0;
 773       skb->sk = sk;
 774       skb->lock = 0;
 775       skb->free = 0;
 776 
 777       buff =(unsigned char *)( skb+1);
 778        
 779 
 780 
 781       tmp = prot->build_header (skb, sk->saddr, sk->daddr, &dev,
 782                                 IPPROTO_TCP, sk->opt, skb->mem_len);
 783       if (tmp < 0 )
 784         {
 785           prot->wfree (sk, skb->mem_addr, skb->mem_len);
 786           release_sock (sk);
 787           PRINTK ("tcp_write: return 6\n");
 788           if (copied) return (copied);
 789           return (tmp);
 790         }
 791       skb->len += tmp;
 792       skb->dev = dev;
 793       buff+=tmp;
 794       skb->h.th =(struct tcp_header *) buff;
 795       tmp = tcp_build_header((struct tcp_header *)buff, sk, len-copy);
 796 
 797       if (tmp < 0)
 798         {
 799           prot->wfree (sk, skb->mem_addr, skb->mem_len);
 800           release_sock (sk);
 801           PRINTK ("tcp_write: return 7\n");
 802           if (copied) return (copied);
 803           return (tmp);
 804         }
 805 
 806       if (flags & MSG_OOB)
 807         {
 808                 ((struct tcp_header *)buff)->urg = 1;
 809                 ((struct tcp_header *)buff)->urg_ptr = copy;
 810         }
 811       skb->len += tmp;
 812       memcpy_fromfs (buff+tmp, from, copy);
 813 
 814       from += copy;
 815       copied += copy;
 816       len -= copy;
 817       skb->len += copy;
 818       skb->free = 0;
 819       sk->send_seq += copy;
 820 
 821       if (sk->send_tmp != NULL)
 822         {
 823           continue;
 824         }
 825 
 826       tcp_send_check ((struct tcp_header *)buff, sk->saddr, sk->daddr,
 827                        copy +sizeof (struct tcp_header), sk);
 828 
 829 
 830       skb->h.seq = sk->send_seq;
 831       if (after (sk->send_seq , sk->window_seq) ||
 832           sk->packets_out >= sk->cong_window)
 833         {
 834           PRINTK ("sk->cong_window = %d, sk->packets_out = %d\n",
 835                   sk->cong_window, sk->packets_out);
 836           PRINTK ("sk->send_seq = %d, sk->window_seq = %d\n",
 837                   sk->send_seq, sk->window_seq);
 838           skb->next = NULL;
 839           skb->magic = TCP_WRITE_QUEUE_MAGIC;
 840           if (sk->wback == NULL)
 841             {
 842               sk->wfront=skb;
 843             }
 844           else
 845             {
 846               sk->wback->next = skb;
 847             }
 848           sk->wback = skb;
 849         }
 850       else
 851         {
 852           prot->queue_xmit (sk, dev, skb,0);
 853         }
 854     }
 855   sk->err = 0;
 856   release_sock (sk);
 857   PRINTK ("tcp_write: return 8\n");
 858   return (copied);
 859 }
 860 
 861 static int
 862 tcp_sendto (volatile struct sock *sk, unsigned char *from,
     
 863             int len, int nonblock, unsigned flags,
 864             struct sockaddr_in *addr, int addr_len)
 865 {
 866   struct sockaddr_in sin;
 867   if (addr_len < sizeof (sin))
 868     return (-EINVAL);
 869   memcpy_fromfs (&sin, addr, sizeof (sin));
 870   if (sin.sin_family && sin.sin_family != AF_INET)
 871     return (-EINVAL);
 872   if (sin.sin_port != sk->dummy_th.dest)
 873     return (-EINVAL);
 874   if (sin.sin_addr.s_addr != sk->daddr)
 875     return (-EINVAL);
 876   return (tcp_write (sk, from, len, nonblock, flags));
 877 }
 878 
 879 static  void
 880 tcp_read_wakeup(volatile struct sock *sk)
     
 881 {
 882   int tmp;
 883   struct device *dev = NULL;
 884   struct tcp_header *t1;
 885   struct sk_buff *buff;
 886 
 887   if (!sk->ack_backlog ) return;
 888   PRINTK ("in tcp read wakeup\n");
 889   
 890   
 891 
 892 
 893   
 894 
 895 
 896   buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1, GFP_ATOMIC);
 897   if (buff == NULL) 
 898     {
 899        
 900        sk->timeout = TIME_WRITE;
 901        sk->time_wait.len = 10;
 902        reset_timer((struct timer *) &sk->time_wait);
 903        return;
 904     }
 905 
 906   buff->mem_addr = buff;
 907   buff->mem_len = MAX_ACK_SIZE;
 908   buff->lock = 0;
 909   buff->len=sizeof (struct tcp_header);
 910   buff->sk = sk;
 911 
 912   
 913   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
 914                                 IPPROTO_TCP, sk->opt, MAX_ACK_SIZE);
 915   if (tmp < 0)
 916     {
 917       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
 918       return;
 919     }
 920 
 921   buff->len += tmp;
 922   t1 = (struct tcp_header *)((char *)(buff+1) +tmp);
 923 
 924   memcpy (t1,(void *) &sk->dummy_th, sizeof (*t1));
 925   t1->seq = net32(sk->send_seq);
 926   t1->ack = 1;
 927   t1->res1=0;
 928   t1->res2=0;
 929   t1->rst = 0;
 930   t1->urg = 0;
 931   t1->syn = 0;
 932   t1->psh = 0;
 933   sk->ack_backlog = 0;
 934   sk->bytes_rcv = 0;
 935   sk->window = sk->prot->rspace(sk);
 936   t1->window = net16(sk->window);
 937   t1->ack_seq = net32(sk->acked_seq);
 938   t1->doff = sizeof (*t1)/4;
 939   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
 940   sk->prot->queue_xmit(sk, dev, buff, 1);
 941 }
 942 
 943 
 944 
 945 
 946 
 947 
 948 static  void
 949 cleanup_rbuf (volatile struct sock *sk)
     
 950 {
 951 
 952   
 953 
 954   while (sk->rqueue != NULL )
 955     {
 956       struct sk_buff *skb;
 957       skb=sk->rqueue->next;
 958       if (!skb->used) break;
 959       if (sk->rqueue == skb)
 960         {
 961           sk->rqueue = NULL;
 962         }
 963       else
 964         {
 965           skb->next->prev = skb->prev;
 966           skb->prev->next = skb->next;
 967         }
 968       skb->sk = sk;
 969       kfree_skb (skb, FREE_READ);
 970     }
 971    
 972 
 973 
 974 
 975 
 976 
 977    if ((sk->prot->rspace(sk) >
 978         (sk->window - sk->bytes_rcv + TCP_WINDOW_DIFF)))
 979      {
 980        sk->ack_backlog++;
 981        
 982        if ( before (jiffies + TCP_ACK_TIME, sk->time_wait.when))
 983          {
 984            sk->time_wait.len = TCP_ACK_TIME;
 985            reset_timer ((struct timer *)&sk->time_wait);
 986          }
 987      }
 988 
 989 }
 990 
 991 
 992 static  int
 993 tcp_read_urg(volatile struct sock * sk, int nonblock,
     
 994              unsigned char *to, int len, unsigned flags)
 995 {
 996     int copied = 0;
 997     struct sk_buff *skb;
 998     PRINTK ("tcp_read_urg(sk=%X, to=%X, len=%d, flags=%X)\n",
 999             sk, to, len, flags);
1000     print_sk(sk);
1001     while (len > 0)
1002       {
1003          sk->inuse = 1;
1004           while (sk->urg==0 || sk->rqueue == NULL)
1005             {
1006               if (sk->err)
1007                 {
1008                   int tmp;
1009                   release_sock (sk);
1010                   if (copied) return (copied);
1011                   tmp = -sk->err;
1012                   sk->err = 0;
1013                   return (tmp);
1014                 }
1015 
1016                if (sk->state == TCP_CLOSE)
1017                  {
1018                    release_sock (sk);
1019                    if (copied) return (copied);
1020                    if (!sk->done)
1021                      {
1022                        sk->done = 1;
1023                        return (0);
1024                      }
1025                    return (-ENOTCONN);
1026                  }
1027                  
1028                 if (sk->shutdown & RCV_SHUTDOWN)
1029                   {
1030                     release_sock(sk);
1031                     if (copied == 0)
1032                       sk->done = 1;
1033                     return (copied);
1034                   }
1035 
1036               if (nonblock)
1037                 {
1038                   release_sock (sk);
1039                   if (copied) return (copied);
1040                   return (-EAGAIN);
1041                 }
1042 
1043                
1044                release_sock (sk);
1045                cli();
1046                if (sk->urg == 0 || sk->rqueue == NULL)
1047                  {
1048                     interruptible_sleep_on (sk->sleep);
1049                     if (current->signal & ~current->blocked)
1050                       {
1051                          sti();
1052                          if (copied) return (copied);
1053                          return (-ERESTARTSYS);
1054                       }
1055                  }
1056                sti();
1057                sk->inuse = 1;
1058             }
1059           
1060           for (skb = sk->rqueue->next; skb->next != sk->rqueue;
1061                skb = skb->next)
1062             {
1063                 int offset;
1064                 int amt;
1065                 if (!skb->h.th->urg) continue;
1066                 offset = 0;
1067                 amt = min(skb->h.th->urg_ptr,len);
1068                 verify_area (to, amt);
1069                 memcpy_tofs (to, (unsigned char *)(skb->h.th) +
1070                              skb->h.th->doff*4
1071                              + offset, amt);
1072 
1073                 if (!(flags & MSG_PEEK))
1074                   {
1075                      skb->urg_used = 1;
1076                      sk->urg --;
1077                   }
1078                 release_sock (sk);
1079                 copied += amt;
1080                 return (copied);
1081             }
1082       }
1083     return (0);
1084 }
1085 
1086 
1087 static  int
1088 tcp_read(volatile struct sock *sk, unsigned char *to,
     
1089          int len, int nonblock, unsigned flags)
1090 {
1091     int copied=0; 
1092     struct sk_buff *skb;
1093     unsigned long offset;
1094     unsigned long used;
1095 
1096     if (len == 0) return (0);
1097     if (len < 0) 
1098       {
1099          return (-EINVAL);
1100       }
1101     
1102     
1103     if (sk->state == TCP_LISTEN) return (-ENOTCONN);
1104 
1105     
1106     if (sk->err)
1107       {
1108         int err;
1109         err = -sk->err;
1110         sk->err = 0;
1111         return (err);
1112       }
1113 
1114     
1115     if ((flags & MSG_OOB))
1116       return (tcp_read_urg (sk, nonblock, to, len, flags));
1117 
1118     
1119     sk->inuse = 1;
1120     if (sk->rqueue != NULL)
1121       skb=sk->rqueue->next;
1122     else
1123       skb = NULL;
1124 
1125     PRINTK("tcp_read (sk=%X, to=%X, len=%d, nonblock=%d, flags=%X)\n",
1126            sk, to, len, nonblock, flags);
1127 
1128     while ( len > 0)
1129       {
1130           while ( skb == NULL || before (sk->copied_seq+1, skb->h.th->seq) ||
1131                  skb->used) 
1132 
1133             {
1134 
1135                PRINTK("skb = %X:\n",skb);
1136                print_skb(skb);
1137                print_sk (sk);
1138 
1139                cleanup_rbuf(sk);
1140 
1141                if (sk->err)
1142                  {
1143                    int tmp;
1144                    release_sock (sk);
1145                    if (copied) return (copied);
1146                    tmp = -sk->err;
1147                    sk->err = 0;
1148                    return (tmp);
1149                  }
1150 
1151                if (sk->state == TCP_CLOSE)
1152                  {
1153                    release_sock (sk);
1154                    if (copied) return (copied);
1155                    if (!sk->done)
1156                      {
1157                        sk->done = 1;
1158                        return (0);
1159                      }
1160                    return (-ENOTCONN);
1161                  }
1162 
1163                if (sk->shutdown & RCV_SHUTDOWN)
1164                    {
1165                      release_sock (sk);
1166                      if (copied == 0) sk->done = 1;
1167                      return (copied);
1168                   }
1169                         
1170                
1171                 if (nonblock)
1172                   {
1173                     release_sock (sk);
1174                     if (copied) return (copied);
1175                     return (-EAGAIN);
1176                   }
1177 
1178                if ((flags & MSG_PEEK) && copied != 0)
1179                  {
1180                    release_sock (sk);
1181                    return (copied);
1182                  }
1183                  
1184                PRINTK ("tcp_read about to sleep. state = %d\n",sk->state);
1185 
1186                release_sock (sk); 
1187                cli();
1188 
1189                 if ( sk->rqueue == NULL ||
1190                     before (sk->copied_seq+1, sk->rqueue->next->h.th->seq))
1191                   {
1192                      interruptible_sleep_on (sk->sleep);
1193                      if (current->signal & ~current->blocked)
1194                        {
1195                           sti ();
1196                           if (copied) return (copied);
1197                           return (-ERESTARTSYS);
1198                        }
1199                   }
1200                 sti();
1201                 PRINTK ("tcp_read woke up. \n");
1202 
1203                 sk->inuse = 1;
1204 
1205                 if (sk->rqueue != NULL)
1206                   skb=sk->rqueue->next;
1207                 else
1208                   skb = NULL;
1209 
1210             }
1211 
1212           
1213 
1214 
1215          offset = sk->copied_seq+1 - skb->h.th->seq;
1216 
1217          if (skb->h.th->syn) offset --;
1218          if (offset < skb->len )
1219            {
1220               
1221 
1222               if (skb->h.th->urg)
1223                 {
1224                    if (skb->urg_used)
1225                      {
1226                         if (flags & MSG_PEEK) break;
1227                         sk->copied_seq += skb->h.th->urg_ptr;
1228                         offset += skb->h.th->urg_ptr;
1229                         if (offset > skb->len)
1230                           {
1231                              skb->used = 1;
1232                              skb=skb->next;
1233                              continue;
1234                           }
1235                      }
1236                    else
1237                      {
1238                         break;
1239                      }
1240                 }
1241               used = min(skb->len - offset, len);
1242 
1243               verify_area (to, used);
1244               memcpy_tofs(to, ((unsigned char *)skb->h.th) +
1245                           skb->h.th->doff*4 +
1246                           offset,
1247                           used);
1248               copied += used;
1249               len -= used;
1250               to += used;
1251               if (!(flags & MSG_PEEK))
1252                 sk->copied_seq += used;
1253               
1254               
1255 
1256 
1257               if (!(flags & MSG_PEEK) &&
1258                   (!skb->h.th->urg || skb->urg_used) &&
1259                   (used + offset >= skb->len) )
1260                 skb->used = 1;
1261               
1262               
1263 
1264               if ( skb->h.th->psh || skb->h.th->urg)
1265                 {
1266                    break;
1267                 }
1268            }
1269          else 
1270            {
1271               skb->used = 1;
1272            }
1273          skb=skb->next;
1274       }
1275     cleanup_rbuf (sk);
1276     release_sock (sk);
1277     if (copied == 0 && nonblock) return (-EAGAIN);
1278     PRINTK ("tcp_read returning %d\n", copied);
1279     return (copied);
1280 }
1281 
1282   
1283 
1284 
1285 
1286 void
1287 tcp_shutdown (volatile struct sock *sk, int how)
     
1288 {
1289   
1290 
1291   struct sk_buff *buff;
1292   struct tcp_header *t1,*th;
1293   struct proto *prot;
1294   int tmp;
1295   struct device *dev=NULL;
1296 
1297 
1298 
1299 
1300 
1301   if (!(how & SEND_SHUTDOWN)) return;
1302 
1303   
1304   if (sk->send_tmp)
1305     tcp_send_partial(sk);
1306 
1307   prot = (struct proto *)sk->prot;
1308   th=(struct tcp_header *)&sk->dummy_th;
1309   buff=prot->wmalloc(sk, MAX_RESET_SIZE,1, GFP_KERNEL);
1310   if (buff == NULL) return;
1311 
1312   sk->inuse = 1;
1313 
1314   PRINTK("tcp_shutdown_send buff = %X\n", buff);
1315   buff->mem_addr = buff;
1316   buff->mem_len = MAX_RESET_SIZE;
1317   buff->lock = 0;
1318   buff->sk = sk;
1319   buff->len = sizeof (*t1);
1320 
1321   t1=(struct tcp_header *)(buff + 1);
1322   
1323   tmp = prot->build_header (buff,sk->saddr, sk->daddr, &dev,
1324                             IPPROTO_TCP, sk->opt,
1325                             sizeof(struct tcp_header));
1326   if (tmp < 0)
1327     {
1328       prot->wfree (sk,buff->mem_addr, buff->mem_len);
1329       PRINTK ("Unable to build header for fin.\n");
1330       release_sock(sk);
1331       return;
1332     }
1333 
1334   t1 = (struct tcp_header *)((char *)t1 +tmp);
1335   buff ->len += tmp;
1336   buff->dev = dev;
1337 
1338   memcpy (t1, th, sizeof (*t1));
1339 
1340   t1->seq = net32(sk->send_seq);
1341   sk->fin_seq = th->seq+1; 
1342 
1343   sk->send_seq++;
1344   buff->h.seq = sk->send_seq;
1345   t1->ack = 1;
1346 
1347   t1->ack_seq = net32(sk->acked_seq);
1348   t1->window = net16(sk->prot->rspace(sk));
1349   t1->fin = 1;
1350   t1->rst = 0;
1351 
1352   t1->doff = sizeof (*t1)/4;
1353   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
1354 
1355   
1356 
1357   if (sk->wback != NULL)
1358     {
1359       buff->next = NULL;
1360       sk->wback->next = buff;
1361       sk->wback = buff;
1362       buff->magic = TCP_WRITE_QUEUE_MAGIC;
1363     }
1364   else
1365     {
1366       sk->prot->queue_xmit (sk, dev, buff,0);
1367     }
1368 
1369   if (sk->state == TCP_ESTABLISHED)
1370     {
1371       sk->state = TCP_FIN_WAIT1;
1372     }
1373   else
1374     {
1375       sk->state = TCP_FIN_WAIT2;
1376     }
1377   release_sock(sk);
1378 }
1379 
1380 
1381 static int
1382 tcp_recvfrom (volatile struct sock *sk, unsigned char *to,
     
1383               int to_len, int nonblock, unsigned flags,
1384               struct sockaddr_in *addr, int *addr_len)
1385 {
1386   int result = tcp_read(sk, to, to_len, nonblock, flags);
1387   struct sockaddr_in sin;
1388   int len;
1389   if (result < 0)
1390     return (result);
1391   len = get_fs_long(addr_len);
1392   if (len > sizeof (sin))
1393     len = sizeof (sin);
1394   sin.sin_family = AF_INET;
1395   sin.sin_port = sk->dummy_th.dest;
1396   sin.sin_addr.s_addr = sk->daddr;
1397   verify_area (addr, len);
1398   memcpy_tofs (addr, &sin, len);
1399   verify_area (addr_len, sizeof (len));
1400   put_fs_long (len, addr_len);
1401   return (result);
1402 }
1403 
1404 
1405 static  void
1406 tcp_reset(unsigned long saddr, unsigned long daddr, struct tcp_header *th,
     
1407            struct proto *prot, struct options *opt, struct device *dev)
1408 {
1409   
1410 
1411   struct sk_buff *buff;
1412   struct tcp_header *t1;
1413   int tmp;
1414   buff=prot->wmalloc(NULL, MAX_RESET_SIZE,1, GFP_ATOMIC);
1415   if (buff == NULL) return;
1416 
1417   PRINTK("tcp_reset buff = %X\n", buff);
1418   buff->mem_addr = buff;
1419   buff->mem_len = MAX_RESET_SIZE;
1420   buff->lock = 0;
1421   buff->len = sizeof (*t1);
1422   buff->sk = NULL;
1423   buff->dev = dev;
1424 
1425   t1=(struct tcp_header *)(buff + 1);
1426   
1427   tmp = prot->build_header (buff, saddr, daddr, &dev, IPPROTO_TCP, opt,
1428                             sizeof(struct tcp_header));
1429   if (tmp < 0)
1430     {
1431       prot->wfree (NULL,buff->mem_addr, buff->mem_len);
1432       return;
1433     }
1434   t1 = (struct tcp_header *)((char *)t1 +tmp);
1435   buff->len += tmp;
1436   memcpy (t1, th, sizeof (*t1));
1437   
1438   t1->dest = th->source;
1439   t1->source = th->dest;
1440   t1->seq = th->ack_seq; 
1441 
1442   t1->rst = 1;
1443   t1->ack = 0;
1444   t1->syn = 0;
1445   t1->urg = 0;
1446   t1->fin = 0;
1447   t1->psh = 0;
1448   t1->doff = sizeof (*t1)/4;
1449   tcp_send_check (t1, saddr, daddr, sizeof (*t1), NULL);
1450   prot->queue_xmit(NULL, dev, buff, 1);
1451   
1452 }
1453 
1454 
1455 
1456 
1457 
1458 
1459 
1460 static  void
1461 tcp_conn_request(volatile struct sock *sk, struct sk_buff *skb,
     
1462                  unsigned long daddr,
1463                  unsigned long saddr, struct options *opt, struct device *dev)
1464 {
1465   struct sk_buff *buff;
1466   struct tcp_header *t1;
1467   unsigned char *ptr;
1468   volatile struct sock *newsk;
1469   struct tcp_header *th;
1470   int tmp;
1471   th = skb->h.th;
1472 
1473   PRINTK ("tcp_conn_request (sk = %X, skb = %X, daddr = %X, sadd4= %X, \n"
1474           "                  opt = %X, dev = %X)\n",
1475           sk, skb, daddr, saddr, opt, dev);
1476   
1477   
1478   if (!sk->dead)
1479     {
1480        wake_up(sk->sleep);
1481     }
1482   else
1483     {
1484        PRINTK ("tcp_conn_request on dead socket\n");
1485        tcp_reset (daddr, saddr, th, sk->prot, opt, dev);
1486        kfree_skb (skb, FREE_READ);
1487        return;
1488     }
1489 
1490   
1491 
1492   if (sk->ack_backlog >= sk->max_ack_backlog)
1493     {
1494        kfree_skb (skb, FREE_READ);
1495        return;
1496     }
1497 
1498   
1499   
1500 
1501 
1502 
1503 
1504   newsk = kmalloc(sizeof (struct sock), GFP_ATOMIC);
1505   if (newsk == NULL) 
1506     {
1507        
1508        kfree_skb (skb, FREE_READ);
1509        return;
1510     }
1511 
1512 
1513   PRINTK ("newsk = %X\n", newsk);
1514   memcpy ((void *)newsk, (void *)sk, sizeof (*newsk));
1515   newsk->wback = NULL;
1516   newsk->wfront = NULL;
1517   newsk->rqueue = NULL;
1518   newsk->send_head = NULL;
1519   newsk->send_tail = NULL;
1520   newsk->back_log = NULL;
1521   newsk->blog = 0;
1522   newsk->intr = 0;
1523   newsk->proc = 0;
1524   newsk->done = 0;
1525   newsk->send_tmp = NULL;
1526   newsk->pair = NULL;
1527   newsk->wmem_alloc = 0;
1528   newsk->rmem_alloc = 0;
1529 
1530   newsk->max_unacked = MAX_WINDOW - TCP_WINDOW_DIFF;
1531 
1532   newsk->err = 0;
1533   newsk->shutdown = 0;
1534   newsk->ack_backlog = 0;
1535   newsk->acked_seq = skb->h.th->seq+1;
1536   newsk->fin_seq = skb->h.th->seq;
1537   newsk->copied_seq = skb->h.th->seq;
1538   newsk->state = TCP_SYN_RECV;
1539   newsk->timeout = 0;
1540   newsk->send_seq = timer_seq*SEQ_TICK-seq_offset;
1541   newsk->rcv_ack_seq = newsk->send_seq;
1542   newsk->urg =0;
1543   newsk->retransmits = 0;
1544   newsk->destroy = 0;
1545   newsk->time_wait.sk = newsk;
1546   newsk->time_wait.next = NULL;
1547   newsk->dummy_th.source = skb->h.th->dest;
1548   newsk->dummy_th.dest = skb->h.th->source;
1549   
1550   newsk->daddr=saddr;
1551   newsk->saddr=daddr;
1552 
1553   put_sock (newsk->num,newsk);
1554   newsk->dummy_th.res1=0;
1555   newsk->dummy_th.doff=6;
1556   newsk->dummy_th.fin=0;
1557   newsk->dummy_th.syn=0;
1558   newsk->dummy_th.rst=0;
1559   newsk->dummy_th.psh=0;
1560   newsk->dummy_th.ack=0;
1561   newsk->dummy_th.urg=0;
1562   newsk->dummy_th.res2=0;
1563   newsk->acked_seq = skb->h.th->seq+1;
1564   newsk->copied_seq = skb->h.th->seq;
1565 
1566   if (skb->h.th->doff == 5)
1567     {
1568       newsk->mtu=576-HEADER_SIZE;
1569     }
1570   else
1571     {
1572       ptr = (unsigned char *)(skb->h.th + 1);
1573       if (ptr[0] != 2 || ptr[1] != 4)
1574         {
1575            newsk->mtu=576-HEADER_SIZE;
1576         }
1577       else
1578         {
1579           newsk->mtu = min (ptr[2]*256+ptr[3]-HEADER_SIZE,
1580                             dev->mtu-HEADER_SIZE);
1581         }
1582     }
1583 
1584   print_sk (newsk);
1585   buff=newsk->prot->wmalloc(newsk,MAX_SYN_SIZE,1, GFP_ATOMIC);
1586   if (buff == NULL)
1587     {
1588        sk->err = -ENOMEM;
1589        newsk->dead = 1;
1590        release_sock (newsk);
1591        kfree_skb (skb, FREE_READ);
1592        return;
1593     }
1594   
1595   buff->lock = 0;
1596   buff->mem_addr = buff;
1597   buff->mem_len = MAX_SYN_SIZE;
1598   buff->len=sizeof (struct tcp_header)+4;
1599   buff->sk = newsk;
1600   
1601   t1=(struct tcp_header *)(buff + 1);
1602   
1603 
1604   tmp = sk->prot->build_header (buff, newsk->saddr, newsk->daddr, &dev,
1605                                 IPPROTO_TCP, NULL, MAX_SYN_SIZE);
1606 
1607   
1608   if (tmp < 0)
1609     {
1610        sk->err = tmp;
1611        sk->prot->wfree(newsk, buff->mem_addr, buff->mem_len);
1612        newsk->dead = 1;
1613        release_sock (newsk);
1614        skb->sk = sk;
1615        kfree_skb (skb, FREE_READ);
1616        return;
1617     }
1618 
1619   buff->len += tmp;
1620   t1 = (struct tcp_header *)((char *)t1 +tmp);
1621   
1622   memcpy (t1, skb->h.th, sizeof (*t1));
1623   buff->h.seq = newsk->send_seq;
1624   
1625   t1->dest = skb->h.th->source;
1626   t1->source = newsk->dummy_th.source;
1627   t1->seq = net32(newsk->send_seq++);
1628   t1->ack = 1;
1629   newsk->window = newsk->prot->rspace(newsk);
1630   t1->window = net16(newsk->window);
1631   t1->res1=0;
1632   t1->res2=0;
1633   t1->rst = 0;
1634   t1->urg = 0;
1635   t1->psh = 0;
1636   t1->syn = 1;
1637   t1->ack_seq = net32(skb->h.th->seq+1);
1638   t1->doff = sizeof (*t1)/4+1;
1639 
1640   ptr = (unsigned char *)(t1+1);
1641   ptr[0]=2;
1642   ptr[1]=4;
1643   ptr[2]=((dev->mtu - HEADER_SIZE) >> 8) & 0xff;
1644   ptr[3]=(dev->mtu - HEADER_SIZE) & 0xff;
1645 
1646   tcp_send_check (t1, daddr, saddr, sizeof (*t1)+4, newsk);
1647   newsk->prot->queue_xmit(newsk, dev, buff, 0);
1648 
1649   newsk->time_wait.len = TCP_CONNECT_TIME;
1650   PRINTK ("newsk->time_wait.sk = %X\n", newsk->time_wait.sk);
1651   reset_timer ((struct timer *)&newsk->time_wait);
1652   skb->sk = newsk;
1653   
1654   sk->rmem_alloc -= skb->mem_len;
1655   newsk->rmem_alloc += skb->mem_len;
1656 
1657   if (sk->rqueue == NULL)
1658     {
1659       skb->next = skb;
1660       skb->prev = skb;
1661       sk->rqueue = skb;
1662     }
1663   else
1664     {
1665       skb->next = sk->rqueue;
1666       skb->prev = sk->rqueue->prev;
1667       sk->rqueue->prev = skb;
1668       skb->prev->next = skb;
1669     }
1670   sk->ack_backlog++;
1671   release_sock (newsk);
1672 }
1673 
1674 static  void
1675 tcp_close (volatile struct sock *sk, int timeout)
     
1676 {
1677   
1678 
1679   struct sk_buff *buff;
1680   int need_reset = 0;
1681   struct tcp_header *t1,*th;
1682   struct proto *prot;
1683   struct device *dev=NULL;
1684   int tmp;
1685   PRINTK ("tcp_close ((struct sock *)%X, %d)\n",sk, timeout);
1686   sk->inuse = 1;
1687   sk->keepopen = 0;
1688   sk->shutdown = SHUTDOWN_MASK;
1689 
1690   if (!sk->dead)
1691     wake_up (sk->sleep);
1692 
1693 
1694   
1695   
1696   if (sk->rqueue != NULL)
1697     {
1698        struct sk_buff *skb;
1699        struct sk_buff *skb2;
1700        skb = sk->rqueue;
1701        do {
1702           skb2=skb->next;
1703           kfree_skb (skb, FREE_READ);
1704           skb=skb2;
1705        } while (skb != sk->rqueue);
1706        need_reset = 1;
1707     }
1708   sk->rqueue = NULL;
1709 
1710   
1711   if (sk->send_tmp)
1712     {
1713       tcp_send_partial (sk);
1714     }
1715 
1716   switch (sk->state)
1717     {
1718 
1719     case TCP_FIN_WAIT1:
1720     case TCP_FIN_WAIT2:
1721     case TCP_LAST_ACK:
1722       
1723       sk->time_wait.len = 4*sk->rtt;;
1724       sk->timeout = TIME_CLOSE;
1725       reset_timer ((struct timer *)&sk->time_wait);
1726       if (timeout)
1727         tcp_time_wait(sk);
1728       release_sock (sk);
1729       if (!need_reset)
1730         return;
1731       break;
1732       
1733     case TCP_TIME_WAIT:
1734       if (timeout)
1735         sk->state = TCP_CLOSE;
1736       release_sock (sk);
1737       return;
1738       
1739     case TCP_LISTEN:
1740       sk->state = TCP_CLOSE;
1741       release_sock(sk);
1742       return;
1743 
1744     case TCP_CLOSE:
1745 
1746       release_sock(sk);
1747       return;
1748        
1749 
1750     case TCP_CLOSE_WAIT:
1751     case TCP_ESTABLISHED:
1752     case TCP_SYN_SENT:
1753     case TCP_SYN_RECV:
1754 
1755       prot = (struct proto *)sk->prot;
1756       th=(struct tcp_header *)&sk->dummy_th;
1757 
1758       buff=prot->wmalloc(sk, MAX_FIN_SIZE,1, GFP_ATOMIC);
1759       if (buff == NULL)
1760         {
1761           
1762           if (sk->state != TCP_CLOSE_WAIT)
1763             sk->state = TCP_ESTABLISHED;
1764           sk->timeout = TIME_CLOSE;
1765           sk->time_wait.len = 100; 
1766           reset_timer ((struct timer *)&sk->time_wait);
1767           return;
1768         }
1769 
1770       buff->lock = 0;
1771       buff->mem_addr = buff;
1772       buff->mem_len = MAX_FIN_SIZE;
1773       buff->sk = sk;
1774       buff->len = sizeof (*t1);
1775       t1=(struct tcp_header *)(buff + 1);
1776       
1777       tmp = prot->build_header (buff,sk->saddr, sk->daddr, &dev,
1778                                 IPPROTO_TCP, sk->opt,
1779                                 sizeof(struct tcp_header));
1780       if (tmp < 0)
1781         {
1782           prot->wfree (sk,buff->mem_addr, buff->mem_len);
1783           PRINTK ("Unable to build header for fin.\n");
1784           release_sock(sk);
1785           return;
1786         }
1787 
1788       t1 = (struct tcp_header *)((char *)t1 +tmp);
1789       buff ->len += tmp;
1790       buff->dev = dev;
1791       memcpy (t1, th, sizeof (*t1));
1792       t1->seq = net32(sk->send_seq);
1793       sk->send_seq++;
1794       buff->h.seq = sk->send_seq;
1795       t1->ack = 1;
1796 
1797        
1798       sk->delay_acks = 0;
1799       t1->ack_seq = net32(sk->acked_seq);
1800       t1->window = net16(sk->prot->rspace(sk));
1801       t1->fin = 1;
1802       t1->rst = need_reset;
1803       t1->doff = sizeof (*t1)/4;
1804       tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
1805 
1806       if (sk->wfront == NULL)
1807         {
1808           prot->queue_xmit(sk, dev, buff, 0);
1809         }
1810       else
1811         {
1812            sk->time_wait.len = sk->rtt;
1813            sk->timeout = TIME_WRITE;
1814            reset_timer ((struct timer *)&sk->time_wait);
1815            buff->next = NULL;
1816            if (sk->wback == NULL)
1817              {
1818                 sk->wfront=buff;
1819              }
1820            else
1821              {
1822                 sk->wback->next = buff;
1823              }
1824            sk->wback = buff;
1825            buff->magic = TCP_WRITE_QUEUE_MAGIC;
1826            
1827         }
1828 
1829        if (sk->state == TCP_CLOSE_WAIT)
1830         {
1831           sk->state = TCP_FIN_WAIT2;
1832         }
1833        else
1834          {
1835            sk->state = TCP_FIN_WAIT1;
1836          }
1837     }
1838   release_sock (sk);
1839 }
1840 
1841 
1842 
1843 
1844 static  void
1845 tcp_write_xmit (volatile struct sock *sk)
     
1846 {
1847   struct sk_buff *skb;
1848   PRINTK ("tcp_write_xmit (sk=%X)\n",sk);
1849   while (sk->wfront != NULL && before (sk->wfront->h.seq, sk->window_seq) &&
1850          sk->packets_out < sk->cong_window)
1851     {
1852       skb = sk->wfront;
1853       sk->wfront = skb->next;
1854       if (sk->wfront == NULL)
1855         sk->wback = NULL;
1856       skb->next = NULL;
1857       if (skb->magic != TCP_WRITE_QUEUE_MAGIC)
1858         {
1859           PRINTK ("tcp.c skb with bad magic (%X) on write queue. Squashing "
1860                   "queue\n", skb->magic);
1861           sk->wfront = NULL;
1862           sk->wback = NULL;
1863           return;
1864         }
1865       skb->magic = 0;
1866       PRINTK("Sending a packet.\n");
1867       sk->prot->queue_xmit (sk, skb->dev, skb, skb->free);
1868     }
1869 }
1870 
1871 
1872 
1873 
1874 
1875 static  int
1876 tcp_ack (volatile struct sock *sk, struct tcp_header *th, unsigned long saddr)
     
1877 {
1878   unsigned long ack;
1879   ack = net32(th->ack_seq);
1880 
1881   PRINTK ("tcp_ack ack=%d, window=%d, "
1882           "sk->rcv_ack_seq=%d, sk->window_seq = %d\n",
1883           ack, net16(th->window), sk->rcv_ack_seq, sk->window_seq);
1884   if (after (ack, sk->send_seq+1) || before (ack, sk->rcv_ack_seq-1))
1885     {
1886       if (after (ack, sk->send_seq) || (sk->state != TCP_ESTABLISHED &&
1887                                         sk->state != TCP_CLOSE_WAIT)) 
1888         {
1889           return (0);
1890         }
1891       if (sk->keepopen)
1892         reset_timer ((struct timer *)&sk->time_wait);
1893       sk->retransmits = 0;
1894       return (1);
1895     }
1896 
1897   
1898   if (after (sk->window_seq, ack+net16(th->window)))
1899     {
1900       
1901 
1902       
1903 
1904 
1905 
1906       struct sk_buff *skb;
1907       struct sk_buff *skb2=NULL;
1908       struct sk_buff *wskb=NULL;
1909 
1910       sk->window_seq = ack + net16(th->window);
1911       cli();
1912       for (skb = sk->send_head; skb != NULL; skb=skb->link3)
1913         {
1914           if (after( skb->h.seq, sk->window_seq))
1915             {
1916 
1917               
1918               if (skb2 == NULL)
1919                 {
1920                   sk->send_head = skb->link3;
1921                 }
1922               else
1923                 {
1924                   skb2->link3 = skb->link3;
1925                 }
1926               if (sk->send_tail == skb)
1927                 sk->send_tail = skb2;
1928 
1929               
1930               if (skb->next != NULL)
1931                 {
1932                   int i;
1933                   if (skb->next != skb)
1934                     {
1935                       skb->next->prev = skb->prev;
1936                       skb->prev->next = skb->next;
1937                     }
1938                   for (i = 0; i < DEV_NUMBUFFS; i++)
1939                     {
1940                       if (skb->dev->buffs[i] == skb)
1941                         {
1942                           if (skb->next == skb)
1943                             skb->dev->buffs[i] = NULL;
1944                           else
1945                             skb->dev->buffs[i] = skb->next;
1946                           break;
1947                         }
1948                     }
1949                   if (arp_q == skb)
1950                     {
1951                       if (skb->next == skb)
1952                         arp_q = NULL;
1953                       else
1954                         arp_q = skb->next;
1955                     }
1956                 }
1957 
1958               
1959               skb->magic = TCP_WRITE_QUEUE_MAGIC;
1960               if (wskb == NULL)
1961                 {
1962                   skb->next = sk->wfront;
1963                   sk->wfront = skb;
1964                 }
1965               else
1966                 {
1967                   skb->next = wskb->next;
1968                   wskb->next = skb;
1969                 }
1970               wskb = skb;
1971             }
1972           else
1973             {
1974               skb2 = skb;
1975             }
1976         }
1977       sti();
1978     }
1979 
1980   sk->window_seq = ack + net16(th->window);
1981 
1982   
1983   if (sk->cong_window < 2048 && ack != sk->rcv_ack_seq)
1984     {
1985        if (sk->exp_growth)
1986          sk->cong_window *= 2;
1987        else
1988          sk->cong_window++;
1989     }
1990 
1991   PRINTK ("tcp_ack: Updating rcv ack sequence. \n");
1992   sk->rcv_ack_seq = ack;
1993 
1994   
1995   while (sk->send_head != NULL)
1996     {
1997       if (before (sk->send_head->h.seq, ack+1))
1998         {
1999           struct sk_buff *oskb;
2000           
2001           sk->packets_out --;
2002           PRINTK ("skb=%X acked\n", sk->send_head);
2003           
2004 
2005           if (!sk->dead)
2006             wake_up (sk->sleep);
2007 
2008           cli();
2009 
2010           oskb = sk->send_head;
2011           
2012           sk->rtt += ((jiffies - oskb->when) - sk->rtt)/2;
2013           if (sk->rtt < 30) sk->rtt = 30;
2014           sk->send_head = oskb->link3;
2015           if (sk->send_head == NULL) 
2016             {
2017               sk->send_tail = NULL;
2018             }
2019           
2020           if (oskb->next != NULL)
2021             {
2022                int i;
2023                if (oskb->next != oskb)
2024                  {
2025                     oskb->next->prev = oskb->prev;
2026                     oskb->prev->next = oskb->next;
2027                  }
2028                for (i = 0; i < DEV_NUMBUFFS; i++)
2029                  {
2030                    if (oskb->dev->buffs[i] == oskb)
2031                      {
2032                        if (oskb== oskb->next)
2033                          oskb->dev->buffs[i]= NULL;
2034                        else
2035                          oskb->dev->buffs[i] = oskb->next;
2036                        break;
2037                      }
2038                  }
2039                if (arp_q == oskb)
2040                  {
2041                    if (oskb == oskb->next)
2042                      arp_q = NULL;
2043                    else
2044                      arp_q = oskb->next;
2045                  }
2046             }
2047           oskb->magic = 0;
2048           kfree_skb  (oskb, FREE_WRITE); 
2049           sti();
2050           if (!sk->dead)
2051             wake_up(sk->sleep);
2052         }
2053       else
2054         {
2055           break;
2056         }
2057 
2058     }
2059 
2060 
2061   
2062 
2063 
2064 
2065 
2066   if (sk->retransmits && sk->send_head != NULL)
2067     {
2068       PRINTK ("retransmitting\n");
2069       sk->prot->retransmit (sk,1);
2070     }
2071   sk->retransmits = 0;
2072 
2073   
2074 
2075   if (sk->wfront != NULL && sk->packets_out < sk->cong_window)
2076     {
2077       if (after (sk->window_seq, sk->wfront->h.seq))
2078         {
2079           tcp_write_xmit (sk);
2080         }
2081     }
2082   else
2083     {
2084        if (sk->send_head == NULL && sk->ack_backlog == 0 &&
2085            sk->state != TCP_TIME_WAIT && !sk->keepopen)
2086          {
2087            PRINTK ("Nothing to do, going to sleep.\n"); 
2088             if (!sk->dead)
2089               wake_up (sk->sleep);
2090 
2091             
2092             sk->time_wait.len = TCP_PROBEWAIT_LEN;
2093             sk->timeout = TIME_KEEPOPEN;
2094             reset_timer((struct timer *)&sk->time_wait);
2095             sk->timeout = 0;
2096          }
2097        else
2098          {
2099             if (sk->state == TCP_TIME_WAIT)
2100               {
2101                  sk->time_wait.len = TCP_TIMEWAIT_LEN;
2102                  sk->timeout = TIME_CLOSE;
2103               }
2104             sk->timeout = TIME_WRITE;
2105             sk->time_wait.len = sk->rtt*2;
2106             reset_timer ((struct timer *)&sk->time_wait);
2107          }
2108     }
2109 
2110 
2111   if (sk->packets_out == 0 && sk->send_tmp != NULL &&
2112       sk->wfront == NULL && sk->send_head == NULL)
2113     {
2114       tcp_send_partial (sk);
2115     }
2116 
2117   
2118   if ( sk->state == TCP_TIME_WAIT)
2119     {
2120        if (sk->rcv_ack_seq == sk->send_seq &&    
2121            sk->acked_seq == sk->fin_seq);
2122        if (!sk->dead) wake_up (sk->sleep);
2123        sk->state = TCP_CLOSE;
2124     }
2125 
2126   if (sk->state == TCP_LAST_ACK || sk->state == TCP_FIN_WAIT2)
2127     {
2128       if (sk->rcv_ack_seq == sk->send_seq)
2129         {
2130            if (sk->acked_seq != sk->fin_seq)
2131              {
2132                 tcp_time_wait(sk);
2133              }
2134            else
2135              {
2136                tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, sk->daddr);
2137                 sk->state = TCP_CLOSE;
2138              }
2139         }
2140       if (!sk->dead) wake_up (sk->sleep);
2141     }
2142 
2143   PRINTK ("leaving tcp_ack\n");
2144 
2145   return (1);
2146 }
2147 
2148 
2149 
2150 
2151 
2152 static  int
2153 tcp_data (struct sk_buff *skb, volatile struct sock *sk, 
     
2154           unsigned long saddr, unsigned short len)
2155 {
2156   struct sk_buff *skb1, *skb2;
2157   struct tcp_header *th;
2158 
2159   th = skb->h.th;
2160   print_th (th);
2161   skb->len = len - (th->doff*4);
2162 
2163   PRINTK("tcp_data len = %d sk = %X:\n",skb->len, sk);
2164   print_sk(sk);
2165 
2166   sk->bytes_rcv += skb->len;
2167 
2168   if (skb->len == 0 && !th->fin && !th->urg && !th->psh)
2169     {
2170       
2171       if (!th->ack)
2172         tcp_send_ack (sk->send_seq, sk->acked_seq,sk, th, saddr);
2173       kfree_skb(skb, FREE_READ);
2174       return (0);
2175     }
2176 
2177   if (sk->shutdown & RCV_SHUTDOWN)
2178     {
2179        
2180        sk->acked_seq = th->seq + skb->len + th->syn + th->fin;
2181        tcp_send_ack (sk->send_seq, sk->acked_seq, sk, skb->h.th, saddr);
2182        kfree_skb (skb, FREE_READ);
2183        if (sk->acked_seq == sk->fin_seq)
2184          {
2185             if (!sk->dead) wake_up (sk->sleep);
2186             if (sk->state == TCP_TIME_WAIT || sk->state == TCP_LAST_ACK
2187                 || sk->state == TCP_FIN_WAIT2)
2188               sk->state = TCP_CLOSE;
2189          }
2190        return (0);
2191     }
2192 
2193   
2194 
2195 
2196 
2197 
2198   
2199   if (sk->rqueue == NULL)
2200     {
2201        PRINTK ("tcp_data: skb = %X:\n",skb);
2202        print_skb (skb);
2203 
2204        sk->rqueue = skb;
2205        skb->next = skb;
2206        skb->prev = skb;
2207        skb1= NULL;
2208     }
2209   else
2210     {
2211       PRINTK ("tcp_data adding to chain sk = %X:\n",sk);
2212       print_sk (sk);
2213 
2214       for (skb1=sk->rqueue; ; skb1=skb1->prev)
2215         {
2216           PRINTK ("skb1=%X\n",skb1);
2217           print_skb(skb1);
2218           PRINTK ("skb1->h.th->seq = %d\n", skb1->h.th->seq);
2219           if (after ( th->seq+1, skb1->h.th->seq))
2220             {
2221               skb->prev = skb1;
2222               skb->next = skb1->next;
2223               skb->next->prev = skb;
2224               skb1->next = skb;
2225               if (skb1 == sk->rqueue)
2226                 sk->rqueue = skb;
2227               break;
2228             }
2229           if  ( skb1->prev == sk->rqueue)
2230             {
2231                skb->next= skb1;
2232                skb->prev = skb1->prev;
2233                skb->prev->next = skb;
2234                skb1->prev = skb;
2235                skb1 = NULL; 
2236                break;
2237             }
2238         }
2239 
2240       PRINTK ("skb = %X:\n",skb);
2241       print_skb (skb);
2242       PRINTK ("sk now equals:\n");
2243       print_sk (sk);
2244 
2245     }
2246 
2247   th->ack_seq = th->seq + skb->len;
2248   if (th->syn) th->ack_seq ++;
2249   if (th->fin) th->ack_seq ++;
2250 
2251   if (before (sk->acked_seq, sk->copied_seq))
2252     {
2253        PRINTK ("*** tcp.c:tcp_data bug acked < copied\n");
2254        sk->acked_seq = sk->copied_seq;
2255     }
2256 
2257   
2258   if (skb1 == NULL || skb1->acked || before (th->seq, sk->acked_seq+1))
2259     {
2260       if (before (th->seq, sk->acked_seq+1))
2261         {
2262           if (after (th->ack_seq, sk->acked_seq))
2263               sk->acked_seq = th->ack_seq;
2264           skb->acked = 1;
2265 
2266           
2267           if (skb->h.th->fin)  
2268             {
2269               sk->shutdown |= RCV_SHUTDOWN;
2270             }
2271           
2272           for (skb2=skb->next; skb2 != sk->rqueue->next; skb2=skb2->next)
2273             {
2274                if (before(skb2->h.th->seq, sk->acked_seq+1))
2275                  {
2276                    if (after (skb2->h.th->ack_seq, sk->acked_seq))
2277                      sk->acked_seq = skb2->h.th->ack_seq;
2278                     skb2->acked = 1;
2279 
2280                    
2281                    if (skb2->h.th->fin)  
2282                      {
2283                        sk->shutdown |= RCV_SHUTDOWN;
2284                      }
2285           
2286                     
2287                     sk->ack_backlog = sk->max_ack_backlog;
2288                  }
2289                else
2290                  {
2291                    break;
2292                  }
2293             }
2294 
2295           
2296           
2297 
2298           if (!sk->delay_acks || 
2299               sk->ack_backlog >= sk->max_ack_backlog || 
2300               sk->bytes_rcv > sk->max_unacked || 
2301               th->fin)
2302             {
2303                 tcp_send_ack (sk->send_seq, sk->acked_seq,sk,th, saddr);
2304             }
2305           else
2306             {
2307                sk->ack_backlog++;
2308                sk->time_wait.len = TCP_ACK_TIME;
2309                sk->timeout = TIME_WRITE;
2310                reset_timer ((struct timer *)&sk->time_wait);
2311             }
2312        }
2313    }
2314   else
2315     {
2316        
2317        tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr);
2318     }
2319 
2320   
2321   if (!sk->dead)
2322     {
2323        wake_up (sk->sleep);
2324     }
2325   else
2326     {
2327        PRINTK ("data received on dead socket. \n");
2328     }
2329 
2330   if (sk->state == TCP_FIN_WAIT2 && sk->acked_seq == sk->fin_seq)
2331     {
2332       tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr);
2333       sk->state = TCP_LAST_ACK;
2334     }
2335 
2336   return (0);
2337 }
2338 
2339 static  int
2340 tcp_urg (volatile struct sock *sk, struct tcp_header *th, unsigned long saddr)
     
2341 {
2342     extern int kill_pg (int pg, int sig, int priv);
2343     extern int kill_proc (int pid, int sig, int priv);
2344     
2345     if (!sk->dead)
2346       wake_up(sk->sleep);
2347     
2348     if (sk->urginline)
2349       {
2350           th->urg = 0;
2351           th->psh = 1;
2352           return (0);
2353       }
2354 
2355     sk->urg++;
2356 
2357     if (!sk->urg)
2358       {
2359           
2360 
2361           if (sk->proc == 0) return (0);
2362           if (sk->proc > 0)
2363             {
2364                 kill_proc (sk->proc, SIGURG, 1);
2365             }
2366           else 
2367             {
2368                 kill_pg (-sk->proc, SIGURG, 1);
2369             }
2370       }
2371     return (0);
2372 }
2373 
2374 
2375 static  int
2376 tcp_fin (volatile struct sock *sk, struct tcp_header *th, 
     
2377          unsigned long saddr, struct device *dev)
2378 {
2379   PRINTK ("tcp_fin (sk=%X, th=%X, saddr=%X, dev=%X)\n",
2380           sk, th, saddr, dev);
2381   
2382   if (!sk->dead)
2383     {
2384       wake_up (sk->sleep);
2385     }
2386 
2387   sk->err = 0;
2388   switch (sk->state)
2389     {
2390     case TCP_SYN_RECV:
2391     case TCP_SYN_SENT:
2392     case TCP_ESTABLISHED:
2393       sk->state = TCP_CLOSE_WAIT;
2394       break;
2395 
2396     case TCP_CLOSE_WAIT:
2397       break; 
2398 
2399     case TCP_FIN_WAIT1:
2400       sk->state = TCP_FIN_WAIT2;
2401       break;
2402 
2403     default:
2404     case TCP_TIME_WAIT:
2405       sk->state = TCP_LAST_ACK;
2406       
2407       sk->time_wait.len = TCP_TIMEWAIT_LEN;
2408       sk->timeout = TIME_CLOSE;
2409       reset_timer ((struct timer *)&sk->time_wait);
2410       return (0);
2411 
2412     case TCP_FIN_WAIT2:
2413       sk->state = TCP_CLOSE;
2414       return (0);
2415     }
2416   
2417 
2418   sk->ack_backlog ++;
2419 
2420 #if 0
2421   
2422   buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1, GFP_ATOMIC);
2423   if (buff == NULL)
2424     {
2425        
2426        return (1);
2427     }
2428 
2429   buff->mem_addr = buff;
2430   buff->mem_len = MAX_ACK_SIZE;
2431   buff->len=sizeof (struct tcp_header);
2432   buff->sk = sk;
2433 
2434   t1 = (struct tcp_header *)(buff + 1);
2435   
2436   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
2437                                 IPPROTO_TCP,  sk->opt, MAX_ACK_SIZE);
2438   if (tmp < 0)
2439     {
2440       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
2441       return (0);
2442     }
2443 
2444   buff->len += tmp;
2445   t1 = (struct tcp_header *)((char *)t1 +tmp);
2446   
2447   memcpy (t1, th, sizeof (*t1));
2448 
2449   
2450   t1->dest = th->source;
2451   t1->source = th->dest;
2452 
2453 
2454   t1->seq = net32(sk->send_seq);
2455 
2456   
2457   
2458 
2459   buff->h.seq = sk->send_seq;
2460   t1->window = net16(sk->prot->rspace(sk));
2461 
2462   t1->res1=0;
2463   t1->res2=0;
2464   t1->rst = 0;
2465   t1->urg = 0;
2466   t1->syn = 0;
2467   t1->psh = 0;
2468   t1->ack = 1; 
2469   t1->fin = 0;
2470   t1->ack_seq = net32(sk->acked_seq);
2471 
2472   t1->doff = sizeof (*t1)/4;
2473   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
2474 
2475   
2476 
2477   if (sk->wback != NULL)
2478     {
2479       buff->next = NULL;
2480       sk->wback->next = buff;
2481       sk->wback = buff;
2482       buff->magic = TCP_WRITE_QUEUE_MAGIC;
2483     }
2484   else
2485     {
2486       sk->prot->queue_xmit (sk, dev, buff,0);
2487     }
2488 #endif
2489   return (0);
2490 }
2491 
2492 
2493 
2494 
2495 static volatile struct sock *
2496 tcp_accept (volatile struct sock *sk, int flags)
     
2497 {
2498   volatile struct sock *newsk;
2499   struct sk_buff *skb;
2500   
2501   PRINTK ("tcp_accept(sk=%X, flags=%X)\n", sk, flags);
2502   print_sk(sk);
2503   
2504 
2505   
2506   if (sk->state != TCP_LISTEN)
2507     {
2508       sk->err = EINVAL;
2509       return (NULL); 
2510     }
2511   
2512 
2513   sk->inuse = 1;
2514   cli();
2515   while ( (skb = get_firstr(sk)) == NULL )
2516     {
2517       if (flags & O_NONBLOCK)
2518         {
2519           sti();
2520           release_sock (sk);
2521           sk->err = EAGAIN;
2522           return (NULL);
2523         }
2524 
2525       release_sock (sk);
2526       interruptible_sleep_on (sk->sleep);
2527       if (current->signal & ~current->blocked)
2528         {
2529            sti();
2530            sk->err = ERESTARTSYS;
2531            return (NULL);
2532         }
2533 
2534       sk->inuse = 1;
2535     }
2536   sti();
2537 
2538   
2539   newsk = skb->sk;
2540 
2541   kfree_skb (skb, FREE_READ);
2542   sk->ack_backlog--;
2543   release_sock (sk);
2544   return (newsk);
2545 }
2546 
2547 
2548 
2549 
2550 static int
2551 tcp_connect (volatile struct sock *sk, struct sockaddr_in *usin, int addr_len)
     
2552 {
2553   struct sk_buff *buff;
2554   struct sockaddr_in sin;
2555   struct device *dev=NULL;
2556   unsigned char *ptr;
2557   int tmp;
2558   struct tcp_header *t1;
2559   if (sk->state != TCP_CLOSE) return (-EISCONN);
2560   if (addr_len < 8) return (-EINVAL);
2561 
2562 
2563   memcpy_fromfs (&sin,usin, min(sizeof (sin), addr_len));
2564 
2565   if (sin.sin_family && sin.sin_family != AF_INET) return (-EAFNOSUPPORT);
2566 
2567   sk->daddr = sin.sin_addr.s_addr;
2568   sk->send_seq = timer_seq*SEQ_TICK-seq_offset;
2569   sk->rcv_ack_seq = sk->send_seq -1;
2570   sk->err = 0;
2571   sk->dummy_th.dest = sin.sin_port;
2572 
2573   buff=sk->prot->wmalloc(sk,MAX_SYN_SIZE,0, GFP_KERNEL);
2574   if (buff == NULL) 
2575     {
2576       return (-ENOMEM);
2577     }
2578   sk->inuse = 1;
2579   buff->lock = 0;
2580   buff->mem_addr = buff;
2581   buff->mem_len = MAX_SYN_SIZE;
2582   buff->len=24;
2583   buff->sk = sk;
2584   t1=(struct tcp_header *)(buff + 1);
2585   
2586   
2587 
2588   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
2589                                 IPPROTO_TCP, NULL, MAX_SYN_SIZE);
2590   if (tmp < 0)
2591     {
2592       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
2593       release_sock (sk);
2594       return (-ENETUNREACH);
2595     }
2596   buff->len += tmp;
2597   t1 = (struct tcp_header *)((char *)t1 +tmp);
2598 
2599   memcpy (t1, (void *)&(sk->dummy_th), sizeof (*t1));
2600   t1->seq = net32(sk->send_seq++);
2601   buff->h.seq = sk->send_seq;
2602   t1->ack = 0;
2603   t1->window = 2;
2604   t1->res1=0;
2605   t1->res2=0;
2606   t1->rst = 0;
2607   t1->urg = 0;
2608   t1->psh = 0;
2609   t1->syn = 1;
2610   t1->urg_ptr = 0;
2611   t1->doff =6;
2612   
2613   ptr=(unsigned char *)(t1+1);
2614   ptr[0]=2;
2615   ptr[1]=4;
2616   ptr[2]=(dev->mtu- HEADER_SIZE) >> 8;
2617   ptr[3]=(dev->mtu- HEADER_SIZE) & 0xff;
2618   sk->mtu = dev->mtu - HEADER_SIZE;
2619   tcp_send_check (t1, sk->saddr, sk->daddr,
2620                   sizeof (struct tcp_header) + 4, sk);
2621   
2622 
2623   sk->state = TCP_SYN_SENT;
2624 
2625   sk->prot->queue_xmit(sk, dev, buff, 0);
2626   
2627   sk->time_wait.len = TCP_CONNECT_TIME;
2628   reset_timer ((struct timer *)&sk->time_wait);
2629   sk->retransmits = TCP_RETR1 - TCP_SYN_RETRIES;
2630   release_sock (sk);
2631   return (0);
2632 }
2633 
2634 
2635 
2636 
2637 
2638 static  int
2639 tcp_sequence (volatile struct sock *sk, struct tcp_header *th, short len,
     
2640               struct options *opt, unsigned long saddr)
2641 {
2642    
2643 
2644 
2645 
2646 
2647   PRINTK ("tcp_sequence (sk=%X, th=%X, len = %d, opt=%d, saddr=%X)\n",
2648           sk, th, len, opt, saddr);
2649 
2650   if (between(th->seq, sk->acked_seq, sk->acked_seq + sk->window)||
2651       between(th->seq + len-sizeof (*th), sk->acked_seq, 
2652               sk->acked_seq + sk->window) ||
2653       (before (th->seq, sk->acked_seq) &&
2654        after (th->seq + len - sizeof (*th), sk->acked_seq + sk->window)))
2655     {
2656        return (1);
2657     }
2658 
2659   PRINTK ("tcp_sequence: rejecting packet. \n");
2660 
2661   
2662 
2663   if (after (th->seq, sk->acked_seq + sk->window))
2664     {
2665        tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr);
2666        return (0);
2667     }
2668 
2669   
2670   if (th->ack && len == th->doff*4 && after (th->seq, sk->acked_seq - 32767) &&
2671       !th->fin && !th->syn) return (1);
2672 
2673   if (!th->rst)
2674     {
2675        
2676        tcp_send_ack (net32(th->ack_seq), sk->acked_seq, sk, th, saddr);
2677     }
2678 
2679 
2680   return (0);
2681 }
2682 
2683 
2684 static void
2685 tcp_options (volatile struct sock *sk, struct tcp_header *th)
     
2686 {
2687   unsigned char *ptr;
2688   ptr = (unsigned char *)(th + 1);
2689   if (ptr[0] != 2 || ptr[1] != 4)
2690     {
2691        sk->mtu = min (sk->mtu, 576-HEADER_SIZE);
2692        return;
2693     }
2694   sk->mtu = min (sk->mtu, ptr[2]*256 + ptr[3] - HEADER_SIZE);
2695 }
2696 
2697 int
2698 tcp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
     
2699         unsigned long daddr, unsigned short len,
2700         unsigned long saddr, int redo, struct ip_protocol * protocol)
2701 {
2702   struct tcp_header *th;
2703   volatile struct sock *sk;
2704 
2705   if (!skb)
2706     {
2707       PRINTK ("tcp.c: tcp_rcv skb = NULL\n");
2708       return (0);
2709     }
2710 #if 0 
2711   if (!protocol)
2712     {
2713       PRINTK ("tcp.c: tcp_rcv protocol = NULL\n");
2714       return (0);
2715     }
2716 
2717   if (!opt) 
2718     {
2719       PRINTK ("tcp.c: tcp_rcv opt = NULL\n");
2720     }
2721 #endif
2722   if (!dev)
2723     {
2724       PRINTK ("tcp.c: tcp_rcv dev = NULL\n");
2725       return (0);
2726     }
2727 
2728   th = skb->h.th;
2729 
2730   
2731   sk=get_sock(&tcp_prot, net16(th->dest), saddr, th->source, daddr);
2732   PRINTK("<<\n");
2733   PRINTK("len = %d, redo = %d, skb=%X\n", len, redo, skb);
2734 
2735   if (sk)
2736     {
2737       PRINTK ("sk = %X:\n",sk);
2738       print_sk (sk);
2739     }
2740 
2741   if (!redo)
2742     {
2743        if (th->check && tcp_check (th, len, saddr, daddr ))
2744          {
2745             skb->sk = NULL;
2746             PRINTK ("packet dropped with bad checksum.\n");
2747             kfree_skb (skb, 0);
2748             
2749 
2750             return (0);
2751          }
2752 
2753        
2754        if (sk == NULL)
2755         {
2756           if (!th->rst)
2757             tcp_reset (daddr, saddr, th, &tcp_prot, opt,dev);
2758           skb->sk = NULL;
2759           kfree_skb (skb, 0);
2760           return (0);
2761         }
2762 
2763        skb->len = len;
2764        skb->sk = sk;
2765        skb->acked = 0;
2766        skb->used = 0;
2767        skb->free = 0;
2768        skb->urg_used = 0;
2769        skb->saddr = daddr;
2770        skb->daddr = saddr;
2771 
2772        th->seq = net32(th->seq);
2773 
2774        cli();
2775 
2776        
2777        if (sk->inuse)
2778          {
2779             if (sk->back_log == NULL)
2780               {
2781                  sk->back_log = skb;
2782                  skb->next = skb;
2783                  skb->prev = skb;
2784               }
2785             else
2786               {
2787                  skb->next = sk->back_log;
2788                  skb->prev = sk->back_log->prev;
2789                  skb->prev->next = skb;
2790                  skb->next->prev = skb;
2791               }
2792             sti();
2793             return (0);
2794          }
2795        sk->inuse = 1;
2796        sti();
2797      }
2798   else
2799     {
2800       if (!sk)
2801         {
2802           PRINTK ("tcp.c: tcp_rcv bug sk=NULL redo = 1\n");
2803           return (0);
2804         }
2805     }
2806 
2807   if (!sk->prot)
2808     {
2809       PRINTK ("tcp.c: tcp_rcv sk->prot = NULL \n");
2810       return (0);
2811     }
2812 
2813   
2814   if (sk->rmem_alloc + skb->mem_len >= SK_RMEM_MAX)
2815     {
2816        skb->sk = NULL;
2817        PRINTK ("dropping packet due to lack of buffer space.\n");
2818        kfree_skb (skb, 0);
2819        release_sock (sk);
2820        return (0);
2821     }
2822        
2823   sk->rmem_alloc += skb->mem_len;
2824 
2825   PRINTK ("About to do switch. \n");
2826 
2827   
2828 
2829   switch (sk->state)
2830     {
2831        
2832 
2833     case TCP_LAST_ACK:
2834       if (th->rst)
2835         {
2836           sk->err = ECONNRESET;
2837           sk->state = TCP_CLOSE;
2838           if (!sk->dead)
2839             {
2840               wake_up (sk->sleep);
2841             }
2842           kfree_skb (skb, FREE_READ);
2843           release_sock(sk);
2844           return (0);
2845         }
2846 
2847     case TCP_ESTABLISHED:
2848     case TCP_CLOSE_WAIT:
2849     case TCP_FIN_WAIT1:
2850     case TCP_FIN_WAIT2:
2851     case TCP_TIME_WAIT:
2852    
2853       if (!tcp_sequence (sk, th, len, opt, saddr))
2854         {
2855            kfree_skb (skb, FREE_READ);
2856            release_sock(sk);
2857            return (0);
2858         }
2859 
2860       if (th->rst)
2861         {
2862           sk->err = ECONNRESET;
2863           sk->state = TCP_CLOSE;
2864           if (!sk->dead)
2865             {
2866               wake_up (sk->sleep);
2867             }
2868           kfree_skb (skb, FREE_READ);
2869           release_sock(sk);
2870           return (0);
2871         }
2872       if (opt && (opt->security != 0 || opt->compartment != 0 || th->syn))
2873         {
2874            sk->err = ECONNRESET;
2875            sk->state = TCP_CLOSE;
2876            tcp_reset (daddr, saddr,  th, sk->prot, opt,dev);
2877            if (!sk->dead)
2878              {
2879                 wake_up (sk->sleep);
2880              }
2881            kfree_skb (skb, FREE_READ);
2882            release_sock(sk);
2883            return (0);
2884         }
2885 
2886       if (th->ack)
2887         {
2888            if(!tcp_ack (sk, th, saddr))
2889             {
2890                kfree_skb (skb, FREE_READ);
2891                release_sock(sk);
2892                return (0);
2893            }
2894         }
2895       if (th->urg)
2896         {
2897           if (tcp_urg (sk, th, saddr))
2898             {
2899                kfree_skb (skb, FREE_READ);
2900                release_sock(sk);
2901                return (0);
2902             }
2903         }
2904 
2905       if ( tcp_data (skb, sk, saddr, len))
2906         {
2907            kfree_skb (skb, FREE_READ);
2908            release_sock(sk);
2909            return (0);
2910         }
2911 
2912       if (!th->fin)
2913         {
2914           release_sock(sk);
2915           return (0);
2916         }
2917 
2918       tcp_fin (sk, th, saddr, dev);
2919       release_sock(sk);
2920       return (0);
2921 
2922     case TCP_CLOSE:
2923 
2924       if (sk->dead || sk->daddr)
2925         {
2926            PRINTK ("packet received for closed,dead socket\n");
2927            kfree_skb (skb, FREE_READ);
2928            release_sock (sk);
2929            return (0);
2930         }
2931 
2932       if (!th->rst)
2933         {
2934           if (!th->ack)
2935             th->ack_seq=0;
2936           tcp_reset (daddr, saddr, th, sk->prot, opt,dev);
2937         }
2938       kfree_skb (skb, FREE_READ);
2939       release_sock(sk);
2940       return (0);
2941 
2942     case TCP_LISTEN:
2943       if (th->rst)
2944         {
2945            kfree_skb (skb, FREE_READ);
2946            release_sock(sk);
2947            return (0);
2948         }
2949       if (th->ack)
2950         {
2951           tcp_reset (daddr, saddr, th, sk->prot, opt,dev );
2952           kfree_skb (skb, FREE_READ);
2953           release_sock(sk);
2954           return (0);
2955         }
2956 
2957       if (th->syn)
2958         {
2959 
2960 
2961 
2962 
2963 
2964 
2965 
2966           
2967 
2968 
2969 
2970 
2971           tcp_conn_request (sk, skb, daddr, saddr, opt, dev);
2972 
2973           release_sock(sk);
2974           return (0);
2975         }
2976 
2977       kfree_skb (skb, FREE_READ);
2978       release_sock(sk);
2979       return (0);
2980 
2981     default:
2982       if (!tcp_sequence (sk, th, len, opt, saddr)) 
2983         {
2984            kfree_skb (skb, FREE_READ);
2985            release_sock(sk);
2986            return (0);
2987         }
2988 
2989     case TCP_SYN_SENT:
2990       if (th->rst)
2991         {
2992           sk->err = ECONNREFUSED;
2993           sk->state = TCP_CLOSE;
2994           if (!sk->dead)
2995             {
2996               wake_up (sk->sleep);
2997             }
2998           kfree_skb (skb, FREE_READ);
2999           release_sock(sk);
3000           return (0);
3001         }
3002 
3003 
3004 
3005 
3006 
3007 
3008 
3009 
3010 
3011 
3012 
3013 
3014 
3015 
3016       if (!th->ack) 
3017         {
3018           if (th->syn)
3019             {
3020               sk->state = TCP_SYN_RECV;
3021             }
3022 
3023           kfree_skb (skb, FREE_READ);
3024           release_sock(sk);
3025           return (0);
3026         }
3027 
3028       switch (sk->state)
3029         {
3030         case TCP_SYN_SENT:
3031           if (!tcp_ack(sk, th, saddr))
3032             {
3033               tcp_reset(daddr, saddr, th, sk->prot, opt,dev);
3034               kfree_skb (skb, FREE_READ);
3035               release_sock(sk);
3036               return (0);
3037             }
3038 
3039           
3040 
3041               
3042           if (!th->syn) 
3043             {
3044               kfree_skb (skb, FREE_READ);
3045               release_sock (sk);
3046               return (0);
3047             }
3048 
3049           
3050           sk->acked_seq = th->seq+1;
3051           sk->fin_seq = th->seq;
3052           tcp_send_ack (sk->send_seq, th->seq+1, sk, 
3053                              th, sk->daddr);
3054         
3055         case TCP_SYN_RECV:
3056           if (!tcp_ack(sk, th, saddr))
3057             {
3058               tcp_reset(daddr, saddr, th, sk->prot, opt, dev);
3059               kfree_skb (skb, FREE_READ);
3060               release_sock(sk);
3061               return (0);
3062             }
3063 
3064           sk->state = TCP_ESTABLISHED;
3065           
3066 
3067 
3068           
3069           tcp_options(sk, th);
3070           sk->dummy_th.dest = th->source;
3071           sk->copied_seq = sk->acked_seq-1;
3072           if (!sk->dead)
3073             {
3074               wake_up (sk->sleep);
3075             }
3076 
3077           
3078 
3079           if (th->urg)
3080             if (tcp_urg (sk, th, saddr))
3081               {
3082                  kfree_skb (skb, FREE_READ);
3083                  release_sock(sk);
3084                  return (0);
3085               }
3086           if (tcp_data (skb, sk, saddr, len))
3087             kfree_skb (skb, FREE_READ);
3088           
3089           if (th->fin)
3090             tcp_fin(sk, th, saddr, dev);
3091 
3092           release_sock(sk);
3093           return (0);
3094         }
3095 
3096       if (th->urg)
3097         {
3098           if (tcp_urg (sk, th, saddr))
3099             {
3100                kfree_skb (skb, FREE_READ);
3101                release_sock (sk);
3102                return (0);
3103             }
3104         }
3105 
3106       if (tcp_data (skb, sk, saddr, len))
3107         {
3108            kfree_skb (skb, FREE_READ);
3109            release_sock (sk);
3110            return (0);
3111         }
3112 
3113       if (!th->fin)
3114         {
3115           release_sock(sk);
3116           return (0);
3117         }
3118       tcp_fin (sk, th, saddr, dev);
3119       release_sock(sk);
3120       return (0);
3121     }
3122 }
3123 
3124 
3125 
3126 
3127 
3128 static  void
3129 tcp_write_wakeup(volatile struct sock *sk)
     
3130 {
3131   struct sk_buff *buff;
3132   struct tcp_header *t1;
3133   struct device *dev=NULL;
3134   int tmp;
3135   if (sk -> state != TCP_ESTABLISHED && sk->state != TCP_CLOSE_WAIT) return;
3136 
3137   buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1, GFP_ATOMIC);
3138   
3139   if (buff == NULL) return;
3140 
3141   buff->lock = 0;
3142   buff->mem_addr = buff;
3143   buff->mem_len = MAX_ACK_SIZE;
3144   buff->len=sizeof (struct tcp_header);
3145   buff->free = 1;
3146   buff->sk = sk;
3147   PRINTK ("in tcp_write_wakeup\n");
3148   t1=(struct tcp_header *)(buff + 1);
3149 
3150   
3151   tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev,
3152                                 IPPROTO_TCP, sk->opt, MAX_ACK_SIZE);
3153   if (tmp < 0)
3154     {
3155       sk->prot->wfree(sk, buff->mem_addr, buff->mem_len);
3156       return;
3157     }
3158 
3159   buff->len += tmp;
3160   t1 = (struct tcp_header *)((char *)t1 +tmp);
3161 
3162   memcpy (t1,(void *) &sk->dummy_th, sizeof (*t1));
3163 
3164   
3165 
3166   t1->seq = net32(sk->send_seq-1);
3167   t1->ack = 1; 
3168   t1->res1= 0;
3169   t1->res2= 0;
3170   t1->rst = 0;
3171   t1->urg = 0;
3172   t1->psh = 0;
3173   t1->fin = 0;
3174   t1->syn = 0;
3175   t1->ack_seq = net32(sk->acked_seq);
3176   t1->window = net16(sk->prot->rspace(sk));
3177   t1->doff = sizeof (*t1)/4;
3178   tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk);
3179   
3180 
3181   sk->prot->queue_xmit(sk, dev, buff, 1);
3182 
3183 }
3184 
3185 struct proto tcp_prot =
3186 {
3187   sock_wmalloc,
3188   sock_rmalloc,
3189   sock_wfree,
3190   sock_rfree,
3191   sock_rspace,
3192   sock_wspace,
3193   tcp_close,
3194   tcp_read,
3195   tcp_write,
3196   tcp_sendto,
3197   tcp_recvfrom,
3198   ip_build_header,
3199   tcp_connect,
3200   tcp_accept,
3201   ip_queue_xmit,
3202   tcp_retransmit,
3203   tcp_write_wakeup,
3204   tcp_read_wakeup,
3205   tcp_rcv,
3206   tcp_select,
3207   tcp_ioctl,
3208   NULL,
3209   tcp_shutdown,
3210   128,
3211   0,
3212   {NULL,}
3213 };
3214 
3215 
3216 
3217