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

📄 tcp.lst

📁 51 单片机TCP_IP 协议栈ZLIP源码 单片机上网技术
💻 LST
📖 第 1 页 / 共 4 页
字号:
 484   3                              /* insert this tcb to tcb list isn't need. because
 485   3                              this tcb is already insert at TCPSocket()*/
 486   3      
 487   3                              /* initial new tcb value*/
 488   3                              pNewTCB->TCPState       = TCP_STATE_SYNRECVD;
 489   3                              pNewTCB->IPDest         = pIPHead->IPScr;
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 9   

 490   3                              pNewTCB->PortDest       = pTCPHead->PortScr;
 491   3                              pNewTCB->PortScr        = pTCPHead->PortDest;
 492   3      
 493   3                              pNewTCB->SeqHis = pTCPHead->Seq + 1;    /* syn is use 1 
 494   3                                                                                                              sequence */
 495   3                              pNewTCB->WndHis = pTCPHead->WndSize;
 496   3      
 497   3                              /* set accept function. when pNewTCB accept this
 498   3                              connection call pTCB->accetp */
 499   3                              pNewTCB->accept = pTCB->accept;                 
 500   3      
 501   3                              /* send syn+ack */
 502   3                              TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_SYN | TCP_ACK);
 503   3                      }
 504   2                      break;
 505   2              case TCP_STATE_SYNRECVD:
 506   2      
 507   2                      /* ack: to TCP_STATE_ESTABLISHED */
 508   2                      if((pTCPHead->flag & TCP_ACK) != 0)
 509   2                              pTCB->TCPState = TCP_STATE_ESTABLISHED;
 510   2      
 511   2                      /* call accept. Let user to know and deal more */
 512   2                      pTCB->accept(pTCB);
 513   2      
 514   2                      break;
 515   2              case TCP_STATE_SYNSENT:
 516   2                      switch(pTCPHead->flag)
 517   2                      {
 518   3                      case TCP_SYN:
 519   3                              /* syn: to TCP_STATE_SYNRECVD send syn+ack */
 520   3      
 521   3                              pTCB->TCPState = TCP_STATE_SYNRECVD;
 522   3      
 523   3                              /* ackseq initial */
 524   3                              pTCB->SeqHis = pTCPHead->Seq + 1;       /* syn use 1 sequence */
 525   3      
 526   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_SYN | TCP_ACK);
 527   3                              break;
 528   3                      case TCP_SYN | TCP_ACK: 
 529   3                              /* syn+ack: to TCP_STATE_ESTABLISHED send ack */
 530   3              
 531   3                              pTCB->TCPState = TCP_STATE_ESTABLISHED;
 532   3      
 533   3                              /* ackseq initial */
 534   3                              pTCB->SeqHis = pTCPHead->Seq + 1;       /* syn use 1 sequence */
 535   3      
 536   3                              TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
 537   3                              break;
 538   3                      case TCP_RST | TCP_ACK:
 539   3                              /* rst: to closed */
 540   3                              pTCB->TCPState = TCP_STATE_CLOSED;
 541   3                              TCPRelease(pTCB);
 542   3                              break;
 543   3                      }
 544   2                      break;
 545   2              case TCP_STATE_ESTABLISHED:
 546   2                      /* fin:to closewait send ack */
 547   2                      if((pTCPHead->flag & TCP_FIN) != 0)
 548   2                      {
 549   3                              pTCB->TCPState = TCP_STATE_CLOSEWAIT;
 550   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 551   3      
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 10  

 552   3                              /* call ->close() let user to know he want to close connection 
 553   3                              user should call TCPClose() to close the connection in ->close */
 554   3                              pTCB->close(pTCB);
 555   3                      }
 556   2                      break;
 557   2              case TCP_STATE_CLOSEWAIT:
 558   2                      /* he want to close, send a fin to close */
 559   2                      pTCB->TCPState = TCP_STATE_LASTACK;
 560   2                      pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;
 561   2                      TCPSendSeg(pTCB,TCPAllocate(0), TCP_FIN | TCP_ACK);
 562   2                      break;
 563   2              case TCP_STATE_FINWAIT1:
 564   2                      switch(pTCPHead->flag)
 565   2                      {
 566   3                      case TCP_FIN:
 567   3                              /* fin: to TCP_STATE_CLOSING send ack */
 568   3                              pTCB->TCPState = TCP_STATE_CLOSING;
 569   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 570   3                              break;
 571   3                      case TCP_FIN | TCP_ACK:
 572   3                              pTCB->TCPState = TCP_STATE_TIMEWAIT;
 573   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;      /* start timer */
 574   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 575   3                              break;
 576   3                      case TCP_ACK:
 577   3                              pTCB->TCPState = TCP_STATE_FINWAIT2;
 578   3                              break;
 579   3                      }
 580   2                      break;
 581   2              case TCP_STATE_CLOSING:
 582   2                      /* ack:to TCP_STATE_CLOSED */
 583   2                      if(pTCPHead->flag & TCP_ACK)
 584   2                      {
 585   3                              pTCB->TCPState = TCP_STATE_TIMEWAIT;
 586   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;      /* start timer */
 587   3                      }
 588   2                      break;
 589   2              case TCP_STATE_FINWAIT2:
 590   2                      if(pTCPHead->flag & TCP_FIN)
 591   2                      {
 592   3                              pTCB->TCPState = TCP_STATE_TIMEWAIT;
 593   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;      /* start timer */
 594   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 595   3                      }
 596   2                      break;
 597   2              }
 598   1      
 599   1              /*
 600   1               * put tcp data to uper layer 
 601   1               */
 602   1              if(TCPDataSize != 0)
 603   1              {
 604   2                      pTCB->recv(MemHead->pStart + TCP_HEAD_LEN(pTCPHead),TCPDataSize);
 605   2              }
 606   1      
 607   1              /*
 608   1               * free this packet 
 609   1               */
 610   1              MemFree(MemHead);
 611   1      }
 612          
 613          /* tcp packet in.*/
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 11  

 614          void TCPInput(struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG
 615          {
 616   1              struct SIPHead  DT_XDATA *pIPHead;
 617   1              struct STCPHead DT_XDATA *pTCPHead;
 618   1              struct STCB             DT_XDATA *pNewTCB;
 619   1              struct STCB     DT_XDATA *pTCB;
 620   1              
 621   1              pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart);
 622   1              pIPHead  = (struct SIPHead  DT_XDATA *)(MemHead->pStart - sizeof(struct SIPHead));
 623   1      
 624   1              /*
 625   1               * is check sum ok? 
 626   1               */
 627   1              if(TCPCheckSum(pIPHead,ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN) != 0)
 628   1              {               
 629   2                      MemFree(MemHead);
 630   2                      return;
 631   2              }
 632   1      
 633   1              /* 
 634   1               * is there a connection can accept this tcp packet?
 635   1               */
 636   1      
 637   1              /* if is syn packet. a tcb in listen can accept it. */
 638   1              if(pTCPHead->flag == TCP_SYN)
 639   1              {
 640   2                      for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
 641   2                      {
 642   3                              if(pTCB->TCPState == TCP_STATE_LISTEN &&
 643   3                                      pTCB->PortScr == pTCPHead->PortDest)
 644   3                              {
 645   4                                      break;
 646   4                              }
 647   3                      }
 648   2              }
 649   1              else
 650   1              {
 651   2                      /* search active connections. TCBState must not the 
 652   2                      closed and listen state */
 653   2                      for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
 654   2                      {
 655   3                              /* and the source ip, dest ip, source port, dest port
 656   3                                      must equal */                           
 657   3                              if(pTCB->PortScr == pTCPHead->PortDest &&
 658   3                                      pTCB->PortDest == pTCPHead->PortScr &&
 659   3                                      pTCB->TCPState != TCP_STATE_LISTEN &&
 660   3                                      pTCB->TCPState != TCP_STATE_CLOSED &&
 661   3                                      pTCB->IPScr  == pIPHead->IPDest &&
 662   3                                      pTCB->IPDest == pIPHead->IPScr)
 663   3                                      break;
 664   3                              
 665   3                      }
 666   2              }
 667   1      
 668   1              /* can't find, and send a rst */
 669   1              if(pTCB == NULL)
 670   1              {
 671   2                      /* allocate a temp tcb for use */
 672   2                      pNewTCB = TCPSocket(ntohl(pIPHead->IPDest));
 673   2                      pNewTCB->IPDest         = pIPHead->IPScr;
 674   2                      pNewTCB->PortDest       = pTCPHead->PortScr;
 675   2                      pNewTCB->PortScr        = pTCPHead->PortDest;
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 12  

 676   2                      
 677   2                      /* set MemFree DataSize to 0 */
 678   2                      MemHead->pStart = MemHead->pEnd;
 679   2      
 680   2                      TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_ACK | TCP_RST);
 681   2      
 682   2                      MemFree(MemHead);
 683   2                      TCPAbort(pNewTCB);
 684   2                      return;
 685   2              }
 686   1      
 687   1              /* 
 688   1               *  is it a expected packet? 
 689   1               */
 690   1              /* first change all necessary part to host order */
 691   1       #ifndef HOST_ORDER_AS_NET
                      pTCPHead->AckSeq        = ntohl(pTCPHead->AckSeq);
                      pTCPHead->Seq           = ntohl(pTCPHead->Seq);
                      pTCPHead->WndSize       = ntohs(pTCPHead->WndSize);
              #endif
 696   1      
 697   1              /* if it is the first packet from him, don't check sequence.
 698   1                 in connection case: a syn or syn+ack packet. in listen case
 699   1                 : a syn packet. so pass all packet contain syn flag */
 700   1              if((pTCPHead->flag & TCP_SYN) == 0)
 701   1              {
 702   2                      /* sequence ok? */
 703   2                      if(pTCB->SeqHis != pTCPHead->Seq)
 704   2                      {
 705   3                              /* if this a packet fall within rev window */
 706   3                              if(TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) > 0
 707   3                                      && TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) < pTCB->WndMine)
 708   3                              {
 709   4                                      /* write it to QExceedSeq for late receive */
 710   4                                      TCPInsertQ(&(pTCB->QExceedSeq),MemHead,pTCPHead->Seq);
 711   4                                      return;
 712   4                              }
 713   3                              else
 714   3                              {
 715   4                                      /* packet fall outof window, drop it. and send a ack back, because 
 716   4                                      this is probably ocurr when our pre send ack is lose.*/
 717   4                                      MemFree(MemHead);
 718   4                                      TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
 719   4                                      return;
 720   4                              }
 721   3                      }/* else sequence equal. ok */
 722   2              }/* else is syn packet */
 723   1              
 724   1              /* deal incoming packet */
 725   1              TCPRecvSeg(pTCB,MemHead);
 726   1      
 727   1              /* if seg in ExceedSeq can receive now? */
 728   1              while(pTCB->QExceedSeq != NULL &&

⌨️ 快捷键说明

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