dissectors: more SPDX license convertions.
[metze/wireshark/wip.git] / epan / dissectors / packet-bootp.c
index 133511b8a885abcdf6dc09d59f51caf4b5e74af9..2bc1f50dba5e2d3a34a6fb3460dfd68409229a89 100644 (file)
  * RFC 5223: Discovering Location-to-Service Translation (LoST) Servers Using the Dynamic Host Configuration Protocol (DHCP)
  * RFC 5417: CAPWAP Access Controller DHCP Option
  * RFC 5969: IPv6 Rapid Deployment on IPv4 Infrastructures (6rd)
+ * RFC 6225: Dynamic Host Configuration Protocol Options for Coordinate-Based Location Configuration Information
  * RFC 6607: Virtual Subnet Selection Options for DHCPv4 and DHCPv6
+ * RFC 6704: Forcerenew Nonce Authentication
+ * RFC 6731: Improved Recursive DNS Server Selection for Multi-Interfaced Nodes
+ * RFC 6926: DHCPv4 Bulk Leasequery
+ * RFC 7291: DHCP Options for the Port Control Protocol (PCP)
+ * RFC 7618: Dynamic Allocation of Shared IPv4 Addresses
  * RFC 7710: Captive-Portal Identification Using DHCP or Router Advertisements (RAs)
  * draft-ietf-dhc-fqdn-option-07.txt
  * TFTP Server Address Option for DHCPv4 [draft-raj-dhc-tftp-addr-option-06.txt: http://tools.ietf.org/html/draft-raj-dhc-tftp-addr-option-06]
  * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * SPDX-License-Identifier: GPL-2.0-or-later
  */
 
 /*
 #include <epan/addr_resolv.h>
 #include <epan/expert.h>
 #include <epan/uat.h>
-#include <epan/oui.h>
 #include <epan/strutil.h>
 #include <wsutil/str_util.h>
 #include <wsutil/strtoi.h>
@@ -533,7 +526,27 @@ static int hf_bootp_option125_cl_modem_capabilities = -1;          /* 125:CL 5 */
 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_andsf_server = -1;                          /* 142 */
+static int hf_bootp_option_forcerenew_nonce_algo = -1;                 /* 145 */
+static int hf_bootp_option_rdnss_reserved = -1;                                /* 146 */
+static int hf_bootp_option_rdnss_pref = -1;                            /* 146 */
+static int hf_bootp_option_rdnss_prim_dns_server = -1;                 /* 146 */
+static int hf_bootp_option_rdnss_sec_dns_server = -1;                  /* 146 */
+static int hf_bootp_option_rdnss_domain = -1;                          /* 146 */
 static int hf_bootp_option_tftp_server_address = -1;                   /* 150 */
+static int hf_bootp_option_bulk_lease_status_code = -1;                        /* 151 */
+static int hf_bootp_option_bulk_lease_status_message = -1;             /* 151 */
+static int hf_bootp_option_bulk_lease_base_time = -1;                  /* 152 */
+static int hf_bootp_option_bulk_lease_start_time_of_state = -1;                /* 153 */
+static int hf_bootp_option_bulk_lease_query_start = -1;                        /* 154 */
+static int hf_bootp_option_bulk_lease_query_end = -1;                  /* 155 */
+static int hf_bootp_option_bulk_lease_dhcp_state = -1;                 /* 156 */
+static int hf_bootp_option_bulk_lease_data_source = -1;                        /* 157 */
+static int hf_bootp_option_pcp_list_length = -1;                       /* 158 */
+static int hf_bootp_option_pcp_server = -1;                            /* 158 */
+static int hf_bootp_option_portparams_offset = -1;                     /* 159 */
+static int hf_bootp_option_portparams_psid_length = -1;                        /* 159 */
+static int hf_bootp_option_portparams_psid = -1;                       /* 159 */
 static int hf_bootp_option_captive_portal = -1;                                /* 160 */
 static int hf_bootp_option_mudurl = -1;                                        /* 161 */
 static int hf_bootp_option_pxe_config_file = -1;                       /* 209 */
@@ -602,6 +615,7 @@ 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 gint ett_bootp_option158_pcp_list = -1;
 
 static expert_field ei_bootp_bad_length = EI_INIT;
 static expert_field ei_bootp_bad_bitfield = EI_INIT;
@@ -619,6 +633,7 @@ 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_nonstd_option_data = 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;
@@ -852,6 +867,40 @@ static const value_string duidtype_vals[] =
        { 0, NULL }
 };
 
+static const value_string forcerenew_nonce_algo_vals[] = {
+       { 1, "HMAC-MD5" },
+       { 0, NULL },
+};
+
+static const value_string rdnss_pref_vals[] = {
+       { 0, "Medium" },
+       { 1, "High" },
+       { 2, "Reserved" },
+       { 3, "Low" },
+       { 0, NULL },
+};
+
+static const value_string bulk_lease_dhcp_status_code_vals[] = {
+       { 0, "Success" },
+       { 1, "UpsecFail" },
+       { 2, "QueryTerminated" },
+       { 3, "MalformedQuery" },
+       { 4, "NotAllowed" },
+       { 0, NULL },
+};
+
+static const value_string bulk_lease_dhcp_state_vals[] = {
+       { 1, "Available" },
+       { 2, "Active" },
+       { 3, "Expired" },
+       { 4, "Released" },
+       { 5, "Abandoned" },
+       { 6, "Reset" },
+       { 7, "Remote" },
+       { 8, "Transitioning" },
+       { 0, NULL },
+};
+
 static gboolean novell_string = FALSE;
 
 static guint bootp_uuid_endian = ENC_LITTLE_ENDIAN;
@@ -936,6 +985,11 @@ static const true_false_string tfs_isns_functions_sec_distrib = {
        "By other means",
 };
 
+static const true_false_string tfs_bulk_lease_data_source = {
+       "Remote",
+       "Local"
+};
+
 enum field_type {
        special,
        none,
@@ -1202,7 +1256,7 @@ static const string_string option242_avaya_static_vals[] = {
 #define BOOTP_OPT_NUM  256
 
 /* All of the options that have a "basic" type that can be handled by dissect_bootpopt_basic_type() */
-#define BOOTP_OPTION_BASICTYPE_RANGE "1-20,22-32,34-42,44-51,53-54,56-59,64-76,86-87,91-93,100-101,112-113,116,118,137-138,150,161,209-210,252"
+#define BOOTP_OPTION_BASICTYPE_RANGE "1-20,22-32,34-42,44-51,53-54,56-59,64-76,86-87,91-93,100-101,112-113,116,118,137-138,142,150,153,156-157,161,209-210,252"
 
 /* Re-define structure.         Values to be updated by bootp_init_protocol */
 static struct opt_info bootp_opt[BOOTP_OPT_NUM];
@@ -1350,24 +1404,24 @@ static struct opt_info default_bootp_opt[BOOTP_OPT_NUM] = {
 /* 139 */ { "IPv4 Address-MoS",                                opaque, NULL },
 /* 140 */ { "IPv4 FQDN-MoS",                           opaque, NULL },
 /* 141 */ { "SIP UA Configuration Domains",            opaque, NULL },
-/* 142 */ { "Unassigned",                              opaque, NULL },
-/* 143 */ { "Unassigned",                              opaque, NULL },
-/* 144 */ { "Unassigned",                              opaque, NULL },
-/* 145 */ { "Unassigned",                              opaque, NULL },
-/* 146 */ { "Unassigned",                              opaque, NULL },
+/* 142 */ { "IPv4 Address ANDSF",                      ipv4_list, &hf_bootp_option_andsf_server },
+/* 143 */ { "Zerotouch Redirect [TODO: draft-ietf-netconf-zerotouch]", opaque, NULL },
+/* 144 */ { "Geospatial Location [TODO:RFC6225]",      opaque, NULL },
+/* 145 */ { "Forcerenew Nonce Capable",                        special, NULL },
+/* 146 */ { "RDNSS Selection",                         special, NULL },
 /* 147 */ { "Unassigned",                              opaque, NULL },
 /* 148 */ { "Unassigned",                              opaque, NULL },
 /* 149 */ { "Unassigned",                              opaque, NULL },
 /* 150 */ { "TFTP Server Address",                     ipv4_list, &hf_bootp_option_tftp_server_address },
-/* 151 */ { "Unassigned",                              opaque, NULL },
-/* 152 */ { "Unassigned",                              opaque, NULL },
-/* 153 */ { "Unassigned",                              opaque, NULL },
-/* 154 */ { "Unassigned",                              opaque, NULL },
-/* 155 */ { "Unassigned",                              opaque, NULL },
-/* 156 */ { "Unassigned",                              opaque, NULL },
-/* 157 */ { "Unassigned",                              opaque, NULL },
-/* 158 */ { "Unassigned",                              opaque, NULL },
-/* 159 */ { "Unassigned",                              opaque, NULL },
+/* 151 */ { "Leasequery Status code",                  special, NULL },
+/* 152 */ { "Leasequery Base Time",                    special, NULL },
+/* 153 */ { "Leasequery Start Time of State",          time_in_u_secs, &hf_bootp_option_bulk_lease_start_time_of_state },
+/* 154 */ { "Leasequery Query Start Time",             special, NULL },
+/* 155 */ { "Leasequery Query End Time",               special, NULL },
+/* 156 */ { "Leasequery Dhcp State",                   val_u_byte, &hf_bootp_option_bulk_lease_dhcp_state },
+/* 157 */ { "Leasequery Data Source",                  val_boolean, &hf_bootp_option_bulk_lease_data_source },
+/* 158 */ { "PCP Server",                              special, NULL },
+/* 159 */ { "Portparams",                              special, NULL },
 /* 160 */ { "DHCP Captive-Portal",                     special, NULL },
 /* 161 */ { "Manufacturer Usage Description",          string, &hf_bootp_option_mudurl},
 /* 162 */ { "Unassigned",                              opaque, NULL },
@@ -1487,11 +1541,7 @@ static void* uat_bootp_record_copy_cb(void* n, const void* o, size_t siz _U_) {
        uat_bootp_record_t* new_record = (uat_bootp_record_t *)n;
        const uat_bootp_record_t* old_record = (const uat_bootp_record_t *)o;
 
-       if (old_record->text) {
-               new_record->text = g_strdup(old_record->text);
-       } else {
-               new_record->text = NULL;
-       }
+       new_record->text = g_strdup(old_record->text);
 
        return new_record;
 }
@@ -1509,7 +1559,7 @@ static gboolean uat_bootp_record_update_cb(void* r, char** err) {
 static void uat_bootp_record_free_cb(void*r) {
        uat_bootp_record_t* rec = (uat_bootp_record_t *)r;
 
-       if (rec->text) g_free(rec->text);
+       g_free(rec->text);
 }
 
 UAT_DEC_CB_DEF(uat_bootp_records, opt, uat_bootp_record_t)
@@ -2195,6 +2245,13 @@ dissect_bootpopt_user_class_information(tvbuff_t *tvb, packet_info *pinfo, proto
                return 1;
        }
 
+       if (!tvb_strneql(tvb, offset, "iPXE", 4)) {
+               /* The iPXE is known to violate RFC 3004, http://forum.ipxe.org/showthread.php?tid=7530 */
+               proto_item *expert_ti = proto_tree_add_item(tree, hf_bootp_option77_user_class_data, tvb, offset, -1, ENC_NA);
+               expert_add_info(pinfo, expert_ti, &ei_bootp_nonstd_option_data);
+               return tvb_captured_length(tvb);
+       }
+
        while (tvb_reported_length_remaining(tvb, offset) > 0) {
                /* Create subtree for instance of User Class. */
                vtix = proto_tree_add_uint_format_value(tree, hf_bootp_option77_user_class,
@@ -2856,6 +2913,44 @@ dissect_bootpopt_vi_vendor_class(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
        return tvb_captured_length(tvb);
 }
 
+static int
+dissect_bootpopt_forcerenew_nonce(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       int offset = 0;
+       while ( tvb_reported_length_remaining(tvb, offset) > 0) {
+               proto_tree_add_item(tree, hf_bootp_option_forcerenew_nonce_algo, tvb, offset, 1, ENC_BIG_ENDIAN);
+               offset += 1;
+               }
+
+       return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bootpopt_rdnss(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       int offset = 0;
+       const guchar *dns_name;
+       guint dns_name_len;
+
+       if (tvb_reported_length(tvb) < 10) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must be >= 10");
+               return 1;
+       }
+       proto_tree_add_item(tree, hf_bootp_option_rdnss_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_bootp_option_rdnss_pref, tvb, offset, 1, ENC_BIG_ENDIAN);
+       offset += 1;
+       proto_tree_add_item(tree, hf_bootp_option_rdnss_prim_dns_server, tvb, offset, 4, ENC_BIG_ENDIAN);
+       offset += 4;
+       proto_tree_add_item(tree, hf_bootp_option_rdnss_sec_dns_server, tvb, offset, 4, ENC_BIG_ENDIAN);
+       offset += 4;
+
+       get_dns_name(tvb, offset, tvb_reported_length_remaining(tvb,offset), offset, &dns_name, &dns_name_len);
+       proto_tree_add_string(tree, hf_bootp_option_rdnss_domain, tvb, offset,
+                       tvb_reported_length_remaining(tvb,offset), format_text(wmem_packet_scope(), dns_name, dns_name_len));
+
+       return tvb_captured_length(tvb);
+}
+
 static int
 dissect_bootpopt_dhcp_captive_portal(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
 {
@@ -2866,6 +2961,102 @@ dissect_bootpopt_dhcp_captive_portal(tvbuff_t *tvb, packet_info *pinfo _U_, prot
        return tvb_captured_length(tvb);
 }
 
+static int
+dissect_bootpopt_bulk_lease_query_start(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       if (tvb_reported_length(tvb) != 4) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must be 4");
+               return 1;
+       }
+       proto_tree_add_item(tree, hf_bootp_option_bulk_lease_query_start, tvb, 0, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
+
+       return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bootpopt_bulk_lease_query_end(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       if (tvb_reported_length(tvb) != 4) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must be 4");
+               return 1;
+       }
+       proto_tree_add_item(tree, hf_bootp_option_bulk_lease_query_end, tvb, 0, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
+
+       return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bootpopt_bulk_lease_base_time(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       if (tvb_reported_length(tvb) != 4) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must be 4");
+               return 1;
+       }
+       proto_tree_add_item(tree, hf_bootp_option_bulk_lease_base_time, tvb, 0, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
+
+       return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bootpopt_bulk_lease_status_code(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       if (tvb_reported_length(tvb) < 1) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must >= 1");
+               return 1;
+       }
+       proto_tree_add_item(tree, hf_bootp_option_bulk_lease_status_code, tvb, 0, 1, ENC_BIG_ENDIAN);
+       if ( tvb_reported_length_remaining(tvb, 1) > 0) {
+               proto_tree_add_item(tree, hf_bootp_option_bulk_lease_status_message, tvb, 1, tvb_reported_length_remaining(tvb, 1), ENC_UTF_8|ENC_NA);
+               }
+
+       return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bootpopt_pcp_server(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       proto_tree *tree_pcp;
+       int offset = 0;
+       guint8 list_length;
+       guint8 ip_list_length;
+       proto_item *ti_pcp;
+
+       if (tvb_reported_length(tvb) < 5) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must >= 5");
+               return 1;
+       }
+       while (tvb_reported_length_remaining(tvb, offset) >= 5) {
+               ip_list_length = 0;
+               list_length = tvb_get_guint8(tvb, offset);
+               tree_pcp = proto_tree_add_subtree(tree, tvb, offset, list_length, ett_bootp_option158_pcp_list,
+                                               &ti_pcp, "PCP server list");
+               proto_tree_add_item(tree_pcp, hf_bootp_option_pcp_list_length, tvb, offset, 1, ENC_NA);
+               offset += 1;
+               ip_list_length += 1;
+               while (((list_length - 1)%4 == 0) && (ip_list_length < list_length) && tvb_reported_length_remaining(tvb,offset) >= 4) {
+                       proto_tree_add_item(tree_pcp, hf_bootp_option_pcp_server, tvb, offset, 4, ENC_NA);
+                       offset += 4;
+                       ip_list_length += 4;
+               }
+       }
+
+       return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bootpopt_portparams(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+       if (tvb_reported_length(tvb) != 4) {
+               expert_add_info_format(pinfo, tree, &ei_bootp_bad_length, "length must be 4");
+               return 1;
+       }
+       proto_tree_add_item(tree, hf_bootp_option_portparams_offset, tvb, 0, 1, ENC_NA);
+       proto_tree_add_item(tree, hf_bootp_option_portparams_psid_length, tvb, 1, 1, ENC_NA);
+       proto_tree_add_item(tree, hf_bootp_option_portparams_psid, tvb, 2, 2, ENC_NA);
+
+       return tvb_captured_length(tvb);
+}
+
 static int
 dissect_bootpopt_6RD_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
 {
@@ -6350,14 +6541,14 @@ typedef enum
 
 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)
+static void bootp_stat_init(stat_tap_table_ui* new_stat, 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);
+       stat_tap_table* table = 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);
+       stat_tap_add_table(new_stat, table);
 
        /* Add a row for each value type */
        while (opt53_text[i].strptr)
@@ -6367,7 +6558,7 @@ static void bootp_stat_init(stat_tap_table_ui* new_stat, new_stat_tap_gui_init_c
                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);
+               stat_tap_init_table_row(table, i, num_fields, items);
                i++;
        }
 }
@@ -6375,7 +6566,7 @@ static void bootp_stat_init(stat_tap_table_ui* new_stat, new_stat_tap_gui_init_c
 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;
+       stat_data_t* stat_data = (stat_data_t*)tapdata;
        const char* value = (const char*)data;
        stat_tap_table* table;
        stat_tap_table_item_type* msg_data;
@@ -6387,9 +6578,9 @@ bootp_stat_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U_
                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 = 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);
+       stat_tap_set_field_data(table, idx, PACKET_COLUMN, msg_data);
 
        return TRUE;
 }
@@ -6402,9 +6593,9 @@ bootp_stat_reset(stat_tap_table* table)
 
        for (element = 0; element < table->num_elements; element++)
        {
-               item_data = new_stat_tap_get_field_data(table, element, PACKET_COLUMN);
+               item_data = 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);
+               stat_tap_set_field_data(table, element, PACKET_COLUMN, item_data);
        }
 }
 
@@ -8524,7 +8715,7 @@ proto_register_bootp(void)
 
                { &hf_bootp_option125_tr111_device_manufacturer_oui,
                  { "DeviceManufacturerOUI", "bootp.option.vi.tr111.device_manufacturer_oui",
-                   FT_UINT24, BASE_HEX, VALS(oui_vals), 0x0,
+                   FT_UINT24, BASE_OUI, NULL, 0x0,
                    "Option 125:TR 111 1 DeviceManufacturerOUI", HFILL }},
 
                { &hf_bootp_option125_tr111_device_serial_number,
@@ -8597,11 +8788,111 @@ proto_register_bootp(void)
                    FT_IPv4, BASE_NONE, NULL, 0x00,
                    "Option 138: CAPWAP Access Controllers", HFILL }},
 
+               { &hf_bootp_option_andsf_server,
+                 { "ANDSF Server", "bootp.option.andsf_server",
+                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   "ANDSF (Access Network Discovery and Selection Function) Server", HFILL }},
+
+               { &hf_bootp_option_forcerenew_nonce_algo,
+                 { "Algorithm", "bootp.option.forcerenew_nonce.algorithm",
+                   FT_UINT8, BASE_DEC, VALS(forcerenew_nonce_algo_vals), 0x00,
+                   "Forcenew Nonce Algorithm", HFILL }},
+
+               { &hf_bootp_option_rdnss_reserved,
+                 { "Reserved", "bootp.option.rdnss.reserved",
+                   FT_UINT8, BASE_HEX, NULL, 0xfc,
+                   "RDNSS Reserved", HFILL }},
+
+               { &hf_bootp_option_rdnss_pref,
+                 { "Preference", "bootp.option.rdnss.preference",
+                   FT_UINT8, BASE_DEC, VALS(rdnss_pref_vals), 0x03,
+                   "RDNSS (Recursive DNS Server) Preference", HFILL }},
+
+               { &hf_bootp_option_rdnss_prim_dns_server,
+                 { "Primary DNS", "bootp.option.rdnss.primary_dns",
+                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   "RDNSS Primary DNS-recursive-name-server's IPv4 address", HFILL }},
+
+               { &hf_bootp_option_rdnss_sec_dns_server,
+                 { "Secondary DNS", "bootp.option.rdnss.secondary_dns",
+                   FT_IPv4, BASE_NONE, NULL, 0x00,
+                   "RDNSS Secondary DNS-recursive-name-server's IPv4 address", HFILL }},
+
+               { &hf_bootp_option_rdnss_domain,
+                 { "Domains and networks", "bootp.option.rdnss.domain",
+                   FT_STRING, BASE_NONE, NULL, 0x00,
+                   "RDNSS Domains and networks", HFILL }},
+
                { &hf_bootp_option_tftp_server_address,
                  { "TFTP Server Address", "bootp.option.tftp_server_address",
                    FT_IPv4, BASE_NONE, NULL, 0x00,
                    "Option 150: TFTP Server Address", HFILL }},
 
+               { &hf_bootp_option_bulk_lease_status_code,
+                 { "Status Code", "bootp.option.bulk_lease.status_code",
+                   FT_UINT8, BASE_DEC, VALS(bulk_lease_dhcp_status_code_vals), 0x00,
+                   "DHCPv4 Bulk Leasequery Status Code", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_status_message,
+                 { "Status Code Message", "bootp.option.bulk_lease.status_code_message",
+                   FT_STRING, BASE_NONE, NULL, 0x00,
+                   "DHCPv4 Bulk Leasequery Status Code Message", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_base_time,
+                 { "Base Time", "bootp.option.bulk_lease.base_time",
+                   FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x00,
+                   "DHCPv4 Bulk Leasequery Base Time", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_start_time_of_state,
+                 { "Start Time Of State", "bootp.option.bulk_lease.start_time_of_state",
+                   FT_UINT32, BASE_DEC, NULL, 0x00,
+                   "DHCPv4 Bulk Leasequery Start Time Of State", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_query_start,
+                 { "Query Start Time", "bootp.option.bulk_lease.query_start_time",
+                   FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x00,
+                   "DHCPv4 Bulk Leasequery Query Start Time", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_query_end,
+                 { "Query End Time", "bootp.option.bulk_lease.query_end_time",
+                   FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x00,
+                   "DHCPv4 Bulk Leasequery Query End Time", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_dhcp_state,
+                 { "Dhcp State", "bootp.option.bulk_lease.dhcp_state",
+                   FT_UINT8, BASE_DEC, VALS(bulk_lease_dhcp_state_vals), 0x00,
+                   "DHCPv4 Bulk Leasequery Dhcp State", HFILL }},
+
+               { &hf_bootp_option_bulk_lease_data_source,
+                 { "Data Source", "bootp.option.bulk_lease.data_source",
+                   FT_BOOLEAN, BASE_NONE, TFS(&tfs_bulk_lease_data_source), 0x00,
+                   "DHCPv4 Bulk Leasequery Data Source", HFILL }},
+
+               { &hf_bootp_option_pcp_list_length,
+                 { "List-Length", "bootp.option.pcp.list_length",
+                   FT_UINT8, BASE_DEC, NULL, 0x0,
+                   "Port Control Protocol (PCP) List Length", HFILL }},
+
+               { &hf_bootp_option_pcp_server,
+                 { "PCP Server", "bootp.option.pcp.server",
+                   FT_IPv4, BASE_NONE, NULL, 0x0,
+                   "Port Control Protocol (PCP) Server", HFILL }},
+
+               { &hf_bootp_option_portparams_offset,
+                 { "Offset", "bootp.option.portparams.offset",
+                   FT_UINT8, BASE_DEC, NULL, 0x0,
+                   "Port Set ID (PSID) offset", HFILL }},
+
+               { &hf_bootp_option_portparams_psid_length,
+                 { "PSID-Length", "bootp.option.portparams.psid_length",
+                   FT_UINT8, BASE_DEC, NULL, 0x0,
+                   "Port Set ID (PSID) Length", HFILL }},
+
+               { &hf_bootp_option_portparams_psid,
+                 { "PSID", "bootp.option.portparams.psid",
+                   FT_BYTES, BASE_NONE, NULL, 0x0,
+                   "Port Set ID (PSID)", HFILL }},
+
                { &hf_bootp_option_mudurl,
                  { "MUDURL", "bootp.option.mudurl",
                    FT_STRING, BASE_NONE, NULL, 0x0,
@@ -8847,6 +9138,7 @@ proto_register_bootp(void)
                &ett_bootp_o43_bsdp_image_desc_list,
                &ett_bootp_o43_bsdp_image_desc,
                &ett_bootp_o43_bsdp_attributes_flags,
+               &ett_bootp_option158_pcp_list,
        };
 
        static ei_register_info ei[] = {
@@ -8866,6 +9158,7 @@ proto_register_bootp(void)
                { &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_nonstd_option_data, { "bootp.option.nonstd_data", PI_PROTOCOL, PI_NOTE, "Non standard compliant option data", 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 }},
@@ -9015,6 +9308,14 @@ proto_reg_handoff_bootp(void)
        dissector_add_uint("bootp.option", 123, create_dissector_handle( dissect_bootpopt_coordinate_based_location, -1 ));
        dissector_add_uint("bootp.option", 124, create_dissector_handle( dissect_bootpopt_vi_vendor_class, -1 ));
        dissector_add_uint("bootp.option", 125, create_dissector_handle( dissect_bootpopt_vi_vendor_specific_info, -1 ));
+       dissector_add_uint("bootp.option", 145, create_dissector_handle( dissect_bootpopt_forcerenew_nonce, -1 ));
+       dissector_add_uint("bootp.option", 146, create_dissector_handle( dissect_bootpopt_rdnss, -1 ));
+       dissector_add_uint("bootp.option", 151, create_dissector_handle( dissect_bootpopt_bulk_lease_status_code, -1 ));
+       dissector_add_uint("bootp.option", 152, create_dissector_handle( dissect_bootpopt_bulk_lease_base_time, -1 ));
+       dissector_add_uint("bootp.option", 154, create_dissector_handle( dissect_bootpopt_bulk_lease_query_start, -1 ));
+       dissector_add_uint("bootp.option", 155, create_dissector_handle( dissect_bootpopt_bulk_lease_query_end, -1 ));
+       dissector_add_uint("bootp.option", 158, create_dissector_handle( dissect_bootpopt_pcp_server, -1 ));
+       dissector_add_uint("bootp.option", 159, create_dissector_handle( dissect_bootpopt_portparams, -1 ));
        dissector_add_uint("bootp.option", 160, create_dissector_handle( dissect_bootpopt_dhcp_captive_portal, -1 ));
        dissector_add_uint("bootp.option", 212, create_dissector_handle( dissect_bootpopt_6RD_option, -1 ));
        dissector_add_uint("bootp.option", 242, create_dissector_handle( dissect_bootpopt_avaya_ip_telephone, -1 ));