uat: add a reset callback.
[metze/wireshark/wip.git] / epan / dissectors / packet-bootp.c
index b35bdce4997b1702eb022128d321ad59a809a1b0..c9b204545a5111cc936d00806bcf6c5df4ca37a7 100644 (file)
@@ -43,6 +43,7 @@
  * RFC 3825: Dynamic Host Configuration Protocol Option for Coordinate-based Location Configuration Information
  * RFC 3925: Vendor-Identifying Vendor Options for Dynamic Host Configuration Protocol version 4 (DHCPv4)
  * RFC 3942: Reclassifying DHCPv4 Options
+ * RFC 4174: The IPv4 Dynamic Host Configuration Protocol (DHCP) Option for the Internet Storage Name Service
  * RFC 4243: Vendor-Specific Information Suboption for the Dynamic Host Configuration Protocol (DHCP) Relay Agent Option
  * RFC 4361: Node-specific Client Identifiers for Dynamic Host Configuration Protocol Version Four (DHCPv4)
  * RFC 4388: Dynamic Host Configuration Protocol (DHCP) Leasequery
@@ -73,6 +74,8 @@
  *     http://www.cablelabs.com/projects/cablehome/downloads/specs/CH-SP-CH1.1-I11-060407.pdf
  * Broadband Forum TR-111
  *     http://www.broadband-forum.org/technical/download/TR-111.pdf
+ * Boot Server Discovery Protocol (BSDP)
+ *     http://opensource.apple.com/source/bootp/bootp-198.1/Documentation/BSDP.doc
  *
  * Wireshark - Network traffic analyzer
  * By Gerald Combs <gerald@wireshark.org>
 #include <epan/addr_resolv.h>
 #include <epan/prefs.h>
 #include <epan/tap.h>
+#include <epan/stat_tap_ui.h>
 #include <epan/arptypes.h>
 #include <epan/sminmpec.h>
 #include <epan/expert.h>
 #include <epan/uat.h>
+#include <epan/oui.h>
+#include <wsutil/str_util.h>
+#include <wsutil/strtoi.h>
 void proto_register_bootp(void);
 void proto_reg_handoff_bootp(void);
 
@@ -169,6 +176,8 @@ static int hf_bootp_client_identifier_time = -1;
 static int hf_bootp_client_identifier_link_layer_address = -1;
 static int hf_bootp_client_identifier_enterprise_num = -1;
 static int hf_bootp_client_identifier = -1;
+static int hf_bootp_client_identifier_type = -1;
+static int hf_bootp_client_identifier_undef = -1;
 static int hf_bootp_option_type = -1;
 static int hf_bootp_option_length = -1;
 static int hf_bootp_option_value = -1;
@@ -277,6 +286,28 @@ static int hf_bootp_option43_cl_device_id_ca = -1;                 /* 43:53 CL  */
 static int hf_bootp_option43_cl_device_id_x509 = -1;                   /* 43:54 CL  */
 static int hf_bootp_option43_cl_end = -1;                              /* 43:255 CL */
 
+static int hf_bootp_option43_bsdp_suboption = -1;                      /* 43 suboption */
+static int hf_bootp_option43_bsdp_message_type = -1;                   /* 43:1 BSDP  */
+static int hf_bootp_option43_bsdp_version = -1;                                /* 43:2 BSDP  */
+static int hf_bootp_option43_bsdp_server_identifier = -1;              /* 43:3 BSDP  */
+static int hf_bootp_option43_bsdp_server_priority = -1;                        /* 43:4 BSDP  */
+static int hf_bootp_option43_bsdp_reply_port = -1;                     /* 43:5 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_list_path = -1;           /* 43:6 BSDP  */
+static int hf_bootp_option43_bsdp_default_boot_image_id = -1;          /* 43:7 BSDP  */
+static int hf_bootp_option43_bsdp_selected_boot_image_id = -1;         /* 43:8 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_list = -1;                        /* 43:9 BSDP  */
+static int hf_bootp_option43_bsdp_netboot_firmware = -1;               /* 43:10 BSDP  */
+static int hf_bootp_option43_bsdp_attributes_filter_list = -1;         /* 43:11 BSDP  */
+static int hf_bootp_option43_bsdp_message_size = -1;                   /* 43:12 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_index = -1;               /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_attribute = -1;           /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_attribute_install = -1;   /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_attribute_kind = -1;      /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_attribute_reserved = -1;  /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_image_desc = -1;                     /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_name = -1;                        /* 43 BSDP  */
+static int hf_bootp_option43_bsdp_boot_image_name_len = -1;            /* 43 BSDP  */
+
 static int hf_bootp_option43_alcatel_suboption = -1;                   /* 43 suboption */
 static int hf_bootp_option43_alcatel_padding = -1;                     /* 43:0 Alcatel  */
 static int hf_bootp_option43_alcatel_vlan_id = -1;                     /* 43:58 Alcatel  */
@@ -374,6 +405,7 @@ static int hf_bootp_option82_vi_cl_docsis_version = -1;
                                                                        /* 82:9 suboptions end */
 static int hf_bootp_option82_flags = -1;                               /* 82:10 */
 static int hf_bootp_option82_server_id_override = -1;                  /* 82:11 */
+static int hf_bootp_option82_relay_agent_id = -1;                      /* 82:12 */
 static int hf_bootp_option82_link_selection_cisco = -1;                        /* 82:150 */
 static int hf_bootp_option82_vrf_name_vpn_id = -1;                     /* 82:151 */
                                                                        /* 82:151 suboptions */
@@ -384,6 +416,42 @@ static int hf_bootp_option82_vrf_name_vpn_id_index = -1;
                                                                        /* 82:151 suboptions end */
 static int hf_bootp_option82_server_id_override_cisco = -1;            /* 82:152 */
 
+static int hf_bootp_option_isns_functions = -1;
+static int hf_bootp_option_isns_functions_enabled = -1;
+static int hf_bootp_option_isns_functions_dd_authorization = -1;
+static int hf_bootp_option_isns_functions_sec_policy_distibution = -1;
+static int hf_bootp_option_isns_functions_reserved = -1;
+
+static int hf_bootp_option_isns_discovery_domain_access = -1;
+static int hf_bootp_option_isns_discovery_domain_access_enabled = -1;
+static int hf_bootp_option_isns_discovery_domain_access_control_node = -1;
+static int hf_bootp_option_isns_discovery_domain_access_iscsi_target = -1;
+static int hf_bootp_option_isns_discovery_domain_access_iscsi_inititator = -1;
+static int hf_bootp_option_isns_discovery_domain_access_ifcp_target_port = -1;
+static int hf_bootp_option_isns_discovery_domain_access_ifcp_initiator_port = -1;
+static int hf_bootp_option_isns_discovery_domain_access_reserved = -1;
+
+static int hf_bootp_option_isns_administrative_flags = -1;
+static int hf_bootp_option_isns_administrative_flags_enabled = -1;
+static int hf_bootp_option_isns_administrative_flags_heartbeat = -1;
+static int hf_bootp_option_isns_administrative_flags_management_scns = -1;
+static int hf_bootp_option_isns_administrative_flags_default_dd = -1;
+static int hf_bootp_option_isns_administrative_flags_reserved = -1;
+
+static int hf_bootp_option_isns_server_security_bitmap = -1;
+static int hf_bootp_option_isns_server_security_bitmap_enabled = -1;
+static int hf_bootp_option_isns_server_security_bitmap_ike_ipsec_enabled = -1;
+static int hf_bootp_option_isns_server_security_bitmap_main_mode = -1;
+static int hf_bootp_option_isns_server_security_bitmap_aggressive_mode = -1;
+static int hf_bootp_option_isns_server_security_bitmap_pfs = -1;
+static int hf_bootp_option_isns_server_security_bitmap_transport_mode = -1;
+static int hf_bootp_option_isns_server_security_bitmap_tunnel_mode = -1;
+static int hf_bootp_option_isns_server_security_bitmap_reserved = -1;
+
+static int hf_bootp_option_isns_heartbeat_originator_addr = -1;
+static int hf_bootp_option_isns_primary_server_addr = -1;
+static int hf_bootp_option_isns_secondary_server_addr_list = -1;
+
 static int hf_bootp_option_novell_dss_string = -1;                     /* 85 */
 static int hf_bootp_option_novell_dss_ip = -1;                         /* 85 */
 static int hf_bootp_option_novell_ds_tree_name = -1;                   /* 86 */
@@ -407,6 +475,8 @@ static int hf_bootp_option_civic_location_country = -1;                     /* 99 */
 static int hf_bootp_option_civic_location_ca_type = -1;                        /* 99 */
 static int hf_bootp_option_civic_location_ca_length = -1;              /* 99 */
 static int hf_bootp_option_civic_location_ca_value = -1;               /* 99 */
+static int hf_bootp_option_tz_pcode = -1;                              /* 100 */
+static int hf_bootp_option_tz_tcode = -1;                              /* 101 */
 static int hf_bootp_option_netinfo_parent_server_address = -1;         /* 112 */
 static int hf_bootp_option_netinfo_parent_server_tag = -1;             /* 113 */
 static int hf_bootp_option_dhcp_auto_configuration = -1;               /* 116 */
@@ -439,6 +509,7 @@ static int hf_bootp_option_vi_class_data_length = -1;                       /* 124 */
 static int hf_bootp_option_vi_class_data = -1;                         /* 124 */
 
 static int hf_bootp_option125_enterprise = -1;
+static int hf_bootp_option125_length = -1;
 static int hf_bootp_option125_value = -1;                              /* 125 suboption value */
 static int hf_bootp_option125_value_8 = -1;                            /* 125 suboption value */
 static int hf_bootp_option125_value_16 = -1;                           /* 125 suboption value */
@@ -462,10 +533,32 @@ static int hf_bootp_option_subnet_selection_option = -1;          /* 118 */
 static int hf_bootp_option_lost_server_domain_name = -1;               /* 137 */
 static int hf_bootp_option_capwap_access_controller = -1;              /* 138 */
 static int hf_bootp_option_tftp_server_address = -1;                   /* 150 */
+static int hf_bootp_option_mudurl = -1;                                        /* 161 */
+static int hf_bootp_option_pxe_config_file = -1;                       /* 209 */
+static int hf_bootp_option_pxe_path_prefix = -1;                       /* 210 */
 static int hf_bootp_option_6RD_ipv4_mask_len = -1;                     /* 212 */
 static int hf_bootp_option_6RD_prefix_len = -1;                                /* 212 */
 static int hf_bootp_option_6RD_prefix = -1;                            /* 212 */
 static int hf_bootp_option_6RD_border_relay_ip = -1;                   /* 212 */
+static int hf_bootp_option242_avaya = -1;                              /* 242 */
+static int hf_bootp_option242_avaya_tlssrvr = -1;                      /* 242 */
+static int hf_bootp_option242_avaya_httpsrvr = -1;                     /* 242 */
+static int hf_bootp_option242_avaya_httpdir = -1;                      /* 242 */
+static int hf_bootp_option242_avaya_static = -1;                       /* 242 */
+static int hf_bootp_option242_avaya_mcipadd = -1;                      /* 242 */
+static int hf_bootp_option242_avaya_dot1x = -1;                                /* 242 */
+static int hf_bootp_option242_avaya_icmpdu = -1;                       /* 242 */
+static int hf_bootp_option242_avaya_icmpred = -1;                      /* 242 */
+static int hf_bootp_option242_avaya_l2q = -1;                          /* 242 */
+static int hf_bootp_option242_avaya_l2qvlan = -1;                      /* 242 */
+static int hf_bootp_option242_avaya_loglocal = -1;                     /* 242 */
+static int hf_bootp_option242_avaya_phy1stat = -1;                     /* 242 */
+static int hf_bootp_option242_avaya_phy2stat = -1;                     /* 242 */
+static int hf_bootp_option242_avaya_procpswd = -1;                     /* 242 */
+static int hf_bootp_option242_avaya_procstat = -1;                     /* 242 */
+static int hf_bootp_option242_avaya_snmpadd = -1;                      /* 242 */
+static int hf_bootp_option242_avaya_snmpstring = -1;                   /* 242 */
+static int hf_bootp_option242_avaya_vlantest = -1;                     /* 242 */
 static int hf_bootp_option_private_proxy_autodiscovery = -1;           /* 252 */
 static int hf_bootp_option_end = -1;                                   /* 255 */
 static int hf_bootp_option_end_overload = -1;                          /* 255 (with overload)*/
@@ -492,10 +585,21 @@ static gint ett_bootp_option82_suboption9 = -1;
 static gint ett_bootp_option125_suboption = -1;
 static gint ett_bootp_option125_tr111_suboption = -1;
 static gint ett_bootp_option125_cl_suboption = -1;
+static gint ett_bootp_option242_suboption = -1;
 static gint ett_bootp_fqdn = -1;
 static gint ett_bootp_fqdn_flags = -1;
 static gint ett_bootp_filename_option = -1;
 static gint ett_bootp_server_hostname = -1;
+static gint ett_bootp_isns_functions = -1;
+static gint ett_bootp_isns_discovery_domain_access = -1;
+static gint ett_bootp_isns_administrative_flags = -1;
+static gint ett_bootp_isns_server_security_bitmap = -1;
+static gint ett_bootp_isns_secondary_server_addr = -1;
+static gint ett_bootp_o43_bsdp_boot_image = -1;
+static gint ett_bootp_o43_bsdp_attributes = -1;
+static gint ett_bootp_o43_bsdp_image_desc_list = -1;
+static gint ett_bootp_o43_bsdp_image_desc = -1;
+static gint ett_bootp_o43_bsdp_attributes_flags = -1;
 
 static expert_field ei_bootp_bad_length = EI_INIT;
 static expert_field ei_bootp_bad_bitfield = EI_INIT;
@@ -513,12 +617,16 @@ static expert_field ei_bootp_option_classless_static_route = EI_INIT;
 static expert_field ei_bootp_option125_enterprise_malformed = EI_INIT;
 static expert_field ei_bootp_option_6RD_malformed = EI_INIT;
 static expert_field ei_bootp_option82_vi_cl_tag_unknown = EI_INIT;
+static expert_field ei_bootp_option_parse_err = EI_INIT;
 static expert_field ei_bootp_suboption_invalid = EI_INIT;
 static expert_field ei_bootp_secs_le = EI_INIT;
 static expert_field ei_bootp_end_option_missing = EI_INIT;
 static expert_field ei_bootp_client_address_not_given = EI_INIT;
 static expert_field ei_bootp_server_name_overloaded_by_dhcp = EI_INIT;
 static expert_field ei_bootp_boot_filename_overloaded_by_dhcp = EI_INIT;
+static expert_field ei_bootp_option_isns_ignored_bitfield = EI_INIT;
+static expert_field ei_bootp_option242_avaya_l2qvlan_invalid = EI_INIT;
+static expert_field ei_bootp_option242_avaya_vlantest_invalid = EI_INIT;
 
 static dissector_handle_t bootp_handle;
 
@@ -621,6 +729,9 @@ enum {
        RFC_3361_ENC_IPADDR
 };
 
+static void dissect_vendor_avaya_param(proto_tree *tree, packet_info *pinfo, proto_item *vti,
+               tvbuff_t *tvb, int optoff, wmem_strbuf_t *avaya_param_buf);
+
 /* converts fixpoint presentation into decimal presentation
    also converts values which are out of range to allow decoding of received data */
 static int rfc3825_fixpoint_to_decimal(struct rfc3825_location_fixpoint_t *fixpoint, struct rfc3825_location_decimal_t *decimal);
@@ -728,8 +839,15 @@ static const value_string duidtype_vals[] =
 
 static gboolean novell_string = FALSE;
 
-#define UDP_PORT_BOOTPS         67
-#define UDP_PORT_BOOTPC         68
+static guint bootp_uuid_endian = ENC_LITTLE_ENDIAN;
+
+static const enum_val_t bootp_uuid_endian_vals[] = {
+       { "Little Endian", "Little Endian",     ENC_LITTLE_ENDIAN},
+       { "Big Endian",  "Big Endian", ENC_BIG_ENDIAN },
+       { NULL, NULL, 0 }
+};
+
+#define BOOTP_UDP_PORT_RANGE  "67-68"
 
 #define BOOTP_BC       0x8000
 #define BOOTP_MBZ      0x7FFF
@@ -741,6 +859,38 @@ static gboolean novell_string = FALSE;
 #define F_FQDN_N       0x08
 #define F_FQDN_MBZ     0xf0
 
+#define ISNS_BITFIELD_NZ_MUST_BE_IGNORED(mask, ena_flag)               \
+       ((mask) && !((mask) & (ena_flag)))
+
+/* iSNS bit fields */
+#define F_ISNS_FUNCTIONS_ENABLED       0x0001
+#define F_ISNS_FUNCTIONS_DD_AUTH       0x0002
+#define F_ISNS_FUNCTIONS_SEC_POLICY    0x0004
+#define F_ISNS_FUNCTIONS_RESERVED      0xFFF8
+
+#define F_ISNS_DD_ACCESS_ENABLED               0x0001
+#define F_ISNS_DD_ACCESS_CTRL_NODE             0x0002
+#define F_ISNS_DD_ACCESS_ISCSI_TARGET          0x0004
+#define F_ISNS_DD_ACCESS_ISCSI_INITIATOR       0x0008
+#define F_ISNS_DD_ACCESS_IFCP_TARGET_PORT      0x0010
+#define F_ISNS_DD_ACCESS_IFCP_INITIATOR_PORT   0x0020
+#define F_ISNS_DD_ACCESS_RESERVED              0xFFC0
+
+#define F_ISNS_ADMIN_FLAGS_ENABLED             0x0001
+#define F_ISNS_ADMIN_FLAGS_HEARTBEAT           0x0002
+#define F_ISNS_ADMIN_FLAGS_MANAGEMENT_SCNS     0x0004
+#define F_ISNS_ADMIN_FLAGS_DEFAULT_DD          0x0008
+#define F_ISNS_ADMIN_FLAGS_RESERVED            0xFFF0
+
+#define F_ISNS_SRV_SEC_BITMAP_ENABLED          0x0001
+#define F_ISNS_SRV_SEC_BITMAP_IKE_IPSEC                0x0002
+#define F_ISNS_SRV_SEC_BITMAP_MAIN_MODE                0x0004
+#define F_ISNS_SRV_SEC_BITMAP_AGGRESSIVE       0x0008
+#define F_ISNS_SRV_SEC_BITMAP_PFS              0x0010
+#define F_ISNS_SRV_SEC_BITMAP_TRASPORT_MODE    0x0020
+#define F_ISNS_SRV_SEC_BITMAP_TUNNEL_MODE      0x0040
+#define F_ISNS_SRV_SEC_BITMAP_RESERVED         0xFF80
+
 static const true_false_string tfs_fqdn_s = {
        "Server",
        "Client"
@@ -761,6 +911,16 @@ static const true_false_string tfs_fqdn_n = {
        "Some server updates"
 };
 
+static const true_false_string tfs_isns_function_dd_based_auth = {
+       "Automatically allowed access",
+       "Explicitly performed",
+};
+
+static const true_false_string tfs_isns_functions_sec_distrib = {
+       "Download from iSNS server",
+       "By other means",
+};
+
 enum field_type {
        special,
        none,
@@ -779,7 +939,8 @@ enum field_type {
        time_in_s_secs,         /* Signed */
        time_in_u_secs,         /* Unsigned (not micro) */
        fqdn,
-       ipv4_or_fqdn
+       ipv4_or_fqdn,
+       oui
 };
 
 struct opt_info {
@@ -814,6 +975,9 @@ static const enum_val_t pkt_ccc_protocol_versions[] = {
        { NULL, NULL, 0 }
 };
 
+#define PACKETCABLE_BSDP  "AAPLBSDPC"
+#define PACKETCABLE_BSDPD "AAPLBSDPC/"
+
 static gint pkt_ccc_protocol_version = PACKETCABLE_CCC_RFC_3495;
 static guint pkt_ccc_option = 122;
 
@@ -822,6 +986,9 @@ static int dissect_vendor_pxeclient_suboption(packet_info *pinfo, proto_item *v_
                                              tvbuff_t *tvb, int optoff, int optend);
 static int dissect_vendor_cablelabs_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
                                              tvbuff_t *tvb, int optoff, int optend);
+static int dissect_vendor_bsdp_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
+                                             tvbuff_t *tvb, int optoff, int optend);
+static gboolean test_encapsulated_vendor_options(tvbuff_t *tvb, int optoff, int optend);
 static int dissect_vendor_alcatel_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
                                            tvbuff_t *tvb, int optoff, int optend);
 static int dissect_netware_ip_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
@@ -842,6 +1009,9 @@ static int dissect_vendor_cl_suboption(packet_info *pinfo, proto_item *v_ti, pro
                                            tvbuff_t *tvb, int optoff, int optend);
 static int dissect_vendor_generic_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
                                            tvbuff_t *tvb, int optoff, int optend);
+static int dissect_isns(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
+                       tvbuff_t *tvb, int optoff, int optlen);
+static void dissect_vendor_bsdp_boot_image(proto_tree *v_tree, tvbuff_t *tvb, int optoff);
 
 #define OPT53_DISCOVER "Discover"
 /* http://www.iana.org/assignments/bootp-dhcp-parameters */
@@ -859,13 +1029,11 @@ static const value_string opt53_text[] = {
        { 11,   "Lease Unassigned" },           /* RFC4388 */
        { 12,   "Lease Unknown" },              /* RFC4388 */
        { 13,   "Lease Active" },               /* RFC4388 */
-       /* draft-ietf-dhc-leasequery-09.txt
-       { 13,   "Lease query" },                        */
-       { 14,   "Lease known" },
-       { 15,   "Lease unknown" },
-       { 16,   "Lease active" },
-       { 17,   "Unimplemented" },
-
+       { 14,   "Bulk Lease Query" },           /* RFC6926 */
+       { 15,   "Lease Query Done" },           /* RFC6926 */
+       { 16,   "Active LeaseQuery" },          /* RFC7724 */
+       { 17,   "Lease Query Status" },         /* RFC7724 */
+       { 18,   "TLS" },                        /* RFC7724 */
        { 0,    NULL }
 };
 
@@ -954,6 +1122,93 @@ static const value_string sip_server_enc_vals[] = {
        {1, "IPv4 Address" },
        {0, NULL }
 };
+
+static const value_string o43_bsdp_boot_image_install_vals[] = {
+       { 0, "non-install" },
+       { 1, "install" },
+       { 0, NULL }
+};
+
+static const value_string o43_bsdp_boot_image_kind_vals[] = {
+       { 0, "Mac OS 9" },
+       { 1, "Mac OS X" },
+       { 2, "Mac OS X Server" },
+       { 3, "Hardware Diagnostics" },
+       { 0, NULL }
+};
+
+static const value_string o43_bsdp_message_type_vals[] = {
+       { 1, "LIST" },
+       { 2, "SELECT" },
+       { 3, "FAILED" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_phystat_vals[] = {
+       { "0", "Disabled" },
+       { "1", "Auto" },
+       { "2", "10Mbps half" },
+       { "3", "10Mbps full" },
+       { "4", "100Mbps half" },
+       { "5", "100Mbps full" },
+       { "6", "1000Mbps full" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_l2q_vals[] = {
+       { "0", "Auto" },
+       { "1", "Enabled" },
+       { "2", "Disabled" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_dot1x_vals[] = {
+       { "0", "With PAE pass-through" },
+       { "1", "With PAE pass-through and proxy Logoff" },
+       { "2", "Without PAE pass-through or proxy Logoff" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_icmpdu_vals[] = {
+       { "0", "No ICMP Destination Unreachable messages" },
+       { "1", "Send limited Port Unreachable messages" },
+       { "2", "Send Protocol and Port Unreachable messages" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_icmpred_vals[] = {
+       { "0", "Ignore ICMP Redirect messages" },
+       { "1", "Process ICMP Redirect messages" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_loglocal_vals[] = {
+       { "0", "Disabled" },
+       { "1", "Emergencie" },
+       { "2", "Alerts" },
+       { "3", "Critical" },
+       { "4", "Errors" },
+       { "5", "Warnings" },
+       { "6", "Notices" },
+       { "7", "Information" },
+       { "8", "Debug" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_procstat_vals[] = {
+       { "0", "All administrative options" },
+       { "1", "Only view administrative options" },
+       { 0, NULL }
+};
+
+static const string_string option242_avaya_static_vals[] = {
+       { "0", "Static programming never overrides call server (DHCP) or call server administered data" },
+       { "1", "Static programming overrides only file server administered data" },
+       { "2", "Static programming overrides only call server administered data" },
+       { "3", "Static programming overrides both file server- and call server-administered data" },
+       { 0, NULL }
+};
+
 /* bootp options administration */
 #define BOOTP_OPT_NUM  256
 
@@ -1044,7 +1299,7 @@ static struct opt_info default_bootp_opt[BOOTP_OPT_NUM] = {
 /*  80 */ { "Rapid commit",                            opaque, NULL },
 /*  81 */ { "Client Fully Qualified Domain Name",      special, NULL},
 /*  82 */ { "Agent Information Option",                        special, NULL},
-/*  83 */ { "iSNS [TODO:RFC4174]",                     opaque, NULL },
+/*  83 */ { "iSNS",                                    opaque, NULL },
 /*  84 */ { "Removed/Unassigned",                      opaque, NULL },
 /*  85 */ { "Novell Directory Services Servers",       special, NULL},
 /*  86 */ { "Novell Directory Services Tree Name",     string, &hf_bootp_option_novell_ds_tree_name },
@@ -1061,8 +1316,8 @@ static struct opt_info default_bootp_opt[BOOTP_OPT_NUM] = {
 /*  97 */ { "UUID/GUID-based Client Identifier",       special, NULL},
 /*  98 */ { "Open Group's User Authentication [TODO:RFC2485]", opaque, NULL },
 /*  99 */ { "Civic Addresses Configuration",           special, NULL},
-/* 100 */ { "PCode [TODO:RFC4833]",                    opaque, NULL },
-/* 101 */ { "TCode [TODO:RFC4833]",                    opaque, NULL },
+/* 100 */ { "PCode",                                   string, &hf_bootp_option_tz_pcode },
+/* 101 */ { "TCode",                                   string, &hf_bootp_option_tz_tcode },
 /* 102 */ { "Removed/unassigned",                      opaque, NULL },
 /* 103 */ { "Removed/unassigned",                      opaque, NULL },
 /* 104 */ { "Removed/unassigned",                      opaque, NULL },
@@ -1122,7 +1377,7 @@ static struct opt_info default_bootp_opt[BOOTP_OPT_NUM] = {
 /* 158 */ { "Unassigned",                              opaque, NULL },
 /* 159 */ { "Unassigned",                              opaque, NULL },
 /* 160 */ { "Unassigned",                              opaque, NULL },
-/* 161 */ { "Unassigned",                              opaque, NULL },
+/* 161 */ { "Manufacturer Usage Description",          string, &hf_bootp_option_mudurl},
 /* 162 */ { "Unassigned",                              opaque, NULL },
 /* 163 */ { "Unassigned",                              opaque, NULL },
 /* 164 */ { "Unassigned",                              opaque, NULL },
@@ -1170,8 +1425,8 @@ static struct opt_info default_bootp_opt[BOOTP_OPT_NUM] = {
 /* 206 */ { "Unassigned",                              opaque, NULL },
 /* 207 */ { "Unassigned",                              opaque, NULL },
 /* 208 */ { "PXELINUX Magic",                          opaque, NULL },
-/* 209 */ { "Configuration file",                      opaque, NULL },
-/* 210 */ { "Authentication",                          special, NULL}, /* Path Prefix rfc5071 */
+/* 209 */ { "PXE Configuration file",                  string, &hf_bootp_option_pxe_config_file },
+/* 210 */ { "PXE Path Prefix",                         string, &hf_bootp_option_pxe_path_prefix },
 /* 211 */ { "Reboot Time",                             opaque, NULL },
 /* 212 */ { "6RD",                                     opaque, NULL },
 /* 213 */ { "V4 Access Domain",                                opaque, NULL },
@@ -1203,7 +1458,7 @@ static struct opt_info default_bootp_opt[BOOTP_OPT_NUM] = {
 /* 239 */ { "Private",                                 opaque, NULL },
 /* 240 */ { "Private",                                 opaque, NULL },
 /* 241 */ { "Private",                                 opaque, NULL },
-/* 242 */ { "Private",                                 opaque, NULL },
+/* 242 */ { "Private/Avaya IP Telephone",              special, NULL },
 /* 243 */ { "Private",                                 opaque, NULL },
 /* 244 */ { "Private",                                 opaque, NULL },
 /* 245 */ { "Private",                                 opaque, NULL },
@@ -1445,7 +1700,7 @@ bootp_handle_basic_types(packet_info *pinfo, proto_tree *tree, proto_item *item,
                if (hf != NULL) {
                        time_s_secs = (gint32) tvb_get_ntohl(tvb, offset);
                        proto_tree_add_int_format_value(tree, *hf,
-                               tvb, offset, 4, time_s_secs, "(%ds) %s", time_s_secs, time_secs_to_str(wmem_packet_scope(), time_s_secs));
+                               tvb, offset, 4, time_s_secs, "(%ds) %s", time_s_secs, signed_time_secs_to_str(wmem_packet_scope(), time_s_secs));
                }
                else if (hf_default->time_in_s_secs != NULL)
                        proto_tree_add_item(tree, *hf_default->time_in_s_secs, tvb, offset, 4, ENC_BIG_ENDIAN);
@@ -1463,7 +1718,7 @@ bootp_handle_basic_types(packet_info *pinfo, proto_tree *tree, proto_item *item,
                        time_u_secs = tvb_get_ntohl(tvb, offset);
                        proto_tree_add_uint_format_value(tree, *hf,
                                tvb, offset, 4, time_u_secs, "(%us) %s", time_u_secs,
-                               ((time_u_secs == 0xffffffff) ? "infinity" : time_secs_to_str_unsigned(wmem_packet_scope(), time_u_secs)));
+                               ((time_u_secs == 0xffffffff) ? "infinity" : unsigned_time_secs_to_str(wmem_packet_scope(), time_u_secs)));
                }
                else if (hf_default->time_in_u_secs != NULL)
                        proto_tree_add_item(tree, *hf_default->time_in_u_secs, tvb, offset, 4, ENC_BIG_ENDIAN);
@@ -1726,8 +1981,19 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                        ampiplen = tvb_find_guint8(tvb, optoff+nameorglen+1, optlen-nameorglen-1, ',') - (optoff+nameorglen+1);
                        proto_tree_add_item(v_tree, hf_bootp_option43_arubaiap_ampip, tvb, optoff+nameorglen+1, ampiplen, ENC_ASCII|ENC_NA);
                        proto_tree_add_item(v_tree, hf_bootp_option43_arubaiap_password, tvb, optoff+nameorglen+1+ampiplen+1, optlen-(nameorglen+1+ampiplen+1), ENC_ASCII|ENC_NA);
-               } else if (s_option==58 || s_option==64 || s_option==65
-                       || s_option==66 || s_option==67) {
+               } else if (*vendor_class_id_p != NULL &&
+                          ((strncmp((const gchar*)*vendor_class_id_p, PACKETCABLE_BSDP, strlen(PACKETCABLE_BSDP)) == 0) )) {
+                       /* Apple BSDP */
+                       proto_item_append_text(vti, " (Boot Server Discovery Protocol (BSDP))");
+
+                       optend = optoff + optlen;
+                       while (optoff < optend) {
+                               optoff = dissect_vendor_bsdp_suboption(pinfo, vti, v_tree,
+                                       tvb, optoff, optend);
+                       }
+               } else if ((s_option==58 || s_option==64 || s_option==65
+                       || s_option==66 || s_option==67)
+                       && test_encapsulated_vendor_options(tvb, optoff, optoff+optlen)) {
                        /* Note that this is a rather weak (permissive) heuristic, */
                        /* but since it comes last, I guess this is OK. */
                        /* Add any stronger (less permissive) heuristics before this! */
@@ -1850,6 +2116,11 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                                (int)strlen(PACKETCABLE_CM_CAP30)) == 0 )
                {
                        proto_tree_add_item(v_tree, hf_bootp_option_vendor_class_data, tvb, optoff, optlen, ENC_ASCII|ENC_NA);
+               } else
+                       if (tvb_memeql(tvb, optoff, (const guint8*)PACKETCABLE_BSDPD,
+                               (int)strlen(PACKETCABLE_BSDPD)) == 0 )
+               {
+                       proto_tree_add_item(v_tree, hf_bootp_option_vendor_class_data, tvb, optoff+(int)strlen(PACKETCABLE_BSDPD), optlen-(int)strlen(PACKETCABLE_BSDPD), ENC_ASCII|ENC_NA);
                }
                break;
 
@@ -1882,8 +2153,8 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                                        tvb_arphrdaddr_to_str(tvb, optoff+1, 6, byte));
                } else if (optlen == 17 && byte == 0) {
                        /* Identifier is a UUID */
-                       proto_tree_add_item(v_tree, hf_bootp_client_identifier_uuid,
-                                           tvb, optoff + 1, 16, ENC_LITTLE_ENDIAN);
+                       proto_tree_add_item(v_tree, hf_bootp_client_identifier_uuid, tvb, optoff + 1, 16, bootp_uuid_endian);
+
                /* From RFC 4361 paragraph 6.1 DHCPv4 Client Behavior:
                        To send an RFC 3315-style binding identifier in a DHCPv4 'client
                        identifier' option, the type of the 'client identifier' option is set
@@ -1941,6 +2212,10 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                                }
                                break;
                        }
+               } else if (byte == 0 && optlen > 1) {
+                       /* identifier other than a hardware address (e.g. a fully qualified domain name) */
+                       proto_tree_add_item(v_tree, hf_bootp_client_identifier_type, tvb, optoff, 1, ENC_NA);
+                       proto_tree_add_item(v_tree, hf_bootp_client_identifier_undef, tvb, optoff+1, optlen-1, ENC_ASCII|ENC_NA);
                } else {
                        /* otherwise, it's opaque data */
                }
@@ -2011,8 +2286,7 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                                        tvb_arphrdaddr_to_str(tvb, optoff+1, 6, byte));
                } else if (optlen == 17 && byte == 0) {
                        /* Identifier is a UUID */
-                       proto_tree_add_item(v_tree, hf_bootp_client_identifier_uuid,
-                                           tvb, optoff + 1, 16, ENC_LITTLE_ENDIAN);
+                       proto_tree_add_item(v_tree, hf_bootp_client_identifier_uuid, tvb, optoff + 1, 16, bootp_uuid_endian);
                } else {
                        /* otherwise, it's opaque data */
                }
@@ -2103,6 +2377,10 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                        optoff = bootp_dhcp_decode_agent_info(pinfo, vti, v_tree, tvb, optoff, optend);
                break;
 
+       case 83:        /* iSNS Option (RFC 4174) */
+               optoff = dissect_isns(pinfo, vti, v_tree, tvb, optoff, optlen);
+               break;
+
        case 85:        /* Novell Servers (RFC 2241) */
                /* Option 85 can be sent as a string */
                /* Added by Greg Morris (gmorris[AT]novell.com) */
@@ -2138,7 +2416,6 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
        }
 
        case 90:        /* DHCP Authentication */
-       case 210:       /* Was this used for authentication at one time? */
                if (optlen < 11) {
                        expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't >= 11");
                        break;
@@ -2324,9 +2601,9 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                        unsigned int offset = 0;
                        tvb_composite_finalize(rfc3396_dns_domain_search_list.tvb_composite);
 
-                       while (offset < tvb_length(rfc3396_dns_domain_search_list.tvb_composite)) {
+                       while (offset < tvb_reported_length(rfc3396_dns_domain_search_list.tvb_composite)) {
                                /* use the get_dns_name method that manages all techniques of RFC 1035 (compression pointer and so on) */
-                               consumedx = get_dns_name(rfc3396_dns_domain_search_list.tvb_composite, offset, tvb_length(rfc3396_dns_domain_search_list.tvb_composite), 0, &dns_name);
+                               consumedx = get_dns_name(rfc3396_dns_domain_search_list.tvb_composite, offset, tvb_reported_length(rfc3396_dns_domain_search_list.tvb_composite), 0, &dns_name);
                                if (rfc3396_dns_domain_search_list.total_number_of_block == 1) {
                                        /* RFC 3396 is not used, so we can easily link the fqdn with v_tree. */
                                        proto_tree_add_string(v_tree, hf_bootp_option_dhcp_dns_domain_search_list_fqdn, tvb, optoff + offset, consumedx, dns_name);
@@ -2383,14 +2660,14 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                        switch (enc) {
                        case RFC_3361_ENC_FQDN: {
                                unsigned int consumedx = 0;
-                               if (tvb_length(rfc3396_sip_server.tvb_composite) < 3) {
-                                       expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't >= 3 (len = %u)", tvb_length(rfc3396_sip_server.tvb_composite));
+                               if (tvb_reported_length(rfc3396_sip_server.tvb_composite) < 3) {
+                                       expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't >= 3 (len = %u)", tvb_reported_length(rfc3396_sip_server.tvb_composite));
                                        break;
                                }
 
-                               while (offset < tvb_length(rfc3396_sip_server.tvb_composite)) {
+                               while (offset < tvb_reported_length(rfc3396_sip_server.tvb_composite)) {
                                        /* use the get_dns_name method that manages all techniques of RFC 1035 (compression pointer and so on) */
-                                       consumedx = get_dns_name(rfc3396_sip_server.tvb_composite, offset, tvb_length(rfc3396_sip_server.tvb_composite), 1 /* ignore enc */, &dns_name);
+                                       consumedx = get_dns_name(rfc3396_sip_server.tvb_composite, offset, tvb_reported_length(rfc3396_sip_server.tvb_composite), 1 /* ignore enc */, &dns_name);
 
                                        if (rfc3396_sip_server.total_number_of_block == 1) {
                                                /* RFC 3396 is not used, so we can easily link the fqdn with v_tree. */
@@ -2405,21 +2682,21 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                                break;
                        }
                        case RFC_3361_ENC_IPADDR:
-                               if (tvb_length(rfc3396_sip_server.tvb_composite) < 5) {
-                                       expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't >= 5 (len = %u)", tvb_length(rfc3396_sip_server.tvb_composite));
+                               if (tvb_reported_length(rfc3396_sip_server.tvb_composite) < 5) {
+                                       expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't >= 5 (len = %u)", tvb_reported_length(rfc3396_sip_server.tvb_composite));
                                        break;
                                }
                                /* x % 2^n == x & (2^n - 1) note : (assuming x is a positive integer) */
-                               if ((tvb_length(rfc3396_sip_server.tvb_composite) - 1) & 3) {
+                               if ((tvb_reported_length(rfc3396_sip_server.tvb_composite) - 1) & 3) {
                                        if (rfc3396_sip_server.total_number_of_block == 1)
-                                               expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't a multiple of 4 plus 1 (len = %u).", tvb_length(rfc3396_sip_server.tvb_composite));
+                                               expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "length isn't a multiple of 4 plus 1 (len = %u).", tvb_reported_length(rfc3396_sip_server.tvb_composite));
                                        else
                                                expert_add_info_format(pinfo, vti, &ei_bootp_bad_length,
                                                        "length isn't a multiple of 4 plus 1 (len = %u). For your information with RFC 3396, the length is the length sum of all options 120 into this BOOTP packet.",
-                                                       tvb_length(rfc3396_sip_server.tvb_composite));
+                                                       tvb_reported_length(rfc3396_sip_server.tvb_composite));
                                        break;
                                }
-                               while (offset < tvb_length(rfc3396_sip_server.tvb_composite)) {
+                               while (offset < tvb_reported_length(rfc3396_sip_server.tvb_composite)) {
                                        if (rfc3396_sip_server.total_number_of_block == 1) {
                                                /* RFC 3396 is not used, so we can easily link the fqdn with v_tree. */
                                                proto_tree_add_item(v_tree, hf_bootp_option_sip_server_address, rfc3396_sip_server.tvb_composite, offset, 4, ENC_BIG_ENDIAN);
@@ -2511,7 +2788,7 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
 
                        if (i != RFC3825_NOERROR) {
                                ti = proto_tree_add_uint(v_tree, hf_bootp_option_rfc3825_error, tvb, optoff, 1, i);
-                proto_item_set_len(ti, optlen);
+                       proto_item_set_len(ti, optlen);
                        } else {
                                proto_tree_add_double_format_value(v_tree, hf_bootp_option_rfc3825_latitude, tvb, optoff, 5, location.latitude, "%15.10f", location.latitude);
                                proto_tree_add_double_format_value(v_tree, hf_bootp_option_rfc3825_longitude, tvb, optoff+5, 5, location.longitude, "%15.10f", location.longitude);
@@ -2541,7 +2818,7 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                }
                break;
 
-       case 124: {     /* V-I Vendor Class */
+       case 124: {     /* V-I Vendor Class (RFC 3925) */
                int data_len;
 
                if (optlen == 1) {
@@ -2575,10 +2852,10 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                break;
        }
 
-       case 125: {     /* V-I Vendor-specific Information */
+       case 125: {     /* V-I Vendor-specific Information (RFC 3925) */
                int enterprise = 0;
                int s_end = 0;
-               int s_option_len = 0;
+               int option_data_len = 0;
                proto_tree *e_tree = 0;
 
                optend = optoff + optlen;
@@ -2593,58 +2870,39 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
 
                        enterprise = tvb_get_ntohl(tvb, optoff);
                        vti = proto_tree_add_item(v_tree, hf_bootp_option125_enterprise, tvb, optoff, 4, ENC_BIG_ENDIAN);
+                       e_tree = proto_item_add_subtree(vti, ett_bootp_option);
 
-                       s_option_len = tvb_get_guint8(tvb, optoff + 4);
-
-                       optoff += 5;
-                       optleft -= 5;
+                       optoff += 4;
+                       optleft -= 4;
 
-                       /* Handle DSL Forum TR-111 Option 125 */
-                       switch (enterprise) {
+                       proto_tree_add_item_ret_uint(e_tree, hf_bootp_option125_length, tvb, optoff, 1, ENC_NA, &option_data_len);
 
-                       case 3561: /* ADSL Forum */
-                               s_end = optoff + s_option_len;
-                               if ( s_end > optend ) {
-                                       expert_add_info_format(pinfo, vti, &ei_bootp_option125_enterprise_malformed, "no room left in option for enterprise %u data", enterprise);
-                                       break;
-                               }
+                       optoff += 1;
+                       optleft -= 1;
 
-                               e_tree = proto_item_add_subtree(vti, ett_bootp_option);
-                               while (optoff < s_end) {
-
-                               optoff = dissect_vendor_tr111_suboption(pinfo, vti, e_tree, tvb, optoff, s_end);
+                       s_end = optoff + option_data_len;
+                       if ( s_end > optend ) {
+                               expert_add_info_format(pinfo, vti, &ei_bootp_option125_enterprise_malformed, "no room left in option for enterprise %u data", enterprise);
+                               break;
                        }
-                       break;
 
-                       case 4491: /* CableLab */
-                               s_end = optoff + s_option_len;
-                               if ( s_end > optend ) {
-                                       expert_add_info_format(pinfo, vti, &ei_bootp_option125_enterprise_malformed, "no room left in option for enterprise %u data", enterprise);
-                                       break;
-                               }
+                       while (optoff < s_end) {
+                               switch (enterprise) {
+
+                               case 3561: /* ADSL Forum */
+                                       optoff = dissect_vendor_tr111_suboption(pinfo, vti, e_tree, tvb, optoff, s_end);
+                               break;
 
-                               e_tree = proto_item_add_subtree(vti, ett_bootp_option);
-                               while (optoff < s_end) {
+                               case 4491: /* CableLab */
                                        optoff = dissect_vendor_cl_suboption(pinfo, vti, e_tree, tvb, optoff, s_end);
-                       }
-                       break;
+                               break;
 
-                       default:
-                               s_end = optoff + s_option_len;
-                               if ( s_end > optend ) {
-                                       expert_add_info_format(pinfo, vti, &ei_bootp_option125_enterprise_malformed, "no room left in option for enterprise %u data", enterprise);
-                                       break;
+                               default:
+                                       optoff = dissect_vendor_generic_suboption(pinfo, vti, e_tree, tvb, optoff, s_end);
+                               break;
                                }
-
-                               e_tree = proto_item_add_subtree(vti, ett_bootp_option);
-                               while (optoff < s_end) {
-
-                               optoff = dissect_vendor_generic_suboption(pinfo, vti, e_tree, tvb, optoff, s_end);
-                       }
-                       break;
                        }
-
-                       optleft -= s_option_len;
+                       optleft -= option_data_len;
                }
                break;
        }
@@ -2675,6 +2933,46 @@ bootp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, proto_item
                break;
        }
 
+       case 242: {     /* Avaya IP Telephone */
+               proto_tree *o242avaya_v_tree;
+               proto_item *avaya_ti;
+               const guint8 *avaya_option = NULL;
+               gchar *field = NULL;
+               wmem_strbuf_t *avaya_param_buf = NULL;
+
+               /* minimum length is 5 bytes */
+               if (optlen < 5) {
+                       expert_add_info_format(pinfo, vti, &ei_bootp_bad_length, "Avaya IP Telephone option length isn't >= 5");
+                       optoff += optlen;
+                       break;
+               }
+               avaya_ti = proto_tree_add_item_ret_string(v_tree, hf_bootp_option242_avaya, tvb, optoff, optlen, ENC_ASCII|ENC_NA, wmem_packet_scope(), &avaya_option);
+               o242avaya_v_tree = proto_item_add_subtree(avaya_ti, ett_bootp_option242_suboption);
+               avaya_param_buf = wmem_strbuf_new(wmem_packet_scope(), "");
+               for ( field = strtok((char*)avaya_option, ","); field; field = strtok(NULL, ",") ) {
+                       if (!strchr(field, '=')) {
+                               if (wmem_strbuf_get_len(avaya_param_buf) == 0) {
+                                       expert_add_info_format(pinfo, vti, &hf_bootp_subopt_unknown_type, "ERROR, Unknown parameter %s", field);
+                                       optoff += (int)strlen(field);
+                                       break;
+                               }
+                               wmem_strbuf_append_printf(avaya_param_buf,",%s", field);
+                       }
+                       else {
+                               if (wmem_strbuf_get_len(avaya_param_buf) > 0) {
+                                       dissect_vendor_avaya_param(o242avaya_v_tree, pinfo, vti, tvb, optoff, avaya_param_buf);
+                                       optoff += (int)wmem_strbuf_get_len(avaya_param_buf) + 1;
+                                       wmem_strbuf_truncate(avaya_param_buf, 0);
+                               }
+                               wmem_strbuf_append(avaya_param_buf, field);
+                       }
+               }
+               if (wmem_strbuf_get_len(avaya_param_buf) > 0) {
+                       dissect_vendor_avaya_param(o242avaya_v_tree, pinfo, vti, tvb, optoff, avaya_param_buf);
+               }
+               break;
+       }
+
        default:        /* not special */
                /* The PacketCable CCC option number can vary.  If this is a CCC option,
                   handle it as a special.
@@ -2730,6 +3028,7 @@ static const value_string option82_suboption_vals[] = {
        {  9, "Vendor-Specific Information" },
        { 10, "Flags" },
        { 11, "Server ID Override" },
+       { 12, "Relay Agent Identifier" },
        { 150, "Link selection (Cisco proprietary)" },
        { 151, "VRF name/VPN ID" },
        { 152, "Server ID Override (Cisco proprietary)" },
@@ -2779,6 +3078,7 @@ bootp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v
                {9, {"Vendor-Specific Information", special, &hf_bootp_option82_vi}}, /* [RFC 4243] */
                {10, {"Flags", val_u_byte, &hf_bootp_option82_flags}}, /* [RFC5010] */
                {11, {"Server ID Override", ipv4, &hf_bootp_option82_server_id_override}}, /* [RFC 5107] */
+               {12, {"Relay Agent Identifier", bytes, &hf_bootp_option82_relay_agent_id}}, /* [RFC 6925] */
                {150, {"Link selection (Cisco proprietary)", ipv4, &hf_bootp_option82_link_selection_cisco}}, /* [RFC3527] */
                {151, {"VRF name/VPN ID", special, &hf_bootp_option82_vrf_name_vpn_id}}, /* [RFC2685] */
                {152, {"Server ID Override (Cisco proprietary)", ipv4, &hf_bootp_option82_server_id_override_cisco}} /* [RFC 5107] */
@@ -3029,6 +3329,89 @@ dissect_vendor_pxeclient_suboption(packet_info *pinfo, proto_item *v_ti, proto_t
        return optoff;
 }
 
+static void
+dissect_vendor_avaya_param(proto_tree *tree, packet_info *pinfo, proto_item *vti,
+               tvbuff_t *tvb, int optoff, wmem_strbuf_t *avaya_param_buf)
+{
+       const gchar *field;
+       int len;
+
+       field = wmem_strbuf_get_str(avaya_param_buf);
+       len = (int)wmem_strbuf_get_len(avaya_param_buf);
+
+       if((strncmp(field, "TLSSRVR=", 8) == 0) && ( len > 8 )) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_tlssrvr, tvb, optoff, len, field + 8);
+       }
+       else if((strncmp(field, "HTTPSRVR=", 9) == 0) && ( len > 9)) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_httpsrvr, tvb, optoff, len, field + 9);
+       }
+       else if((strncmp(field, "HTTPDIR=", 8) == 0) && ( len > 8)) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_httpdir, tvb, optoff, len, field + 8);
+       }
+       else if((strncmp(field, "STATIC=", 7) == 0) && ( len > 7)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_static, tvb, optoff, len, field + 7, "%s (%s)", field + 7, str_to_str(field + 7, option242_avaya_static_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "MCIPADD=", 8) == 0) && ( len > 8)) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_mcipadd, tvb, optoff, len, field + 8);
+       }
+       else if((strncmp(field, "DOT1X=", 6) == 0) && ( len > 6)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_dot1x, tvb, optoff, len, field + 6, "%s (%s)", field + 6, str_to_str(field + 6, option242_avaya_dot1x_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "ICMPDU=", 7) == 0) && ( len > 7)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_icmpdu, tvb, optoff, len, field + 7, "%s (%s)", field + 7, str_to_str(field + 7, option242_avaya_icmpdu_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "ICMPRED=", 8) == 0) && ( len > 8)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_icmpred, tvb, optoff, len, field + 8, "%s (%s)", field + 8, str_to_str(field + 8, option242_avaya_icmpred_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "L2Q=", 4) == 0) && ( len > 4)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_l2q, tvb, optoff, len, field + 4, "%s (%s)", field + 4, str_to_str(field + 4, option242_avaya_l2q_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "L2QVLAN=", 8) == 0) && ( len > 8)) {
+               gint32 val = -1;
+               gboolean val_valid;
+               proto_item* pi;
+
+               val_valid = ws_strtoi32(field + 8, NULL, &val);
+               pi = proto_tree_add_int(tree, hf_bootp_option242_avaya_l2qvlan, tvb, optoff, len, val);
+               if (val_valid)
+                       expert_add_info(pinfo, pi, &ei_bootp_option242_avaya_l2qvlan_invalid);
+       }
+       else if((strncmp(field, "LOGLOCAL=", 9) == 0) && ( len > 9)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_loglocal, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_loglocal_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "PHY1STAT=", 9) == 0) && ( len > 9)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_phy1stat, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_phystat_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "PHY2STAT=", 9) == 0) && ( len > 9)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_phy2stat, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_phystat_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "PROCPSWD=", 9) == 0) && ( len > 9)) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_procpswd, tvb, optoff, len, field + 9);
+       }
+       else if((strncmp(field, "PROCSTAT=", 9) == 0) && ( len > 9)) {
+               proto_tree_add_string_format_value(tree, hf_bootp_option242_avaya_procstat, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_procstat_vals, "Unknown (%s)"));
+       }
+       else if((strncmp(field, "SNMPADD=", 8) == 0) && ( len > 8)) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_snmpadd, tvb, optoff, len, field + 8);
+       }
+       else if((strncmp(field, "SNMPSTRING=", 11) == 0) && ( len > 11)) {
+               proto_tree_add_string(tree, hf_bootp_option242_avaya_snmpstring, tvb, optoff, len, field + 11);
+       }
+       else if((strncmp(field, "VLANTEST=", 9) == 0) && ( len > 9)) {
+               gint32 val = -1;
+               gboolean val_valid;
+               proto_item* pi;
+
+               val_valid = ws_strtoi32(field + 9, NULL, &val);
+               pi = proto_tree_add_int(tree, hf_bootp_option242_avaya_vlantest, tvb, optoff, len, val);
+               if (!val_valid)
+                       expert_add_info(pinfo, pi, &ei_bootp_option242_avaya_vlantest_invalid);
+       }
+       else {
+               expert_add_info_format(pinfo, vti, &hf_bootp_subopt_unknown_type, "ERROR, Unknown Avaya IP Telephone parameter %s", field);
+       }
+}
+
 /* RFC3825Decoder: http://www.enum.at/rfc3825encoder.529.0.html */
 static void
 rfc3825_lci_to_fixpoint(const unsigned char lci[16], struct rfc3825_location_fixpoint_t *fixpoint)
@@ -3154,6 +3537,123 @@ rfc3825_fixpoint_to_decimal(struct rfc3825_location_fixpoint_t *fixpoint, struct
        return RFC3825_NOERROR;
 }
 
+static int dissect_isns(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
+                       tvbuff_t *tvb, int optoff, int optlen)
+{
+       static const int *isns_functions_hf_flags[] = {
+               &hf_bootp_option_isns_functions_enabled,
+               &hf_bootp_option_isns_functions_dd_authorization,
+               &hf_bootp_option_isns_functions_sec_policy_distibution,
+               &hf_bootp_option_isns_functions_reserved,
+               NULL
+       };
+
+       static const int *isns_dda_hf_flags[] = {
+               &hf_bootp_option_isns_discovery_domain_access_enabled,
+               &hf_bootp_option_isns_discovery_domain_access_control_node,
+               &hf_bootp_option_isns_discovery_domain_access_iscsi_target,
+               &hf_bootp_option_isns_discovery_domain_access_iscsi_inititator,
+               &hf_bootp_option_isns_discovery_domain_access_ifcp_target_port,
+               &hf_bootp_option_isns_discovery_domain_access_ifcp_initiator_port,
+               &hf_bootp_option_isns_discovery_domain_access_reserved,
+               NULL
+       };
+
+       static const int *isns_administrative_flags[] = {
+               &hf_bootp_option_isns_administrative_flags_enabled,
+               &hf_bootp_option_isns_administrative_flags_heartbeat,
+               &hf_bootp_option_isns_administrative_flags_management_scns,
+               &hf_bootp_option_isns_administrative_flags_default_dd,
+               &hf_bootp_option_isns_administrative_flags_reserved,
+               NULL
+       };
+
+       static const int *isns_server_security_flags[] = {
+               &hf_bootp_option_isns_server_security_bitmap_enabled,
+               &hf_bootp_option_isns_server_security_bitmap_ike_ipsec_enabled,
+               &hf_bootp_option_isns_server_security_bitmap_main_mode,
+               &hf_bootp_option_isns_server_security_bitmap_aggressive_mode,
+               &hf_bootp_option_isns_server_security_bitmap_pfs,
+               &hf_bootp_option_isns_server_security_bitmap_transport_mode,
+               &hf_bootp_option_isns_server_security_bitmap_tunnel_mode,
+               &hf_bootp_option_isns_server_security_bitmap_reserved,
+               NULL
+       };
+
+       guint16 function_flags, dd_access_flags, administrative_flags;
+       guint32 server_security_flags;
+       proto_tree *tree;
+       proto_item *item;
+       int optend, heartbeat_set = 0;
+
+       if (optlen < 14) {
+               expert_add_info_format(pinfo, v_ti, &ei_bootp_bad_length, "length must be >= 14");
+               return optoff;
+       }
+       optend = optoff + optlen;
+
+       item = proto_tree_add_bitmask(v_tree, tvb, optoff, hf_bootp_option_isns_functions,
+                                     ett_bootp_isns_functions, isns_functions_hf_flags, ENC_BIG_ENDIAN);
+       function_flags = tvb_get_ntohs(tvb, optoff);
+       /* RFC 4174, section "2.1. iSNS Functions Field" specifies that if
+        * the field "Function Fields Enabled" is set to 0, then "the contents
+        * of all other iSNS Function fields MUST be ignored. We will display
+        * the fields but add an informational expert info. This goes for all
+        * the bitmasks: iSNS Functions, DD Access, Administrative Flags, iSNS
+        * Server Security Bitmap */
+       if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(function_flags, F_ISNS_FUNCTIONS_ENABLED))
+               expert_add_info(pinfo, item, &ei_bootp_option_isns_ignored_bitfield);
+
+       optoff += 2;
+       item = proto_tree_add_bitmask(v_tree, tvb, optoff, hf_bootp_option_isns_discovery_domain_access,
+                                     ett_bootp_isns_discovery_domain_access, isns_dda_hf_flags, ENC_BIG_ENDIAN);
+       dd_access_flags = tvb_get_ntohs(tvb, optoff);
+       if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(dd_access_flags, F_ISNS_DD_ACCESS_ENABLED))
+               expert_add_info(pinfo, item, &ei_bootp_option_isns_ignored_bitfield);
+
+       optoff += 2;
+       administrative_flags = tvb_get_ntohs(tvb, optoff);
+       if (administrative_flags & F_ISNS_ADMIN_FLAGS_ENABLED) {
+               if ((administrative_flags & F_ISNS_ADMIN_FLAGS_HEARTBEAT)) {
+                       if (optlen < 18) {
+                               expert_add_info_format(pinfo, v_ti, &ei_bootp_bad_length, "length must be >= 18");
+                               return optoff;
+                       }
+                       heartbeat_set = 1;
+               }
+       }
+       item = proto_tree_add_bitmask(v_tree, tvb, optoff, hf_bootp_option_isns_administrative_flags,
+                                     ett_bootp_isns_administrative_flags, isns_administrative_flags, ENC_BIG_ENDIAN);
+       if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(administrative_flags, F_ISNS_ADMIN_FLAGS_ENABLED))
+               expert_add_info(pinfo, item, &ei_bootp_option_isns_ignored_bitfield);
+
+       optoff += 2;
+       item = proto_tree_add_bitmask(v_tree, tvb, optoff, hf_bootp_option_isns_server_security_bitmap,
+                                     ett_bootp_isns_server_security_bitmap, isns_server_security_flags, ENC_BIG_ENDIAN);
+       server_security_flags = tvb_get_ntohl(tvb, optoff);
+       if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(server_security_flags, F_ISNS_SRV_SEC_BITMAP_ENABLED))
+               expert_add_info(pinfo, item, &ei_bootp_option_isns_ignored_bitfield);
+
+       optoff += 4;
+       if (heartbeat_set) {
+               proto_tree_add_item(v_tree, hf_bootp_option_isns_heartbeat_originator_addr,
+                                   tvb, optoff, 4, ENC_BIG_ENDIAN);
+               optoff += 4;
+       }
+
+       proto_tree_add_item(v_tree, hf_bootp_option_isns_primary_server_addr,
+                           tvb, optoff, 4, ENC_BIG_ENDIAN);
+
+       optoff += 4;
+       if (optoff < optend) {
+               tree = proto_tree_add_subtree(v_tree, tvb, optoff, 0, ett_bootp_isns_secondary_server_addr,
+                                               &item, "Secondary iSNS Servers");
+               optoff += bootp_handle_basic_types(pinfo, tree, item, tvb, ipv4_list, optoff, optend - optoff,
+                                                  &hf_bootp_option_isns_secondary_server_addr_list, NULL);
+       }
+       return optoff;
+}
+
 static const value_string option43_cl_suboption_vals[] = {
        {  0, "Padding" },
        {  1, "Suboption Request List" },
@@ -3353,23 +3853,175 @@ dissect_vendor_cablelabs_suboption(packet_info *pinfo, proto_item *v_ti, proto_t
        return optoff;
 }
 
+static const value_string option43_bsdp_suboption_vals[] = {
+       {  1, "Message Type" },
+       {  2, "Version" },
+       {  3, "Server Identifier" },
+       {  4, "Server Priority" },
+       {  5, "Reply Port" },
+       {  6, "Boot Image List Path" },
+       {  7, "Default Boot Image" },
+       {  8, "Selected Boot Image" },
+       {  9, "Boot Image List" },
+       { 10, "NetBoot 1.0 Firmware" },
+       { 11, "Boot Image Attributes Filter List" },
+       { 12, "Maximum Message Size" },
+       { 0, NULL}
+};
+
+static void
+dissect_vendor_bsdp_boot_image(proto_tree *v_tree, tvbuff_t *tvb, int optoff)
+{
+       static const int * bootp_o43_bsdp_attributes_flags[] = {
+               &hf_bootp_option43_bsdp_boot_image_attribute_install,
+               &hf_bootp_option43_bsdp_boot_image_attribute_kind,
+               &hf_bootp_option43_bsdp_boot_image_attribute_reserved,
+               NULL
+       };
+
+       proto_tree_add_bitmask(v_tree, tvb, optoff, hf_bootp_option43_bsdp_boot_image_attribute, ett_bootp_o43_bsdp_attributes_flags, bootp_o43_bsdp_attributes_flags, ENC_NA);
+}
 
 static int
-dissect_vendor_generic_suboption(packet_info *pinfo _U_, proto_item *v_ti _U_, proto_tree *v_tree,
-                                tvbuff_t *tvb, int optoff, int optend _U_)
+dissect_vendor_bsdp_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
+                                  tvbuff_t *tvb, int optoff, int optend)
+{
+       int         suboptoff = optoff;
+       int         attributes_off;
+       guint8      subopt, string_len;
+       guint8      subopt_len, attributes_len;
+       proto_tree *o43bsdp_v_tree, *o43bsdp_va_tree, *o43bsdp_vb_tree, *o43bsdp_vc_tree, *o43bsdp_vd_tree;
+       proto_item *vti, *ti, *tj;
+
+       subopt = tvb_get_guint8(tvb, optoff);
+       suboptoff++;
+
+       if (suboptoff >= optend) {
+               expert_add_info_format(pinfo, v_ti, &ei_bootp_missing_subopt_length,
+                                                                       "Suboption %d: no room left in option for suboption length", subopt);
+               return (optend);
+       }
+
+       subopt_len = tvb_get_guint8(tvb, suboptoff);
+       vti = proto_tree_add_uint_format_value(v_tree, hf_bootp_option43_bsdp_suboption,
+                               tvb, optoff, subopt_len+2, subopt, "(%d) %s",
+                               subopt, val_to_str_const(subopt, option43_bsdp_suboption_vals, "Unknown"));
+
+       o43bsdp_v_tree = proto_item_add_subtree(vti, ett_bootp_option43_suboption);
+       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
+       suboptoff++;
+
+       if (suboptoff+subopt_len > optend) {
+               expert_add_info_format(pinfo, vti, &ei_bootp_missing_subopt_value,
+                                               "Suboption %d: no room left in option for suboption value", subopt);
+               return (optend);
+       }
+
+       switch(subopt)
+       {
+               case 1:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_message_type, tvb, suboptoff, subopt_len, ENC_ASCII|ENC_NA);
+                       break;
+               case 2:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_version, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
+                       break;
+               case 3:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_server_identifier, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
+                       break;
+               case 4:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_server_priority, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
+                       break;
+               case 5:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_reply_port, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
+                       break;
+               case 6:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_boot_image_list_path, tvb, suboptoff, subopt_len, ENC_ASCII|ENC_NA);
+                       break;
+               case 7:
+                       ti = proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_default_boot_image_id, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
+                       o43bsdp_va_tree = proto_item_add_subtree(ti, ett_bootp_o43_bsdp_boot_image);
+                       dissect_vendor_bsdp_boot_image(o43bsdp_va_tree, tvb, suboptoff);
+                       proto_tree_add_item(o43bsdp_va_tree, hf_bootp_option43_bsdp_boot_image_index, tvb, suboptoff+2, subopt_len-2, ENC_BIG_ENDIAN|ENC_NA);
+                       break;
+               case 8:
+                       ti = proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_selected_boot_image_id, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
+                       o43bsdp_vc_tree = proto_item_add_subtree(ti, ett_bootp_o43_bsdp_boot_image);
+                       dissect_vendor_bsdp_boot_image(o43bsdp_vc_tree, tvb, suboptoff);
+                       proto_tree_add_item(o43bsdp_vc_tree, hf_bootp_option43_bsdp_boot_image_index, tvb, suboptoff+2, subopt_len-2, ENC_BIG_ENDIAN|ENC_NA);
+                       break;
+               case 9:
+                       ti = proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_boot_image_list, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
+                       attributes_len = subopt_len;
+                       attributes_off = suboptoff;
+                       o43bsdp_vd_tree = proto_item_add_subtree(ti, ett_bootp_o43_bsdp_image_desc_list);
+                       while (attributes_len >= 5) {
+                               string_len = tvb_get_guint8(tvb, attributes_off+4);
+                               if (string_len > 0) {
+                                       tj = proto_tree_add_item(o43bsdp_vd_tree, hf_bootp_option43_bsdp_image_desc, tvb, attributes_off, string_len+5, ENC_BIG_ENDIAN|ENC_NA);
+                                       o43bsdp_vb_tree = proto_item_add_subtree(tj, ett_bootp_o43_bsdp_image_desc);
+                                       dissect_vendor_bsdp_boot_image(o43bsdp_vb_tree, tvb, attributes_off);
+                                       proto_tree_add_item(o43bsdp_vb_tree, hf_bootp_option43_bsdp_boot_image_index, tvb, attributes_off+2, 2, ENC_BIG_ENDIAN|ENC_NA);
+                                       proto_tree_add_item(o43bsdp_vb_tree, hf_bootp_option43_bsdp_boot_image_name_len, tvb, attributes_off+4, 1, ENC_BIG_ENDIAN|ENC_NA);
+                                       proto_tree_add_item(o43bsdp_vb_tree, hf_bootp_option43_bsdp_boot_image_name, tvb, attributes_off+5, string_len, ENC_UTF_8|ENC_NA);
+                               }
+                               attributes_off += 5 + string_len;
+                               attributes_len -= 5 + string_len;
+                       }
+                       break;
+               case 10:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_netboot_firmware, tvb, suboptoff, subopt_len, ENC_NA);
+                       break;
+               case 11:
+                       ti = proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_attributes_filter_list, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
+                       attributes_len = subopt_len;
+                       attributes_off = suboptoff;
+                       o43bsdp_va_tree = proto_item_add_subtree(ti, ett_bootp_o43_bsdp_attributes);
+                       while (attributes_len >= 2) {
+                               dissect_vendor_bsdp_boot_image(o43bsdp_va_tree, tvb, attributes_off);
+                               attributes_off+=2;
+                               attributes_len-=2;
+                       }
+                       break;
+               case 12:
+                       proto_tree_add_item(o43bsdp_v_tree, hf_bootp_option43_bsdp_message_size, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
+                       break;
+       }
+
+       optoff += (subopt_len + 2);
+       return optoff;
+}
+
+static int
+dissect_vendor_generic_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
+                                tvbuff_t *tvb, int optoff, int optend)
 {
        int         suboptoff = optoff;
-       guint8      subopt_len;
+       guint8  subopt;
+       int         subopt_len;
        proto_item *item;
        proto_tree *sub_tree;
 
-       item = proto_tree_add_item(v_tree, hf_bootp_vendor_unknown_suboption, tvb, optoff, 1, ENC_BIG_ENDIAN);
+       item = proto_tree_add_item(v_tree, hf_bootp_vendor_unknown_suboption, tvb, optoff, 1, ENC_NA);
+       subopt = tvb_get_guint8(tvb, optoff);
+
        suboptoff+=1;
 
+       if (suboptoff >= optend) {
+               expert_add_info_format(pinfo, v_ti, &ei_bootp_missing_subopt_length,
+                                                                       "Suboption %d: no room left in option for suboption length", subopt);
+               return (optend);
+       }
+
        sub_tree = proto_item_add_subtree(item, ett_bootp_option125_suboption);
-       subopt_len = tvb_get_guint8(tvb,suboptoff);
-       proto_tree_add_item(sub_tree, hf_bootp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item_ret_uint(sub_tree, hf_bootp_suboption_length, tvb, suboptoff, 1, ENC_NA, &subopt_len);
        suboptoff++;
+
+       if (suboptoff+subopt_len > optend) {
+               expert_add_info_format(pinfo, item, &ei_bootp_missing_subopt_value,
+                                               "Suboption %d: no room left in option for suboption value", subopt);
+               return (optend);
+       }
+
        proto_tree_add_item(sub_tree, hf_bootp_suboption_data, tvb, suboptoff, subopt_len, ENC_NA);
        suboptoff+= subopt_len;
 
@@ -3393,6 +4045,38 @@ static const value_string option43_alcatel_app_type_vals[] = {
        { 0, NULL}
 };
 
+/* Look for 'encapsulated vendor-specific options' */
+static gboolean
+test_encapsulated_vendor_options(tvbuff_t *tvb, int optoff, int optend)
+{
+       guint8  subopt;
+       guint8  subopt_len;
+
+       while (optoff < optend) {
+               subopt = tvb_get_guint8(tvb, optoff);
+               optoff++;
+
+               /* Skip padding */
+               if (subopt == 0)
+                       continue;
+               /* We are done, skip any remaining bytes */
+               if (subopt == 255)
+                       break;
+
+               /* We expect a length byte next */
+               if (optoff >= optend)
+                       return FALSE;
+               subopt_len = tvb_get_guint8(tvb, optoff);
+               optoff++;
+
+               /* Check remaining room for suboption in option */
+               if (optoff + subopt_len > optend)
+                       return FALSE;
+               optoff += subopt_len;
+       }
+       return TRUE;
+}
+
 static int
 dissect_vendor_alcatel_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
                                 tvbuff_t *tvb, int optoff, int optend)
@@ -3615,12 +4299,12 @@ dissect_vendor_tr111_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree
 
        static struct opt_info o125_tr111_opt[]= {
                /* 0 */ {"nop", special, NULL}, /* dummy */
-               /* 1 */ {"DeviceManufacturerOUI", string, &hf_bootp_option125_tr111_device_manufacturer_oui},
-               /* 2 */ {"DeviceSerialNumber", string, &hf_bootp_option125_tr111_device_serial_number},
-               /* 3 */ {"DeviceProductClass", string, &hf_bootp_option125_tr111_device_product_class},
+               /* 1 */ {"DeviceManufacturerOUI",  oui,    &hf_bootp_option125_tr111_device_manufacturer_oui},
+               /* 2 */ {"DeviceSerialNumber",     string, &hf_bootp_option125_tr111_device_serial_number},
+               /* 3 */ {"DeviceProductClass",     string, &hf_bootp_option125_tr111_device_product_class},
                /* 4 */ {"GatewayManufacturerOUI", string, &hf_bootp_option125_tr111_gateway_manufacturer_oui},
-               /* 5 */ {"GatewaySerialNumber", string, &hf_bootp_option125_tr111_gateway_serial_number},
-               /* 6 */ {"GatewayProductClass", string, &hf_bootp_option125_tr111_gateway_product_class},
+               /* 5 */ {"GatewaySerialNumber",    string, &hf_bootp_option125_tr111_gateway_serial_number},
+               /* 6 */ {"GatewayProductClass",    string, &hf_bootp_option125_tr111_gateway_product_class},
        };
 
        subopt = tvb_get_guint8(tvb, optoff);
@@ -3628,7 +4312,7 @@ dissect_vendor_tr111_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree
 
        if (suboptoff >= optend) {
                expert_add_info_format(pinfo, v_ti, &ei_bootp_missing_subopt_length,
-                                                                       "Suboption %d: no room left in option for suboption length", subopt);
+                                      "Suboption %d: no room left in option for suboption length", subopt);
                return (optend);
        }
 
@@ -3651,13 +4335,20 @@ dissect_vendor_tr111_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree
        PROTO_ITEM_SET_HIDDEN(ti);
 
        if (subopt < array_length(o125_tr111_opt)) {
-               if (bootp_handle_basic_types(pinfo, o125_v_tree, vti, tvb, o125_tr111_opt[subopt].ftype,
-                                                       suboptoff, subopt_len, o125_tr111_opt[subopt].phf, &default_hfs) == 0) {
+               if (bootp_handle_basic_types(pinfo, o125_v_tree, vti, tvb, o125_tr111_opt[subopt].ftype, suboptoff, subopt_len, o125_tr111_opt[subopt].phf, &default_hfs) == 0) {
                        if (o125_tr111_opt[subopt].ftype == special) {
                                if (o125_tr111_opt[subopt].phf != NULL)
                                   proto_tree_add_item(v_tree, *o125_tr111_opt[subopt].phf, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
                                else
                                   proto_tree_add_item(v_tree, hf_bootp_option125_value, tvb, suboptoff, subopt_len, ENC_NA);
+                       }
+                       else if (o125_tr111_opt[subopt].ftype == oui) {
+                               /* Get hex string.  Expecting 6 characters. */
+                               gchar   *oui_string =  tvb_get_string_enc(wmem_packet_scope(), tvb, suboptoff, subopt_len, ENC_ASCII);
+                               /* Convert to OUI number.  Only 3 bytes so no data lost in downcast. */
+                               guint32 oui_number = (guint32)strtol(oui_string, NULL, 16);
+                               /* Add item using oui_vals */
+                               proto_tree_add_uint(v_tree, *o125_tr111_opt[subopt].phf, tvb, suboptoff, subopt_len, oui_number);
                        } else if (o125_tr111_opt[subopt].phf == NULL)
                                proto_tree_add_item(v_tree, hf_bootp_option125_value, tvb, suboptoff, subopt_len, ENC_NA);
                }
@@ -3945,9 +4636,9 @@ static void
 dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tvb, int voff, int len)
 {
        guint16        raw_val;
-       unsigned long  flow_val   = 0;
-       int            off        = PKT_MDC_TLV_OFF + voff;
-       int            subopt_off, max_len;
+       guint32        flow_val   = 0;
+       int                off    = PKT_MDC_TLV_OFF + voff;
+       int                subopt_off, max_len;
        guint          tlv_len, i, mib_val;
        guint8         asc_val[3] = "  ", flow_val_str[5];
        proto_item    *ti, *mib_ti;
@@ -3959,8 +4650,7 @@ dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tv
                        "Bogus length: %s", asc_val);
                return;
        } else {
-               proto_tree_add_uint_format_value(v_tree, hf_bootp_pkt_mta_cap_len, tvb, off, 2,
-                               tlv_len, "%d", tlv_len);
+               proto_tree_add_uint(v_tree, hf_bootp_pkt_mta_cap_len, tvb, off, 2, tlv_len);
                off += 2;
 
                while (off - voff < len) {
@@ -3981,7 +4671,7 @@ dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tv
                                    tvb, off, 2, raw_val, "0x%s: %s = ",
                                    tvb_format_text(tvb, off, 2),
                                    val_to_str_const(raw_val, pkt_mdc_type_vals, "unknown"));
-                proto_item_set_len(ti, (tlv_len * 2) + 4);
+                               proto_item_set_len(ti, (tlv_len * 2) + 4);
                                switch (raw_val) {
 
                                case PKT_MDC_VERSION:
@@ -4044,9 +4734,10 @@ dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tv
                                case PKT_MDC_PROV_FLOWS:
                                        tvb_memcpy(tvb, flow_val_str, off + 4, 4);
                                        flow_val_str[4] = '\0';
-                                       flow_val = strtoul((gchar*)flow_val_str, NULL, 16);
+                                       /* We are only reading 4 digits which should fit in 32 bits */
+                                       flow_val = (guint32)strtoul((gchar*)flow_val_str, NULL, 16);
                                        proto_item_append_text(ti,
-                                                              "0x%04lx", flow_val);
+                                                              "0x%04x", flow_val);
                                        break;
 
                                case PKT_MDC_T38_VERSION:
@@ -4078,9 +4769,14 @@ dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tv
                        }
                        subtree = proto_item_add_subtree(ti, ett_bootp_option);
                        if (raw_val == PKT_MDC_PROV_FLOWS) {
-                               proto_tree_add_boolean(subtree, hf_bootp_pkt_mdc_supp_flow_secure, tvb, off + 4, 4, flow_val);
-                               proto_tree_add_boolean(subtree, hf_bootp_pkt_mdc_supp_flow_hybrid, tvb, off + 4, 4, flow_val);
-                               proto_tree_add_boolean(subtree, hf_bootp_pkt_mdc_supp_flow_basic, tvb, off + 4, 4, flow_val);
+                               static const int * flows[] = {
+                                       &hf_bootp_pkt_mdc_supp_flow_secure,
+                                       &hf_bootp_pkt_mdc_supp_flow_hybrid,
+                                       &hf_bootp_pkt_mdc_supp_flow_basic,
+                                       NULL
+                               };
+
+                               proto_tree_add_bitmask_list_value(subtree, tvb, off + 4, 4, flows, flow_val);
                        } else if (raw_val == PKT_MDC_MIBS) {
                        /* 17 06 02 00 38 02 01 07 */
                                subopt_off = off + 4;
@@ -4115,31 +4811,49 @@ dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tv
                                        }
                                        switch (raw_val) {
 
-                                       case PKT_MDC_MIB_CL:
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_cl_mta, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_cl_signaling, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_cl_management_event, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_cl_mta_extension, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_cl_mta_signaling_extension, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_cl_mta_mem_extention, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_uint(subtree2, hf_bootp_pkt_mdc_mib_cl_reserved, tvb, subopt_off, 2, mib_val);
+                                       case PKT_MDC_MIB_CL: {
+                                               static const int * cl_flags[] = {
+                                                       &hf_bootp_pkt_mdc_mib_cl_mta,
+                                                       &hf_bootp_pkt_mdc_mib_cl_signaling,
+                                                       &hf_bootp_pkt_mdc_mib_cl_management_event,
+                                                       &hf_bootp_pkt_mdc_mib_cl_mta_extension,
+                                                       &hf_bootp_pkt_mdc_mib_cl_mta_signaling_extension,
+                                                       &hf_bootp_pkt_mdc_mib_cl_mta_mem_extention,
+                                                       &hf_bootp_pkt_mdc_mib_cl_reserved,
+                                                       NULL
+                                               };
+
+                                               proto_tree_add_bitmask_list_value(subtree2, tvb, subopt_off, 2, cl_flags, mib_val);
+                        }
                                                break;
 
-                                       case PKT_MDC_MIB_IETF:
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_ietf_mta, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_ietf_signaling, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_ietf_management_event, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_uint(subtree2, hf_bootp_pkt_mdc_mib_ietf_reserved, tvb, subopt_off, 2, mib_val);
+                                       case PKT_MDC_MIB_IETF: {
+                                               static const int * ietf_flags[] = {
+                                                       &hf_bootp_pkt_mdc_mib_ietf_mta,
+                                                       &hf_bootp_pkt_mdc_mib_ietf_signaling,
+                                                       &hf_bootp_pkt_mdc_mib_ietf_management_event,
+                                                       &hf_bootp_pkt_mdc_mib_ietf_reserved,
+                                                       NULL
+                                               };
+
+                                               proto_tree_add_bitmask_list_value(subtree2, tvb, subopt_off, 2, ietf_flags, mib_val);
+                        }
                                                break;
 
-                                       case PKT_MDC_MIB_EURO:
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_euro_mta, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_euro_signaling, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_euro_management_event, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_euro_mta_extension, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_euro_mta_signaling_extension, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_boolean(subtree2, hf_bootp_pkt_mdc_mib_euro_mta_mem_extention, tvb, subopt_off, 2, mib_val);
-                                               proto_tree_add_uint(subtree2, hf_bootp_pkt_mdc_mib_euro_reserved, tvb, subopt_off, 2, mib_val);
+                                       case PKT_MDC_MIB_EURO: {
+                                               static const int * euro_flags[] = {
+                                                       &hf_bootp_pkt_mdc_mib_euro_mta,
+                                                       &hf_bootp_pkt_mdc_mib_euro_signaling,
+                                                       &hf_bootp_pkt_mdc_mib_euro_management_event,
+                                                       &hf_bootp_pkt_mdc_mib_euro_mta_extension,
+                                                       &hf_bootp_pkt_mdc_mib_euro_mta_signaling_extension,
+                                                       &hf_bootp_pkt_mdc_mib_euro_mta_mem_extention,
+                                                       &hf_bootp_pkt_mdc_mib_euro_reserved,
+                                                       NULL
+                                               };
+
+                                               proto_tree_add_bitmask_list_value(subtree2, tvb, subopt_off, 2, euro_flags, mib_val);
+                        }
                                                break;
 
                                        default:
@@ -4438,8 +5152,7 @@ dissect_docsis_cm_cap(proto_tree *v_tree, tvbuff_t *tvb, int voff, int len, gboo
                tlv_type = tvb_get_guint8(tvb, off);
                /* Length */
                tlv_len  = tvb_get_guint8(tvb, off+1);
-               proto_tree_add_uint_format_value(v_tree, hf_bootp_docsis_cm_cap_len, tvb, off+1, 1,
-                                                tlv_len, "%d", tlv_len);
+               proto_tree_add_uint(v_tree, hf_bootp_docsis_cm_cap_len, tvb, off+1, 1, tlv_len);
        }
        else
        {
@@ -4675,49 +5388,64 @@ dissect_docsis_cm_cap(proto_tree *v_tree, tvbuff_t *tvb, int voff, int len, gboo
                subtree = proto_item_add_subtree(ti, ett_bootp_option);
                if (tlv_type == DOCSIS_CM_CAP_RNGHLDOFF_SUP && tlv_len >= 4)
                {
+                       const int * flags[] = {
+                               &hf_bootp_docsis_cm_cap_ranging_hold_off_cm,
+                               &hf_bootp_docsis_cm_cap_ranging_hold_off_eps,
+                               &hf_bootp_docsis_cm_cap_ranging_hold_off_emta,
+                               &hf_bootp_docsis_cm_cap_ranging_hold_off_dsg,
+                               NULL
+                       };
                        val_uint16 = (val_other[2] << sizeof(guint8)) + val_other[3];
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ranging_hold_off_cm, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ranging_hold_off_eps, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ranging_hold_off_emta, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ranging_hold_off_dsg, tvb, off + 2, 4, val_uint16);
+
+                       proto_tree_add_bitmask_list_value(subtree, tvb, off + 2, 4, flags, val_uint16);
                }
                if (tlv_type == DOCSIS_CM_CAP_USSYMRATE_SUP)
                {
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ussymrate_160, tvb, off + 2, 1, val_byte);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ussymrate_320, tvb, off + 2, 1, val_byte);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ussymrate_640, tvb, off + 2, 1, val_byte);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ussymrate_1280, tvb, off + 2, 1, val_byte);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ussymrate_2560, tvb, off + 2, 1, val_byte);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_ussymrate_5120, tvb, off + 2, 1, val_byte);
+                       const int * flags[] = {
+                               &hf_bootp_docsis_cm_cap_ussymrate_160,
+                               &hf_bootp_docsis_cm_cap_ussymrate_320,
+                               &hf_bootp_docsis_cm_cap_ussymrate_640,
+                               &hf_bootp_docsis_cm_cap_ussymrate_1280,
+                               &hf_bootp_docsis_cm_cap_ussymrate_2560,
+                               &hf_bootp_docsis_cm_cap_ussymrate_5120,
+                               NULL
+                       };
+
+                       proto_tree_add_bitmask_list_value(subtree, tvb, off + 2, 1, flags, val_byte);
                }
                if (tlv_type == DOCSIS_CM_CAP_Opt802MPLSSup && tlv_len >= 4)
                {
+                       const int * flags[] = {
+                               &hf_bootp_docsis_cm_cap_mpls_stpid,
+                               &hf_bootp_docsis_cm_cap_mpls_svid,
+                               &hf_bootp_docsis_cm_cap_mpls_spcp,
+                               &hf_bootp_docsis_cm_cap_mpls_sdei,
+                               &hf_bootp_docsis_cm_cap_mpls_ctpid,
+                               &hf_bootp_docsis_cm_cap_mpls_cvid,
+                               &hf_bootp_docsis_cm_cap_mpls_cpcp,
+                               &hf_bootp_docsis_cm_cap_mpls_ccfi,
+                               &hf_bootp_docsis_cm_cap_mpls_stci,
+                               &hf_bootp_docsis_cm_cap_mpls_ctci,
+                               &hf_bootp_docsis_cm_cap_mpls_itpid,
+                               &hf_bootp_docsis_cm_cap_mpls_isid,
+                               &hf_bootp_docsis_cm_cap_mpls_itci,
+                               &hf_bootp_docsis_cm_cap_mpls_ipcp,
+                               &hf_bootp_docsis_cm_cap_mpls_idei,
+                               &hf_bootp_docsis_cm_cap_mpls_iuca,
+                               &hf_bootp_docsis_cm_cap_mpls_btpid,
+                               &hf_bootp_docsis_cm_cap_mpls_btci,
+                               &hf_bootp_docsis_cm_cap_mpls_bpcp,
+                               &hf_bootp_docsis_cm_cap_mpls_bdei,
+                               &hf_bootp_docsis_cm_cap_mpls_bvid,
+                               &hf_bootp_docsis_cm_cap_mpls_bda,
+                               &hf_bootp_docsis_cm_cap_mpls_bsa,
+                               &hf_bootp_docsis_cm_cap_mpls_tc,
+                               &hf_bootp_docsis_cm_cap_mpls_label,
+                               NULL
+                       };
                        val_uint16 = (val_other[2] << sizeof(guint8)) + val_other[3];
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_stpid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_svid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_spcp, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_sdei, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_ctpid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_cvid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_cpcp, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_ccfi, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_stci, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_ctci, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_itpid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_isid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_itci, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_ipcp, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_idei, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_iuca, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_btpid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_btci, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_bpcp, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_bdei, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_bvid, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_bda, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_bsa, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_tc, tvb, off + 2, 4, val_uint16);
-                       proto_tree_add_boolean(subtree, hf_bootp_docsis_cm_cap_mpls_label, tvb, off + 2, 4, val_uint16);
+
+                       proto_tree_add_bitmask_list_value(subtree, tvb, off + 2, 4, flags, val_uint16);
                }
                if (opt125)
                {
@@ -5098,8 +5826,8 @@ static const value_string op_vals[] = {
        { 0,            NULL }
 };
 
-static void
-dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+static int
+dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
 {
        proto_tree   *bp_tree;
        proto_item   *bp_ti, *ti;
@@ -5169,6 +5897,9 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        }
        eoff = tvb_reported_length(tvb);
 
+       bp_ti = proto_tree_add_item(tree, proto_bootp, tvb, 0, -1, ENC_NA);
+       bp_tree = proto_item_add_subtree(bp_ti, ett_bootp);
+
        /*
         * In the first pass, we just look for the DHCP message type
         * and Vendor class identifier options.
@@ -5181,7 +5912,9 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                offset_delta = bootp_option(tvb, pinfo, NULL, NULL, tmpvoff, eoff, TRUE, &at_end,
                    &dhcp_type, &vendor_class_id, &overload);
                if (offset_delta <= 0) {
-                       THROW(ReportedBoundsError);
+                       proto_tree_add_expert(bp_tree, pinfo, &ei_bootp_option_parse_err,
+                                       tvb, tmpvoff, eoff);
+                       return tmpvoff;
                }
                tmpvoff += offset_delta;
        }
@@ -5203,12 +5936,9 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        }
 
        /*
-        * OK, now build the protocol tree.
+        * OK, now populate the protocol tree.
         */
 
-       bp_ti = proto_tree_add_item(tree, proto_bootp, tvb, 0, -1, ENC_NA);
-       bp_tree = proto_item_add_subtree(bp_ti, ett_bootp);
-
        proto_tree_add_uint(bp_tree, hf_bootp_type, tvb,
                                   0, 1,
                                   op);
@@ -5227,8 +5957,7 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         */
        secs = tvb_get_letohs(tvb, 8);
        if (secs > 0 && secs <= 0xff) {
-               ti = proto_tree_add_uint_format_value(bp_tree, hf_bootp_secs, tvb,
-                           8, 2, secs, "%u", secs);
+               ti = proto_tree_add_uint(bp_tree, hf_bootp_secs, tvb, 8, 2, secs);
                expert_add_info_format(pinfo, ti, &ei_bootp_secs_le, "Seconds elapsed appears to be encoded as little-endian");
        } else {
                proto_tree_add_item(bp_tree, hf_bootp_secs, tvb,
@@ -5323,7 +6052,9 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                offset_delta = bootp_option(tvb, pinfo, bp_tree, bp_ti, voff, eoff, FALSE, &at_end,
                    &dhcp_type, &vendor_class_id, &overload);
                if (offset_delta <= 0) {
-                       THROW(ReportedBoundsError);
+                       proto_tree_add_expert(bp_tree, pinfo, &ei_bootp_option_parse_err,
+                                       tvb, voff, eoff);
+                       return voff;
                }
                voff += offset_delta;
        }
@@ -5337,6 +6068,8 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                 */
                proto_tree_add_item(bp_tree, hf_bootp_option_padding, tvb, voff, eoff - voff, ENC_NA);
        }
+
+       return tvb_captured_length(tvb);
 }
 
 static void
@@ -5356,6 +6089,73 @@ bootp_init_protocol(void)
        }
 }
 
+/* TAP STAT INFO */
+typedef enum
+{
+       MESSAGE_TYPE_COLUMN = 0,
+       PACKET_COLUMN
+} bootp_stat_columns;
+
+static stat_tap_table_item bootp_stat_fields[] = {{TABLE_ITEM_STRING, TAP_ALIGN_LEFT, "DHCP Message Type", "%-25s"}, {TABLE_ITEM_UINT, TAP_ALIGN_RIGHT, "Packets", "%d"}};
+
+static void bootp_stat_init(stat_tap_table_ui* new_stat, new_stat_tap_gui_init_cb gui_callback, void* gui_data)
+{
+       int num_fields = sizeof(bootp_stat_fields)/sizeof(stat_tap_table_item);
+       stat_tap_table* table = new_stat_tap_init_table("DHCP Statistics", num_fields, 0, NULL, gui_callback, gui_data);
+       int i = 0;
+       stat_tap_table_item_type items[sizeof(bootp_stat_fields)/sizeof(stat_tap_table_item)];
+
+       new_stat_tap_add_table(new_stat, table);
+
+       /* Add a row for each value type */
+       while (opt53_text[i].strptr)
+       {
+               items[MESSAGE_TYPE_COLUMN].type = TABLE_ITEM_STRING;
+               items[MESSAGE_TYPE_COLUMN].value.string_value = opt53_text[i].strptr;
+               items[PACKET_COLUMN].type = TABLE_ITEM_UINT;
+               items[PACKET_COLUMN].value.uint_value = 0;
+
+               new_stat_tap_init_table_row(table, i, num_fields, items);
+               i++;
+       }
+}
+
+static gboolean
+bootp_stat_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *data)
+{
+       new_stat_data_t* stat_data = (new_stat_data_t*)tapdata;
+       const char* value = (const char*)data;
+       stat_tap_table* table;
+       stat_tap_table_item_type* msg_data;
+       guint i = 0;
+       gint idx;
+
+       idx = str_to_val_idx(value, opt53_text);
+       if (idx < 0)
+               return FALSE;
+
+       table = g_array_index(stat_data->stat_tap_data->tables, stat_tap_table*, i);
+       msg_data = new_stat_tap_get_field_data(table, idx, PACKET_COLUMN);
+       msg_data->value.uint_value++;
+       new_stat_tap_set_field_data(table, idx, PACKET_COLUMN, msg_data);
+
+       return TRUE;
+}
+
+static void
+bootp_stat_reset(stat_tap_table* table)
+{
+       guint element;
+       stat_tap_table_item_type* item_data;
+
+       for (element = 0; element < table->num_elements; element++)
+       {
+               item_data = new_stat_tap_get_field_data(table, element, PACKET_COLUMN);
+               item_data->value.uint_value = 0;
+               new_stat_tap_set_field_data(table, element, PACKET_COLUMN, item_data);
+       }
+}
+
 void
 proto_register_bootp(void)
 {
@@ -5871,7 +6671,7 @@ proto_register_bootp(void)
                    NULL, HFILL }},
 
                { &hf_bootp_client_identifier_enterprise_num,
-                 { "Enterprise-number", "bootp.client_id.iaid",
+                 { "Enterprise-number", "bootp.client_id.enterprise_num",
                    FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sminmpec_values_ext, 0x0,
                    NULL, HFILL }},
 
@@ -5880,6 +6680,16 @@ proto_register_bootp(void)
                    FT_BYTES, BASE_NONE, NULL, 0x0,
                    NULL, HFILL }},
 
+               { &hf_bootp_client_identifier_type,
+                 { "Type", "bootp.client_id.type",
+                   FT_UINT8, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_client_identifier_undef,
+                 { "Client Identifier", "bootp.client_id.undef",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
                { &hf_bootp_option_type,
                  { "Option", "bootp.option.type",
                    FT_UINT8, BASE_DEC, NULL, 0x0,
@@ -5942,7 +6752,7 @@ proto_register_bootp(void)
 
                { &hf_bootp_option_subnet_mask,
                  { "Subnet Mask", "bootp.option.subnet_mask",
-                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   FT_IPv4, BASE_NETMASK, NULL, 0x00,
                    "Option 1: Subnet Mask", HFILL }},
 
                { &hf_bootp_option_time_offset,
@@ -6042,7 +6852,7 @@ proto_register_bootp(void)
 
                { &hf_bootp_option_policy_filter_subnet_mask,
                  { "Subnet Mask", "bootp.option.policy_filter.subnet_mask",
-                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   FT_IPv4, BASE_NETMASK, NULL, 0x00,
                    "Option 21: Subnet Mask", HFILL }},
 
                { &hf_bootp_option_non_local_source_routing,
@@ -6464,6 +7274,113 @@ proto_register_bootp(void)
                    FT_STRING, BASE_NONE, NULL, 0x0,
                    "Password for Instant AP Airwave server (AMP)", HFILL }},
 
+
+               { &hf_bootp_option43_bsdp_suboption,
+                 { "Option 43 Suboption", "bootp.option.vendor.bsdp.suboption",
+                   FT_UINT8, BASE_DEC, VALS(option43_cl_suboption_vals), 0x0,
+                   "Option 43:BSDP Suboption", HFILL }},
+
+               { &hf_bootp_option43_bsdp_message_type,
+                 { "Message Type", "bootp.option.vendor.bsdp.message_type",
+                   FT_UINT8, BASE_DEC, VALS(o43_bsdp_message_type_vals), 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_version,
+                 { "Version", "bootp.option.vendor.bsdp.version",
+                   FT_UINT16, BASE_HEX, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_server_identifier,
+                 { "Server Identifier", "bootp.option.vendor.bsdp.server_identifier",
+                   FT_IPv4, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_server_priority,
+                 { "Server Priority", "bootp.option.vendor.bsdp.server_priority",
+                   FT_UINT16, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_reply_port,
+                 { "Reply Port", "bootp.option.vendor.bsdp.reply_port",
+                   FT_UINT16, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_list_path,
+                 { "Boot Image List Path", "bootp.option.vendor.bsdp.boot_image_list_path",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_index,
+                 { "Boot Image Index", "bootp.option.vendor.bsdp.boot_image.index",
+                   FT_UINT16, BASE_HEX, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_default_boot_image_id,
+                 { "Default Boot Image ID", "bootp.option.vendor.bsdp.default_boot_image_id",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_selected_boot_image_id,
+                 { "Selected Boot Image ID", "bootp.option.vendor.bsdp.selected_boot_image_id",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_list,
+                 { "Boot Image List", "bootp.option.vendor.bsdp.boot_image_list",
+                   FT_BYTES, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_image_desc,
+                 { "Boot Image Description", "bootp.option.vendor.bsdp.boot_image.desc",
+                   FT_BYTES, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_name_len,
+                 { "Boot Image Name Length", "bootp.option.vendor.bsdp.boot_image.name_len",
+                   FT_UINT8, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_name,
+                 { "Boot Image Name", "bootp.option.vendor.bsdp.boot_image.name",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_netboot_firmware,
+                 { "NetBoot 1.0 Firmware", "bootp.option.vendor.bsdp.netboot_firmware",
+                   FT_NONE, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_attributes_filter_list,
+                 { "Boot Image Attributes Filter List", "bootp.option.vendor.bsdp.attributes_filter_list",
+                   FT_BYTES, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_attribute,
+                 { "Boot Image Attribute", "bootp.option.vendor.bsdp.boot_image.attribute",
+                   FT_UINT16, BASE_HEX, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_attribute_install,
+                 { "Install", "bootp.option.vendor.bsdp.boot_image.attribute.install",
+                   FT_UINT16, BASE_HEX, VALS(o43_bsdp_boot_image_install_vals), 0x8000,
+                   "Boot Image Attribute Install", HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_attribute_kind,
+                 { "Kind", "bootp.option.vendor.bsdp.boot_image.attribute.kind",
+                   FT_UINT16, BASE_HEX, VALS(o43_bsdp_boot_image_kind_vals), 0x7f00,
+                   "Boot Image Attribute Kind", HFILL }},
+
+               { &hf_bootp_option43_bsdp_boot_image_attribute_reserved,
+                 { "Reserved", "bootp.option.vendor.bsdp.boot_image.attribute.reserved",
+                   FT_UINT16, BASE_HEX, NULL, 0x00ff,
+                   "Boot Image Attribute Reserved", HFILL }},
+
+               { &hf_bootp_option43_bsdp_message_size,
+                 { "Message Size", "bootp.option.vendor.bsdp.message_size",
+                   FT_UINT16, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+
                { &hf_bootp_option_netbios_over_tcpip_name_server,
                  { "NetBIOS over TCP/IP Name Server", "bootp.option.netbios_over_tcpip_name_server",
                    FT_IPv4, BASE_NONE, NULL, 0x00,
@@ -6846,6 +7763,11 @@ proto_register_bootp(void)
                    FT_IPv4, BASE_NONE, NULL, 0x00,
                    "Option 82:11 Server ID Override", HFILL }},
 
+               { &hf_bootp_option82_relay_agent_id,
+                 { "Relay Agent Identifier", "bootp.option.agent_information_option.relay_agent_id",
+                   FT_BYTES, BASE_NONE, NULL, 0x00,
+                   "Option 82:12 Relay Agent Identifier", HFILL }},
+
                { &hf_bootp_option82_link_selection_cisco,
                  { "Link selection (Cisco proprietary)", "bootp.option.agent_information_option.link_selection_cisco",
                    FT_IPv4, BASE_NONE, NULL, 0x00,
@@ -6882,6 +7804,162 @@ proto_register_bootp(void)
                    "Option 82:152 Server ID Override (Cisco proprietary)", HFILL }},
 
 
+               { &hf_bootp_option_isns_functions,
+                 { "iSNS Functions", "bootp.option.isns.functions",
+                   FT_UINT16, BASE_HEX, NULL, 0x00,
+                   "iSNS: the functions supported by the iSNS servers", HFILL }},
+
+               { &hf_bootp_option_isns_functions_enabled,
+                 { "Function Fields Enabled", "bootp.option.isns.functions.enabled",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_FUNCTIONS_ENABLED,
+                   "If set to zero, then the contents of all other iSNS Function fields MUST be ignored", HFILL }},
+
+               { &hf_bootp_option_isns_functions_dd_authorization,
+                 { "Discovery Domain based Authorization", "bootp.option.isns.functions.dd_base_authorization",
+                   FT_BOOLEAN, 16, TFS(&tfs_isns_function_dd_based_auth), F_ISNS_FUNCTIONS_DD_AUTH,
+                   "If set to zero, then access authorization must be explicitly performed by each device", HFILL }},
+
+               { &hf_bootp_option_isns_functions_sec_policy_distibution,
+                 { "Security Policy Distribution", "bootp.option.isns.functions.sec_policy_distribution",
+                   FT_BOOLEAN, 16, TFS(&tfs_isns_functions_sec_distrib), F_ISNS_FUNCTIONS_SEC_POLICY,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_functions_reserved,
+                 { "Reserved flags", "bootp.option.isns.functions.reserved",
+                   FT_UINT16, BASE_HEX, NULL, F_ISNS_FUNCTIONS_RESERVED,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access,
+                 { "Discovery Domain Access flags", "bootp.option.isns.discovery_domain_access",
+                   FT_UINT16, BASE_HEX, NULL, 0x00,
+                   "iSNS: the types of iSNS clients that are allowed to modify Discovery Domains", HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_enabled,
+                 { "Discovery Domain Enabled", "bootp.option.isns.discovery_domain_access.enabled",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_ENABLED,
+                   "If set to zero, then the contents of the remainder of this field MUST be ignored", HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_control_node,
+                 { "Control Node", "bootp.option.isns.discovery_domain_access_control.node",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_CTRL_NODE,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_iscsi_target,
+                 { "iSCSI Target", "bootp.option.isns.discovery_domain_access.iscsi_target",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_ISCSI_TARGET,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_iscsi_inititator,
+                 { "iSCSI Initiator", "bootp.option.isns.discovery_domain_access.iscsi_initiator",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_ISCSI_INITIATOR,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_ifcp_target_port,
+                 { "iFCP Target Port", "bootp.option.isns.discovery_domain_access.ifcp_target_port",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_IFCP_TARGET_PORT,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_ifcp_initiator_port,
+                 { "iFCP Initiator Port", "bootp.option.isns.discovery_domain_access.initiator_target_port",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_IFCP_INITIATOR_PORT,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_discovery_domain_access_reserved,
+                 { "Reserved Flags", "bootp.option.isns.discovery_domain_access.reserved",
+                   FT_UINT16, BASE_HEX, NULL, F_ISNS_DD_ACCESS_RESERVED,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_administrative_flags,
+                 { "Administrative Flags", "bootp.option.isns.administrative_flags",
+                   FT_UINT16, BASE_HEX, NULL, 0x00,
+                   "iSNS: administrative settings for the iSNS servers discovered through the DHCP query", HFILL }},
+
+               { &hf_bootp_option_isns_administrative_flags_enabled,
+                 { "Administrative Flags Enabled", "bootp.option.isns.administrative_flags.enabled",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_ENABLED,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_administrative_flags_heartbeat,
+                 { "Heartbeat", "bootp.option.isns.administrative_flags.heartbeat",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_HEARTBEAT,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_administrative_flags_management_scns,
+                 { "Management SCNs", "bootp.option.isns.administrative_flags.management_scns",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_MANAGEMENT_SCNS,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_administrative_flags_default_dd,
+                 { "Default Discovery Domain", "bootp.option.isns.administrative_flags.default_discovery_domain",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_DEFAULT_DD,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_administrative_flags_reserved,
+                 { "Reserved Flags", "bootp.option.isns.administrative_flags.reserved",
+                   FT_UINT16, BASE_HEX, NULL, F_ISNS_ADMIN_FLAGS_RESERVED,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap,
+                 { "iSNS Server Security Bitmap", "bootp.option.isns.server_security_bitmap",
+                   FT_UINT32, BASE_HEX, NULL, 0x00,
+                   "iSNS: server security settings", HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_enabled,
+                 { "Server Security Bitmap Enabled", "bootp.option.isns.server_security_bitmap.enabled",
+                   FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_SRV_SEC_BITMAP_ENABLED,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_ike_ipsec_enabled,
+                 { "IKE/IPSec", "bootp.option.isns.server_security_bitmap.ike_ipsec_enabled",
+                   FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_IKE_IPSEC,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_main_mode,
+                 { "Main Mode", "bootp.option.isns.server_security_bitmap.main_mode",
+                   FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_MAIN_MODE,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_aggressive_mode,
+                 { "Aggresive Mode", "bootp.option.isns.server_security_bitmap.aggressive_mode",
+                   FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_AGGRESSIVE,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_pfs,
+                 { "PFS", "bootp.option.isns.server_security_bitmap.pfs",
+                   FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_PFS,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_transport_mode,
+                 { "Transport Mode", "bootp.option.isns.server_security_bitmap.transport_mode",
+                   FT_BOOLEAN, 16, TFS(&tfs_preferred_no_preference), F_ISNS_SRV_SEC_BITMAP_TRASPORT_MODE,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_tunnel_mode,
+                 { "Tunnel Mode", "bootp.option.isns.server_security_bitmap.tunnel_mode",
+                   FT_BOOLEAN, 16, TFS(&tfs_preferred_no_preference), F_ISNS_SRV_SEC_BITMAP_TUNNEL_MODE,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_server_security_bitmap_reserved,
+                 { "Reserved Flags", "bootp.option.isns.server_security_bitmap.reserved",
+                   FT_UINT16, BASE_HEX, NULL, F_ISNS_SRV_SEC_BITMAP_RESERVED,
+                   NULL, HFILL }},
+
+               { &hf_bootp_option_isns_primary_server_addr,
+                 { "Primary Server Address", "bootp.option.isns.primary_server_addr",
+                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   "iSNS: IP address of the primary server", HFILL }},
+
+               { &hf_bootp_option_isns_heartbeat_originator_addr,
+                 { "Heartbeat Originator Address", "bootp.option.isns.heartbeat_originator_addr",
+                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   "iSNS: IP address from which the iSNS heartbeat originates", HFILL }},
+
+               { &hf_bootp_option_isns_secondary_server_addr_list,
+                 { "Secondary Server Address", "bootp.option.isns.secondary_server_addr",
+                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   "iSNS: a list of IP addresses of the secondary iSNS servers", HFILL }},
+
+
                { &hf_bootp_option_novell_dss_string,
                  { "Novell Directory Services Servers String", "bootp.option.novell_dss.string",
                    FT_STRINGZ, BASE_NONE, NULL, 0x0,
@@ -6997,6 +8075,16 @@ proto_register_bootp(void)
                    FT_STRINGZ, BASE_NONE, NULL, 0x0,
                    "Option 99: CA Value", HFILL }},
 
+               { &hf_bootp_option_tz_pcode,
+                 { "TZ PCode", "bootp.option.tz_pcode",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   "Option 100: TZ PCode", HFILL  }},
+
+               { &hf_bootp_option_tz_tcode,
+                 { "TZ TCode", "bootp.option.tz_tcode",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   "Option 101: TZ TCode", HFILL  }},
+
                { &hf_bootp_option_netinfo_parent_server_address,
                  { "NetInfo Parent Server Address", "bootp.option.netinfo_parent_server_address",
                    FT_IPv4, BASE_NONE, NULL, 0x00,
@@ -7064,7 +8152,7 @@ proto_register_bootp(void)
 
                { &hf_bootp_option_classless_static_route,
                  { "Subnet/MaskWidth-Router", "bootp.option.classless_static_route.",
-                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   FT_BYTES, BASE_NONE, NULL, 0x0,
                    "Option 121: Subnet/MaskWidth-Router", HFILL }},
 
                { &hf_bootp_option_rfc3825_error,
@@ -7152,6 +8240,11 @@ proto_register_bootp(void)
                    FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sminmpec_values_ext, 0x00,
                    "Option 125: Enterprise", HFILL }},
 
+               { &hf_bootp_option125_length,
+                 { "Length", "bootp.option.vi.length",
+                   FT_UINT8, BASE_DEC, NULL, 0x00,
+                   "Option 125: Length", HFILL }},
+
                { &hf_bootp_option125_value,
                  { "Value", "bootp.option.vi.value",
                    FT_BYTES, BASE_NONE, NULL, 0x0,
@@ -7184,7 +8277,7 @@ proto_register_bootp(void)
 
                { &hf_bootp_option125_tr111_device_manufacturer_oui,
                  { "DeviceManufacturerOUI", "bootp.option.vi.tr111.device_manufacturer_oui",
-                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   FT_UINT24, BASE_HEX, VALS(oui_vals), 0x0,
                    "Option 125:TR 111 1 DeviceManufacturerOUI", HFILL }},
 
                { &hf_bootp_option125_tr111_device_serial_number,
@@ -7262,6 +8355,21 @@ proto_register_bootp(void)
                    FT_IPv4, BASE_NONE, NULL, 0x00,
                    "Option 150: TFTP Server Address", HFILL }},
 
+               { &hf_bootp_option_mudurl,
+                 { "MUDURL", "bootp.option.mudurl",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   "Option 161: MUDURL", HFILL  }},
+
+               { &hf_bootp_option_pxe_config_file,
+                 { "PXELINUX configuration file", "bootp.option.pxe_config_file",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   "Option 209: PXE Configuration File", HFILL }},
+
+               { &hf_bootp_option_pxe_path_prefix,
+                 { "PXELINUX path prefix", "bootp.option.pxe_path_prefix",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   "Option 210: PXE Path Prefix", HFILL }},
+
                { &hf_bootp_option_6RD_ipv4_mask_len,
                  { "6RD IPv4 Mask Length", "bootp.option.6RD.ipv4_mask_len",
                    FT_UINT8, BASE_DEC, NULL, 0x0,
@@ -7356,6 +8464,101 @@ proto_register_bootp(void)
                  { "Invalidate All PacketCable Call Management Servers", "bootp.ccc.ietf.sec_tkt.all_pc_call_management",
                    FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x02,
                    NULL, HFILL }},
+
+               { &hf_bootp_option242_avaya,
+                 { "Private/Avaya IP Telephone",  "bootp.option.vendor.avaya",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: Private/Avaya IP Telephone", HFILL }},
+
+               { &hf_bootp_option242_avaya_tlssrvr,
+                 { "TLSSRVR",  "bootp.option.vendor.avaya.tlssrvr",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: TLSSRVR (HTTPS server(s) to download configuration)", HFILL }},
+
+               { &hf_bootp_option242_avaya_httpsrvr,
+                 { "HTTPSRVR",  "bootp.option.vendor.avaya.httpsrvr",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: HTTPSRVR (HTTP server(s) to download configuration)", HFILL }},
+
+               { &hf_bootp_option242_avaya_httpdir,
+                 { "HTTPDIR",  "bootp.option.vendor.avaya.httpdir",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: HTTPDIR (Path to configuration files)", HFILL }},
+
+               { &hf_bootp_option242_avaya_static,
+                 { "STATIC",  "bootp.option.vendor.avaya.static",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: STATIC (Static programming override flag)", HFILL }},
+
+               { &hf_bootp_option242_avaya_mcipadd,
+                 { "MCIPADD",  "bootp.option.vendor.avaya.mcipadd",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: MCIPADD (List of CM server(s))", HFILL }},
+
+               { &hf_bootp_option242_avaya_dot1x,
+                 { "DOT1X",  "bootp.option.vendor.avaya.dot1x",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: DOT1X (802.1X Supplicant operation mode)", HFILL }},
+
+               { &hf_bootp_option242_avaya_icmpdu,
+                 { "ICMPDU",  "bootp.option.vendor.avaya.icmpdu",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: ICMPDU (ICMP Destination Unreachable processing)", HFILL }},
+
+               { &hf_bootp_option242_avaya_icmpred,
+                 { "ICMPRED",  "bootp.option.vendor.avaya.icmpred",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: ICMPRED (ICMP Redirect handling)", HFILL }},
+
+               { &hf_bootp_option242_avaya_l2q,
+                 { "L2Q",  "bootp.option.vendor.avaya.l2q",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: L2Q (Controls 802.1Q tagging)", HFILL }},
+
+               { &hf_bootp_option242_avaya_l2qvlan,
+                 { "L2QVLAN",  "bootp.option.vendor.avaya.l2qvlan",
+                   FT_INT32, BASE_DEC, NULL, 0x0,
+                   "Option 242: L2QVLAN (VLAN ID)", HFILL }},
+
+               { &hf_bootp_option242_avaya_loglocal,
+                 { "LOGLOCAL",  "bootp.option.vendor.avaya.loglocal",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: LOGLOCAL (Log level)", HFILL }},
+
+               { &hf_bootp_option242_avaya_phy1stat,
+                 { "PHY1STAT",  "bootp.option.vendor.avaya.phy1stat",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: PHY1STAT (Interface configuration)", HFILL }},
+
+               { &hf_bootp_option242_avaya_phy2stat,
+                 { "PHY2STAT",  "bootp.option.vendor.avaya.phy2stat",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: PHY2STAT (Interface configuration)", HFILL }},
+
+               { &hf_bootp_option242_avaya_procpswd,
+                 { "PROCPSWD",  "bootp.option.vendor.avaya.procpswd",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: PROCPSWD (Security string used to access local procedures)", HFILL }},
+
+               { &hf_bootp_option242_avaya_procstat,
+                 { "PROCSTAT",  "bootp.option.vendor.avaya.procstat",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: PROCSTAT (Local (dialpad) Administrative access)", HFILL }},
+
+               { &hf_bootp_option242_avaya_snmpadd,
+                 { "SNMPADD",  "bootp.option.vendor.avaya.snmpadd",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: SNMPADD (Allowable source IP Address(es) for SNMP queries)", HFILL }},
+
+               { &hf_bootp_option242_avaya_snmpstring,
+                 { "SNMPSTRING",  "bootp.option.vendor.avaya.snmpstring",
+                   FT_STRINGZ, BASE_NONE, NULL, 0x0,
+                   "Option 242: SNMPSTRING (SNMP community string)", HFILL }},
+
+               { &hf_bootp_option242_avaya_vlantest,
+                 { "VLANTEST",  "bootp.option.vendor.avaya.vlantest",
+                   FT_INT32, BASE_DEC, NULL, 0x0,
+                   "Option 242: VLANTEST (Timeout in seconds)", HFILL }},
        };
 
        static uat_field_t bootp_uat_flds[] = {
@@ -7377,10 +8580,21 @@ proto_register_bootp(void)
                &ett_bootp_option125_suboption,
                &ett_bootp_option125_tr111_suboption,
                &ett_bootp_option125_cl_suboption,
+               &ett_bootp_option242_suboption,
                &ett_bootp_fqdn,
                &ett_bootp_filename_option,
                &ett_bootp_server_hostname,
                &ett_bootp_fqdn_flags,
+               &ett_bootp_isns_functions,
+               &ett_bootp_isns_discovery_domain_access,
+               &ett_bootp_isns_administrative_flags,
+               &ett_bootp_isns_server_security_bitmap,
+               &ett_bootp_isns_secondary_server_addr,
+               &ett_bootp_o43_bsdp_boot_image,
+               &ett_bootp_o43_bsdp_attributes,
+               &ett_bootp_o43_bsdp_image_desc_list,
+               &ett_bootp_o43_bsdp_image_desc,
+               &ett_bootp_o43_bsdp_attributes_flags,
        };
 
        static ei_register_info ei[] = {
@@ -7400,12 +8614,36 @@ proto_register_bootp(void)
                { &ei_bootp_option125_enterprise_malformed, { "bootp.option.enterprise.malformed", PI_PROTOCOL, PI_ERROR, "no room left in option for enterprise data", EXPFILL }},
                { &ei_bootp_option_6RD_malformed, { "bootp.option.6RD.malformed", PI_PROTOCOL, PI_ERROR, "6RD: malformed option", EXPFILL }},
                { &ei_bootp_option82_vi_cl_tag_unknown, { "bootp.option.option.vi.cl.tag_unknown", PI_PROTOCOL, PI_ERROR, "Unknown tag", EXPFILL }},
+               { &ei_bootp_option_parse_err, { "bootp.option.parse_err", PI_PROTOCOL, PI_ERROR, "Parse error", EXPFILL }},
                { &ei_bootp_suboption_invalid, { "bootp.suboption_invalid", PI_PROTOCOL, PI_ERROR, "Invalid suboption", EXPFILL }},
                { &ei_bootp_secs_le, { "bootp.secs_le", PI_PROTOCOL, PI_NOTE, "Seconds elapsed appears to be encoded as little-endian", EXPFILL }},
                { &ei_bootp_end_option_missing, { "bootp.end_option_missing", PI_PROTOCOL, PI_ERROR, "End option missing", EXPFILL }},
                { &ei_bootp_client_address_not_given, { "bootp.client_address_not_given", PI_PROTOCOL, PI_NOTE, "Client address not given", EXPFILL }},
                { &ei_bootp_server_name_overloaded_by_dhcp, { "bootp.server_name_overloaded_by_dhcp", PI_PROTOCOL, PI_NOTE, "Server name option overloaded by DHCP", EXPFILL }},
                { &ei_bootp_boot_filename_overloaded_by_dhcp, { "bootp.boot_filename_overloaded_by_dhcp", PI_PROTOCOL, PI_NOTE, "Boot file name option overloaded by DHCP", EXPFILL }},
+               { &ei_bootp_option_isns_ignored_bitfield, { "bootp.option.isns.ignored_bitfield", PI_PROTOCOL, PI_NOTE, "Enabled field is not set - non-zero bitmask ignored", EXPFILL }},
+               { &ei_bootp_option242_avaya_l2qvlan_invalid, { "bootp.option.vendor.avaya.l2qvlan.invalid", PI_PROTOCOL, PI_ERROR, "Option 242 (L2QVLAN) invalid", EXPFILL }},
+               { &ei_bootp_option242_avaya_vlantest_invalid, { "bootp.option.vendor.avaya.vlantest.invalid", PI_PROTOCOL, PI_ERROR, "Option 242 (avaya vlantest) invalid", EXPFILL }}
+       };
+
+       static tap_param bootp_stat_params[] = {
+               { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
+       };
+
+       static stat_tap_table_ui bootp_stat_table = {
+               REGISTER_STAT_GROUP_UNSORTED,
+               "DHCP (BOOTP) Statistics",
+               "bootp",
+               "bootp,stat",
+               bootp_stat_init,
+               bootp_stat_packet,
+               bootp_stat_reset,
+               NULL,
+               NULL,
+               sizeof(bootp_stat_fields)/sizeof(stat_tap_table_item), bootp_stat_fields,
+               sizeof(bootp_stat_params)/sizeof(tap_param), bootp_stat_params,
+               NULL,
+               0
        };
 
        module_t *bootp_module;
@@ -7446,6 +8684,13 @@ proto_register_bootp(void)
                                       10,
                                       &pkt_ccc_option);
 
+       prefs_register_enum_preference(bootp_module, "uuid.endian",
+                                      "Endianness of UUID",
+                                      "Endianness applied to UUID fields",
+                                      &bootp_uuid_endian,
+                                      bootp_uuid_endian_vals,
+                                      FALSE);
+
        prefs_register_obsolete_preference(bootp_module, "displayasstring");
 
        bootp_uat = uat_new("Custom BootP/DHCP Options (Excl. suboptions)",
@@ -7460,6 +8705,7 @@ proto_register_bootp(void)
                        uat_bootp_record_update_cb, /* update callback       */
                        uat_bootp_record_free_cb,   /* free callback         */
                        NULL,                       /* post update callback  */
+                       NULL,                           /* reset callback */
                        bootp_uat_flds);            /* UAT field definitions */
 
        prefs_register_uat_preference(bootp_module,
@@ -7467,13 +8713,14 @@ proto_register_bootp(void)
                                      "Custom BootP/DHCP Options (Excl. suboptions)",
                                      "Custom BootP/DHCP Options (Excl. suboptions)",
                                      bootp_uat);
+
+       register_stat_tap_table_ui(&bootp_stat_table);
 }
 
 void
 proto_reg_handoff_bootp(void)
 {
-       dissector_add_uint("udp.port", UDP_PORT_BOOTPS, bootp_handle);
-       dissector_add_uint("udp.port", UDP_PORT_BOOTPC, bootp_handle);
+       dissector_add_uint_range_with_preference("udp.port", BOOTP_UDP_PORT_RANGE, bootp_handle);
 }
 
 /*