NetBurner 3.1
dhcpv6_msg.h
1 /*NB_REVISION*/
2 
3 /*NB_COPYRIGHT*/
4 
5 #ifndef __DHCPV6_MSG_H
6 #define __DHCPV6_MSG_H
7 
8 #include <constants.h>
9 #include <nettypes.h>
10 
11 // See RFC 3315 for all struct definitions
12 
13 namespace NB
14 {
15 namespace V6
16 {
17 namespace DHCPv6
18 {
19 typedef enum
20 {
21  MSG_SOLICIT = 1,
22  MSG_ADVERTISE = 2,
23  MSG_REQUEST = 3,
24  MSG_CONFIRM = 4,
25  MSG_RENEW = 5,
26  MSG_REBIND = 6,
27  MSG_REPLY = 7,
28  MSG_RELEASE = 8,
29  MSG_DECLINE = 9,
30  MSG_RECONF = 10,
31  MSG_INFO_REQ = 11,
32  MSG_RELAY_FORW = 12,
33  MSG_RELAY_REPL = 13,
34  MSG_LEASEQUERY = 14,
35  MSG_LEASEQUERY_REPLY = 15,
36  MSG_LEASEQUERY_DONE = 16,
37  MSG_LEASEQUERY_DATA = 17,
38  MSG_RECONFIGURE_REQUEST = 18,
39  MSG_RECONFIGURE_REPLY = 19,
40  MSG_DHCPV4_QUERY = 20,
41  MSG_DHCPV4_RESPONSE = 21,
42  MSG_FORCE_16BIT = 0xFFFF
43 } MessageType;
44 
45 typedef enum
46 {
47  OPT_NULL = 0,
48  OPT_CLIENTID = 1,
49  OPT_SERVERID = 2,
50  OPT_IA_NA = 3,
51  OPT_IA_TA = 4,
52  OPT_IA_ADDR = 5,
53  OPT_ORO = 6,
54  OPT_PREFERENCE = 7,
55  OPT_ELAPSED_TIME = 8,
56  OPT_RELAY_MSG = 9,
57  OPT_AUTH = 11,
58  OPT_UNICAST = 12,
59  OPT_STATUS_CODE = 13,
60  OPT_RAPID_COMMIT = 14,
61  OPT_USER_CLASS = 15,
62  OPT_VENDOR_CLASS = 16,
63  OPT_VENDOR_OPTS = 17,
64  OPT_INTERFACEID = 18,
65  OPT_RECONF_MSG = 19,
66  OPT_RECONF_ACCEPT = 20,
67  OPT_SIP_SERVER_D = 21,
68  OPT_SIP_SERVER_A = 22,
69  OPT_DNS_SERVERS = 23,
70  OPT_DOMAIN_LIST = 24,
71  OPT_IA_PD = 25,
72  OPT_IA_PREFIX = 26,
73  OPT_NIS_SERVERS = 27,
74  OPT_NISP_SERVERS = 28,
75  OPT_NIS_DOMAIN_NAME = 29,
76  OPT_NISP_DOMAIN_NAME = 30,
77  OPT_SNTP_SERVERS = 31,
78  OPT_INFORMATION_REFRESH_TIME = 32,
79  OPT_BCMCS_SERVER_D = 33,
80  OPT_BCMCS_SERVER_A = 34,
81  OPT_GEOCONF_CIVIC = 36,
82  OPT_REMOTE_ID = 37,
83  OPT_SUBSCRIBER_ID = 38,
84  OPT_CLIENT_FQDN = 39,
85  OPT_PANA_AGENT = 40,
86  OPT_NEW_POSIX_TIMEZONE = 41,
87  OPT_NEW_TZDB_TIMEZONE = 42,
88  OPT_ERO = 43,
89  OPT_LQ_QUERY = 44,
90  OPT_CLIENT_DATA = 45,
91  OPT_CLT_TIME = 46,
92  OPT_LQ_RELAY_DATA = 47,
93  OPT_LQ_CLIENT_LINK = 48,
94  OPT_MIP6_HNIDF = 49,
95  OPT_MIP6_VDINF = 50,
96  OPT_V6_LOST = 51,
97  OPT_CAPWAP_AC_V6 = 52,
98  OPT_RELAY_ID = 53,
99  OPT_IPv6_Address_MoS = 54,
100  OPT_IPv6_FQDN_MoS = 55,
101  OPT_NTP_SERVER = 56,
102  OPT_V6_ACCESS_DOMAIN = 57,
103  OPT_SIP_UA_CS_LIST = 58,
104  OPT_BOOTFILE_URL = 59,
105  OPT_BOOTFILE_PARAM = 60,
106  OPT_CLIENT_ARCH_TYPE = 61,
107  OPT_NII = 62,
108  OPT_GEOLOCATION = 63,
109  OPT_AFTR_NAME = 64,
110  OPT_ERP_LOCAL_DOMAIN_NAME = 65,
111  OPT_RSOO = 66,
112  OPT_PD_EXCLUDE = 67,
113  OPT_VSS = 68,
114  OPT_MIP6_IDINF = 69,
115  OPT_MIP6_UDINF = 70,
116  OPT_MIP6_HNP = 71,
117  OPT_MIP6_HAA = 72,
118  OPT_MIP6_HAF = 73,
119  OPT_RDNSS_SELECTION = 74,
120  OPT_KRB_PRINCIPAL_NAME = 75,
121  OPT_KRB_REALM_NAME = 76,
122  OPT_KRB_DEFAULT_REALM_NAME = 77,
123  OPT_KRB_KDC = 78,
124  OPT_CLIENT_LINKLAYER_ADDR = 79,
125  OPT_LINK_ADDRESS = 80,
126  OPT_RADIUS = 81,
127  OPT_SOL_MAX_RT = 82,
128  OPT_INF_MAX_RT = 83,
129  OPT_ADDRSEL = 84,
130  OPT_ADDRSEL_TABLE = 85,
131  OPT_V6_PCP_SERVER = 86,
132  OPT_DHCPV4_MSG = 87,
133  OPT_DHCP4_O_DHCP6_SERVER = 88,
134  OPT_S46_RULE = 89,
135  OPT_S46_BR = 90,
136  OPT_S46_DMR = 91,
137  OPT_S46_V4V6BIND = 92,
138  OPT_S46_PORTPARAMS = 93,
139  OPT_S46_CONT_MAPE = 94,
140  OPT_S46_CONT_MAPT = 95,
141  OPT_S46_CONT_LW = 96,
142  OPT_4RD = 97,
143  OPT_4RD_MAP_RULE = 98,
144  OPT_4RD_NON_MAP_RULE = 99,
145  OPT_LQ_BASE_TIME = 100,
146  OPT_LQ_START_TIME = 101,
147  OPT_LQ_END_TIME = 102,
148  OPT_FORCE_16BIT = 0xFFFF
149 } Option_ID;
150 
151 typedef enum
152 {
153  STATUS_SUCCESS = 0,
154  STATUS_UNSPEC_FAIL = 1,
155  STATUS_NO_ADDRS_AVAIL = 2,
156  STATUS_NO_BINDING = 3,
157  STATUS_NOT_ON_LINK = 4,
158  STATUS_USE_MULTICAST = 5,
159  STATUS_NO_PREFIX_AVAIL = 6,
160  STATUS_UNKNOWN_QUERY_TYPE = 7,
161  STATUS_MALFORMED_QUERY = 8,
162  STATUS_NOT_CONFIGURED = 9,
163  STATUS_NOT_ALLOWED = 10,
164  STATUS_QUERY_TERMINATED = 11,
165  STATUS_FORCE_16_BIT = 0xFFFF
166 } StatusCode;
167 
168 struct Option
169 {
170  beuint16_t id;
171  beuint16_t len;
172 
173  inline Option *GetNext() { return (Option *)(((uint8_t *)this) + len + sizeof(Option)); }
174 } __attribute__((packed));
175 
176 typedef enum
177 {
178  DUID_TYPE_LLT = 1,
179  DUID_TYPE_EN = 2,
180  DUID_TYPE_LL = 3,
181  DUID_TYPE_FORCE_16BIT = 0xFFFF
182 } DUID_Types;
183 
184 struct DUID
185 {
186  beuint16_t type;
187 } __attribute__((packed));
188 
189 struct DUID_LLT : public DUID
190 {
191  beuint16_t hardwareType;
192  beuint32_t time;
193  uint8_t llAddr[];
194 } __attribute__((packed));
195 
196 struct DUID_EN : public DUID
197 {
198  beuint32_t enterpriseNum;
199  uint8_t ID[];
200 } __attribute__((packed));
201 
202 struct DUID_LL : public DUID
203 {
204  beuint16_t hardwareType;
205  uint8_t llAddr[];
206 } __attribute__((packed));
207 
208 // RFC 3315.6 Client/Server messages, pg. 17
209 struct DHCP_Message
210 {
211  beuint32_t typeAndXid;
212  Option opts[];
213 
214  Option *GetOption(Option_ID optID, Option *lastOpt = NULL);
215 } __attribute__((packed));
216 
217 namespace Opt
218 {
219 struct BaseOption : public Option
220 {
221  uint8_t data[];
222 } __attribute__((packed));
223 
224 struct ClientServerID : public Option
225 {
226  DUID duid;
227 } __attribute__((packed));
228 
229 struct IA_NA : public Option
230 {
231  beuint32_t IAID;
232  beuint32_t T1;
233  beuint32_t T2;
234  Option opts[];
235 
236  Option *GetOption(Option_ID optID, Option *lastOpt = NULL);
237 } __attribute__((packed));
238 
239 struct IA_TA : public Option
240 {
241  beuint32_t IAID;
242  Option opts[];
243 
244  Option *GetOption(Option_ID optID, Option *lastOpt = NULL);
245 } __attribute__((packed));
246 
247 struct IA_ADDR : public Option
248 {
249  IPADDR6 addr;
250  beuint32_t preferred;
251  beuint32_t valid;
252  Option opts[];
253 
254  inline IA_ADDR(IPADDR6 ip, uint32_t pref = 0, uint32_t val = 0) : addr(ip), preferred(pref), valid(val)
255  {
256  id = OPT_IA_ADDR;
257  len = sizeof(IA_ADDR) - sizeof(Option);
258  }
259 
260  inline bool ServerIsInvalidating() { return (preferred == 0) && (valid == 0); }
261 
262  Option *GetOption(Option_ID optID, Option *lastOpt = NULL);
263 } __attribute__((packed));
264 
265 struct ORO : public Option
266 {
267  beuint16_t ReqOptCode[];
268 } __attribute__((packed));
269 
270 struct Pref : public Option
271 {
272  uint8_t prefVal;
273 } __attribute__((packed));
274 
275 struct ElapsedTime : public Option
276 {
277  beuint16_t elapsed;
278 } __attribute__((packed));
279 
280 struct RelayMsg : public Option
281 {
282  uint8_t relayMsg[];
283 } __attribute__((packed));
284 
285 struct Auth : public Option
286 {
287  uint8_t protocol;
288  uint8_t alg;
289  uint8_t RDM;
290  uint8_t replay;
291  uint8_t authInfo[];
292 } __attribute__((packed));
293 
294 struct Unicast : public Option
295 {
296  IPADDR6 ServerAddr;
297 } __attribute__((packed));
298 
299 struct StatusMsg : public Option
300 {
301  beuint16_t statusCode;
302  uint8_t statusMsg[]; // UTF-8 string, NON NULL-TERMINATED!!!
303 } __attribute__((packed));
304 
305 struct RapidCommit : public Option
306 {
307  // empty
308 } __attribute__((packed));
309 
310 struct UserClass : public Option
311 {
312  struct ClassData
313  {
314  beuint16_t classLen;
315  uint8_t data[];
316  } __attribute__((packed));
317  ClassData data[];
318 } __attribute__((packed));
319 
320 struct VendorClass : public Option
321 {
322  struct ClassData
323  {
324  beuint16_t classLen;
325  uint8_t data[];
326  } __attribute__((packed));
327  beuint32_t enterpriseNum;
328  ClassData data[];
329 } __attribute__((packed));
330 
331 struct VendorOpts : public Option
332 {
333  beuint32_t enterpriseNum;
334  Option opts[];
335 } __attribute__((packed));
336 
337 struct InterfaceID : public Option
338 {
339  uint8_t interfaceID[]; // arbitrary len ID
340 } __attribute__((packed));
341 
342 struct ReconfMsg : public Option
343 {
344  beuint16_t msgType;
345 } __attribute__((packed));
346 
347 struct ReconfAccept : public Option
348 {
349  // empty
350 } __attribute__((packed));
351 
352 struct DNS_Servers : public Option
353 {
354  IPADDR6 nameServer[];
355 } __attribute__((packed));
356 
357 struct DomainList : public Option
358 {
359  uint8_t searchList[];
360 } __attribute__((packed));
361 
362 struct InfoRefreshTime : public Option
363 {
364  beuint32_t refreshTime;
365 };
366 
367 // FullyQualifiedDomainName RFC 4704
368 struct FQDN : public Option
369 {
370  uint8_t flags;
371  uint8_t namelen;
372  char name[];
373  // inline FQDN(uint32_t namelen = 0)
374  // : flags(0x00)
375  // {id = OPT_CLIENT_FQDN; len = namelen + 1;}
376 };
377 
378 } // namespace Opt
379 void ShowOption(int lvl, Option *opt);
380 } // namespace DHCPv6
381 } // namespace V6
382 } // namespace NB
383 
384 #endif /* ----- #ifndef __DHCPV6_MSG_H ----- */
Used to hold and manipulate IPv4 and IPv6 addresses in dual stack mode.
Definition: ipv6_addr.h:28
Definition: dhcpv6_internal.h:34
#define NULL
Definition: nm_bsp.h:76
Option.
Definition: nbWifiConstants.h:348