linux rarp命令,通过源码理解Rarp协议(基于linux1.2.13)

c1423238a1fdc33378d3b52a8157917f.png

本文转载自微信公众号「 编程杂技」,作者theanarkh 。转载本文请联系 编程杂技公众号。

rarp是通过mac地址查询ip的协议,主要用于有mac的主机,但是没有ip的情况。我们先看看rarp协议的协议定义(来自网上的图[1])。

ecc579a40ac56aceae0cca6807ddb13c.png

rarp协议的格式和arp协议是一样的,他们都是通过一种地址查询另外一种地址。操作系统内维护了一个转换表。定义如下。

struct rarp_table

{

struct rarp_table  *next;             /* Linked entry list           */

unsigned long      ip;                /* ip address ofentry         */

unsigned charha[MAX_ADDR_LEN];  /* Hardware address            */

unsigned charhlen;              /* Lengthofhardware address  */

unsigned charhtype;             /* Typeofhardwareinuse     */

struct device      *dev;              /* Device the entry istiedto*/

};

初始化的时候是空的,这个表格的数据来源于,用户通过操作系统提供的接口设置。我们看如何操作这个表。

intrarp_ioctl(unsignedintcmd, void *arg)

{

struct arpreq r;

struct sockaddr_in *si;

interr;

switch(cmd)

{

caseSIOCDRARP:

if (!suser())

return-EPERM;

err = verify_area(VERIFY_READ, arg, sizeof(struct arpreq));

if(err)

returnerr;

memcpy_fromfs(&r, arg, sizeof(r));

if (r.arp_pa.sa_family != AF_INET)

return-EPFNOSUPPORT;

si = (struct sockaddr_in *) &r.arp_pa;

rarp_destroy(si->sin_addr.s_addr);

return0;

caseSIOCGRARP:

err = verify_area(VERIFY_WRITE, arg, sizeof(struct arpreq));

if(err)

returnerr;

returnrarp_req_get((struct arpreq *)arg);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值