本文转载自微信公众号「 编程杂技」,作者theanarkh 。转载本文请联系 编程杂技公众号。
rarp是通过mac地址查询ip的协议,主要用于有mac的主机,但是没有ip的情况。我们先看看rarp协议的协议定义(来自网上的图[1])。
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);