udhcp源码详解(四) 之DHCP包--options字段
Author : hui <632254504@qq.com>
From : <http://blog.csdn.net/hui_love2046>
Created : 2010-10-25
中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说,理论上说从IP地址池取到一个空闲的IP,就这么一句,在源码的体现也是一大段。算啦,讲多少算多少吧,进入主题!
struct dhcpMessage报文里uint8_t options[308]字段,在整个DHCP过程中是报文的一个很重要的字段,博文的系列(二)有讲解该字段的数据组织方式,CLV(Code + Len + Value),现在来讲解下怎么把选项信息添加进该字段,以及怎么从该字段取到相应的选项信息。
options字段存储三类数据:
a). DHCP_PADDING 填充字节, 没有任何意义,填充 0x00
b). DHCP_END potions字段结束的标志 0xFF
c). 选项信息<CLV> 对于DHCP过程真正有价值的信息,承载了选项数据(V)
对于选options字段的操作主要就是read/write value:
1、根据选项信息的CODE从option字段取出选项信息.
在源码busybox 1.2的udhcp源码中,对于从options字段取出选项信息,在对选项过载的处理是存在错误的,
2、向options字段写入选项信息
a). 写入是添加在options字段中最后的选项后面,即DHCP_END标志之前
查找DHCP_END标志字段:
b). 选项信息已经在一个字符串里以CLV方式组织好,直接copy到DHCP_END标志位置,DHCP_END向后移动:
c). 把选项信息按CLV的方式组织好存放到一个字符串里,最后调用add_option_string把在字符串内组织好的选项信息添加进options字段: