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 ===============================