⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arp.c

📁 这是一个在在Dynamic C环境下实现的设备web服务器的建立
💻 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 + -