udhcp中,由serverpacket.c完成了服务器报文的发送,而clientpacket则完成了客户端报文的发送。它们最终调用的都是packet.c中的接口完成报文向网络中的发送。
struct dhcpMessage { u_int8_t op; u_int8_t htype; u_int8_t hlen; u_int8_t hops; u_int32_t xid;/*DHCPREQUEST 时产生的数据,以作为DHCPREPLY的数据*/ u_int16_t secs;/*client端启动时间*/ u_int16_t flags; u_int32_t ciaddr;/*要是client想继续使用之前取得地址,则列于这里*/ u_int32_t yiaddr;/*在DHCPOFFER和DHCPACK中,这里表示client的ip地址*/ u_int32_t siaddr;/*用于网络开机*/ u_int32_t giaddr;/*跨网络的dhcp发放时,这里用来保存relayagent地址*/ u_int8_t chaddr[16];/*client硬件地址*/ u_int8_t sname[64];/*server之名称字窜*/ u_int8_t file[128]; u_int32_t cookie; u_int8_t options[308]; /* 312 - cookie */ };
packet.c里面定义了报文dhcp报文的格式,这个格式大部分和rfc2131中所定义的一致,其中rfc2131规定了报文最小长度为312字节,故这里udhcp所使用的是最小的报文格式。
值得注意的是packet.c中定义了两种发送报文的方式:raw_packet和kernel_packet。
intraw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port,
u_int32_t dest_ip, int dest_port, unsignedchar *dest_arp, int ifindex)
这个函数主要是在不知道客户端IP地址的情况下,凭借mac地址将dhcp报文从ifindex接口单播给客户端。
而
intkernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, intsource_port,
u_int32_t dest_ip, int dest_port)
该函数则是使用ip地址发送报文,通常用于客户端向服务器发送的比如dhcprequest、dhcpinform报文。
当然packet.c函数也包括了报文头的封装和报文的读取和校验和工作。
serverpacket.c和clientpacket.c函数一看即明白就不细述了。
本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008