前言(也是实践内容基础框架展示)
前面简单讲解了类似于Auth这种大类,会涉及到应用层、内核、驱动层 整个基础框架的需求,而此次的实践实操则只涉及或者我们只讨论应用层部分:

实践内容
- 将指定mac的设备分配192.168.1.88 ip地址进行网络访问
步骤解析为如下:
- udhcp源码移植并使用
- udhcp源码流程解析
- DHCP预留功能开发与验证
DHCP预留(或者静态IP分配、IP-MAC绑定等等)
- 这指的是在路由器上的一种配置,将某个特定的IP地址固定地、永久地分配给网络中的某一个特定设备
如何去判定应该分配给哪一个设备呢?
- 通过其MAC地址识别(从别名IP-MAC绑定亦可看出)
手把手实操
udhcp源码移植并使用
- 源码下载:wget https://udhcp.busybox.net/source/udhcp-0.9.8.tar.gz

并解压 tar -zxvf udhcp-0.9.8.tar.

- 编译:
文件创建:build.sh
修改执行权限:chmod +x build.sh
执行命令:./build.sh

- 生成文件

- 关闭系统不必要的网络服务
停止冲突服务(不需要linuxwlanmanager来管理wifi了)
sudo systemctl disable NetworkManager
sudo systemctl disable dnsmasq - 创建udhcpd.conf文件:sudo vim /etc/udhcpd.conf

- 创建租约文件:使用 touch /var/lib/misc/udhcpd.leases 创建租约文件(持久化记录所有分配)

设置正确的权限

- 启动hostapd进程(在这里就不在赘述以前的文章了)
sudo hostapd /etc/hostapd/hostapd.conf -B

- 启动udhcpd进程
/usr/sbin/udhcpd /etc/udhcpd.conf -f

- 无线连接测试:拿到的地址是192.168.1.2

udhcp源码流程解析
- 流程罗列:
tcpdump 抓包的四个流程:

- 流程交互重点(核心字段在DHCP交互四步中的体现)

对如上参数进行解释

- 代码流程

需要明确的message 参数:

- 代码解析:
接收到DHCPDISCOVER后发送OFFER包给客户端:

处理 DHCPREQUEST 报文逻辑

注释解释

清楚了如何使用udhcpd和理解了代码逻辑才能进行需求开发,所以前面内容不可或缺
DHCP预留功能开发与验证
开发逻辑梳理
1)需要创建存储DHCP预留的信息内存
2)需要创建用于纠错分配ip的哈希表(比如分配到了在DHCP预留中的ip,此时需要重新分配新的ip)
3)对于匹配到DHCP预留的设备进行预留功能设置
- 存储DHCP预留的信息静态内存(写死为设备8a4c11918cd9分配192.168.1.88)

- 创建用于纠错分配ip的哈希表
哈希表定义:


哈希表初始化:

哈希表插入:

- DHCP预留的设备进行预留功能设置

通过指针返回需要分配后的ip,分配后进行发送

- 在ACK中进行ip分配校验:

对于
1)预留分配ip和client请求ip一致性校验
2)对非预留设备请求到预留ip的错误处理

结果验证
连接结果

日志结果

验证成功