blob: cf3fe3b183c3ab67cd74f5ec84dcda9b3f4aeaea [file] [log] [blame]
"Robert P. J. Day"63fc1a92006-07-02 19:47:05 +00001/* vi: set sw=4 ts=4: */
Mike Frysinger7031f622006-05-08 03:20:50 +00002/* options.h */
3#ifndef _OPTIONS_H
4#define _OPTIONS_H
5
Denis Vlasenko98636eb2008-05-09 17:59:34 +00006#if __GNUC_PREREQ(4,1)
7# pragma GCC visibility push(hidden)
8#endif
9
Mike Frysinger7031f622006-05-08 03:20:50 +000010#define TYPE_MASK 0x0F
11
12enum {
Denis Vlasenko6884f662007-11-23 00:08:54 +000013 OPTION_IP = 1,
Mike Frysinger7031f622006-05-08 03:20:50 +000014 OPTION_IP_PAIR,
15 OPTION_STRING,
Denis Vlasenko50664732007-02-27 21:15:08 +000016#if ENABLE_FEATURE_RFC3397
17 OPTION_STR1035, /* RFC1035 compressed domain name list */
18#endif
Mike Frysinger7031f622006-05-08 03:20:50 +000019 OPTION_BOOLEAN,
20 OPTION_U8,
21 OPTION_U16,
22 OPTION_S16,
23 OPTION_U32,
24 OPTION_S32
25};
26
27#define OPTION_REQ 0x10 /* have the client request this option */
28#define OPTION_LIST 0x20 /* There can be a list of 1 or more of these */
29
Denis Vlasenkofbd29182007-04-07 01:05:47 +000030/*****************************************************************/
31/* Do not modify below here unless you know what you are doing!! */
32/*****************************************************************/
33
34/* DHCP protocol -- see RFC 2131 */
Denis Vlasenkofbd29182007-04-07 01:05:47 +000035#define DHCP_MAGIC 0x63825363
36
Denis Vlasenko35ff7462007-11-28 19:23:12 +000037
Denis Vlasenkofbd29182007-04-07 01:05:47 +000038/* DHCP option codes (partial list) */
39#define DHCP_PADDING 0x00
40#define DHCP_SUBNET 0x01
41#define DHCP_TIME_OFFSET 0x02
42#define DHCP_ROUTER 0x03
43#define DHCP_TIME_SERVER 0x04
44#define DHCP_NAME_SERVER 0x05
45#define DHCP_DNS_SERVER 0x06
46#define DHCP_LOG_SERVER 0x07
47#define DHCP_COOKIE_SERVER 0x08
48#define DHCP_LPR_SERVER 0x09
49#define DHCP_HOST_NAME 0x0c
50#define DHCP_BOOT_SIZE 0x0d
51#define DHCP_DOMAIN_NAME 0x0f
52#define DHCP_SWAP_SERVER 0x10
53#define DHCP_ROOT_PATH 0x11
54#define DHCP_IP_TTL 0x17
55#define DHCP_MTU 0x1a
56#define DHCP_BROADCAST 0x1c
57#define DHCP_NTP_SERVER 0x2a
58#define DHCP_WINS_SERVER 0x2c
59#define DHCP_REQUESTED_IP 0x32
60#define DHCP_LEASE_TIME 0x33
61#define DHCP_OPTION_OVER 0x34
62#define DHCP_MESSAGE_TYPE 0x35
63#define DHCP_SERVER_ID 0x36
64#define DHCP_PARAM_REQ 0x37
65#define DHCP_MESSAGE 0x38
66#define DHCP_MAX_SIZE 0x39
67#define DHCP_T1 0x3a
68#define DHCP_T2 0x3b
69#define DHCP_VENDOR 0x3c
70#define DHCP_CLIENT_ID 0x3d
71#define DHCP_FQDN 0x51
Denis Vlasenkofbd29182007-04-07 01:05:47 +000072#define DHCP_END 0xFF
73
74
75#define BOOTREQUEST 1
76#define BOOTREPLY 2
77
78#define ETH_10MB 1
79#define ETH_10MB_LEN 6
80
81#define DHCPDISCOVER 1
82#define DHCPOFFER 2
83#define DHCPREQUEST 3
84#define DHCPDECLINE 4
85#define DHCPACK 5
86#define DHCPNAK 6
87#define DHCPRELEASE 7
88#define DHCPINFORM 8
89
90#define BROADCAST_FLAG 0x8000
91
92#define OPTION_FIELD 0
93#define FILE_FIELD 1
94#define SNAME_FIELD 2
95
96/* miscellaneous defines */
97#define OPT_CODE 0
98#define OPT_LEN 1
99#define OPT_DATA 2
100
Mike Frysinger7031f622006-05-08 03:20:50 +0000101struct dhcp_option {
Denis Vlasenkob539c842007-11-29 08:17:45 +0000102 uint8_t flags;
Mike Frysinger7031f622006-05-08 03:20:50 +0000103 uint8_t code;
104};
105
Denis Vlasenkoc90c3f32006-11-23 12:57:49 +0000106extern const struct dhcp_option dhcp_options[];
Denis Vlasenkob539c842007-11-29 08:17:45 +0000107extern const char dhcp_option_strings[];
108extern const uint8_t dhcp_option_lengths[];
Mike Frysinger7031f622006-05-08 03:20:50 +0000109
110uint8_t *get_option(struct dhcpMessage *packet, int code);
111int end_option(uint8_t *optionptr);
112int add_option_string(uint8_t *optionptr, uint8_t *string);
113int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data);
Denis Vlasenko50664732007-02-27 21:15:08 +0000114#if ENABLE_FEATURE_RFC3397
115char *dname_dec(const uint8_t *cstr, int clen, const char *pre);
116uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen);
117#endif
Mike Frysinger7031f622006-05-08 03:20:50 +0000118
Denis Vlasenko98636eb2008-05-09 17:59:34 +0000119#if __GNUC_PREREQ(4,1)
120# pragma GCC visibility pop
121#endif
122
Mike Frysinger7031f622006-05-08 03:20:50 +0000123#endif