busybox之dhcprelay源码分析

UDHCPDHCP中继源码分析

-------本文旨在全面了解busybox中的udhcp文件夹下的DHCP中继工作原理

一、了解udhcp文件下涉及到dhcprelay的文件:

1、 主文件:dhcprelay.cdhcprelay功能的实现基本全靠这个文件实现,从解析命令到封装数据包发送数据包等等。

2、 辅助文件common.ccommon.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:指向客户端以及服务器接口的字符串指针的指针

*

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值