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