|
@@ -10,6 +10,7 @@
|
10
|
10
|
#include <stdint.h>
|
11
|
11
|
#include <gpxe/list.h>
|
12
|
12
|
#include <gpxe/in.h>
|
|
13
|
+#include <gpxe/udp.h>
|
13
|
14
|
|
14
|
15
|
/** Construct a tag value for an encapsulated option
|
15
|
16
|
*
|
|
@@ -127,6 +128,54 @@
|
127
|
128
|
|
128
|
129
|
/** @} */
|
129
|
130
|
|
|
131
|
+/**
|
|
132
|
+ * Count number of arguments to a variadic macro
|
|
133
|
+ *
|
|
134
|
+ * This rather neat, non-iterative solution is courtesy of Laurent
|
|
135
|
+ * Deniau.
|
|
136
|
+ *
|
|
137
|
+ */
|
|
138
|
+#define _VA_ARG_COUNT( _1, _2, _3, _4, _5, _6, _7, _8, \
|
|
139
|
+ _9, _10, _11, _12, _13, _14, _15, _16, \
|
|
140
|
+ _17, _18, _19, _20, _21, _22, _23, _24, \
|
|
141
|
+ _25, _26, _27, _28, _29, _30, _31, _32, \
|
|
142
|
+ _33, _34, _35, _36, _37, _38, _39, _40, \
|
|
143
|
+ _41, _42, _43, _44, _45, _46, _47, _48, \
|
|
144
|
+ _49, _50, _51, _52, _53, _54, _55, _56, \
|
|
145
|
+ _57, _58, _59, _60, _61, _62, _63, N, ... ) N
|
|
146
|
+#define VA_ARG_COUNT( ... ) \
|
|
147
|
+ _VA_ARG_COUNT ( __VA_ARGS__, \
|
|
148
|
+ 63, 62, 61, 60, 59, 58, 57, 56, \
|
|
149
|
+ 55, 54, 53, 52, 51, 50, 49, 48, \
|
|
150
|
+ 47, 46, 45, 44, 43, 42, 41, 40, \
|
|
151
|
+ 39, 38, 37, 36, 35, 34, 33, 32, \
|
|
152
|
+ 31, 30, 29, 28, 27, 26, 25, 24, \
|
|
153
|
+ 23, 22, 21, 20, 19, 18, 17, 16, \
|
|
154
|
+ 15, 14, 13, 12, 11, 10, 9, 8, \
|
|
155
|
+ 7, 6, 5, 4, 3, 2, 1, 0 )
|
|
156
|
+
|
|
157
|
+/** Construct a DHCP option from a list of bytes */
|
|
158
|
+#define DHCP_OPTION( ... ) VA_ARG_COUNT ( __VA_ARGS__ ), __VA_ARGS__
|
|
159
|
+
|
|
160
|
+/** Construct a DHCP option from a list of characters */
|
|
161
|
+#define DHCP_STRING( ... ) DHCP_OPTION ( __VA_ARGS__ )
|
|
162
|
+
|
|
163
|
+/** Construct a byte-valued DHCP option */
|
|
164
|
+#define DHCP_BYTE( value ) DHCP_OPTION ( value )
|
|
165
|
+
|
|
166
|
+/** Construct a word-valued DHCP option */
|
|
167
|
+#define DHCP_WORD( value ) DHCP_OPTION ( ( ( (value) >> 8 ) & 0xff ), \
|
|
168
|
+ ( ( (value) >> 0 ) & 0xff ) )
|
|
169
|
+
|
|
170
|
+/** Construct a dword-valued DHCP option */
|
|
171
|
+#define DHCP_DWORD( value ) DHCP_OPTION ( ( ( (value) >> 24 ) & 0xff ), \
|
|
172
|
+ ( ( (value) >> 16 ) & 0xff ), \
|
|
173
|
+ ( ( (value) >> 8 ) & 0xff ), \
|
|
174
|
+ ( ( (value) >> 0 ) & 0xff ) )
|
|
175
|
+
|
|
176
|
+/** Construct a DHCP encapsulated options field */
|
|
177
|
+#define DHCP_ENCAP( ... ) DHCP_OPTION ( __VA_ARGS__, DHCP_END )
|
|
178
|
+
|
130
|
179
|
/**
|
131
|
180
|
* A DHCP option
|
132
|
181
|
*
|
|
@@ -313,12 +362,23 @@ struct dhcp_packet {
|
313
|
362
|
|
314
|
363
|
/** A DHCP session */
|
315
|
364
|
struct dhcp_session {
|
|
365
|
+ /** UDP connection for this session */
|
|
366
|
+ struct udp_connection udp;
|
|
367
|
+
|
|
368
|
+ /** State of the session
|
|
369
|
+ *
|
|
370
|
+ * This is a value for the @c DHCP_MESSAGE_TYPE option
|
|
371
|
+ * (e.g. @c DHCPDISCOVER).
|
|
372
|
+ */
|
|
373
|
+ int state;
|
|
374
|
+
|
316
|
375
|
/** Network device being configured */
|
317
|
376
|
struct net_device *netdev;
|
318
|
377
|
/** Transaction ID, in network-endian order */
|
319
|
378
|
uint32_t xid;
|
320
|
379
|
};
|
321
|
380
|
|
|
381
|
+extern const struct dhcp_option_block dhcp_request_options;
|
322
|
382
|
extern unsigned long dhcp_num_option ( struct dhcp_option *option );
|
323
|
383
|
extern struct dhcp_option *
|
324
|
384
|
find_dhcp_option ( struct dhcp_option_block *options, unsigned int tag );
|