1/* vi: set sw=4 ts=4: */
2/* options.h */
3#ifndef _OPTIONS_H
4#define _OPTIONS_H
5
6#define TYPE_MASK	0x0F
7
8enum {
9	OPTION_IP=1,
10	OPTION_IP_PAIR,
11	OPTION_STRING,
12#if ENABLE_FEATURE_RFC3397
13	OPTION_STR1035,	/* RFC1035 compressed domain name list */
14#endif
15	OPTION_BOOLEAN,
16	OPTION_U8,
17	OPTION_U16,
18	OPTION_S16,
19	OPTION_U32,
20	OPTION_S32
21};
22
23#define OPTION_REQ	0x10 /* have the client request this option */
24#define OPTION_LIST	0x20 /* There can be a list of 1 or more of these */
25
26/*****************************************************************/
27/* Do not modify below here unless you know what you are doing!! */
28/*****************************************************************/
29
30/* DHCP protocol -- see RFC 2131 */
31#define SERVER_PORT		67
32#define CLIENT_PORT		68
33
34#define DHCP_MAGIC		0x63825363
35
36/* DHCP option codes (partial list) */
37#define DHCP_PADDING		0x00
38#define DHCP_SUBNET		0x01
39#define DHCP_TIME_OFFSET	0x02
40#define DHCP_ROUTER		0x03
41#define DHCP_TIME_SERVER	0x04
42#define DHCP_NAME_SERVER	0x05
43#define DHCP_DNS_SERVER		0x06
44#define DHCP_LOG_SERVER		0x07
45#define DHCP_COOKIE_SERVER	0x08
46#define DHCP_LPR_SERVER		0x09
47#define DHCP_HOST_NAME		0x0c
48#define DHCP_BOOT_SIZE		0x0d
49#define DHCP_DOMAIN_NAME	0x0f
50#define DHCP_SWAP_SERVER	0x10
51#define DHCP_ROOT_PATH		0x11
52#define DHCP_IP_TTL		0x17
53#define DHCP_MTU		0x1a
54#define DHCP_BROADCAST		0x1c
55#define DHCP_NTP_SERVER		0x2a
56#define DHCP_WINS_SERVER	0x2c
57#define DHCP_REQUESTED_IP	0x32
58#define DHCP_LEASE_TIME		0x33
59#define DHCP_OPTION_OVER	0x34
60#define DHCP_MESSAGE_TYPE	0x35
61#define DHCP_SERVER_ID		0x36
62#define DHCP_PARAM_REQ		0x37
63#define DHCP_MESSAGE		0x38
64#define DHCP_MAX_SIZE		0x39
65#define DHCP_T1			0x3a
66#define DHCP_T2			0x3b
67#define DHCP_VENDOR		0x3c
68#define DHCP_CLIENT_ID		0x3d
69#define DHCP_FQDN		0x51
70
71#define DHCP_END		0xFF
72
73
74#define BOOTREQUEST		1
75#define BOOTREPLY		2
76
77#define ETH_10MB		1
78#define ETH_10MB_LEN		6
79
80#define DHCPDISCOVER		1
81#define DHCPOFFER		2
82#define DHCPREQUEST		3
83#define DHCPDECLINE		4
84#define DHCPACK			5
85#define DHCPNAK			6
86#define DHCPRELEASE		7
87#define DHCPINFORM		8
88
89#define BROADCAST_FLAG		0x8000
90
91#define OPTION_FIELD		0
92#define FILE_FIELD		1
93#define SNAME_FIELD		2
94
95/* miscellaneous defines */
96#define OPT_CODE 0
97#define OPT_LEN 1
98#define OPT_DATA 2
99
100struct dhcp_option {
101	char name[12];
102	char flags;
103	uint8_t code;
104};
105
106extern const struct dhcp_option dhcp_options[];
107extern const unsigned char option_lengths[];
108
109uint8_t *get_option(struct dhcpMessage *packet, int code);
110int end_option(uint8_t *optionptr);
111int add_option_string(uint8_t *optionptr, uint8_t *string);
112int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data);
113#if ENABLE_FEATURE_RFC3397
114char *dname_dec(const uint8_t *cstr, int clen, const char *pre);
115uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen);
116#endif
117
118#endif
119