目录
1 平台环境
rk3399、buildroot 2018.02-rc3、linux 4.4。
2 应用场景说明
本文的应用场景是设备端通过WiFi AP模式对外提供热点,用户使用手机连接热点,每个手机都会获取到一个IP地址,设备端会记下手机的一些信息,比如手机的MAC、IP等,我们把记录这些信息的文件叫租借文件。
3 解析
udhcpd是busybox提供的动态分配IP地址的命令。每次给client分配一个IP地址都会在租借文件中添加相应的内容。
3.1 怎么找到这个租借文件
cd buildroot
make busybox-menuconfig
Busybox Configuration -> Networking Utilities -> udhcpd (DHCP server)及其子选项,其中可以指定租借文件的绝对路径,比如我的配置为/var/lib/misc/udhcpd.leases(而/var/lib/misc软链接到了/tmp,呵呵)。
3.2 找到修改租借文件的源代码
使用grep命令死劲搜索,首先在buildroot下搜索/var/lib/misc/udhcpd.leases,命令如下:
grep -nr '/var/lib/misc/udhcpd.leases' .
发现如下这一行,说明相关的内容在busybox-1.27.2内部无疑,
./output/build/busybox-1.27.2/.config:945:CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases"
进入busybox-1.27.2,cd ./output/build/busybox-1.27.2/,继续搜索/var/lib/misc/udhcpd.leases,命令如下:
grep -nr '/var/lib/misc/udhcpd.leases' .
发现如下这一行,说明内部处理时是按照LEASES_FILE来修改文件的,
./networking/udhcp/dhcpd.h:13:#define LEASES_FILE CONFIG_DHCPD_LEASES_FILE
继续搜索LEASES_FILE,命令如下:
grep -nr 'LEASES_FILE' .
发现如下一行,基本可以确定修改租期文件的源代码在dumpleases.c中,
./networking/udhcp/dumpleases.c:37: const char *file = LEASES_FILE;
3.3 源码解析
进入dumpleases.c,发现该文件只有一个函数dumpleases_main,稍微分析一下该函数即可确定租期文件就是由这个函数改变的。没有去深究细节,只讲个大概,在函数的开头发现了一个结构体变量struct dyn_lease lease,进去一看,和租期文件的内容大致相近。现在,租期文件udhcpd.leases已经没那么神秘了。
文件的最开始的8个字节为本文件的修改时间,0x000000006125dc40,转换为整数是1,629,871,168,跟当前时间(2021-08-25 14:20分左右)转为UTC时间一致。从第9个字节开始就是struct dyn_lease的内容,该结构体的大小为36个字节,即每次增加一个client就会增加36个字节。后面加进来的client的信息会放在文件的前面,比如上图oppo比vivo后接入热点,但是oppo的信息放在vivo的前面。
3.4 提示
这里提到的一些路径或者文件貌似都是在编译的时候写死的,其实不然,毕竟这Unix哲学的“简单原则”,你可以通过修改udhcpd.conf在执行命令的时候指定租借文件的绝对路径,也可以指定租期(expires,默认为864000秒,即10天),更多信息可以直接查看该文件的内容。
当有新的client接入热点时会向udhcpd.leases增加信息,但是当client离开(比如忘记网络)时不会把该client的信息删除。