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

📄 arp.h

📁 是TCPIP程序
💻 H
字号:
#ifndef _ARP_H_
#define _ARP_H_

#include <iptcp.h>
#include <time.h>

#define  ARP_KEEP_TIME    100000
/*物理地址可以保存在缓存中最多的时间*/
void arp_request(ulong dest_ip);
int arp_resolve( ulong ina );
void arp_handler(arp_Header xdata *arp);


/*
 *arp_resolve - 解析IP地址对应的硬件MAC地址
 */
extern  eth_address xdata card_mac;
extern  ulong xdata gateip;
extern  ulong xdata local_ip;
extern  ulong xdata mask;
bit arpok;

/*ARP如果要物理地址的话,把不知道的物理地址空起来,目标地址只好是广播抵制了*/

int arp_resolve( ulong ina )
{
    uint xdata timeout;
    if(ina==0)return(FALSE);
    if(curr_conf.timer!=0)return(TRUE);
    curr_conf.dst_ip=ina;
    /* 发送ARP请求 */
    arp_request( ina );
    timeout = set_timeout( 25);/* 250 ms */
    /* 等待解析结果 */
    while (chk_timeout( timeout ))
	{
           tick();
           if ( arpok)
		return ( TRUE );
	}
    fail:
    return ( FALSE );
}



void arp_handler(arp_Header xdata *arppp)
 {
  uchar temp;
  arp_Header xdata *arp;
  eth_Header xdata *peth,*eth;
  arp_Header xdata *parp;
  arp=arppp;
  eth=(eth_Header xdata *)((uchar xdata *)arp-sizeof(eth_Header));

  peth=ETH_SEND_ADDR;
  parp=ETH_SEND_ADDR+(sizeof(eth_Header));
  /*我ARP一个物理地址, 它给我一个返回,看看和不合适*/
  if(arp.opcode==ARP_REPLY)
   {
    if((arp.dstIPAddr==local_ip)&&(arp.srcIPAddr==curr_conf.dst_ip))
     {
        curr_conf.dst_mac=arp.srcEthAddr;
        curr_conf.timer=ARP_KEEP_TIME;
        arpok=TRUE;
     }
   }
   /*别人要我的物理地址,给它把,不要小气*/
  if(arp.opcode==ARP_REQUEST)
   {
    if(arp.dstIPAddr==local_ip)
     {
      peth.destination=eth.source;
      peth.source=card_mac;
      peth.type=0x0806;

      curr_conf.dst_mac = eth.source;
      curr_conf.dst_ip  = arp.srcIPAddr;
      curr_conf.timer   = ARP_KEEP_TIME;

      parp.hwType=0x01;
      parp.protType=0x0800;
      parp.hwProtAddrLen=0x0604;
      parp.opcode=ARP_REPLY;
      parp.srcEthAddr=card_mac;
      parp.srcIPAddr=local_ip;
      parp.dstEthAddr=arp.srcEthAddr;
      parp.dstIPAddr=arp.srcIPAddr;
      eth_send(42);
     }
   }
 }



void arp_request(ulong dest_ip)//request mac of a ip
 {
  uchar temp;
  eth_Header xdata *peth;
  arp_Header xdata *parp;


  peth=ETH_SEND_ADDR;
  parp=ETH_SEND_ADDR+sizeof(eth_Header);

  peth.destination=MULTI_ADDR;
  peth.source=card_mac;
  peth.type=0x0806;
  parp.hwType=0x01;
  parp.protType=0x0800;
  parp.hwProtAddrLen=0x0604;
  parp.opcode=ARP_REQUEST;
  parp.srcEthAddr=card_mac;
  parp.srcIPAddr=local_ip;
  parp.dstEthAddr=UNKOWN_ADDR;

  if((s->myaddr&mask)!=(dest_ip&mask))/*子网掩码不相同,需要将数据通过网关送出去*/
  parp.dstIPAddr=gate_ip;
  else
  parp.dstIPAddr=dest_ip;
  eth_send(42);
 }


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -