[Settings] Migrate DHCP and NVO code to the new settings API (untested)
[people/mcb30/gpxe.git] / src / include / gpxe / dhcp.h
1 #ifndef _GPXE_DHCP_H
2 #define _GPXE_DHCP_H
3
4 /** @file
5  *
6  * Dynamic Host Configuration Protocol
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/in.h>
12 #include <gpxe/list.h>
13 #include <gpxe/refcnt.h>
14 #include <gpxe/tables.h>
15
16 struct net_device;
17 struct job_interface;
18 struct dhcp_packet;
19 struct settings;
20
21 /** BOOTP/DHCP server port */
22 #define BOOTPS_PORT 67
23
24 /** BOOTP/DHCP client port */
25 #define BOOTPC_PORT 68
26
27 /** Construct a tag value for an encapsulated option
28  *
29  * This tag value can be passed to Etherboot functions when searching
30  * for DHCP options in order to search for a tag within an
31  * encapsulated options block.
32  */
33 #define DHCP_ENCAP_OPT( encapsulator, encapsulated ) \
34         ( ( (encapsulator) << 8 ) | (encapsulated) )
35 /** Extract encapsulating option block tag from encapsulated tag value */
36 #define DHCP_ENCAPSULATOR( encap_opt ) ( (encap_opt) >> 8 )
37 /** Extract encapsulated option tag from encapsulated tag value */
38 #define DHCP_ENCAPSULATED( encap_opt ) ( (encap_opt) & 0xff )
39 /** Option is encapsulated */
40 #define DHCP_IS_ENCAP_OPT( opt ) DHCP_ENCAPSULATOR( opt )
41
42 /**
43  * @defgroup dhcpopts DHCP option tags
44  * @{
45  */
46
47 /** Padding
48  *
49  * This tag does not have a length field; it is always only a single
50  * byte in length.
51  */
52 #define DHCP_PAD 0
53
54 /** Minimum normal DHCP option */
55 #define DHCP_MIN_OPTION 1
56
57 /** Subnet mask */
58 #define DHCP_SUBNET_MASK 1
59
60 /** Routers */
61 #define DHCP_ROUTERS 3
62
63 /** DNS servers */
64 #define DHCP_DNS_SERVERS 6
65
66 /** Syslog servers */
67 #define DHCP_LOG_SERVERS 7
68
69 /** Host name */
70 #define DHCP_HOST_NAME 12
71
72 /** Domain name */
73 #define DHCP_DOMAIN_NAME 15
74
75 /** Root path */
76 #define DHCP_ROOT_PATH 17
77
78 /** Vendor encapsulated options */
79 #define DHCP_VENDOR_ENCAP 43
80
81 /** Requested IP address */
82 #define DHCP_REQUESTED_ADDRESS 50
83
84 /** Lease time */
85 #define DHCP_LEASE_TIME 51
86
87 /** Option overloading
88  *
89  * The value of this option is the bitwise-OR of zero or more
90  * DHCP_OPTION_OVERLOAD_XXX constants.
91  */
92 #define DHCP_OPTION_OVERLOAD 52
93
94 /** The "file" field is overloaded to contain extra DHCP options */
95 #define DHCP_OPTION_OVERLOAD_FILE 1
96
97 /** The "sname" field is overloaded to contain extra DHCP options */
98 #define DHCP_OPTION_OVERLOAD_SNAME 2
99
100 /** DHCP message type */
101 #define DHCP_MESSAGE_TYPE 53
102 #define DHCPDISCOVER 1
103 #define DHCPOFFER 2
104 #define DHCPREQUEST 3
105 #define DHCPDECLINE 4
106 #define DHCPACK 5
107 #define DHCPNAK 6
108 #define DHCPRELEASE 7
109 #define DHCPINFORM 8
110
111 /** DHCP server identifier */
112 #define DHCP_SERVER_IDENTIFIER 54
113
114 /** Parameter request list */
115 #define DHCP_PARAMETER_REQUEST_LIST 55
116
117 /** Maximum DHCP message size */
118 #define DHCP_MAX_MESSAGE_SIZE 57
119
120 /** Vendor class identifier */
121 #define DHCP_VENDOR_CLASS_ID 60
122
123 /** Client identifier */
124 #define DHCP_CLIENT_ID 61
125
126 /** TFTP server name
127  *
128  * This option replaces the fixed "sname" field, when that field is
129  * used to contain overloaded options.
130  */
131 #define DHCP_TFTP_SERVER_NAME 66
132
133 /** Bootfile name
134  *
135  * This option replaces the fixed "file" field, when that field is
136  * used to contain overloaded options.
137  */
138 #define DHCP_BOOTFILE_NAME 67
139
140 /** Client system architecture */
141 #define DHCP_CLIENT_ARCHITECTURE 93
142
143 /** Client network device interface */
144 #define DHCP_CLIENT_NDI 94
145
146 /** UUID client identifier */
147 #define DHCP_CLIENT_UUID 97
148
149 /** Etherboot-specific encapsulated options
150  *
151  * This encapsulated options field is used to contain all options
152  * specific to Etherboot (i.e. not assigned by IANA or other standards
153  * bodies).
154  */
155 #define DHCP_EB_ENCAP 175
156
157 /** Priority of this options block
158  *
159  * This is a signed 8-bit integer field indicating the priority of
160  * this block of options.  It can be used to specify the relative
161  * priority of multiple option blocks (e.g. options from non-volatile
162  * storage versus options from a DHCP server).
163  */
164 #define DHCP_EB_PRIORITY DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 1 )
165
166 /** "Your" IP address
167  *
168  * This option is used internally to contain the value of the "yiaddr"
169  * field, in order to provide a consistent approach to storing and
170  * processing options.  It should never be present in a DHCP packet.
171  */
172 #define DHCP_EB_YIADDR DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 2 )
173
174 /** "Server" IP address
175  *
176  * This option is used internally to contain the value of the "siaddr"
177  * field, in order to provide a consistent approach to storing and
178  * processing options.  It should never be present in a DHCP packet.
179  */
180 #define DHCP_EB_SIADDR DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 3 )
181
182 /** MAC address
183  *
184  * This option is used internally to contain the network device
185  * hardware address, in order to provide a consistent approach to
186  * storing and processing options.  It should never be present in a
187  * DHCP packet.
188  */
189 #define DHCP_EB_MAC DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 4 )
190
191 /*
192  * Tags in the range 0x10-0x7f are reserved for feature markers
193  *
194  */
195
196 /** Ignore ProxyDHCP
197  *
198  * If set to a non-zero value, gPXE will not wait for ProxyDHCP offers
199  * and will ignore any ProxyDHCP offers that it receives.
200  */
201 #define DHCP_EB_NO_PROXYDHCP DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xb0 )
202
203 /** Network device descriptor
204  *
205  * Byte 0 is the bus type ID; remaining bytes depend on the bus type.
206  *
207  * PCI devices:
208  * Byte 0 : 1 (PCI)
209  * Byte 1 : PCI vendor ID MSB
210  * Byte 2 : PCI vendor ID LSB
211  * Byte 3 : PCI device ID MSB
212  * Byte 4 : PCI device ID LSB
213  */
214 #define DHCP_EB_BUS_ID DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xb1 )
215
216 /** BIOS drive number
217  *
218  * This is the drive number for a drive emulated via INT 13.  0x80 is
219  * the first hard disk, 0x81 is the second hard disk, etc.
220  */
221 #define DHCP_EB_BIOS_DRIVE DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xbd )
222
223 /** Username
224  *
225  * This will be used as the username for any required authentication.
226  * It is expected that this option's value will be held in
227  * non-volatile storage, rather than transmitted as part of a DHCP
228  * packet.
229  */
230 #define DHCP_EB_USERNAME DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xbe )
231
232 /** Password
233  *
234  * This will be used as the password for any required authentication.
235  * It is expected that this option's value will be held in
236  * non-volatile storage, rather than transmitted as part of a DHCP
237  * packet.
238  */
239 #define DHCP_EB_PASSWORD DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xbf )
240
241 /** iSCSI primary target IQN */
242 #define DHCP_ISCSI_PRIMARY_TARGET_IQN 201
243
244 /** iSCSI secondary target IQN */
245 #define DHCP_ISCSI_SECONDARY_TARGET_IQN 202
246
247 /** iSCSI initiator IQN */
248 #define DHCP_ISCSI_INITIATOR_IQN 203
249
250 /** Maximum normal DHCP option */
251 #define DHCP_MAX_OPTION 254
252
253 /** End of options
254  *
255  * This tag does not have a length field; it is always only a single
256  * byte in length.
257  */
258 #define DHCP_END 255
259
260 /** @} */
261
262 /**
263  * Count number of arguments to a variadic macro
264  *
265  * This rather neat, non-iterative solution is courtesy of Laurent
266  * Deniau.
267  *
268  */
269 #define _VA_ARG_COUNT(  _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,          \
270                         _9, _10, _11, _12, _13, _14, _15, _16,          \
271                        _17, _18, _19, _20, _21, _22, _23, _24,          \
272                        _25, _26, _27, _28, _29, _30, _31, _32,          \
273                        _33, _34, _35, _36, _37, _38, _39, _40,          \
274                        _41, _42, _43, _44, _45, _46, _47, _48,          \
275                        _49, _50, _51, _52, _53, _54, _55, _56,          \
276                        _57, _58, _59, _60, _61, _62, _63,   N, ... ) N
277 #define VA_ARG_COUNT( ... )                                             \
278         _VA_ARG_COUNT ( __VA_ARGS__,                                    \
279                         63, 62, 61, 60, 59, 58, 57, 56,                 \
280                         55, 54, 53, 52, 51, 50, 49, 48,                 \
281                         47, 46, 45, 44, 43, 42, 41, 40,                 \
282                         39, 38, 37, 36, 35, 34, 33, 32,                 \
283                         31, 30, 29, 28, 27, 26, 25, 24,                 \
284                         23, 22, 21, 20, 19, 18, 17, 16,                 \
285                         15, 14, 13, 12, 11, 10,  9,  8,                 \
286                          7,  6,  5,  4,  3,  2,  1,  0 )
287
288 /** Construct a DHCP option from a list of bytes */
289 #define DHCP_OPTION( ... ) VA_ARG_COUNT ( __VA_ARGS__ ), __VA_ARGS__
290
291 /** Construct a DHCP option from a list of characters */
292 #define DHCP_STRING( ... ) DHCP_OPTION ( __VA_ARGS__ )
293
294 /** Construct a byte-valued DHCP option */
295 #define DHCP_BYTE( value ) DHCP_OPTION ( value )
296
297 /** Construct a word-valued DHCP option */
298 #define DHCP_WORD( value ) DHCP_OPTION ( ( ( (value) >> 8 ) & 0xff ),   \
299                                          ( ( (value) >> 0 ) & 0xff ) )
300
301 /** Construct a dword-valued DHCP option */
302 #define DHCP_DWORD( value ) DHCP_OPTION ( ( ( (value) >> 24 ) & 0xff ), \
303                                           ( ( (value) >> 16 ) & 0xff ), \
304                                           ( ( (value) >> 8  ) & 0xff ), \
305                                           ( ( (value) >> 0  ) & 0xff ) )
306
307 /** Construct a DHCP encapsulated options field */
308 #define DHCP_ENCAP( ... ) DHCP_OPTION ( __VA_ARGS__, DHCP_END )
309
310 /**
311  * A DHCP option
312  *
313  * DHCP options consist of a mandatory tag, a length field that is
314  * mandatory for all options except @c DHCP_PAD and @c DHCP_END, and a
315  * payload.  
316  */
317 struct dhcp_option {
318         /** Tag
319          *
320          * Must be a @c DHCP_XXX value.
321          */
322         uint8_t tag;
323         /** Length
324          *
325          * This is the length of the data field (i.e. excluding the
326          * tag and length fields).  For the two tags @c DHCP_PAD and
327          * @c DHCP_END, the length field is implicitly zero and is
328          * also missing, i.e. these DHCP options are only a single
329          * byte in length.
330          */
331         uint8_t len;
332         /** Option data */
333         uint8_t data[0];
334 } __attribute__ (( packed ));
335
336 /**
337  * Length of a DHCP option header
338  *
339  * The header is the portion excluding the data, i.e. the tag and the
340  * length.
341  */
342 #define DHCP_OPTION_HEADER_LEN ( offsetof ( struct dhcp_option, data ) )
343
344 /** Maximum length for a single DHCP option */
345 #define DHCP_MAX_LEN 0xff
346
347 /**
348  * A DHCP header
349  *
350  */
351 struct dhcphdr {
352         /** Operation
353          *
354          * This must be either @c BOOTP_REQUEST or @c BOOTP_REPLY.
355          */
356         uint8_t op;
357         /** Hardware address type
358          *
359          * This is an ARPHRD_XXX constant.  Note that ARPHRD_XXX
360          * constants are nominally 16 bits wide; this could be
361          * considered to be a bug in the BOOTP/DHCP specification.
362          */
363         uint8_t htype;
364         /** Hardware address length */
365         uint8_t hlen;
366         /** Number of hops from server */
367         uint8_t hops;
368         /** Transaction ID */
369         uint32_t xid;
370         /** Seconds since start of acquisition */
371         uint16_t secs;
372         /** Flags */
373         uint16_t flags;
374         /** "Client" IP address
375          *
376          * This is filled in if the client already has an IP address
377          * assigned and can respond to ARP requests.
378          */
379         struct in_addr ciaddr;
380         /** "Your" IP address
381          *
382          * This is the IP address assigned by the server to the client.
383          */
384         struct in_addr yiaddr;
385         /** "Server" IP address
386          *
387          * This is the IP address of the next server to be used in the
388          * boot process.
389          */
390         struct in_addr siaddr;
391         /** "Gateway" IP address
392          *
393          * This is the IP address of the DHCP relay agent, if any.
394          */
395         struct in_addr giaddr;
396         /** Client hardware address */
397         uint8_t chaddr[16];
398         /** Server host name (null terminated)
399          *
400          * This field may be overridden and contain DHCP options
401          */
402         char sname[64];
403         /** Boot file name (null terminated)
404          *
405          * This field may be overridden and contain DHCP options
406          */
407         char file[128];
408         /** DHCP magic cookie
409          *
410          * Must have the value @c DHCP_MAGIC_COOKIE.
411          */
412         uint32_t magic;
413         /** DHCP options
414          *
415          * Variable length; extends to the end of the packet.  Minimum
416          * length (for the sake of sanity) is 1, to allow for a single
417          * @c DHCP_END tag.
418          */
419         uint8_t options[0];
420 };
421
422 /** Opcode for a request from client to server */
423 #define BOOTP_REQUEST 1
424
425 /** Opcode for a reply from server to client */
426 #define BOOTP_REPLY 2
427
428 /** BOOTP reply must be broadcast
429  *
430  * Clients that cannot accept unicast BOOTP replies must set this
431  * flag.
432  */
433 #define BOOTP_FL_BROADCAST 0x8000
434
435 /** DHCP magic cookie */
436 #define DHCP_MAGIC_COOKIE 0x63825363UL
437
438 /** DHCP minimum packet length
439  *
440  * This is the mandated minimum packet length that a DHCP participant
441  * must be prepared to receive.
442  */
443 #define DHCP_MIN_LEN 552
444
445 /** Maximum time that we will wait for ProxyDHCP offers */
446 #define PROXYDHCP_WAIT_TIME ( TICKS_PER_SEC * 1 )
447
448 extern int create_dhcp_request ( struct dhcp_packet *dhcppkt,
449                                  struct net_device *netdev, int msgtype,
450                                  struct settings *offer_settings,
451                                  void *data, size_t max_len );
452 extern int create_dhcp_response ( struct dhcp_packet *dhcppkt,
453                                   struct net_device *netdev, int msgtype,
454                                   struct settings *settings,
455                                   void *data, size_t max_len );
456 extern int start_dhcp ( struct job_interface *job, struct net_device *netdev );
457
458 #endif /* _GPXE_DHCP_H */