vcpe/srcs/include/service/dhcpd.h

174 lines
8.7 KiB
C
Raw Normal View History

2023-03-17 07:42:37 +00:00
//
// Created by xajhuang on 2023/3/16.
//
#ifndef VCPE_DHCPD_H
#define VCPE_DHCPD_H
#include <common.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DHCP_SVR_PORT (67)
#define DHCP_CLI_PORT (68)
/**
* Message op code / message type
* Request Message
*/
#define BOOTP_REQUEST 1
/**
* Message op code / message type
* Response Message
*/
#define BOOTP_REPLY 2
#define DHCP_MSG_NONE 0
/**
* DHCP客户端在请求IP地址时并不知道DHCP服务器的位置
* DHCP客户端会在本地网络内以广播方式发送Discover请求报文DHCP服务器
* Discover报文的DHCP服务器都会发送应答报文
* DHCP客户端据此可以知道网络中存在的DHCP服务器的位置
*/
#define DHCP_MSG_DISCOVER 1
/**
* DHCP服务器收到Discover报文后IP地址
* DNS服务器等Offer报文
* DHCP客户端IP地址DHCP客户端可以提供IP地址
* ARP来检测该IP地址是否重复
*/
#define DHCP_MSG_OFFER 2
/**
* DHCP客户端可能会收到很多Offer请求报文
* Offer应答报文的服务器作为自己的目标服务器
* 广Request请求报文IP地址
* DHCP客户端在成功获取IP地址后使50%
* DHCP服务器发送单播Request请求报文请求续延租约
* ACK报文87.5%广Request请求报文以请求续延租约
*/
#define DHCP_MSG_REQUEST 3
/**
* DHCP客户端收到DHCP服务器ACK应答报文后
* 使
* DHCP服务器发送Decline请求报文IP地址不可用IP地址
*/
#define DHCP_MSG_DECLINE 4
/**
* DHCP服务器收到Request请求报文后Request报文中携带的用户MAC来查找有没有相应的租约记录
* ACK应答报文使IP地址
*/
#define DHCP_MSG_ACK 5
/**
* DHCP服务器收到Request请求报文后IP地址
* DHCP客户端发送NAK应答报文IP地址
*/
#define DHCP_MSG_NAK 6
/**
* DHCP客户端不再需要使用分配IP地址时线
* DHCP服务器发送RELEASE请求报文IP地址
* DHCP服务器释放对应的IP地址
*/
#define DHCP_MSG_RELEASE 7
/**
* DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息
* DHCP服务器发送Inform请求报文DHCP服务器在收到该报文后
* DHCP客户端发送ACK应答报文
*/
#define DHCP_MSG_INFORM 8
2023-03-17 07:42:37 +00:00
#pragma pack(push)
#pragma pack(1)
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| op (1) | htype (1) | hlen (1) | hops (1) |
+---------------+---------------+---------------+---------------+
| xid (4) |
+-------------------------------+-------------------------------+
| secs (2) | flags (2) |
+-------------------------------+-------------------------------+
| ciaddr (4) |
+---------------------------------------------------------------+
| yiaddr (4) |
+---------------------------------------------------------------+
| siaddr (4) |
+---------------------------------------------------------------+
| giaddr (4) |
+---------------------------------------------------------------+
| |
| chaddr (16) |
| |
| |
+---------------------------------------------------------------+
| |
| sname (64) |
+---------------------------------------------------------------+
| |
| file (128) |
+---------------+---------------+---------------+---------------+
| cookie (4) |
2023-03-17 07:42:37 +00:00
+---------------------------------------------------------------+
| |
| options (variable) |
+---------------------------------------------------------------+
*/
typedef struct {
///< 报文的操作类型。分为请求报文和响应报文。1请求报文2应答报文。即client送给server的封包设为1反之为2
U8 op;
///< DHCP客户端的MAC地址类型。MAC地址类型其实是指明网络类型。htype值为1时表示为最常见的以太网MAC地址类型
U8 htype;
///< DHCP客户端的MAC地址长度。以太网MAC地址长度为6个字节即以太网时hlen值为6
U8 hlen;
///< DHCP报文经过的DHCP中继的数目默认为0。DHCP请求报文每经过一个DHCP中继该字段就会增加1。没有经过DHCP中继时值为0
U8 hops;
///< 客户端通过DHCP Discover报文发起一次IP地址请求时选择的随机数相当于请求标识。用来标识一次IP地址请求过程。在一次请求中所有报文的Xid都是一样的
U32 xid;
///< DHCP客户端从获取到IP地址或者续约过程开始到现在所消耗的时间以秒为单位。
///< 在没有获得IP地址前该字段始终为0(DHCP客户端开始DHCP请求后所经过的时间。目前尚未使用固定为0)
U16 secs;
///< 标志位只使用第0比特位是广播应答标识位用来标识DHCP服务器应答报文是采用单播还是广播发送
///< 0表示采用单播发送方式1表示采用广播发送方式。其余位尚未使用。(即从0-15bits最左1bit为1时表示server将以广播方式传送封包给client。)
U16 flags;
///< DHCP客户端的IP地址。仅在DHCP服务器发送的ACK报文中显示因为在得到DHCP服务器确认前DHCP客户端是还没有分配到IP地址的。
///< 在其他报文中均显示只有客户端是Bound、Renew、Rebinding状态并且能响应ARP请求时才能被填充
U32 ciaddr;
///< DHCP服务器分配给客户端的IP地址。仅在DHCP服务器发送的Offer和ACK报文中显示其他报文中显示为0
U32 yiaddr;
///< 下一个为DHCP客户端分配IP地址等信息的DHCP服务器IP地址。仅在DHCP Offer、DHCP ACK报文中显示其他报文中显示为0
U32 siaddr;
///< DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。如果没有经过DHCP中继则显示为0。(转发代理网关IP地址)
U32 giaddr;
///< DHCP客户端的MAC地址。在每个报文中都会显示对应DHCP客户端的MAC地址
U8 chaddr[16];
///< 为DHCP客户端分配IP地址的DHCP服务器名称DNS域名格式。在Offer和ACK报文中显示发送报文的DHCP服务器名称其他报文显示为0
U8 sname[64];
///< DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。仅在DHCP Offer报文中显示其他报文中显示为空
U8 file[128];
///< 缓存数据
U32 cookie;
2023-03-17 07:42:37 +00:00
///< 可选项字段,长度可变,格式为"代码+长度+数据"
U8 options[0];
} DHCP_PROTO, *PDHCP_PROTO;
#pragma pack(pop)
typedef enum {
MODE_DHCP_CLIENT,
MODE_DHCP_SERVER
} DHCP_WORK_MODE;
int dhcpd_init(DHCP_WORK_MODE workMode);
2023-03-17 07:42:37 +00:00
#ifdef __cplusplus
}
#endif
#endif //VCPE_DHCPD_H