1 // Copyright (C) 2012-2021 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef STD_OPTION_DEFS_H
8 #define STD_OPTION_DEFS_H
9 
10 #include <dhcp/option_data_types.h>
11 #include <dhcp/dhcp4.h>
12 #include <dhcp/dhcp6.h>
13 #include <dhcp/option_space.h>
14 
15 /// @brief global std option spaces
16 #define DHCP4_OPTION_SPACE               "dhcp4"
17 #define DHCP6_OPTION_SPACE               "dhcp6"
18 #define ISC_V6_OPTION_SPACE              "4o6"
19 #define MAPE_V6_OPTION_SPACE             "s46-cont-mape-options"
20 #define MAPT_V6_OPTION_SPACE             "s46-cont-mapt-options"
21 #define LW_V6_OPTION_SPACE               "s46-cont-lw-options"
22 #define V4V6_RULE_OPTION_SPACE           "s46-rule-options"
23 #define V4V6_BIND_OPTION_SPACE           "s46-v4v6bind-options"
24 #define LAST_RESORT_V4_OPTION_SPACE      "last-resort-v4"
25 
26 /// @brief encapsulated option spaces
27 #define DHCP_AGENT_OPTION_SPACE          "dhcp-agent-options-space"
28 #define VENDOR_ENCAPSULATED_OPTION_SPACE "vendor-encapsulated-options-space"
29 
30 // NOTE:
31 // When adding a new space, make sure you also update
32 // src/lib/yang/adaptor_option.cc
33 
34 namespace isc {
35 namespace dhcp {
36 
37 namespace {
38 
39 /// @brief Declare an array holding parameters used to create instance
40 /// of a definition for option comprising a record of data fields.
41 ///
42 /// @param name name of the array being declared.
43 #ifndef RECORD_DECL
44 #define RECORD_DECL(name, ...) const OptionDataType name[] = { __VA_ARGS__ }
45 #endif
46 
47 /// @brief A pair of values: one pointing to the array holding types of
48 /// data fields belonging to the record, and size of this array.
49 ///
50 /// @param name name of the array holding data fields' types.
51 #ifndef RECORD_DEF
52 #define RECORD_DEF(name) name, sizeof(name) / sizeof(name[0])
53 #endif
54 
55 #ifndef NO_RECORD_DEF
56 #define NO_RECORD_DEF 0, 0
57 #endif
58 
59 // SLP Directory Agent option.
60 RECORD_DECL(DIRECTORY_AGENT_RECORDS, OPT_BOOLEAN_TYPE, OPT_IPV4_ADDRESS_TYPE);
61 
62 // SLP Service Scope option.
63 //
64 // The scope list is optional.
65 RECORD_DECL(SERVICE_SCOPE_RECORDS, OPT_BOOLEAN_TYPE, OPT_STRING_TYPE);
66 
67 // fqdn option record fields.
68 //
69 // Note that the flags field indicates the type of domain
70 // name encoding. There is a choice between deprecated
71 // ASCII encoding and compressed encoding described in
72 // RFC 1035, section 3.1. The latter could be handled
73 // by OPT_FQDN_TYPE but we can't use it here because
74 // clients may request ASCII encoding.
75 RECORD_DECL(FQDN_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
76             OPT_FQDN_TYPE);
77 
78 // V-I Vendor Class record fields.
79 //
80 // Opaque data is represented here by the binary data field.
81 RECORD_DECL(VIVCO_RECORDS, OPT_UINT32_TYPE, OPT_BINARY_TYPE);
82 
83 // RFC4578 (PXE) record fields
84 //
85 // Three 1 byte fields to describe a network interface: type, major and minor
86 RECORD_DECL(CLIENT_NDI_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE);
87 // A client identifier: a 1 byte type field followed by opaque data depending on the type
88 RECORD_DECL(UUID_GUID_RECORDS, OPT_UINT8_TYPE, OPT_BINARY_TYPE);
89 
90 // RFC6731 DHCPv4 Recursive DNS Server Selection option.
91 //
92 // Flag, two addresses and domain list
93 RECORD_DECL(V4_RDNSS_SELECT_RECORDS, OPT_UINT8_TYPE, OPT_IPV4_ADDRESS_TYPE,
94             OPT_IPV4_ADDRESS_TYPE, OPT_FQDN_TYPE);
95 
96 // RFC7618 DHCPv4 Port Parameter option.
97 //
98 // PSID offset, PSID-len and PSID
99 RECORD_DECL(V4_PORTPARAMS_RECORDS, OPT_UINT8_TYPE, OPT_PSID_TYPE);
100 
101 // RFC5969 DHCPv6 6RD option.
102 //
103 // two 8 bit lengthes, an IPv6 address and one or more IPv4 addresses
104 RECORD_DECL(OPT_6RD_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
105             OPT_IPV6_ADDRESS_TYPE, OPT_IPV4_ADDRESS_TYPE);
106 
107 /// @brief Definitions of standard DHCPv4 options.
108 const OptionDefParams STANDARD_V4_OPTION_DEFINITIONS[] = {
109     { "subnet-mask", DHO_SUBNET_MASK, DHCP4_OPTION_SPACE,
110       OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
111     { "time-offset", DHO_TIME_OFFSET, DHCP4_OPTION_SPACE, OPT_INT32_TYPE,
112       false, NO_RECORD_DEF, "" },
113     { "routers", DHO_ROUTERS, DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE, true,
114       NO_RECORD_DEF, "" },
115     { "time-servers", DHO_TIME_SERVERS, DHCP4_OPTION_SPACE,
116       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
117     { "name-servers", DHO_NAME_SERVERS, DHCP4_OPTION_SPACE,
118       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
119     { "domain-name-servers", DHO_DOMAIN_NAME_SERVERS, DHCP4_OPTION_SPACE,
120       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
121     { "log-servers", DHO_LOG_SERVERS, DHCP4_OPTION_SPACE,
122       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
123     { "cookie-servers", DHO_COOKIE_SERVERS, DHCP4_OPTION_SPACE,
124       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
125     { "lpr-servers", DHO_LPR_SERVERS, DHCP4_OPTION_SPACE,
126       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
127     { "impress-servers", DHO_IMPRESS_SERVERS, DHCP4_OPTION_SPACE,
128       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
129     { "resource-location-servers", DHO_RESOURCE_LOCATION_SERVERS,
130       DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
131     { "host-name", DHO_HOST_NAME, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
132       NO_RECORD_DEF, "" },
133     { "boot-size", DHO_BOOT_SIZE, DHCP4_OPTION_SPACE, OPT_UINT16_TYPE, false,
134       NO_RECORD_DEF, "" },
135     { "merit-dump", DHO_MERIT_DUMP, DHCP4_OPTION_SPACE, OPT_STRING_TYPE,
136       false, NO_RECORD_DEF, "" },
137     { "domain-name", DHO_DOMAIN_NAME, DHCP4_OPTION_SPACE, OPT_STRING_TYPE,
138       false, NO_RECORD_DEF, "" },
139     { "swap-server", DHO_SWAP_SERVER, DHCP4_OPTION_SPACE,
140       OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
141     { "root-path", DHO_ROOT_PATH, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
142       NO_RECORD_DEF, "" },
143     { "extensions-path", DHO_EXTENSIONS_PATH, DHCP4_OPTION_SPACE,
144       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
145     { "ip-forwarding", DHO_IP_FORWARDING, DHCP4_OPTION_SPACE, OPT_BOOLEAN_TYPE,
146       false, NO_RECORD_DEF, "" },
147     { "non-local-source-routing", DHO_NON_LOCAL_SOURCE_ROUTING,
148       DHCP4_OPTION_SPACE, OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
149     { "policy-filter", DHO_POLICY_FILTER, DHCP4_OPTION_SPACE,
150       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
151     { "max-dgram-reassembly", DHO_MAX_DGRAM_REASSEMBLY, DHCP4_OPTION_SPACE,
152       OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
153     { "default-ip-ttl", DHO_DEFAULT_IP_TTL, DHCP4_OPTION_SPACE, OPT_UINT8_TYPE,
154       false, NO_RECORD_DEF, "" },
155     { "path-mtu-aging-timeout", DHO_PATH_MTU_AGING_TIMEOUT, DHCP4_OPTION_SPACE,
156       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
157     { "path-mtu-plateau-table", DHO_PATH_MTU_PLATEAU_TABLE, DHCP4_OPTION_SPACE,
158       OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
159     { "interface-mtu", DHO_INTERFACE_MTU, DHCP4_OPTION_SPACE, OPT_UINT16_TYPE,
160       false, NO_RECORD_DEF, "" },
161     { "all-subnets-local", DHO_ALL_SUBNETS_LOCAL, DHCP4_OPTION_SPACE,
162       OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
163     { "broadcast-address", DHO_BROADCAST_ADDRESS, DHCP4_OPTION_SPACE,
164       OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
165     { "perform-mask-discovery", DHO_PERFORM_MASK_DISCOVERY, DHCP4_OPTION_SPACE,
166       OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
167     { "mask-supplier", DHO_MASK_SUPPLIER, DHCP4_OPTION_SPACE, OPT_BOOLEAN_TYPE,
168       false, NO_RECORD_DEF, "" },
169     { "router-discovery", DHO_ROUTER_DISCOVERY, DHCP4_OPTION_SPACE,
170       OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
171     { "router-solicitation-address", DHO_ROUTER_SOLICITATION_ADDRESS,
172       DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
173     { "static-routes", DHO_STATIC_ROUTES, DHCP4_OPTION_SPACE,
174       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
175     { "trailer-encapsulation", DHO_TRAILER_ENCAPSULATION, DHCP4_OPTION_SPACE,
176       OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
177     { "arp-cache-timeout", DHO_ARP_CACHE_TIMEOUT, DHCP4_OPTION_SPACE,
178       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
179     { "ieee802-3-encapsulation", DHO_IEEE802_3_ENCAPSULATION,
180       DHCP4_OPTION_SPACE, OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
181     { "default-tcp-ttl", DHO_DEFAULT_TCP_TTL, DHCP4_OPTION_SPACE,
182       OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
183     { "tcp-keepalive-interval", DHO_TCP_KEEPALIVE_INTERVAL, DHCP4_OPTION_SPACE,
184       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
185     { "tcp-keepalive-garbage", DHO_TCP_KEEPALIVE_GARBAGE, DHCP4_OPTION_SPACE,
186       OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
187     { "nis-domain", DHO_NIS_DOMAIN, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
188       NO_RECORD_DEF, "" },
189     { "nis-servers", DHO_NIS_SERVERS, DHCP4_OPTION_SPACE,
190       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
191     { "ntp-servers", DHO_NTP_SERVERS, DHCP4_OPTION_SPACE,
192       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
193     /// vendor-encapsulated-options (43) is deferred
194     { "netbios-name-servers", DHO_NETBIOS_NAME_SERVERS, DHCP4_OPTION_SPACE,
195       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
196     { "netbios-dd-server", DHO_NETBIOS_DD_SERVER, DHCP4_OPTION_SPACE,
197       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
198     { "netbios-node-type", DHO_NETBIOS_NODE_TYPE, DHCP4_OPTION_SPACE,
199       OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
200     { "netbios-scope", DHO_NETBIOS_SCOPE, DHCP4_OPTION_SPACE, OPT_STRING_TYPE,
201       false, NO_RECORD_DEF, "" },
202     { "font-servers", DHO_FONT_SERVERS, DHCP4_OPTION_SPACE,
203       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
204     { "x-display-manager", DHO_X_DISPLAY_MANAGER, DHCP4_OPTION_SPACE,
205       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
206     { "dhcp-requested-address", DHO_DHCP_REQUESTED_ADDRESS, DHCP4_OPTION_SPACE,
207       OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
208     { "dhcp-lease-time", DHO_DHCP_LEASE_TIME, DHCP4_OPTION_SPACE,
209       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
210     { "dhcp-option-overload", DHO_DHCP_OPTION_OVERLOAD, DHCP4_OPTION_SPACE,
211       OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
212     { "dhcp-message-type", DHO_DHCP_MESSAGE_TYPE, DHCP4_OPTION_SPACE,
213       OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
214     { "dhcp-server-identifier", DHO_DHCP_SERVER_IDENTIFIER, DHCP4_OPTION_SPACE,
215       OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
216     { "dhcp-parameter-request-list", DHO_DHCP_PARAMETER_REQUEST_LIST,
217       DHCP4_OPTION_SPACE, OPT_UINT8_TYPE, true, NO_RECORD_DEF, "" },
218     { "dhcp-message", DHO_DHCP_MESSAGE, DHCP4_OPTION_SPACE, OPT_STRING_TYPE,
219       false, NO_RECORD_DEF, "" },
220     { "dhcp-max-message-size", DHO_DHCP_MAX_MESSAGE_SIZE, DHCP4_OPTION_SPACE,
221       OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
222     { "dhcp-renewal-time", DHO_DHCP_RENEWAL_TIME, DHCP4_OPTION_SPACE,
223       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
224     { "dhcp-rebinding-time", DHO_DHCP_REBINDING_TIME, DHCP4_OPTION_SPACE,
225       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
226     { "vendor-class-identifier", DHO_VENDOR_CLASS_IDENTIFIER,
227       DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
228     { "dhcp-client-identifier", DHO_DHCP_CLIENT_IDENTIFIER, DHCP4_OPTION_SPACE,
229       OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
230     { "nwip-domain-name", DHO_NWIP_DOMAIN_NAME, DHCP4_OPTION_SPACE,
231       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
232     { "nwip-suboptions", DHO_NWIP_SUBOPTIONS, DHCP4_OPTION_SPACE,
233       OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
234     { "nisplus-domain-name", DHO_NISP_DOMAIN_NAME, DHCP4_OPTION_SPACE,
235       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
236     { "nisplus-servers", DHO_NISP_SERVER_ADDR, DHCP4_OPTION_SPACE,
237       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
238     { "tftp-server-name", DHO_TFTP_SERVER_NAME, DHCP4_OPTION_SPACE,
239       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
240     { "boot-file-name", DHO_BOOT_FILE_NAME, DHCP4_OPTION_SPACE,
241       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
242     { "mobile-ip-home-agent", DHO_HOME_AGENT_ADDRS, DHCP4_OPTION_SPACE,
243       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
244     { "smtp-server", DHO_SMTP_SERVER, DHCP4_OPTION_SPACE,
245       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
246     { "pop-server", DHO_POP3_SERVER, DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE,
247       true, NO_RECORD_DEF, "" },
248     { "nntp-server", DHO_NNTP_SERVER, DHCP4_OPTION_SPACE,
249       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
250     { "www-server", DHO_WWW_SERVER, DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE,
251       true, NO_RECORD_DEF, "" },
252     { "finger-server", DHO_FINGER_SERVER, DHCP4_OPTION_SPACE,
253       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
254     { "irc-server", DHO_IRC_SERVER, DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE,
255       true, NO_RECORD_DEF, "" },
256     { "streettalk-server", DHO_STREETTALK_SERVER, DHCP4_OPTION_SPACE,
257       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
258     { "streettalk-directory-assistance-server", DHO_STDASERVER,
259       DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
260     { "user-class", DHO_USER_CLASS, DHCP4_OPTION_SPACE, OPT_BINARY_TYPE, false,
261       NO_RECORD_DEF, "" },
262     { "slp-directory-agent", DHO_DIRECTORY_AGENT, DHCP4_OPTION_SPACE,
263       OPT_RECORD_TYPE, true, RECORD_DEF(DIRECTORY_AGENT_RECORDS), "" },
264     { "slp-service-scope", DHO_SERVICE_SCOPE, DHCP4_OPTION_SPACE,
265       OPT_RECORD_TYPE, false, RECORD_DEF(SERVICE_SCOPE_RECORDS), "" },
266     { "fqdn", DHO_FQDN, DHCP4_OPTION_SPACE, OPT_RECORD_TYPE, false,
267       RECORD_DEF(FQDN_RECORDS), "" },
268     { "dhcp-agent-options", DHO_DHCP_AGENT_OPTIONS, DHCP4_OPTION_SPACE,
269       OPT_EMPTY_TYPE, false, NO_RECORD_DEF, DHCP_AGENT_OPTION_SPACE },
270     { "nds-servers", DHO_NDS_SERVERS, DHCP4_OPTION_SPACE,
271       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
272     { "nds-tree-name", DHO_NDS_TREE_NAME, DHCP4_OPTION_SPACE, OPT_STRING_TYPE,
273       false, NO_RECORD_DEF, "" },
274     { "nds-context", DHO_NDS_CONTEXT, DHCP4_OPTION_SPACE, OPT_STRING_TYPE,
275       false, NO_RECORD_DEF, "" },
276     { "bcms-controller-names", DHO_BCMCS_DOMAIN_NAME_LIST, DHCP4_OPTION_SPACE,
277       OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
278     { "bcms-controller-address", DHO_BCMCS_IPV4_ADDR, DHCP4_OPTION_SPACE,
279       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
280     // Unfortunately the AUTHENTICATE option contains a 64-bit
281     // data field called 'replay-detection' that can't be added
282     // as a record field to a custom option. Also, there is no
283     // dedicated option class to handle it so we simply return
284     // binary option type for now.
285     // @todo implement a class to handle AUTH option.
286     { "authenticate", DHO_AUTHENTICATE, DHCP4_OPTION_SPACE, OPT_BINARY_TYPE,
287       false, NO_RECORD_DEF, "" },
288     { "client-last-transaction-time", DHO_CLIENT_LAST_TRANSACTION_TIME,
289       DHCP4_OPTION_SPACE, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
290     { "associated-ip", DHO_ASSOCIATED_IP, DHCP4_OPTION_SPACE,
291       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
292     { "client-system", DHO_SYSTEM, DHCP4_OPTION_SPACE, OPT_UINT16_TYPE, true,
293       NO_RECORD_DEF, "" },
294     { "client-ndi", DHO_NDI, DHCP4_OPTION_SPACE, OPT_RECORD_TYPE, false,
295       RECORD_DEF(CLIENT_NDI_RECORDS), "" },
296     { "uuid-guid", DHO_UUID_GUID, DHCP4_OPTION_SPACE, OPT_RECORD_TYPE, false,
297       RECORD_DEF(UUID_GUID_RECORDS), "" },
298     { "uap-servers", DHO_USER_AUTH, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
299       NO_RECORD_DEF, "" },
300     { "geoconf-civic", DHO_GEOCONF_CIVIC, DHCP4_OPTION_SPACE, OPT_BINARY_TYPE,
301       false, NO_RECORD_DEF, "" },
302     { "pcode", DHO_PCODE, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
303       NO_RECORD_DEF, "" },
304     { "tcode", DHO_TCODE, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
305       NO_RECORD_DEF, "" },
306     { "v6-only-preferred", DHO_V6_ONLY_PREFERRED, DHCP4_OPTION_SPACE,
307       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
308     { "netinfo-server-address", DHO_NETINFO_ADDR, DHCP4_OPTION_SPACE,
309       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
310     { "netinfo-server-tag", DHO_NETINFO_TAG, DHCP4_OPTION_SPACE,
311       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
312     { "default-url", DHO_URL, DHCP4_OPTION_SPACE, OPT_STRING_TYPE, false,
313       NO_RECORD_DEF, "" },
314     { "auto-config", DHO_AUTO_CONFIG, DHCP4_OPTION_SPACE, OPT_UINT8_TYPE,
315       false, NO_RECORD_DEF, "" },
316     { "name-service-search", DHO_NAME_SERVICE_SEARCH, DHCP4_OPTION_SPACE,
317       OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
318     { "subnet-selection", DHO_SUBNET_SELECTION, DHCP4_OPTION_SPACE,
319       OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
320     { "domain-search", DHO_DOMAIN_SEARCH, DHCP4_OPTION_SPACE, OPT_FQDN_TYPE,
321       true, NO_RECORD_DEF, "" },
322     { "vivco-suboptions", DHO_VIVCO_SUBOPTIONS, DHCP4_OPTION_SPACE,
323       OPT_RECORD_TYPE, false, RECORD_DEF(VIVCO_RECORDS), "" },
324     // Vendor-Identifying Vendor Specific Information option payload begins with a
325     // 32-bit log enterprise number, followed by a tuple of data-len/option-data.
326     // The format defined here includes 32-bit field holding enterprise number.
327     // This allows for specifying option-data information where the enterprise-id
328     // is represented by a uint32_t value. Previously we represented this option
329     // as a binary, but that would imply that enterprise number would have to be
330     // represented in binary format in the server configuration. That would be
331     // inconvenient and non-intuitive.
332     /// @todo We need to extend support for vendor options with ability to specify
333     /// multiple enterprise numbers for a single option. Perhaps it would be
334     /// ok to specify multiple instances of the "vivso-suboptions" which will be
335     /// combined in a single option by the server before responding to a client.
336     { "vivso-suboptions", DHO_VIVSO_SUBOPTIONS, DHCP4_OPTION_SPACE,
337       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
338     { "pana-agent", DHO_PANA_AGENT, DHCP4_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE,
339       true, NO_RECORD_DEF, "" },
340     { "v4-lost", DHO_V4_LOST, DHCP4_OPTION_SPACE, OPT_FQDN_TYPE, false,
341       NO_RECORD_DEF, "" },
342     { "capwap-ac-v4", DHO_CAPWAP_AC_V4, DHCP4_OPTION_SPACE,
343       OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
344     { "sip-ua-cs-domains", DHO_SIP_UA_CONF_SERVICE_DOMAINS, DHCP4_OPTION_SPACE,
345       OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
346     { "rdnss-selection", DHO_RDNSS_SELECT, DHCP4_OPTION_SPACE, OPT_RECORD_TYPE,
347       true, RECORD_DEF(V4_RDNSS_SELECT_RECORDS), "" },
348     { "v4-portparams", DHO_V4_PORTPARAMS, DHCP4_OPTION_SPACE, OPT_RECORD_TYPE,
349       false, RECORD_DEF(V4_PORTPARAMS_RECORDS), "" },
350     { "v4-captive-portal", DHO_V4_CAPTIVE_PORTAL, DHCP4_OPTION_SPACE,
351       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
352     { "option-6rd", DHO_6RD, DHCP4_OPTION_SPACE, OPT_RECORD_TYPE, true,
353       RECORD_DEF(OPT_6RD_RECORDS), "" },
354     { "v4-access-domain", DHO_V4_ACCESS_DOMAIN, DHCP4_OPTION_SPACE,
355       OPT_FQDN_TYPE, false, NO_RECORD_DEF, "" }
356 
357         // @todo add definitions for all remaining options.
358 };
359 
360 /// Number of option definitions defined.
361 const int STANDARD_V4_OPTION_DEFINITIONS_SIZE =
362     sizeof(STANDARD_V4_OPTION_DEFINITIONS) /
363     sizeof(STANDARD_V4_OPTION_DEFINITIONS[0]);
364 
365 /// Last resort definitions (only option 43 for now, these definitions
366 /// are applied in deferred unpacking when none is found).
367 const OptionDefParams LAST_RESORT_V4_OPTION_DEFINITIONS[] = {
368     { "vendor-encapsulated-options", DHO_VENDOR_ENCAPSULATED_OPTIONS,
369       DHCP4_OPTION_SPACE, OPT_EMPTY_TYPE, false, NO_RECORD_DEF,
370       VENDOR_ENCAPSULATED_OPTION_SPACE }
371 };
372 
373 const int LAST_RESORT_V4_OPTION_DEFINITIONS_SIZE =
374     sizeof(LAST_RESORT_V4_OPTION_DEFINITIONS) /
375     sizeof(LAST_RESORT_V4_OPTION_DEFINITIONS[0]);
376 
377 /// Start Definition of DHCPv6 options
378 
379 // client-fqdn
380 RECORD_DECL(CLIENT_FQDN_RECORDS, OPT_UINT8_TYPE, OPT_FQDN_TYPE);
381 // geoconf-civic
382 RECORD_DECL(GEOCONF_CIVIC_RECORDS, OPT_UINT8_TYPE, OPT_UINT16_TYPE,
383             OPT_BINARY_TYPE);
384 // iaddr
385 RECORD_DECL(IAADDR_RECORDS, OPT_IPV6_ADDRESS_TYPE, OPT_UINT32_TYPE,
386             OPT_UINT32_TYPE);
387 // ia-na
388 RECORD_DECL(IA_NA_RECORDS, OPT_UINT32_TYPE, OPT_UINT32_TYPE, OPT_UINT32_TYPE);
389 // ia-pd
390 RECORD_DECL(IA_PD_RECORDS, OPT_UINT32_TYPE, OPT_UINT32_TYPE, OPT_UINT32_TYPE);
391 // ia-prefix
392 RECORD_DECL(IA_PREFIX_RECORDS, OPT_UINT32_TYPE, OPT_UINT32_TYPE,
393             OPT_UINT8_TYPE, OPT_IPV6_ADDRESS_TYPE);
394 // lq-query
395 RECORD_DECL(LQ_QUERY_RECORDS, OPT_UINT8_TYPE, OPT_IPV6_ADDRESS_TYPE);
396 // lq-relay-data
397 RECORD_DECL(LQ_RELAY_DATA_RECORDS, OPT_IPV6_ADDRESS_TYPE, OPT_BINARY_TYPE);
398 // remote-id
399 RECORD_DECL(REMOTE_ID_RECORDS, OPT_UINT32_TYPE, OPT_BINARY_TYPE);
400 // s46-rule
401 RECORD_DECL(S46_RULE, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
402             OPT_IPV4_ADDRESS_TYPE, OPT_IPV6_PREFIX_TYPE);
403 // s46-v4v6bind
404 RECORD_DECL(S46_V4V6BIND, OPT_IPV4_ADDRESS_TYPE, OPT_IPV6_PREFIX_TYPE);
405 // s46-portparams
406 RECORD_DECL(S46_PORTPARAMS, OPT_UINT8_TYPE, OPT_PSID_TYPE);
407 // status-code
408 RECORD_DECL(STATUS_CODE_RECORDS, OPT_UINT16_TYPE, OPT_STRING_TYPE);
409 // vendor-class
410 RECORD_DECL(VENDOR_CLASS_RECORDS, OPT_UINT32_TYPE, OPT_BINARY_TYPE);
411 // rdnss-selection
412 RECORD_DECL(V6_RDNSS_SELECT_RECORDS, OPT_IPV6_ADDRESS_TYPE, OPT_UINT8_TYPE,
413             OPT_FQDN_TYPE);
414 // sedhcpv6 signature
415 RECORD_DECL(SIGNATURE_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
416             OPT_BINARY_TYPE);
417 
418 // RFC5970 (PXE) Class record fields
419 //
420 // Three 1 byte fileds to describe a network interface: type, major and minor
421 RECORD_DECL(CLIENT_NII_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE);
422 
423 /// Standard DHCPv6 option definitions.
424 ///
425 /// @warning in this array, the initializers are provided for all
426 /// OptionDefParams struct's members despite initializers for
427 /// 'records' and 'record_size' could be omitted for entries for
428 /// which 'type' does not equal to OPT_RECORD_TYPE. If initializers
429 /// are omitted the corresponding values should default to 0.
430 /// This however does not work on Solaris (GCC) which issues a
431 /// warning about lack of initializers for some struct members
432 /// causing build to fail.
433 const OptionDefParams STANDARD_V6_OPTION_DEFINITIONS[] = {
434     { "clientid", D6O_CLIENTID, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE, false,
435       NO_RECORD_DEF, "" },
436     { "serverid", D6O_SERVERID, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE, false,
437       NO_RECORD_DEF, "" },
438     { "ia-na", D6O_IA_NA, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
439       RECORD_DEF(IA_NA_RECORDS), "" },
440     { "ia-ta", D6O_IA_TA, DHCP6_OPTION_SPACE, OPT_UINT32_TYPE, false,
441       NO_RECORD_DEF, "" },
442     { "iaaddr", D6O_IAADDR, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
443       RECORD_DEF(IAADDR_RECORDS), "" },
444     { "oro", D6O_ORO, DHCP6_OPTION_SPACE, OPT_UINT16_TYPE, true, NO_RECORD_DEF,
445       "" },
446     { "preference", D6O_PREFERENCE, DHCP6_OPTION_SPACE, OPT_UINT8_TYPE, false,
447       NO_RECORD_DEF, "" },
448     { "elapsed-time", D6O_ELAPSED_TIME, DHCP6_OPTION_SPACE, OPT_UINT16_TYPE,
449       false, NO_RECORD_DEF, "" },
450     { "relay-msg", D6O_RELAY_MSG, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE, false,
451       NO_RECORD_DEF, "" },
452     // Unfortunately the AUTH option contains a 64-bit data field
453     // called 'replay-detection' that can't be added as a record
454     // field to a custom option. Also, there is no dedicated
455     // option class to handle it so we simply return binary
456     // option type for now.
457     // @todo implement a class to handle AUTH option.
458     { "auth", D6O_AUTH, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE, false,
459       NO_RECORD_DEF, "" },
460     { "unicast", D6O_UNICAST, DHCP6_OPTION_SPACE, OPT_IPV6_ADDRESS_TYPE,
461       false, NO_RECORD_DEF, "" },
462     { "status-code", D6O_STATUS_CODE, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE,
463       false, RECORD_DEF(STATUS_CODE_RECORDS), "" },
464     { "rapid-commit", D6O_RAPID_COMMIT, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE,
465       false, NO_RECORD_DEF, "" },
466     { "user-class", D6O_USER_CLASS, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE,
467       false, NO_RECORD_DEF, "" },
468     { "vendor-class", D6O_VENDOR_CLASS, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE,
469       false, RECORD_DEF(VENDOR_CLASS_RECORDS), "" },
470     { "vendor-opts", D6O_VENDOR_OPTS, DHCP6_OPTION_SPACE, OPT_UINT32_TYPE,
471       false, NO_RECORD_DEF, "" },
472     { "interface-id", D6O_INTERFACE_ID, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE,
473       false, NO_RECORD_DEF, "" },
474     { "reconf-msg", D6O_RECONF_MSG, DHCP6_OPTION_SPACE, OPT_UINT8_TYPE, false,
475       NO_RECORD_DEF, "" },
476     { "reconf-accept", D6O_RECONF_ACCEPT, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE,
477       false, NO_RECORD_DEF, "" },
478     { "sip-server-dns", D6O_SIP_SERVERS_DNS, DHCP6_OPTION_SPACE, OPT_FQDN_TYPE,
479       true, NO_RECORD_DEF, "" },
480     { "sip-server-addr", D6O_SIP_SERVERS_ADDR, DHCP6_OPTION_SPACE,
481       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
482     { "dns-servers", D6O_NAME_SERVERS, DHCP6_OPTION_SPACE,
483       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
484     { "domain-search", D6O_DOMAIN_SEARCH, DHCP6_OPTION_SPACE, OPT_FQDN_TYPE,
485       true, NO_RECORD_DEF, "" },
486     { "ia-pd", D6O_IA_PD, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
487       RECORD_DEF(IA_PD_RECORDS), "" },
488     { "iaprefix", D6O_IAPREFIX, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
489       RECORD_DEF(IA_PREFIX_RECORDS), "" },
490     { "nis-servers", D6O_NIS_SERVERS, DHCP6_OPTION_SPACE,
491       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
492     { "nisp-servers", D6O_NISP_SERVERS, DHCP6_OPTION_SPACE,
493       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
494     { "nis-domain-name", D6O_NIS_DOMAIN_NAME, DHCP6_OPTION_SPACE,
495       OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
496     { "nisp-domain-name", D6O_NISP_DOMAIN_NAME, DHCP6_OPTION_SPACE,
497       OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
498     { "sntp-servers", D6O_SNTP_SERVERS, DHCP6_OPTION_SPACE,
499       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
500     { "information-refresh-time", D6O_INFORMATION_REFRESH_TIME,
501       DHCP6_OPTION_SPACE,       OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
502     { "bcmcs-server-dns", D6O_BCMCS_SERVER_D, DHCP6_OPTION_SPACE,
503       OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
504     { "bcmcs-server-addr", D6O_BCMCS_SERVER_A, DHCP6_OPTION_SPACE,
505       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
506     { "geoconf-civic", D6O_GEOCONF_CIVIC, DHCP6_OPTION_SPACE,
507       OPT_RECORD_TYPE, false, RECORD_DEF(GEOCONF_CIVIC_RECORDS), "" },
508     { "remote-id", D6O_REMOTE_ID, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
509       RECORD_DEF(REMOTE_ID_RECORDS), "" },
510     { "subscriber-id", D6O_SUBSCRIBER_ID, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE,
511       false, NO_RECORD_DEF, "" },
512     { "client-fqdn", D6O_CLIENT_FQDN, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE,
513       false, RECORD_DEF(CLIENT_FQDN_RECORDS), "" },
514     { "pana-agent", D6O_PANA_AGENT, DHCP6_OPTION_SPACE, OPT_IPV6_ADDRESS_TYPE,
515       true, NO_RECORD_DEF, "" },
516     { "new-posix-timezone", D6O_NEW_POSIX_TIMEZONE, DHCP6_OPTION_SPACE,
517       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
518     { "new-tzdb-timezone", D6O_NEW_TZDB_TIMEZONE, DHCP6_OPTION_SPACE,
519       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
520     { "ero", D6O_ERO, DHCP6_OPTION_SPACE, OPT_UINT16_TYPE, true,
521       NO_RECORD_DEF, "" },
522     { "lq-query", D6O_LQ_QUERY, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
523       RECORD_DEF(LQ_QUERY_RECORDS), DHCP6_OPTION_SPACE },
524     { "client-data", D6O_CLIENT_DATA, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE,
525       false, NO_RECORD_DEF, DHCP6_OPTION_SPACE },
526     { "clt-time", D6O_CLT_TIME, DHCP6_OPTION_SPACE, OPT_UINT32_TYPE, false,
527       NO_RECORD_DEF, "" },
528     { "lq-relay-data", D6O_LQ_RELAY_DATA, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE,
529       false, RECORD_DEF(LQ_RELAY_DATA_RECORDS), "" },
530     { "lq-client-link", D6O_LQ_CLIENT_LINK, DHCP6_OPTION_SPACE,
531       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
532     { "v6-lost", D6O_V6_LOST, DHCP6_OPTION_SPACE, OPT_FQDN_TYPE, false,
533       NO_RECORD_DEF, "" },
534     { "capwap-ac-v6", D6O_CAPWAP_AC_V6, DHCP6_OPTION_SPACE,
535       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
536     { "relay-id", D6O_RELAY_ID, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE, false,
537       NO_RECORD_DEF, "" },
538     { "v6-access-domain", D6O_V6_ACCESS_DOMAIN, DHCP6_OPTION_SPACE,
539       OPT_FQDN_TYPE, false, NO_RECORD_DEF, "" },
540     { "sip-ua-cs-list", D6O_SIP_UA_CS_LIST, DHCP6_OPTION_SPACE,
541       OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
542     { "bootfile-url", D6O_BOOTFILE_URL, DHCP6_OPTION_SPACE, OPT_STRING_TYPE,
543       false, NO_RECORD_DEF, "" },
544     { "bootfile-param", D6O_BOOTFILE_PARAM, DHCP6_OPTION_SPACE, OPT_TUPLE_TYPE,
545       true, NO_RECORD_DEF, "" },
546     { "client-arch-type", D6O_CLIENT_ARCH_TYPE, DHCP6_OPTION_SPACE,
547       OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
548     { "nii", D6O_NII, DHCP6_OPTION_SPACE, OPT_RECORD_TYPE, false,
549       RECORD_DEF(CLIENT_NII_RECORDS), "" },
550     { "aftr-name", D6O_AFTR_NAME, DHCP6_OPTION_SPACE, OPT_FQDN_TYPE, false,
551       NO_RECORD_DEF, "" },
552     { "erp-local-domain-name", D6O_ERP_LOCAL_DOMAIN_NAME, DHCP6_OPTION_SPACE
553       , OPT_FQDN_TYPE, false, NO_RECORD_DEF, "" },
554     { "rsoo", D6O_RSOO, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE, false,
555       NO_RECORD_DEF, "rsoo-opts" },
556     { "pd-exclude", D6O_PD_EXCLUDE, DHCP6_OPTION_SPACE, OPT_IPV6_PREFIX_TYPE,
557       false, NO_RECORD_DEF, "" },
558     { "rdnss-selection", D6O_RDNSS_SELECTION, DHCP6_OPTION_SPACE,
559       OPT_RECORD_TYPE, true, RECORD_DEF(V6_RDNSS_SELECT_RECORDS), "" },
560     { "client-linklayer-addr", D6O_CLIENT_LINKLAYER_ADDR, DHCP6_OPTION_SPACE,
561       OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
562     { "link-address", D6O_LINK_ADDRESS, DHCP6_OPTION_SPACE,
563       OPT_IPV6_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
564     { "solmax-rt", D6O_SOL_MAX_RT, DHCP6_OPTION_SPACE, OPT_UINT32_TYPE, false,
565       NO_RECORD_DEF, "" },
566     { "inf-max-rt", D6O_INF_MAX_RT, DHCP6_OPTION_SPACE, OPT_UINT32_TYPE, false,
567       NO_RECORD_DEF, "" },
568     { "dhcpv4-message", D6O_DHCPV4_MSG, DHCP6_OPTION_SPACE, OPT_BINARY_TYPE,
569       false, NO_RECORD_DEF, "" },
570     { "dhcp4o6-server-addr", D6O_DHCPV4_O_DHCPV6_SERVER, DHCP6_OPTION_SPACE,
571       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
572     { "v6-captive-portal", D6O_V6_CAPTIVE_PORTAL, DHCP6_OPTION_SPACE,
573       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
574     { "relay-source-port", D6O_RELAY_SOURCE_PORT, DHCP6_OPTION_SPACE,
575       OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
576     { "ipv6-address-andsf", D6O_IPV6_ADDRESS_ANDSF, DHCP6_OPTION_SPACE,
577       OPT_IPV6_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
578     { "s46-cont-mape", D6O_S46_CONT_MAPE, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE,
579       false, NO_RECORD_DEF, MAPE_V6_OPTION_SPACE },
580     { "s46-cont-mapt", D6O_S46_CONT_MAPT, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE,
581       false, NO_RECORD_DEF, MAPT_V6_OPTION_SPACE },
582     { "s46-cont-lw", D6O_S46_CONT_LW, DHCP6_OPTION_SPACE, OPT_EMPTY_TYPE,
583       false, NO_RECORD_DEF, LW_V6_OPTION_SPACE }
584 
585     // @todo There is still a bunch of options for which we have to provide
586     // definitions but we don't do it because they are not really
587     // critical right now.
588 };
589 
590 /// Number of option definitions defined.
591 const int STANDARD_V6_OPTION_DEFINITIONS_SIZE =
592     sizeof(STANDARD_V6_OPTION_DEFINITIONS) /
593     sizeof(STANDARD_V6_OPTION_DEFINITIONS[0]);
594 
595 /// @brief Definitions of vendor-specific DHCPv6 options, defined by ISC.
596 /// 4o6-* options are used for inter-process communication. For details, see
597 /// https://gitlab.isc.org/isc-projects/kea/wikis/designs/dhcpv4o6-design
598 ///
599 /// @todo: As those options are defined by ISC, they do not belong in std_option_defs.h.
600 ///        We need to move them to a separate file, e.g. isc_option_defs.h
601 const OptionDefParams ISC_V6_OPTION_DEFINITIONS[] = {
602     { "4o6-interface", ISC_V6_4O6_INTERFACE, ISC_V6_OPTION_SPACE,
603       OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
604     { "4o6-source-address", ISC_V6_4O6_SRC_ADDRESS, ISC_V6_OPTION_SPACE,
605       OPT_IPV6_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
606     { "4o6-source-port", ISC_V6_4O6_SRC_PORT, ISC_V6_OPTION_SPACE,
607       OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" }
608 };
609 
610 const int ISC_V6_OPTION_DEFINITIONS_SIZE =
611     sizeof(ISC_V6_OPTION_DEFINITIONS) /
612     sizeof(ISC_V6_OPTION_DEFINITIONS[0]);
613 
614 /// @brief MAPE option definitions
615 const OptionDefParams MAPE_V6_OPTION_DEFINITIONS[] = {
616     { "s46-br", D6O_S46_BR, MAPE_V6_OPTION_SPACE, OPT_IPV6_ADDRESS_TYPE, false,
617       NO_RECORD_DEF, "" },
618     { "s46-rule", D6O_S46_RULE, MAPE_V6_OPTION_SPACE, OPT_RECORD_TYPE, false,
619       RECORD_DEF(S46_RULE), V4V6_RULE_OPTION_SPACE }
620 };
621 
622 const int MAPE_V6_OPTION_DEFINITIONS_SIZE =
623     sizeof(MAPE_V6_OPTION_DEFINITIONS) /
624     sizeof(MAPE_V6_OPTION_DEFINITIONS[0]);
625 
626 /// @brief MAPT option definitions
627 const OptionDefParams MAPT_V6_OPTION_DEFINITIONS[] = {
628     { "s46-rule", D6O_S46_RULE, MAPT_V6_OPTION_SPACE, OPT_RECORD_TYPE, false,
629       RECORD_DEF(S46_RULE), V4V6_RULE_OPTION_SPACE },
630     { "s46-dmr", D6O_S46_DMR, MAPT_V6_OPTION_SPACE, OPT_IPV6_PREFIX_TYPE,
631       false, NO_RECORD_DEF, "" }
632 };
633 
634 const int MAPT_V6_OPTION_DEFINITIONS_SIZE =
635     sizeof(MAPT_V6_OPTION_DEFINITIONS) /
636     sizeof(MAPT_V6_OPTION_DEFINITIONS[0]);
637 
638 /// @brief LW option definitions
639 const OptionDefParams LW_V6_OPTION_DEFINITIONS[] = {
640     { "s46-br", D6O_S46_BR, LW_V6_OPTION_SPACE, OPT_IPV6_ADDRESS_TYPE, false,
641       NO_RECORD_DEF, "" },
642     { "s46-v4v6bind", D6O_S46_V4V6BIND, LW_V6_OPTION_SPACE, OPT_RECORD_TYPE,
643       false, RECORD_DEF(S46_V4V6BIND), V4V6_BIND_OPTION_SPACE }
644 };
645 
646 const int LW_V6_OPTION_DEFINITIONS_SIZE =
647     sizeof(LW_V6_OPTION_DEFINITIONS) /
648     sizeof(LW_V6_OPTION_DEFINITIONS[0]);
649 
650 /// @brief Rule option definitions
651 const OptionDefParams V4V6_RULE_OPTION_DEFINITIONS[] = {
652     { "s46-portparams", D6O_S46_PORTPARAMS, V4V6_RULE_OPTION_SPACE,
653       OPT_RECORD_TYPE, false, RECORD_DEF(S46_PORTPARAMS), "" }
654 };
655 
656 const int V4V6_RULE_OPTION_DEFINITIONS_SIZE =
657     sizeof(V4V6_RULE_OPTION_DEFINITIONS) /
658     sizeof(V4V6_RULE_OPTION_DEFINITIONS[0]);
659 
660 /// @brief Bind option definitions
661 const OptionDefParams V4V6_BIND_OPTION_DEFINITIONS[] = {
662     { "s46-portparams", D6O_S46_PORTPARAMS, V4V6_BIND_OPTION_SPACE,
663       OPT_RECORD_TYPE, false, RECORD_DEF(S46_PORTPARAMS), "" }
664 };
665 
666 const int V4V6_BIND_OPTION_DEFINITIONS_SIZE =
667     sizeof(V4V6_BIND_OPTION_DEFINITIONS) /
668     sizeof(V4V6_BIND_OPTION_DEFINITIONS[0]);
669 
670 }  // namespace
671 
672 }  // namespace dhcp
673 }  // namespace isc
674 
675 #endif // STD_OPTION_DEFS_H
676