⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tinytcp.lst

📁 在89C51上实现TCPIP协议
💻 LST
📖 第 1 页 / 共 3 页
字号:
 525   2      
 526   2                              if ( diff == 0 || diff == s->dataSize ) {
 527   3                                      s->state = tcp_StateFINWT2;
 528   3                                      s->flags = tcp_FlagACK;
 529   3                                      s->seqnum += (diff+1);
 530   3                                      s->dataSize -= diff;
 531   3      #ifdef DEBUG
                                              print("finack received.\r\n");
              #endif
 534   3                              }
 535   2                              
 536   2                              tcp_ProcessData(s, tp, len);
 537   2                              break;
 538   2      
 539   2                      case tcp_StateFINWT2:
 540   2                              s->flags = tcp_FlagACK;
 541   2                              tcp_ProcessData(s, tp, len);
 542   2                              break;
C51 COMPILER V7.07   TINYTCP                                                               04/20/2004 18:04:42 PAGE 10  

 543   2      
 544   2                      case tcp_StateCLOSING:
 545   2                              if ( tp->acknum == (s->seqnum + 1) ) {
 546   3                                      s->state = tcp_StateTIMEWT;
 547   3                                      s->timeout = tcp_TIMEOUT;
 548   3                              }
 549   2                              break;
 550   2      
 551   2                      case tcp_StateLASTACK:
 552   2                              if ( tp->acknum == (s->seqnum + 1) ) {
 553   3                                      s->state = tcp_StateCLOSED;
 554   3                                      s->unhappy = false;
 555   3                                      s->dataSize = 0;
 556   3      //                              s->dataHandler((tcp_Socket *)s,(BYTE *)0, (WORD *)0);
 557   3                                      DATAHANDLER((tcp_Socket *)s,(BYTE *)0,0);
 558   3                                      tcp_Unthread(s);
 559   3      #ifdef DEBUG
                                              print("Closed.    \r\n");
              #endif
 562   3                              } else {
 563   3                                      s->flags = tcp_FlagACK | tcp_FlagFIN;
 564   3                                      tcp_Send(s);
 565   3                                      s->timeout = tcp_TIMEOUT;
 566   3      #ifdef DEBUG
                                              print("retransmitting FIN\r\n");
              #endif
 569   3                              }
 570   2                              break;
 571   2      
 572   2                      case tcp_StateTIMEWT:
 573   2                              s->flags = tcp_FlagACK;
 574   2                              tcp_Send(s);
 575   2              }
 576   1      }
*** WARNING C280 IN LINE 383 OF SRC\TINYTCP.C: 'dp': unreferenced local variable
*** WARNING C280 IN LINE 384 OF SRC\TINYTCP.C: 'x': unreferenced local variable
 577          
 578          /*
 579           * Process the data in an incoming packet.
 580           * Called from all states where incoming data can be received: established,
 581           * fin-wait-1, fin-wait-2
 582           */
 583          void tcp_ProcessData(tcp_Socket *s, tcp_Header *tp, WORD len)
 584          {
 585   1              short diff, x;
 586   1              WORD flags;
 587   1              BYTE *dp;
 588   1      
 589   1              flags = tp->flags;
 590   1              diff = s->acknum - tp->seqnum;
 591   1              if ( flags & tcp_FlagSYN ) diff--;
 592   1              x = tcp_GetDataOffset(tp) << 2;         /* x = hdrlen in bytes */
 593   1              dp = (BYTE *)tp + x;                    /* get first pointer of data */
 594   1              len -= x;                                       /* len is data length now */
 595   1              if ( diff >= 0 ) {
 596   2                      dp += diff;
 597   2                      len -= diff;
 598   2                      s->acknum += len;
 599   2      //              s->dataHandler((tcp_Socket *)s,(BYTE *)dp, (WORD *)len);
 600   2                      DATAHANDLER((tcp_Socket *)s,(BYTE *)dp,len);
 601   2                      if ( flags & tcp_FlagFIN ) {
 602   3                              s->acknum++;
C51 COMPILER V7.07   TINYTCP                                                               04/20/2004 18:04:42 PAGE 11  

 603   3      #ifdef DEBUG
                                      print("consumed fin.\r\n");
              #endif
 606   3                              switch(s->state) {
 607   4                                      case tcp_StateESTAB:
 608   4                                              /* note: skip state CLOSEWT by automatically closing conn */
 609   4                                              x = tcp_StateLASTACK;
 610   4                                              s->flags |= tcp_FlagFIN;
 611   4                                              s->unhappy = true;
 612   4      #ifdef DEBUG
                                                      print("fin on estab.\r\n");
              #endif
 615   4                                              break;
 616   4                                      case tcp_StateFINWT1:
 617   4                                              x = tcp_StateCLOSING;
 618   4                                              break;
 619   4                                      case tcp_StateFINWT2:
 620   4                                              x = tcp_StateTIMEWT;
 621   4                                              break;
 622   4                              }
 623   3                              s->state = x;
 624   3                      }
 625   2              }
 626   1              s->timeout = tcp_TIMEOUT;
 627   1              tcp_Send(s);
 628   1      }
 629          
 630          /*
 631           * Format and send an outgoing segment
 632           */
 633          void tcp_Send(tcp_Socket *s)
 634          {
 635   1              tcp_PseudoHeader ph;
 636   1              struct _pkt {
 637   1                      in_Header in;
 638   1                      tcp_Header tcp;
 639   1                      DWORD maxsegopt;
 640   1              } *pkt;
 641   1              BYTE *dp;
 642   1      
 643   1              pkt = (struct _pkt *)sed_FormatPacket(&s->hisethaddr[0], 0x800);
 644   1              dp = (BYTE *)&pkt->maxsegopt;
 645   1      
 646   1              pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header) + s->dataSize;
 647   1      
 648   1              /* tcp header */
 649   1              pkt->tcp.srcPort = s->myport;
 650   1              pkt->tcp.dstPort = s->hisport;
 651   1              pkt->tcp.seqnum = s->seqnum;
 652   1              pkt->tcp.acknum = s->acknum;
 653   1              pkt->tcp.window = 1024;
 654   1              pkt->tcp.flags = s->flags | 0x5000;             /* Header length = 20bytes ;; no option */
 655   1              pkt->tcp.checksum = 0;
 656   1              pkt->tcp.urgentPointer = 0;
 657   1              if ( s->flags & tcp_FlagSYN ) {
 658   2                      pkt->tcp.flags += 0x1000;
 659   2                      pkt->in.length += 4;
 660   2                      pkt->maxsegopt = 0x02040578; /* 1400 bytes */
 661   2                      dp += 4;
 662   2              }
 663   1              Move(s->datas, dp, s->dataSize);                /* copy data to pointer which is next to tcp header */
 664   1      
C51 COMPILER V7.07   TINYTCP                                                               04/20/2004 18:04:42 PAGE 12  

 665   1              /* internet header */
 666   1              pkt->in.vht = 0x4500;   /* version 4, hdrlen 5, tos 0 */
 667   1              pkt->in.identification = tcp_id++;
 668   1              pkt->in.frag = 0;
 669   1              pkt->in.ttlProtocol = (250<<8) + 6;
 670   1              pkt->in.checksum = 0;
 671   1              pkt->in.source = sin_lclINAddr;
 672   1              pkt->in.destination = s->hisaddr;
 673   1              pkt->in.checksum = ~(checksum((WORD *)&pkt->in, sizeof(in_Header)));
 674   1      
 675   1              /* compute tcp checksum */
 676   1              ph.src = pkt->in.source;
 677   1              ph.dst = pkt->in.destination;
 678   1              ph.mbz = 0;
 679   1              ph.protocol = 6;
 680   1              ph.length = pkt->in.length - sizeof(in_Header);
 681   1              ph.checksum = checksum((WORD *)&pkt->tcp, ph.length);
 682   1              pkt->tcp.checksum = ~checksum((WORD *)&ph, sizeof ph);
 683   1      
 684   1              sed_Send(pkt->in.length);
 685   1      }
 686          
 687          /*
 688           * Format and send an outgoing reset segment
 689           */
 690          void tcp_Reset( in_Header *ip, tcp_Header *tp )
 691          {
 692   1              tcp_PseudoHeader ph;
 693   1              struct _pkt {
 694   1                      in_Header in;
 695   1                      tcp_Header tcp;
 696   1                      DWORD maxsegopt;
 697   1              } *pkt;
 698   1      
 699   1              pkt = (struct _pkt *)sed_FormatPacket(&(((eth_Header *)ip)-1)->source[0], 0x800);
 700   1              pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header);
 701   1      
 702   1              /* tcp header */
 703   1              pkt->tcp.srcPort = tp->dstPort;
 704   1              pkt->tcp.dstPort = tp->srcPort;
 705   1              pkt->tcp.seqnum = tp->seqnum;
 706   1              pkt->tcp.acknum = tp->acknum;
 707   1              pkt->tcp.window = 1024;
 708   1              pkt->tcp.flags = tcp_FlagRST | 0x5000;          /* Header length = 20bytes ;; no option */
 709   1              pkt->tcp.checksum = 0;
 710   1              pkt->tcp.urgentPointer = 0;
 711   1      
 712   1              /* internet header */
 713   1              pkt->in.vht = 0x4500;   /* version 4, hdrlen 5, tos 0 */
 714   1              pkt->in.identification = tcp_id++;
 715   1              pkt->in.frag = 0;
 716   1              pkt->in.ttlProtocol = (250<<8) + 6;
 717   1              pkt->in.checksum = 0;
 718   1              pkt->in.source = sin_lclINAddr;
 719   1              pkt->in.destination = ip->source;
 720   1              pkt->in.checksum = ~(checksum((WORD *)&pkt->in, sizeof(in_Header)));
 721   1      
 722   1              /* compute tcp checksum */
 723   1              ph.src = pkt->in.source;
 724   1              ph.dst = pkt->in.destination;
 725   1              ph.mbz = 0;
 726   1              ph.protocol = 6;
C51 COMPILER V7.07   TINYTCP                                                               04/20/2004 18:04:42 PAGE 13  

 727   1              ph.length = pkt->in.length - sizeof(in_Header);
 728   1              ph.checksum = checksum((WORD *)&pkt->tcp, ph.length);
 729   1              pkt->tcp.checksum = ~checksum((WORD *)&ph, sizeof ph);
 730   1      
 731   1              sed_Send(pkt->in.length);
 732   1      }
 733          
 734          /*
 735           * Do a one's complement checksum
 736           */
 737          int checksum(WORD *dp, WORD length)
 738          {
 739   1              WORD len;
 740   1              DWORD sum;
 741   1      
 742   1              len = length >> 1;
 743   1              sum = 0;
 744   1              while ( len-- > 0 ) sum += *dp++;
 745   1              if ( length & 1 ) sum += (*dp & 0xFF00);
 746   1              sum = (sum & 0xFFFF) + ((sum >> 16) & 0xFFFF);
 747   1              sum = (sum & 0xFFFF) + ((sum >> 16) & 0xFFFF);
 748   1      
 749   1              return ( sum );
 750   1      }
 751          
 752          
 753          /* Dump the tcp protocol header of a packet */
 754          #ifdef DEBUG
              void tcp_DumpHeader( in_Header *ip, tcp_Header *tp, BYTE *mesg )
              {
                      return;
                      /*
                      tcp_Header *tp = (tcp_Header *)((BYTE *)ip + in_GetHdrlenBytes(ip));
                      static char *flags[] = { "FIN", "SYN", "RST", "PUSH", "ACK", "URG" };
                      int len;
                      WORD f;
              
                      len =  ip->length - ((tcp_GetDataOffset(tp) + in_GetHdrlen(ip)) << 2);
                      printf("TCP: %s packet:\r\nS: %x; D: %x; SN=%x ACK=%x W=%d DLen=%d\r\n",
                         mesg, tp->srcPort, tp->dstPort, tp->seqnum, tp->acknum,
                         tp->window, len);
                      printf("DO=%d, C=%x U=%d",
                         tcp_GetDataOffset(tp), tp->checksum, tp->urgentPointer);
                  f = tp->flags;
                  for ( len = 0; len < 6; len++ )
                      if ( f & (1 << len) ) printf(" %s", flags[len]);
                  printf("\r\n");
                 */
              }
              #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   4363    ----
   CONSTANT SIZE    =     24    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     20     141
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  8 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -