aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorUli Heilmeier <uh@heilmeier.eu>2019-04-11 10:53:15 +0200
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2019-04-13 06:44:35 +0000
commit9df7d1b6f182459f4048f111f16a70e0cc245983 (patch)
tree05e34cf1496ad9a0d9632066b33844b147a3a300 /epan/dissectors
parent75b03ac485935e35a7dcc97d91acd832daba89a5 (diff)
DHCPv6: adding some more options
Updating option list according to https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml and adding options: * RFC8026 OPTION_S46_PRIORITY * RFC8156 DHCPv6 Failover Protocol * RFC8357 Generalized UDP Source Port for DHCP Relay Change-Id: I4924e50689629af1f9b0e4f12c2fda38d0013d98 Reviewed-on: https://code.wireshark.org/review/32827 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-dhcpv6.c382
1 files changed, 382 insertions, 0 deletions
diff --git a/epan/dissectors/packet-dhcpv6.c b/epan/dissectors/packet-dhcpv6.c
index 0a1a0ade2a..7c9495214f 100644
--- a/epan/dissectors/packet-dhcpv6.c
+++ b/epan/dissectors/packet-dhcpv6.c
@@ -49,8 +49,10 @@
#include <epan/to_str.h>
#include <epan/arptypes.h>
#include <wsutil/str_util.h>
+#include <epan/strutil.h>
#include "packet-tcp.h"
#include "packet-arp.h"
+#include "packet-dns.h"
void proto_register_dhcpv6(void);
void proto_reg_handoff_dhcpv6(void);
@@ -144,6 +146,41 @@ static int hf_nai = -1;
static int hf_pd_exclude_pref_len = -1;
static int hf_pd_exclude_subnet_id = -1;
static int hf_option_captive_portal = -1;
+static int hf_option_s46_option_code = -1;
+static int hf_option_failover_binding_status = -1;
+static int hf_option_failover_connect_flags = -1;
+static int hf_option_failover_connect_reserved_flag = -1;
+static int hf_option_failover_connect_f_flag = -1;
+static int hf_option_failover_dns_hostname = -1;
+static int hf_option_failover_dns_zonename = -1;
+static int hf_option_failover_dns_flags = -1;
+static int hf_option_failover_dns_reserved_flag = -1;
+static int hf_option_failover_dns_u_flag = -1;
+static int hf_option_failover_dns_s_flag = -1;
+static int hf_option_failover_dns_r_flag = -1;
+static int hf_option_failover_dns_f_flag = -1;
+static int hf_option_failover_expiration_time = -1;
+static int hf_option_failover_max_unacked_bndupd = -1;
+static int hf_option_failover_mclt = -1;
+static int hf_option_failover_partner_lifetime = -1;
+static int hf_option_failover_partner_lifetime_sent = -1;
+static int hf_option_failover_partner_downtime = -1;
+static int hf_option_failover_partner_raw_clt_time = -1;
+static int hf_option_failover_major_version = -1;
+static int hf_option_failover_minor_version = -1;
+static int hf_option_failover_keepalive_time = -1;
+static int hf_option_failover_reconfigure_time = -1;
+static int hf_option_failover_reconfigure_key = -1;
+static int hf_option_failover_relationship_name = -1;
+static int hf_option_failover_server_flags = -1;
+static int hf_option_failover_server_reserved_flag = -1;
+static int hf_option_failover_server_a_flag = -1;
+static int hf_option_failover_server_s_flag = -1;
+static int hf_option_failover_server_c_flag = -1;
+static int hf_option_failover_server_state = -1;
+static int hf_option_failover_start_time_of_state = -1;
+static int hf_option_failover_state_expiration_time = -1;
+static int hf_option_relay_port = -1;
static int hf_dhcpv6_hopcount = -1;
static int hf_dhcpv6_xid = -1;
static int hf_dhcpv6_peeraddr = -1;
@@ -217,6 +254,9 @@ static gint ett_dhcpv6_nis_domain_name_option = -1;
static gint ett_dhcpv6_nisp_domain_name_option = -1;
static gint ett_dhcpv6_bcmcs_servers_domain_search_list_option = -1;
static gint ett_dhcpv6_s46_rule_flags = -1;
+static gint ett_dhcpv6_failover_connect_flags = -1;
+static gint ett_dhcpv6_failover_dns_flags = -1;
+static gint ett_dhcpv6_failover_server_flags = -1;
static expert_field ei_dhcpv6_bogus_length = EI_INIT;
static expert_field ei_dhcpv6_malformed_option = EI_INIT;
@@ -376,7 +416,33 @@ static dissector_handle_t dhcpv6_handle;
#define OPTION_ANI_AP_BSSID 108 /* RFC 7839 */
#define OPTION_ANI_OPERATOR_ID 109 /* RFC 7839 */
#define OPTION_ANI_OPERATOR_REALM 110 /* RFC 7839 */
+#define OPTION_S46_PRIORITY 111 /* RFC8026 */
#define OPTION_MUDURL 112 /* MUDURL */
+#define OPTION_V6_PREFIX64 113 /* RFC8115 */
+#define OPTION_F_BINDING_STATUS 114 /* RFC8156 */
+#define OPTION_F_CONNECT_FLAGS 115 /* RFC8156 */
+#define OPTION_F_DNS_REMOVAL_INFO 116 /* RFC8156 */
+#define OPTION_F_DNS_HOST_NAME 117 /* RFC8156 */
+#define OPTION_F_DNS_ZONE_NAME 118 /* RFC8156 */
+#define OPTION_F_DNS_FLAGS 119 /* RFC8156 */
+#define OPTION_F_EXPIRATION_TIME 120 /* RFC8156 */
+#define OPTION_F_MAX_UNACKED_BNDUPD 121 /* RFC8156 */
+#define OPTION_F_MCLT 122 /* RFC8156 */
+#define OPTION_F_PARTNER_LIFETIME 123 /* RFC8156 */
+#define OPTION_F_PARTNER_LIFETIME_SENT 124 /* RFC8156 */
+#define OPTION_F_PARTNER_DOWN_TIME 125 /* RFC8156 */
+#define OPTION_F_PARTNER_RAW_CLT_TIME 126 /* RFC8156 */
+#define OPTION_F_PROTOCOL_VERSION 127 /* RFC8156 */
+#define OPTION_F_KEEPALIVE_TIME 128 /* RFC8156 */
+#define OPTION_F_RECONFIGURE_DATA 129 /* RFC8156 */
+#define OPTION_F_RELATIONSHIP_NAME 130 /* RFC8156 */
+#define OPTION_F_SERVER_FLAGS 131 /* RFC8156 */
+#define OPTION_F_SERVER_STATE 132 /* RFC8156 */
+#define OPTION_F_START_TIME_OF_STATE 133 /* RFC8156 */
+#define OPTION_F_STATE_EXPIRATION_TIME 134 /* RFC8156 */
+#define OPTION_RELAY_PORT 135 /* RFC8357 */
+#define OPTION_V6_SZTP_REDIRECT 136 /* RFC-ietf-netconf-zerotouch-29 */
+#define OPTION_S46_BIND_IPV6_PREFIX 137 /* RFC8539 */
#define OPTION_IPv6_ADDRESS_ANDSF 143 /* RFC 6153 */
/* temporary value until defined by IETF */
@@ -523,7 +589,33 @@ static const value_string opttype_vals[] = {
{ OPTION_ANI_AP_BSSID, "Access Point BSSID" },
{ OPTION_ANI_OPERATOR_ID, "Access Network Operator ID" },
{ OPTION_ANI_OPERATOR_REALM, "Access Network Operator Realm" },
+ { OPTION_S46_PRIORITY, "S46 Priority" },
{ OPTION_MUDURL, "Manufacturer Usage Description" },
+ { OPTION_V6_PREFIX64, "IPv4/IPv6 Multicast Prefixes" },
+ { OPTION_F_BINDING_STATUS, "Failover Binding Status" },
+ { OPTION_F_CONNECT_FLAGS, "Failover Connect Flags" },
+ { OPTION_F_DNS_REMOVAL_INFO, "Failover DNS Removal Info" },
+ { OPTION_F_DNS_HOST_NAME, "Failover DNS Hostname" },
+ { OPTION_F_DNS_ZONE_NAME, "Failover DNS Zone Name" },
+ { OPTION_F_DNS_FLAGS, "Failover DNS Flags" },
+ { OPTION_F_EXPIRATION_TIME, "Failover Expiration Time" },
+ { OPTION_F_MAX_UNACKED_BNDUPD, "Failover Maximum Number Unacked BNDUPD Messages" },
+ { OPTION_F_MCLT, "Failover Maximum Client Lead Time (MCLT)" },
+ { OPTION_F_PARTNER_LIFETIME, "Failover Partner Lifetime" },
+ { OPTION_F_PARTNER_LIFETIME_SENT,"Failover Partner Lifetime Sent" },
+ { OPTION_F_PARTNER_DOWN_TIME, "Failover Partner Down Time" },
+ { OPTION_F_PARTNER_RAW_CLT_TIME, "Failover Partner Raw Client Time" },
+ { OPTION_F_PROTOCOL_VERSION, "Failover Protocol Version" },
+ { OPTION_F_KEEPALIVE_TIME, "Failover Keepalive Time" },
+ { OPTION_F_RECONFIGURE_DATA, "Failover Reconfigure Data" },
+ { OPTION_F_RELATIONSHIP_NAME, "Failover Relationship Name" },
+ { OPTION_F_SERVER_FLAGS, "Failover Server Flags" },
+ { OPTION_F_SERVER_STATE, "Failover Server State" },
+ { OPTION_F_START_TIME_OF_STATE, "Failover Start Time of State" },
+ { OPTION_F_STATE_EXPIRATION_TIME,"Failover State Expiration Time" },
+ { OPTION_RELAY_PORT, "Relay Source Port" },
+ { OPTION_V6_SZTP_REDIRECT, "SZTP Redirect" },
+ { OPTION_S46_BIND_IPV6_PREFIX, "Softwire Source Binding Prefix Hint" },
{ OPTION_IPv6_ADDRESS_ANDSF, "ANDSF IPv6 Address" },
{ OPTION_MIP6_HA, "Mobile IPv6 Home Agent" },
{ OPTION_MIP6_HOA, "Mobile IPv6 Home Address" },
@@ -822,6 +914,66 @@ static const value_string eue_capabilities_encoding [] = {
};
static value_string_ext eue_capabilities_encoding_ext = VALUE_STRING_EXT_INIT(eue_capabilities_encoding);
+static const value_string s46_opt_code_vals[] = {
+ { 64, "DS-Lite" },
+ { 88, "DHCPv4 over DHCPv6" },
+ { 94, "MAP-E" },
+ { 95, "MAP-T" },
+ { 96, "Lightweight 4over6" },
+ { 0, NULL },
+};
+
+static const value_string failover_binding_status_vals[] = {
+ { 0, "reserved" },
+ { 1, "ACTIVE" },
+ { 2, "EXPIRED" },
+ { 3, "RELEASED" },
+ { 4, "PENDING-FREE" },
+ { 5, "FREE" },
+ { 6, "FREE-BACKUP" },
+ { 7, "ABANDONED" },
+ { 8, "RESET" },
+ { 0, NULL },
+};
+
+static const value_string failover_server_state_vals[] = {
+ { 0, "reserved" },
+ { 1, "Startup state (1)" },
+ { 2, "Normal state" },
+ { 3, "Communications interrupted" },
+ { 4, "Partner down" },
+ { 5, "Synchronizing" },
+ { 6, "Recovering bindings from partner" },
+ { 7, "Waiting out MCLT after RECOVER" },
+ { 8, "Interlock state prior to NORMAL" },
+ { 9, "Comm. failed during resolution" },
+ { 10, "Primary resolved its conflicts" },
+ { 0, NULL },
+};
+
+static const int *dhcpv6_failover_connect_flags_fields[] = {
+ &hf_option_failover_connect_reserved_flag,
+ &hf_option_failover_connect_f_flag,
+ NULL
+};
+
+static const int *dhcpv6_failover_dns_flags_fields[] = {
+ &hf_option_failover_dns_reserved_flag,
+ &hf_option_failover_dns_u_flag,
+ &hf_option_failover_dns_s_flag,
+ &hf_option_failover_dns_r_flag,
+ &hf_option_failover_dns_f_flag,
+ NULL
+};
+
+static const int *dhcpv6_failover_server_flags_fields[] = {
+ &hf_option_failover_server_reserved_flag,
+ &hf_option_failover_server_a_flag,
+ &hf_option_failover_server_s_flag,
+ &hf_option_failover_server_c_flag,
+ NULL
+};
+
typedef struct hopcount_info_t {
guint8 hopcount;
proto_item *pi;
@@ -2207,6 +2359,163 @@ dhcpv6_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree,
proto_item_set_url(ti_cp);
break;
}
+ case OPTION_S46_PRIORITY:
+ temp_optlen = optlen;
+ while (temp_optlen >= 2) {
+ proto_tree_add_item(subtree, hf_option_s46_option_code, tvb, off, 2, ENC_BIG_ENDIAN);
+ temp_optlen -= 2;
+ off += 2;
+ }
+ break;
+ case OPTION_F_BINDING_STATUS:
+ if (optlen != 1) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_binding_status, tvb, off, 1, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_CONNECT_FLAGS:
+ if (optlen != 2) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_bitmask(subtree, tvb, off, hf_option_failover_connect_flags, ett_dhcpv6_failover_connect_flags, dhcpv6_failover_connect_flags_fields, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_DNS_HOST_NAME:
+ {
+ const guchar *dns_name;
+ guint dns_name_len;
+
+ get_dns_name(tvb, off, optlen, off, &dns_name, &dns_name_len);
+ proto_tree_add_string(subtree, hf_option_failover_dns_hostname, tvb, off, optlen, format_text(wmem_packet_scope(), dns_name, dns_name_len));
+ break;
+ }
+ case OPTION_F_DNS_ZONE_NAME:
+ {
+ const guchar *dns_name;
+ guint dns_name_len;
+
+ get_dns_name(tvb, off, optlen, off, &dns_name, &dns_name_len);
+ proto_tree_add_string(subtree, hf_option_failover_dns_zonename, tvb, off, optlen, format_text(wmem_packet_scope(), dns_name, dns_name_len));
+ break;
+ }
+ case OPTION_F_DNS_FLAGS:
+ if (optlen != 2) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_bitmask(subtree, tvb, off, hf_option_failover_dns_flags, ett_dhcpv6_failover_dns_flags, dhcpv6_failover_dns_flags_fields, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_EXPIRATION_TIME:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_expiration_time, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_MAX_UNACKED_BNDUPD:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_max_unacked_bndupd, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_MCLT:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_mclt, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_PARTNER_LIFETIME:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_partner_lifetime, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_PARTNER_LIFETIME_SENT:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_partner_lifetime_sent, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_PARTNER_DOWN_TIME:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_partner_downtime, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_PARTNER_RAW_CLT_TIME:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_partner_raw_clt_time, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_PROTOCOL_VERSION:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_major_version, tvb, off, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_option_failover_minor_version, tvb, off+2, 2, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_KEEPALIVE_TIME:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_keepalive_time, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_RECONFIGURE_DATA:
+ if (optlen < 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_reconfigure_time, tvb, off, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_option_failover_reconfigure_key, tvb, off+4, optlen-4, ENC_NA);
+ break;
+ case OPTION_F_RELATIONSHIP_NAME:
+ proto_tree_add_item(subtree, hf_option_failover_relationship_name, tvb, off, optlen, ENC_UTF_8|ENC_NA);
+ break;
+ case OPTION_F_SERVER_FLAGS:
+ if (optlen != 1) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_bitmask(subtree, tvb, off, hf_option_failover_server_flags, ett_dhcpv6_failover_server_flags, dhcpv6_failover_server_flags_fields, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_SERVER_STATE:
+ if (optlen != 1) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_server_state, tvb, off, 1, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_START_TIME_OF_STATE:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_start_time_of_state, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_F_STATE_EXPIRATION_TIME:
+ if (optlen != 4) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Failover: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_failover_state_expiration_time, tvb, off, 4, ENC_BIG_ENDIAN);
+ break;
+ case OPTION_RELAY_PORT:
+ if (optlen != 2) {
+ expert_add_info_format(pinfo, option_item, &ei_dhcpv6_malformed_option, "Relay Port: malformed option");
+ break;
+ }
+ proto_tree_add_item(subtree, hf_option_relay_port, tvb, off, 2, ENC_BIG_ENDIAN);
+ break;
}
return 4 + optlen;
@@ -2562,6 +2871,76 @@ proto_register_dhcpv6(void)
{ "NTP Multicast Address", "dhcpv6.ntpserver.mc_addr", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{ &hf_option_captive_portal,
{ "Captive Portal", "dhcpv6.captive_portal", FT_STRING, BASE_NONE, NULL, 0x0, "The contact URI for the captive portal that the user should connect to", HFILL }},
+ { &hf_option_s46_option_code,
+ { "S46 Option code", "dhcpv6.option_code", FT_UINT16, BASE_HEX, VALS(s46_opt_code_vals), 0x0, NULL, HFILL }},
+ { &hf_option_failover_binding_status,
+ { "Failover Binding Status", "dhcpv6.failover.binding_status", FT_UINT8, BASE_DEC, VALS(failover_binding_status_vals), 0x0, NULL, HFILL }},
+ { &hf_option_failover_connect_flags,
+ { "Flags", "dhcpv6.failover.connect.flags", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_connect_reserved_flag,
+ { "Reserved", "dhcpv6.failover.connect.flags.reserved", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0xfffe, NULL, HFILL }},
+ { &hf_option_failover_connect_f_flag,
+ { "Fixed PD Length (F)", "dhcpv6.failover.connect.flags.f", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0x0001, NULL, HFILL }},
+ { &hf_option_failover_dns_hostname,
+ { "DNS Hostname", "dhcpv6.failover.dns_hostname", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_dns_zonename,
+ { "DNS Zone Name", "dhcpv6.failover.dns_zonename", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_dns_flags,
+ { "Flags", "dhcpv6.failover.dns.flags", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_dns_reserved_flag,
+ { "Reserved", "dhcpv6.failover.dns.flags.reserved", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0xfff0, NULL, HFILL }},
+ { &hf_option_failover_dns_u_flag,
+ { "Using Requested FQDN (U)", "dhcpv6.failover.dns.flags.u", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0x0008, NULL, HFILL }},
+ { &hf_option_failover_dns_s_flag,
+ { "Synthesized Name (S)", "dhcpv6.failover.dns.flags.s", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0x0004, NULL, HFILL }},
+ { &hf_option_failover_dns_r_flag,
+ { "Rev Uptodate (R)", "dhcpv6.failover.dns.flags.r", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0x0002, NULL, HFILL }},
+ { &hf_option_failover_dns_f_flag,
+ { "Fwd Uptodate (F)", "dhcpv6.failover.dns.flags.f", FT_BOOLEAN, 16, TFS(&tfs_true_false), 0x0001, NULL, HFILL }},
+ { &hf_option_failover_expiration_time,
+ { "Expiration Time", "dhcpv6.failover.expiration_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_max_unacked_bndupd,
+ { "Max number of unacked BNDUPD messages", "dhcpv6.failover.max_unacked_bndupd", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_mclt,
+ { "Maximum Client Lead Time (MCLT)", "dhcpv6.failover.mclt", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_partner_lifetime,
+ { "Partner Lifetime", "dhcpv6.failover.partner_lifetime", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_partner_lifetime_sent,
+ { "Partner Lifetime Sent", "dhcpv6.failover.partner_lifetime_sent", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_partner_downtime,
+ { "Partner Down Time", "dhcpv6.failover.partner_down_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_partner_raw_clt_time,
+ { "Partner Raw Client Time", "dhcpv6.failover.partner_raw_clt_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_major_version,
+ { "Protocol Major Version", "dhcpv6.failover.protocol.major_version", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_minor_version,
+ { "Protocol Minor Version", "dhcpv6.failover.protocol.minor_version", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_keepalive_time,
+ { "Keepalive Time", "dhcpv6.failover.keepalive_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_reconfigure_time,
+ { "Reconfigure Time", "dhcpv6.failover.reconfigure_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_reconfigure_key,
+ { "Reconfigure Key", "dhcpv6.failover.reconfigure_key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_relationship_name,
+ { "Relationship Name", "dhcpv6.failover.relationship_name", FT_STRING, STR_UNICODE, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_server_flags,
+ { "Flags", "dhcpv6.failover.server.flags", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_server_reserved_flag,
+ { "Reserved", "dhcpv6.failover.server.flags.reserved", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0xf8, NULL, HFILL }},
+ { &hf_option_failover_server_a_flag,
+ { "Ack Startup (A)", "dhcpv6.failover.server.flags.a", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04, NULL, HFILL }},
+ { &hf_option_failover_server_s_flag,
+ { "Startup (S)", "dhcpv6.failover.server.flags.s", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x02, NULL, HFILL }},
+ { &hf_option_failover_server_c_flag,
+ { "Communicated (C)", "dhcpv6.failover.server.flags.c", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x01, NULL, HFILL }},
+ { &hf_option_failover_server_state,
+ { "Server State", "dhcpv6.failover.server_state", FT_UINT8, BASE_DEC, VALS(failover_server_state_vals), 0, NULL, HFILL }},
+ { &hf_option_failover_start_time_of_state,
+ { "Start Time of State", "dhcpv6.failover.start_time_of_state", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_failover_state_expiration_time,
+ { "State Expiration Time", "dhcpv6.failover.state_expiration_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ { &hf_option_relay_port,
+ { "Downstream Source Port", "dhcpv6.relay_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_option_ntpserver_fqdn,
{ "NTP Server FQDN", "dhcpv6.ntpserver.fqdn", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_packetcable_ccc_suboption,
@@ -2680,6 +3059,9 @@ proto_register_dhcpv6(void)
&ett_dhcpv6_nisp_domain_name_option,
&ett_dhcpv6_bcmcs_servers_domain_search_list_option,
&ett_dhcpv6_s46_rule_flags,
+ &ett_dhcpv6_failover_connect_flags,
+ &ett_dhcpv6_failover_dns_flags,
+ &ett_dhcpv6_failover_server_flags,
};
static ei_register_info ei[] = {