NetBurner 3.5.0
PDF Version
 
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
13namespace NB
14{
15namespace V6
16{
17namespace DHCPv6
18{
19typedef 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
45typedef 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
151typedef 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
168struct 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
176typedef 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
184struct DUID
185{
186 beuint16_t type;
187} __attribute__((packed));
188
189struct DUID_LLT : public DUID
190{
191 beuint16_t hardwareType;
192 beuint32_t time;
193 uint8_t llAddr[];
194} __attribute__((packed));
195
196struct DUID_EN : public DUID
197{
198 beuint32_t enterpriseNum;
199 uint8_t ID[];
200} __attribute__((packed));
201
202struct 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
209struct DHCP_Message
210{
211 beuint32_t typeAndXid;
212 Option opts[];
213
214 Option *GetOption(Option_ID optID, Option *lastOpt = NULL);
215} __attribute__((packed));
216
217namespace Opt
218{
219struct BaseOption : public Option
220{
221 uint8_t data[];
222} __attribute__((packed));
223
224struct ClientServerID : public Option
225{
226 DUID duid;
227} __attribute__((packed));
228
229struct 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
239struct 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
247struct 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
265struct ORO : public Option
266{
267 beuint16_t ReqOptCode[];
268} __attribute__((packed));
269
270struct Pref : public Option
271{
272 uint8_t prefVal;
273} __attribute__((packed));
274
275struct ElapsedTime : public Option
276{
277 beuint16_t elapsed;
278} __attribute__((packed));
279
280struct RelayMsg : public Option
281{
282 uint8_t relayMsg[];
283} __attribute__((packed));
284
285struct 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
294struct Unicast : public Option
295{
296 IPADDR6 ServerAddr;
297} __attribute__((packed));
298
299struct StatusMsg : public Option
300{
301 beuint16_t statusCode;
302 uint8_t statusMsg[]; // UTF-8 string, NON NULL-TERMINATED!!!
303} __attribute__((packed));
304
305struct RapidCommit : public Option
306{
307 // empty
308} __attribute__((packed));
309
310struct 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
320struct 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
331struct VendorOpts : public Option
332{
333 beuint32_t enterpriseNum;
334 Option opts[];
335} __attribute__((packed));
336
337struct InterfaceID : public Option
338{
339 uint8_t interfaceID[]; // arbitrary len ID
340} __attribute__((packed));
341
342struct ReconfMsg : public Option
343{
344 beuint16_t msgType;
345} __attribute__((packed));
346
347struct ReconfAccept : public Option
348{
349 // empty
350} __attribute__((packed));
351
352struct DNS_Servers : public Option
353{
354 IPADDR6 nameServer[];
355} __attribute__((packed));
356
357struct DomainList : public Option
358{
359 uint8_t searchList[];
360} __attribute__((packed));
361
362struct InfoRefreshTime : public Option
363{
364 beuint32_t refreshTime;
365};
366
367// FullyQualifiedDomainName RFC 4704
368struct 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
379void 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:41
@ Option
Option.
Definition nbWifiConstants.h:385
NetBurner IPADDR4 Class. See the IPADDR4 Class page for complete documentation.