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

📄 tcpip.i

📁 msp430 cs8900a msp430 servermsp430 servermsp430 servermsp430 servermsp430 server
💻 I
📖 第 1 页 / 共 4 页
字号:
    TCPStartRetryTimer();
    SocketStatus = (0x01);                  
  }
}




void TCPClose(void)
{
  switch (TCPStateMachine)
  {
    case LISTENING :
    case SYN_SENT :
      TCPStateMachine = CLOSED;
      TCPFlags = 0;
      SocketStatus = 0;
      break;
    case SYN_RECD :
    case ESTABLISHED :
      TCPFlags |= (0x10);
      break;
  }
}






void TCPReleaseRxBuffer(void)
{
  SocketStatus &= ~(0x04);
}






void TCPTransmitTxBuffer(void)
{
  if ((TCPStateMachine == ESTABLISHED) || (TCPStateMachine == CLOSE_WAIT))
    if (SocketStatus & (0x08))
    {
      SocketStatus &= ~(0x08);               
      TCPUNASeqNr += TCPTxDataCount;                       
      
      TxFrame1Size = 14 + 20 + 20 + TCPTxDataCount;
      TransmitControl |= (0x01);
      
      LastFrameSent = TCP_DATA_FRAME;
      TCPStartRetryTimer();
    }
}





void DoNetworkStuff(void)
{
  unsigned int ActRxEvent;                       

  Write8900((0x000a), (0x0124));               
  ActRxEvent = Read8900((0x000c));              

  if (ActRxEvent & (0x0100))
  {
    if (ActRxEvent & (0x0400)) ProcessEthIAFrame();
    if (ActRxEvent & (0x0800)) ProcessEthBroadcastFrame();
  }

  if (TCPFlags & (0x04))
    if (TCPFlags & (0x08))
    {
      if (TCPTimer > 8)
      {
        TCPRestartTimer();                       

        if (RetryCounter)
        {
          TCPHandleRetransmission();             
          RetryCounter--;
        }
        else
        {
          TCPStopTimer();
          TCPHandleTimeout();
        }
      }
    }
    else if (TCPTimer > 2)
    {
      TCPStateMachine = CLOSED;
      TCPFlags = 0;                              
      SocketStatus &= (0x04);       
    }

  switch (TCPStateMachine)
  {
    case CLOSED :
    case LISTENING :
      if (TCPFlags & (0x01))            
        if (TCPFlags & (0x02))         
          if (!(TransmitControl & (0x02)))  
          {
            TCPSeqNr = ((unsigned long)ISNGenHigh << 16) | TAR; 
            TCPUNASeqNr = TCPSeqNr;
            TCPAckNr = 0;                                       
            TCPUNASeqNr++;                                      
            PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002)); 
            LastFrameSent = TCP_SYN_FRAME;
            TCPStartRetryTimer();                               
            TCPStateMachine = SYN_SENT;
          }
      break;
    case SYN_RECD :
    case ESTABLISHED :
      if (TCPFlags & (0x10))                  
        if (!(TransmitControl & ((0x02) | (0x01))))   
          if (TCPSeqNr == TCPUNASeqNr)                          
          {
            TCPUNASeqNr++;
            PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0001) | (0x0010));
            LastFrameSent = TCP_FIN_FRAME;
            TCPStartRetryTimer();
            TCPStateMachine = FIN_WAIT_1;
          }
      break;
    case CLOSE_WAIT :
      if (!(TransmitControl & ((0x02) | (0x01))))     
        if (TCPSeqNr == TCPUNASeqNr)                            
        {
          TCPUNASeqNr++;                                        
          PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0001) | (0x0010));  
          LastFrameSent = TCP_FIN_FRAME;                        
          TCPStartRetryTimer();
          TCPStateMachine = LAST_ACK;
        }
      break;
  }

  if (TransmitControl & (0x02))
  {
    RequestSend(TxFrame2Size);

    if (Rdy4Tx())                                
    {                                            
      CopyToFrame8900((unsigned char *)TxFrame2Mem, TxFrame2Size);
    }
    else
    {
      TCPStateMachine = CLOSED;
      SocketStatus = (0x50);          
      TCPFlags = 0;                              
    }

    TransmitControl &= ~(0x02);             
  }

  if (TransmitControl & (0x01))
  {
    PrepareTCP_DATA_FRAME();                     
    RequestSend(TxFrame1Size);
  
    if (Rdy4Tx())                                
    {                                            
      CopyToFrame8900((unsigned char *)TxFrame1Mem, TxFrame1Size);
    }
    else
    {
      TCPStateMachine = CLOSED;
      SocketStatus = (0x50);          
      TCPFlags = 0;                              
    }

    TransmitControl &= ~(0x01);             
  }
}




static void ProcessEthBroadcastFrame(void)
{
  unsigned int TargetIP[2];

  
  ReadHB1ST8900((0x0000));                  
  RecdFrameLength = ReadHB1ST8900((0x0000));
    
  DummyReadFrame8900(6);                         
  CopyFromFrame8900(&RecdFrameMAC, 6);           

  if (ReadFrameBE8900() == (0x0806))            
    if (ReadFrameBE8900() == 1)        
      if (ReadFrameBE8900() == (0x0800))         
        if (ReadFrameBE8900() == (0x0604))   
          if (ReadFrameBE8900() == 1)
          {
            DummyReadFrame8900(6);               
            CopyFromFrame8900(&RecdFrameIP, 4);  
            DummyReadFrame8900(6);               
            CopyFromFrame8900(&TargetIP, 4);     
            if ((MyIP[0] == TargetIP[0]) && (MyIP[1] == TargetIP[1]))  
              PrepareARP_ANSWER();               
          }
}





static void ProcessEthIAFrame(void)
{
  unsigned int TargetIP[2];
  unsigned char ProtocolType;

  
  ReadHB1ST8900((0x0000));                  
  RecdFrameLength = ReadHB1ST8900((0x0000));
  
  DummyReadFrame8900(6);                         
  CopyFromFrame8900(&RecdFrameMAC, 6);           

  switch (ReadFrameBE8900())                     
  {
    case (0x0806) :                             
      if ((TCPFlags & ((0x01) | (0x02))) == (0x01))
        if (ReadFrameBE8900() == 1)         
          if (ReadFrameBE8900() == (0x0800))
            if (ReadFrameBE8900() == (0x0604))
              if (ReadFrameBE8900() == 2)
              {
                TCPStopTimer();                       
                CopyFromFrame8900(&RemoteMAC, 6);     
                TCPFlags |= (0x02);
              }
      break;
    case (0x0800) :                                        
      if ((ReadFrameBE8900() & 0xff00 ) == (0x4500))     
      {                                                    
        RecdIPFrameLength = ReadFrameBE8900();             
        ReadFrameBE8900();                                 

        if (!(ReadFrameBE8900() & ((0x2000) | (0x1fff))))  
        {
          ProtocolType = ReadFrameBE8900();                
          ReadFrameBE8900();                               
          RecdFrameIP[0] = ReadFrame8900();                
          RecdFrameIP[1] = ReadFrame8900();
          TargetIP[0] = ReadFrame8900();                   
          TargetIP[1] = ReadFrame8900();

          if ((MyIP[0] == TargetIP[0]) && (MyIP[1] == TargetIP[1]))  
            switch (ProtocolType)
            {
              case 1 :
                ProcessICMPFrame();
                break;
              case 6 :
                ProcessTCPFrame();
                break;
              case 17 :                              
                break;
            }
        }      
      break;
    }
  }
}





static void ProcessICMPFrame(void)
{
  unsigned int ICMPTypeAndCode;

  ICMPTypeAndCode = ReadFrameBE8900();           
  ReadFrameBE8900();                             

  switch (ICMPTypeAndCode >> 8)                  
  {
    case 8 :                             
      PrepareICMP_ECHO_REPLY();                  
      break;
  }
}





static void ProcessTCPFrame(void)
{
  unsigned int TCPSegSourcePort;                 
  unsigned int TCPSegDestPort;                   
  unsigned long TCPSegSeq;                       
  unsigned long TCPSegAck;                       
  unsigned int TCPCode;                          
  unsigned char TCPHeaderSize;                   
  unsigned int NrOfDataBytes;                    
    
  TCPSegSourcePort = ReadFrameBE8900();                    
  TCPSegDestPort = ReadFrameBE8900();

  if (TCPSegDestPort != TCPLocalPort) return;              

  TCPSegSeq = (unsigned long)ReadFrameBE8900() << 16;      
  TCPSegSeq |= ReadFrameBE8900();

  TCPSegAck = (unsigned long)ReadFrameBE8900() << 16;      
  TCPSegAck |= ReadFrameBE8900();

  TCPCode = ReadFrameBE8900();                             

  TCPHeaderSize = (TCPCode & (0xf000)) >> 10;         
  NrOfDataBytes = RecdIPFrameLength - 20 - TCPHeaderSize;     

  if (NrOfDataBytes > 536) return;        

  if (TCPHeaderSize > 20)                     
    DummyReadFrame8900(TCPHeaderSize - 20);

  switch (TCPStateMachine)                                 
  {                                                        
    case CLOSED :
      if (!(TCPCode & (0x0004)))
      {
        TCPRemotePort = TCPSegSourcePort;                  
        
        RemoteMAC[0] = RecdFrameMAC[0];                    
        RemoteMAC[1] = RecdFrameMAC[1];                    
        RemoteMAC[2] = RecdFrameMAC[2];
        RemoteIP[0] = RecdFrameIP[0];
        RemoteIP[1] = RecdFrameIP[1];
        
        if (TCPCode & (0x0010))                        
        {                                                  
          PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));    
        }
        else
        {
          TCPAckNr = TCPSegSeq + NrOfDataBytes;
          if (TCPCode & ((0x0002) | (0x0001))) TCPAckNr++;
          PrepareTCP_FRAME(0, TCPAckNr, (0x0004) | (0x0010));
        }
      }
      break;
    case LISTENING :
      if (!(TCPCode & (0x0004)))                       
      {
        TCPRemotePort = TCPSegSourcePort;                  

        RemoteMAC[0] = RecdFrameMAC[0];                    
        RemoteMAC[1] = RecdFrameMAC[1];                    
        RemoteMAC[2] = RecdFrameMAC[2];
        RemoteIP[0] = RecdFrameIP[0];
        RemoteIP[1] = RecdFrameIP[1];

        if (TCPCode & (0x0010))                        
        {                                                  
          PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));
        }
        else if (TCPCode & (0x0002))
        {
          
          TCPAckNr = TCPSegSeq + 1;                           
          TCPSeqNr = ((unsigned long)ISNGenHigh << 16) | TAR; 
          TCPUNASeqNr = TCPSeqNr + 1;                         
          PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002) | (0x0010)); 
          LastFrameSent = TCP_SYN_ACK_FRAME;
          TCPStartRetryTimer();
          TCPStateMachine = SYN_RECD;
        }
      }
      break;
    case SYN_SENT :
      
      if ((RemoteIP[0] != RecdFrameIP[0]) || (RemoteIP[1] != RecdFrameIP[1]))
        break;      

      
      if (TCPSegSourcePort != TCPRemotePort)
        break;   
      
      if (TCPCode & (0x0010))                
        if (TCPSegAck != TCPUNASeqNr)            
        {
          if (!(TCPCode & (0x0004)))
          {
            PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));
          }
          break;                                 
        }

      if (TCPCode & (0x0004))                
      {
        if (TCPCode & (0x0010))              
        {                                        
          TCPStateMachine = CLOSED;
          TCPFlags = 0;                          
          SocketStatus = (0x30);
        }
        break;                                   
      }
        
      if (TCPCode & (0x0002))                
      {
        TCPAckNr = TCPSegSeq;                    
        TCPAckNr++;                              

        if (TCPCode & (0x0010))
        {
          TCPStopTimer();                        
          TCPSeqNr = TCPUNASeqNr;                

          PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0010));        
          TCPStateMachine = ESTABLISHED;
          SocketStatus |= (0x02);
          SocketStatus |= (0x08);  
        }
        else
        {
          TCPStopTimer();
          PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002) | (0x0010));   
          LastFrameSent = TCP_SYN_ACK_FRAME;               
          TCPStartRetryTimer();                            
          TCPStateMachine = SYN_RECD;
        }
      }
      break;
    default :
      
      if ((RemoteIP[0] != RecdFrameIP[0]) || (RemoteIP[1] != RecdFrameIP[1]))
        break;      

      
      if (TCPSegSourcePort != TCPRemotePort)
        break;     

      
      if ((TCPSegSeq < TCPAckNr) || (TCPSegSeq >= TCPAckNr + 536))
        break;
            
      if (TCPCode & (0x0004))                
      {
        TCPStateMachine = CLOSED;                
        TCPFlags = 0;                            
        SocketStatus = (0x30);      
        break;
      }

      if (TCPCode & (0x0002))                
      {
        PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));  
        TCPStateMachine = CLOSED;                
        TCPFlags = 0;                            
        SocketStatus = (0x40);          
        break;                                   
      }

      if (TCPSegSeq != TCPAckNr)                 
      {                                          
        PrepareTCP_FRAME(TCPUNASeqNr, TCPAckNr, (0x0010));

⌨️ 快捷键说明

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