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