DHCP源码分析-dhcp模块
来源:互联网 发布:关于网络黑客的说说 编辑:程序博客网 时间:2024/05/08 13:17
一, DHCP函数流程
二, locate_network()流程分析
1,查找link selection和subnet selection options
if ((oc = lookup_option(&agent_universe, packet->options, RAI_LINK_SELECT)) == NULL) oc=lookup_option(&dhcp_universe,packet->options, DHO_SUBNET_SELECTION);
首先,先查找DHCP包中是否有relay-agent-option下linkselection sub-option,这个option用于当client与server处于不同网段,需要DHCP relay转发时,client想要得到一个relay agent不同网段的IP。具体信息请参考RFC 3527。
如果没有该option,就继续在包中查找subnet selection option。这个option用于在client与server同一网段的情况下,client需要获得不同网段的IP,具体信息参考RFC3011。
这两个option在功能上有相似之处,都是client要求获得一个指定网段的IP。不同之处在于,relay-agent-option是用于DHCP relay的,也就说DHCP包是通过relay转发到server端的,client与server处于不同的物理网段。而subnet selection option,是client与server处于同一个物理网段,但是想要获得不同网段的IP,而由client将这个option加入到DHCP包中。
2,使用网卡所在网段为预分配的subnet
if (!oc && !packet -> raw -> giaddr.s_addr) { if (packet -> interface -> shared_network) { shared_network_reference (&packet -> shared_network, packet -> interface -> shared_network, MDL); return 1; } return 0; }
3,使用option或relay地址确定subnet
if (oc) { memset (&data, 0, sizeof data); if (!evaluate_option_cache (&data, packet, (struct lease *)0, (struct client_state *)0,packet -> options, (struct option_state *)0,&global_scope, oc, MDL)) { return 0; } if (data.len != 4) { return 0; } ia.len = 4; memcpy (ia.iabuf, data.data, 4); data_string_forget (&data, MDL); } else { ia.len = 4; memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);} if (find_subnet (&subnet, ia, MDL)) { shared_network_reference (&packet -> shared_network,subnet -> shared_network, MDL); subnet_dereference (&subnet, MDL); return 1;}
在没有前面两个option的情况下,server将通过packet -> raw -> giaddr来确定分配IP的subnet。
通过对locate_network的分析,我们可以确定subnet选择因素的优先级为
linkselection sub-option > subnet selection option > relay address > 网卡的subnet三, find_lease()流程分析
1, 通过client identifer或hardware确定host
通过find_hosts_by_uid(&hp,client_identifier.data, client_identifier.len, MDL)来使用client identifier找到host即hp,通过find_hosts_by_haddr(&hp,packet->raw->htype, packet->raw->chaddr, packet->raw->hlen,MDL)来使用MAC地址来找到host。找到host后,通过host尝试查找fixedlease——即在配置文件的host中,指定的IP地址。这是通过mockup_lease (&fixed_lease, packet, share, host)这个函数实现的。这里注意的是,传入参数share为预分配IP的subnet。将它作为参数,是为了排除不在该subnet中的fixed ip,即使这个IP是host的指定IP。
其实除了使用clientindentifer和MAC地址来查找host的方式外,还支持通过指定option来查找host,这种用法并不常见。
通过host确定的IP,在ISC DHCP中被称为fixedIP,其对应的lease自然被称为fixedlease。
2,通过client identifier获得fixed lease
if (find_hosts_by_uid (&hp, client_identifier.data,client_identifier.len, MDL)) { /* Remember if we know of this client. */packet -> known = 1;mockup_lease (&fixed_lease, packet, share, hp);}
在代码中,有两个lease的hash表,分别以client identifier和hardware address为key。从这里可以看出,DHCP server一般情况下,都是会给client上次同样的IP。
3,获得client的请求地址
if (packet -> raw -> ciaddr.s_addr){cip.len = 4; memcpy (cip.iabuf, &packet -> raw -> ciaddr, 4);} else {/* Look up the requested address. */oc = lookup_option (&dhcp_universe, packet -> ptions,DHO_DHCP_REQUESTED_ADDRESS);memset (&d1, 0, sizeof d1);if (oc &&evaluate_option_cache (&d1, packet, (struct lease *)0,(struct client_state *)0,packet -> options,(struct option_state *)0,&global_scope, oc, MDL)) {packet -> got_requested_address = 1;cip.len = 4;memcpy (cip.iabuf, d1.data, cip.len);data_string_forget (&d1, MDL);}elsecip.len = 0;}
server会使用这个cip来分配一个lease,然后再通过一系列检查来判断是否可以使用这个lease。在不与其他配置的不冲突的情况下,尽量满足client的要求,分配给其要求的IP。
确定分配IP的优先级是fixed lease > uid lease > hw lease > ip lease,其 fixed lease是配置文件中host所配置的lease,uid lease 是通过uid确定的lease,hw lease是通过硬件地址查找到的lease,ip lease是client希望请求得到的lease。
四, DISCOVER报文的处理流程
- DHCP源码分析-dhcp模块
- DHCP源码分析-dhcpv6模块
- DHCP源码&报文分析
- DHCP源码分析-系统概述
- DHCP协议和dhcpcd源码分析
- DHCP协议和dhcpcd源码分析
- DHCP协议和dhcpcd源码分析
- DHCP协议和dhcpcd源码分析
- DHCP协议和dhcpcd源码分析
- DHCP源码分析_子模块划分
- DHCP源码分析-报文解析和封装
- DHCP
- DHCP+
- DHCP
- DHCP
- DHCP
- DHCP
- DHCP
- org.openqa.selenium.StaleElementReferenceException
- android开发中使用高德地图出现的一些问题
- oracle数据库文件系统迁移到ASM
- C++ 的名字查找(name lookup)
- android5.1中apn选项默认选择制式源码修改
- DHCP源码分析-dhcp模块
- 常用Myeclipse快捷键整理
- TMS320F28335时钟(1) -----PLL倍频器的初始化详解
- Maven Tomcat 部署
- 解决切换jdk编译android源码错误
- 自定义简化版本的vector容器
- wind 7 配置示图
- Notepad++关联文件扩展名,修改字体大小
- vim+clipboard+vim-gui(gvim)源码编译