接昨天的dhcp option82 包解析小记 (之一)
解析的原理很简单。
接到dhcp包以后,使用指针跳转到option82的value部分的地址,因为dhcp header是定长的,而option是变长的,因此此过程需要使用遍历,方法很多,不管使用什么方法,找到option82后,得到地址,然后使用强之类型转换转为我们预定义好的结构,然后取出我们所需要的值并传给处理函数。
option 82结构 (思科),参考文档:switch 2950 Configuring DHCP Features
struct dhcp_cisco_option82
{
u_int8_t subop1_type; /*sub option 1:type */
u_int8_t subop1_length; /*sub option 1: length*/
u_int8_t circuit_id;
u_int8_t circuit_length;
u_int16_t vlan;
u_int8_t module;
u_int8_t port;u_int8_t subop21_type; /*sub option 2:type */
u_int8_t subop2_length; /*sub option 2: length*/
u_int8_t remote_id;
u_int8_t remote_length;
u_int8_t mac[6];
};
类型转换和取值:
char switchmac[20] = {0},vlan[8] = {0},port[12] = {0};
if(info->op82rai)
{
struct dhcp_cisco_option82 *op82 = (dhcp_cisco_option82 *)(info->op82rai);
format(op82->mac,switchmac,0 );
sprintf(vlan,”%u”,ntohs(op82->vlan));
sprintf(port,”%u/%u”,op82->module,(op82->port+1));
}
注:info->op82rai 是指向 option82 value 部分的指针,op82 是我们强制类型转换后的op82指针。这里op82->vlan因为是u_int16_t,需要将网络包顺序转换一下,使用到ntohs函数。
到此,option82中的信息已经提取完毕。
dhcp option82包解析小记 也该结束了。