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

📄 tcp.c

📁 在ti公司dsp5402上采用8019实现TCP/IP测试功能,已通过测试
💻 C
📖 第 1 页 / 共 2 页
字号:
         *(TxEthnetFrameBuffer+TCP_HEADER_START+13)=SwapWord(0x0101);
         CalcCkSum = CalcCheckSum((TxEthnetFrameBuffer+TCP_HEADER_START),14,1,0);
         if(!CalcCkSum)
              CalcCkSum=0xFFFF;
         *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=CalcCkSum;
         TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+14;
         SendFrame(TxEthnetFrameBuffer,TxFrameSize);
         TCPStatus=TCP_STATE_SYN_RCVD;                                              
    }
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_RST)
         ;
    else
         TCP_Send_Reset();
}

void TCP_Syn_Rec(void)
{
    Uint32 TCPAcceptSeq;
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN))
         TCP_Send_Reset();
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)
    {
         TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
         if((TCPSent_UnAck<=TCPAcceptSeq)&&(TCPAcceptSeq<=TCPSendNextNr))
         {
              TCPSent_UnAck=TCPAcceptSeq;
//------------
//              TCPResendSeqNr=TCPSegNr;
//------------
              TCPStatus=TCP_STATE_ESTABLISHED;
              TCPConnected=1;
         }
    }
}

void TCP_Syn_Sent(void)
{
    Uint16 CalcCkSum,Temp;
    Uint32 TCPAcceptSeq;
    TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
    if((TCPAcceptSeq<=TCPSegNr)||((TCPAcceptSeq>TCPSendNextNr)&&(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)))
    {    
         if(!(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_RST))
         {                                            
              memcpy((TxEthnetFrameBuffer+TCP_HEADER_START+2),(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4),2);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+4)=0;
              *(TxEthnetFrameBuffer+TCP_HEADER_START+6)|=TCP_CODE_RST;
              TCP_Send_Reset();
         }
         else                                         
              Delete_Socket();
    }
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_SYN)
    { 
         TCPIRSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+2)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+3)));
         TCPAckNr=TCPIRSeq+1;                
         if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)
         {
              TCPSent_UnAck=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
//              Process_Resend_Buff();
         }
         if(TCPSent_UnAck>=TCPSegNr)         
         {
              TCPIRSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+2)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+3)));
              TCPAckNr=TCPIRSeq+1;
              DestMaxSegSize=560;            
              if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+10)==0x0204)
              {
                   Temp=*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+11);
                   DestMaxSegSize=(Temp>>8)*256+(Temp&0xFF);
              }
              TCPSegNr=TCPSendNextNr;
//              TCPResendSeqNr=TCPSegNr;              
              Prepare_TCP_Frame(TCP_CODE_ACK);
              TCPStatus=TCP_STATE_ESTABLISHED;
              TCPConnected=1;
         }
         else
         {
              TCPStatus=TCP_STATE_SYN_RCVD;
//Ethnet
              memcpy((TxEthnetFrameBuffer+ETH_HEADER_START),&RecdFrameMAC,3);
              memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+3),&MyMAC,3);
              *(TxEthnetFrameBuffer+ETH_HEADER_START+6)=SwapWord(Frame_IP);
//IP
              *(TxEthnetFrameBuffer+IP_HEADER_START+0)=SwapWord(Ip_Edition);
              *(TxEthnetFrameBuffer+IP_HEADER_START+1)=SwapWord((IP_HEADER_SIZE+TCP_HEADER_SIZE+4)*2);
              *(TxEthnetFrameBuffer+IP_HEADER_START+2)=0;
              *(TxEthnetFrameBuffer+IP_HEADER_START+3)=0;
              *(TxEthnetFrameBuffer+IP_HEADER_START+4)=SwapWord((DEFUALT_TTL<<8)|PROTOCOL_TCP);
              *(TxEthnetFrameBuffer+IP_HEADER_START+5)=0;
              memcpy((TxEthnetFrameBuffer+IP_HEADER_START+6),&MyIP,2);
              memcpy((TxEthnetFrameBuffer+IP_HEADER_START+8),&RecdFrameIP,2);
              CalcCkSum=CalcCheckSum((TxEthnetFrameBuffer+IP_HEADER_START),IP_HEADER_SIZE,0,0);
              if(!CalcCkSum)
                   CalcCkSum=0xFFFF;
              *(TxEthnetFrameBuffer+IP_HEADER_START+5)=CalcCkSum;
//TCP
              *(TxEthnetFrameBuffer+TCP_HEADER_START+0)=SwapWord(MY_TCP_PORT);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+1)=SwapWord(TCPRemotePort);
              WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+2),TCPSendNextNr);
              WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+4),TCPAckNr);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+6)=SwapWord(0x7000|(TCP_CODE_SYN|TCP_CODE_ACK));
              *(TxEthnetFrameBuffer+TCP_HEADER_START+7)=SwapWord(1024);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=0;
              *(TxEthnetFrameBuffer+TCP_HEADER_START+9)=0;
              *(TxEthnetFrameBuffer+TCP_HEADER_START+10)=SwapWord(0x0204);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+11)=SwapWord(MY_MAX_SEG_SIZE);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+12)=SwapWord(0x0101);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+13)=SwapWord(0x0101);
              CalcCkSum = CalcCheckSum((TxEthnetFrameBuffer+TCP_HEADER_START),14,1,0);
              if(!CalcCkSum)
                   CalcCkSum=0xFFFF;
              *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=CalcCkSum;
              TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+14;
              SendFrame(TxEthnetFrameBuffer,TxFrameSize);
         }
    }   
}

void TCP_Established(void)
{
    Uint32 TCPAcceptSeq;
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN))
         Delete_Socket();
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_FIN)      //完成发送
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+0)==TCPRemotePort)
    {
         TCPStatus=TCP_STATE_CLOSE_WAIT;                            //进入关闭状态
         TCPAckNr++;
    }
    if(TCPRxDataLenth>0)
         RxTCPDataSuccess=1;                                        //接收数据成功,可以处理数据了
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)
    {
         TCPConnected=1;
         TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
         if((TCPSent_UnAck<=TCPAcceptSeq)&&(TCPAcceptSeq<=TCPSendNextNr))
         {
              TCPSent_UnAck=TCPAcceptSeq;
//              Process_Resend_Buff();
         }
         if((TCPTxDataLenth>0)||(TCPStatus==TCP_STATE_CLOSE_WAIT))
         {
              TCPSegNr=TCPSendNextNr;
//              TCPResendSeqNr=TCPSegNr;
              TCPSendNextNr+=TCPTxDataLenth;
              Prepare_TCP_Frame(TCP_CODE_ACK|TCP_CODE_PSH);
         }
    }
}

void TCP_Close_Wait(void)
{
    Uint32 TCPAcceptSeq;
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN))
         Delete_Socket();
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)
    {
         TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
         if((TCPSent_UnAck<=TCPAcceptSeq)&&(TCPAcceptSeq<=TCPSendNextNr))
         {
             TCPSent_UnAck=TCPAcceptSeq;
//             Process_Resend_Buff();
             Prepare_TCP_Frame(TCP_CODE_FIN);
             TCPStatus=TCP_STATE_LAST_ACK;
         }
    }
}

void TCP_Last_Ack(void)
{
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN|TCP_CODE_ACK))
         Delete_Socket();
}

void Prepare_TCP_Frame(Uint16 TCPCode)
{
    Uint16 CalcCkSum;
//Ethnet
    memcpy((TxEthnetFrameBuffer+ETH_HEADER_START),&RemoteMAC,3);
    memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+3),&MyMAC,3);
    *(TxEthnetFrameBuffer+ETH_HEADER_START+6)=SwapWord(Frame_IP);
//IP
    *(TxEthnetFrameBuffer+IP_HEADER_START+0)=SwapWord(Ip_Edition);
    *(TxEthnetFrameBuffer+IP_HEADER_START+1)=SwapWord((IP_HEADER_SIZE+TCP_HEADER_SIZE+TCPTxDataLenth)*2);
    *(TxEthnetFrameBuffer+IP_HEADER_START+2)=0;
    *(TxEthnetFrameBuffer+IP_HEADER_START+3)=0;
    *(TxEthnetFrameBuffer+IP_HEADER_START+4)=SwapWord((DEFUALT_TTL<<8)|PROTOCOL_TCP);
    *(TxEthnetFrameBuffer+IP_HEADER_START+5)=0;
    memcpy((TxEthnetFrameBuffer+IP_HEADER_START+6),&MyIP,2);
    memcpy((TxEthnetFrameBuffer+IP_HEADER_START+8),&RemoteIP,2);
    CalcCkSum=CalcCheckSum((TxEthnetFrameBuffer+IP_HEADER_START),IP_HEADER_SIZE,0,0);
    if(!CalcCkSum)
         CalcCkSum=0xFFFF;
    *(TxEthnetFrameBuffer+IP_HEADER_START+5)=CalcCkSum;
//TCP
    *(TxEthnetFrameBuffer+TCP_HEADER_START+0)=SwapWord(MY_TCP_PORT);
    *(TxEthnetFrameBuffer+TCP_HEADER_START+1)=SwapWord(TCPRemotePort);
    WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+2),TCPSegNr);
    WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+4),TCPAckNr);
    *(TxEthnetFrameBuffer+TCP_HEADER_START+6)=SwapWord(0x5000|TCPCode);
    *(TxEthnetFrameBuffer+TCP_HEADER_START+7)=SwapWord(1024);
    *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=0;
    *(TxEthnetFrameBuffer+TCP_HEADER_START+9)=0;
    CalcCkSum = CalcCheckSum((TxEthnetFrameBuffer+TCP_HEADER_START),(TCP_HEADER_SIZE+TCPTxDataLenth),1,0);
    if(!CalcCkSum)
         CalcCkSum=0xFFFF;
    *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=CalcCkSum;
    TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+TCP_HEADER_SIZE+TCPTxDataLenth;
    SendFrame(TxEthnetFrameBuffer,TxFrameSize);
}

void TCPActiveTxData(void)
{
    Uint16 i;
    
    for(i=0;i<10;i++)
         *(TxEthnetFrameBuffer+ETH_HEADER_SIZE+IP_HEADER_SIZE+TCP_HEADER_SIZE+i)=i+0x3030;   
    TCPTxDataLenth=i;
    Prepare_TCP_Frame(TCP_CODE_PSH|TCP_CODE_ACK);
}

void RTL8019ActiveOpen(void)
{
//---------
//    if(!ARPAnswerSuccessFlag)
//         ArpRequest();
//----------      
  
    if((ARPAnswerSuccessFlag)&&(!TCPActiveOpenFlag))
    {
          memcpy(&RemoteMAC,&RecdFrameMAC,3);
          memcpy(&RemoteIP,&RecdFrameIP,2);
          TCPRemotePort=1028;
          TCPActiveOpen();
    }
   
    if(TCPConnected)
    {
          TCPActiveTxData();
          TxSuccessFlag=1;
    }
    if(TxSuccessFlag)
    {
          TCPTxDataLenth=0;
          Prepare_TCP_Frame(TCP_CODE_FIN|TCP_CODE_ACK);
          TCPStatus=TCP_STATE_LAST_ACK;
          TxSuccessFlag=0;    
    }
}



//======================= END ===============================

⌨️ 快捷键说明

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