www.pudn.com > TCPIP.rar > TCP.c
#include "cpu_reg.h"
#include "string.h"
#include "ip.h"
#include "tcp.h"
const Uint16 MyMAC[] = //02-E0-4C-A0-7E-7A
{0xE002,0xA04C,0x7A7E};
const Uint16 MyIP[] = //192.168.1.11
{0xA8C0,0x0B01};
const Uint16 RemoteIP[] = //192.168.1.40
{0xA8C0,0x2801};
const Uint16 SubnetMask[] = //255.255.255.000
{0xFFFF,0x00FF};
const 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>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);
*(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 ===============================