📄 arp.c
字号:
// Ring Queue Functions =================================================
/*** BeginHeader QInit */
root void QInit(void);
/*** EndHeader */
root void QInit(void)
{
auto int i;
g_CmdQNum = 0;
g_CmdQFront = 0;
g_CmdQRear = 0;
for(i = 0; i < ARP_Q_SIZE; ++i)
{
g_CmdQueue[i] = xalloc( ARP_Q_BUF );
}
}
/*** BeginHeader Qupdata */
root void Qupdata(void);
/*** EndHeader */
root void Qupdata(void)
{
int i;
unsigned long x,y;
for(i=0;i<RemoteUp.Cnt;++i)
{
if(RemoteUp.IsArp[i] ==1)
{
x=(RemoteUp.ArpIP[i])&(g_AddrInfo[UserIndx].ulIpMask);
y=(g_AddrInfo[UserIndx].ulIpAddr)&(g_AddrInfo[UserIndx].ulIpMask);
if(x==y)
{
ArpQIns(i,RemoteUp.ArpIP[i]);
}
else
{
ArpQIns(i,g_AddrInfo[UserIndx].ulGateway);
}
}
}
}
/*** BeginHeader ArpQReset */
root void ArpQReset(void);
/*** EndHeader */
root void ArpQReset(void)
{
g_CmdQNum = 0;
g_CmdQFront = 0;
g_CmdQRear = 0;
}
/*** BeginHeader ArpQIns */
root unsigned char ArpQIns( unsigned char Channel, unsigned long ulSrcAddr);
/*** EndHeader */
root unsigned char ArpQIns( unsigned char Channel, unsigned long ulSrcAddr)
{
auto long xBufAddr;
if( ARP_Q_SIZE == g_CmdQNum )
{
return 0;
}
g_CmdQNum++;
xBufAddr = g_CmdQueue[g_CmdQRear];
root2xmem( xBufAddr, (unsigned char*)(& Channel), 1 );
xBufAddr += 1;
root2xmem( xBufAddr, (unsigned char*)(& ulSrcAddr), 4 );
g_CmdQRear = (g_CmdQRear + 1) % ARP_Q_SIZE;
return 1;
}
/*** BeginHeader ArpQGetData */
root unsigned char ArpQGetData( unsigned char * pData, unsigned long * pSrcAddr );
/*** EndHeader */
root unsigned char ArpQGetData( unsigned char * pData, unsigned long * pSrcAddr )
{
auto long xBufAddr;
auto unsigned short usDataLen;
if( 0 == g_CmdQNum )
{
return 0;
}
xBufAddr = g_CmdQueue[g_CmdQFront];
xmem2root( pData, xBufAddr, 1 );
xBufAddr += 1;
// Get the SrcAddr
xmem2root( (unsigned char *)pSrcAddr, xBufAddr, 4 );
// Delete the command in the queue
ArpQDel( );
return 1;
}
/*** BeginHeader ArpQDel */
void ArpQDel(void);
/*** EndHeader */
void ArpQDel(void)
{
auto unsigned char pFlag[5];
if( 0 == g_CmdQNum )
{
return;
}
g_CmdQNum--;
memset( pFlag, 0xff, 5 );
root2xmem( g_CmdQueue[g_CmdQFront], pFlag, 5 );
g_CmdQFront = (g_CmdQFront + 1) % ARP_Q_SIZE;
}
/*** BeginHeader StartArp */
xmem void StartArp(void);
/*** EndHeader */
xmem void StartArp()
{
int i;
unsigned char ucTmp;
unsigned char ucArpMac[6];
unsigned long ulIPAddr;
//unsigned char Disp[20];
//unsigned char Disp1[20];
if(Arp_En == 0)
{
ucTmp= ArpQGetData(&ArpSel.Channel,&ArpSel.DstIP) ;
//printf("===============================\r\n");
//printf("Enable ARP:%02x\r\n\r\n",ucTmp);
//printf("Channel:%02x\r\n",ArpSel.Channel);
//inet_ntoa(Disp,ArpSel.DstIP);
//printf("IP=%s\r\n",Disp);
if((ucTmp==1)&&(ArpSel.Channel<MAX_CHANNEL))
{
ulIPAddr=ArpSel.DstIP;
ucTmp=(unsigned char)((ulIPAddr>>24)&0x000000FF);
WrPortE(ARP_IP_ADDR_START,NULL,ucTmp);
ucTmp=(unsigned char)((ulIPAddr>>16)&0x000000FF);
WrPortE(ARP_IP_ADDR_START+1,NULL,ucTmp);
ucTmp=(unsigned char)((ulIPAddr>>8)&0x000000FF);
WrPortE(ARP_IP_ADDR_START+2,NULL,ucTmp);
ucTmp=(unsigned char)(ulIPAddr&0x000000FF);
WrPortE(ARP_IP_ADDR_START+3,NULL,ucTmp);
WrPortE(CTRL_ARP,NULL,0x00);
for(i=0;i<500;++i);
WrPortE(CTRL_ARP,NULL,0x01);
for(i=0;i<500;++i);
WrPortE(CTRL_ARP,NULL,0x00);
Arp_En=1;
}
}
else
{
ucTmp=RdPortE(MARK_ARP_OK);
//printf("Arp_ok:%02x\r\n",ucTmp);
if(ucTmp&0x01)
{
for(i=0;i<6;++i)
{
ucArpMac[i]=RdPortE(ARP_IP_OF_MAC_START+i);
}
//inet_ethtoa(Disp1,ucArpMac);
//printf("MAC=%s\r\n",Disp1);
RdPortE(FIRST_CLR_OK);
for(i=0;i<500;++i);
RdPortE(SECOND_CLR_OK);
if(ArpSel.Channel<MAX_CHANNEL)
{
RemoteUp.IsArp[ArpSel.Channel]=0;
for(i=0;i<MAX_CHANNEL;++i)
{
if(RemoteUp.ArpIP[ArpSel.Channel]==g_AddrInfo[UserIndx].FirE1Para[i].DstIp)
{
g_AddrInfo[UserIndx].FirE1Para[i].EnArp=0;
memcpy(g_AddrInfo[UserIndx].FirE1Para[i].DstMac,ucArpMac,6);
}
}
}
IpHead( );
// printf("Into\r\n");
}
Arp_En=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -