📄 tcp.c
字号:
#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 + -