📄 ip.c
字号:
}
//=======================================中止DMA操作
Reg0b=0x00; //
delay(1);
Reg0a=0x00; //
delay(1);
Reg00=0x22; //结束或放弃DMA操作
delay(1);
//=======================================
d.total = RxEthnetFrameBuffer[0];
length = RxEthnetFrameBuffer[1];
if(((d.e.low & 0x01)==0)||(d.e.high > 0x7f) || (d.e.high < 0x4c)||( length > 1517))
{//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1500字节
page(1);
delay(10);
curr=Reg07; //page1
page(0); //切换回page0
delay(10);
bnry = curr -1;
if(bnry < 0x4c) bnry =0x7f;
Reg03=bnry; //write to bnry
delay(1);
Reg07=0xff;
return(0);
}
//=============================================
else//表示数据包是完好的.读取剩下的数据
{
Temp = SwapByte(RxEthnetFrameBuffer[8]);
if((Temp == Frame_IP)||(Temp == Frame_ARP))
{ //协议为IP或ARP才接收
Reg09 = bnry; //read page address high
delay(1);
Reg08 = 4; //read page address low
delay(1);
Reg0b = length>>8; //read count high
delay(1);
Reg0a = length & 0xff;//read count low;
delay(1);
Reg00=0x0a; //read dma
delay(1);
length=(length+1)/2;
for(ii=2;ii<length+2;ii++)
{
RxEthnetFrameBuffer[ii]=Reg10;
}
//================终止DMA操作
Reg0b=0x00; //read count high
delay(1);
Reg0a=0x00; //read count low;
delay(1);
Reg00=0x22; //结束或放弃DMA
delay(1);
//============================
}
//=========================================
d.total = RxEthnetFrameBuffer[0];
bnry = d.e.high - 1;
if(bnry<0x4c) bnry=0x7f;
page(0);
delay(10);
Reg03=bnry; //write to bnry
delay(1);
Reg07=0xff;
RxSuccessFlag=1;
return(1); //have new packet
}
}
else
return(0);
}
Uint16 SwapWord(Uint16 Data)
{
return((Data>>8)|(Data<<8));
}
void WriteDWord(Uint16 *Address,Uint32 Data)
{
Uint16 Temp;
Temp=(Uint16)(Data>>16);
*Address=SwapWord(Temp);
Temp=(Uint16)(Data&0x0000FFFF);
*(Address+1)=SwapWord(Temp);
}
void CopyFrameFromBE(Uint16 Offset,Uint16 Size)
{
Uint16 i,Temp;
for(i=0;i<Size;i++)
{
Temp=*(RxEthnetFrameBuffer+Offset+i);
*(RxEthnetFrameBuffer+Offset+i)=SwapWord(Temp);
}
}
//============================================================
//======================== ARP ================================
void ArpRequest(void)
{
*(TxEthnetFrameBuffer + ETH_HEADER_START +0) = 0xFFFF;
*(TxEthnetFrameBuffer + ETH_HEADER_START +1) = 0xFFFF;
*(TxEthnetFrameBuffer + ETH_HEADER_START +2) = 0xFFFF;
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+3),&MyMAC,3);
*(TxEthnetFrameBuffer+ETH_HEADER_START+6)=SwapWord(Frame_ARP);
//ARP
*(TxEthnetFrameBuffer+ARP_HEADER_START+0)=SwapWord(HARDW_ETH);
*(TxEthnetFrameBuffer+ARP_HEADER_START+1)=SwapWord(Frame_IP);
*(TxEthnetFrameBuffer+ARP_HEADER_START+2)=SwapWord(IP_HLEN_PLEN);
*(TxEthnetFrameBuffer+ARP_HEADER_START+3)=SwapWord(OP_ARP_REQUEST);
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+4),&MyMAC,3);
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+7),&MyIP,2);
*(TxEthnetFrameBuffer + ARP_HEADER_START + 9) = 0;
*(TxEthnetFrameBuffer + ARP_HEADER_START + 10) = 0;
*(TxEthnetFrameBuffer + ARP_HEADER_START + 11) = 0;
if(((RemoteIP[0]^MyIP[0])&SubnetMask[0])||((RemoteIP[1]^MyIP[1])&SubnetMask[1]))
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+12),&GatewayIP,2);
else
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+12),&RemoteIP,2);
TxFrameSize=ETH_HEADER_SIZE+ARP_FRAME_SIZE;
SendFrame(TxEthnetFrameBuffer,TxFrameSize);
}
void ArpAnswer(void)
{
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+0),&RecdFrameMAC,3);
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+3),&MyMAC,3);
*(TxEthnetFrameBuffer+ETH_HEADER_START+6)=SwapWord(Frame_ARP);
//ARP
*(TxEthnetFrameBuffer+ARP_HEADER_START+0)=SwapWord(HARDW_ETH);
*(TxEthnetFrameBuffer+ARP_HEADER_START+1)=SwapWord(Frame_IP);
*(TxEthnetFrameBuffer+ARP_HEADER_START+2)=SwapWord(IP_HLEN_PLEN);
*(TxEthnetFrameBuffer+ARP_HEADER_START+3)=SwapWord(OP_ARP_ANSWER);
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+4),&MyMAC,3);
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+7),&MyIP,2);
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+9),&RecdFrameMAC,3);
memcpy((TxEthnetFrameBuffer+ARP_HEADER_START+12),&RecdFrameIP,2);
TxFrameSize=ETH_HEADER_SIZE+ARP_FRAME_SIZE;
SendFrame(TxEthnetFrameBuffer,TxFrameSize);
}
//==============================================================
//===========================ICMP================================
void Process_ICMP_Frame(void)
{
Uint16 ICMPTypeAndCode;
CopyFrameFromBE(RTL8019_HEADER_SIZE+ICMP_HEADER_START,2);
ICMPTypeAndCode=*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+ICMP_HEADER_START);
switch(ICMPTypeAndCode>>8)
{
case ICMP_ECHO: Prepare_ICMP_Answer();
break;
}
}
void Prepare_ICMP_Answer(void)
{
Uint16 ICMPDataCount;
Uint16 CalcCkSum;
ICMPDataCount=RecdIpFrameLenth-IP_HEADER_SIZE - ICMP_HEADER_SIZE;
//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(RecdIpFrameLenth*2);
*(TxEthnetFrameBuffer+IP_HEADER_START+2)=SwapWord(0);
*(TxEthnetFrameBuffer+IP_HEADER_START+3)=SwapWord(0);
*(TxEthnetFrameBuffer+IP_HEADER_START+4)=SwapWord((DEFUALT_TTL<<8)|PROTOCOL_ICMP);
*(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;
//ICMP
*(TxEthnetFrameBuffer+ICMP_HEADER_START+0)=SwapWord(ICMP_ECHO_REPLY<<8);
*(TxEthnetFrameBuffer+ICMP_HEADER_START+1)=0;
// CopyFrameFrom8900(ICMP_HEADER_START+2,ICMPDataCount);
memcpy((TxEthnetFrameBuffer+ICMP_HEADER_START+2),(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+ICMP_HEADER_START+2),ICMPDataCount);
CalcCkSum=CalcCheckSum((TxEthnetFrameBuffer+ICMP_HEADER_START),(ICMPDataCount+ICMP_HEADER_SIZE),0,0);
if(!CalcCkSum)
CalcCkSum=0xFFFF;
*(TxEthnetFrameBuffer+ICMP_HEADER_START+1)=CalcCkSum;
TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+ICMP_HEADER_SIZE+ICMPDataCount;
SendFrame(TxEthnetFrameBuffer,TxFrameSize);
}
/***************UDP*******************/
void Process_UDP_Frame(void)
{
Uint16 UdpLenth;
CopyFrameFromBE(RTL8019_HEADER_SIZE+UDP_HEADER_START,4);
if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+UDP_HEADER_START+1)==MY_UDP_PORT)
{
UdpLenth=*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+UDP_HEADER_START+2)/2;
UDPUserDataLenth=UdpLenth-UDP_HEADER_SIZE;
}
}
void Prepare_UDP_Frame(Uint16 RemoteUdpPort,Uint16 TxUDPDataNum)
{
Uint16 CalcCkSum;
//ETHNET
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+0),&RemoteMAC,3);
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+2),&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(TxUDPDataNum+IP_HEADER_SIZE+UDP_HEADER_SIZE);
*(TxEthnetFrameBuffer+IP_HEADER_START+2)=SwapWord(0x0000);
*(TxEthnetFrameBuffer+IP_HEADER_START+3)=SwapWord(0x0000);
*(TxEthnetFrameBuffer+IP_HEADER_START+4)=SwapWord((DEFUALT_TTL<<8)|PROTOCOL_UDP);
*(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;
//UDP
*(TxEthnetFrameBuffer+UDP_HEADER_START+0)=SwapWord(MY_UDP_PORT);
*(TxEthnetFrameBuffer+UDP_HEADER_START+1)=SwapWord(RemoteUdpPort);
*(TxEthnetFrameBuffer+UDP_HEADER_START+2)=SwapWord(TxUDPDataNum+UDP_HEADER_SIZE);
*(TxEthnetFrameBuffer+UDP_HEADER_START+3)=0;
CalcCkSum=CalcCheckSum((TxEthnetFrameBuffer+UDP_HEADER_START),(TxUDPDataNum+UDP_HEADER_SIZE),0,1);
if(!CalcCkSum)
CalcCkSum=0xFFFF;
*(TxEthnetFrameBuffer+UDP_HEADER_START+3)=CalcCkSum;
TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+UDP_HEADER_SIZE+TxUDPDataNum;
SendFrame(TxEthnetFrameBuffer,TxFrameSize);
}
/***************TCP/IP*****************/
void ProcessEthBroadcastFrame(void)
{
Uint16 TargetIP[2],FrameLenth;
FrameLenth=5;
CopyFrameFromBE(RTL8019_HEADER_SIZE+6,FrameLenth);
memcpy(&RecdFrameMAC,(RxEthnetFrameBuffer+ETH_HEADER_START+RTL8019_HEADER_SIZE+3),3);
if(*(RxEthnetFrameBuffer+ETH_HEADER_START+RTL8019_HEADER_SIZE+6)==Frame_ARP)
{
if(*(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE)==HARDW_ETH)
{
if(*(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+1)==Frame_IP)
{
if(*(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+2)==IP_HLEN_PLEN)
{
if(*(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+3)==OP_ARP_REQUEST)
{
memcpy(&RecdFrameIP,(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+7),2);
memcpy(&TargetIP,(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+12),2);
if((MyIP[0]==TargetIP[0]) && (MyIP[1]==TargetIP[1]))
ArpAnswer();
}
}
}
}
}
}
void ProcessEthIAFrame(void)
{
Uint16 FrameType,IpHeaderLenth,ProtocolType;
CopyFrameFromBE(RTL8019_HEADER_SIZE+6,1);
memcpy(&RecdFrameMAC,(RxEthnetFrameBuffer+ETH_HEADER_START+RTL8019_HEADER_SIZE+3),3);
FrameType=*(RxEthnetFrameBuffer+ETH_HEADER_START+RTL8019_HEADER_SIZE+6);
switch(FrameType)
{
case Frame_ARP:
{
CopyFrameFromBE(ARP_HEADER_START+RTL8019_HEADER_SIZE+0,4);
if(*(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+2)==IP_HLEN_PLEN)
{
if(*(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+3)==OP_ARP_ANSWER)
{
memcpy(&RecdFrameMAC,(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+4),3);
memcpy(&RecdFrameIP,(RxEthnetFrameBuffer+ARP_HEADER_START+RTL8019_HEADER_SIZE+7),2);
ARPAnswerSuccessFlag=1;
}
}
}
break;
case Frame_IP:
{
CopyFrameFromBE(IP_HEADER_START+RTL8019_HEADER_SIZE+0,1);
IpHeaderLenth=*(RxEthnetFrameBuffer+IP_HEADER_START+RTL8019_HEADER_SIZE);
if((IpHeaderLenth&0xFF00)==Ip_Edition)
{
IpHeaderLenth=5*(32/8)/2;
CopyFrameFromBE(IP_HEADER_START+RTL8019_HEADER_SIZE+1,IpHeaderLenth-1-4);
RecdIpFrameLenth=*(RxEthnetFrameBuffer+IP_HEADER_START+RTL8019_HEADER_SIZE+1)/2;
ProtocolType=*(RxEthnetFrameBuffer+IP_HEADER_START+RTL8019_HEADER_SIZE+4)&0x00FF;
memcpy(&RecdFrameIP,(RxEthnetFrameBuffer+IP_HEADER_START+RTL8019_HEADER_SIZE+6),2);
switch(ProtocolType)
{
case PROTOCOL_ICMP: Process_ICMP_Frame();
break;
case PROTOCOL_TCP : Process_TCP_Frame();
break;
case PROTOCOL_UDP : Process_UDP_Frame();
break;
}
}
}
default: break;
}
}
void DoNetworkStuff()
{
Uint16 Temp;
page(0);
Temp=Reg0c;
Temp&=0x20;
if(Temp)
ProcessEthBroadcastFrame();
else
ProcessEthIAFrame();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -