116 INFORMATION_REFRESH_TIME,
146 ERP_LOCAL_DOMAIN_NAME,
158 KRB_DEFAULT_REALM_NAME,
182 typedef std::vector<uint8_t> options_type;
185 options_type options;
187 ia_na_type(uint32_t
id = 0, uint32_t t1 = 0, uint32_t t2 = 0,
188 const options_type& options = options_type())
189 : id(
id), t1(t1), t2(t2), options(options) {}
199 typedef std::vector<uint8_t> options_type;
202 options_type options;
205 const options_type& options = options_type())
206 : id(
id), options(options) {}
215 typedef std::vector<uint8_t> options_type;
218 uint32_t preferred_lifetime, valid_lifetime;
219 options_type options;
222 uint32_t preferred_lifetime = 0, uint32_t valid_lifetime = 0,
223 const options_type& options = options_type())
224 : address(address), preferred_lifetime(preferred_lifetime),
225 valid_lifetime(valid_lifetime), options(options) {}
234 typedef std::vector<uint8_t> auth_info_type;
236 uint8_t protocol, algorithm, rdm;
237 uint64_t replay_detection;
238 auth_info_type auth_info;
241 uint8_t rdm = 0, uint64_t replay_detection = 0,
242 const auth_info_type& auth_info = auth_info_type())
243 : protocol(protocol), algorithm(algorithm), rdm(rdm),
244 replay_detection(replay_detection), auth_info(auth_info) {}
257 : code(code), message(message) { }
266 typedef std::vector<uint8_t> data_type;
268 uint32_t enterprise_number;
272 const data_type& data = data_type())
273 : enterprise_number(enterprise_number), data(data) { }
289 typedef std::vector<class_option_data_type> data_type;
302 typedef std::vector<class_option_data_type> class_data_type;
304 uint32_t enterprise_number;
305 class_data_type vendor_class_data;
308 const class_data_type& vendor_class_data = class_data_type())
309 : enterprise_number(enterprise_number),
310 vendor_class_data(vendor_class_data) { }
320 static const uint16_t duid_id = 1;
321 typedef std::vector<uint8_t> lladdress_type;
325 lladdress_type lladdress;
327 duid_llt(uint16_t hw_type = 0, uint32_t time = 0,
328 const lladdress_type& lladdress = lladdress_type())
329 : hw_type(hw_type), time(time), lladdress(lladdress) {}
333 static duid_llt from_bytes(
const uint8_t* buffer, uint32_t total_sz);
340 static const uint16_t duid_id = 2;
341 typedef std::vector<uint8_t> identifier_type;
343 uint32_t enterprise_number;
344 identifier_type identifier;
346 duid_en(uint32_t enterprise_number = 0,
347 const identifier_type& identifier = identifier_type())
348 : enterprise_number(enterprise_number), identifier(identifier) {}
352 static duid_en from_bytes(
const uint8_t* buffer, uint32_t total_sz);
359 static const uint16_t duid_id = 3;
360 typedef std::vector<uint8_t> lladdress_type;
363 lladdress_type lladdress;
366 const lladdress_type& lladdress = lladdress_type())
367 : hw_type(hw_type), lladdress(lladdress) {}
371 static duid_ll from_bytes(
const uint8_t* buffer, uint32_t total_sz);
384 duid_type(uint16_t
id = 0,
const data_type& data = data_type())
385 : id(
id), data(data) {}
388 : id(duid_llt::duid_id), data(identifier.serialize()) {}
391 : id(duid_en::duid_id), data(identifier.serialize()) {}
394 : id(duid_ll::duid_id), data(identifier.serialize()) {}
420 static metadata extract_metadata(
const uint8_t *buffer, uint32_t total_sz);
437 DHCPv6(
const uint8_t* buffer, uint32_t total_sz);
456 return header_data_[1];
465 return (header_data_[1] << 16) | (header_data_[2] << 8) | header_data_[3];
501 void msg_type(MessageType type);
508 void hop_count(uint8_t count);
522 void peer_address(
const ipaddress_type& addr);
529 void link_address(
const ipaddress_type& addr);
540 ia_na_type ia_na()
const;
549 ia_ta_type ia_ta()
const;
557 ia_address_type ia_address()
const;
565 option_request_type option_request()
const;
573 uint8_t preference()
const;
581 uint16_t elapsed_time()
const;
589 relay_msg_type relay_message()
const;
597 authentication_type authentication()
const;
605 ipaddress_type server_unicast()
const;
613 status_code_type status_code()
const;
621 bool has_rapid_commit()
const;
629 user_class_type user_class()
const;
637 vendor_class_type vendor_class()
const;
645 vendor_info_type vendor_info()
const;
653 interface_id_type interface_id()
const;
661 uint8_t reconfigure_msg()
const;
669 bool has_reconfigure_accept()
const;
677 duid_type client_id()
const;
685 duid_type server_id()
const;
695 void ia_na(
const ia_na_type& value);
703 void ia_ta(
const ia_ta_type& value);
710 void ia_address(
const ia_address_type& value);
717 void option_request(
const option_request_type& value);
724 void preference(uint8_t value);
731 void elapsed_time(uint16_t value);
738 void relay_message(
const relay_msg_type& value);
745 void authentication(
const authentication_type& value);
752 void server_unicast(
const ipaddress_type& value);
759 void status_code(
const status_code_type& value);
771 void user_class(
const user_class_type& value);
778 void vendor_class(
const vendor_class_type& value);
785 void vendor_info(
const vendor_info_type& value);
792 void interface_id(
const interface_id_type& value);
799 void reconfigure_msg(uint8_t value);
804 void reconfigure_accept();
811 void client_id(
const duid_type& value);
818 void server_id(
const duid_type& value);
825 bool is_relay_message()
const;
835 void add_option(
const option& opt);
846 bool remove_option(OptionTypes type);
857 const option* search_option(OptionTypes type)
const;
866 uint32_t header_size()
const;
875 bool matches_response(
const uint8_t* ptr, uint32_t total_sz)
const;
892 void write_serialization(uint8_t* buffer, uint32_t total_sz);
893 void write_option(
const option& option, Memory::OutputMemoryStream& stream)
const;
894 options_type::const_iterator search_option_iterator(OptionTypes type)
const;
895 options_type::iterator search_option_iterator(OptionTypes type);
897 template <
template <
typename>
class Functor>
898 const option* safe_search_option(OptionTypes opt, uint32_t size)
const {
899 const option* option = search_option(opt);
900 if (!option || Functor<uint32_t>()(option->data_size(), size)) {
907 T search_and_convert(OptionTypes opt)
const {
908 const option* option = search_option(opt);
910 throw option_not_found();
912 return option->to<T>();
915 uint8_t header_data_[4];
916 uint32_t options_size_;
917 ipaddress_type link_addr_, peer_addr_;
918 options_type options_;