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