分类: 网络与安全
2009-06-13 10:38:46
1.定义常量
#define EPT_IP 0x0800 /* type: IP */
#define EPT_ARP 0x0806 /* type: ARP */
#define EPT_RARP 0x8035 /* type: RARP */
2.定义以太网首部
typedef struct ehhdr
{
unsigned char eh_dst[6]; /* destination ethernet addrress */
unsigned char eh_src[6]; /* source ethernet addresss */
unsigned short eh_type; /* ethernet pachet type */
}EHHDR;
/* 注释:xie_minix */
/* 要了解ARP包,他的结构和一些常量你必须知道是什么意思*/
#ifndef _NET_IF_ARP_H_
#define _NET_IF_ARP_H_
/*
* 地址解释协议.
*
* 查看 RFC 826 对该协议的描述. ARP 包长度是变化的
* 头部(arphdr)结构定义了固定长度部分.
*/
struct arphdr {
u_short ar_hrd; /* 格式化的硬件地址 */
#define ARPHRD_ETHER 1 /* 以太网格式 */
#define ARPHRD_IEEE802 6 /* 令牌环网格式 */
#define ARPHRD_FRELAY 15 /* 帧中继硬件格式 */
u_short ar_pro; /* 协议地址格式 */
u_char ar_hln; /* 硬件地址长度*/
u_char ar_pln; /* 协议地址长度 */
u_short ar_op; /* 以下之一: */
#define ARPOP_REQUEST 1 /* 发出请求解释一IP地址 */
#define ARPOP_REPLY 2 /* 回应上一个请求 */
#define ARPOP_REVREQUEST 3 /* 请求一IP地址(给出硬件地址,实际上是逆向地址解释) */
#define ARPOP_REVREPLY 4 /* 回应逆向地址解释 */
#define ARPOP_INVREQUEST 8 /* 请求对方的ID */
#define ARPOP_INVREPLY 9 /* 回应对方的ID */
/*
* 下面的字段是可变长的,
* 主要是依照上面给出的定义.
*/
#ifdef COMMENT_ONLY
u_char ar_sha[]; /* 发送者硬件地址 */
u_char ar_spa[]; /* 发送者协议地址 */
u_char ar_tha[]; /* 目的方硬件地址 */
u_char ar_tpa[]; /* 目的方协议地址*/
#endif
};
/*
* ARP ioctl 请求
*/
struct arpreq {
struct sockaddr arp_pa; /* 协议地址 */
struct sockaddr arp_ha; /* 硬件地址 */
int arp_flags; /* 标识 */
};
/* arp_flags 和 at_flags 域的值 */
#define ATF_INUSE 0x01 /* 入口在使用 */
#define ATF_COM 0x02 /* 完整的入口 (enaddr 有效) */
#define ATF_PERM 0x04 /* 持久的入口 */
#define ATF_PUBL 0x08 /* 发布一入口 (回应其他主机) */
#define ATF_USETRAILERS 0x10 /* 有追踪请求 */
#ifdef _KERNEL
/*
* 该结构是以太网设备驱动程序和ARP程序所共享.
*/
struct arpcom {
/*
* ifnet 结构必须在此结构的第一个位置.
*/
struct ifnet ac_if;
u_char ac_enaddr[6]; /* 以太网硬件地址*/
int ac_multicnt; /* 多播地址列表数 */
void *ac_netgraph; /* PPPoE(ADSL)的指针 */
};
extern u_char etherbroadcastaddr[6];
#endif
#endif /* !_NET_IF_ARP_H_ */
由于内核中的arp头部定义为了适应各种链路而比较复杂,并且针对以太网定义的格式编译选项复杂,所以还是自己在程序中定义结构体比较easy。
typedef struct arphdr
{
//arp首部
unsigned short arp_hrd; /* format of hardware address */
unsigned short arp_pro; /* format of protocol address */
unsigned char arp_hln; /* length of hardware address */
unsigned char arp_pln; /* length of protocol address */
unsigned short arp_op; /* ARP/RARP operation */
unsigned char arp_sha[6]; /* sender hardware address */
unsigned long arp_spa; /* sender protocol address */
unsigned char arp_tha[6]; /* target hardware address */
unsigned long arp_tpa; /* target protocol address */
}ARPHDR;
4.定义整个arp报文包,总长度42字节
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET;
5.由于以太网中规定以太网帧中出以太网头部外的数据长度最小为46字节,而ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。