DHCP解析

					 DCHPC解析
 首先用到的是一个解析命令行输入函数getopt_long,这个可以自行查阅,我这里简单说一下,udhcpc 要带入的参数,要 配置ip,首先你要输入一个接口,将这个获取到的ip配置给他,其他的就根据实际情况添加,如我的命令输入行是uchcpc -f -i lanbr1 -h CLOUDNET --logname VLAN1 -p /var/run/ehdcpc_388888888 --ifindex 388888888  这个解析出来就是要往lanbr1这个接口配置获取的ip,其他的是根据我这块板子的信息做的相应的配置。
 看代码之前先把逻辑搞清楚,一般的逻辑是,开始创建个socket就在局域网内发广播包,告诉局域网内的所有设备我要配置ip,需要有设备回应并给我发送回一个ip,路由器()收到这个广播包之后,就去地址池里面找一个没有用的ip,发会给要配置ip的设备(我把他称位src地址),拿到设备后,对其ip检查,讲这个ip地址发到整个局域网内,问下有人用这个ip地址没,当没有人回应时,这个ip是可用的,就将其配置到自己的网络接口上。
 具体到我的这块板子,因为考虑到可以配置静态和动态,开机启动静态不启动udhcpc,配置静态的时候也不会启用dhcpc,所以做了一个通知链来监控,如果这个接口启动或者停用,IP地址的改变都会触发这个通知链,当有时间发生时,通知链句柄处理,句柄函数先判断处于什么状态如果是动态再启用dhcpc。逻辑说了半天还是来看看代码怎么实现的。
 由于是应用程序,所以先找到udhcpc的程序的入口函数udhcpc_main,不要问我为什么不是main,这个自己可以搞定的,我这里uhcpc要和外界通信,所以初始化了消息队列,信号函数。再通过getopt_long对输入参数进行解析并配置到相关的接口,udhcp_sp_setup设置信号函数,读取当前要配置接口read_interface。准备工作做好之后就要按照自己设计的流程启动dhcpc了,我的是先让dhcpc进入一个永久等待之中,然后由上面的通知链句柄函数发送信号过来,什么时候要启动dhcoc,什么时候要停止dhcpc,具体的我的代码是change_mode(LISTEN_NONE);state = RELEASED;timeout = FOREVER_TIME;网上的开源代码是监听LISTEN_RAW,(开源源码是已启动dhcpc就发出discover包,收到包之后。。。),我这里是通过接受到了信号case SIGUSR1:perform_renew();break;将状态改成LISTEN_RAW,state = INIT_SELECTING;然后进行下去,调用raw_socket,创建一个socket,socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)),绑定上用于接受路由器下发的ip地址。然后使用select函数监听是否有数据达到这个接口,没有数据到达时,定时器超时时,使用send_discover函数的udhcp_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST,SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex);发送广播包,发送完后进入下次循环,如果有数据到来,select函数返回正数,就启动udhcp_run_script(NULL, "leasefail");启动脚本,通过ipconfig命令将得到的ip和dns配到接口上,下面的代码我就不一一分析的了,很简单的,注意逻辑就好了,最后分享一个关于dhcp的链接https://blog.csdn.net/cupidove/article/details/23122003,这个写的比我的好。上面是我个人的理解,如有不对,忘指正。
 													by fxy 2018.12.12

你可能感兴趣的:(dhcp)