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

📄 tcp.lst.svn-base

📁 数字广播系统的开发源码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TCP
OBJECT MODULE PLACED IN E:\NETBRO~1\TRUNK\NETBRO~1\VW\TCP.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\NETBRO~1\TRUNK\NETBRO~1\VW\TCP.C DB SB OE

stmt level    source

   1          /*
   2           */
   3          
   4          #include "GloblDef.h"
   5          #include "TCPIPmem.h"
   6          #include "IP.h"
   7          #include "Netif.h"
   8          #include "TCP.h"
   9          
  10          struct STCB xdata TCBPool[TCP_CONNECTION_MAX_NUM];
  11          struct STCB xdata * xdata TCBFreeList;          /* free list */
  12          struct STCB xdata * xdata TCBList;                      /* tcb in use */
  13          
  14          struct SPacketQueue xdata QPool[TCP_QUEUE_MAX_NUM];
  15          struct SPacketQueue xdata * xdata QFreeList;
  16          
  17          struct STCB xdata *TCPGetTCB() reentrant
  18          {
  19   1              struct STCB xdata * pTCB;
  20   1              if((pTCB = TCBFreeList) != NULL)
  21   1              {
  22   2                      TCBFreeList = TCBFreeList->pNext;
  23   2              }
  24   1              return pTCB;
  25   1      }
  26          
  27          void TCPInsertTCB(struct STCB xdata *pTCB) reentrant
  28          {
  29   1              pTCB->pNext = TCBList;
  30   1              TCBList = pTCB;
  31   1      }
  32          
  33          struct SPacketQueue xdata * TCPGetQ() reentrant
  34          {
  35   1              struct SPacketQueue xdata * pQ;
  36   1              if((pQ = QFreeList) != NULL)
  37   1              {
  38   2                      QFreeList = QFreeList->pNext;
  39   2              }
  40   1              return pQ;
  41   1      }
  42          
  43          /* insert to the head of *ppQ. Q is a double link chain */
  44          unsigned char TCPInsertQ(struct SPacketQueue xdata * xdata * ppQ,struct SMemHead xdata *MemHead,
  45                                          unsigned short Seq) reentrant
  46          {
  47   1              struct SPacketQueue xdata *pNewQ;
  48   1              struct SPacketQueue xdata *pQ;
  49   1      
  50   1              /* allocate a queue to it */
  51   1              if((pNewQ = TCPGetQ()) == NULL)
  52   1                      return FALSE;
  53   1      
  54   1              /* write content */
  55   1              pNewQ->Seq = Seq;
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 2   

  56   1              pNewQ->MemHead = MemHead;
  57   1      
  58   1              /*
  59   1               * link in the queue
  60   1               */
  61   1      
  62   1              /* if is a empty queue */
  63   1              if(*ppQ == NULL)
  64   1              {
  65   2                      *ppQ = pNewQ;
  66   2      
  67   2                      /* pNext pPre point to itself when no others in queue */
  68   2                      pNewQ->pNext = pNewQ;
  69   2                      pNewQ->pPre  = pNewQ;
  70   2              }
  71   1              else
  72   1              {
  73   2                      pQ = *ppQ;
  74   2      
  75   2                      /* pNext link */
  76   2                      pNewQ->pNext = pQ->pNext;
  77   2                      pQ->pNext    = pNewQ;
  78   2      
  79   2                      /* pPre link */
  80   2                      pNewQ->pNext->pPre      = pNewQ;
  81   2                      pNewQ->pPre                     = pQ;
  82   2              }
  83   1              return TRUE;
  84   1      }
  85          
  86          /* move the last unit in queue outof queue,if the queue
  87          is empty return FALSE.actrually last unit is *ppQ */
  88          struct SPacketQueue xdata * TCPOutQ(struct SPacketQueue xdata * xdata * ppQ) reentrant
  89          {
  90   1              struct SPacketQueue xdata *pQ;
  91   1      
  92   1              /* a empty queue? */
  93   1              if((pQ = *ppQ) == NULL)
  94   1                      return NULL;
  95   1      
  96   1              /* after remove it, the queue is empty? */
  97   1              if(pQ->pNext == pQ)
  98   1                      *ppQ = NULL;
  99   1              else
 100   1              {
 101   2                      /* relink */
 102   2                      pQ->pPre->pNext = pQ->pNext;
 103   2                      pQ->pNext->pPre = pQ->pPre;
 104   2      
 105   2                      /* and the queue head *ppQ point to pQ->pPre */
 106   2                      *ppQ = pQ->pPre;
 107   2              }
 108   1      
 109   1              /* relaim it. link to QFreeList */
 110   1              pQ->pNext = QFreeList;
 111   1              QFreeList = pQ;
 112   1              return pQ;
 113   1      }
 114          
 115          void TCPInit() reentrant
 116          {
 117   1              unsigned int i;
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 3   

 118   1      
 119   1              /* move TCBPool to TCBFreeList */
 120   1              for(i = 0, TCBFreeList = NULL; i<TCP_CONNECTION_MAX_NUM; i++)
 121   1              {
 122   2                      TCBPool[i].pNext = TCBFreeList;
 123   2                      TCBFreeList = &TCBPool[i];
 124   2              }
 125   1      
 126   1              /* move QPool to QFreeList */
 127   1              for(i = 0, QFreeList = NULL; i<TCP_QUEUE_MAX_NUM; i++)
 128   1              {
 129   2                      QPool[i].pNext = QFreeList;
 130   2                      QFreeList = &QPool[i];
 131   2              }
 132   1      
 133   1              TCBList = NULL;
 134   1      }
 135          
 136          
 137          /* tcp check sum. return check sum. TCPSize = TCPDataSize + TCPHeadSize*/
 138          unsigned int TCPCheckSum(struct SIPHead xdata * pIPHead,unsigned int TCPSize) reentrant
 139          {
 140   1              unsigned short sum = 0;
 141   1              unsigned int xdata * p;
 142   1              unsigned char i;
 143   1      
 144   1              /* clac pseudo-header CheckSum. pseudo-header is:
 145   1                 source ip, destination ip, pad 8 bits, protocol, TCP lendth */
 146   1              sum = 0;
 147   1      
 148   1              /* source ip and dest ip */
 149   1              p = (unsigned int xdata *)(&(pIPHead->IPScr));
 150   1              for(i=0; i < sizeof(unsigned short)/sizeof(unsigned int)*2; i++,p++)
 151   1                      sum += *p;
 152   1      
 153   1              /* pad 8 and protocol */
 154   1              sum += pIPHead->Protocol;
 155   1      
 156   1              /* tcp lendth */
 157   1              sum += TCPSize;
 158   1      
 159   1              return CheckSum((unsigned int xdata *)((unsigned char xdata *)pIPHead + IP_HEAD_MIN_LEN),TCPSize,sum);
 160   1      }
 161          
 162          /* this funtion should be called periodically */
 163          void TCPTimer() reentrant
 164          {
 165   1              struct STCB xdata *pTCB;
 166   1      
 167   1              /* go through all tcbs to see if any time out */
 168   1              for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
 169   1              {
 170   2                      /* delayed ack need send now? */
 171   2                      if(pTCB->bNeedAck == TRUE)
 172   2                      {
 173   3                              if(pTCB->DelayAckTimer == 0)
 174   3                              {
 175   4                                      /* send a ack. bNeedAck will set FLASE in TCPOutput*/
 176   4                                      TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
 177   4                              }
 178   3                              else
 179   3                                      pTCB->DelayAckTimer--;
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 4   

 180   3                      }
 181   2      
 182   2                      /* TCP_STATE_LASTACK TCP_STATE_TIMEWAIT state time out? */
 183   2                      if(pTCB->TCPState == TCP_STATE_LASTACK ||
 184   2                              pTCB->TCPState == TCP_STATE_TIMEWAIT)
 185   2                      {
 186   3                              if(pTCB->LastAckTimer == 0)
 187   3                              {
 188   4                                      pTCB->TCPState = TCP_STATE_CLOSED;
 189   4      
 190   4                                      /* release buf queue and call user close */
 191   4                                      TCPRelease(pTCB);
 192   4                                      /* let pTCB->close(); to be call when they send a fin when we at established */
 193   4                              }
 194   3                              else
 195   3                                      pTCB->LastAckTimer--;
 196   3                      }
 197   2      
 198   2                      /* if retransmit timer out? */
 199   2                      if(pTCB->QUnacked != NULL)
 200   2                      {
 201   3                              if(pTCB->RetranTimer == 0)
 202   3                              {
 203   4                                      /* retransmit,pStart set to tcpdata */
 204   4                                      IPOutput(pTCB->QUnacked->MemHead);
 205   4      
 206   4                                      /* timer restart and retransmit times inc */
 207   4                                      if(pTCB->RetranTimes == TCP_RETRAN_MAX_TIME)
 208   4                                      {
 209   5                                              pTCB->TCPState = TCP_STATE_CLOSED;
 210   5      
 211   5                                              /* closed by countpart shut down */
 212   5                                              TCPRelease(pTCB);
 213   5                                      }
 214   4                                      else
 215   4                                      {
 216   5                                              pTCB->RetranTimes++;
 217   5                                              pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
 218   5                                      }
 219   4                              }
 220   3                              else
 221   3                                      pTCB->RetranTimer--;
 222   3                      }
 223   2              }
 224   1      }

⌨️ 快捷键说明

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