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

📄 tcp.c

📁 在ti公司dsp5402上采用8019实现TCP/IP测试功能,已通过测试
💻 C
📖 第 1 页 / 共 2 页
字号:
#include    "cpu_reg.h"
#include	"string.h"
#include	"ip.h"
#include	"tcp.h"

Uint16 MyMAC[] = 		//02-E0-4C-A0-7E-7A
{0xE002,0xA04C,0x7A7E};

Uint16 MyIP[] =		//192.168.1.11	
{0xA8C0,0x0B01};

Uint16 RemoteIP[] =	//192.168.1.40
{0xA8C0,0x2801};

Uint16 SubnetMask[] =	//255.255.255.000
{0xFFFF,0x00FF};

Uint16 GatewayIP[] = 	//192.168.1.1
{0xA8C0,0x0101};


//variable

Uint16 RemoteMAC[3];                             // 48 bit MAC
Uint16 RecdFrameMAC[3];
Uint16 RecdFrameIP[2];
Uint16 TCPRemotePort;
Uint32 TCPSegNr;                                 //本次要发送的TCP序号
Uint32 TCPAckNr;                                 //本次收到的TCP确认
Uint32 TCPSendNextNr;                            //下次发送的TCP序号
Uint32 TCPSent_UnAck;                            //我的还未得到确认的TCP序号
Uint32 TCPIRSeq;                                 //我收到的对方的TCP序号
Uint16 TCPTimeout;     
Uint16 TCPConnected;
Uint16 TCPRxDataLenth;
Uint16 TCPTxDataLenth;
//Uint16 TCPResendSeqNr;                           //需要重新发送的TCP序号
Uint16 TCPResendCount;
Uint16 TCPResendNumFlag;
Uint16 RxTCPDataSuccess;
Uint16 TxSuccessFlag;
Uint16 TxFrameSize;
Uint16 TCPStatus;
Uint16 DestMaxSegSize;
Uint16 RecdIpFrameLenth;
Uint16 TCPActiveOpenFlag;
Uint16 ARPAnswerSuccessFlag;

extern  Uint16	TxEthnetFrameBuffer[1518/2];
extern  Uint16	RxEthnetFrameBuffer[1518/2];


/***************TCP*******************/

void TCP_Init(void)
{
    TCPTimeout=0;
    TCPStatus=0;
	TxSuccessFlag=0;
    TCPConnected=0;
    TCPResendNumFlag=0;
    TCPSendNextNr=0x0000;
    TCPActiveOpenFlag=0;
    TCPResendCount=20;
    ARPAnswerSuccessFlag=0;
}

void Delete_Socket(void)
{
    TCPConnected=0;
    TCPStatus=0;
    TCPResendNumFlag=0;
//----------    
    TCPSegNr=TCPSegNr+10;
//    TCPResendSeqNr=TCPSegNr;
//----------
}

void TCPActiveOpen(void)
{
    Uint16 CalcCkSum;
    TCPActiveOpenFlag=1;
    if((TCPStatus==TCP_STATE_CLOSED)||(TCPStatus==TCP_STATE_LISTEN))
    {
         TCPAckNr=0;                            //要发送的TCP确认号
         TCPSegNr=TCPSendNextNr;                //本次发送的TCP序号
//         TCPResendSeqNr=TCPSegNr;               //存储用来重新发送的本次发送的TCP序号
         TCPSent_UnAck=TCPSegNr;                //本次发送之后我还未收到确认的序号
         TCPSendNextNr=TCPSegNr+1;           
         DestMaxSegSize=560;
//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+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),&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(0x7000|TCP_CODE_SYN);
         *(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);
         TCPStatus=TCP_STATE_SYN_SENT;
    }
}

void TCP_Send_Reset(void)
{
    *(TxEthnetFrameBuffer+TCP_HEADER_START+7)=0;
    Prepare_TCP_Frame(0);
}
/*
void Resend_Packet(void)
{
    Prepare_TCP_Frame(TCP_CODE_SYN);
    TCPResendCount=20;
}
*/
void Process_Resend_Buff(void)
{
    if(TCPResendCount>0)
         TCPResendCount--;                //防止TCP死锁
//    if(TCPResendSeqNr<TCPSent_UnAck)
//         TCPResendNumFlag=0;
    if(!TCPResendCount)
    {
         TCPResendNumFlag++;
         if(TCPResendNumFlag==TCP_MAX_RE_TXDNUM)
              Delete_Socket();            //重传8次不成功,删除socket
         else
              SendFrame(TxEthnetFrameBuffer,TxFrameSize);          //每200ms重传一次
    }
}

void Process_TCP_Timeout(void)
{
    TCPTimeout=0;                         //超时标志清零
    Process_Resend_Buff();
    if((TCPStatus==TCP_STATE_ESTABLISHED)||(TCPStatus==TCP_STATE_CLOSE_WAIT))
    {
         TCPSendNextNr+=TCPTxDataLenth;
         Prepare_TCP_Frame(TCP_CODE_ACK|TCP_CODE_PSH);
    }
    if(TCPStatus==TCP_STATE_TIME_WAIT)
         Delete_Socket();
    if(TCPStatus==TCP_STATE_CLOSE_WAIT)
    {
         TCPTxDataLenth=0;
         Prepare_TCP_Frame(TCP_CODE_FIN|TCP_CODE_ACK);
         TCPStatus=TCP_STATE_LAST_ACK;    
    }
}

void Process_TCP_Frame(void)
{
    Uint16 TCPOptionLenth;
    
    TCPTimeout=0;
    TCPResendCount=20;
    TCPResendNumFlag=0;
    CopyFrameFromBE(RTL8019_HEADER_SIZE+TCP_HEADER_START,10);
    TCPOptionLenth=(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)>>12)*2-10;
    if(TCPOptionLenth)    
         CopyFrameFromBE((RTL8019_HEADER_SIZE+TCP_HEADER_START+TCP_HEADER_SIZE),TCPOptionLenth);
    TCPRxDataLenth=RecdIpFrameLenth-IP_HEADER_SIZE-TCP_HEADER_SIZE-TCPOptionLenth;
    TCPRemotePort=*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START);
    if((MyIP[0] == *(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+IP_HEADER_START+8))&&(MyIP[1] == *(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+IP_HEADER_START+9)))   
    {
         if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+1)==MY_TCP_PORT)
         {
               switch(TCPStatus)
               {
                    case 0: TCP_Listen();
          			        break;
 		            case 1: TCP_Syn_Rec();
           			        break;
		            case 2: TCP_Syn_Sent();
           			        break;
		            case 3: TCP_Established();
           			        break;
 		            case 7: TCP_Close_Wait();
           			        break;
 		            case 8: TCP_Last_Ack();             //关闭
           			        break;
              }
         }     
    }
}

void TCP_Listen(void)
{
    Uint16 Temp,CalcCkSum;
    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; 
         TCPSegNr=TCPSendNextNr;
         TCPSent_UnAck=TCPSegNr;
         TCPSendNextNr=TCPSegNr+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);
         }
//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),TCPSegNr);
         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);

⌨️ 快捷键说明

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