std_option_defs.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. // Copyright (C) 2012-2017 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. #ifndef STD_OPTION_DEFS_H
  7. #define STD_OPTION_DEFS_H
  8. #include <dhcp/option_data_types.h>
  9. #include <dhcp/dhcp4.h>
  10. #include <dhcp/dhcp6.h>
  11. #include <dhcp/option_space.h>
  12. namespace isc {
  13. namespace dhcp {
  14. namespace {
  15. /// @brief Declare an array holding parameters used to create instance
  16. /// of a definition for option comprising a record of data fields.
  17. ///
  18. /// @param name name of the array being declared.
  19. #ifndef RECORD_DECL
  20. #define RECORD_DECL(name, ...) const OptionDataType name[] = { __VA_ARGS__ }
  21. #endif
  22. /// @brief A pair of values: one pointing to the array holding types of
  23. /// data fields belonging to the record, and size of this array.
  24. ///
  25. /// @param name name of the array holding data fields' types.
  26. #ifndef RECORD_DEF
  27. #define RECORD_DEF(name) name, sizeof(name) / sizeof(name[0])
  28. #endif
  29. #ifndef NO_RECORD_DEF
  30. #define NO_RECORD_DEF 0, 0
  31. #endif
  32. // fqdn option record fields.
  33. //
  34. // Note that the flags field indicates the type of domain
  35. // name encoding. There is a choice between deprecated
  36. // ASCII encoding and compressed encoding described in
  37. // RFC 1035, section 3.1. The latter could be handled
  38. // by OPT_FQDN_TYPE but we can't use it here because
  39. // clients may request ASCII encoding.
  40. RECORD_DECL(FQDN_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
  41. OPT_FQDN_TYPE);
  42. // V-I Vendor Class record fields.
  43. //
  44. // Opaque data is represented here by the binary data field.
  45. RECORD_DECL(VIVCO_RECORDS, OPT_UINT32_TYPE, OPT_BINARY_TYPE);
  46. // RFC4578 (PXE) record fields
  47. //
  48. // Three 1 byte fields to describe a network interface: type, major and minor
  49. RECORD_DECL(CLIENT_NDI_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE);
  50. // A client identifier: a 1 byte type field followed by opaque data depending on the type
  51. RECORD_DECL(UUID_GUID_RECORDS, OPT_UINT8_TYPE, OPT_BINARY_TYPE);
  52. /// @brief Definitions of standard DHCPv4 options.
  53. const OptionDefParams STANDARD_V4_OPTION_DEFINITIONS[] = {
  54. { "subnet-mask", DHO_SUBNET_MASK, OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  55. { "time-offset", DHO_TIME_OFFSET, OPT_INT32_TYPE, false, NO_RECORD_DEF, "" },
  56. { "routers", DHO_ROUTERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  57. { "time-servers", DHO_TIME_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  58. { "name-servers", DHO_NAME_SERVERS, OPT_IPV4_ADDRESS_TYPE,
  59. true, NO_RECORD_DEF, "" },
  60. { "domain-name-servers", DHO_DOMAIN_NAME_SERVERS,
  61. OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  62. { "log-servers", DHO_LOG_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  63. { "cookie-servers", DHO_COOKIE_SERVERS, OPT_IPV4_ADDRESS_TYPE,
  64. true, NO_RECORD_DEF, "" },
  65. { "lpr-servers", DHO_LPR_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  66. { "impress-servers", DHO_IMPRESS_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  67. { "resource-location-servers", DHO_RESOURCE_LOCATION_SERVERS,
  68. OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  69. { "host-name", DHO_HOST_NAME, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  70. { "boot-size", DHO_BOOT_SIZE, OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
  71. { "merit-dump", DHO_MERIT_DUMP, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  72. { "domain-name", DHO_DOMAIN_NAME, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  73. { "swap-server", DHO_SWAP_SERVER, OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  74. { "root-path", DHO_ROOT_PATH, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  75. { "extensions-path", DHO_EXTENSIONS_PATH, OPT_STRING_TYPE,
  76. false, NO_RECORD_DEF, "" },
  77. { "ip-forwarding", DHO_IP_FORWARDING, OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  78. { "non-local-source-routing", DHO_NON_LOCAL_SOURCE_ROUTING,
  79. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  80. { "policy-filter", DHO_POLICY_FILTER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  81. { "max-dgram-reassembly", DHO_MAX_DGRAM_REASSEMBLY,
  82. OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
  83. { "default-ip-ttl", DHO_DEFAULT_IP_TTL, OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  84. { "path-mtu-aging-timeout", DHO_PATH_MTU_AGING_TIMEOUT,
  85. OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  86. { "path-mtu-plateau-table", DHO_PATH_MTU_PLATEAU_TABLE,
  87. OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
  88. { "interface-mtu", DHO_INTERFACE_MTU, OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
  89. { "all-subnets-local", DHO_ALL_SUBNETS_LOCAL,
  90. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  91. { "broadcast-address", DHO_BROADCAST_ADDRESS,
  92. OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  93. { "perform-mask-discovery", DHO_PERFORM_MASK_DISCOVERY,
  94. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  95. { "mask-supplier", DHO_MASK_SUPPLIER, OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  96. { "router-discovery", DHO_ROUTER_DISCOVERY,
  97. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  98. { "router-solicitation-address", DHO_ROUTER_SOLICITATION_ADDRESS,
  99. OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  100. { "static-routes", DHO_STATIC_ROUTES,
  101. OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  102. { "trailer-encapsulation", DHO_TRAILER_ENCAPSULATION,
  103. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  104. { "arp-cache-timeout", DHO_ARP_CACHE_TIMEOUT,
  105. OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  106. { "ieee802-3-encapsulation", DHO_IEEE802_3_ENCAPSULATION,
  107. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  108. { "default-tcp-ttl", DHO_DEFAULT_TCP_TTL, OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  109. { "tcp-keepalive-interval", DHO_TCP_KEEPALIVE_INTERVAL,
  110. OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  111. { "tcp-keepalive-garbage", DHO_TCP_KEEPALIVE_GARBAGE,
  112. OPT_BOOLEAN_TYPE, false, NO_RECORD_DEF, "" },
  113. { "nis-domain", DHO_NIS_DOMAIN, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  114. { "nis-servers", DHO_NIS_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  115. { "ntp-servers", DHO_NTP_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  116. { "vendor-encapsulated-options", DHO_VENDOR_ENCAPSULATED_OPTIONS,
  117. OPT_EMPTY_TYPE, false, NO_RECORD_DEF, "vendor-encapsulated-options-space" },
  118. { "netbios-name-servers", DHO_NETBIOS_NAME_SERVERS,
  119. OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  120. { "netbios-dd-server", DHO_NETBIOS_DD_SERVER,
  121. OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  122. { "netbios-node-type", DHO_NETBIOS_NODE_TYPE,
  123. OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  124. { "netbios-scope", DHO_NETBIOS_SCOPE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  125. { "font-servers", DHO_FONT_SERVERS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  126. { "x-display-manager", DHO_X_DISPLAY_MANAGER,
  127. OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  128. { "dhcp-requested-address", DHO_DHCP_REQUESTED_ADDRESS,
  129. OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  130. { "dhcp-lease-time", DHO_DHCP_LEASE_TIME, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  131. { "dhcp-option-overload", DHO_DHCP_OPTION_OVERLOAD,
  132. OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  133. { "dhcp-message-type", DHO_DHCP_MESSAGE_TYPE, OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  134. { "dhcp-server-identifier", DHO_DHCP_SERVER_IDENTIFIER,
  135. OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  136. { "dhcp-parameter-request-list", DHO_DHCP_PARAMETER_REQUEST_LIST,
  137. OPT_UINT8_TYPE, true, NO_RECORD_DEF, "" },
  138. { "dhcp-message", DHO_DHCP_MESSAGE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  139. { "dhcp-max-message-size", DHO_DHCP_MAX_MESSAGE_SIZE,
  140. OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
  141. { "dhcp-renewal-time", DHO_DHCP_RENEWAL_TIME, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  142. { "dhcp-rebinding-time", DHO_DHCP_REBINDING_TIME,
  143. OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  144. { "vendor-class-identifier", DHO_VENDOR_CLASS_IDENTIFIER,
  145. OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  146. { "dhcp-client-identifier", DHO_DHCP_CLIENT_IDENTIFIER,
  147. OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  148. { "nwip-domain-name", DHO_NWIP_DOMAIN_NAME, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  149. { "nwip-suboptions", DHO_NWIP_SUBOPTIONS, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  150. { "nisplus-domain-name", DHO_NISP_DOMAIN_NAME, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  151. { "nisplus-servers", DHO_NISP_SERVER_ADDR, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  152. { "tftp-server-name", DHO_TFTP_SERVER_NAME, OPT_STRING_TYPE, false,
  153. NO_RECORD_DEF, "" },
  154. { "boot-file-name", DHO_BOOT_FILE_NAME, OPT_STRING_TYPE, false,
  155. NO_RECORD_DEF, "" },
  156. { "mobile-ip-home-agent", DHO_HOME_AGENT_ADDRS, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  157. { "smtp-server", DHO_SMTP_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  158. { "pop-server", DHO_POP3_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  159. { "nntp-server", DHO_NNTP_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  160. { "www-server", DHO_WWW_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  161. { "finger-server", DHO_FINGER_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  162. { "irc-server", DHO_IRC_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  163. { "streettalk-server", DHO_STREETTALK_SERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  164. { "streettalk-directory-assistance-server", DHO_STDASERVER, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  165. { "user-class", DHO_USER_CLASS, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  166. { "fqdn", DHO_FQDN, OPT_RECORD_TYPE, false, RECORD_DEF(FQDN_RECORDS), "" },
  167. { "dhcp-agent-options", DHO_DHCP_AGENT_OPTIONS,
  168. OPT_EMPTY_TYPE, false, NO_RECORD_DEF, "dhcp-agent-options-space" },
  169. // Unfortunately the AUTHENTICATE option contains a 64-bit
  170. // data field called 'replay-detection' that can't be added
  171. // as a record field to a custom option. Also, there is no
  172. // dedicated option class to handle it so we simply return
  173. // binary option type for now.
  174. // @todo implement a class to handle AUTH option.
  175. { "authenticate", DHO_AUTHENTICATE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  176. { "client-last-transaction-time", DHO_CLIENT_LAST_TRANSACTION_TIME,
  177. OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  178. { "associated-ip", DHO_ASSOCIATED_IP, OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
  179. { "client-system", DHO_SYSTEM, OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
  180. { "client-ndi", DHO_NDI, OPT_RECORD_TYPE, false, RECORD_DEF(CLIENT_NDI_RECORDS), "" },
  181. { "uuid-guid", DHO_UUID_GUID, OPT_RECORD_TYPE, false, RECORD_DEF(UUID_GUID_RECORDS), "" },
  182. { "subnet-selection", DHO_SUBNET_SELECTION,
  183. OPT_IPV4_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  184. { "domain-search", DHO_DOMAIN_SEARCH, OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
  185. { "vivco-suboptions", DHO_VIVCO_SUBOPTIONS, OPT_RECORD_TYPE,
  186. false, RECORD_DEF(VIVCO_RECORDS), "" },
  187. // Vendor-Identifying Vendor Specific Information option payload begins with a
  188. // 32-bit log enterprise number, followed by a tuple of data-len/option-data.
  189. // The format defined here includes 32-bit field holding enterprise number.
  190. // This allows for specifying option-data information where the enterprise-id
  191. // is represented by a uint32_t value. Previously we represented this option
  192. // as a binary, but that would imply that enterprise number would have to be
  193. // represented in binary format in the server configuration. That would be
  194. // inconvenient and non-intuitive.
  195. /// @todo We need to extend support for vendor options with ability to specify
  196. /// multiple enterprise numbers for a single option. Perhaps it would be
  197. /// ok to specify multiple instances of the "vivso-suboptions" which will be
  198. /// combined in a single option by the server before responding to a client.
  199. { "vivso-suboptions", DHO_VIVSO_SUBOPTIONS, OPT_UINT32_TYPE,
  200. false, NO_RECORD_DEF, "" }
  201. // @todo add definitions for all remaining options.
  202. };
  203. /// Number of option definitions defined.
  204. const int STANDARD_V4_OPTION_DEFINITIONS_SIZE =
  205. sizeof(STANDARD_V4_OPTION_DEFINITIONS) / sizeof(STANDARD_V4_OPTION_DEFINITIONS[0]);
  206. /// Start Definition of DHCPv6 options
  207. // client-fqdn
  208. RECORD_DECL(CLIENT_FQDN_RECORDS, OPT_UINT8_TYPE, OPT_FQDN_TYPE);
  209. // geoconf-civic
  210. RECORD_DECL(GEOCONF_CIVIC_RECORDS, OPT_UINT8_TYPE, OPT_UINT16_TYPE,
  211. OPT_BINARY_TYPE);
  212. // iaddr
  213. RECORD_DECL(IAADDR_RECORDS, OPT_IPV6_ADDRESS_TYPE, OPT_UINT32_TYPE,
  214. OPT_UINT32_TYPE);
  215. // ia-na
  216. RECORD_DECL(IA_NA_RECORDS, OPT_UINT32_TYPE, OPT_UINT32_TYPE, OPT_UINT32_TYPE);
  217. // ia-pd
  218. RECORD_DECL(IA_PD_RECORDS, OPT_UINT32_TYPE, OPT_UINT32_TYPE, OPT_UINT32_TYPE);
  219. // ia-prefix
  220. RECORD_DECL(IA_PREFIX_RECORDS, OPT_UINT32_TYPE, OPT_UINT32_TYPE,
  221. OPT_UINT8_TYPE, OPT_IPV6_ADDRESS_TYPE);
  222. // lq-query
  223. RECORD_DECL(LQ_QUERY_RECORDS, OPT_UINT8_TYPE, OPT_IPV6_ADDRESS_TYPE);
  224. // lq-relay-data
  225. RECORD_DECL(LQ_RELAY_DATA_RECORDS, OPT_IPV6_ADDRESS_TYPE, OPT_BINARY_TYPE);
  226. // remote-id
  227. RECORD_DECL(REMOTE_ID_RECORDS, OPT_UINT32_TYPE, OPT_BINARY_TYPE);
  228. // s46-rule
  229. RECORD_DECL(S46_RULE, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
  230. OPT_IPV4_ADDRESS_TYPE, OPT_IPV6_PREFIX_TYPE);
  231. // s46-v4v6bind
  232. RECORD_DECL(S46_V4V6BIND, OPT_IPV4_ADDRESS_TYPE, OPT_IPV6_PREFIX_TYPE);
  233. // s46-portparams
  234. RECORD_DECL(S46_PORTPARAMS, OPT_UINT8_TYPE, OPT_PSID_TYPE);
  235. // status-code
  236. RECORD_DECL(STATUS_CODE_RECORDS, OPT_UINT16_TYPE, OPT_STRING_TYPE);
  237. // vendor-class
  238. RECORD_DECL(VENDOR_CLASS_RECORDS, OPT_UINT32_TYPE, OPT_BINARY_TYPE);
  239. // sedhcpv6 signature
  240. RECORD_DECL(SIGNATURE_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE,
  241. OPT_BINARY_TYPE);
  242. // RFC5970 (PXE) Class record fields
  243. //
  244. // Three 1 byte fileds to describe a network interface: type, major and minor
  245. RECORD_DECL(CLIENT_NII_RECORDS, OPT_UINT8_TYPE, OPT_UINT8_TYPE, OPT_UINT8_TYPE);
  246. /// Standard DHCPv6 option definitions.
  247. ///
  248. /// @warning in this array, the initializers are provided for all
  249. /// OptionDefParams struct's members despite initializers for
  250. /// 'records' and 'record_size' could be omitted for entries for
  251. /// which 'type' does not equal to OPT_RECORD_TYPE. If initializers
  252. /// are omitted the corresponding values should default to 0.
  253. /// This however does not work on Solaris (GCC) which issues a
  254. /// warning about lack of initializers for some struct members
  255. /// causing build to fail.
  256. const OptionDefParams STANDARD_V6_OPTION_DEFINITIONS[] = {
  257. { "clientid", D6O_CLIENTID, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  258. { "serverid", D6O_SERVERID, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  259. { "ia-na", D6O_IA_NA, OPT_RECORD_TYPE, false, RECORD_DEF(IA_NA_RECORDS), "" },
  260. { "ia-ta", D6O_IA_TA, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  261. { "iaaddr", D6O_IAADDR, OPT_RECORD_TYPE, false, RECORD_DEF(IAADDR_RECORDS), "" },
  262. { "oro", D6O_ORO, OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
  263. { "preference", D6O_PREFERENCE, OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  264. { "elapsed-time", D6O_ELAPSED_TIME, OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" },
  265. { "relay-msg", D6O_RELAY_MSG, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  266. // Unfortunately the AUTH option contains a 64-bit data field
  267. // called 'replay-detection' that can't be added as a record
  268. // field to a custom option. Also, there is no dedicated
  269. // option class to handle it so we simply return binary
  270. // option type for now.
  271. // @todo implement a class to handle AUTH option.
  272. { "auth", D6O_AUTH, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  273. { "unicast", D6O_UNICAST, OPT_IPV6_ADDRESS_TYPE, false, NO_RECORD_DEF, "" },
  274. { "status-code", D6O_STATUS_CODE, OPT_RECORD_TYPE, false,
  275. RECORD_DEF(STATUS_CODE_RECORDS), "" },
  276. { "rapid-commit", D6O_RAPID_COMMIT, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, "" },
  277. { "user-class", D6O_USER_CLASS, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  278. { "vendor-class", D6O_VENDOR_CLASS, OPT_RECORD_TYPE, false,
  279. RECORD_DEF(VENDOR_CLASS_RECORDS), "" },
  280. { "vendor-opts", D6O_VENDOR_OPTS, OPT_UINT32_TYPE, false,
  281. NO_RECORD_DEF, "vendor-opts-space" },
  282. { "interface-id", D6O_INTERFACE_ID, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  283. { "reconf-msg", D6O_RECONF_MSG, OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" },
  284. { "reconf-accept", D6O_RECONF_ACCEPT, OPT_EMPTY_TYPE, false,
  285. NO_RECORD_DEF, "" },
  286. { "sip-server-dns", D6O_SIP_SERVERS_DNS, OPT_FQDN_TYPE, true,
  287. NO_RECORD_DEF, "" },
  288. { "sip-server-addr", D6O_SIP_SERVERS_ADDR, OPT_IPV6_ADDRESS_TYPE, true,
  289. NO_RECORD_DEF, "" },
  290. { "dns-servers", D6O_NAME_SERVERS, OPT_IPV6_ADDRESS_TYPE, true,
  291. NO_RECORD_DEF, "" },
  292. { "domain-search", D6O_DOMAIN_SEARCH, OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
  293. { "ia-pd", D6O_IA_PD, OPT_RECORD_TYPE, false, RECORD_DEF(IA_PD_RECORDS), "" },
  294. { "iaprefix", D6O_IAPREFIX, OPT_RECORD_TYPE, false,
  295. RECORD_DEF(IA_PREFIX_RECORDS), "" },
  296. { "nis-servers", D6O_NIS_SERVERS, OPT_IPV6_ADDRESS_TYPE, true,
  297. NO_RECORD_DEF, "" },
  298. { "nisp-servers", D6O_NISP_SERVERS, OPT_IPV6_ADDRESS_TYPE, true,
  299. NO_RECORD_DEF, "" },
  300. { "nis-domain-name", D6O_NIS_DOMAIN_NAME, OPT_FQDN_TYPE, true,
  301. NO_RECORD_DEF, "" },
  302. { "nisp-domain-name", D6O_NISP_DOMAIN_NAME, OPT_FQDN_TYPE, true,
  303. NO_RECORD_DEF, "" },
  304. { "sntp-servers", D6O_SNTP_SERVERS, OPT_IPV6_ADDRESS_TYPE, true,
  305. NO_RECORD_DEF, "" },
  306. { "information-refresh-time", D6O_INFORMATION_REFRESH_TIME,
  307. OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  308. { "bcmcs-server-dns", D6O_BCMCS_SERVER_D, OPT_FQDN_TYPE, true,
  309. NO_RECORD_DEF, "" },
  310. { "bcmcs-server-addr", D6O_BCMCS_SERVER_A, OPT_IPV6_ADDRESS_TYPE, true,
  311. NO_RECORD_DEF, "" },
  312. { "geoconf-civic", D6O_GEOCONF_CIVIC, OPT_RECORD_TYPE, false,
  313. RECORD_DEF(GEOCONF_CIVIC_RECORDS), "" },
  314. { "remote-id", D6O_REMOTE_ID, OPT_RECORD_TYPE, false,
  315. RECORD_DEF(REMOTE_ID_RECORDS), "" },
  316. { "subscriber-id", D6O_SUBSCRIBER_ID, OPT_BINARY_TYPE, false,
  317. NO_RECORD_DEF, "" },
  318. { "client-fqdn", D6O_CLIENT_FQDN, OPT_RECORD_TYPE, false,
  319. RECORD_DEF(CLIENT_FQDN_RECORDS), "" },
  320. { "pana-agent", D6O_PANA_AGENT, OPT_IPV6_ADDRESS_TYPE, true,
  321. NO_RECORD_DEF, "" },
  322. { "new-posix-timezone", D6O_NEW_POSIX_TIMEZONE, OPT_STRING_TYPE, false,
  323. NO_RECORD_DEF, "" },
  324. { "new-tzdb-timezone", D6O_NEW_TZDB_TIMEZONE, OPT_STRING_TYPE, false,
  325. NO_RECORD_DEF, "" },
  326. { "ero", D6O_ERO, OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
  327. { "lq-query", D6O_LQ_QUERY, OPT_RECORD_TYPE, false,
  328. RECORD_DEF(LQ_QUERY_RECORDS), "" },
  329. { "client-data", D6O_CLIENT_DATA, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, "" },
  330. { "clt-time", D6O_CLT_TIME, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" },
  331. { "lq-relay-data", D6O_LQ_RELAY_DATA, OPT_RECORD_TYPE, false,
  332. RECORD_DEF(LQ_RELAY_DATA_RECORDS), "" },
  333. { "lq-client-link", D6O_LQ_CLIENT_LINK, OPT_IPV6_ADDRESS_TYPE, true,
  334. NO_RECORD_DEF, "" },
  335. { "bootfile-url", D6O_BOOTFILE_URL, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" },
  336. { "bootfile-param", D6O_BOOTFILE_PARAM, OPT_TUPLE_TYPE, true, NO_RECORD_DEF, "" },
  337. { "client-arch-type", D6O_CLIENT_ARCH_TYPE, OPT_UINT16_TYPE, true, NO_RECORD_DEF, "" },
  338. { "nii", D6O_NII, OPT_RECORD_TYPE, false, RECORD_DEF(CLIENT_NII_RECORDS), "" },
  339. { "erp-local-domain-name", D6O_ERP_LOCAL_DOMAIN_NAME, OPT_FQDN_TYPE, false,
  340. NO_RECORD_DEF, "" },
  341. { "rsoo", D6O_RSOO, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, "rsoo-opts" },
  342. { "pd-exclude", D6O_PD_EXCLUDE, OPT_IPV6_PREFIX_TYPE, false, NO_RECORD_DEF, "" },
  343. { "client-linklayer-addr", D6O_CLIENT_LINKLAYER_ADDR, OPT_BINARY_TYPE, false,
  344. NO_RECORD_DEF, "" },
  345. { "dhcpv4-message", D6O_DHCPV4_MSG, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" },
  346. { "dhcp4o6-server-addr", D6O_DHCPV4_O_DHCPV6_SERVER, OPT_IPV6_ADDRESS_TYPE, true,
  347. NO_RECORD_DEF, "" },
  348. { "public-key", D6O_PUBLIC_KEY, OPT_BINARY_TYPE, false,
  349. NO_RECORD_DEF, "" },
  350. { "certificate", D6O_CERTIFICATE, OPT_BINARY_TYPE, false,
  351. NO_RECORD_DEF, "" },
  352. { "signature", D6O_SIGNATURE, OPT_RECORD_TYPE, false,
  353. RECORD_DEF(SIGNATURE_RECORDS), "" },
  354. { "timestamp", D6O_TIMESTAMP, OPT_BINARY_TYPE, false,
  355. NO_RECORD_DEF, "" },
  356. { "aftr-name", D6O_AFTR_NAME, OPT_FQDN_TYPE, false, NO_RECORD_DEF, "" },
  357. // @todo There is still a bunch of options for which we have to provide
  358. // definitions but we don't do it because they are not really
  359. // critical right now.
  360. };
  361. /// Number of option definitions defined.
  362. const int STANDARD_V6_OPTION_DEFINITIONS_SIZE =
  363. sizeof(STANDARD_V6_OPTION_DEFINITIONS) /
  364. sizeof(STANDARD_V6_OPTION_DEFINITIONS[0]);
  365. /// @brief Definitions of vendor-specific DHCPv6 options, defined by ISC.
  366. /// 4o6-* options are used for inter-process communication. For details, see
  367. /// http://kea.isc.org/wiki/Dhcp4o6Design
  368. ///
  369. /// @todo: As those options are defined by ISC, they do not belong in std_option_defs.h.
  370. /// We need to move them to a separate file, e.g. isc_option_defs.h
  371. const OptionDefParams ISC_V6_OPTION_DEFINITIONS[] = {
  372. { "4o6-interface", ISC_V6_4O6_INTERFACE, OPT_STRING_TYPE, false,
  373. NO_RECORD_DEF, "" },
  374. { "4o6-source-address", ISC_V6_4O6_SRC_ADDRESS, OPT_IPV6_ADDRESS_TYPE,
  375. false, NO_RECORD_DEF, "" }
  376. };
  377. const int ISC_V6_OPTION_DEFINITIONS_SIZE =
  378. sizeof(ISC_V6_OPTION_DEFINITIONS) /
  379. sizeof(ISC_V6_OPTION_DEFINITIONS[0]);
  380. /// @brief MAPE option definitions
  381. const OptionDefParams MAPE_V6_OPTION_DEFINITIONS[] = {
  382. };
  383. const int MAPE_V6_OPTION_DEFINITIONS_SIZE =
  384. sizeof(MAPE_V6_OPTION_DEFINITIONS) /
  385. sizeof(const OptionDefParams);
  386. /// @brief MAPT option definitions
  387. const OptionDefParams MAPT_V6_OPTION_DEFINITIONS[] = {
  388. };
  389. const int MAPT_V6_OPTION_DEFINITIONS_SIZE =
  390. sizeof(MAPT_V6_OPTION_DEFINITIONS) /
  391. sizeof(const OptionDefParams);
  392. /// @brief LW option definitions
  393. const OptionDefParams LW_V6_OPTION_DEFINITIONS[] = {
  394. };
  395. const int LW_V6_OPTION_DEFINITIONS_SIZE =
  396. sizeof(LW_V6_OPTION_DEFINITIONS) /
  397. sizeof(const OptionDefParams);
  398. /// @brief Rule option definitions
  399. const OptionDefParams V4V6_RULE_OPTION_DEFINITIONS[] = {
  400. };
  401. const int V4V6_RULE_OPTION_DEFINITIONS_SIZE =
  402. sizeof(V4V6_RULE_OPTION_DEFINITIONS) /
  403. sizeof(const OptionDefParams);
  404. /// @brief Bind option definitions
  405. const OptionDefParams V4V6_BIND_OPTION_DEFINITIONS[] = {
  406. };
  407. const int V4V6_BIND_OPTION_DEFINITIONS_SIZE =
  408. sizeof(V4V6_BIND_OPTION_DEFINITIONS) /
  409. sizeof(const OptionDefParams);
  410. } // unnamed namespace
  411. } // namespace dhcp
  412. } // namespace isc
  413. #endif // STD_OPTION_DEFS_H