ioctl ARP缓存表

来源:互联网 发布:spring切面编程 注解 编辑:程序博客网 时间:2024/06/06 02:17

http://blog.chinaunix.net/uid-488742-id-2113621.html


ARP缓存表arp_tbl由协议栈在运行期间自动维护,包括邻居新建,更新,回收等。同时,TCP/IP协议栈的实现中也提供了三个命令,可以用来由用 户维护arp_tbl,这三个命令分别是SIOCDARP(删除arp_tbl中的一个邻居),SIOCSARP(设置arp_tbl中的一个邻居), SIOCGARP(获取arp_tbl中的一个邻居)。用户使用系统调用ioctl来传递这三个命令,命令参数是结构体struct arpreq,其定义如下:

    struct arpreq {
      struct sockaddr   arp_pa;     //协议地址
      struct sockaddr   arp_ha;     //硬件地址
      int               arp_flags;      //标志位
      struct sockaddr   arp_netmask;    //网络掩码(只用于代理ARP)
      char              arp_dev[16];    //对应的网络设备接口的名称。
    };

    使用SIOCDARP命令时,只要在struct arpreq结构体填入arp_pa,arp_dev,内核会根据arp_pa中的邻居IP地址从myarp_tbl的哈希表hash_buckets中 找出该邻居,并把它的状态更新为NUD_FAILED(失败),则在下一次的arp垃圾回收中,该邻居就会被会收掉。
    使用SIOCSARP命令时,需要设置struct arpreq的arp_pa,arp_ha,arp_flags。如果arp_tbl中已存在该邻居,会更新该邻居,否则新建一个邻居,其状态为 NUD_STALE,如果arp_flags中有ATF_PERM,状态再加上NUD_PERMANENT。
    使用SIOCGARP时,只需要arp_pa,从arp_tbl中找到该邻居并返回,不过,一般要查看arp缓存,并不使用SIOCGARP命令,而是从proc/net/arp文件中取。

    struct arpreq的arp_flags上的标志有如下一些:
    #define ATF_COM         0x02        //已完成的邻居 (成员ha有效,且含有正确的MAC地址)
    #define ATF_PERM        0x04        //永久性的邻居(邻居状态有NUD_PERMANENT)
    #define ATF_PUBL        0x08        //发布该邻居。
    #define ATF_USETRAILERS 0x10        //不是非常清楚。
    #define ATF_NETMASK     0x20        //仅用于代理ARP。
    #define ATF_DONTPUB     0x40        //不处理该邻居。

0 0