www.pudn.com > ARM_RTL8019.rar > IP.C
#define IP_GLOBALS
#include "Config.h"
#include "cfg_net.h"
/*
OS_EVENT *RecIcmpQFlag;
OS_EVENT *RecTcpQFlag;
OS_EVENT *RecUdpQFlag;
OS_EVENT *SendFlag; */
Rec_Ptr RECQ[MAX_REC_BUFF];
void *RecIcmpQ[Q_Max_Size];
void *RecUdpQ[Q_Max_Size];
void *RecTcpQ[Q_Max_Size];
/**********************************************************************
**º¯ÊýÔÐÍ£º void CreateIpHeadCrc()
**Èë¿Ú²ÎÊý:*ip ipÊý¾Ý°üÊײ¿Ö¸Õë
**³ö¿Ú²ÎÊý: ÎÞ
**·µ »Ø Öµ£º crc £º 16λµÄУÑéºÍ
**˵ Ã÷£º ²úÉúIPÊײ¿µÄУÑéºÍ
************************************************************************/
uint16 CreateIpHeadCrc(uint8 * Ip)
{
union w CrcTemp;
uint8 i;
CrcTemp.dwords = 0;
for(i=0;i<10;i++) //IPÊײ¿¹²20×Ö½Ú
{
CrcTemp.dwords = CrcTemp.dwords + ((uint32)Ip[2*i]<<8)+(uint32)Ip[2*i+1];
}
while(CrcTemp.words.high>0)
{
CrcTemp.dwords = (uint32)(CrcTemp.words.high + CrcTemp.words.low);
}
CrcTemp.words.low = 0xffff - CrcTemp.words.low; //È¡·´
return(CrcTemp.words.low);
}
/**********************************************************************
**º¯ÊýÔÐÍ£º uint8 Send_Ip_To_LLC(struct _pkst *TxdData,unsigned char * de_ip)
**Èë¿Ú²ÎÊý:º *TxdData : ·¢ËͽṹָÕë
** * de_ip : IPµØÖ·Ö¸Õë
**³ö¿Ú²ÎÊý: unsigned char
**·µ »Ø Öµ£º 1 :OK
0 :FAIL
**˵ Ã÷£º ΪIPÊý¾Ý°üµÄÄ¿±êIP²éÕÒMACµØÖ·£¬²¢·¢ËÍ¡£
************************************************************************/
uint8 Send_Ip_To_LLC(struct _pkst *TxdData,uint8 * de_ip,uint8 num)
{
uint8 i;
//Èç¹ûÄ¿±êµØÖ·ÔÚ±¾ip¶Î
if((de_ip[0]&NetPort[num].My_Ip_Mark[0])==(NetPort[num].My_Ip[0]&NetPort[num].My_Ip_Mark[0]))
if((de_ip[1]&NetPort[num].My_Ip_Mark[1])==(NetPort[num].My_Ip[1]&NetPort[num].My_Ip_Mark[1]))
if((de_ip[2]&NetPort[num].My_Ip_Mark[2])==(NetPort[num].My_Ip[2]&NetPort[num].My_Ip_Mark[2]))
if((de_ip[3]&NetPort[num].My_Ip_Mark[3])==(NetPort[num].My_Ip[3]&NetPort[num].My_Ip_Mark[3]))
{
i=0;//²éÕÒÒ»´ÎMAC±í¡£
do
{
if(NetPort[num].ARP_TERM[i].IP_NUM[2]==((IP_NUMBER*)de_ip)->IP[2])
if(NetPort[num].ARP_TERM[i].IP_NUM[3]==((IP_NUMBER*)de_ip)->IP[3])//Èç¹ûARP±íµÄ×îºóÁ½¸öÊýÏàµÈ¶øÇÒTTL>0±íʾ£¬ÓжÔÓ¦µÄMAC
if(NetPort[num].ARP_TERM[i].TTL>0)
{
NetPort[num].ARP_TERM[i].TTL=100;//·¢ËÍ
Send_ethernet_Frame(TxdData,NetPort[num].ARP_TERM[i].MAC_NUM,IP_PACKED,num);
return(1);
}
i++;
}
while(i=MAX_NET_PORT)
return (0xff);
IpHead.e_ip.VerandIphLen=0x45; //IP°æ±¾ºÍÍ·³¤¶È
IpHeadUint8[0]=0x45;
IpHead.e_ip.ServerType=0x00; //·þÎñÀàÐÍΪ0
IpHeadUint8[1]=0x00;//·þÎñÀàÐÍ
IpHead.e_ip.TotalLen=(*TxdData).length+20; //IPÊý¾Ý±¨×ܳ¤¶È
IpHeadUint8[2]=(IpHead.e_ip.TotalLen&0xff00)>>8;//IPÊý¾Ý±¨×ܳ¤¶È¸ß×Ö½Ú
IpHeadUint8[3]=IpHead.e_ip.TotalLen&0x00ff;//IPÊý¾Ý±¨×ܳ¤¶ÈµÍ×Ö½Ú
IpHead.e_ip.FrameIndex=FrameIndex+1;
IpHeadUint8[4]=(FrameIndex&0xff00)>>8;//IPÊý¾Ý±¨±êʶ¸ß×Ö½Ú
IpHeadUint8[5]=FrameIndex&0x00ff;//IPÊý¾Ý±¨±êʶµÍ×Ö½Ú
FrameIndex++;
IpHeadUint8[6]=0x40;//IPÊý¾Ý±¨±êÖ¾¼°·Ö¶ÎÆ«ÒÆÁ¿
IpHeadUint8[7]=0x00;//IPÊý¾Ý±¨±êÖ¾¼°·Ö¶ÎÆ«ÒÆÁ¿
IpHead.e_ip.ttl=0x80; //128; //TTL
IpHeadUint8[8]=0x80;//ttl
IpHead.e_ip.NextProtocal=PROTOCOL; //ϲãÐÒé
IpHeadUint8[9]=PROTOCOL;
IpHead.e_ip.Crc=0;
IpHeadUint8[10]=0;//CRC h
IpHeadUint8[11]=0;//CRC l
IpHead.e_ip.SourceIp[0]=NetPort[num].My_Ip[0]; //Ìî³äÔ´IPµØÖ·
IpHead.e_ip.SourceIp[1]=NetPort[num].My_Ip[1];
IpHead.e_ip.SourceIp[2]=NetPort[num].My_Ip[2];
IpHead.e_ip.SourceIp[3]=NetPort[num].My_Ip[3];
IpHeadUint8[12]=NetPort[num].My_Ip[0]; //Ìî³äÔ´IPµØÖ·
IpHeadUint8[13]=NetPort[num].My_Ip[1];
IpHeadUint8[14]=NetPort[num].My_Ip[2];
IpHeadUint8[15]=NetPort[num].My_Ip[3];
IpHead.e_ip.DestId[0]=de_ip[0]; //Ìî³äÄ¿µÄIPµØÖ·
IpHead.e_ip.DestId[1]=de_ip[1];
IpHead.e_ip.DestId[2]=de_ip[2];
IpHead.e_ip.DestId[3]=de_ip[3];
IpHeadUint8[16]=de_ip[0]; //Ìî³äÄ¿µÄIPµØÖ·
IpHeadUint8[17]=de_ip[1];
IpHeadUint8[18]=de_ip[2];
IpHeadUint8[19]=de_ip[3];
IpHead.e_ip.Crc=CreateIpHeadCrc(IpHeadUint8); //²úÉúIPÍ·µÄ¼ìÑéºÍ
IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8;//IPÊý¾Ý±¨×ܳ¤¶È¸ß×Ö½Ú
IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff;//IPÊý¾Ý±¨×ܳ¤¶ÈµÍ×Ö½Ú
TxdIpData.STPTR=TxdData;
TxdIpData.length=20;
TxdIpData.DAPTR=IpHeadUint8;
if(Send_Ip_To_LLC(&TxdIpData,IpHead.e_ip.DestId,num))
{
return(1);
}
else
{
return(0);
}
// }
//else
// return (0);
}
*/
uint8 IP_PROCESS(uint8 * RecData,uint8 num)
{
static temp=0;
uint8 iii;
uint16 PackedLength;
uint8 TempIP[4];
#ifdef Little_End
uint16 Ltemp;
#endif
TempIP[0]=((eip*)RecData)->SourceIp[0];
TempIP[1]=((eip*)RecData)->SourceIp[1];
TempIP[2]=((eip*)RecData)->SourceIp[2];
TempIP[3]=((eip*)RecData)->SourceIp[3];//±£´æ¶Ô·½IP
iii=((eip*)RecData)->VerandIphLen&0x0f;
iii=iii*4;//È¡IP°üÍ·µÄ³¤¶È
#ifdef Big_End
PackedLength=((eip*)RecData)->TotalLen;
#endif
#ifdef Little_End
PackedLength=((eip*)RecData)->TotalLen;
Ltemp=PackedLength&0x00ff;
PackedLength=(PackedLength&0xff00)>>8;
PackedLength=PackedLength+(Ltemp<<8);
#endif
PackedLength=PackedLength-(uint16)iii;//¼ÆËãÓÐЧÊý¾ÝµÄ³¤¶È
temp++; //ͳ¼Æ½ÓÊܵÄÓÐЧÊý¾Ý°üÊý
if(temp>=MAX_REC_BUFF)
temp=1;
switch(((eip*)RecData)->NextProtocal)
{
case 1:
icmp_process(RecData,num);
break;
/*case 6:
if(((eip*)RecData)->DestId[0]==NetPort[num].My_Ip[0])
if(((eip*)RecData)->DestId[1]==NetPort[num].My_Ip[1])
if(((eip*)RecData)->DestId[2]==NetPort[num].My_Ip[2])
if(((eip*)RecData)->DestId[3]==NetPort[num].My_Ip[3])//Ä¿±êΪ±¾IP
{
RecData=RecData+iii;
RECQ[temp].RecDataPtr=RecData;
RECQ[temp].length=PackedLength; //Òª´«ÊäipµØÖ·
RECQ[temp].ip[0]=TempIP[0];
RECQ[temp].ip[1]=TempIP[1];
RECQ[temp].ip[2]=TempIP[2];
RECQ[temp].ip[3]=TempIP[3];
RECQ[temp].num=num;
RECQ[temp].My_Ip[0]=NetPort[num].My_Ip[0];
RECQ[temp].My_Ip[1]=NetPort[num].My_Ip[1];
RECQ[temp].My_Ip[2]=NetPort[num].My_Ip[2];
RECQ[temp].My_Ip[3]=NetPort[num].My_Ip[3];
OSQPost(RecTcpQFlag,(void *)&RECQ[temp]);
}
//TCP
break;
case 17:
//Òª´«ÊäipµØÖ·
if(((eip*)RecData)->DestId[0]==NetPort[num].My_Ip[0])
if(((eip*)RecData)->DestId[1]==NetPort[num].My_Ip[1])
if(((eip*)RecData)->DestId[2]==NetPort[num].My_Ip[2])
if(((eip*)RecData)->DestId[3]==NetPort[num].My_Ip[3])//Ä¿±êΪ±¾IP
{
RecData=RecData+iii;
RECQ[temp].RecDataPtr=RecData;
RECQ[temp].length=PackedLength;
RECQ[temp].ip[0]=TempIP[0];
RECQ[temp].ip[1]=TempIP[1];
RECQ[temp].ip[2]=TempIP[2];
RECQ[temp].ip[3]=TempIP[3];
RECQ[temp].num=num;
RECQ[temp].My_Ip[0]=NetPort[num].My_Ip[0];
RECQ[temp].My_Ip[1]=NetPort[num].My_Ip[1];
RECQ[temp].My_Ip[2]=NetPort[num].My_Ip[2];
RECQ[temp].My_Ip[3]=NetPort[num].My_Ip[3];
OSQPost(RecUdpQFlag,(void *)&RECQ[temp]);
}
//UDP
break; */
default :
break;
}// end for switch
return 1;
}