UDHCP之DHCP中继源码分析
-------本文旨在全面了解busybox中的udhcp文件夹下的DHCP中继工作原理
一、了解udhcp文件下涉及到dhcprelay的文件:
1、 主文件:dhcprelay.c。dhcprelay功能的实现基本全靠这个文件实现,从解析命令到封装数据包发送数据包等等。
2、 辅助文件common.c与common.h。这两个文件定义了一些通用的函数,比如获得option选项、添加option、发送数据包等等。
二、dhcprelay涉及的数据结构:
Dhcprelay涉及的结构体不多,在主文件定义的只有下面这个,其他的数据包结构已经在服务器中提及过了。记录客户端信息的结构体:
/* This list holds information about clients. The xid_* functions manipulate this list. */
struct xid_item {
unsigned timestamp; //客户端的时间戳
int client; //客户端的编号
uint32_t xid; //客户端发送的discover包的xid字段,是一个随机值
struct sockaddr_in ip; //客户端的IP
struct xid_item *next; //下一个客户端的结构,是一个链表结构
} FIX_ALIASING;
三、从main函数开始分析
我们将主函数分为一下几个步骤来执行:
1、分析命令行参数并根据参数创建相应链表
int dhcprelay_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int dhcprelay_main(int argc, char **argv)
{
struct sockaddr_in server_addr;
。。。。。。
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
server_addr.sin_port = htons(SERVER_PORT);
/* dhcprelay CLIENT_IFACE1[,CLIENT_IFACE2...] SERVER_IFACE [SERVER_IP] */
if (argc == 4) {
if (!inet_aton(argv[3], &server_addr.sin_addr))
bb_perror_msg_and_die("bad server IP");
} else if (argc != 3) {
bb_show_usage();
}
iface_list = make_iface_list(argv + 1, &num_sockets);
。。。。。。。。。。。
}
首先给服务器地址的结构体初始化,sockaddr_in结构体的定义在linux内核中include/linux/in.h文件中。初始化了该结构体的三个成员变量(本来有四个的)。
然后进入第一个重要的函数make_iface_list;在进入这个之前我们需要先判断参数的个数,从涉及的初衷来说,参数的个数必须为4个或是3个,这边的服务器地址可以省略,所以我们才需要判断是不是有四个参数,如果是有4个参数也就是有指定了服务器的地址,就将刚才初始化的服务器广播地址替换为命令行参数指定的地址。
接下的make_iface_list函数是创建接口链表。
/*
*函数名: make_iface_list
*形参:char **client_and_server_ifaces:指向客户端以及服务器接口的字符串指针的指针
*