Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-dhcp.c
blob80f49098f3d3cfffde903566bd34b78955bd5ff6
1 /* packet-dhcp.c
2 * Routines for DHCP/BOOTP packet disassembly
4 * Copyright 1998, Gilbert Ramirez <gram@alumni.rice.edu>
5 * Copyright 2004, Thomas Anders <thomas.anders [AT] blue-cable.de>
7 * Added option field filters
8 * Copyright 2011, Michael Mann
10 * Added option 77 : RFC 3004 - The User Class Option for DHCP
11 * Added option 117 : RFC 2937 - The Name Service Search Option for DHCP
12 * Added option 119 : RFC 3397 - Dynamic Host Configuration Protocol (DHCP) Domain Search Option
13 * RFC 3396 - Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)
14 * Improved opt 120 : Add support of RFC 3396 - Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)
15 * Add support compression according to the encoding in Section 4.1.4 of RFC 1035 - DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION
18 * Copyright 2012, Jerome LAFORGE <jerome.laforge [AT] gmail.com>
20 * The information used comes from:
21 * RFC 951: Bootstrap Protocol
22 * RFC 1035: Domain Names - Implementation And Specification
23 * RFC 1497: BOOTP extensions
24 * RFC 1542: Clarifications and Extensions for the Bootstrap Protocol
25 * RFC 2131: Dynamic Host Configuration Protocol
26 * RFC 2132: DHCP Options and BOOTP Vendor Extensions
27 * RFC 2241: DHCP Options for Novell Directory Services
28 * RFC 2242: NetWare/IP Domain Name and Information
29 * RFC 2489: Procedure for Defining New DHCP Options
30 * RFC 2610: DHCP Options for Service Location Protocol
31 * RFC 2685: Virtual Private Networks Identifier
32 * RFC 2937: The Name Service Search Option for DHCP
33 * RFC 3004: The User Class Option for DHCP
34 * RFC 3046: DHCP Relay Agent Information Option
35 * RFC 3118: Authentication for DHCP Messages
36 * RFC 3203: DHCP reconfigure extension
37 * RFC 3315: Dynamic Host Configuration Protocol for IPv6 (DHCPv6)
38 * RFC 3396: Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)
39 * RFC 3397: Dynamic Host Configuration Protocol (DHCP) Domain Search Option
40 * RFC 3495: DHCP Option (122) for CableLabs Client Configuration
41 * RFC 3594: PacketCable Security Ticket Control Sub-Option (122.9)
42 * RFC 3442: Classless Static Route Option for DHCP version 4
43 * RFC 3825: Dynamic Host Configuration Protocol Option for Coordinate-based Location Configuration Information
44 * RFC 3925: Vendor-Identifying Vendor Options for Dynamic Host Configuration Protocol version 4 (DHCPv4)
45 * RFC 3942: Reclassifying DHCPv4 Options
46 * RFC 4174: The IPv4 Dynamic Host Configuration Protocol (DHCP) Option for the Internet Storage Name Service
47 * RFC 4243: Vendor-Specific Information Suboption for the Dynamic Host Configuration Protocol (DHCP) Relay Agent Option
48 * RFC 4361: Node-specific Client Identifiers for Dynamic Host Configuration Protocol Version Four (DHCPv4)
49 * RFC 4388: Dynamic Host Configuration Protocol (DHCP) Leasequery
50 * RFC 4578: Dynamic Host Configuration Protocol (DHCP) Options for PXE
51 * RFC 4776: Dynamic Host Configuration Protocol (DHCPv4 and DHCPv6) Option for Civic Addresses Configuration Information
52 * RFC 5192: DHCP Options for Protocol for Carrying Authentication for Network Access (PANA) Authentication Agent
53 * RFC 5223: Discovering Location-to-Service Translation (LoST) Servers Using the Dynamic Host Configuration Protocol (DHCP)
54 * RFC 5417: CAPWAP Access Controller DHCP Option
55 * RFC 5969: IPv6 Rapid Deployment on IPv4 Infrastructures (6rd)
56 * RFC 6225: Dynamic Host Configuration Protocol Options for Coordinate-Based Location Configuration Information
57 * RFC 6607: Virtual Subnet Selection Options for DHCPv4 and DHCPv6
58 * RFC 6704: Forcerenew Nonce Authentication
59 * RFC 6731: Improved Recursive DNS Server Selection for Multi-Interfaced Nodes
60 * RFC 6926: DHCPv4 Bulk Leasequery
61 * RFC 7291: DHCP Options for the Port Control Protocol (PCP)
62 * RFC 7618: Dynamic Allocation of Shared IPv4 Addresses
63 * RFC 7710: Captive-Portal Identification Using DHCP or Router Advertisements (RAs)
64 * RFC 7724: Active DHCPv4 Lease Query
65 * RFC 7839: Access-Network-Identifier Option in DHCP
66 * RFC 8357: Generalized UDP Source Port for DHCP Relay
67 * RFC 8910: Captive-Portal Identification in DHCP and Router Advertisements (RAs)
68 * RFC 8925: IPv6-Only Preferred Option for DHCPv4
69 * RFC 8973: DDoS Open Threat Signaling (DOTS) Agent Discovery
70 * draft-ietf-dhc-fqdn-option-07.txt
71 * TFTP Server Address Option for DHCPv4 [draft-raj-dhc-tftp-addr-option-06.txt: https://tools.ietf.org/html/draft-raj-dhc-tftp-addr-option-06]
72 * BOOTP and DHCP Parameters
73 * https://www.iana.org/assignments/bootp-dhcp-parameters
74 * DOCSIS(TM) 2.0 Radio Frequency Interface Specification
75 * https://specification-search.cablelabs.com/radio-frequency-interface-specification-2
76 * DOCSIS(TM) 3.0 MAC and Upper Layer Protocols Interface Specification
77 * https://specification-search.cablelabs.com/CM-SP-MULPIv3.0
78 * PacketCable(TM) 1.0 MTA Device Provisioning Specification
79 * https://specification-search.cablelabs.com/packetcable-mta-device-provisioning-specification
80 * PacketCable(TM) 1.5 MTA Device Provisioning Specification
81 * https://specification-search.cablelabs.com/packetcable-1-5-mta-device-provisioning-specification
82 * PacketCable(TM) 2.0 E-UE Device Provisioning Data Model Specification
83 * https://specification-search.cablelabs.com/e-ue-provisioning-data-model-specification
84 * Business Services over DOCSIS(R) Layer 2 Virtual Private Networks
85 * https://specification-search.cablelabs.com/business-services-over-docsis-layer-2-virtual-private-networks
86 * CableHome(TM) 1.1 Specification
87 * https://web.archive.org/web/20060628173459/http://www.cablelabs.com/projects/cablehome/downloads/specs/CH-SP-CH1.1-I11-060407.pdf
88 * Broadband Forum TR-111
89 * https://web.archive.org/web/20150307135117/http://www.broadband-forum.org/technical/download/TR-111.pdf
90 * Boot Server Discovery Protocol (BSDP)
91 * https://opensource.apple.com/source/bootp/bootp-198.1/Documentation/BSDP.doc
92 * [MS-DHCPE] DHCPv4 Option Code 77 (0x4D) - User Class Option
93 * https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dhcpe/fe8a2dd4-1e8c-4546-bacd-4ae10de02058
95 * * Copyright 2023, Colin McInnes <colin.mcinnes [AT] vecima.com>
96 * Added additional CableLabs Vendor Class IDs (Option 60) to CableLabs heuristic from:
97 * Remote PHY Specification
98 * https://www.cablelabs.com/specifications/CM-SP-R-PHY
99 * Flexible MAC Architecture System Specification
100 * https://www.cablelabs.com/specifications/CM-SP-FMA-SYS
101 * Data-Over-Cable Service Interface Specifications, eDOCSIS Specification
102 * https://www.cablelabs.com/specifications/CM-SP-eDOCSIS
103 * Data-Over-Cable Service Interface Specifications, IPv4 and IPv6 eRouter Specification
104 * https://www.cablelabs.com/specifications/CM-SP-eRouter
105 * OpenCable Tuning Resolver Interface Specification
106 * https://www.cablelabs.com/specifications/OC-SP-TRIF
107 * DPoE Demarcation Device Specification
108 * https://www.cablelabs.com/specifications/DPoE-SP-DEMARCv1.0
110 * Wireshark - Network traffic analyzer
111 * By Gerald Combs <gerald@wireshark.org>
112 * Copyright 1998 Gerald Combs
114 * SPDX-License-Identifier: GPL-2.0-or-later
118 * Some of the development of the DHCP/BOOTP protocol decoder was sponsored by
119 * Cable Television Laboratories, Inc. ("CableLabs") based upon proprietary
120 * CableLabs' specifications. Your license and use of this protocol decoder
121 * does not mean that you are licensed to use the CableLabs'
122 * specifications. If you have questions about this protocol, contact
123 * jf.mule [AT] cablelabs.com or c.stuart [AT] cablelabs.com for additional
124 * information.
128 #include "config.h"
130 #include <stdio.h> /* for sscanf() */
132 #include <epan/packet.h>
133 #include "packet-arp.h"
134 #include "packet-dns.h" /* for get_dns_name() */
135 #include <epan/addr_resolv.h>
136 #include <epan/prefs.h>
137 #include <epan/tap.h>
138 #include <epan/stat_tap_ui.h>
139 #include <epan/arptypes.h>
140 #include <epan/expert.h>
141 #include <epan/uat.h>
142 #include <epan/sminmpec.h>
143 #include <epan/tfs.h>
144 #include <wsutil/str_util.h>
145 #include <wsutil/strtoi.h>
146 #include <wsutil/array.h>
148 void proto_register_dhcp(void);
149 void proto_reg_handoff_dhcp(void);
151 static int dhcp_bootp_tap;
152 static int proto_dhcp;
153 static int hf_dhcp_type;
154 static int hf_dhcp_hw_type;
155 static int hf_dhcp_hw_len;
156 static int hf_dhcp_hops;
157 static int hf_dhcp_id;
158 static int hf_dhcp_secs;
159 static int hf_dhcp_flags;
160 static int hf_dhcp_flags_broadcast;
161 static int hf_dhcp_flags_reserved;
162 static int hf_dhcp_ip_client;
163 static int hf_dhcp_ip_your;
164 static int hf_dhcp_ip_server;
165 static int hf_dhcp_ip_relay;
166 static int hf_dhcp_hw_addr;
167 static int hf_dhcp_hw_addr_padding;
168 static int hf_dhcp_hw_ether_addr;
169 static int hf_dhcp_server;
170 static int hf_dhcp_file;
171 static int hf_dhcp_cookie;
172 static int hf_dhcp_vendor_specific_options;
173 static int hf_dhcp_bootp;
174 static int hf_dhcp_fqdn_flags;
175 static int hf_dhcp_fqdn_s;
176 static int hf_dhcp_fqdn_o;
177 static int hf_dhcp_fqdn_e;
178 static int hf_dhcp_fqdn_n;
179 static int hf_dhcp_fqdn_mbz;
180 static int hf_dhcp_fqdn_rcode1;
181 static int hf_dhcp_fqdn_rcode2;
182 static int hf_dhcp_fqdn_name;
183 static int hf_dhcp_fqdn_asciiname;
184 static int hf_dhcp_pkt_mta_cap_len;
185 static int hf_dhcp_pkt_mta_cap_type;
186 static int hf_dhcp_docsis_cm_cap_type;
187 static int hf_dhcp_docsis_cm_cap_len;
188 static int hf_dhcp_client_identifier_uuid;
189 static int hf_dhcp_client_id_iaid;
190 static int hf_dhcp_client_id_duid_type;
191 static int hf_dhcp_client_hardware_address;
192 static int hf_dhcp_client_identifier_duid_llt_hw_type;
193 static int hf_dhcp_client_identifier_duid_ll_hw_type;
194 static int hf_dhcp_client_identifier_time;
195 static int hf_dhcp_client_identifier_link_layer_address;
196 static int hf_dhcp_client_identifier_link_layer_address_ether;
197 static int hf_dhcp_client_identifier_enterprise_num;
198 static int hf_dhcp_client_identifier;
199 static int hf_dhcp_client_identifier_type;
200 static int hf_dhcp_client_identifier_undef;
201 static int hf_dhcp_option_type;
202 static int hf_dhcp_option_length;
203 static int hf_dhcp_option_value;
204 static int hf_dhcp_option_value_8;
205 static int hf_dhcp_option_value_16;
206 static int hf_dhcp_option_value_u32;
207 static int hf_dhcp_option_value_s_secs;
208 static int hf_dhcp_option_value_u_secs;
209 static int hf_dhcp_option_value_stringz;
210 static int hf_dhcp_option_value_ip_address;
211 static int hf_dhcp_option_value_boolean;
212 static int hf_dhcp_option_rfc_3396_detected;
213 static int hf_dhcp_suboption_length;
215 static int hf_dhcp_option_padding; /* 0 */
216 static int hf_dhcp_option_subnet_mask; /* 1 */
217 static int hf_dhcp_option_time_offset; /* 2 */
218 static int hf_dhcp_option_router; /* 3 */
219 static int hf_dhcp_option_time_server; /* 4 */
220 static int hf_dhcp_option_name_server; /* 5 */
221 static int hf_dhcp_option_domain_name_server; /* 6 */
222 static int hf_dhcp_option_log_server; /* 7 */
223 static int hf_dhcp_option_quotes_server; /* 8 */
224 static int hf_dhcp_option_lpr_server; /* 9 */
225 static int hf_dhcp_option_impress_server; /* 10 */
226 static int hf_dhcp_option_resource_location_server; /* 11 */
227 static int hf_dhcp_option_hostname; /* 12 */
228 static int hf_dhcp_option_boot_file_size; /* 13 */
229 static int hf_dhcp_option_merit_dump_file; /* 14 */
230 static int hf_dhcp_option_domain_name; /* 15 */
231 static int hf_dhcp_option_swap_server; /* 16 */
232 static int hf_dhcp_option_root_path; /* 17 */
233 static int hf_dhcp_option_extension_path; /* 18 */
234 static int hf_dhcp_option_ip_forwarding; /* 19 */
235 static int hf_dhcp_option_non_local_source_routing; /* 20 */
236 static int hf_dhcp_option_policy_filter_ip; /* 21 - IP address */
237 static int hf_dhcp_option_policy_filter_subnet_mask; /* 21 - Subnet mask */
238 static int hf_dhcp_option_max_datagram_reassembly_size; /* 22 */
239 static int hf_dhcp_option_default_ip_ttl; /* 23 */
240 static int hf_dhcp_option_path_mtu_aging_timeout; /* 24 */
241 static int hf_dhcp_option_path_mtu_plateau_table_item; /* 25 */
242 static int hf_dhcp_option_interface_mtu; /* 26 */
243 static int hf_dhcp_option_all_subnets_are_local; /* 27 */
244 static int hf_dhcp_option_broadcast_address; /* 28 */
245 static int hf_dhcp_option_perform_mask_discovery; /* 29 */
246 static int hf_dhcp_option_mask_supplier; /* 30 */
247 static int hf_dhcp_option_perform_router_discover; /* 31 */
248 static int hf_dhcp_option_router_solicitation_address; /* 32 */
249 static int hf_dhcp_option_static_route_ip; /* 33 - Destination IP */
250 static int hf_dhcp_option_static_route_router; /* 33 - Router */
251 static int hf_dhcp_option_trailer_encapsulation; /* 34 */
252 static int hf_dhcp_option_arp_cache_timeout; /* 35 */
253 static int hf_dhcp_option_ethernet_encapsulation; /* 36 */
254 static int hf_dhcp_option_tcp_default_ttl; /* 37 */
255 static int hf_dhcp_option_tcp_keepalive_interval; /* 38 */
256 static int hf_dhcp_option_tcp_keepalive_garbage; /* 39 */
257 static int hf_dhcp_option_nis_domain; /* 40 */
258 static int hf_dhcp_option_nis_server; /* 41 */
259 static int hf_dhcp_option_ntp_server; /* 42 */
261 static int hf_dhcp_option43_suboption; /* 43 unknown vendor suboption */
262 static int hf_dhcp_option43_value; /* 43 suboption value */
263 static int hf_dhcp_option43_value_8; /* 43 suboption value */
264 static int hf_dhcp_option43_value_32; /* 43 suboption value */
265 static int hf_dhcp_option43_value_stringz; /* 43 suboption value */
266 static int hf_dhcp_option43_value_ip_address; /* 43 suboption value */
268 static int hf_dhcp_option43_pxeclient_suboption; /* 43 suboption */
269 static int hf_dhcp_option43_pxeclient_padding; /* 43:0 PXE */
270 static int hf_dhcp_option43_pxeclient_mtftp_ip; /* 43:1 PXE */
271 static int hf_dhcp_option43_pxeclient_mtftp_client_port; /* 43:2 PXE */
272 static int hf_dhcp_option43_pxeclient_mtftp_server_port; /* 43:3 PXE */
273 static int hf_dhcp_option43_pxeclient_mtftp_timeout; /* 43:4 PXE */
274 static int hf_dhcp_option43_pxeclient_mtftp_delay; /* 43:5 PXE */
275 static int hf_dhcp_option43_pxeclient_discovery_control; /* 43:6 PXE */
276 static int hf_dhcp_option43_pxeclient_discovery_control_bc; /* 43:6 PXE */
277 static int hf_dhcp_option43_pxeclient_discovery_control_mc; /* 43:6 PXE */
278 static int hf_dhcp_option43_pxeclient_discovery_control_serverlist; /* 43:6 PXE */
279 static int hf_dhcp_option43_pxeclient_discovery_control_bstrap; /* 43:6 PXE */
280 static int hf_dhcp_option43_pxeclient_multicast_address; /* 43:7 PXE */
281 static int hf_dhcp_option43_pxeclient_boot_servers; /* 43:8 PXE */
282 static int hf_dhcp_option43_pxeclient_boot_server_type; /* 43:8 PXE */
283 static int hf_dhcp_option43_pxeclient_boot_server_count; /* 43:8 PXE */
284 static int hf_dhcp_option43_pxeclient_boot_server_ip; /* 43:8 PXE */
285 static int hf_dhcp_option43_pxeclient_boot_menu; /* 43:9 PXE */
286 static int hf_dhcp_option43_pxeclient_boot_menu_type; /* 43:9 PXE */
287 static int hf_dhcp_option43_pxeclient_boot_menu_length; /* 43:9 PXE */
288 static int hf_dhcp_option43_pxeclient_boot_menu_desc; /* 43:9 PXE */
289 static int hf_dhcp_option43_pxeclient_menu_prompt; /* 43:10 PXE */
290 static int hf_dhcp_option43_pxeclient_menu_prompt_timeout; /* 43:10 PXE */
291 static int hf_dhcp_option43_pxeclient_menu_prompt_prompt; /* 43:10 PXE */
292 static int hf_dhcp_option43_pxeclient_multicast_address_alloc; /* 43:11 PXE */
293 static int hf_dhcp_option43_pxeclient_credential_types; /* 43:12 PXE */
294 static int hf_dhcp_option43_pxeclient_boot_item; /* 43:71 PXE */
295 static int hf_dhcp_option43_pxeclient_boot_item_type; /* 43:71 PXE */
296 static int hf_dhcp_option43_pxeclient_boot_item_layer; /* 43:71 PXE */
297 static int hf_dhcp_option43_pxeclient_lcm_server; /* 43:179 PXE */
298 static int hf_dhcp_option43_pxeclient_lcm_domain; /* 43:180 PXE */
299 static int hf_dhcp_option43_pxeclient_lcm_nic_option; /* 43:181 PXE */
300 static int hf_dhcp_option43_pxeclient_lcm_workgroup; /* 43:190 PXE */
301 static int hf_dhcp_option43_pxeclient_discovery; /* 43:191 PXE */
302 static int hf_dhcp_option43_pxeclient_configured; /* 43:192 PXE */
303 static int hf_dhcp_option43_pxeclient_lcm_version; /* 43:193 PXE */
304 static int hf_dhcp_option43_pxeclient_lcm_serial; /* 43:194 PXE */
305 static int hf_dhcp_option43_pxeclient_end; /* 43:255 PXE */
307 static int hf_dhcp_option43_cl_suboption; /* 43 suboption */
308 static int hf_dhcp_option43_cl_padding; /* 43:0 CL */
309 static int hf_dhcp_option43_cl_suboption_request_list; /* 43:1 CL */
310 static int hf_dhcp_option43_cl_device_type; /* 43:2 CL */
311 static int hf_dhcp_option43_cl_esafe_type; /* 43:3 CL */
312 static int hf_dhcp_option43_cl_serial_number; /* 43:4 CL */
313 static int hf_dhcp_option43_cl_hardware_version; /* 43:5 CL */
314 static int hf_dhcp_option43_cl_software_version; /* 43:6 CL */
315 static int hf_dhcp_option43_cl_boot_rom_version; /* 43:7 CL */
316 static int hf_dhcp_option43_cl_oui_bytes; /* 43:8 CL */
317 static int hf_dhcp_option43_cl_oui_string; /* 43:8 CL */
318 static int hf_dhcp_option43_cl_model_number; /* 43:9 CL */
319 static int hf_dhcp_option43_cl_vendor_name10; /* 43:10 CL */
320 static int hf_dhcp_option43_cl_address_realm; /* 43:11 CL */
321 static int hf_dhcp_option43_cl_cm_ps_system_desc; /* 43:12 CL */
322 static int hf_dhcp_option43_cl_cm_ps_firmware_revision; /* 43:13 CL */
323 static int hf_dhcp_option43_cl_firewall_policy_file_version; /* 43:14 CL */
324 static int hf_dhcp_option43_cl_esafe_config_file_devices; /* 43:15 CL */
325 static int hf_dhcp_option43_cl_video_security_tape; /* 43:18 CL */
326 static int hf_dhcp_option43_cl_mta_mac_address; /* 43:31 CL */
327 static int hf_dhcp_option43_cl_correlation_ID; /* 43:32 CL */
328 static int hf_dhcp_option43_cl_vendor_name51; /* 43:51 CL */
329 static int hf_dhcp_option43_cl_cablecard_capability; /* 43:52 CL */
330 static int hf_dhcp_option43_cl_device_id_ca; /* 43:53 CL */
331 static int hf_dhcp_option43_cl_device_id_x509; /* 43:54 CL */
332 static int hf_dhcp_option43_cl_end; /* 43:255 CL */
334 static int hf_dhcp_option43_aerohive_suboption; /* 43 suboption */
335 static int hf_dhcp_option43_aerohive_unknown; /* 43:X AEROHIVE */
336 static int hf_dhcp_option43_aerohive_xiqhostname; /* 43:225 AEROHIVE */
337 static int hf_dhcp_option43_aerohive_xiqipaddress; /* 43:226 AEROHIVE */
339 static int hf_dhcp_option43_bsdp_suboption; /* 43 suboption */
340 static int hf_dhcp_option43_bsdp_message_type; /* 43:1 BSDP */
341 static int hf_dhcp_option43_bsdp_version; /* 43:2 BSDP */
342 static int hf_dhcp_option43_bsdp_server_identifier; /* 43:3 BSDP */
343 static int hf_dhcp_option43_bsdp_server_priority; /* 43:4 BSDP */
344 static int hf_dhcp_option43_bsdp_reply_port; /* 43:5 BSDP */
345 static int hf_dhcp_option43_bsdp_boot_image_list_path; /* 43:6 BSDP */
346 static int hf_dhcp_option43_bsdp_default_boot_image_id; /* 43:7 BSDP */
347 static int hf_dhcp_option43_bsdp_selected_boot_image_id; /* 43:8 BSDP */
348 static int hf_dhcp_option43_bsdp_boot_image_list; /* 43:9 BSDP */
349 static int hf_dhcp_option43_bsdp_netboot_firmware; /* 43:10 BSDP */
350 static int hf_dhcp_option43_bsdp_attributes_filter_list; /* 43:11 BSDP */
351 static int hf_dhcp_option43_bsdp_message_size; /* 43:12 BSDP */
352 static int hf_dhcp_option43_bsdp_boot_image_index; /* 43 BSDP */
353 static int hf_dhcp_option43_bsdp_boot_image_attribute; /* 43 BSDP */
354 static int hf_dhcp_option43_bsdp_boot_image_attribute_install; /* 43 BSDP */
355 static int hf_dhcp_option43_bsdp_boot_image_attribute_kind; /* 43 BSDP */
356 static int hf_dhcp_option43_bsdp_boot_image_attribute_reserved; /* 43 BSDP */
357 static int hf_dhcp_option43_bsdp_image_desc; /* 43 BSDP */
358 static int hf_dhcp_option43_bsdp_boot_image_name; /* 43 BSDP */
359 static int hf_dhcp_option43_bsdp_boot_image_name_len; /* 43 BSDP */
361 static int hf_dhcp_option43_cisco_suboption; /* 43 Cisco */
362 static int hf_dhcp_option43_cisco_unknown; /* 43 Cisco */
363 static int hf_dhcp_option43_cisco_unknown1; /* 43:1 Cisco */
364 static int hf_dhcp_option43_cisco_unknown2; /* 43:2 Cisco */
365 static int hf_dhcp_option43_cisco_unknown3; /* 43:3 Cisco */
366 static int hf_dhcp_option43_cisco_nodeid; /* 43:4 Cisco */
367 static int hf_dhcp_option43_cisco_unknown5; /* 43:5 Cisco */
368 static int hf_dhcp_option43_cisco_unknown6; /* 43:6 Cisco */
369 static int hf_dhcp_option43_cisco_model; /* 43:7 Cisco */
370 static int hf_dhcp_option43_cisco_apicuuid; /* 43:8 Cisco */
371 static int hf_dhcp_option43_cisco_fabricname; /* 43:9 Cisco */
372 static int hf_dhcp_option43_cisco_unknown10; /* 43:10 Cisco */
373 static int hf_dhcp_option43_cisco_serialno; /* 43:11 Cisco */
374 static int hf_dhcp_option43_cisco_clientint; /* 43:12 Cisco */
376 static int hf_dhcp_option43_alcatel_suboption; /* 43 suboption */
377 static int hf_dhcp_option43_alcatel_padding; /* 43:0 Alcatel */
378 static int hf_dhcp_option43_alcatel_vlan_id; /* 43:58 Alcatel */
379 static int hf_dhcp_option43_alcatel_tftp1; /* 43:64 Alcatel */
380 static int hf_dhcp_option43_alcatel_tftp2; /* 43:65 Alcatel */
381 static int hf_dhcp_option43_alcatel_app_type; /* 43:66 Alcatel */
382 static int hf_dhcp_option43_alcatel_sip_url; /* 43:67 Alcatel */
383 static int hf_dhcp_option43_alcatel_end; /* 43:255 Alcatel */
385 static int hf_dhcp_option43_arubaap_controllerip; /* 43: ArubaAP*/
386 static int hf_dhcp_option43_arubaiap; /* 43: ArubaIAP*/
387 static int hf_dhcp_option43_arubaiap_nameorg; /* 43: ArubaIAP: Name Organisation*/
388 static int hf_dhcp_option43_arubaiap_ampip; /* 43: ArubaIAP: AMP IP Address*/
389 static int hf_dhcp_option43_arubaiap_password; /* 43 :ArubaIAP: Password*/
391 static int hf_dhcp_option_netbios_over_tcpip_name_server; /* 44 */
392 static int hf_dhcp_option_netbios_over_tcpip_dd_name_server; /* 45 */
393 static int hf_dhcp_option_netbios_over_tcpip_node_type; /* 46 */
394 static int hf_dhcp_option_netbios_over_tcpip_scope; /* 47 */
395 static int hf_dhcp_option_xwindows_system_font_server; /* 48 */
396 static int hf_dhcp_option_xwindows_system_display_manager; /* 49 */
397 static int hf_dhcp_option_requested_ip_address; /* 50 */
398 static int hf_dhcp_option_ip_address_lease_time; /* 51 */
399 static int hf_dhcp_option_option_overload; /* 52 */
400 static int hf_dhcp_option_dhcp; /* 53 */
401 static int hf_dhcp_option_dhcp_server_id; /* 54 */
402 static int hf_dhcp_option_parameter_request_list_item; /* 55 */
403 static int hf_dhcp_option_message; /* 56 */
404 static int hf_dhcp_option_dhcp_max_message_size; /* 57 */
405 static int hf_dhcp_option_renewal_time_value; /* 58 */
406 static int hf_dhcp_option_rebinding_time_value; /* 59 */
407 static int hf_dhcp_option_vendor_class_id; /* 60 */
408 static int hf_dhcp_option_vendor_class_data; /* 60 */
410 static int hf_dhcp_option_novell_netware_ip_domain; /* 62 */
412 static int hf_dhcp_option63_suboption; /* 63 suboption */
413 static int hf_dhcp_option63_value; /* 63 suboption value */
414 static int hf_dhcp_option63_value_8; /* 63 suboption value */
415 static int hf_dhcp_option63_value_ip_address; /* 63 suboption value */
416 static int hf_dhcp_option63_value_boolean; /* 63 suboption value */
417 static int hf_dhcp_option63_broadcast; /* 63:5 */
418 static int hf_dhcp_option63_preferred_dss_server; /* 63:6 */
419 static int hf_dhcp_option63_nearest_nwip_server; /* 63:7 */
420 static int hf_dhcp_option63_autoretries; /* 63:8 */
421 static int hf_dhcp_option63_autoretry_delay; /* 63:9 */
422 static int hf_dhcp_option63_support_netware_v1_1; /* 63:10 */
423 static int hf_dhcp_option63_primary_dss; /* 63:11 */
425 static int hf_dhcp_option_nis_plus_domain; /* 64 */
426 static int hf_dhcp_option_nis_plus_server; /* 65 */
427 static int hf_dhcp_option_tftp_server_name; /* 66 */
428 static int hf_dhcp_option_bootfile_name; /* 67 */
429 static int hf_dhcp_option_mobile_ip_home_agent; /* 68 */
430 static int hf_dhcp_option_smtp_server; /* 69 */
431 static int hf_dhcp_option_pop3_server; /* 70 */
432 static int hf_dhcp_option_nntp_server; /* 71 */
433 static int hf_dhcp_option_default_www_server; /* 72 */
434 static int hf_dhcp_option_default_finger_server; /* 73 */
435 static int hf_dhcp_option_default_irc_server; /* 74 */
436 static int hf_dhcp_option_streettalk_server; /* 75 */
437 static int hf_dhcp_option_streettalk_da_server; /* 76 */
438 static int hf_dhcp_option77_user_class; /* 77 User Class instance */
439 static int hf_dhcp_option77_user_class_length; /* 77 length of User Class instance */
440 static int hf_dhcp_option77_user_class_data; /* 77 data of User Class instance */
441 static int hf_dhcp_option77_user_class_text; /* 77 User class text */
442 static int hf_dhcp_option77_user_class_binary_data_length; /* 77, Microsoft */
443 static int hf_dhcp_option77_user_class_binary_data; /* 77, Microsoft */
444 static int hf_dhcp_option77_user_class_padding; /* 77, Microsoft */
445 static int hf_dhcp_option77_user_class_name_length; /* 77, Microsoft */
446 static int hf_dhcp_option77_user_class_name; /* 77, Microsoft */
447 static int hf_dhcp_option77_user_class_description_length; /* 77, Microsoft */
448 static int hf_dhcp_option77_user_class_description; /* 77, Microsoft */
449 static int hf_dhcp_option_slp_directory_agent_value; /* 78 */
450 static int hf_dhcp_option_slp_directory_agent_slpda_address; /* 78 */
451 static int hf_dhcp_option_slp_service_scope_value; /* 79 */
452 static int hf_dhcp_option_slp_service_scope_string; /* 79 */
454 static int hf_dhcp_option82_suboption; /* 82 suboption */
455 static int hf_dhcp_option82_value; /* 82 suboption value */
456 static int hf_dhcp_option82_value_8; /* 82 suboption value */
457 static int hf_dhcp_option82_value_16; /* 82 suboption value */
458 static int hf_dhcp_option82_value_32; /* 82 suboption value */
459 static int hf_dhcp_option82_value_ip_address; /* 82 suboption value */
460 static int hf_dhcp_option82_value_stringz; /* 82 suboption value */
461 static int hf_dhcp_option82_padding; /* 82:0 */
462 static int hf_dhcp_option82_agent_circuit_id; /* 82:1 */
463 static int hf_dhcp_option82_agent_remote_id; /* 82:2 */
464 static int hf_dhcp_option82_reserved; /* 82:3 */
465 static int hf_dhcp_option82_docsis_device_class; /* 82:4 */
466 static int hf_dhcp_option82_link_selection; /* 82:5 */
467 static int hf_dhcp_option82_subscriber_id; /* 82:6 */
468 static int hf_dhcp_option82_radius_attributes; /* 82:7 */
469 static int hf_dhcp_option82_authentication; /* 82:8 */
470 static int hf_dhcp_option82_vi; /* 82:9 */
471 /* 82:9 suboptions */
472 static int hf_dhcp_option82_vi_enterprise;
473 static int hf_dhcp_option82_vi_data_length;
474 static int hf_dhcp_option82_vi_cl_option;
475 static int hf_dhcp_option82_vi_cl_option_length;
476 static int hf_dhcp_option82_vi_cl_tag;
477 static int hf_dhcp_option82_vi_cl_tag_length;
478 static int hf_dhcp_option82_vi_cl_docsis_version; /* 82:9:4491:1 */
479 static int hf_dhcp_option82_vi_cl_dpoe_system_version; /* 82:9:4491:2 */
480 static int hf_dhcp_option82_vi_cl_dpoe_system_pbb_service; /* 82:9:4491:4 */
481 static int hf_dhcp_option82_vi_cl_service_class_name; /* 82:9:4491:5 */
482 static int hf_dhcp_option82_vi_cl_mso_defined_text; /* 82:9:4491:6 */
483 static int hf_dhcp_option82_vi_cl_secure_file_transfer_uri; /* 82:9:4491:7 */
484 /* 82:9 suboptions end */
485 static int hf_dhcp_option82_flags; /* 82:10 */
486 static int hf_dhcp_option82_server_id_override; /* 82:11 */
487 static int hf_dhcp_option82_relay_agent_id; /* 82:12 */
488 static int hf_dhcp_option82_option_ani_att; /* 82:13 */
489 static int hf_dhcp_option82_option_ani_att_res;
490 static int hf_dhcp_option82_option_ani_att_att;
491 static int hf_dhcp_option82_option_ani_network_name; /* 82:14 */
492 static int hf_dhcp_option82_option_ani_ap_name; /* 82:15 */
493 static int hf_dhcp_option82_option_ani_ap_bssid; /* 82:16 */
494 static int hf_dhcp_option82_option_ani_operator_id; /* 82:17 */
495 static int hf_dhcp_option82_option_ani_operator_realm; /* 82:18 */
496 static int hf_dhcp_option82_option_source_port; /* 82:19 */
497 static int hf_dhcp_option82_link_selection_cisco; /* 82:150 */
498 static int hf_dhcp_option82_vrf_name_vpn_id; /* 82:151 */
499 /* 82:151 suboptions */
500 static int hf_dhcp_option82_vrf_name_global;
501 static int hf_dhcp_option82_vrf_name;
502 static int hf_dhcp_option82_vrf_name_vpn_id_oui;
503 static int hf_dhcp_option82_vrf_name_vpn_id_index;
504 /* 82:151 suboptions end */
505 static int hf_dhcp_option82_server_id_override_cisco; /* 82:152 */
507 static int hf_dhcp_option_isns_functions;
508 static int hf_dhcp_option_isns_functions_enabled;
509 static int hf_dhcp_option_isns_functions_dd_authorization;
510 static int hf_dhcp_option_isns_functions_sec_policy_distibution;
511 static int hf_dhcp_option_isns_functions_reserved;
513 static int hf_dhcp_option_isns_discovery_domain_access;
514 static int hf_dhcp_option_isns_discovery_domain_access_enabled;
515 static int hf_dhcp_option_isns_discovery_domain_access_control_node;
516 static int hf_dhcp_option_isns_discovery_domain_access_iscsi_target;
517 static int hf_dhcp_option_isns_discovery_domain_access_iscsi_inititator;
518 static int hf_dhcp_option_isns_discovery_domain_access_ifcp_target_port;
519 static int hf_dhcp_option_isns_discovery_domain_access_ifcp_initiator_port;
520 static int hf_dhcp_option_isns_discovery_domain_access_reserved;
522 static int hf_dhcp_option_isns_administrative_flags;
523 static int hf_dhcp_option_isns_administrative_flags_enabled;
524 static int hf_dhcp_option_isns_administrative_flags_heartbeat;
525 static int hf_dhcp_option_isns_administrative_flags_management_scns;
526 static int hf_dhcp_option_isns_administrative_flags_default_dd;
527 static int hf_dhcp_option_isns_administrative_flags_reserved;
529 static int hf_dhcp_option_isns_server_security_bitmap;
530 static int hf_dhcp_option_isns_server_security_bitmap_enabled;
531 static int hf_dhcp_option_isns_server_security_bitmap_ike_ipsec_enabled;
532 static int hf_dhcp_option_isns_server_security_bitmap_main_mode;
533 static int hf_dhcp_option_isns_server_security_bitmap_aggressive_mode;
534 static int hf_dhcp_option_isns_server_security_bitmap_pfs;
535 static int hf_dhcp_option_isns_server_security_bitmap_transport_mode;
536 static int hf_dhcp_option_isns_server_security_bitmap_tunnel_mode;
537 static int hf_dhcp_option_isns_server_security_bitmap_reserved;
539 static int hf_dhcp_option_isns_heartbeat_originator_addr;
540 static int hf_dhcp_option_isns_primary_server_addr;
541 static int hf_dhcp_option_isns_secondary_server_addr_list;
543 static int hf_dhcp_option_novell_dss_string; /* 85 */
544 static int hf_dhcp_option_novell_dss_ip; /* 85 */
545 static int hf_dhcp_option_novell_ds_tree_name; /* 86 */
546 static int hf_dhcp_option_novell_ds_context; /* 87 */
547 static int hf_dhcp_option_dhcp_authentication_protocol; /* 90 */
548 static int hf_dhcp_option_dhcp_authentication_alg_delay; /* 90 */
549 static int hf_dhcp_option_dhcp_authentication_algorithm; /* 90 */
550 static int hf_dhcp_option_dhcp_authentication_rdm; /* 90 */
551 static int hf_dhcp_option_dhcp_authentication_rdm_replay_detection; /* 90 */
552 static int hf_dhcp_option_dhcp_authentication_rdm_rdv; /* 90 */
553 static int hf_dhcp_option_dhcp_authentication_secret_id; /* 90 */
554 static int hf_dhcp_option_dhcp_authentication_hmac_md5_hash; /* 90 */
555 static int hf_dhcp_option_dhcp_authentication_information; /* 90 */
556 static int hf_dhcp_option_client_last_transaction_time; /* 91 */
557 static int hf_dhcp_option_associated_ip_option; /* 92 */
558 static int hf_dhcp_option_client_system_architecture; /* 93 */
559 static int hf_dhcp_option_client_network_id_major_ver; /* 94 */
560 static int hf_dhcp_option_client_network_id_minor_ver; /* 94 */
561 static int hf_dhcp_option_civic_location_what; /* 99 */
562 static int hf_dhcp_option_civic_location_country; /* 99 */
563 static int hf_dhcp_option_civic_location_ca_type; /* 99 */
564 static int hf_dhcp_option_civic_location_ca_length; /* 99 */
565 static int hf_dhcp_option_civic_location_ca_value; /* 99 */
566 static int hf_dhcp_option_tz_pcode; /* 100 */
567 static int hf_dhcp_option_tz_tcode; /* 101 */
568 static int hf_dhcp_option_ipv6_only_preferred_wait_time; /* 108 */
569 static int hf_dhcp_option_netinfo_parent_server_address; /* 112 */
570 static int hf_dhcp_option_netinfo_parent_server_tag; /* 113 */
571 static int hf_dhcp_option_captive_portal; /* 114 (ex 160) */
572 static int hf_dhcp_option_dhcp_auto_configuration; /* 116 */
573 static int hf_dhcp_option_dhcp_name_service_search_option; /* 117 */
574 static int hf_dhcp_option_dhcp_dns_domain_search_list_fqdn; /* 119 */
575 static int hf_dhcp_option_sip_server_enc; /* 120 */
576 static int hf_dhcp_option_sip_server_name; /* 120 */
577 static int hf_dhcp_option_sip_server_address; /* 120 */
578 static int hf_dhcp_option_classless_static_route; /* 120 */
579 static int hf_dhcp_option_rfc3825_error; /* 123 */
580 static int hf_dhcp_option_rfc3825_latitude; /* 123 */
581 static int hf_dhcp_option_rfc3825_longitude; /* 123 */
582 static int hf_dhcp_option_rfc3825_latitude_res; /* 123 */
583 static int hf_dhcp_option_rfc3825_longitude_res; /* 123 */
584 static int hf_dhcp_option_rfc3825_altitude; /* 123 */
585 static int hf_dhcp_option_rfc3825_altitude_res; /* 123 */
586 static int hf_dhcp_option_rfc3825_altitude_type; /* 123 */
587 static int hf_dhcp_option_rfc3825_map_datum; /* 123 */
588 static int hf_dhcp_option_cl_dss_id_option; /* 123 CL */
589 static int hf_dhcp_option_cl_dss_id_len; /* 123 CL */
590 static int hf_dhcp_option_cl_dss_id; /* 123 CL */
591 static int hf_dhcp_option_vi_class_cl_address_mode; /* 124 */
592 static int hf_dhcp_option_vi_class_enterprise; /* 124 */
593 static int hf_dhcp_option_vi_class_data_length; /* 124 */
594 static int hf_dhcp_option_vi_class_data_item_length; /* 124 */
595 static int hf_dhcp_option_vi_class_data_item_data; /* 124 */
597 static int hf_dhcp_option125_enterprise;
598 static int hf_dhcp_option125_length;
599 static int hf_dhcp_option125_value; /* 125 suboption value */
600 static int hf_dhcp_option125_value_8; /* 125 suboption value */
601 static int hf_dhcp_option125_value_16; /* 125 suboption value */
602 static int hf_dhcp_option125_value_ip_address; /* 125 suboption value */
603 static int hf_dhcp_option125_value_stringz; /* 125 suboption value */
604 static int hf_dhcp_option125_tr111_suboption; /* 125 suboption */
605 static int hf_dhcp_option125_tr111_device_manufacturer_oui; /* 125:TR-111 1 */
606 static int hf_dhcp_option125_tr111_device_serial_number; /* 125:TR-111 2 */
607 static int hf_dhcp_option125_tr111_device_product_class; /* 125:TR-111 3 */
608 static int hf_dhcp_option125_tr111_gateway_manufacturer_oui; /* 125:TR-111 4 */
609 static int hf_dhcp_option125_tr111_gateway_serial_number; /* 125:TR-111 5 */
610 static int hf_dhcp_option125_tr111_gateway_product_class; /* 125:TR-111 6 */
611 static int hf_dhcp_option125_cl_suboption; /* 125 suboption */
612 static int hf_dhcp_option125_cl_option_request; /* 125:CL 1 */
613 static int hf_dhcp_option125_cl_tftp_server_addresses; /* 125:CL 2 */
614 static int hf_dhcp_option125_cl_erouter_container_option; /* 125:CL 3 */
615 static int hf_dhcp_option125_cl_mib_environment_indicator_option; /* 125:CL 4 */
616 static int hf_dhcp_option125_cl_modem_capabilities; /* 125:CL 5 */
618 static int hf_dhcp_option_subnet_selection_option; /* 118 */
619 static int hf_dhcp_option_pana_agent; /* 136 */
620 static int hf_dhcp_option_lost_server_domain_name; /* 137 */
621 static int hf_dhcp_option_capwap_access_controller; /* 138 */
622 static int hf_dhcp_option_andsf_server; /* 142 */
623 static int hf_dhcp_option_forcerenew_nonce_algo; /* 145 */
624 static int hf_dhcp_option_rdnss_reserved; /* 146 */
625 static int hf_dhcp_option_rdnss_pref; /* 146 */
626 static int hf_dhcp_option_rdnss_prim_dns_server; /* 146 */
627 static int hf_dhcp_option_rdnss_sec_dns_server; /* 146 */
628 static int hf_dhcp_option_rdnss_domain; /* 146 */
629 static int hf_dhcp_option_dots_ri; /* 147 */
630 static int hf_dhcp_option_dots_address; /* 148 */
631 static int hf_dhcp_option_tftp_server_address; /* 150 */
632 static int hf_dhcp_option_bulk_lease_status_code; /* 151 */
633 static int hf_dhcp_option_bulk_lease_status_message; /* 151 */
634 static int hf_dhcp_option_bulk_lease_base_time; /* 152 */
635 static int hf_dhcp_option_bulk_lease_start_time_of_state; /* 153 */
636 static int hf_dhcp_option_bulk_lease_query_start; /* 154 */
637 static int hf_dhcp_option_bulk_lease_query_end; /* 155 */
638 static int hf_dhcp_option_bulk_lease_dhcp_state; /* 156 */
639 static int hf_dhcp_option_bulk_lease_data_source; /* 157 */
640 static int hf_dhcp_option_pcp_list_length; /* 158 */
641 static int hf_dhcp_option_pcp_server; /* 158 */
642 static int hf_dhcp_option_portparams_offset; /* 159 */
643 static int hf_dhcp_option_portparams_psid_length; /* 159 */
644 static int hf_dhcp_option_portparams_psid; /* 159 */
645 static int hf_dhcp_option_mudurl; /* 161 */
646 static int hf_dhcp_option_pxe_config_file; /* 209 */
647 static int hf_dhcp_option_pxe_path_prefix; /* 210 */
648 static int hf_dhcp_option_pxe_reboot_time; /* 211 */
649 static int hf_dhcp_option_6RD_ipv4_mask_len; /* 212 */
650 static int hf_dhcp_option_6RD_prefix_len; /* 212 */
651 static int hf_dhcp_option_6RD_prefix; /* 212 */
652 static int hf_dhcp_option_6RD_border_relay_ip; /* 212 */
653 static int hf_dhcp_option242_avaya; /* 242 */
654 static int hf_dhcp_option242_avaya_tlssrvr; /* 242 */
655 static int hf_dhcp_option242_avaya_httpsrvr; /* 242 */
656 static int hf_dhcp_option242_avaya_httpdir; /* 242 */
657 static int hf_dhcp_option242_avaya_static; /* 242 */
658 static int hf_dhcp_option242_avaya_mcipadd; /* 242 */
659 static int hf_dhcp_option242_avaya_dot1x; /* 242 */
660 static int hf_dhcp_option242_avaya_icmpdu; /* 242 */
661 static int hf_dhcp_option242_avaya_icmpred; /* 242 */
662 static int hf_dhcp_option242_avaya_l2q; /* 242 */
663 static int hf_dhcp_option242_avaya_l2qvlan; /* 242 */
664 static int hf_dhcp_option242_avaya_loglocal; /* 242 */
665 static int hf_dhcp_option242_avaya_phy1stat; /* 242 */
666 static int hf_dhcp_option242_avaya_phy2stat; /* 242 */
667 static int hf_dhcp_option242_avaya_procpswd; /* 242 */
668 static int hf_dhcp_option242_avaya_procstat; /* 242 */
669 static int hf_dhcp_option242_avaya_snmpadd; /* 242 */
670 static int hf_dhcp_option242_avaya_snmpstring; /* 242 */
671 static int hf_dhcp_option242_avaya_vlantest; /* 242 */
672 static int hf_dhcp_option_private_proxy_autodiscovery; /* 252 */
673 static int hf_dhcp_option_end; /* 255 */
674 static int hf_dhcp_option_end_overload; /* 255 (with overload)*/
675 static int hf_dhcp_vendor_unknown_suboption;
676 static int hf_dhcp_suboption_data;
677 static int hf_dhcp_pc_ietf_ccc_suboption;
678 static int hf_dhcp_pc_i05_ccc_suboption;
680 static int hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_nom_timeout;
681 static int hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_timeout;
682 static int hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_retries;
683 static int hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_nom_timeout;
684 static int hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_timeout;
685 static int hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_retries;
687 static int ett_dhcp;
688 static int ett_dhcp_flags;
689 static int ett_dhcp_option;
690 static int ett_dhcp_option43_suboption;
691 static int ett_dhcp_option43_suboption_discovery;
692 static int ett_dhcp_option43_suboption_tree;
693 static int ett_dhcp_option63_suboption;
694 static int ett_dhcp_option77_instance;
695 static int ett_dhcp_option82_suboption;
696 static int ett_dhcp_option82_suboption9;
697 static int ett_dhcp_option124_vendor_class_data_item;
698 static int ett_dhcp_option125_suboption;
699 static int ett_dhcp_option125_tr111_suboption;
700 static int ett_dhcp_option125_cl_suboption;
701 static int ett_dhcp_option242_suboption;
702 static int ett_dhcp_fqdn;
703 static int ett_dhcp_fqdn_flags;
704 static int ett_dhcp_filename_option;
705 static int ett_dhcp_server_hostname;
706 static int ett_dhcp_isns_functions;
707 static int ett_dhcp_isns_discovery_domain_access;
708 static int ett_dhcp_isns_administrative_flags;
709 static int ett_dhcp_isns_server_security_bitmap;
710 static int ett_dhcp_isns_secondary_server_addr;
711 static int ett_dhcp_o43_bsdp_boot_image;
712 static int ett_dhcp_o43_bsdp_attributes;
713 static int ett_dhcp_o43_bsdp_image_desc_list;
714 static int ett_dhcp_o43_bsdp_image_desc;
715 static int ett_dhcp_o43_bsdp_attributes_flags;
716 static int ett_dhcp_option158_pcp_list;
718 static expert_field ei_dhcp_bad_length;
719 static expert_field ei_dhcp_bad_bitfield;
720 static expert_field ei_dhcp_missing_subopt_length;
721 static expert_field ei_dhcp_missing_subopt_value;
722 static expert_field ei_dhcp_mal_duid;
723 static expert_field ei_dhcp_rfc3396_refer_last_option;
724 static expert_field ei_dhcp_opt_overload_wrong_field;
725 static expert_field ei_dhcp_opt_overload_file_end_missing;
726 static expert_field ei_dhcp_opt_overload_sname_end_missing;
727 static expert_field ei_dhcp_subopt_unknown_type;
728 static expert_field ei_dhcp_option_civic_location_bad_cattype;
729 static expert_field ei_dhcp_option_dhcp_name_service_invalid;
730 static expert_field ei_dhcp_option_sip_server_address_encoding;
731 static expert_field ei_dhcp_option_classless_static_route;
732 static expert_field ei_dhcp_option125_enterprise_malformed;
733 static expert_field ei_dhcp_option_6RD_malformed;
734 static expert_field ei_dhcp_option82_vi_cl_tag_unknown;
735 static expert_field ei_dhcp_option_parse_err;
736 static expert_field ei_dhcp_nonstd_option_data;
737 static expert_field ei_dhcp_suboption_invalid;
738 static expert_field ei_dhcp_secs_le;
739 static expert_field ei_dhcp_end_option_missing;
740 static expert_field ei_dhcp_client_address_not_given;
741 static expert_field ei_dhcp_server_name_overloaded_by_dhcp;
742 static expert_field ei_dhcp_boot_filename_overloaded_by_dhcp;
743 static expert_field ei_dhcp_option_isns_ignored_bitfield;
744 static expert_field ei_dhcp_option242_avaya_l2qvlan_invalid;
745 static expert_field ei_dhcp_option242_avaya_vlantest_invalid;
746 static expert_field ei_dhcp_option93_client_arch_ambiguous;
748 static dissector_table_t dhcp_option_table;
749 static dissector_table_t dhcp_enterprise_class_table;
750 static dissector_table_t dhcp_enterprise_specific_table;
751 static heur_dissector_list_t dhcp_vendor_id_subdissector;
752 static heur_dissector_list_t dhcp_vendor_info_subdissector;
753 static dissector_handle_t dhcp_handle;
754 static dissector_handle_t dhcpopt_basic_handle;
756 typedef struct dhcp_option_data
758 unsigned char option;
759 uint8_t *overload;
760 const char *dhcp_type;
761 const uint8_t *vendor_class_id;
762 } dhcp_option_data_t;
764 #define DHCP_HW_IS_ETHER(hwtype, length) ((hwtype == 1 || hwtype == 6) && length == 6)
766 /* RFC2937 The Name Service Search Option for DHCP */
767 #define RFC2937_LOCAL_NAMING_INFORMATION 0
768 #define RFC2937_DOMAIN_NAME_SERVER_OPTION 6
769 #define RFC2937_NETWORK_INFORMATION_SERVERS_OPTION 41
770 #define RFC2937_NETBIOS_OVER_TCP_IP_NAME_SERVER_OPTION 44
771 #define RFC2937_NETWORK_INFORMATION_SERVICE_PLUS_SERVERS_OPTION 65
773 /* RFC3825decoder error codes of the conversion function */
774 #define RFC3825_NOERROR 0
775 #define RFC3825_LATITUDE_OUTOFRANGE 1
776 #define RFC3825_LATITUDE_UNCERTAINTY_OUTOFRANGE 2
777 #define RFC3825_LONGITUDE_OUTOFRANGE 3
778 #define RFC3825_LONGITUDE_UNCERTAINTY_OUTOFRANGE 4
779 #define RFC3825_ALTITUDE_OUTOFRANGE 5
780 #define RFC3825_ALTITUDE_UNCERTAINTY_OUTOFRANGE 6
781 #define RFC3825_ALTITUDE_TYPE_OUTOFRANGE 7
782 #define RFC3825_DATUM_TYPE_OUTOFRANGE 8
784 #define DUID_LLT 1
785 #define DUID_EN 2
786 #define DUID_LL 3
788 struct rfc3825_location_fixpoint_t {
790 int64_t latitude; /* latitude in degrees, allowed range from -90deg to 90deg.
791 Fixpoint A(8,25) with 34 bits */
792 uint8_t latitude_res; /* the resolution of the latitude in bits, allowed range is from 0 to 34.
793 6 bits. */
794 int64_t longitude; /* longitude in degrees, range from -180deg to 180deg.
795 Fixpoint A(8,25) with 34 bits */
796 uint8_t longitude_res; /* the resolution of the longitude in bits, allowed range is from 0 to 34.
797 6 bits. */
798 int32_t altitude; /* the altitude, 30 bits.
799 Depending on alt_type this are meters or floors, no range limit.
800 altitude_type==1: A(13,8) with 22 bits
801 altitude_type==2: A(13,8) with 22 bits */
802 uint8_t altitude_res; /* the resolution of the altitude in bits, allowed range is from 0 to 30.
803 6 bits.
804 altitude_type==1: any value between 0 and 30
805 altitude_type==2: either 0 (floor unknown) or 30 */
806 uint8_t altitude_type; /* the type of the altitude, 4 bits. allowed values are:
807 0: unknown
808 1: altitude in meters
809 2: altitude in floors */
810 uint8_t datum_type; /* the map datum used for the coordinates. 8 bits.
811 All values are allowed although currently only the
812 following ones are defined:
813 1: WGS84
814 2: NAD83/NAVD88
815 3: NAD83/MLLW */
818 /* The rfc3825_location_decimal_t structure holds the location parameters
819 * in decimal (floating point) format.
821 struct rfc3825_location_decimal_t {
823 double latitude; /* latitude in degrees, allowed range from -90deg to 90deg */
824 double latitude_res; /* the uncertainty of the latitude in grad, "0.01" means +-0.01deg
825 from the altitude. During conversion this will be rounded to
826 next smaller value which can be represented in fixpoint arithmetic */
827 double longitude; /* longitude in degrees, range from -180deg to 180deg */
828 double longitude_res; /* the uncertainty of the longitude in grad, "0.01" means +-0.01deg
829 from the longitude. During conversion this will be rounded to
830 next smaller value which can be represented in fixpoint arithmetic */
831 double altitude; /* the altitude, depending on alt_type this are meters or floors, no range limit */
832 double altitude_res; /* the uncertainty of the altitude in either:
833 - altitude-type=meters: "10" means 10 meters which means +-10 meters from the altitude
834 - altitude-type=floors: either 0 (unknown) or 30 (exact) */
835 int altitude_type; /* the type of the altitude, allowed values are
836 0: unknown
837 1: altitude in meters
838 2: altitude in floors */
839 int datum_type; /* the map datum used for the coordinates.
840 All values are allowed although currently only the
841 following ones are defined:
842 1: WGS84
843 2: NAD83/NAVD88
844 3: NAD83/MLLW */
847 /* For managing split options with RFC 3396 */
848 struct rfc3396_for_option_t {
849 unsigned int total_number_of_block;
850 unsigned int index_current_block;
851 tvbuff_t* tvb_composite;
854 enum {
855 RFC_3361_ENC_FQDN,
856 RFC_3361_ENC_IPADDR
859 static void dissect_vendor_avaya_param(proto_tree *tree, packet_info *pinfo, proto_item *vti,
860 tvbuff_t *tvb, int optoff, wmem_strbuf_t *avaya_param_buf);
862 /* converts fixpoint presentation into decimal presentation
863 also converts values which are out of range to allow decoding of received data */
864 static int rfc3825_fixpoint_to_decimal(struct rfc3825_location_fixpoint_t *fixpoint, struct rfc3825_location_decimal_t *decimal);
866 /* decodes the LCI string received from DHCP into the fixpoint values */
867 static void rfc3825_lci_to_fixpoint(const unsigned char lci[16], struct rfc3825_location_fixpoint_t *fixpoint);
870 /* Map Datum Types used for the coordinates (RFC 3825) */
871 static const value_string map_datum_type_values[] = {
872 { 1, "WGS 84" },
873 { 2, "NAD83 (NAVD88)" },
874 { 3, "NAD83 (MLLW)" },
875 { 0, NULL }
879 /* Altitude Types used for the coordinates (RFC 3825) */
880 static const value_string altitude_type_values[] = {
881 { 1, "Meters" },
882 { 2, "Floors" },
883 { 0, NULL }
886 /* AutoConfigure (RFC 2563) */
887 static const value_string dhcp_autoconfig[] = {
888 { 0, "DoNotAutoConfigure"},
889 { 1, "AutoConfigure"},
890 { 0, NULL }
893 /* Error Types for RFC 3825 coordinate location decoding */
894 static const value_string rfc3825_error_types[] = {
895 { 1, "Latitude is out of range [-90,90]"},
896 { 2, "Latitude Uncertainty is out of range [0,90]"},
897 { 3, "Longitude is out of range [-180,180]"},
898 { 4, "Longitude Uncertainty is out of range [0,180]"},
899 { 5, "Altitude is out of range [-(2^21),(2^21)-1]"},
900 { 6, "Altitude Uncertainty is out of range [0,2^20]"},
901 { 7, "Altitude Type is out of range [0,2]"},
902 { 8, "Datum is out of range [1,3]"},
903 { 0, NULL }
908 /* Civic Address What field (RFC 4776) */
909 static const value_string civic_address_what_values[] = {
910 { 0, "Location of the DHCP server" },
911 { 1, "Location of the network element believed to be closest to the client" },
912 { 2, "Location of the client"},
913 { 0, NULL}
916 /* Civic Address Type field (RFC 4119, RFC 4776, RFC 5139) */
917 static const value_string civic_address_type_values[] = {
918 { 0, "Language" },
919 { 1, "A1" },
920 { 2, "A2" },
921 { 3, "A3" },
922 { 4, "A4" },
923 { 5, "A5" },
924 { 6, "A6" },
925 { 16, "PRD (Leading street direction)" },
926 { 17, "POD (Trailing street suffix)" },
927 { 18, "STS (Street suffix)" },
928 { 19, "HNO (House number)" },
929 { 20, "HNS (House number suffix)" },
930 { 21, "LMK (Landmark or vanity address)" },
931 { 22, "LOC (Additional location information)" },
932 { 23, "NAM" },
933 { 24, "PC (Postal/ZIP code)" },
934 { 25, "BLD (Building)" },
935 { 26, "UNIT" },
936 { 27, "FLR (Floor)" },
937 { 28, "ROOM" },
938 { 29, "PLC (Place-type)" },
939 { 30, "PCN (Postal community name)" },
940 { 31, "POBOX" },
941 { 32, "ADDCODE (Additional Code)" },
942 { 33, "SEAT" },
943 { 34, "RD (Primary road or street)" },
944 { 35, "RDSEC (Road section)" },
945 { 36, "RDBR (Road branch)" },
946 { 37, "RDSUBBR (Road sub-branch)" },
947 { 38, "PRM (Road pre-modifier)" },
948 { 39, "POM (Road post-modifier" },
949 { 128, "Script" },
950 { 0, NULL }
953 static const value_string cablelab_ipaddr_mode_vals[] = {
954 { 1, "IPv4" },
955 { 2, "IPv6" },
956 { 0, NULL }
959 static const value_string duidtype_vals[] =
961 { DUID_LLT, "link-layer address plus time" },
962 { DUID_EN, "assigned by vendor based on Enterprise number" },
963 { DUID_LL, "link-layer address" },
964 { 0, NULL }
967 static const value_string forcerenew_nonce_algo_vals[] = {
968 { 1, "HMAC-MD5" },
969 { 0, NULL },
972 static const value_string rdnss_pref_vals[] = {
973 { 0, "Medium" },
974 { 1, "High" },
975 { 2, "Reserved" },
976 { 3, "Low" },
977 { 0, NULL },
980 static const value_string bulk_lease_dhcp_status_code_vals[] = {
981 { 0, "Success" },
982 { 1, "UpsecFail" },
983 { 2, "QueryTerminated" },
984 { 3, "MalformedQuery" },
985 { 4, "NotAllowed" },
986 { 5, "DataMissing" },
987 { 6, "ConnectionActive" },
988 { 7, "CatchUpComplete" },
989 { 8, "TLSConnectionRefused" },
990 { 0, NULL },
993 static const value_string bulk_lease_dhcp_state_vals[] = {
994 { 1, "Available" },
995 { 2, "Active" },
996 { 3, "Expired" },
997 { 4, "Released" },
998 { 5, "Abandoned" },
999 { 6, "Reset" },
1000 { 7, "Remote" },
1001 { 8, "Transitioning" },
1002 { 0, NULL },
1005 static const value_string o43pxeclient_boot_server_types[] = {
1006 { 0, "PXE bootstrap server" },
1007 { 1, "Microsoft Windows NT Boot Server" },
1008 { 2, "Intel LCM Boot Server" },
1009 { 3, "DOS/UNDI Boot Server" },
1010 { 4, "NEC ESMPRO Boot Server" },
1011 { 5, "IBM WSoD Boot Server" },
1012 { 6, "IBM LCCM Boot Server" },
1013 { 7, "CA Unicenter TNG Boot Server" },
1014 { 8, "HP OpenView Boot Server" },
1015 { 65535, "PXE API Test server" },
1016 { 0, NULL },
1019 static const value_string o43pxeclient_boot_menu_types[] = {
1020 { 0, "Local boot" },
1021 { 0, NULL },
1024 static bool novell_string;
1026 static int dhcp_uuid_endian = ENC_LITTLE_ENDIAN;
1028 static const enum_val_t dhcp_uuid_endian_vals[] = {
1029 { "LE", "Little Endian", ENC_LITTLE_ENDIAN},
1030 { "BE", "Big Endian", ENC_BIG_ENDIAN },
1031 { NULL, NULL, 0 }
1034 #define DHCP_SECS_ENDIAN_AUTODETECT -1
1036 static int dhcp_secs_endian = DHCP_SECS_ENDIAN_AUTODETECT;
1038 static const enum_val_t dhcp_secs_endian_vals[] = {
1039 { "Autodetect", "Autodetect", DHCP_SECS_ENDIAN_AUTODETECT},
1040 { "LE", "Little Endian", ENC_LITTLE_ENDIAN},
1041 { "BE", "Big Endian", ENC_BIG_ENDIAN },
1042 { NULL, NULL, 0 }
1045 #define DHCP_UDP_PORT_RANGE "67-68,4011"
1046 #define PROXYDHCP_UDP_PORT 4011
1048 #define BOOTP_BC 0x8000
1049 #define BOOTP_MBZ 0x7FFF
1051 /* FQDN stuff */
1052 #define F_FQDN_S 0x01
1053 #define F_FQDN_O 0x02
1054 #define F_FQDN_E 0x04
1055 #define F_FQDN_N 0x08
1056 #define F_FQDN_MBZ 0xf0
1058 #define ISNS_BITFIELD_NZ_MUST_BE_IGNORED(mask, ena_flag) \
1059 ((mask) && !((mask) & (ena_flag)))
1061 /* iSNS bit fields */
1062 #define F_ISNS_FUNCTIONS_ENABLED 0x0001
1063 #define F_ISNS_FUNCTIONS_DD_AUTH 0x0002
1064 #define F_ISNS_FUNCTIONS_SEC_POLICY 0x0004
1065 #define F_ISNS_FUNCTIONS_RESERVED 0xFFF8
1067 #define F_ISNS_DD_ACCESS_ENABLED 0x0001
1068 #define F_ISNS_DD_ACCESS_CTRL_NODE 0x0002
1069 #define F_ISNS_DD_ACCESS_ISCSI_TARGET 0x0004
1070 #define F_ISNS_DD_ACCESS_ISCSI_INITIATOR 0x0008
1071 #define F_ISNS_DD_ACCESS_IFCP_TARGET_PORT 0x0010
1072 #define F_ISNS_DD_ACCESS_IFCP_INITIATOR_PORT 0x0020
1073 #define F_ISNS_DD_ACCESS_RESERVED 0xFFC0
1075 #define F_ISNS_ADMIN_FLAGS_ENABLED 0x0001
1076 #define F_ISNS_ADMIN_FLAGS_HEARTBEAT 0x0002
1077 #define F_ISNS_ADMIN_FLAGS_MANAGEMENT_SCNS 0x0004
1078 #define F_ISNS_ADMIN_FLAGS_DEFAULT_DD 0x0008
1079 #define F_ISNS_ADMIN_FLAGS_RESERVED 0xFFF0
1081 #define F_ISNS_SRV_SEC_BITMAP_ENABLED 0x0001
1082 #define F_ISNS_SRV_SEC_BITMAP_IKE_IPSEC 0x0002
1083 #define F_ISNS_SRV_SEC_BITMAP_MAIN_MODE 0x0004
1084 #define F_ISNS_SRV_SEC_BITMAP_AGGRESSIVE 0x0008
1085 #define F_ISNS_SRV_SEC_BITMAP_PFS 0x0010
1086 #define F_ISNS_SRV_SEC_BITMAP_TRASPORT_MODE 0x0020
1087 #define F_ISNS_SRV_SEC_BITMAP_TUNNEL_MODE 0x0040
1088 #define F_ISNS_SRV_SEC_BITMAP_RESERVED 0xFF80
1091 static const true_false_string tfs_fqdn_o = {
1092 "Override",
1093 "No override"
1096 static const true_false_string tfs_fqdn_e = {
1097 "Binary encoding",
1098 "ASCII encoding"
1101 static const true_false_string tfs_fqdn_n = {
1102 "No server updates",
1103 "Some server updates"
1106 static const true_false_string tfs_isns_function_dd_based_auth = {
1107 "Automatically allowed access",
1108 "Explicitly performed",
1111 static const true_false_string tfs_isns_functions_sec_distrib = {
1112 "Download from iSNS server",
1113 "By other means",
1116 static const true_false_string tfs_bulk_lease_data_source = {
1117 "Remote",
1118 "Local"
1121 enum field_type {
1122 special,
1123 none,
1124 presence,
1125 ipv4, /* single IPv4 address */
1126 ipv4_list, /* list of IPv4 addresses */
1127 string,
1128 bytes,
1129 opaque,
1130 val_boolean,
1131 val_u_byte,
1132 val_u_short,
1133 val_u_short_list,
1134 val_u_le_short,
1135 val_u_long,
1136 time_in_s_secs, /* Signed */
1137 time_in_u_secs, /* Unsigned (not micro) */
1138 fqdn,
1139 ipv4_or_fqdn,
1143 struct opt_info {
1144 const char *text;
1145 enum field_type ftype;
1146 int* phf;
1149 static const true_false_string flag_set_broadcast = {
1150 "Broadcast",
1151 "Unicast"
1154 #define BOOTP_MAX_NO_CHAR 64
1156 /* PacketCable/DOCSIS definitions */
1157 #define PACKETCABLE_MTA_CAP10 "pktc1.0:"
1158 #define PACKETCABLE_MTA_CAP15 "pktc1.5:"
1159 #define PACKETCABLE_MTA_CAP20 "pktc2.0:"
1160 #define PACKETCABLE_CM_CAP11 "docsis1.1:"
1161 #define PACKETCABLE_CM_CAP20 "docsis2.0:"
1162 #define PACKETCABLE_CM_CAP30 "docsis3.0:"
1164 #define PACKETCABLE_CCC_I05 1
1165 #define PACKETCABLE_CCC_DRAFT5 2
1166 #define PACKETCABLE_CCC_RFC_3495 3
1168 static const enum_val_t pkt_ccc_protocol_versions[] = {
1169 { "ccc_i05", "PKT-SP-PROV-I05-021127", PACKETCABLE_CCC_I05 },
1170 { "ccc_draft_5", "IETF Draft 5", PACKETCABLE_CCC_DRAFT5 },
1171 { "rfc_3495", "RFC 3495", PACKETCABLE_CCC_RFC_3495 },
1172 { NULL, NULL, 0 }
1175 #define APPLE_BSDP_SERVER "AAPLBSDPC"
1176 #define APPLE_BSDP_CLIENT "AAPLBSDPC/"
1178 #define CISCO_VCID "cisco"
1180 #define AEROHIVE_VCID "AEROHIVE"
1182 static int pkt_ccc_protocol_version = PACKETCABLE_CCC_RFC_3495;
1183 static unsigned pkt_ccc_option = 122;
1185 static void dissect_docsis_cm_cap(packet_info *pinfo, proto_tree *v_tree, tvbuff_t *tvb,
1186 int voff, int len, bool opt125);
1188 #define ARUBA_INSTANT_AP "ArubaInstantAP"
1189 #define ARUBA_AP "ArubaAP"
1191 #define OPT53_DISCOVER "Discover"
1192 /* https://www.iana.org/assignments/bootp-dhcp-parameters */
1193 static const value_string opt53_text[] = {
1194 { 1, OPT53_DISCOVER },
1195 { 2, "Offer" },
1196 { 3, "Request" },
1197 { 4, "Decline" },
1198 { 5, "ACK" },
1199 { 6, "NAK" },
1200 { 7, "Release" },
1201 { 8, "Inform" },
1202 { 9, "Force Renew" },
1203 { 10, "Lease query" }, /* RFC4388 */
1204 { 11, "Lease Unassigned" }, /* RFC4388 */
1205 { 12, "Lease Unknown" }, /* RFC4388 */
1206 { 13, "Lease Active" }, /* RFC4388 */
1207 { 14, "Bulk Lease Query" }, /* RFC6926 */
1208 { 15, "Lease Query Done" }, /* RFC6926 */
1209 { 16, "Active LeaseQuery" }, /* RFC7724 */
1210 { 17, "Lease Query Status" }, /* RFC7724 */
1211 { 18, "TLS" }, /* RFC7724 */
1212 { 0, NULL }
1215 /* DHCP Authentication protocols */
1216 #define AUTHEN_PROTO_CONFIG_TOKEN 0
1217 #define AUTHEN_PROTO_DELAYED_AUTHEN 1
1219 /* DHCP Authentication algorithms for delayed authentication */
1220 #define AUTHEN_DELAYED_ALGO_HMAC_MD5 1
1222 /* DHCP Authentication Replay Detection Methods */
1223 #define AUTHEN_RDM_MONOTONIC_COUNTER 0x00
1225 /* DHCP Option Overload (option code 52) */
1226 #define OPT_OVERLOAD_FILE 1
1227 #define OPT_OVERLOAD_SNAME 2
1228 #define OPT_OVERLOAD_BOTH 3
1230 /* Server name and boot file offsets and lengths */
1231 #define SERVER_NAME_OFFSET 44
1232 #define SERVER_NAME_LEN 64
1233 #define FILE_NAME_OFFSET 108
1234 #define FILE_NAME_LEN 128
1235 #define VENDOR_INFO_OFFSET 236
1237 static const value_string dhcp_nbnt_vals[] = {
1238 {0x1, "B-node" },
1239 {0x2, "P-node" },
1240 {0x4, "M-node" },
1241 {0x8, "H-node" },
1242 {0, NULL }
1246 * There is confusion around some Client Architecture IDs: RFC 4578 section 2.1
1247 * lists *requested* architecture IDs, however the actual assigned IDs
1248 * (https://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml#processor-architecture)
1249 * differ. Specifically,
1251 * EFI Byte Code (EFI BC, EBC) was 7 in RFC 4578, but is assigned 9 by IETF.
1252 * EFI x64 was 9 in RFC 4578, but is assigned 7 by IETF.
1254 * For confirmation, refer to RFC erratum 4624:
1255 * https://www.rfc-editor.org/errata/eid4624
1257 static const value_string dhcp_client_arch[] = {
1258 { 0x0000, "IA x86 PC" },
1259 { 0x0001, "NEC/PC98" },
1260 { 0x0002, "IA64 PC" },
1261 { 0x0003, "DEC Alpha" },
1262 { 0x0004, "ArcX86" },
1263 { 0x0005, "Intel Lean Client" },
1264 { 0x0006, "EFI IA32" },
1265 { 0x0007, "EFI x64" }, /* *Not* EFI BC. See comment above. */
1266 { 0x0008, "EFI Xscale" },
1267 { 0x0009, "EFI BC" }, /* *Not* EFI x64. See comment above. */
1268 { 0x000a, "ARM 32-bit UEFI" },
1269 { 0x000b, "ARM 64-bit UEFI" },
1270 { 0x000c, "PowerPC Open Firmware" },
1271 { 0x000d, "PowerPC ePAPR" },
1272 { 0x000e, "POWER OPAL v3" },
1273 { 0x000f, "x86 UEFI HTTP" },
1274 { 0x0010, "x64 UEFI HTTP" },
1275 { 0x0011, "EBC UEFI HTTP" },
1276 { 0x0012, "ARM 32-bit UEFI HTTP" },
1277 { 0x0013, "ARM 64-bit UEFI HTTP" },
1278 { 0x0014, "PC/AT HTTP" },
1279 { 0x0015, "ARM 32-bit uboot" },
1280 { 0x0016, "ARM 64-bit uboot" },
1281 { 0x0017, "ARM 32-bit uboot HTTP" },
1282 { 0x0018, "ARM 64-bit uboot HTTP" },
1283 { 0x0019, "RISC-V 32-bit UEFI" },
1284 { 0x001a, "RISC-V 32-bit UEFI HTTP" },
1285 { 0x001b, "RISC-V 64-bit UEFI" },
1286 { 0x001c, "RISC-V 64-bit UEFI HTTP" },
1287 { 0x001d, "RISC-V 128-bit UEFI" },
1288 { 0x001e, "RISC-V 128-bit UEFI HTTP" },
1289 { 0x001f, "s390 Basic" },
1290 { 0x0020, "s390 Extended" },
1291 { 0, NULL }
1294 static const value_string opt_overload_vals[] = {
1295 { OPT_OVERLOAD_FILE, "Boot file name holds options", },
1296 { OPT_OVERLOAD_SNAME, "Server host name holds options", },
1297 { OPT_OVERLOAD_BOTH, "Boot file and server host names hold options" },
1298 { 0, NULL } };
1300 static const value_string slpda_vals[] = {
1301 {0x00, "Dynamic Discovery" },
1302 {0x01, "Static Discovery" },
1303 {0x80, "Backwards compatibility" },
1304 {0, NULL } };
1306 static const value_string slp_scope_vals[] = {
1307 {0x00, "Preferred Scope" },
1308 {0x01, "Mandatory Scope" },
1309 {0, NULL } };
1311 static const value_string authen_protocol_vals[] = {
1312 {AUTHEN_PROTO_CONFIG_TOKEN, "configuration token" },
1313 {AUTHEN_PROTO_DELAYED_AUTHEN, "delayed authentication" },
1314 {0, NULL } };
1316 static const value_string authen_da_algo_vals[] = {
1317 {AUTHEN_DELAYED_ALGO_HMAC_MD5, "HMAC_MD5" },
1318 {0, NULL } };
1320 static const value_string authen_rdm_vals[] = {
1321 {AUTHEN_RDM_MONOTONIC_COUNTER, "Monotonically-increasing counter" },
1322 {0, NULL } };
1324 static const value_string cl_dss_id_type_vals[] = {
1325 {1, "Primary DSS_ID" },
1326 {2, "Secondary DSS_ID" },
1327 {0, NULL }
1330 static const value_string sip_server_enc_vals[] = {
1331 {0, "Fully Qualified Domain Name" },
1332 {1, "IPv4 Address" },
1333 {0, NULL }
1336 static const value_string o43_bsdp_boot_image_install_vals[] = {
1337 { 0, "non-install" },
1338 { 1, "install" },
1339 { 0, NULL }
1342 static const value_string o43_bsdp_boot_image_kind_vals[] = {
1343 { 0, "Mac OS 9" },
1344 { 1, "Mac OS X" },
1345 { 2, "Mac OS X Server" },
1346 { 3, "Hardware Diagnostics" },
1347 { 0, NULL }
1350 static const value_string o43_bsdp_message_type_vals[] = {
1351 { 1, "LIST" },
1352 { 2, "SELECT" },
1353 { 3, "FAILED" },
1354 { 0, NULL }
1357 static const string_string option242_avaya_phystat_vals[] = {
1358 { "0", "Disabled" },
1359 { "1", "Auto" },
1360 { "2", "10Mbps half" },
1361 { "3", "10Mbps full" },
1362 { "4", "100Mbps half" },
1363 { "5", "100Mbps full" },
1364 { "6", "1000Mbps full" },
1365 { NULL, NULL }
1368 static const string_string option242_avaya_l2q_vals[] = {
1369 { "0", "Auto" },
1370 { "1", "Enabled" },
1371 { "2", "Disabled" },
1372 { NULL, NULL }
1375 static const string_string option242_avaya_dot1x_vals[] = {
1376 { "0", "With PAE pass-through" },
1377 { "1", "With PAE pass-through and proxy Logoff" },
1378 { "2", "Without PAE pass-through or proxy Logoff" },
1379 { NULL, NULL }
1382 static const string_string option242_avaya_icmpdu_vals[] = {
1383 { "0", "No ICMP Destination Unreachable messages" },
1384 { "1", "Send limited Port Unreachable messages" },
1385 { "2", "Send Protocol and Port Unreachable messages" },
1386 { NULL, NULL }
1389 static const string_string option242_avaya_icmpred_vals[] = {
1390 { "0", "Ignore ICMP Redirect messages" },
1391 { "1", "Process ICMP Redirect messages" },
1392 { NULL, NULL }
1395 static const string_string option242_avaya_loglocal_vals[] = {
1396 { "0", "Disabled" },
1397 { "1", "Emergency" },
1398 { "2", "Alerts" },
1399 { "3", "Critical" },
1400 { "4", "Errors" },
1401 { "5", "Warnings" },
1402 { "6", "Notices" },
1403 { "7", "Information" },
1404 { "8", "Debug" },
1405 { NULL, NULL }
1408 static const string_string option242_avaya_procstat_vals[] = {
1409 { "0", "All administrative options" },
1410 { "1", "Only view administrative options" },
1411 { NULL, NULL }
1414 static const string_string option242_avaya_static_vals[] = {
1415 { "0", "Static programming never overrides call server (DHCP) or call server administered data" },
1416 { "1", "Static programming overrides only file server administered data" },
1417 { "2", "Static programming overrides only call server administered data" },
1418 { "3", "Static programming overrides both file server- and call server-administered data" },
1419 { NULL, NULL }
1422 /* dhcp options administration */
1423 #define DHCP_OPT_NUM 256
1425 /* All of the options that have a "basic" type that can be handled by dissect_dhcpopt_basic_type() */
1426 #define DHCP_OPTION_BASICTYPE_RANGE "1-20,22-32,34-42,44-51,53-54,56-59,62,64-76,86-87,91-92,100-101,108,112-113,116,118,136-138,142,147-148,150,153,156-157,161,209-211,252"
1428 /* Re-define structure. Values to be updated by dhcp_init_protocol */
1429 static struct opt_info dhcp_opt[DHCP_OPT_NUM];
1431 static const struct opt_info default_dhcp_opt[DHCP_OPT_NUM] = {
1432 /* 0 */ { "Padding", none, &hf_dhcp_option_padding },
1433 /* 1 */ { "Subnet Mask", ipv4, &hf_dhcp_option_subnet_mask },
1434 /* 2 */ { "Time Offset", time_in_s_secs, &hf_dhcp_option_time_offset },
1435 /* 3 */ { "Router", ipv4_list, &hf_dhcp_option_router },
1436 /* 4 */ { "Time Server", ipv4_list, &hf_dhcp_option_time_server },
1437 /* 5 */ { "Name Server", ipv4_list, &hf_dhcp_option_name_server },
1438 /* 6 */ { "Domain Name Server", ipv4_list, &hf_dhcp_option_domain_name_server },
1439 /* 7 */ { "Log Server", ipv4_list, &hf_dhcp_option_log_server },
1440 /* 8 */ { "Quotes Server", ipv4_list, &hf_dhcp_option_quotes_server },
1441 /* 9 */ { "LPR Server", ipv4_list, &hf_dhcp_option_lpr_server },
1442 /* 10 */ { "Impress Server", ipv4_list, &hf_dhcp_option_impress_server },
1443 /* 11 */ { "Resource Location Server", ipv4_list, &hf_dhcp_option_resource_location_server },
1444 /* 12 */ { "Host Name", string, &hf_dhcp_option_hostname },
1445 /* 13 */ { "Boot File Size", val_u_short, &hf_dhcp_option_boot_file_size },
1446 /* 14 */ { "Merit Dump File", string, &hf_dhcp_option_merit_dump_file },
1447 /* 15 */ { "Domain Name", string, &hf_dhcp_option_domain_name },
1448 /* 16 */ { "Swap Server", ipv4, &hf_dhcp_option_swap_server },
1449 /* 17 */ { "Root Path", string, &hf_dhcp_option_root_path },
1450 /* 18 */ { "Extensions Path", string, &hf_dhcp_option_extension_path },
1451 /* 19 */ { "IP Forwarding", val_boolean, &hf_dhcp_option_ip_forwarding },
1452 /* 20 */ { "Non-Local Source Routing", val_boolean, &hf_dhcp_option_non_local_source_routing },
1453 /* 21 */ { "Policy Filter", special, NULL },
1454 /* 22 */ { "Maximum Datagram Reassembly Size", val_u_short, &hf_dhcp_option_max_datagram_reassembly_size },
1455 /* 23 */ { "Default IP Time-to-Live", val_u_byte, &hf_dhcp_option_default_ip_ttl },
1456 /* 24 */ { "Path MTU Aging Timeout", time_in_u_secs, &hf_dhcp_option_path_mtu_aging_timeout },
1457 /* 25 */ { "Path MTU Plateau Table", val_u_short_list, &hf_dhcp_option_path_mtu_plateau_table_item },
1458 /* 26 */ { "Interface MTU", val_u_short, &hf_dhcp_option_interface_mtu },
1459 /* 27 */ { "All Subnets are Local", val_boolean, &hf_dhcp_option_all_subnets_are_local },
1460 /* 28 */ { "Broadcast Address", ipv4, &hf_dhcp_option_broadcast_address },
1461 /* 29 */ { "Perform Mask Discovery", val_boolean, &hf_dhcp_option_perform_mask_discovery },
1462 /* 30 */ { "Mask Supplier", val_boolean, &hf_dhcp_option_mask_supplier },
1463 /* 31 */ { "Perform Router Discover", val_boolean, &hf_dhcp_option_perform_router_discover },
1464 /* 32 */ { "Router Solicitation Address", ipv4, &hf_dhcp_option_router_solicitation_address },
1465 /* 33 */ { "Static Route", special, NULL },
1466 /* 34 */ { "Trailer Encapsulation", val_boolean, &hf_dhcp_option_trailer_encapsulation },
1467 /* 35 */ { "ARP Cache Timeout", time_in_u_secs, &hf_dhcp_option_arp_cache_timeout },
1468 /* 36 */ { "Ethernet Encapsulation", val_boolean, &hf_dhcp_option_ethernet_encapsulation },
1469 /* 37 */ { "TCP Default TTL", val_u_byte, &hf_dhcp_option_tcp_default_ttl },
1470 /* 38 */ { "TCP Keepalive Interval", time_in_u_secs, &hf_dhcp_option_tcp_keepalive_interval },
1471 /* 39 */ { "TCP Keepalive Garbage", val_boolean, &hf_dhcp_option_tcp_keepalive_garbage },
1472 /* 40 */ { "Network Information Service Domain", string, &hf_dhcp_option_nis_domain },
1473 /* 41 */ { "Network Information Service Servers", ipv4_list, &hf_dhcp_option_nis_server },
1474 /* 42 */ { "Network Time Protocol Servers", ipv4_list, &hf_dhcp_option_ntp_server },
1475 /* 43 */ { "Vendor-Specific Information", special, NULL },
1476 /* 44 */ { "NetBIOS over TCP/IP Name Server", ipv4_list, &hf_dhcp_option_netbios_over_tcpip_name_server },
1477 /* 45 */ { "NetBIOS over TCP/IP Datagram Distribution Name Server", ipv4_list, &hf_dhcp_option_netbios_over_tcpip_dd_name_server },
1478 /* 46 */ { "NetBIOS over TCP/IP Node Type", val_u_byte, &hf_dhcp_option_netbios_over_tcpip_node_type },
1479 /* 47 */ { "NetBIOS over TCP/IP Scope", string, &hf_dhcp_option_netbios_over_tcpip_scope },
1480 /* 48 */ { "X Window System Font Server", ipv4_list, &hf_dhcp_option_xwindows_system_font_server },
1481 /* 49 */ { "X Window System Display Manager", ipv4_list, &hf_dhcp_option_xwindows_system_display_manager },
1482 /* 50 */ { "Requested IP Address", ipv4, &hf_dhcp_option_requested_ip_address },
1483 /* 51 */ { "IP Address Lease Time", time_in_u_secs, &hf_dhcp_option_ip_address_lease_time },
1484 /* 52 */ { "Option Overload", special, &hf_dhcp_option_option_overload },
1485 /* 53 */ { "DHCP Message Type", val_u_byte, &hf_dhcp_option_dhcp },
1486 /* 54 */ { "DHCP Server Identifier", ipv4, &hf_dhcp_option_dhcp_server_id },
1487 /* 55 */ { "Parameter Request List", special, &hf_dhcp_option_parameter_request_list_item },
1488 /* 56 */ { "Message", string, &hf_dhcp_option_message },
1489 /* 57 */ { "Maximum DHCP Message Size", val_u_short, &hf_dhcp_option_dhcp_max_message_size },
1490 /* 58 */ { "Renewal Time Value", time_in_u_secs, &hf_dhcp_option_renewal_time_value },
1491 /* 59 */ { "Rebinding Time Value", time_in_u_secs, &hf_dhcp_option_rebinding_time_value },
1492 /* 60 */ { "Vendor class identifier", special, NULL },
1493 /* 61 */ { "Client identifier", special, NULL },
1494 /* 62 */ { "Novell/Netware IP domain", string, &hf_dhcp_option_novell_netware_ip_domain },
1495 /* 63 */ { "Novell Options", special, NULL },
1496 /* 64 */ { "Network Information Service+ Domain", string, &hf_dhcp_option_nis_plus_domain },
1497 /* 65 */ { "Network Information Service+ Servers", ipv4_list, &hf_dhcp_option_nis_plus_server },
1498 /* 66 */ { "TFTP Server Name", string, &hf_dhcp_option_tftp_server_name },
1499 /* 67 */ { "Bootfile name", string, &hf_dhcp_option_bootfile_name },
1500 /* 68 */ { "Mobile IP Home Agent", ipv4_list, &hf_dhcp_option_mobile_ip_home_agent },
1501 /* 69 */ { "SMTP Server", ipv4_list, &hf_dhcp_option_smtp_server },
1502 /* 70 */ { "POP3 Server", ipv4_list, &hf_dhcp_option_pop3_server },
1503 /* 71 */ { "NNTP Server", ipv4_list, &hf_dhcp_option_nntp_server },
1504 /* 72 */ { "Default WWW Server", ipv4_list, &hf_dhcp_option_default_www_server },
1505 /* 73 */ { "Default Finger Server", ipv4_list, &hf_dhcp_option_default_finger_server },
1506 /* 74 */ { "Default IRC Server", ipv4_list, &hf_dhcp_option_default_irc_server },
1507 /* 75 */ { "StreetTalk Server", ipv4_list, &hf_dhcp_option_streettalk_server },
1508 /* 76 */ { "StreetTalk Directory Assistance Server", ipv4_list, &hf_dhcp_option_streettalk_da_server },
1509 /* 77 */ { "User Class Information", special, NULL },
1510 /* 78 */ { "Directory Agent Information", special, NULL },
1511 /* 79 */ { "Service Location Agent Scope", special, NULL },
1512 /* 80 */ { "Rapid commit", opaque, NULL },
1513 /* 81 */ { "Client Fully Qualified Domain Name", special, NULL},
1514 /* 82 */ { "Agent Information Option", special, NULL},
1515 /* 83 */ { "iSNS", opaque, NULL },
1516 /* 84 */ { "Removed/Unassigned", opaque, NULL },
1517 /* 85 */ { "Novell Directory Services Servers", special, NULL},
1518 /* 86 */ { "Novell Directory Services Tree Name", string, &hf_dhcp_option_novell_ds_tree_name },
1519 /* 87 */ { "Novell Directory Services Context", string, &hf_dhcp_option_novell_ds_context },
1520 /* 88 */ { "BCMCS Controller Domain Name [TODO:RFC4280]", opaque, NULL },
1521 /* 89 */ { "BCMCS Controller IPv4 address [TODO:RFC4280]", opaque, NULL },
1522 /* 90 */ { "Authentication", special, NULL},
1523 /* 91 */ { "Client last transaction time", time_in_u_secs, &hf_dhcp_option_client_last_transaction_time },
1524 /* 92 */ { "Associated IP option", ipv4_list, &hf_dhcp_option_associated_ip_option },
1525 /* 93 */ { "Client System Architecture", special, NULL},
1526 /* 94 */ { "Client Network Device Interface", special, NULL},
1527 /* 95 */ { "LDAP [TODO:RFC3679]", opaque, NULL },
1528 /* 96 */ { "Removed/Unassigned", opaque, NULL },
1529 /* 97 */ { "UUID/GUID-based Client Identifier", special, NULL},
1530 /* 98 */ { "Open Group's User Authentication [TODO:RFC2485]", opaque, NULL },
1531 /* 99 */ { "Civic Addresses Configuration", special, NULL},
1532 /* 100 */ { "PCode", string, &hf_dhcp_option_tz_pcode },
1533 /* 101 */ { "TCode", string, &hf_dhcp_option_tz_tcode },
1534 /* 102 */ { "Removed/unassigned", opaque, NULL },
1535 /* 103 */ { "Removed/unassigned", opaque, NULL },
1536 /* 104 */ { "Removed/unassigned", opaque, NULL },
1537 /* 105 */ { "Removed/unassigned", opaque, NULL },
1538 /* 106 */ { "Removed/unassigned", opaque, NULL },
1539 /* 107 */ { "Removed/unassigned", opaque, NULL },
1540 /* 108 */ { "IPv6-Only Preferred", time_in_u_secs, &hf_dhcp_option_ipv6_only_preferred_wait_time },
1541 /* 109 */ { "Unassigned", opaque, NULL },
1542 /* 110 */ { "Removed/Unassigned", opaque, NULL },
1543 /* 111 */ { "Unassigned", opaque, NULL },
1544 /* 112 */ { "NetInfo Parent Server Address", ipv4_list, &hf_dhcp_option_netinfo_parent_server_address },
1545 /* 113 */ { "NetInfo Parent Server Tag", string, &hf_dhcp_option_netinfo_parent_server_tag },
1546 /* 114 */ { "DHCP Captive-Portal", special, NULL },
1547 /* 115 */ { "Removed/Unassigned", opaque, NULL },
1548 /* 116 */ { "DHCP Auto-Configuration", val_u_byte, &hf_dhcp_option_dhcp_auto_configuration },
1549 /* 117 */ { "Name Service Search", special, NULL },
1550 /* 118 */ { "Subnet Selection Option", ipv4_list, &hf_dhcp_option_subnet_selection_option },
1551 /* 119 */ { "Domain Search", special, NULL },
1552 /* 120 */ { "SIP Servers", special, NULL },
1553 /* 121 */ { "Classless Static Route", special, NULL},
1554 /* 122 */ { "CableLabs Client Configuration [TODO:RFC3495]", opaque, NULL },
1555 /* 123 */ { "Coordinate-based Location Configuration", special, NULL},
1556 /* 124 */ { "V-I Vendor Class", special, NULL},
1557 /* 125 */ { "V-I Vendor-specific Information", special, NULL},
1558 /* 126 */ { "Removed/Unassigned", opaque, NULL },
1559 /* 127 */ { "Removed/Unassigned", opaque, NULL },
1560 /* 128 */ { "DOCSIS full security server IP [TODO]", opaque, NULL },
1561 /* 129 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1562 /* 130 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1563 /* 131 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1564 /* 132 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1565 /* 133 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1566 /* 134 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1567 /* 135 */ { "PXE - undefined (vendor specific)", opaque, NULL },
1568 /* 136 */ { "PANA Authentication Agent", ipv4_list, &hf_dhcp_option_pana_agent },
1569 /* 137 */ { "LoST Server Domain Name", string, &hf_dhcp_option_lost_server_domain_name },
1570 /* 138 */ { "CAPWAP Access Controllers", ipv4_list, &hf_dhcp_option_capwap_access_controller },
1571 /* 139 */ { "IPv4 Address-MoS", opaque, NULL },
1572 /* 140 */ { "IPv4 FQDN-MoS", opaque, NULL },
1573 /* 141 */ { "SIP UA Configuration Domains", opaque, NULL },
1574 /* 142 */ { "IPv4 Address ANDSF", ipv4_list, &hf_dhcp_option_andsf_server },
1575 /* 143 */ { "Zerotouch Redirect [TODO: draft-ietf-netconf-zerotouch]", opaque, NULL },
1576 /* 144 */ { "Geospatial Location [TODO:RFC6225]", opaque, NULL },
1577 /* 145 */ { "Forcerenew Nonce Capable", special, NULL },
1578 /* 146 */ { "RDNSS Selection", special, NULL },
1579 /* 147 */ { "DOTS Reference Identifier", string, &hf_dhcp_option_dots_ri },
1580 /* 148 */ { "DOTS Address", ipv4_list, &hf_dhcp_option_dots_address },
1581 /* 149 */ { "Unassigned", opaque, NULL },
1582 /* 150 */ { "TFTP Server Address", ipv4_list, &hf_dhcp_option_tftp_server_address },
1583 /* 151 */ { "Leasequery Status code", special, NULL },
1584 /* 152 */ { "Leasequery Base Time", special, NULL },
1585 /* 153 */ { "Leasequery Start Time of State", time_in_u_secs, &hf_dhcp_option_bulk_lease_start_time_of_state },
1586 /* 154 */ { "Leasequery Query Start Time", special, NULL },
1587 /* 155 */ { "Leasequery Query End Time", special, NULL },
1588 /* 156 */ { "Leasequery Dhcp State", val_u_byte, &hf_dhcp_option_bulk_lease_dhcp_state },
1589 /* 157 */ { "Leasequery Data Source", val_boolean, &hf_dhcp_option_bulk_lease_data_source },
1590 /* 158 */ { "PCP Server", special, NULL },
1591 /* 159 */ { "Portparams", special, NULL },
1592 /* 160 */ { "Unassigned (ex DHCP Captive-Portal)", special, NULL }, /* Previously assigned by [RFC7710]; known to also be used by Polycom. */
1593 /* 161 */ { "Manufacturer Usage Description", string, &hf_dhcp_option_mudurl},
1594 /* 162 */ { "Unassigned", opaque, NULL },
1595 /* 163 */ { "Unassigned", opaque, NULL },
1596 /* 164 */ { "Unassigned", opaque, NULL },
1597 /* 165 */ { "Unassigned", opaque, NULL },
1598 /* 166 */ { "Unassigned", opaque, NULL },
1599 /* 167 */ { "Unassigned", opaque, NULL },
1600 /* 168 */ { "Unassigned", opaque, NULL },
1601 /* 169 */ { "Unassigned", opaque, NULL },
1602 /* 170 */ { "Unassigned", opaque, NULL },
1603 /* 171 */ { "Unassigned", opaque, NULL },
1604 /* 172 */ { "Unassigned", opaque, NULL },
1605 /* 173 */ { "Unassigned", opaque, NULL },
1606 /* 174 */ { "Unassigned", opaque, NULL },
1607 /* 175 */ { "Etherboot", opaque, NULL },
1608 /* 176 */ { "IP Telephone", opaque, NULL },
1609 /* 177 */ { "Etherboot", opaque, NULL },
1610 /* 178 */ { "Unassigned", opaque, NULL },
1611 /* 179 */ { "Unassigned", opaque, NULL },
1612 /* 180 */ { "Unassigned", opaque, NULL },
1613 /* 181 */ { "Unassigned", opaque, NULL },
1614 /* 182 */ { "Unassigned", opaque, NULL },
1615 /* 183 */ { "Unassigned", opaque, NULL },
1616 /* 184 */ { "Unassigned", opaque, NULL },
1617 /* 185 */ { "Unassigned", opaque, NULL },
1618 /* 186 */ { "Unassigned", opaque, NULL },
1619 /* 187 */ { "Unassigned", opaque, NULL },
1620 /* 188 */ { "Unassigned", opaque, NULL },
1621 /* 189 */ { "Unassigned", opaque, NULL },
1622 /* 190 */ { "Unassigned", opaque, NULL },
1623 /* 191 */ { "Unassigned", opaque, NULL },
1624 /* 192 */ { "Unassigned", opaque, NULL },
1625 /* 193 */ { "Unassigned", opaque, NULL },
1626 /* 194 */ { "Unassigned", opaque, NULL },
1627 /* 195 */ { "Unassigned", opaque, NULL },
1628 /* 196 */ { "Unassigned", opaque, NULL },
1629 /* 197 */ { "Unassigned", opaque, NULL },
1630 /* 198 */ { "Unassigned", opaque, NULL },
1631 /* 199 */ { "Unassigned", opaque, NULL },
1632 /* 200 */ { "Unassigned", opaque, NULL },
1633 /* 201 */ { "Unassigned", opaque, NULL },
1634 /* 202 */ { "Unassigned", opaque, NULL },
1635 /* 203 */ { "Unassigned", opaque, NULL },
1636 /* 204 */ { "Unassigned", opaque, NULL },
1637 /* 205 */ { "Unassigned", opaque, NULL },
1638 /* 206 */ { "Unassigned", opaque, NULL },
1639 /* 207 */ { "Unassigned", opaque, NULL },
1640 /* 208 */ { "PXELINUX Magic", opaque, NULL },
1641 /* 209 */ { "PXE Configuration file", string, &hf_dhcp_option_pxe_config_file },
1642 /* 210 */ { "PXE Path Prefix", string, &hf_dhcp_option_pxe_path_prefix },
1643 /* 211 */ { "Reboot Time", time_in_u_secs, &hf_dhcp_option_pxe_reboot_time },
1644 /* 212 */ { "6RD", opaque, NULL },
1645 /* 213 */ { "V4 Access Domain", opaque, NULL },
1646 /* 214 */ { "Unassigned", opaque, NULL },
1647 /* 215 */ { "Unassigned", opaque, NULL },
1648 /* 216 */ { "Unassigned", opaque, NULL },
1649 /* 217 */ { "Unassigned", opaque, NULL },
1650 /* 218 */ { "Unassigned", opaque, NULL },
1651 /* 219 */ { "Unassigned", opaque, NULL },
1652 /* 220 */ { "Subnet Allocation", opaque, NULL },
1653 /* 221 */ { "Virtual Subnet Selection", opaque, NULL },
1654 /* 222 */ { "Unassigned", opaque, NULL },
1655 /* 223 */ { "Unassigned", opaque, NULL },
1656 /* 224 */ { "Private", opaque, NULL },
1657 /* 225 */ { "Private", opaque, NULL },
1658 /* 226 */ { "Private", opaque, NULL },
1659 /* 227 */ { "Private", opaque, NULL },
1660 /* 228 */ { "Private", opaque, NULL },
1661 /* 229 */ { "Private", opaque, NULL },
1662 /* 230 */ { "Private", opaque, NULL },
1663 /* 231 */ { "Private", opaque, NULL },
1664 /* 232 */ { "Private", opaque, NULL },
1665 /* 233 */ { "Private", opaque, NULL },
1666 /* 234 */ { "Private", opaque, NULL },
1667 /* 235 */ { "Private", opaque, NULL },
1668 /* 236 */ { "Private", opaque, NULL },
1669 /* 237 */ { "Private", opaque, NULL },
1670 /* 238 */ { "Private", opaque, NULL },
1671 /* 239 */ { "Private", opaque, NULL },
1672 /* 240 */ { "Private", opaque, NULL },
1673 /* 241 */ { "Private", opaque, NULL },
1674 /* 242 */ { "Private/Avaya IP Telephone", special, NULL },
1675 /* 243 */ { "Private", opaque, NULL },
1676 /* 244 */ { "Private", opaque, NULL },
1677 /* 245 */ { "Private", opaque, NULL },
1678 /* 246 */ { "Private", opaque, NULL },
1679 /* 247 */ { "Private", opaque, NULL },
1680 /* 248 */ { "Private", opaque, NULL },
1681 /* 249 */ { "Private/Classless Static Route (Microsoft)", special, NULL},
1682 /* 250 */ { "Private", opaque, NULL },
1683 /* 251 */ { "Private", opaque, NULL },
1684 /* 252 */ { "Private/Proxy autodiscovery", string, &hf_dhcp_option_private_proxy_autodiscovery },
1685 /* 253 */ { "Private", opaque, NULL },
1686 /* 254 */ { "Private", opaque, NULL },
1687 /* 255 */ { "End", opaque, NULL }
1690 static void
1691 dhcp_time_in_s_secs_fmt(char *s, uint32_t v)
1693 /* Only used by option 2 Time Offset, which is deprecated. */
1694 char* secs_str = signed_time_secs_to_str(NULL, (int32_t)v);
1695 snprintf(s, ITEM_LABEL_LENGTH, "%s (%d)", secs_str, (int32_t)v);
1696 wmem_free(NULL, secs_str);
1699 static void
1700 dhcp_time_in_u_secs_fmt(char *s, uint32_t v)
1702 /* RFC 2131: 3.3 Interpretation and representation of time values */
1703 if (v != 0xffffffff) {
1704 char* secs_str = unsigned_time_secs_to_str(NULL, v);
1705 snprintf(s, ITEM_LABEL_LENGTH, "%s (%d)", secs_str, v);
1706 wmem_free(NULL, secs_str);
1707 } else {
1708 snprintf(s, ITEM_LABEL_LENGTH, "infinity (%d)", v);
1712 /*-------------------------------------
1713 * UAT for BOOTP
1714 *-------------------------------------
1716 /* UAT entry structure. */
1717 typedef struct {
1718 unsigned opt;
1719 char *text;
1720 enum field_type ftype;
1722 } uat_dhcp_record_t;
1724 static uat_dhcp_record_t *uat_dhcp_records;
1725 static uat_t *dhcp_uat;
1726 static unsigned num_dhcp_records_uat;
1727 static wmem_list_t *saved_uat_opts; /* List of previous options from UAT to "free" from dissection */
1729 static void* uat_dhcp_record_copy_cb(void* n, const void* o, size_t siz _U_) {
1730 uat_dhcp_record_t* new_record = (uat_dhcp_record_t *)n;
1731 const uat_dhcp_record_t* old_record = (const uat_dhcp_record_t *)o;
1733 new_record->text = g_strdup(old_record->text);
1735 return new_record;
1738 static bool uat_dhcp_record_update_cb(void* r, char** err) {
1739 uat_dhcp_record_t* rec = (uat_dhcp_record_t *)r;
1741 if ((rec->opt == 0) || (rec->opt >=DHCP_OPT_NUM-1)) {
1742 *err = ws_strdup_printf("Option must be between 1 and %d", DHCP_OPT_NUM-2);
1743 return false;
1745 return true;
1748 static void uat_dhcp_record_free_cb(void*r) {
1749 uat_dhcp_record_t* rec = (uat_dhcp_record_t *)r;
1751 g_free(rec->text);
1754 UAT_DEC_CB_DEF(uat_dhcp_records, opt, uat_dhcp_record_t)
1755 UAT_CSTRING_CB_DEF(uat_dhcp_records, text, uat_dhcp_record_t)
1756 UAT_VS_DEF(uat_dhcp_records, ftype, uat_dhcp_record_t, enum field_type, special, "string")
1759 static const struct opt_info* dhcp_get_opt(unsigned int idx)
1761 if(idx>=DHCP_OPT_NUM)
1762 return NULL;
1764 return &dhcp_opt[idx];
1767 static const char *
1768 dhcp_get_opt_text(unsigned int idx)
1770 if(idx>=DHCP_OPT_NUM)
1771 return "unknown";
1772 return dhcp_opt[idx].text;
1775 struct basic_types_hfs {
1776 int* bytes;
1777 int* ipv4;
1778 int* ipv4_list;
1779 int* string;
1780 int* val_boolean;
1781 int* val_u_byte;
1782 int* val_u_short;
1783 int* val_u_short_list;
1784 int* val_u_long;
1785 int* time_in_s_secs;
1786 int* time_in_u_secs;
1789 /* Handle "basic" datatypes adding to a tree */
1790 static int
1791 dhcp_handle_basic_types(packet_info *pinfo, proto_tree *tree, proto_item *item, tvbuff_t *tvb,
1792 enum field_type ftype, int offset, int total_len,
1793 int *hf, const struct basic_types_hfs* hf_default)
1795 int i, left;
1796 int consumed = 0;
1798 switch (ftype) {
1799 case bytes:
1800 if (hf != NULL)
1801 proto_tree_add_item(tree, *hf, tvb, offset, total_len, ENC_BIG_ENDIAN);
1802 else if (hf_default->bytes != NULL)
1803 proto_tree_add_item(tree, *hf_default->bytes, tvb, offset, total_len, ENC_BIG_ENDIAN);
1804 consumed = total_len;
1805 break;
1807 case ipv4:
1808 if (total_len != 4) {
1809 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 4");
1810 break;
1813 if (hf != NULL)
1814 proto_tree_add_item(tree, *hf, tvb, offset, 4, ENC_BIG_ENDIAN);
1815 else if (hf_default->ipv4 != NULL)
1816 proto_tree_add_item(tree, *hf_default->ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
1818 /* Show IP address in root of option */
1819 proto_item_append_text(tree, " (%s)", tvb_ip_to_str(pinfo->pool, tvb, offset));
1820 consumed = 4;
1821 break;
1823 case ipv4_list:
1824 for (i = offset, left = total_len; left > 0; i += 4, left -= 4) {
1825 if (left < 4) {
1826 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "Option length isn't a multiple of 4");
1827 break;
1830 if (hf != NULL)
1831 proto_tree_add_item(tree, *hf, tvb, i, 4, ENC_BIG_ENDIAN);
1832 else if (hf_default->ipv4_list != NULL)
1833 proto_tree_add_item(tree, *hf_default->ipv4_list, tvb, i, 4, ENC_BIG_ENDIAN);
1834 consumed += 4;
1837 break;
1839 case string:
1840 if (hf != NULL)
1841 proto_tree_add_item(tree, *hf, tvb, offset, total_len, ENC_BIG_ENDIAN);
1842 else if (hf_default->string != NULL)
1843 proto_tree_add_item(tree, *hf_default->string, tvb, offset, total_len, ENC_BIG_ENDIAN);
1844 consumed = total_len;
1845 break;
1847 case val_boolean:
1848 if (total_len != 1) {
1849 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 1");
1850 break;
1853 if (hf != NULL)
1854 proto_tree_add_item(tree, *hf, tvb, offset, 1, ENC_BIG_ENDIAN);
1855 else if (hf_default->val_boolean != NULL)
1856 proto_tree_add_item(tree, *hf_default->val_boolean, tvb, offset, 1, ENC_BIG_ENDIAN);
1857 consumed = 1;
1858 break;
1860 case val_u_byte:
1861 if (total_len != 1) {
1862 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 1");
1863 break;
1866 if (hf != NULL)
1867 proto_tree_add_item(tree, *hf, tvb, offset, 1, ENC_BIG_ENDIAN);
1868 else if (hf_default->val_u_byte != NULL)
1869 proto_tree_add_item(tree, *hf_default->val_u_byte, tvb, offset, 1, ENC_BIG_ENDIAN);
1870 consumed = 1;
1871 break;
1873 case val_u_short:
1874 if (total_len != 2) {
1875 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 2");
1876 break;
1879 if (hf != NULL)
1880 proto_tree_add_item(tree, *hf, tvb, offset, 2, ENC_BIG_ENDIAN);
1881 else if (hf_default->val_u_short != NULL)
1882 proto_tree_add_item(tree, *hf_default->val_u_short, tvb, offset, 2, ENC_BIG_ENDIAN);
1883 consumed = 2;
1884 break;
1886 case val_u_le_short:
1887 if (total_len != 2) {
1888 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 2");
1889 break;
1892 if (hf != NULL)
1893 proto_tree_add_item(tree, *hf, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1894 else if (hf_default->val_u_short != NULL)
1895 proto_tree_add_item(tree, *hf_default->val_u_short, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1896 consumed = 2;
1897 break;
1899 case val_u_short_list:
1900 for (i = offset, left = total_len; left > 0; i += 2, left -= 2) {
1901 if (left < 2) {
1902 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "Option length isn't a multiple of 2");
1903 break;
1906 if (hf != NULL)
1907 proto_tree_add_item(tree, *hf, tvb, i, 2, ENC_BIG_ENDIAN);
1908 else if (hf_default->val_u_short_list != NULL)
1909 proto_tree_add_item(tree, *hf_default->val_u_short_list, tvb, i, 2, ENC_BIG_ENDIAN);
1910 consumed += 2;
1912 break;
1914 case val_u_long:
1915 if (total_len != 4) {
1916 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 4");
1917 break;
1920 if (hf != NULL)
1921 proto_tree_add_item(tree, *hf, tvb, offset, 4, ENC_BIG_ENDIAN);
1922 else if (hf_default->val_u_long != NULL)
1923 proto_tree_add_item(tree, *hf_default->val_u_long, tvb, offset, 4, ENC_BIG_ENDIAN);
1924 consumed = 4;
1925 break;
1927 case time_in_s_secs:
1928 if (total_len != 4) {
1929 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 4");
1930 break;
1933 if (hf != NULL) {
1934 proto_tree_add_item(tree, *hf, tvb, offset, 4, ENC_BIG_ENDIAN);
1936 else if (hf_default->time_in_s_secs != NULL)
1937 proto_tree_add_item(tree, *hf_default->time_in_s_secs, tvb, offset, 4, ENC_BIG_ENDIAN);
1939 consumed = 4;
1940 break;
1942 case time_in_u_secs:
1943 if (total_len != 4) {
1944 expert_add_info_format(pinfo, item, &ei_dhcp_bad_length, "length isn't 4");
1945 break;
1948 if (hf != NULL) {
1949 proto_tree_add_item(tree, *hf, tvb, offset, 4, ENC_BIG_ENDIAN);
1951 else if (hf_default->time_in_u_secs != NULL)
1952 proto_tree_add_item(tree, *hf_default->time_in_u_secs, tvb, offset, 4, ENC_BIG_ENDIAN);
1953 consumed = 4;
1954 break;
1955 default:
1956 /* Ignore other field_types */
1957 break;
1960 return consumed;
1963 static int
1964 dissect_dhcpopt_basic_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
1966 const struct opt_info *opt;
1967 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
1968 static const struct basic_types_hfs default_hfs = {
1969 &hf_dhcp_option_value,
1970 &hf_dhcp_option_value_ip_address,
1971 &hf_dhcp_option_value_ip_address,
1972 &hf_dhcp_option_value_stringz,
1973 &hf_dhcp_option_value_boolean,
1974 &hf_dhcp_option_value_8,
1975 &hf_dhcp_option_value_16,
1976 &hf_dhcp_option_value_16,
1977 &hf_dhcp_option_value_u32,
1978 &hf_dhcp_option_value_s_secs,
1979 &hf_dhcp_option_value_u_secs,
1982 opt = dhcp_get_opt(option_data->option);
1983 if (opt == NULL)
1984 return 0;
1986 return dhcp_handle_basic_types(pinfo, tree, tree, tvb, opt->ftype,
1987 0, tvb_reported_length(tvb), opt->phf, &default_hfs);
1990 /* Returns the number of bytes consumed by this option. */
1991 static int
1992 dhcp_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *bp_tree, int voff,
1993 int eoff, bool first_pass, bool *at_end, const char **dhcp_type_p,
1994 const uint8_t **vendor_class_id_p, uint8_t *overload_p,
1995 wmem_map_t *rfc3396_map)
1997 const struct opt_info *opt;
1998 unsigned char code = tvb_get_uint8(tvb, voff);
1999 int optlen;
2000 int i, consumed;
2001 proto_tree *v_tree;
2002 proto_item *vti, *ti_value;
2003 tvbuff_t *option_tvb;
2004 dhcp_option_data_t option_data;
2006 /* Note overload_p is NULL inside the overloaded areas; it makes no
2007 * sense to set it again. */
2008 /* Options whose length isn't "optlen + 2". */
2009 switch (code) {
2011 case 0: /* Padding */
2012 /* check how much padding we have */
2013 for (i = voff + 1; i < eoff; i++ ) {
2014 if (tvb_get_uint8(tvb, i) != 0) {
2015 break;
2018 i = i - voff;
2019 if (!first_pass) {
2020 if (bp_tree != NULL) {
2021 vti = proto_tree_add_uint_format_value(bp_tree, hf_dhcp_option_type,
2022 tvb, voff, 1, 0, "(0) Padding");
2023 v_tree = proto_item_add_subtree(vti, ett_dhcp_option);
2024 proto_tree_add_item(v_tree, hf_dhcp_option_padding, tvb, voff, i, ENC_NA);
2027 consumed = i;
2028 return consumed;
2030 case 255: /* End Option */
2031 if (!first_pass) {
2032 if (bp_tree != NULL) {
2033 vti = proto_tree_add_uint_format_value(bp_tree, hf_dhcp_option_type,
2034 tvb, voff, 1, 0, "(255) End");
2035 v_tree = proto_item_add_subtree(vti, ett_dhcp_option);
2036 if (overload_p == NULL)
2037 proto_tree_add_item(v_tree, hf_dhcp_option_end_overload, tvb, voff, 1, ENC_BIG_ENDIAN);
2038 else
2039 proto_tree_add_item(v_tree, hf_dhcp_option_end, tvb, voff, 1, ENC_BIG_ENDIAN);
2042 *at_end = true;
2043 consumed = 1;
2044 return consumed;
2048 * Get the length of the option, and the number of bytes it
2049 * consumes (the length doesn't include the option code or
2050 * length bytes).
2052 * On the first pass, check first whether we have the length
2053 * byte, so that we don't throw an exception; if we throw an
2054 * exception in the first pass, which is only checking for options
2055 * whose values we need in order to properly dissect the packet
2056 * on the second pass, we won't actually dissect the options, so
2057 * you won't be able to see which option had the problem.
2059 if (first_pass) {
2060 if (!tvb_bytes_exist(tvb, voff+1, 1)) {
2062 * We don't have the length byte; just return 1
2063 * as the number of bytes we consumed, to count
2064 * the code byte.
2066 return 1;
2069 optlen = tvb_get_uint8(tvb, voff+1);
2070 consumed = optlen + 2;
2072 struct rfc3396_for_option_t *rfc3396_data = wmem_map_lookup(rfc3396_map, GUINT_TO_POINTER(code));
2073 if (rfc3396_data == NULL) {
2074 rfc3396_data = wmem_new0(pinfo->pool, struct rfc3396_for_option_t);
2075 wmem_map_insert(rfc3396_map, GUINT_TO_POINTER(code), rfc3396_data);
2079 * In the first pass, we don't put anything into the protocol
2080 * tree; we just check for some options we have to look at
2081 * in order to properly process the packet:
2083 * 52 (Overload) - we need this to properly dissect the
2084 * file and sname fields
2086 * 53 (DHCP message type) - if this is present, this is DHCP
2088 * 60 (Vendor class identifier) - we need this in order to
2089 * interpret the vendor-specific info
2091 * We also check, before fetching anything, to make sure we
2092 * have the entire item we're fetching, so that we don't throw
2093 * an exception.
2095 if (first_pass) {
2096 if (tvb_bytes_exist(tvb, voff+2, consumed-2)) {
2097 switch (code) {
2099 case 52:
2100 if (overload_p != NULL) {
2101 *overload_p = tvb_get_uint8(tvb, voff+2);
2103 break;
2105 case 53:
2106 *dhcp_type_p =
2107 val_to_str(tvb_get_uint8(tvb, voff+2),
2108 opt53_text,
2109 "Unknown Message Type (0x%02x)");
2110 break;
2112 case 60:
2113 *vendor_class_id_p =
2114 tvb_get_string_enc(pinfo->pool,
2115 tvb, voff+2, consumed-2, ENC_ASCII);
2116 break;
2120 rfc3396_data->total_number_of_block++;
2123 * We don't do anything else here.
2125 return consumed;
2128 /* Normal cases */
2129 opt = dhcp_get_opt(code);
2130 if (opt == NULL)
2132 /* THIS SHOULD NEVER HAPPEN!!! */
2133 return consumed;
2136 vti = proto_tree_add_uint_format_value(bp_tree, hf_dhcp_option_type,
2137 tvb, voff, consumed, code, "(%d) %s", code, opt->text);
2138 v_tree = proto_item_add_subtree(vti, ett_dhcp_option);
2139 proto_tree_add_item(v_tree, hf_dhcp_option_length, tvb, voff+1, 1, ENC_BIG_ENDIAN);
2141 ti_value = proto_tree_add_item(v_tree, hf_dhcp_option_value, tvb, voff+2, optlen, ENC_NA);
2142 proto_item_set_hidden(ti_value);
2144 /* prepare data for dissector table */
2145 option_tvb = tvb_new_subset_length(tvb, voff+2, optlen);
2146 option_data.option = code;
2147 option_data.overload = overload_p;
2148 option_data.dhcp_type = *dhcp_type_p;
2149 option_data.vendor_class_id = *vendor_class_id_p;
2151 /* RFC 3396 4 Applicability and 7 Decoding Agent Behavior both clearly
2152 * state that decoding agents MUST consider any case where an option
2153 * code is repeated as a split option and reassemble it, even for
2154 * options that are not "concatenation-requiring."
2156 * However, cf.
2157 * https://www.ietf.org/archive/id/draft-tojens-dhcp-option-concat-considerations-00.html
2158 * which notes that real world DHCP implementations do not do this, and
2159 * that, especially in the case of fixed length option types, this is
2160 * less robust than actually used approaches of intepreting the options
2161 * separately, and choosing one option while discarding others.
2163 * XXX - Perhaps we want a preference of which options to concatenate?
2165 if (rfc3396_data->total_number_of_block == 1) {
2166 if (!dissector_try_uint_with_data(dhcp_option_table, code, option_tvb, pinfo, v_tree, false, &option_data)) {
2167 /* hf_dhcp_option_value is already in tree, just make it visible */
2168 proto_item_set_visible(ti_value);
2170 } else {
2171 proto_item *ti;
2172 rfc3396_data->index_current_block++;
2173 ti = proto_tree_add_string(v_tree, hf_dhcp_option_rfc_3396_detected, tvb, voff+2, optlen,
2174 wmem_strdup_printf(pinfo->pool, "%u/%u", rfc3396_data->index_current_block, rfc3396_data->total_number_of_block));
2175 if (optlen) {
2176 if (rfc3396_data->tvb_composite == NULL) {
2177 rfc3396_data->tvb_composite = tvb_new_composite();
2179 tvb_composite_append(rfc3396_data->tvb_composite, option_tvb);
2181 if (rfc3396_data->index_current_block != rfc3396_data->total_number_of_block) {
2182 expert_add_info_format(pinfo, ti, &ei_dhcp_rfc3396_refer_last_option, "For the data, please refer to the last option %u, %u/%u", code, rfc3396_data->total_number_of_block, rfc3396_data->total_number_of_block);
2183 } else if (rfc3396_data->tvb_composite != NULL) {
2184 tvb_composite_finalize(rfc3396_data->tvb_composite);
2185 add_new_data_source(pinfo, rfc3396_data->tvb_composite, "RFC 3396 Long Option");
2186 if (!dissector_try_uint_with_data(dhcp_option_table, code, rfc3396_data->tvb_composite, pinfo, v_tree, false, &option_data)) {
2187 proto_tree_add_item(v_tree, hf_dhcp_option_value, rfc3396_data->tvb_composite, 0, tvb_reported_length(rfc3396_data->tvb_composite), ENC_NA);
2189 } else {
2190 expert_add_info_format(pinfo, ti, &ei_dhcp_bad_length, "RFC 3396 Long Option with combined length 0");
2194 return consumed;
2197 static int
2198 dissect_dhcpopt_policy_filter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2200 int offset = 0;
2202 while (tvb_reported_length_remaining(tvb, offset) >= 8) {
2203 proto_tree_add_item(tree, hf_dhcp_option_policy_filter_ip, tvb, offset, 4, ENC_BIG_ENDIAN);
2204 offset += 4;
2205 proto_tree_add_item(tree, hf_dhcp_option_policy_filter_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN);
2206 offset += 4;
2209 if (tvb_reported_length_remaining(tvb, offset) > 0) {
2210 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Option length isn't a multiple of 8");
2213 return tvb_captured_length(tvb);
2216 static int
2217 dissect_dhcpopt_static_route(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2219 int offset = 0;
2221 while (tvb_reported_length_remaining(tvb, offset) >= 8) {
2222 proto_tree_add_item(tree, hf_dhcp_option_static_route_ip, tvb, offset, 4, ENC_BIG_ENDIAN);
2223 offset += 4;
2224 proto_tree_add_item(tree, hf_dhcp_option_static_route_router, tvb, offset, 4, ENC_BIG_ENDIAN);
2225 offset += 4;
2228 if (tvb_reported_length_remaining(tvb, offset) > 0) {
2229 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Option length isn't a multiple of 8");
2232 return tvb_captured_length(tvb);
2235 typedef unsigned(*test_option_len_t)(unsigned);
2237 /* Look for 'encapsulated vendor-specific options' */
2238 static bool
2239 test_encapsulated_vendor_options(tvbuff_t *tvb, int optoff, int optend, test_option_len_t test_len)
2241 uint8_t subopt;
2242 uint8_t subopt_len;
2244 while (optoff < optend) {
2245 subopt = tvb_get_uint8(tvb, optoff);
2246 optoff++;
2248 /* Skip padding */
2249 if (subopt == 0)
2250 continue;
2251 /* We are done, skip any remaining bytes */
2252 if (subopt == 255)
2253 break;
2255 /* We expect a length byte next */
2256 if (optoff >= optend)
2257 return false;
2258 subopt_len = tvb_get_uint8(tvb, optoff);
2260 if (test_len) {
2261 unsigned expected_subopt_len = test_len(subopt);
2262 if (expected_subopt_len && expected_subopt_len != subopt_len)
2263 return false;
2265 optoff++;
2267 /* Check remaining room for suboption in option */
2268 if (optoff + subopt_len > optend)
2269 return false;
2270 optoff += subopt_len;
2272 return true;
2275 /* Note that Option 43 encapsulated vendor-specific options (RFC 2132 8.4)
2276 * treat option 0 as padding and option 255 as end of suboptions, unlike
2277 * Option 125 which does not treat them specially (RFC 3925 4).
2279 static int
2280 dissect_option43_generic_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
2281 tvbuff_t *tvb)
2283 unsigned suboptoff = 0;
2284 unsigned optend = tvb_reported_length(tvb);
2285 uint8_t subopt;
2286 uint32_t subopt_len;
2287 proto_item *item;
2288 proto_tree *sub_tree;
2290 item = proto_tree_add_item(v_tree, hf_dhcp_option43_suboption, tvb, suboptoff, 1, ENC_NA);
2291 subopt = tvb_get_uint8(tvb, suboptoff);
2293 suboptoff+=1;
2295 if (subopt == 0) {
2296 /* Padding */
2297 return suboptoff;
2300 if (subopt == 255) {
2301 /* END */
2302 /* XXX - Should there be expert info if there are more bytes? */
2303 return optend;
2306 if (suboptoff >= optend) {
2307 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
2308 "Suboption %d: no room left in option for suboption length", subopt);
2309 return optend;
2312 sub_tree = proto_item_add_subtree(item, ett_dhcp_option43_suboption);
2313 proto_tree_add_item_ret_uint(sub_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_NA, &subopt_len);
2314 suboptoff++;
2316 if (suboptoff+subopt_len > optend) {
2317 expert_add_info_format(pinfo, item, &ei_dhcp_missing_subopt_value,
2318 "Suboption %d: no room left in option for suboption value", subopt);
2319 return optend;
2322 proto_tree_add_item(sub_tree, hf_dhcp_option43_value, tvb, suboptoff, subopt_len, ENC_NA);
2323 suboptoff+= subopt_len;
2325 return suboptoff;
2329 static int
2330 dissect_dhcpopt_vendor_specific_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
2332 heur_dtbl_entry_t *hdtbl_entry;
2334 if (!dissector_try_heuristic(dhcp_vendor_info_subdissector, tvb, pinfo, tree, &hdtbl_entry, data)) {
2335 int offset = 0;
2336 if (test_encapsulated_vendor_options(tvb, offset, tvb_reported_length(tvb), NULL)) {
2337 /* Generic encapsulated options per RFC 2132 8.4 */
2338 while (tvb_reported_length_remaining(tvb, offset)) {
2339 offset += dissect_option43_generic_suboption(pinfo, proto_tree_get_parent(tree), tree, tvb_new_subset_remaining(tvb, offset));
2341 } else {
2342 /* Default Vendor-Specific Info.. display in bytes */
2343 proto_tree_add_item(tree, hf_dhcp_option43_value, tvb, offset, tvb_reported_length(tvb), ENC_NA);
2347 return tvb_captured_length(tvb);
2350 static int
2351 dissect_dhcpopt_option_overload(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
2353 int offset = 0;
2354 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
2356 if (tvb_reported_length(tvb) < 1) {
2357 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 1");
2358 return 1;
2361 proto_tree_add_item(tree, hf_dhcp_option_option_overload, tvb, offset, 1, ENC_BIG_ENDIAN);
2362 if (option_data->overload == NULL) {
2363 // Option Overload inside the overloaded fields is nonsensical
2364 expert_add_info(pinfo, tree, &ei_dhcp_opt_overload_wrong_field);
2367 return tvb_captured_length(tvb);
2370 static int
2371 dissect_dhcpopt_dhcp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
2373 uint32_t type;
2375 proto_tree_add_item_ret_uint(tree, hf_dhcp_option_dhcp, tvb, 0, 1, ENC_NA, &type);
2376 /* Show the message type name on the Message Type option, and in the protocol root */
2377 proto_item_append_text(tree, " (%s)", val_to_str(type, opt53_text, "Unknown Message Type (0x%02x)"));
2378 proto_item_append_text(proto_item_get_parent(tree), " (%s)", val_to_str(type, opt53_text, "Unknown Message Type (0x%02x)"));
2380 return tvb_captured_length(tvb);
2383 static int
2384 dissect_dhcpopt_param_request_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
2386 int offset = 0;
2387 uint8_t byte;
2389 while (tvb_reported_length_remaining(tvb, offset) > 0) {
2390 byte = tvb_get_uint8(tvb, offset);
2391 proto_tree_add_uint_format_value(tree, hf_dhcp_option_parameter_request_list_item,
2392 tvb, offset, 1, byte, "(%d) %s", byte, dhcp_get_opt_text(byte));
2393 offset++;
2396 return tvb_captured_length(tvb);
2399 static int
2400 dissect_dhcpopt_vendor_class_identifier(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
2402 heur_dtbl_entry_t *hdtbl_entry;
2405 * XXX - RFC 2132 says this is a string of octets;
2406 * should we check for non-printables?
2408 proto_tree_add_item(tree, hf_dhcp_option_vendor_class_id, tvb, 0, tvb_reported_length(tvb), ENC_ASCII);
2409 dissector_try_heuristic(dhcp_vendor_id_subdissector, tvb, pinfo, tree, &hdtbl_entry, data);
2411 return tvb_captured_length(tvb);
2414 static int
2415 dissect_dhcpopt_client_identifier(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2417 int offset = 0;
2418 int length = tvb_reported_length(tvb);
2419 unsigned char byte;
2421 if (length > 0)
2422 byte = tvb_get_uint8(tvb, offset);
2423 else
2424 byte = 0;
2426 /* We *MAY* use hwtype/hwaddr. If we have 7 bytes, I'll
2427 guess that the first is the hwtype, and the last 6
2428 are the hw addr */
2429 /* See https://www.iana.org/assignments/arp-parameters */
2430 /* RFC2132 9.14 Client-identifier has the following to say:
2431 A hardware type of 0 (zero) should be used when the value
2432 field contains an identifier other than a hardware address
2433 (e.g. a fully qualified domain name). */
2435 if (length == 7 && byte > 0 && byte < 48) {
2436 proto_tree_add_item(tree, hf_dhcp_hw_type, tvb, offset, 1, ENC_NA);
2438 if (byte == ARPHRD_ETHER || byte == ARPHRD_IEEE802)
2439 proto_tree_add_item(tree, hf_dhcp_hw_ether_addr, tvb, offset+1, 6, ENC_NA);
2440 else
2441 proto_tree_add_string(tree, hf_dhcp_client_hardware_address, tvb, offset+1, 6,
2442 tvb_arphrdaddr_to_str(pinfo->pool, tvb, offset+1, 6, byte));
2443 } else if (length == 17 && byte == 0) {
2444 /* Identifier is a UUID */
2445 proto_tree_add_item(tree, hf_dhcp_client_identifier_uuid, tvb, offset + 1, 16, dhcp_uuid_endian);
2447 /* From RFC 4361 paragraph 6.1 DHCPv4 Client Behavior:
2448 To send an RFC 3315-style binding identifier in a DHCPv4 'client
2449 identifier' option, the type of the 'client identifier' option is set
2450 to 255. */
2451 } else if (byte == 255) {
2452 uint16_t duidtype;
2453 uint16_t hwtype;
2455 /* The type field is immediately followed by the IAID, which is
2456 an opaque 32-bit quantity */
2457 proto_tree_add_string(tree, hf_dhcp_client_id_iaid, tvb, offset+1, 4,
2458 tvb_arphrdaddr_to_str(pinfo->pool, tvb, offset+1, 4, byte));
2459 offset += 5;
2460 duidtype = tvb_get_ntohs(tvb, offset);
2461 proto_tree_add_item(tree, hf_dhcp_client_id_duid_type, tvb, offset, 2, ENC_BIG_ENDIAN);
2462 switch (duidtype) {
2463 case DUID_LLT:
2464 if (length < 8) {
2465 expert_add_info(pinfo, tree, &ei_dhcp_mal_duid);
2466 break;
2468 hwtype=tvb_get_ntohs(tvb, offset + 2);
2469 proto_tree_add_item(tree, hf_dhcp_client_identifier_duid_llt_hw_type,
2470 tvb, offset + 2, 2, ENC_BIG_ENDIAN);
2472 /* XXX seconds since Jan 1 2000 */
2473 proto_tree_add_item(tree, hf_dhcp_client_identifier_time, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
2474 if (length > 8) {
2475 proto_tree_add_string(tree, hf_dhcp_client_identifier_link_layer_address, tvb, offset + 8,
2476 length - 13, tvb_arphrdaddr_to_str(pinfo->pool, tvb, offset+8, length-13, hwtype));
2477 if(DHCP_HW_IS_ETHER(hwtype, length-13)) {
2478 proto_tree_add_item(tree, hf_dhcp_client_identifier_link_layer_address_ether,
2479 tvb, offset+8, length-13, ENC_NA);
2482 break;
2483 case DUID_EN:
2484 if (length < 6) {
2485 expert_add_info(pinfo, tree, &ei_dhcp_mal_duid);
2486 break;
2488 proto_tree_add_item(tree, hf_dhcp_client_identifier_enterprise_num, tvb, offset + 2, 4, ENC_BIG_ENDIAN);
2489 if (length > 6) {
2490 proto_tree_add_item(tree, hf_dhcp_client_identifier, tvb, offset + 6, length - 11, ENC_NA);
2492 break;
2493 case DUID_LL:
2494 if (length < 4) {
2495 expert_add_info(pinfo, tree, &ei_dhcp_mal_duid);
2496 break;
2498 hwtype=tvb_get_ntohs(tvb, offset + 2);
2499 proto_tree_add_item(tree, hf_dhcp_client_identifier_duid_ll_hw_type,
2500 tvb, offset + 2, 2, ENC_BIG_ENDIAN);
2502 if (length > 4) {
2503 proto_tree_add_string(tree, hf_dhcp_client_identifier_link_layer_address, tvb, offset + 4,
2504 length - 9, tvb_arphrdaddr_to_str(pinfo->pool, tvb, offset+4, length-9, hwtype));
2505 if(DHCP_HW_IS_ETHER(hwtype, length-9)) {
2506 proto_tree_add_item(tree, hf_dhcp_client_identifier_link_layer_address_ether,
2507 tvb, offset+4, length-9, ENC_NA);
2510 break;
2512 } else if (byte == 0 && length > 1) {
2513 /* identifier other than a hardware address (e.g. a fully qualified domain name) */
2514 proto_tree_add_item(tree, hf_dhcp_client_identifier_type, tvb, offset, 1, ENC_NA);
2515 proto_tree_add_item(tree, hf_dhcp_client_identifier_undef, tvb, offset+1, length-1, ENC_ASCII);
2516 } else {
2517 /* otherwise, it's opaque data */
2520 return tvb_captured_length(tvb);
2523 static int
2524 dissect_dhcpopt_user_class_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2526 unsigned char user_class_instance_index = 0;
2527 int offset = 0;
2528 proto_item *vtix, *len_item;
2529 proto_tree *o77_v_tree;
2530 unsigned class_length, uci_len = tvb_reported_length(tvb);
2531 if (uci_len < 2) {
2532 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 2");
2533 return 1;
2536 /* First byte is the length of User Class data. If it is zero, then let's assume this
2537 * is a Microsoft variant that has the two-byte length field with most-significant byte
2538 * as zero.
2540 uint16_t ms_data_length = tvb_get_uint16(tvb, offset, ENC_BIG_ENDIAN);
2541 if (ms_data_length <= 0xff) {
2542 /* MSB is zero, this is Microsoft */
2543 proto_tree_add_uint(tree, hf_dhcp_option77_user_class_binary_data_length, tvb, offset, 2, ms_data_length);
2544 offset += 2;
2545 proto_tree_add_item(tree, hf_dhcp_option77_user_class_binary_data, tvb, offset, ms_data_length, ENC_STRING);
2546 offset += ms_data_length;
2547 /* User Class Binary Data is padded to 4-byte boundary */
2548 uint16_t padding_length = (4 - (ms_data_length % 4)) & 0x3;
2549 if (padding_length > 0) {
2550 proto_tree_add_item(tree, hf_dhcp_option77_user_class_padding, tvb, offset, padding_length, ENC_NA);
2551 offset += padding_length;
2553 uint32_t len;
2554 proto_tree_add_item_ret_uint(tree, hf_dhcp_option77_user_class_name_length, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
2555 offset += 2;
2556 proto_tree_add_item(tree, hf_dhcp_option77_user_class_name, tvb, offset, len, ENC_UTF_16);
2557 offset += len;
2558 proto_tree_add_item_ret_uint(tree, hf_dhcp_option77_user_class_description_length, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
2559 offset += 2;
2560 proto_tree_add_item(tree, hf_dhcp_option77_user_class_description, tvb, offset, len, ENC_UTF_16);
2562 return tvb_captured_length(tvb);
2565 while (tvb_reported_length_remaining(tvb, offset) > 0) {
2566 class_length = tvb_get_uint8(tvb, offset);
2567 if (class_length >= uci_len) {
2568 /* Having the sum of the User Class data lengths exceed the total User Option Information length (uci_len)
2569 * is a violation of RFC 3004. In that case the remaining data is treated as a non-conformant (text) option.
2570 * This check will also catch the Microsoft 'variation' implementation (when Vendor class identifier contains
2571 * "MSFT 5.0") such as "RRAS.Microsoft" and others like "iPXE".
2572 * In the unlikely case that the first character can be interpreted as a valid length the next iteration
2573 * of this while loop will catch that.
2574 * https://gitlab.com/wireshark/wireshark/-/issues/16349
2575 * https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dhcpe/fe8a2dd4-1e8c-4546-bacd-4ae10de02058
2577 proto_item *expert_ti = proto_tree_add_item(tree, hf_dhcp_option77_user_class_text, tvb, offset, uci_len, ENC_ASCII);
2578 expert_add_info(pinfo, expert_ti, &ei_dhcp_nonstd_option_data);
2579 break;
2582 /* Create subtree for instance of User Class. */
2583 vtix = proto_tree_add_uint_format_value(tree, hf_dhcp_option77_user_class,
2584 tvb, offset, 1, user_class_instance_index, "[%d]", user_class_instance_index);
2585 o77_v_tree = proto_item_add_subtree(vtix, ett_dhcp_option77_instance);
2587 /* Add length for instance of User Class. */
2588 len_item = proto_tree_add_uint(o77_v_tree, hf_dhcp_option77_user_class_length, tvb, offset, 1, class_length);
2589 proto_item_set_len(vtix, class_length+1);
2590 offset++;
2592 if (class_length == 0) {
2593 expert_add_info_format(pinfo, len_item, &ei_dhcp_bad_length, "UC_Len_%u isn't >= 1 (UC_Len_%u = 0)", user_class_instance_index, user_class_instance_index);
2594 break;
2597 /* Add data for instance of User Class. */
2598 proto_tree_add_item(o77_v_tree, hf_dhcp_option77_user_class_data, tvb, offset, class_length, ENC_NA);
2600 offset += class_length;
2601 uci_len -= class_length + 1;
2602 user_class_instance_index++;
2605 return tvb_captured_length(tvb);
2608 static int
2609 dissect_dhcpopt_slp_directory_agent(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2611 int offset = 0;
2612 uint32_t byte;
2614 if (tvb_reported_length(tvb) < 1) {
2615 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 1");
2616 return 1;
2619 proto_tree_add_item_ret_uint(tree, hf_dhcp_option_slp_directory_agent_value, tvb, offset, 1, ENC_BIG_ENDIAN, &byte);
2620 offset++;
2622 if (byte == 0x80) {
2623 if (tvb_reported_length_remaining(tvb, offset) == 0)
2624 return offset;
2626 offset++;
2629 while (tvb_reported_length_remaining(tvb, offset) >= 4) {
2630 proto_tree_add_item(tree, hf_dhcp_option_slp_directory_agent_slpda_address, tvb, offset, 4, ENC_BIG_ENDIAN);
2631 offset += 4;
2634 if (tvb_reported_length_remaining(tvb, offset) > 0) {
2635 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Option length isn't a multiple of 4");
2638 return tvb_captured_length(tvb);
2641 static int
2642 dissect_dhcpopt_slp_service_scope(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
2644 int offset = 0;
2646 proto_tree_add_item(tree, hf_dhcp_option_slp_service_scope_value, tvb, offset, 1, ENC_BIG_ENDIAN);
2648 offset++;
2649 proto_tree_add_item(tree, hf_dhcp_option_slp_service_scope_string, tvb, offset, tvb_reported_length_remaining(tvb, offset), ENC_ASCII);
2651 return tvb_captured_length(tvb);
2654 static int
2655 dissect_dhcpopt_client_full_domain_name(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2657 static int * const fqdn_hf_flags[] = {
2658 &hf_dhcp_fqdn_mbz,
2659 &hf_dhcp_fqdn_n,
2660 &hf_dhcp_fqdn_e,
2661 &hf_dhcp_fqdn_o,
2662 &hf_dhcp_fqdn_s,
2663 NULL
2665 uint8_t fqdn_flags;
2666 int offset = 0, length = tvb_reported_length(tvb);
2667 const unsigned char *dns_name;
2668 int dns_name_len;
2670 if (length < 3) {
2671 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 3");
2672 return 1;
2675 fqdn_flags = tvb_get_uint8(tvb, offset);
2676 proto_tree_add_bitmask(tree, tvb, offset, hf_dhcp_fqdn_flags,
2677 ett_dhcp_fqdn_flags, fqdn_hf_flags, ENC_BIG_ENDIAN);
2679 /* XXX: use code from packet-dns for return code decoding */
2680 proto_tree_add_item(tree, hf_dhcp_fqdn_rcode1, tvb, offset+1, 1, ENC_BIG_ENDIAN);
2681 /* XXX: use code from packet-dns for return code decoding */
2682 proto_tree_add_item(tree, hf_dhcp_fqdn_rcode2, tvb, offset+2, 1, ENC_BIG_ENDIAN);
2684 if (length > 3) {
2685 if (fqdn_flags & F_FQDN_E) {
2686 get_dns_name(tvb, offset+3, length-3, offset+3, (const char **)&dns_name, &dns_name_len);
2687 proto_tree_add_string(tree, hf_dhcp_fqdn_name,
2688 tvb, offset+3, length-3, format_text(pinfo->pool, dns_name, dns_name_len));
2689 } else {
2690 proto_tree_add_item(tree, hf_dhcp_fqdn_asciiname, tvb, offset+3, length-3, ENC_ASCII);
2694 return tvb_captured_length(tvb);
2697 static int
2698 dissect_dhcpopt_novell_servers(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2700 int offset = 0;
2702 /* Option 85 can be sent as a string */
2703 /* Added by Greg Morris (gmorris[AT]novell.com) */
2704 if (novell_string) {
2705 proto_tree_add_item(tree, hf_dhcp_option_novell_dss_string, tvb, offset, tvb_reported_length(tvb), ENC_ASCII);
2706 } else {
2707 /* IP addresses */
2708 while (tvb_reported_length_remaining(tvb, offset) >= 4) {
2710 proto_tree_add_item(tree, hf_dhcp_option_novell_dss_ip, tvb, offset, 4, ENC_BIG_ENDIAN);
2711 offset += 4;
2714 if (tvb_reported_length_remaining(tvb, offset) > 0) {
2715 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Option length isn't a multiple of 4");
2719 return tvb_captured_length(tvb);
2722 static int
2723 dissect_dhcpopt_dhcp_authentication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
2725 int offset = 0;
2726 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
2727 uint32_t protocol, rdm;
2728 uint8_t algorithm;
2730 if (tvb_reported_length(tvb) < 11) {
2731 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 11");
2732 return 1;
2735 proto_tree_add_item_ret_uint(tree, hf_dhcp_option_dhcp_authentication_protocol, tvb, offset, 1, ENC_BIG_ENDIAN, &protocol);
2736 offset++;
2738 algorithm = tvb_get_uint8(tvb, offset);
2739 switch (protocol) {
2741 case AUTHEN_PROTO_DELAYED_AUTHEN:
2742 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_alg_delay, tvb, offset, 1, ENC_BIG_ENDIAN);
2743 break;
2745 default:
2746 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_algorithm, tvb, offset, 1, ENC_BIG_ENDIAN);
2747 break;
2749 offset++;
2751 proto_tree_add_item_ret_uint(tree, hf_dhcp_option_dhcp_authentication_rdm, tvb, offset, 1, ENC_BIG_ENDIAN, &rdm);
2752 offset++;
2754 switch (rdm) {
2756 case AUTHEN_RDM_MONOTONIC_COUNTER:
2757 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_rdm_replay_detection, tvb, offset, 8, ENC_BIG_ENDIAN);
2758 break;
2760 default:
2761 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_rdm_rdv, tvb, offset, 8, ENC_ASCII);
2762 break;
2764 offset += 8;
2766 switch (protocol) {
2768 case AUTHEN_PROTO_DELAYED_AUTHEN:
2769 switch (algorithm) {
2771 case AUTHEN_DELAYED_ALGO_HMAC_MD5:
2772 if (option_data->dhcp_type && !strcmp(option_data->dhcp_type, OPT53_DISCOVER)) {
2773 /* Discover has no Secret ID nor HMAC MD5 Hash */
2774 break;
2775 } else {
2776 if (tvb_reported_length_remaining(tvb, offset) < 20) {
2777 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 20");
2778 break;
2781 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_secret_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2782 offset += 4;
2783 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_hmac_md5_hash, tvb, offset, 16, ENC_NA);
2784 break;
2787 default:
2788 if (tvb_reported_length_remaining(tvb, offset) == 0)
2789 break;
2791 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_information, tvb, offset, tvb_reported_length_remaining(tvb, offset), ENC_ASCII);
2792 break;
2794 break;
2796 default:
2797 if (tvb_reported_length_remaining(tvb, offset) == 0)
2798 break;
2800 proto_tree_add_item(tree, hf_dhcp_option_dhcp_authentication_information, tvb, offset, tvb_reported_length_remaining(tvb, offset), ENC_ASCII);
2801 break;
2804 return tvb_captured_length(tvb);
2807 static int
2808 dissect_dhcpopt_client_architecture(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2810 int offset = 0;
2812 while (tvb_reported_length_remaining(tvb, offset) > 1) {
2813 uint32_t architecture_id;
2814 proto_item *pi;
2816 pi = proto_tree_add_item_ret_uint(tree, hf_dhcp_option_client_system_architecture, tvb, offset, 2, ENC_BIG_ENDIAN, &architecture_id);
2817 offset += 2;
2820 * Some Client Architecture IDs are widely misused. For
2821 * details, refer to the comment at the definition of
2822 * dhcp_client_arch.
2824 * The most common problem is a client using architecture ID 9
2825 * when performing an EFI x64 boot. Windows Server 2008 WDS
2826 * does not recognize ID 9, but most other DHCP servers
2827 * (including newer versions of WDS) silently map architecture
2828 * ID 9 to x64 in order to accommodate these clients.
2830 if (architecture_id == 9) {
2831 expert_add_info_format(pinfo, pi, &ei_dhcp_option93_client_arch_ambiguous, "Client Architecture ID 9 is often incorrectly used for EFI x64");
2835 * Technically, architecture ID 7 is ambiguous for the same
2836 * reason, but it's extremely unlikely to be a real world
2837 * problem, so a warning would probably just be unwelcome
2838 * noise.
2841 if (tvb_reported_length_remaining(tvb, offset) > 0) {
2842 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Option length isn't a multiple of 2");
2845 return tvb_captured_length(tvb);
2848 static int
2849 dissect_dhcpopt_client_network_interface_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
2851 int offset = 0;
2852 uint8_t id_type;
2854 id_type = tvb_get_uint8(tvb, offset);
2855 offset++;
2857 if (id_type == 0x01) {
2858 proto_tree_add_item(tree, hf_dhcp_option_client_network_id_major_ver,
2859 tvb, offset, 1, ENC_LITTLE_ENDIAN);
2860 offset++;
2861 proto_tree_add_item(tree, hf_dhcp_option_client_network_id_minor_ver,
2862 tvb, offset, 1, ENC_LITTLE_ENDIAN);
2865 return tvb_captured_length(tvb);
2868 static int
2869 dissect_dhcpopt_client_identifier_uuid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2871 int offset = 0, length = tvb_reported_length(tvb);
2872 uint8_t byte;
2874 if (length > 0)
2875 byte = tvb_get_uint8(tvb, offset);
2876 else
2877 byte = 0;
2879 /* We *MAY* use hwtype/hwaddr. If we have 7 bytes, I'll
2880 guess that the first is the hwtype, and the last 6
2881 are the hw addr */
2882 /* See https://www.iana.org/assignments/arp-parameters */
2883 /* RFC2132 9.14 Client-identifier has the following to say:
2884 A hardware type of 0 (zero) should be used when the value
2885 field contains an identifier other than a hardware address
2886 (e.g. a fully qualified domain name). */
2888 if (length == 7 && byte > 0 && byte < 48) {
2889 proto_tree_add_item(tree, hf_dhcp_hw_type, tvb, offset, 1, ENC_NA);
2890 if (byte == ARPHRD_ETHER || byte == ARPHRD_IEEE802)
2891 proto_tree_add_item(tree, hf_dhcp_hw_ether_addr, tvb, offset+1, 6, ENC_NA);
2892 else
2893 proto_tree_add_string(tree, hf_dhcp_client_hardware_address, tvb, offset+1, 6,
2894 tvb_arphrdaddr_to_str(pinfo->pool, tvb, offset+1, 6, byte));
2895 } else if (length == 17 && byte == 0) {
2896 /* Identifier is a UUID */
2897 proto_tree_add_item(tree, hf_dhcp_client_identifier_uuid, tvb, offset + 1, 16, dhcp_uuid_endian);
2898 } else {
2899 /* otherwise, it's opaque data */
2902 return tvb_captured_length(tvb);
2905 static int
2906 dissect_dhcpopt_civic_location(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2908 int offset = 0;
2910 if (tvb_reported_length(tvb) >= 3)
2912 proto_tree_add_item(tree, hf_dhcp_option_civic_location_what, tvb, offset, 1, ENC_BIG_ENDIAN);
2913 offset++;
2914 proto_tree_add_item(tree, hf_dhcp_option_civic_location_country, tvb, offset, 2, ENC_ASCII);
2915 offset += 2;
2917 while (tvb_reported_length_remaining(tvb, offset) >= 2)
2919 uint32_t calength;
2920 proto_tree_add_item(tree, hf_dhcp_option_civic_location_ca_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2921 offset++;
2922 proto_tree_add_item_ret_uint(tree, hf_dhcp_option_civic_location_ca_length, tvb, offset, 1, ENC_BIG_ENDIAN, &calength);
2923 offset++;
2925 if (calength == 0)
2926 continue;
2928 if (tvb_reported_length_remaining(tvb, offset) >= (int)calength)
2930 proto_tree_add_item(tree, hf_dhcp_option_civic_location_ca_value, tvb, offset, calength, ENC_ASCII);
2931 offset += calength;
2933 else
2935 expert_add_info(pinfo, tree, &ei_dhcp_option_civic_location_bad_cattype);
2936 break;
2941 return tvb_captured_length(tvb);
2944 static int
2945 dissect_dhcpopt_name_server_search(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2947 int offset = 0, length = tvb_reported_length(tvb);
2948 uint16_t ns;
2950 if (length < 2) {
2951 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 2");
2952 return 1;
2953 } else if (length & 1) {
2954 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length (%u) isn't even number", length);
2955 return 1;
2958 while (tvb_reported_length_remaining(tvb, offset) > 0) {
2959 ns = tvb_get_ntohs(tvb, offset);
2960 /* XXX - Make this a value_string */
2961 switch (ns) {
2962 case RFC2937_LOCAL_NAMING_INFORMATION:
2963 proto_tree_add_string(tree, hf_dhcp_option_dhcp_name_service_search_option, tvb, offset, 2, "Local naming information (e.g., an /etc/hosts file on a UNIX machine) (0)");
2964 break;
2965 case RFC2937_DOMAIN_NAME_SERVER_OPTION:
2966 proto_tree_add_string(tree, hf_dhcp_option_dhcp_name_service_search_option, tvb, offset, 2, "Domain Name Server Option (6)");
2967 break;
2968 case RFC2937_NETWORK_INFORMATION_SERVERS_OPTION:
2969 proto_tree_add_string(tree, hf_dhcp_option_dhcp_name_service_search_option, tvb, offset, 2, "Network Information Servers Option (41)");
2970 break;
2971 case RFC2937_NETBIOS_OVER_TCP_IP_NAME_SERVER_OPTION:
2972 proto_tree_add_string(tree, hf_dhcp_option_dhcp_name_service_search_option, tvb, offset, 2, "NetBIOS over TCP/IP Name Server Option (44)");
2973 break;
2974 case RFC2937_NETWORK_INFORMATION_SERVICE_PLUS_SERVERS_OPTION:
2975 proto_tree_add_string(tree, hf_dhcp_option_dhcp_name_service_search_option, tvb, offset, 2, "Network Information Service+ Servers Option (65)");
2976 break;
2977 default:
2978 expert_add_info_format(pinfo, tree, &ei_dhcp_option_dhcp_name_service_invalid,
2979 "Invalid Name Service (%u). RFC 2937 defines only 0, 6, 41, 44, and 65 as possible values.", ns);
2980 break;
2982 offset += 2;
2985 return tvb_captured_length(tvb);
2988 static int
2989 dissect_dhcpopt_dhcp_domain_search(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2991 int length = tvb_reported_length(tvb);
2992 int offset = 0;
2993 char *name_out;
2994 const unsigned char *dns_name;
2995 int dns_name_len;
2997 /* Domain Names - Implementation And Specification (RFC 1035) */
2999 /* We will display the information about fqdn */
3000 int consumedx = 0;
3002 while (tvb_reported_length_remaining(tvb, offset) > 0) {
3003 /* use the get_dns_name method that manages all techniques of RFC 1035 (compression pointer and so on) */
3004 consumedx = get_dns_name(tvb, offset,
3005 length, 0, (const char **)&dns_name, &dns_name_len);
3006 name_out = format_text(pinfo->pool, dns_name, dns_name_len);
3007 proto_tree_add_string(tree, hf_dhcp_option_dhcp_dns_domain_search_list_fqdn, tvb, offset, consumedx, name_out);
3008 offset += consumedx;
3011 return tvb_captured_length(tvb);
3014 static int
3015 dissect_dhcpopt_sip_servers(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3017 int length = tvb_reported_length(tvb);
3018 int offset = 0;
3019 const unsigned char *dns_name;
3020 int dns_name_len;
3021 char *name_out;
3023 /* Domain Names - Implementation And Specification (RFC 1035) */
3024 /* We will display the information about SIP server */
3025 uint32_t enc;
3027 proto_tree_add_item_ret_uint(tree, hf_dhcp_option_sip_server_enc, tvb, offset, 1, ENC_NA, &enc);
3028 offset += 1;
3030 switch (enc) {
3031 case RFC_3361_ENC_FQDN: {
3032 int consumedx = 0;
3033 if (length < 3) {
3034 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 3 (len = %u)", length);
3035 break;
3038 while (tvb_reported_length_remaining(tvb, offset) > 0) {
3039 /* use the get_dns_name method that manages all techniques of RFC 1035 (compression pointer and so on) */
3040 consumedx = get_dns_name(tvb, offset, length,
3041 1 /* ignore enc */, (const char **)&dns_name, &dns_name_len);
3042 name_out = format_text(pinfo->pool, dns_name, dns_name_len);
3044 proto_tree_add_string(tree, hf_dhcp_option_sip_server_name, tvb, offset, consumedx, name_out);
3045 offset += consumedx;
3047 break;
3049 case RFC_3361_ENC_IPADDR:
3050 if (length < 5) {
3051 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 5 (len = %u)", length);
3052 break;
3054 /* x % 2^n == x & (2^n - 1) note : (assuming x is a positive integer) */
3055 if ((length - 1) & 3) {
3056 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't a multiple of 4 plus 1 (len = %u).", length);
3057 break;
3059 while (tvb_reported_length_remaining(tvb, offset) > 0) {
3060 proto_tree_add_item(tree, hf_dhcp_option_sip_server_address, tvb, offset, 4, ENC_BIG_ENDIAN);
3061 offset += 4;
3063 break;
3064 default:
3065 expert_add_info_format(pinfo, tree, &ei_dhcp_option_sip_server_address_encoding, "RFC 3361 defines only 0 and 1 for Encoding byte (Encoding = %u).", enc);
3066 break;
3069 return tvb_captured_length(tvb);
3072 static int
3073 dissect_dhcpopt_classless_static_route(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3075 int offset = 0;
3076 int i, mask_width, significant_octets;
3077 proto_item* route_item;
3079 /* minimum length is 5 bytes */
3080 if (tvb_reported_length(tvb) < 5) {
3081 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length isn't >= 5");
3082 return 1;
3084 while (tvb_reported_length_remaining(tvb, offset) > 0) {
3085 mask_width = tvb_get_uint8(tvb, offset);
3086 /* mask_width <= 32 */
3087 if (mask_width > 32) {
3088 expert_add_info_format(pinfo, tree, &ei_dhcp_option_classless_static_route, "Mask width (%d) > 32", mask_width);
3089 break;
3091 significant_octets = (mask_width + 7) / 8;
3092 route_item = proto_tree_add_bytes_format(tree, hf_dhcp_option_classless_static_route, tvb, offset,
3093 1 + significant_octets + 4, NULL, " ");
3094 offset++;
3095 /* significant octets + router(4) */
3096 if (tvb_reported_length_remaining(tvb, offset + significant_octets + 4) < 0) {
3097 expert_add_info_format(pinfo, route_item, &ei_dhcp_bad_length, "Remaining length (%d) < %d bytes", tvb_reported_length_remaining(tvb, offset), significant_octets + 4);
3098 break;
3100 if(mask_width == 0)
3101 proto_item_append_text(route_item, "default");
3102 else {
3103 for(i = 0 ; i < significant_octets ; i++) {
3104 if (i > 0)
3105 proto_item_append_text(route_item, ".");
3106 proto_item_append_text(route_item, "%d", tvb_get_uint8(tvb, offset++));
3108 for(i = significant_octets ; i < 4 ; i++)
3109 proto_item_append_text(route_item, ".0");
3110 proto_item_append_text(route_item, "/%d", mask_width);
3112 proto_item_append_text(route_item, "-%s", tvb_ip_to_str(pinfo->pool, tvb, offset));
3113 offset += 4;
3116 return tvb_captured_length(tvb);
3119 static int
3120 dissect_dhcpopt_coordinate_based_location(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3122 int offset = 0, length = tvb_reported_length(tvb);
3123 proto_item* ti;
3125 if (length == 16) {
3126 int ret;
3127 unsigned char lci[16];
3128 struct rfc3825_location_fixpoint_t location_fp;
3129 struct rfc3825_location_decimal_t location;
3131 tvb_memcpy(tvb, lci, offset, 16);
3133 /* convert lci encoding into fixpoint location */
3134 rfc3825_lci_to_fixpoint(lci, &location_fp);
3136 /* convert location from decimal to fixpoint */
3137 ret = rfc3825_fixpoint_to_decimal(&location_fp, &location);
3139 if (ret != RFC3825_NOERROR) {
3140 ti = proto_tree_add_uint(tree, hf_dhcp_option_rfc3825_error, tvb, offset, 1, ret);
3141 proto_item_set_len(ti, length);
3142 } else {
3143 proto_tree_add_double_format_value(tree, hf_dhcp_option_rfc3825_latitude, tvb, offset, 5, location.latitude, "%15.10f", location.latitude);
3144 proto_tree_add_double_format_value(tree, hf_dhcp_option_rfc3825_longitude, tvb, offset+5, 5, location.longitude, "%15.10f", location.longitude);
3145 proto_tree_add_double_format_value(tree, hf_dhcp_option_rfc3825_latitude_res, tvb, offset, 1, location.latitude_res, "%15.10f", location.latitude_res);
3146 proto_tree_add_double_format_value(tree, hf_dhcp_option_rfc3825_longitude_res, tvb, offset+5, 1, location.longitude_res, "%15.10f", location.longitude_res);
3147 proto_tree_add_double_format_value(tree, hf_dhcp_option_rfc3825_altitude, tvb, offset+12, 4, location.altitude, "%15.10f", location.altitude);
3148 proto_tree_add_double_format_value(tree, hf_dhcp_option_rfc3825_altitude_res, tvb, offset+10, 2, location.altitude_res, "%15.10f", location.altitude_res);
3149 proto_tree_add_uint(tree, hf_dhcp_option_rfc3825_altitude_type, tvb, offset+10, 1, location.altitude_type);
3150 proto_tree_add_uint(tree, hf_dhcp_option_rfc3825_map_datum, tvb, offset+15, 1, location.datum_type);
3152 } else if (length < 69) { /* CableLabs DSS_ID */
3153 int s_len;
3155 proto_tree_add_item(tree, hf_dhcp_option_cl_dss_id_option, tvb, offset, 1, ENC_BIG_ENDIAN);
3156 proto_tree_add_item(tree, hf_dhcp_option_cl_dss_id_len, tvb, offset+1, 1, ENC_BIG_ENDIAN);
3157 s_len = tvb_get_uint8(tvb, offset+1);
3158 proto_tree_add_item(tree, hf_dhcp_option_cl_dss_id, tvb, offset+2, s_len, ENC_ASCII);
3160 if (length > s_len+2) { /* Second DSS_ID*/
3162 proto_tree_add_item(tree, hf_dhcp_option_cl_dss_id_option, tvb, offset+2+s_len, 1, ENC_BIG_ENDIAN);
3163 proto_tree_add_item(tree, hf_dhcp_option_cl_dss_id_len, tvb, offset+1+2+s_len, 1, ENC_BIG_ENDIAN);
3164 s_len = tvb_get_uint8(tvb, offset+1+2+s_len);
3165 proto_tree_add_item(tree, hf_dhcp_option_cl_dss_id, tvb, offset+2+2+s_len, s_len, ENC_ASCII);
3167 } else {
3168 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Invalid length of DHCP option!");
3171 return tvb_captured_length(tvb);
3174 static int
3175 dissect_dhcpopt_vi_vendor_class(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3177 int offset = 0;
3178 uint32_t enterprise = 0;
3179 uint32_t option_data_len = 0;
3180 int data_len = 0;
3181 int s_end;
3182 proto_item *eti, *expert_ti;
3183 proto_tree *e_tree;
3184 proto_tree *vcdi_tree;
3186 if (tvb_reported_length(tvb) == 1) {
3187 /* CableLab specific */
3188 proto_tree_add_item(tree, hf_dhcp_option_vi_class_cl_address_mode, tvb, 0, 1, ENC_BIG_ENDIAN);
3189 return 1;
3192 while (tvb_reported_length_remaining(tvb, offset) >= 5) {
3194 eti = proto_tree_add_item_ret_uint(tree, hf_dhcp_option_vi_class_enterprise, tvb, offset, 4, ENC_BIG_ENDIAN, &enterprise);
3195 e_tree = proto_item_add_subtree(eti, ett_dhcp_option);
3196 offset += 4;
3197 proto_tree_add_item_ret_uint(e_tree, hf_dhcp_option_vi_class_data_length, tvb, offset, 1, ENC_BIG_ENDIAN, &option_data_len);
3198 offset += 1;
3200 s_end = offset + option_data_len;
3201 if ( tvb_reported_length_remaining(tvb, s_end) < 0) {
3202 break;
3205 while (offset < s_end) {
3206 tvbuff_t *enterprise_tvb = tvb_new_subset_length(tvb, offset, option_data_len);
3207 /* XXX - Do we really want to try the dissector table for *each*
3208 * vendor-class-data for the same enterprise? This tvb is too long on
3209 * subsequent iterations. Only giving the table dissector one attempt
3210 * (and skipping past bytes it doesn't dissect to s_end) might be simpler.
3212 int bytes_dissected = dissector_try_uint(dhcp_enterprise_class_table, enterprise, enterprise_tvb, pinfo, e_tree);
3213 if (bytes_dissected == 0) {
3214 vcdi_tree = proto_tree_add_subtree(e_tree, tvb, offset, option_data_len, ett_dhcp_option124_vendor_class_data_item, NULL, "Vendor Class Data Item");
3215 /* According to RFC 3925, *each* vendor-class-data instance has
3216 * its own length, but in practice some vendors have only included
3217 * the overall per-enterprise option length. See the dhcwg m-l:
3218 * https://mailarchive.ietf.org/arch/msg/dhcwg/B4fNsvUR0EHxcrKDsKCf7lBrc3s/
3220 data_len = tvb_get_uint8(tvb, offset);
3221 if (offset + data_len >= s_end) {
3222 expert_ti = proto_tree_add_item(vcdi_tree, hf_dhcp_option_vi_class_data_item_data, tvb, offset, s_end - offset, ENC_NA);
3223 expert_add_info(pinfo, expert_ti, &ei_dhcp_nonstd_option_data);
3224 offset = s_end;
3225 break;
3227 proto_tree_add_item(vcdi_tree, hf_dhcp_option_vi_class_data_item_length, tvb, offset, 1, ENC_NA);
3228 offset += 1;
3229 proto_tree_add_item(vcdi_tree, hf_dhcp_option_vi_class_data_item_data, tvb, offset, data_len, ENC_NA);
3231 /* look for next vendor-class-data-item */
3232 offset += data_len;
3233 } else {
3234 offset += bytes_dissected;
3238 /* loop for the next Enterprise number */
3241 if (tvb_reported_length_remaining(tvb, offset) > 0) {
3242 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length < 5");
3245 return tvb_captured_length(tvb);
3248 static int
3249 dissect_dhcpopt_forcerenew_nonce(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
3251 int offset = 0;
3252 while ( tvb_reported_length_remaining(tvb, offset) > 0) {
3253 proto_tree_add_item(tree, hf_dhcp_option_forcerenew_nonce_algo, tvb, offset, 1, ENC_BIG_ENDIAN);
3254 offset += 1;
3257 return tvb_captured_length(tvb);
3260 static int
3261 dissect_dhcpopt_rdnss(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3263 int offset = 0;
3264 const unsigned char *dns_name;
3265 int dns_name_len;
3267 if (tvb_reported_length(tvb) < 10) {
3268 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be >= 10");
3269 return 1;
3271 proto_tree_add_item(tree, hf_dhcp_option_rdnss_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
3272 proto_tree_add_item(tree, hf_dhcp_option_rdnss_pref, tvb, offset, 1, ENC_BIG_ENDIAN);
3273 offset += 1;
3274 proto_tree_add_item(tree, hf_dhcp_option_rdnss_prim_dns_server, tvb, offset, 4, ENC_BIG_ENDIAN);
3275 offset += 4;
3276 proto_tree_add_item(tree, hf_dhcp_option_rdnss_sec_dns_server, tvb, offset, 4, ENC_BIG_ENDIAN);
3277 offset += 4;
3279 get_dns_name(tvb, offset, tvb_reported_length_remaining(tvb,offset), offset, (const char **)&dns_name, &dns_name_len);
3280 proto_tree_add_string(tree, hf_dhcp_option_rdnss_domain, tvb, offset,
3281 tvb_reported_length_remaining(tvb,offset), format_text(pinfo->pool, dns_name, dns_name_len));
3283 return tvb_captured_length(tvb);
3286 static int
3287 dissect_dhcpopt_dhcp_captive_portal(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
3289 proto_item *ti_cp;
3290 ti_cp = proto_tree_add_item(tree, hf_dhcp_option_captive_portal, tvb, 0, tvb_reported_length(tvb), ENC_ASCII);
3291 proto_item_set_url(ti_cp);
3293 return tvb_captured_length(tvb);
3296 static int
3297 dissect_dhcpopt_bulk_lease_query_start(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3299 if (tvb_reported_length(tvb) != 4) {
3300 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be 4");
3301 return 1;
3303 proto_tree_add_item(tree, hf_dhcp_option_bulk_lease_query_start, tvb, 0, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
3305 return tvb_captured_length(tvb);
3308 static int
3309 dissect_dhcpopt_bulk_lease_query_end(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
3311 if (tvb_reported_length(tvb) != 4) {
3312 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be 4");
3313 return 1;
3315 proto_tree_add_item(tree, hf_dhcp_option_bulk_lease_query_end, tvb, 0, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
3317 return tvb_captured_length(tvb);
3320 static int
3321 dissect_dhcpopt_bulk_lease_base_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3323 if (tvb_reported_length(tvb) != 4) {
3324 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be 4");
3325 return 1;
3327 proto_tree_add_item(tree, hf_dhcp_option_bulk_lease_base_time, tvb, 0, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
3329 return tvb_captured_length(tvb);
3332 static int
3333 dissect_dhcpopt_bulk_lease_status_code(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3335 if (tvb_reported_length(tvb) < 1) {
3336 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must >= 1");
3337 return 1;
3339 proto_tree_add_item(tree, hf_dhcp_option_bulk_lease_status_code, tvb, 0, 1, ENC_BIG_ENDIAN);
3340 if ( tvb_reported_length_remaining(tvb, 1) > 0) {
3341 proto_tree_add_item(tree, hf_dhcp_option_bulk_lease_status_message, tvb, 1, tvb_reported_length_remaining(tvb, 1), ENC_UTF_8);
3344 return tvb_captured_length(tvb);
3347 static int
3348 dissect_dhcpopt_pcp_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3350 proto_tree *tree_pcp;
3351 int offset = 0;
3352 uint8_t list_length;
3353 uint8_t ip_list_length;
3354 proto_item *ti_pcp;
3356 if (tvb_reported_length(tvb) < 5) {
3357 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must >= 5");
3358 return 1;
3360 while (tvb_reported_length_remaining(tvb, offset) >= 5) {
3361 ip_list_length = 0;
3362 list_length = tvb_get_uint8(tvb, offset);
3363 tree_pcp = proto_tree_add_subtree(tree, tvb, offset, list_length, ett_dhcp_option158_pcp_list,
3364 &ti_pcp, "PCP server list");
3365 proto_tree_add_item(tree_pcp, hf_dhcp_option_pcp_list_length, tvb, offset, 1, ENC_NA);
3366 offset += 1;
3367 ip_list_length += 1;
3368 while (((list_length - 1)%4 == 0) && (ip_list_length < list_length) && tvb_reported_length_remaining(tvb,offset) >= 4) {
3369 proto_tree_add_item(tree_pcp, hf_dhcp_option_pcp_server, tvb, offset, 4, ENC_NA);
3370 offset += 4;
3371 ip_list_length += 4;
3375 return tvb_captured_length(tvb);
3378 static int
3379 dissect_dhcpopt_portparams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3381 if (tvb_reported_length(tvb) != 4) {
3382 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be 4");
3383 return 1;
3385 proto_tree_add_item(tree, hf_dhcp_option_portparams_offset, tvb, 0, 1, ENC_NA);
3386 proto_tree_add_item(tree, hf_dhcp_option_portparams_psid_length, tvb, 1, 1, ENC_NA);
3387 proto_tree_add_item(tree, hf_dhcp_option_portparams_psid, tvb, 2, 2, ENC_NA);
3389 return tvb_captured_length(tvb);
3392 static int
3393 dissect_dhcpopt_6RD_option(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3395 int offset = 0;
3397 if (tvb_reported_length(tvb) < 22) {
3398 expert_add_info(pinfo, tree, &ei_dhcp_option_6RD_malformed);
3399 return 1;
3402 proto_tree_add_item(tree, hf_dhcp_option_6RD_ipv4_mask_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3403 proto_tree_add_item(tree, hf_dhcp_option_6RD_prefix_len, tvb, offset+1, 1, ENC_BIG_ENDIAN);
3404 proto_tree_add_item(tree, hf_dhcp_option_6RD_prefix, tvb, offset+2, 16, ENC_NA);
3405 proto_tree_add_item(tree, hf_dhcp_option_6RD_border_relay_ip, tvb, offset+18, 4, ENC_BIG_ENDIAN);
3407 /* More Border Relay IPv4 addresses included */
3408 if (tvb_reported_length(tvb) > 22) {
3409 offset += 22;
3410 while (tvb_reported_length_remaining(tvb, offset) >= 4) {
3411 proto_tree_add_item(tree, hf_dhcp_option_6RD_border_relay_ip, tvb, offset, 4, ENC_BIG_ENDIAN);
3412 offset += 4;
3414 if (tvb_reported_length_remaining(tvb, offset) > 0) {
3415 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Option length isn't a multiple of 4");
3419 return tvb_captured_length(tvb);
3422 static int
3423 dissect_dhcpopt_avaya_ip_telephone(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3425 int offset = 0;
3426 proto_tree *o242avaya_v_tree;
3427 proto_item *avaya_ti;
3428 const char *avaya_option = NULL;
3429 wmem_strbuf_t *avaya_param_buf = NULL;
3431 /* minimum length is 5 bytes */
3432 if (tvb_reported_length(tvb) < 5) {
3433 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "Avaya IP Telephone option length isn't >= 5");
3434 return 1;
3436 avaya_ti = proto_tree_add_item_ret_string(tree, hf_dhcp_option242_avaya, tvb, offset, tvb_reported_length(tvb), ENC_ASCII|ENC_NA, pinfo->pool, (const uint8_t **)&avaya_option);
3437 o242avaya_v_tree = proto_item_add_subtree(avaya_ti, ett_dhcp_option242_suboption);
3438 avaya_param_buf = wmem_strbuf_new(pinfo->pool, "");
3439 char **fields = wmem_strsplit(pinfo->pool, avaya_option, ",", -1);
3440 for (int i = 0; fields[i]; i++) {
3441 const char *field = fields[i];
3442 if (!strchr(field, '=')) {
3443 if (wmem_strbuf_get_len(avaya_param_buf) == 0) {
3444 expert_add_info_format(pinfo, avaya_ti, &ei_dhcp_subopt_unknown_type, "ERROR, Unknown parameter %s", field);
3445 offset += (int)strlen(field);
3446 break;
3448 wmem_strbuf_append_printf(avaya_param_buf,",%s", field);
3450 else {
3451 if (wmem_strbuf_get_len(avaya_param_buf) > 0) {
3452 dissect_vendor_avaya_param(o242avaya_v_tree, pinfo, avaya_ti, tvb, offset, avaya_param_buf);
3453 offset += (int)wmem_strbuf_get_len(avaya_param_buf) + 1;
3454 wmem_strbuf_truncate(avaya_param_buf, 0);
3456 wmem_strbuf_append(avaya_param_buf, field);
3459 if (wmem_strbuf_get_len(avaya_param_buf) > 0) {
3460 dissect_vendor_avaya_param(o242avaya_v_tree, pinfo, avaya_ti, tvb, offset, avaya_param_buf);
3463 return tvb_captured_length(tvb);
3466 static const value_string option82_suboption_vals[] = {
3467 { 0, "Padding" },
3468 { 1, "Agent Circuit ID" },
3469 { 2, "Agent Remote ID" },
3470 { 3, "Reserved" },
3471 { 4, "DOCSIS Device Class" },
3472 { 5, "Link selection" },
3473 { 6, "Subscriber ID" },
3474 { 7, "RADIUS Attributes" },
3475 { 8, "Authentication" },
3476 { 9, "Vendor-Specific Information" },
3477 { 10, "Flags" },
3478 { 11, "Server ID Override" },
3479 { 12, "Relay Agent Identifier" },
3480 { 13, "Access Technology Type" },
3481 { 14, "Access Network Name" },
3482 { 15, "Access Point Name" },
3483 { 16, "Access Point BSSID" },
3484 { 17, "Access Network Operator ID" },
3485 { 18, "Access Network Operator Realm" },
3486 { 19, "Source Port" },
3487 { 150, "Link selection (Cisco proprietary)" },
3488 { 151, "VRF name/VPN ID" },
3489 { 152, "Server ID Override (Cisco proprietary)" },
3490 { 0, NULL }
3493 #define CL_AI_OPTION_DOCSIS_VERSION 1 /* 82:9:4491:1 */
3494 #define CL_AI_OPTION_DPOE_SYSTEM_VERSION 2 /* 82:9:4491:2 */
3495 #define CL_AI_OPTION_DPOE_SYSTEM_DHCPV4_PBB_SERVICE 4 /* 82:9:4491:4 */
3496 #define CL_AI_OPTION_CMTS_CM_SERVICE_CLASS 5 /* 82:9:4491:5 */
3497 #define CL_AI_OPTION_CMTS_MSO_DEFINED_TEXT 6 /* 82:9:4491:6 */
3498 #define CL_AI_OPTION_SECURE_FILE_TRANSFER_URI 7 /* 82:9:4491:7 */
3500 static const value_string option82_cl_tag_vals[] = {
3501 { CL_AI_OPTION_DOCSIS_VERSION, "CMTS DOCSIS version number" },
3502 { CL_AI_OPTION_DPOE_SYSTEM_VERSION, "DPOE System version number" },
3503 { CL_AI_OPTION_DPOE_SYSTEM_DHCPV4_PBB_SERVICE, "DPOE System DHCPv4 PBB service option" },
3504 { CL_AI_OPTION_CMTS_CM_SERVICE_CLASS, "Service Class or QoS Profile Name" },
3505 { CL_AI_OPTION_CMTS_MSO_DEFINED_TEXT, "MSO Defined Text" },
3506 { CL_AI_OPTION_SECURE_FILE_TRANSFER_URI, "Secure File Transfer URI" },
3507 { 0, NULL }
3510 static int
3511 dhcp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree, tvbuff_t *tvb, int optoff,
3512 int optend)
3514 int suboptoff = optoff;
3515 uint8_t subopt, idx, vs_opt, vs_len;
3516 int subopt_len, subopt_end, datalen;
3517 uint32_t enterprise;
3518 proto_item *vti, *ti;
3519 proto_tree *o82_v_tree, *o82_sub_tree;
3520 int clsuboptoff, clsubopt_end;
3522 static const struct basic_types_hfs default_hfs = {
3523 &hf_dhcp_option82_value,
3524 &hf_dhcp_option82_value_ip_address,
3525 &hf_dhcp_option82_value_ip_address,
3526 &hf_dhcp_option82_value_stringz,
3527 NULL,
3528 &hf_dhcp_option82_value_8,
3529 &hf_dhcp_option82_value_16,
3530 NULL,
3531 &hf_dhcp_option82_value_32,
3532 NULL,
3533 NULL
3536 struct opt82_info {
3537 int id;
3538 struct opt_info info;
3540 static const struct opt82_info o82_opt[]= {
3541 {0, {"nop", bytes, &hf_dhcp_option82_padding}}, /* dummy */
3542 {1, {"Agent Circuit ID", bytes, &hf_dhcp_option82_agent_circuit_id}}, /* [RFC3046] */
3543 {2, {"Agent Remote ID", bytes, &hf_dhcp_option82_agent_remote_id}}, /* [RFC3046] */
3544 {3, {"Reserved", bytes, &hf_dhcp_option82_reserved}},
3545 {4, {"DOCSIS Device Class", val_u_long, &hf_dhcp_option82_docsis_device_class}}, /* [RFC3256] */
3546 {5, {"Link selection", ipv4, &hf_dhcp_option82_link_selection}}, /* [RFC3527] */
3547 {6, {"Subscriber ID", string, &hf_dhcp_option82_subscriber_id}}, /* [RFC3993] */ /***** CHECK STRING TYPE */
3548 {7, {"RADIUS Attributes", bytes, &hf_dhcp_option82_radius_attributes}}, /* [RFC4014] */
3549 {8, {"Authentication", bytes, &hf_dhcp_option82_authentication}}, /* [RFC4030] */
3550 {9, {"Vendor-Specific Information", special, &hf_dhcp_option82_vi}}, /* [RFC 4243] */
3551 {10, {"Flags", val_u_byte, &hf_dhcp_option82_flags}}, /* [RFC5010] */
3552 {11, {"Server ID Override", ipv4, &hf_dhcp_option82_server_id_override}}, /* [RFC 5107] */
3553 {12, {"Relay Agent Identifier", bytes, &hf_dhcp_option82_relay_agent_id}}, /* [RFC 6925] */
3554 {13, {"Access Technology Type", bytes, &hf_dhcp_option82_option_ani_att}}, /* [RFC7839] */
3555 {14, {"Access Network Name", string, &hf_dhcp_option82_option_ani_network_name}}, /* [RFC7839] */
3556 {15, {"Access Point Name", string, &hf_dhcp_option82_option_ani_ap_name}}, /* [RFC7839] */
3557 {16, {"Access Point BSSID", special, &hf_dhcp_option82_option_ani_ap_bssid}}, /* [RFC7839] */
3558 {17, {"Access Network Operator ID", bytes, &hf_dhcp_option82_option_ani_operator_id}}, /* [RFC7839] */
3559 {18, {"Access Network Operator Realm", string, &hf_dhcp_option82_option_ani_operator_realm}}, /* [RFC7839] */
3560 {19, {"Source Port", presence, &hf_dhcp_option82_option_source_port}}, /* [RFC8357] */
3561 {150, {"Link selection (Cisco proprietary)", ipv4, &hf_dhcp_option82_link_selection_cisco}}, /* [RFC3527] */
3562 {151, {"VRF name/VPN ID", special, &hf_dhcp_option82_vrf_name_vpn_id}}, /* [RFC2685] */
3563 {152, {"Server ID Override (Cisco proprietary)", ipv4, &hf_dhcp_option82_server_id_override_cisco}} /* [RFC 5107] */
3566 subopt = tvb_get_uint8(tvb, optoff);
3567 suboptoff++;
3569 if (suboptoff >= optend) {
3570 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
3571 "Suboption %d: no room left in option for suboption length", subopt);
3572 return (optend);
3575 subopt_len = tvb_get_uint8(tvb, suboptoff);
3576 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option82_suboption,
3577 tvb, optoff, subopt_len+2, subopt, "(%d) %s", subopt, val_to_str_const(subopt, option82_suboption_vals, "Unknown"));
3579 o82_v_tree = proto_item_add_subtree(vti, ett_dhcp_option82_suboption);
3580 proto_tree_add_item(o82_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
3581 suboptoff++;
3583 subopt_end = suboptoff+subopt_len;
3584 if (subopt_end > optend) {
3585 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
3586 "Suboption %d: no room left in option for suboption value", subopt);
3587 return (optend);
3590 for (idx = 0; idx < array_length(o82_opt); idx++) {
3591 if (o82_opt[idx].id == subopt) {
3592 break;
3596 ti = proto_tree_add_item(o82_v_tree, hf_dhcp_option82_value, tvb, suboptoff, subopt_len, ENC_NA);
3598 if ( (idx >= 1 ) && (idx < array_length(o82_opt)) ) {
3599 proto_item_set_hidden(ti);
3600 if (o82_opt[idx].info.ftype == special) {
3601 switch(subopt)
3603 case 9:
3604 while (suboptoff < subopt_end) {
3605 enterprise = tvb_get_ntohl(tvb, suboptoff);
3606 vti = proto_tree_add_item(o82_v_tree, hf_dhcp_option82_vi_enterprise, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
3607 suboptoff += 4;
3609 o82_sub_tree = proto_item_add_subtree(vti, ett_dhcp_option82_suboption9);
3610 datalen = tvb_get_uint8(tvb, suboptoff);
3611 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_data_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
3612 suboptoff++;
3614 switch (enterprise) {
3615 case VENDOR_CABLELABS: /* CableLabs */
3616 /* Compare CL-SP-CANN-DHCP-Reg-I06-110210 (2011) and
3617 * CL-SP-CANN-DHCP-Reg-I13-160317 (2016) */
3618 clsuboptoff = suboptoff;
3619 clsubopt_end = clsuboptoff + datalen;
3620 while (clsuboptoff < clsubopt_end) {
3621 vs_opt = tvb_get_uint8(tvb, clsuboptoff);
3622 vs_len = tvb_get_uint8(tvb, clsuboptoff+1);
3623 if (vs_opt == CL_AI_OPTION_DOCSIS_VERSION &&
3624 vs_len == 4) {
3626 /* Superseded version with a redundant option code and option-length */
3627 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_option, tvb, clsuboptoff, 1, ENC_BIG_ENDIAN);
3628 clsuboptoff++;
3629 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_option_length, tvb, clsuboptoff, 1, ENC_BIG_ENDIAN);
3630 clsuboptoff++;
3632 vs_opt = tvb_get_uint8(tvb, clsuboptoff);
3633 vs_len = tvb_get_uint8(tvb, clsuboptoff+1);
3635 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_tag, tvb, clsuboptoff, 1, ENC_BIG_ENDIAN);
3636 clsuboptoff++;
3637 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_tag_length, tvb, clsuboptoff, 1, ENC_BIG_ENDIAN);
3638 clsuboptoff++;
3639 switch (vs_opt) {
3640 case CL_AI_OPTION_DOCSIS_VERSION:
3641 proto_tree_add_uint_format_value(o82_sub_tree, hf_dhcp_option82_vi_cl_docsis_version,
3642 tvb, clsuboptoff, 2, 0, "%d.%d",
3643 tvb_get_uint8(tvb, clsuboptoff), tvb_get_uint8(tvb, clsuboptoff+1));
3644 clsuboptoff+=2;
3645 break;
3646 case CL_AI_OPTION_DPOE_SYSTEM_VERSION:
3647 proto_tree_add_uint_format_value(o82_sub_tree, hf_dhcp_option82_vi_cl_dpoe_system_version,
3648 tvb, clsuboptoff, 2, 0, "%d.%d",
3649 tvb_get_uint8(tvb, clsuboptoff), tvb_get_uint8(tvb, clsuboptoff+1));
3650 clsuboptoff+=2;
3651 break;
3652 case CL_AI_OPTION_DPOE_SYSTEM_DHCPV4_PBB_SERVICE:
3653 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_dpoe_system_pbb_service, tvb, clsuboptoff, vs_len, ENC_NA);
3654 break;
3655 case CL_AI_OPTION_CMTS_CM_SERVICE_CLASS:
3656 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_service_class_name, tvb, clsuboptoff, vs_len, ENC_ASCII);
3657 clsuboptoff += vs_len;
3658 break;
3659 case CL_AI_OPTION_CMTS_MSO_DEFINED_TEXT:
3660 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_mso_defined_text, tvb, clsuboptoff, vs_len, ENC_ASCII);
3661 clsuboptoff += vs_len;
3662 break;
3663 case CL_AI_OPTION_SECURE_FILE_TRANSFER_URI:
3664 proto_tree_add_item(o82_sub_tree, hf_dhcp_option82_vi_cl_secure_file_transfer_uri, tvb, clsuboptoff, vs_len, ENC_ASCII);
3665 clsuboptoff += vs_len;
3666 break;
3667 default:
3668 expert_add_info_format(pinfo, vti, &ei_dhcp_option82_vi_cl_tag_unknown, "Unknown tag %d (%d bytes)", vs_opt, vs_len);
3669 clsuboptoff += vs_len;
3670 break;
3673 suboptoff = clsuboptoff;
3674 break;
3675 default:
3676 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_value, tvb, suboptoff, datalen, ENC_NA);
3677 suboptoff += datalen;
3678 break;
3681 break;
3682 case 13: /* Access Technology Type */
3683 if (subopt_len != 2) {
3684 expert_add_info_format(pinfo, vti, &ei_dhcp_bad_length, "length isn't 2");
3685 break;
3687 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_option_ani_att_res, tvb, suboptoff, 1, ENC_NA);
3688 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_option_ani_att_att, tvb, suboptoff+1, 1, ENC_NA);
3689 break;
3690 break;
3691 case 151:
3692 if (subopt_len == 1) {
3693 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_vrf_name_global, tvb, suboptoff, 1, ENC_NA);
3695 else if (subopt_len != 7) {
3696 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_vrf_name, tvb, suboptoff, subopt_len, ENC_ASCII);
3697 } else {
3698 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_vrf_name_vpn_id_oui, tvb, suboptoff, 3, ENC_BIG_ENDIAN);
3699 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_vrf_name_vpn_id_index, tvb, suboptoff+3, 4, ENC_BIG_ENDIAN);
3701 break;
3702 default:
3703 if (o82_opt[idx].info.phf != NULL)
3704 proto_tree_add_item(o82_v_tree, *o82_opt[idx].info.phf, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
3705 else
3706 proto_tree_add_item(o82_v_tree, hf_dhcp_option82_value, tvb, suboptoff, subopt_len, ENC_NA);
3707 break;
3710 else {
3711 dhcp_handle_basic_types(pinfo, o82_v_tree, vti, tvb, o82_opt[idx].info.ftype,
3712 suboptoff, subopt_len, o82_opt[idx].info.phf, &default_hfs);
3716 optoff += (subopt_len + 2);
3717 return optoff;
3720 static int
3721 dissect_dhcpopt_relay_agent_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
3723 int offset = 0;
3725 while (tvb_reported_length_remaining(tvb, offset) > 0) {
3726 offset = dhcp_dhcp_decode_agent_info(pinfo, tree, tree, tvb, offset, tvb_reported_length(tvb));
3729 return tvb_captured_length(tvb);
3732 # define O43PXE_DISCOVERY 6
3733 # define O43PXE_BOOT_SERVER 8
3734 # define O43PXE_BOOT_MENU 9
3735 # define O43PXE_MENU_PROMPT 10
3736 # define O43PXE_BOOT_ITEM 71
3738 static const value_string option43_pxeclient_suboption_vals[] = {
3739 { 0, "Padding" },
3740 { 1, "PXE mtftp IP" },
3741 { 2, "PXE mtftp client port" },
3742 { 3, "PXE mtftp server port" },
3743 { 4, "PXE mtftp timeout" },
3744 { 5, "PXE mtftp delay" },
3745 { O43PXE_DISCOVERY, "PXE discovery control" },
3746 { 7, "PXE multicast address" },
3747 { O43PXE_BOOT_SERVER, "PXE boot servers" },
3748 { O43PXE_BOOT_MENU, "PXE boot menu" },
3749 { O43PXE_MENU_PROMPT, "PXE menu prompt" },
3750 { 11, "PXE multicast address alloc", },
3751 { 12, "PXE credential types" },
3752 { O43PXE_BOOT_ITEM, "PXE boot item" },
3753 { 179, "PXE LCM Server" },
3754 { 180, "PXE LCM Domain" },
3755 { 181, "PXE LCM NIC option 0" },
3756 { 190, "PXE LCM Workgroup" },
3757 { 191, "PXE Discovery" },
3758 { 192, "PXE Configured" },
3759 { 193, "PXE LCM version" },
3760 { 194, "PXE LCM Serial Number" },
3761 { 255, "PXE End" },
3762 { 0, NULL}
3765 static int
3766 dissect_vendor_pxeclient_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
3767 tvbuff_t *tvb, int optoff, int optend)
3769 int suboptoff = optoff;
3770 int suboptoff_start;
3771 uint8_t subopt;
3772 uint8_t subopt_len;
3773 proto_tree *o43pxeclient_v_tree, *o43pxeclient_suboption_tree;
3774 proto_item *vti, *ti;
3775 uint32_t boot_server_ip_count;
3776 uint32_t boot_menu_length;
3778 static const struct basic_types_hfs default_hfs = {
3779 NULL,
3780 &hf_dhcp_option43_value_ip_address,
3781 &hf_dhcp_option43_value_ip_address,
3782 NULL,
3783 NULL,
3784 &hf_dhcp_option43_value_8,
3785 NULL,
3786 NULL,
3787 NULL,
3788 NULL,
3789 NULL
3792 static int * const o43pxe_discovery_hf_flags[] = {
3793 &hf_dhcp_option43_pxeclient_discovery_control_bc,
3794 &hf_dhcp_option43_pxeclient_discovery_control_mc,
3795 &hf_dhcp_option43_pxeclient_discovery_control_serverlist,
3796 &hf_dhcp_option43_pxeclient_discovery_control_bstrap,
3797 NULL
3800 static const struct opt_info o43pxeclient_opt[]= {
3801 /* 0 */ {"nop", special, &hf_dhcp_option43_pxeclient_padding}, /* dummy */
3802 /* 1 */ {"PXE mtftp IP", ipv4_list, &hf_dhcp_option43_pxeclient_mtftp_ip},
3803 /* 2 */ {"PXE mtftp client port", val_u_le_short, &hf_dhcp_option43_pxeclient_mtftp_client_port},
3804 /* 3 */ {"PXE mtftp server port",val_u_le_short, &hf_dhcp_option43_pxeclient_mtftp_server_port},
3805 /* 4 */ {"PXE mtftp timeout", val_u_byte, &hf_dhcp_option43_pxeclient_mtftp_timeout},
3806 /* 5 */ {"PXE mtftp delay", val_u_byte, &hf_dhcp_option43_pxeclient_mtftp_delay},
3807 /* 6 */ {"PXE discovery control", special, NULL},
3808 /* 7 */ {"PXE multicast address", ipv4_list, &hf_dhcp_option43_pxeclient_multicast_address},
3809 /* 8 */ {"PXE boot servers", special, NULL},
3810 /* 9 */ {"PXE boot menu", special, NULL},
3811 /* 10 */ {"PXE menu prompt", special, NULL},
3812 /* 11 */ {"PXE multicast address alloc", special, &hf_dhcp_option43_pxeclient_multicast_address_alloc},
3813 /* 12 */ {"PXE credential types", special, &hf_dhcp_option43_pxeclient_credential_types},
3814 /* 13 */ {"Unassigned", opaque, NULL},
3815 /* 14 */ {"Unassigned", opaque, NULL},
3816 /* 15 */ {"Unassigned", opaque, NULL},
3817 /* 16 */ {"Unassigned", opaque, NULL},
3818 /* 17 */ {"Unassigned", opaque, NULL},
3819 /* 18 */ {"Unassigned", opaque, NULL},
3820 /* 19 */ {"Unassigned", opaque, NULL},
3821 /* 20 */ {"Unassigned", opaque, NULL},
3822 /* 21 */ {"Unassigned", opaque, NULL},
3823 /* 22 */ {"Unassigned", opaque, NULL},
3824 /* 23 */ {"Unassigned", opaque, NULL},
3825 /* 24 */ {"Unassigned", opaque, NULL},
3826 /* 25 */ {"Unassigned", opaque, NULL},
3827 /* 26 */ {"Unassigned", opaque, NULL},
3828 /* 27 */ {"Unassigned", opaque, NULL},
3829 /* 28 */ {"Unassigned", opaque, NULL},
3830 /* 29 */ {"Unassigned", opaque, NULL},
3831 /* 30 */ {"Unassigned", opaque, NULL},
3832 /* 31 */ {"Unassigned", opaque, NULL},
3833 /* 32 */ {"Unassigned", opaque, NULL},
3834 /* 33 */ {"Unassigned", opaque, NULL},
3835 /* 34 */ {"Unassigned", opaque, NULL},
3836 /* 35 */ {"Unassigned", opaque, NULL},
3837 /* 36 */ {"Unassigned", opaque, NULL},
3838 /* 37 */ {"Unassigned", opaque, NULL},
3839 /* 38 */ {"Unassigned", opaque, NULL},
3840 /* 39 */ {"Unassigned", opaque, NULL},
3841 /* 40 */ {"Unassigned", opaque, NULL},
3842 /* 41 */ {"Unassigned", opaque, NULL},
3843 /* 42 */ {"Unassigned", opaque, NULL},
3844 /* 43 */ {"Unassigned", opaque, NULL},
3845 /* 44 */ {"Unassigned", opaque, NULL},
3846 /* 45 */ {"Unassigned", opaque, NULL},
3847 /* 46 */ {"Unassigned", opaque, NULL},
3848 /* 47 */ {"Unassigned", opaque, NULL},
3849 /* 48 */ {"Unassigned", opaque, NULL},
3850 /* 49 */ {"Unassigned", opaque, NULL},
3851 /* 50 */ {"Unassigned", opaque, NULL},
3852 /* 51 */ {"Unassigned", opaque, NULL},
3853 /* 52 */ {"Unassigned", opaque, NULL},
3854 /* 53 */ {"Unassigned", opaque, NULL},
3855 /* 54 */ {"Unassigned", opaque, NULL},
3856 /* 55 */ {"Unassigned", opaque, NULL},
3857 /* 56 */ {"Unassigned", opaque, NULL},
3858 /* 57 */ {"Unassigned", opaque, NULL},
3859 /* 58 */ {"Unassigned", opaque, NULL},
3860 /* 59 */ {"Unassigned", opaque, NULL},
3861 /* 60 */ {"Unassigned", opaque, NULL},
3862 /* 61 */ {"Unassigned", opaque, NULL},
3863 /* 62 */ {"Unassigned", opaque, NULL},
3864 /* 63 */ {"Unassigned", opaque, NULL},
3865 /* 64 */ {"Unassigned", opaque, NULL},
3866 /* 65 */ {"Unassigned", opaque, NULL},
3867 /* 66 */ {"Unassigned", opaque, NULL},
3868 /* 67 */ {"Unassigned", opaque, NULL},
3869 /* 68 */ {"Unassigned", opaque, NULL},
3870 /* 69 */ {"Unassigned", opaque, NULL},
3871 /* 70 */ {"Unassigned", opaque, NULL},
3872 /* 71 */ {"PXE boot item", special, NULL},
3873 /* 72 */ {"Unassigned", opaque, NULL},
3874 /* 73 */ {"Unassigned", opaque, NULL},
3875 /* 74 */ {"Unassigned", opaque, NULL},
3876 /* 75 */ {"Unassigned", opaque, NULL},
3877 /* 76 */ {"Unassigned", opaque, NULL},
3878 /* 77 */ {"Unassigned", opaque, NULL},
3879 /* 78 */ {"Unassigned", opaque, NULL},
3880 /* 79 */ {"Unassigned", opaque, NULL},
3881 /* 80 */ {"Unassigned", opaque, NULL},
3882 /* 81 */ {"Unassigned", opaque, NULL},
3883 /* 82 */ {"Unassigned", opaque, NULL},
3884 /* 83 */ {"Unassigned", opaque, NULL},
3885 /* 84 */ {"Unassigned", opaque, NULL},
3886 /* 85 */ {"Unassigned", opaque, NULL},
3887 /* 86 */ {"Unassigned", opaque, NULL},
3888 /* 87 */ {"Unassigned", opaque, NULL},
3889 /* 88 */ {"Unassigned", opaque, NULL},
3890 /* 89 */ {"Unassigned", opaque, NULL},
3891 /* 90 */ {"Unassigned", opaque, NULL},
3892 /* 91 */ {"Unassigned", opaque, NULL},
3893 /* 92 */ {"Unassigned", opaque, NULL},
3894 /* 93 */ {"Unassigned", opaque, NULL},
3895 /* 94 */ {"Unassigned", opaque, NULL},
3896 /* 95 */ {"Unassigned", opaque, NULL},
3897 /* 96 */ {"Unassigned", opaque, NULL},
3898 /* 97 */ {"Unassigned", opaque, NULL},
3899 /* 98 */ {"Unassigned", opaque, NULL},
3900 /* 99 */ {"Unassigned", opaque, NULL},
3901 /* 100 */ {"Unassigned", opaque, NULL},
3902 /* 101 */ {"Unassigned", opaque, NULL},
3903 /* 102 */ {"Unassigned", opaque, NULL},
3904 /* 103 */ {"Unassigned", opaque, NULL},
3905 /* 104 */ {"Unassigned", opaque, NULL},
3906 /* 105 */ {"Unassigned", opaque, NULL},
3907 /* 106 */ {"Unassigned", opaque, NULL},
3908 /* 107 */ {"Unassigned", opaque, NULL},
3909 /* 108 */ {"Unassigned", opaque, NULL},
3910 /* 109 */ {"Unassigned", opaque, NULL},
3911 /* 110 */ {"Unassigned", opaque, NULL},
3912 /* 111 */ {"Unassigned", opaque, NULL},
3913 /* 112 */ {"Unassigned", opaque, NULL},
3914 /* 113 */ {"Unassigned", opaque, NULL},
3915 /* 114 */ {"Unassigned", opaque, NULL},
3916 /* 115 */ {"Unassigned", opaque, NULL},
3917 /* 116 */ {"Unassigned", opaque, NULL},
3918 /* 117 */ {"Unassigned", opaque, NULL},
3919 /* 118 */ {"Unassigned", opaque, NULL},
3920 /* 119 */ {"Unassigned", opaque, NULL},
3921 /* 120 */ {"Unassigned", opaque, NULL},
3922 /* 121 */ {"Unassigned", opaque, NULL},
3923 /* 122 */ {"Unassigned", opaque, NULL},
3924 /* 123 */ {"Unassigned", opaque, NULL},
3925 /* 124 */ {"Unassigned", opaque, NULL},
3926 /* 125 */ {"Unassigned", opaque, NULL},
3927 /* 126 */ {"Unassigned", opaque, NULL},
3928 /* 127 */ {"Unassigned", opaque, NULL},
3929 /* 128 */ {"Unassigned", opaque, NULL},
3930 /* 129 */ {"Unassigned", opaque, NULL},
3931 /* 130 */ {"Unassigned", opaque, NULL},
3932 /* 131 */ {"Unassigned", opaque, NULL},
3933 /* 132 */ {"Unassigned", opaque, NULL},
3934 /* 133 */ {"Unassigned", opaque, NULL},
3935 /* 134 */ {"Unassigned", opaque, NULL},
3936 /* 135 */ {"Unassigned", opaque, NULL},
3937 /* 136 */ {"Unassigned", opaque, NULL},
3938 /* 137 */ {"Unassigned", opaque, NULL},
3939 /* 138 */ {"Unassigned", opaque, NULL},
3940 /* 139 */ {"Unassigned", opaque, NULL},
3941 /* 140 */ {"Unassigned", opaque, NULL},
3942 /* 141 */ {"Unassigned", opaque, NULL},
3943 /* 142 */ {"Unassigned", opaque, NULL},
3944 /* 143 */ {"Unassigned", opaque, NULL},
3945 /* 144 */ {"Unassigned", opaque, NULL},
3946 /* 145 */ {"Unassigned", opaque, NULL},
3947 /* 146 */ {"Unassigned", opaque, NULL},
3948 /* 147 */ {"Unassigned", opaque, NULL},
3949 /* 148 */ {"Unassigned", opaque, NULL},
3950 /* 149 */ {"Unassigned", opaque, NULL},
3951 /* 150 */ {"Unassigned", opaque, NULL},
3952 /* 151 */ {"Unassigned", opaque, NULL},
3953 /* 152 */ {"Unassigned", opaque, NULL},
3954 /* 153 */ {"Unassigned", opaque, NULL},
3955 /* 154 */ {"Unassigned", opaque, NULL},
3956 /* 155 */ {"Unassigned", opaque, NULL},
3957 /* 156 */ {"Unassigned", opaque, NULL},
3958 /* 157 */ {"Unassigned", opaque, NULL},
3959 /* 158 */ {"Unassigned", opaque, NULL},
3960 /* 159 */ {"Unassigned", opaque, NULL},
3961 /* 160 */ {"Unassigned", opaque, NULL},
3962 /* 161 */ {"Unassigned", opaque, NULL},
3963 /* 162 */ {"Unassigned", opaque, NULL},
3964 /* 163 */ {"Unassigned", opaque, NULL},
3965 /* 164 */ {"Unassigned", opaque, NULL},
3966 /* 165 */ {"Unassigned", opaque, NULL},
3967 /* 166 */ {"Unassigned", opaque, NULL},
3968 /* 167 */ {"Unassigned", opaque, NULL},
3969 /* 168 */ {"Unassigned", opaque, NULL},
3970 /* 169 */ {"Unassigned", opaque, NULL},
3971 /* 170 */ {"Unassigned", opaque, NULL},
3972 /* 171 */ {"Unassigned", opaque, NULL},
3973 /* 172 */ {"Unassigned", opaque, NULL},
3974 /* 173 */ {"Unassigned", opaque, NULL},
3975 /* 174 */ {"Unassigned", opaque, NULL},
3976 /* 175 */ {"Unassigned", opaque, NULL},
3977 /* 176 */ {"Unassigned", opaque, NULL},
3978 /* 177 */ {"Unassigned", opaque, NULL},
3979 /* 178 */ {"Unassigned", opaque, NULL},
3980 /* 179 */ {"LCM Server", string, &hf_dhcp_option43_pxeclient_lcm_server},
3981 /* 180 */ {"LCM Domain", string, &hf_dhcp_option43_pxeclient_lcm_domain},
3982 /* 181 */ {"LCM NIC Option 0", bytes, &hf_dhcp_option43_pxeclient_lcm_nic_option},
3983 /* 182 */ {"Unassigned", opaque, NULL},
3984 /* 183 */ {"Unassigned", opaque, NULL},
3985 /* 184 */ {"Unassigned", opaque, NULL},
3986 /* 185 */ {"Unassigned", opaque, NULL},
3987 /* 186 */ {"Unassigned", opaque, NULL},
3988 /* 187 */ {"Unassigned", opaque, NULL},
3989 /* 188 */ {"Unassigned", opaque, NULL},
3990 /* 189 */ {"Unassigned", opaque, NULL},
3991 /* 190 */ {"LCM Workgroup", string, &hf_dhcp_option43_pxeclient_lcm_workgroup},
3992 /* 191 */ {"Discovery", val_boolean, &hf_dhcp_option43_pxeclient_discovery},
3993 /* 192 */ {"Configured", val_boolean, &hf_dhcp_option43_pxeclient_configured},
3994 /* 193 */ {"LCM Version", val_u_long, &hf_dhcp_option43_pxeclient_lcm_version},
3995 /* 194 */ {"LCM Serial Number", string, &hf_dhcp_option43_pxeclient_lcm_serial},
3996 /* 255 {"PXE end options", special, &hf_dhcp_option43_pxeclient_end} */
3999 subopt = tvb_get_uint8(tvb, optoff);
4000 suboptoff++;
4002 if (subopt == 0) {
4003 proto_tree_add_item(v_tree, hf_dhcp_option43_pxeclient_padding, tvb, optoff, 1, ENC_BIG_ENDIAN);
4004 return (suboptoff);
4005 } else if (subopt == 255) { /* End Option */
4006 proto_tree_add_item(v_tree, hf_dhcp_option43_pxeclient_end, tvb, optoff, 1, ENC_BIG_ENDIAN);
4007 /* Make sure we skip any junk left this option */
4008 return (optend);
4011 if (suboptoff >= optend) {
4012 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
4013 "Suboption %d: no room left in option for suboption length", subopt);
4014 return (optend);
4017 subopt_len = tvb_get_uint8(tvb, suboptoff);
4018 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option43_pxeclient_suboption,
4019 tvb, optoff, subopt_len+2, subopt, "(%d) %s",
4020 subopt, val_to_str_const(subopt, option43_pxeclient_suboption_vals, "Unknown"));
4022 o43pxeclient_v_tree = proto_item_add_subtree(vti, ett_dhcp_option43_suboption);
4023 proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
4024 suboptoff++;
4026 ti = proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_option43_value, tvb, suboptoff, subopt_len, ENC_NA);
4027 proto_item_set_hidden(ti);
4029 if ((subopt < 1) || (subopt >= array_length(o43pxeclient_opt))) {
4030 expert_add_info_format(pinfo, vti, &ei_dhcp_suboption_invalid, "Unknown suboption %d (%d bytes)", subopt, subopt_len);
4031 } else if (o43pxeclient_opt[subopt].ftype == special) {
4032 /* I may need to decode that properly one day */
4033 if (o43pxeclient_opt[subopt].phf != NULL)
4034 proto_tree_add_item(o43pxeclient_v_tree, *o43pxeclient_opt[subopt].phf, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
4035 else {
4036 switch(subopt)
4038 case O43PXE_DISCOVERY:
4039 proto_tree_add_bitmask(o43pxeclient_v_tree, tvb, suboptoff, hf_dhcp_option43_pxeclient_discovery_control,
4040 ett_dhcp_option43_suboption_discovery, o43pxe_discovery_hf_flags, ENC_BIG_ENDIAN);
4041 break;
4042 case O43PXE_BOOT_SERVER:
4043 suboptoff_start = suboptoff;
4044 ti = proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_option43_pxeclient_boot_servers, tvb, suboptoff, subopt_len, ENC_NA);
4045 o43pxeclient_suboption_tree = proto_item_add_subtree(ti, ett_dhcp_option43_suboption_tree);
4046 while((suboptoff - suboptoff_start) < (subopt_len - 1)) {
4047 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_server_type, tvb, suboptoff, 2, ENC_BIG_ENDIAN);
4048 suboptoff += 2;
4049 proto_tree_add_item_ret_uint(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_server_count, tvb, suboptoff, 1, ENC_BIG_ENDIAN, &boot_server_ip_count);
4050 suboptoff += 1;
4051 while(boot_server_ip_count > 0) {
4052 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_server_ip, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
4053 suboptoff += 4;
4054 boot_server_ip_count -=1;
4057 break;
4058 case O43PXE_BOOT_MENU:
4059 suboptoff_start = suboptoff;
4060 ti = proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_option43_pxeclient_boot_menu, tvb, suboptoff, subopt_len, ENC_NA);
4061 o43pxeclient_suboption_tree = proto_item_add_subtree(ti, ett_dhcp_option43_suboption_tree);
4062 while((suboptoff - suboptoff_start) < (subopt_len - 1)) {
4063 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_menu_type, tvb, suboptoff, 2, ENC_BIG_ENDIAN);
4064 suboptoff += 2;
4065 proto_tree_add_item_ret_uint(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_menu_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN, &boot_menu_length);
4066 suboptoff += 1;
4067 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_menu_desc, tvb, suboptoff, boot_menu_length, ENC_ASCII);
4068 suboptoff += boot_menu_length;
4070 break;
4071 case O43PXE_MENU_PROMPT:
4072 ti = proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_option43_pxeclient_menu_prompt, tvb, suboptoff, subopt_len, ENC_NA);
4073 o43pxeclient_suboption_tree = proto_item_add_subtree(ti, ett_dhcp_option43_suboption_tree);
4074 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_menu_prompt_timeout, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
4075 suboptoff += 1;
4076 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_menu_prompt_prompt, tvb, suboptoff, subopt_len - 1, ENC_ASCII);
4077 break;
4078 case O43PXE_BOOT_ITEM:
4079 ti = proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_option43_pxeclient_boot_item, tvb, suboptoff, subopt_len, ENC_NA);
4080 o43pxeclient_suboption_tree = proto_item_add_subtree(ti, ett_dhcp_option43_suboption_tree);
4081 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_item_type, tvb, suboptoff, 2, ENC_BIG_ENDIAN);
4082 suboptoff += 2;
4083 proto_tree_add_item(o43pxeclient_suboption_tree, hf_dhcp_option43_pxeclient_boot_item_layer, tvb, suboptoff, 2, ENC_NA);
4084 break;
4085 default:
4086 proto_tree_add_item(o43pxeclient_v_tree, hf_dhcp_option43_value, tvb, suboptoff, subopt_len, ENC_NA);
4087 break;
4090 } else {
4091 if (dhcp_handle_basic_types(pinfo, o43pxeclient_v_tree, vti, tvb, o43pxeclient_opt[subopt].ftype,
4092 suboptoff, subopt_len, o43pxeclient_opt[subopt].phf, &default_hfs) == 0)
4094 expert_add_info_format(pinfo, vti, &ei_dhcp_subopt_unknown_type, "ERROR, please report: Unknown subopt type handler %d", subopt);
4098 optoff += (subopt_len + 2);
4099 return optoff;
4102 static bool
4103 dissect_pxeclient_vendor_info_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
4105 int offset = 0;
4106 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
4107 proto_tree* vendor_tree;
4109 /* PXE protocol 2.1 as described in the Intel specs */
4110 if ((option_data->vendor_class_id == NULL) ||
4111 (strncmp((const char*)option_data->vendor_class_id, "PXEClient", strlen("PXEClient")) != 0))
4112 return false;
4114 proto_item_append_text(tree, " (PXEClient)");
4115 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
4117 while (tvb_reported_length_remaining(tvb, offset) > 0) {
4118 offset = dissect_vendor_pxeclient_suboption(pinfo, tree, vendor_tree,
4119 tvb, offset, tvb_reported_length(tvb));
4122 return true;
4125 static void
4126 dissect_vendor_avaya_param(proto_tree *tree, packet_info *pinfo, proto_item *vti,
4127 tvbuff_t *tvb, int optoff, wmem_strbuf_t *avaya_param_buf)
4129 const char *field;
4130 int len;
4132 field = wmem_strbuf_get_str(avaya_param_buf);
4133 len = (int)wmem_strbuf_get_len(avaya_param_buf);
4135 if((strncmp(field, "TLSSRVR=", 8) == 0) && ( len > 8 )) {
4136 proto_tree_add_string(tree, hf_dhcp_option242_avaya_tlssrvr, tvb, optoff, len, field + 8);
4138 else if((strncmp(field, "HTTPSRVR=", 9) == 0) && ( len > 9)) {
4139 proto_tree_add_string(tree, hf_dhcp_option242_avaya_httpsrvr, tvb, optoff, len, field + 9);
4141 else if((strncmp(field, "HTTPDIR=", 8) == 0) && ( len > 8)) {
4142 proto_tree_add_string(tree, hf_dhcp_option242_avaya_httpdir, tvb, optoff, len, field + 8);
4144 else if((strncmp(field, "STATIC=", 7) == 0) && ( len > 7)) {
4145 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_static, tvb, optoff, len, field + 7, "%s (%s)", field + 7, str_to_str(field + 7, option242_avaya_static_vals, "Unknown (%s)"));
4147 else if((strncmp(field, "MCIPADD=", 8) == 0) && ( len > 8)) {
4148 proto_tree_add_string(tree, hf_dhcp_option242_avaya_mcipadd, tvb, optoff, len, field + 8);
4150 else if((strncmp(field, "DOT1X=", 6) == 0) && ( len > 6)) {
4151 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_dot1x, tvb, optoff, len, field + 6, "%s (%s)", field + 6, str_to_str(field + 6, option242_avaya_dot1x_vals, "Unknown (%s)"));
4153 else if((strncmp(field, "ICMPDU=", 7) == 0) && ( len > 7)) {
4154 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_icmpdu, tvb, optoff, len, field + 7, "%s (%s)", field + 7, str_to_str(field + 7, option242_avaya_icmpdu_vals, "Unknown (%s)"));
4156 else if((strncmp(field, "ICMPRED=", 8) == 0) && ( len > 8)) {
4157 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_icmpred, tvb, optoff, len, field + 8, "%s (%s)", field + 8, str_to_str(field + 8, option242_avaya_icmpred_vals, "Unknown (%s)"));
4159 else if((strncmp(field, "L2Q=", 4) == 0) && ( len > 4)) {
4160 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_l2q, tvb, optoff, len, field + 4, "%s (%s)", field + 4, str_to_str(field + 4, option242_avaya_l2q_vals, "Unknown (%s)"));
4162 else if((strncmp(field, "L2QVLAN=", 8) == 0) && ( len > 8)) {
4163 int32_t val = -1;
4164 bool val_valid;
4165 proto_item* pi;
4167 val_valid = ws_strtoi32(field + 8, NULL, &val);
4168 pi = proto_tree_add_int(tree, hf_dhcp_option242_avaya_l2qvlan, tvb, optoff, len, val);
4169 if (val_valid)
4170 expert_add_info(pinfo, pi, &ei_dhcp_option242_avaya_l2qvlan_invalid);
4172 else if((strncmp(field, "LOGLOCAL=", 9) == 0) && ( len > 9)) {
4173 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_loglocal, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_loglocal_vals, "Unknown (%s)"));
4175 else if((strncmp(field, "PHY1STAT=", 9) == 0) && ( len > 9)) {
4176 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_phy1stat, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_phystat_vals, "Unknown (%s)"));
4178 else if((strncmp(field, "PHY2STAT=", 9) == 0) && ( len > 9)) {
4179 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_phy2stat, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_phystat_vals, "Unknown (%s)"));
4181 else if((strncmp(field, "PROCPSWD=", 9) == 0) && ( len > 9)) {
4182 proto_tree_add_string(tree, hf_dhcp_option242_avaya_procpswd, tvb, optoff, len, field + 9);
4184 else if((strncmp(field, "PROCSTAT=", 9) == 0) && ( len > 9)) {
4185 proto_tree_add_string_format_value(tree, hf_dhcp_option242_avaya_procstat, tvb, optoff, len, field + 9, "%s (%s)", field + 9, str_to_str(field + 9, option242_avaya_procstat_vals, "Unknown (%s)"));
4187 else if((strncmp(field, "SNMPADD=", 8) == 0) && ( len > 8)) {
4188 proto_tree_add_string(tree, hf_dhcp_option242_avaya_snmpadd, tvb, optoff, len, field + 8);
4190 else if((strncmp(field, "SNMPSTRING=", 11) == 0) && ( len > 11)) {
4191 proto_tree_add_string(tree, hf_dhcp_option242_avaya_snmpstring, tvb, optoff, len, field + 11);
4193 else if((strncmp(field, "VLANTEST=", 9) == 0) && ( len > 9)) {
4194 int32_t val = -1;
4195 bool val_valid;
4196 proto_item* pi;
4198 val_valid = ws_strtoi32(field + 9, NULL, &val);
4199 pi = proto_tree_add_int(tree, hf_dhcp_option242_avaya_vlantest, tvb, optoff, len, val);
4200 if (!val_valid)
4201 expert_add_info(pinfo, pi, &ei_dhcp_option242_avaya_vlantest_invalid);
4203 else {
4204 expert_add_info_format(pinfo, vti, &ei_dhcp_subopt_unknown_type, "ERROR, Unknown Avaya IP Telephone parameter %s", field);
4208 /* RFC3825Decoder:
4210 * https://web.archive.org/web/20100312054301/http://www.enum.at/rfc3825encoder.529.0.html
4212 * The code is no longer available.
4214 static void
4215 rfc3825_lci_to_fixpoint(const unsigned char lci[16], struct rfc3825_location_fixpoint_t *fixpoint)
4217 fixpoint->latitude_res = (lci[0]>>2) & 0x3F; /* make sure that right-shift does not copy sign bit */
4218 if (lci[0] & 2) { /* LSB<<1 contains the sign of the latitude */
4219 /* Latitude is negative, expand two's complement */
4220 fixpoint->latitude = (((int64_t)lci[0] & 3)<<32) | ((int64_t)lci[1]<<24) |
4221 ((int64_t)lci[2]<<16) | ((int64_t)lci[3]<<8) |
4222 (int64_t)lci[4] | ((int64_t)0x3FFFFFFF<<34);
4224 } else {
4225 /* Latitude is positive */
4226 fixpoint->latitude = (((int64_t)lci[0] & 3)<<32) | ((int64_t)lci[1]<<24) |
4227 ((int64_t)lci[2]<<16) | ((int64_t)lci[3]<<8) |
4228 (int64_t)lci[4];
4230 fixpoint->longitude_res = (lci[5]>>2) & 0x3F; /* make sure that right-shift does not copy sign bit */
4231 if (lci[5] & 2) { /* LSB<<1 contains the sign of the latitude */
4232 /* Longitude is negative, expand two's complement */
4233 fixpoint->longitude = (((int64_t)lci[5] & 3)<<32) | ((int64_t)lci[6]<<24) |
4234 ((int64_t)lci[7]<<16) | ((int64_t)lci[8]<<8) |
4235 (int64_t)lci[9] | ((int64_t)0x3FFFFFFF<<34);
4237 } else {
4238 /* Longitude is positive */
4239 fixpoint->longitude = (((int64_t)lci[5] & 3)<<32) | ((int64_t)lci[6]<<24) |
4240 ((int64_t)lci[7]<<16) | ((int64_t)lci[8]<<8) |
4241 (int64_t)lci[9];
4243 fixpoint->altitude_type = (lci[10]>>4) & 0x0F; /* make sure that right-shift does not copy sign bit */
4244 fixpoint->altitude_res = ((lci[10] & 0x0F) << 2) | ((lci[11]>>6) & 0x03);
4245 if (lci[11] & 0x20) { /* LSB<<1 contains the sign of the latitude */
4246 /* Altitude is negative, expand two's complement */
4247 fixpoint->altitude = (((int32_t)lci[11] & 0x3F)<<24) | ((int32_t)lci[12]<<16) |
4248 ((int32_t)lci[13]<<8) | ((int32_t)lci[14]) |
4249 ((int32_t)0x03<<30);
4251 } else {
4252 /* Altitude is positive */
4253 fixpoint->altitude = (((int32_t)lci[11] & 0x3F)<<24) | ((int32_t)lci[12]<<16) |
4254 ((int32_t)lci[13]<<8) | ((int32_t)lci[14]);
4257 fixpoint->datum_type = lci[15];
4261 /* RFC3825Decoder:
4263 * https://web.archive.org/web/20100312054301/http://www.enum.at/rfc3825encoder.529.0.html
4265 * The code is no longer available.
4267 static int
4268 rfc3825_fixpoint_to_decimal(struct rfc3825_location_fixpoint_t *fixpoint, struct rfc3825_location_decimal_t *decimal)
4270 /* Latitude */
4271 decimal->latitude = (double) fixpoint->latitude / (1 << 25);
4272 if ((decimal->latitude > 90) || (decimal->latitude < -90)) {
4273 return RFC3825_LATITUDE_OUTOFRANGE;
4276 /* Latitude Uncertainty */
4277 if (fixpoint->latitude_res > 34) {
4278 return RFC3825_LATITUDE_UNCERTAINTY_OUTOFRANGE;
4280 if (fixpoint->latitude_res > 8 ) {
4281 decimal->latitude_res = (double) 1 / (UINT64_C(1) << (fixpoint->latitude_res - 8));
4282 } else {
4283 decimal->latitude_res = (double) (UINT64_C(1) << (8 - fixpoint->latitude_res));
4286 /* Longitude */
4287 decimal->longitude = (double) fixpoint->longitude / (1 << 25);
4288 if ((decimal->longitude > 180) || (decimal->longitude < -180)) {
4289 return RFC3825_LONGITUDE_OUTOFRANGE;
4292 /* Longitude Uncertainty */
4293 if (fixpoint->longitude_res > 34) {
4294 return RFC3825_LONGITUDE_UNCERTAINTY_OUTOFRANGE;
4296 if (fixpoint->longitude_res > 8 ) {
4297 decimal->longitude_res = (double) 1 / (UINT64_C(1) << (fixpoint->longitude_res - 8));
4298 } else {
4299 decimal->longitude_res = (double) (UINT64_C(1) << (8 - fixpoint->longitude_res));
4302 /* Altitude Type */
4303 decimal->altitude_type = fixpoint->altitude_type;
4304 decimal->altitude = 0;
4305 decimal->altitude_res = 0;
4307 if (decimal->altitude_type == 0) { /* Unknown */
4308 } else if (decimal->altitude_type == 1) { /* Meters */
4309 /* Altitude */
4310 decimal->altitude = (double) fixpoint->altitude / (1 << 8);
4311 if ((decimal->altitude > ((int32_t) 1<<21)-1) || (decimal->altitude < ((int32_t) -(1<<21))))
4312 return RFC3825_ALTITUDE_OUTOFRANGE;
4314 /* Altitude Uncertainty */
4315 if (fixpoint->altitude_res > 30) {
4316 return RFC3825_ALTITUDE_UNCERTAINTY_OUTOFRANGE;
4318 if (fixpoint->altitude_res > 21 ) {
4319 decimal->altitude_res = (double) 1 / (UINT64_C(1) << (fixpoint->altitude_res - 21));
4320 } else {
4321 decimal->altitude_res = (double) (UINT64_C(1) << (21 - fixpoint->altitude_res));
4323 } else if (decimal->altitude_type == 2) { /* Floors */
4324 /* Altitude */
4325 if ((fixpoint->altitude_res != 30) && (fixpoint->altitude_res != 0)) {
4326 return RFC3825_ALTITUDE_UNCERTAINTY_OUTOFRANGE;
4328 decimal->altitude = (double) fixpoint->altitude / (1 << 8);
4329 } else { /* invalid type */
4330 return RFC3825_ALTITUDE_TYPE_OUTOFRANGE;
4333 /* Datum Type */
4334 decimal->datum_type = 0;
4335 if ((fixpoint->datum_type > 3) || (fixpoint->datum_type < 1)) {
4336 return RFC3825_DATUM_TYPE_OUTOFRANGE;
4338 decimal->datum_type = fixpoint->datum_type;
4340 return RFC3825_NOERROR;
4343 static int
4344 dissect_dhcpopt_isns(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
4346 static int * const isns_functions_hf_flags[] = {
4347 &hf_dhcp_option_isns_functions_enabled,
4348 &hf_dhcp_option_isns_functions_dd_authorization,
4349 &hf_dhcp_option_isns_functions_sec_policy_distibution,
4350 &hf_dhcp_option_isns_functions_reserved,
4351 NULL
4354 static int * const isns_dda_hf_flags[] = {
4355 &hf_dhcp_option_isns_discovery_domain_access_enabled,
4356 &hf_dhcp_option_isns_discovery_domain_access_control_node,
4357 &hf_dhcp_option_isns_discovery_domain_access_iscsi_target,
4358 &hf_dhcp_option_isns_discovery_domain_access_iscsi_inititator,
4359 &hf_dhcp_option_isns_discovery_domain_access_ifcp_target_port,
4360 &hf_dhcp_option_isns_discovery_domain_access_ifcp_initiator_port,
4361 &hf_dhcp_option_isns_discovery_domain_access_reserved,
4362 NULL
4365 static int * const isns_administrative_flags[] = {
4366 &hf_dhcp_option_isns_administrative_flags_enabled,
4367 &hf_dhcp_option_isns_administrative_flags_heartbeat,
4368 &hf_dhcp_option_isns_administrative_flags_management_scns,
4369 &hf_dhcp_option_isns_administrative_flags_default_dd,
4370 &hf_dhcp_option_isns_administrative_flags_reserved,
4371 NULL
4374 static int * const isns_server_security_flags[] = {
4375 &hf_dhcp_option_isns_server_security_bitmap_enabled,
4376 &hf_dhcp_option_isns_server_security_bitmap_ike_ipsec_enabled,
4377 &hf_dhcp_option_isns_server_security_bitmap_main_mode,
4378 &hf_dhcp_option_isns_server_security_bitmap_aggressive_mode,
4379 &hf_dhcp_option_isns_server_security_bitmap_pfs,
4380 &hf_dhcp_option_isns_server_security_bitmap_transport_mode,
4381 &hf_dhcp_option_isns_server_security_bitmap_tunnel_mode,
4382 &hf_dhcp_option_isns_server_security_bitmap_reserved,
4383 NULL
4386 uint16_t function_flags, dd_access_flags, administrative_flags;
4387 uint32_t server_security_flags;
4388 proto_tree *server_tree;
4389 proto_item *item;
4390 int length = tvb_reported_length(tvb);
4391 int offset = 0, heartbeat_set = 0;
4393 if (length < 14) {
4394 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be >= 14");
4395 return 1;
4398 item = proto_tree_add_bitmask(tree, tvb, offset, hf_dhcp_option_isns_functions,
4399 ett_dhcp_isns_functions, isns_functions_hf_flags, ENC_BIG_ENDIAN);
4400 function_flags = tvb_get_ntohs(tvb, offset);
4401 /* RFC 4174, section "2.1. iSNS Functions Field" specifies that if
4402 * the field "Function Fields Enabled" is set to 0, then "the contents
4403 * of all other iSNS Function fields MUST be ignored. We will display
4404 * the fields but add an informational expert info. This goes for all
4405 * the bitmasks: iSNS Functions, DD Access, Administrative Flags, iSNS
4406 * Server Security Bitmap */
4407 if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(function_flags, F_ISNS_FUNCTIONS_ENABLED))
4408 expert_add_info(pinfo, item, &ei_dhcp_option_isns_ignored_bitfield);
4410 offset += 2;
4411 item = proto_tree_add_bitmask(tree, tvb, offset, hf_dhcp_option_isns_discovery_domain_access,
4412 ett_dhcp_isns_discovery_domain_access, isns_dda_hf_flags, ENC_BIG_ENDIAN);
4413 dd_access_flags = tvb_get_ntohs(tvb, offset);
4414 if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(dd_access_flags, F_ISNS_DD_ACCESS_ENABLED))
4415 expert_add_info(pinfo, item, &ei_dhcp_option_isns_ignored_bitfield);
4417 offset += 2;
4418 administrative_flags = tvb_get_ntohs(tvb, offset);
4419 if (administrative_flags & F_ISNS_ADMIN_FLAGS_ENABLED) {
4420 if ((administrative_flags & F_ISNS_ADMIN_FLAGS_HEARTBEAT)) {
4421 if (length < 18) {
4422 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length must be >= 18");
4423 return offset;
4425 heartbeat_set = 1;
4428 item = proto_tree_add_bitmask(tree, tvb, offset, hf_dhcp_option_isns_administrative_flags,
4429 ett_dhcp_isns_administrative_flags, isns_administrative_flags, ENC_BIG_ENDIAN);
4430 if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(administrative_flags, F_ISNS_ADMIN_FLAGS_ENABLED))
4431 expert_add_info(pinfo, item, &ei_dhcp_option_isns_ignored_bitfield);
4433 offset += 2;
4434 item = proto_tree_add_bitmask(tree, tvb, offset, hf_dhcp_option_isns_server_security_bitmap,
4435 ett_dhcp_isns_server_security_bitmap, isns_server_security_flags, ENC_BIG_ENDIAN);
4436 server_security_flags = tvb_get_ntohl(tvb, offset);
4437 if (ISNS_BITFIELD_NZ_MUST_BE_IGNORED(server_security_flags, F_ISNS_SRV_SEC_BITMAP_ENABLED))
4438 expert_add_info(pinfo, item, &ei_dhcp_option_isns_ignored_bitfield);
4440 offset += 4;
4441 if (heartbeat_set) {
4442 proto_tree_add_item(tree, hf_dhcp_option_isns_heartbeat_originator_addr, tvb, offset, 4, ENC_BIG_ENDIAN);
4443 offset += 4;
4446 proto_tree_add_item(tree, hf_dhcp_option_isns_primary_server_addr, tvb, offset, 4, ENC_BIG_ENDIAN);
4448 offset += 4;
4449 if (tvb_reported_length_remaining(tvb, offset) > 0) {
4450 server_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_dhcp_isns_secondary_server_addr,
4451 &item, "Secondary iSNS Servers");
4452 dhcp_handle_basic_types(pinfo, server_tree, item, tvb, ipv4_list, offset, tvb_reported_length_remaining(tvb, offset),
4453 &hf_dhcp_option_isns_secondary_server_addr_list, NULL);
4456 return tvb_captured_length(tvb);
4459 static const value_string option43_cl_suboption_vals[] = {
4460 { 0, "Padding" },
4461 { 1, "Suboption Request List" },
4462 { 2, "Device Type" },
4463 { 3, "eSAFE Types" },
4464 { 4, "Serial Number" },
4465 { 5, "Hardware Version" },
4466 { 6, "Software Version" },
4467 { 7, "Boot ROM version" },
4468 { 8, "Organizationally Unique Identifier" },
4469 { 9, "Model Number" },
4470 { 10, "Vendor Name" },
4471 { 11, "Address Realm" },
4472 { 12, "CM/PS System Description" },
4473 { 13, "CM/PS Firmware Revision" },
4474 { 14, "Firewall Policy File Version" },
4475 { 15, "eSafe Config File Devices" },
4476 { 18, "Video Security Type" },
4477 { 31, "MTA MAC Address" },
4478 { 32, "Correlation ID" },
4479 { 51, "Vendor Name" },
4480 { 52, "CableCARD Capability" },
4481 { 53, "Device Identification (CA)" },
4482 { 54, "Device Identification (X.509)" },
4483 { 179, "LCM Server" },
4484 { 180, "LCM Domain" },
4485 { 181, "LCM NIC option 0" },
4486 { 190, "LCM Workgroup" },
4487 { 191, "Discovery" },
4488 { 192, "HH Configured" },
4489 { 193, "LCM Version" },
4490 { 194, "LCM Serial Number" },
4491 { 255, "CL End" },
4492 { 0, NULL}
4495 static const value_string cablehome_subopt11_vals[] = {
4496 { 1, "PS WAN-Man" },
4497 { 2, "PS WAN-Data" },
4498 { 0, NULL }
4501 static int
4502 dissect_vendor_cablelabs_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
4503 tvbuff_t *tvb, int optoff, int optend)
4505 int suboptoff = optoff;
4506 uint8_t subopt;
4507 uint8_t subopt_len;
4508 proto_tree *o43cl_v_tree;
4509 proto_item *vti;
4511 static const struct basic_types_hfs default_hfs = {
4512 &hf_dhcp_option43_value,
4513 NULL,
4514 NULL,
4515 &hf_dhcp_option43_value_stringz,
4516 NULL,
4517 &hf_dhcp_option43_value_8,
4518 NULL,
4519 NULL,
4520 &hf_dhcp_option43_value_32,
4521 NULL,
4522 NULL
4525 static const struct opt_info o43cablelabs_opt[]= {
4526 /* 0 */ {"nop", special, &hf_dhcp_option43_cl_padding}, /* dummy */
4527 /* 1 */ {"Suboption Request List", string, &hf_dhcp_option43_cl_suboption_request_list},
4528 /* 2 */ {"Device Type", string, &hf_dhcp_option43_cl_device_type},
4529 /* 3 */ {"eSAFE Types", string, &hf_dhcp_option43_cl_esafe_type},
4530 /* 4 */ {"Serial Number", string, &hf_dhcp_option43_cl_serial_number},
4531 /* 5 */ {"Hardware Version", string, &hf_dhcp_option43_cl_hardware_version},
4532 /* 6 */ {"Software Version", string, &hf_dhcp_option43_cl_software_version},
4533 /* 7 */ {"Boot ROM version", string, &hf_dhcp_option43_cl_boot_rom_version},
4534 /* 8 */ {"Organizationally Unique Identifier", special, &hf_dhcp_option43_cl_oui_bytes},
4535 /* 9 */ {"Model Number", string, &hf_dhcp_option43_cl_model_number},
4536 /* 10 */ {"Vendor Name", string, &hf_dhcp_option43_cl_vendor_name10},
4537 /* *** 11-30: CableHome *** */
4538 /* 11 */ {"Address Realm", val_u_byte, &hf_dhcp_option43_cl_address_realm},
4539 /* 12 */ {"CM/PS System Description", string, &hf_dhcp_option43_cl_cm_ps_system_desc},
4540 /* 13 */ {"CM/PS Firmware Revision", string, &hf_dhcp_option43_cl_cm_ps_firmware_revision},
4541 /* 14 */ {"Firewall Policy File Version", string, &hf_dhcp_option43_cl_firewall_policy_file_version},
4542 /* 15 */ {"eSafe Config File Devices", string, &hf_dhcp_option43_cl_esafe_config_file_devices},
4543 /* 16 */ {"Unassigned (CableHome)", special, NULL},
4544 /* 17 */ {"Unassigned (CableHome)", special, NULL},
4545 /* 18 */ {"Video Security Type", string, &hf_dhcp_option43_cl_video_security_tape},
4546 /* 19 */ {"Unassigned (CableHome)", special, NULL},
4547 /* 20 */ {"Unassigned (CableHome)", special, NULL},
4548 /* 21 */ {"Unassigned (CableHome)", special, NULL},
4549 /* 22 */ {"Unassigned (CableHome)", special, NULL},
4550 /* 23 */ {"Unassigned (CableHome)", special, NULL},
4551 /* 24 */ {"Unassigned (CableHome)", special, NULL},
4552 /* 25 */ {"Unassigned (CableHome)", special, NULL},
4553 /* 26 */ {"Unassigned (CableHome)", special, NULL},
4554 /* 27 */ {"Unassigned (CableHome)", special, NULL},
4555 /* 28 */ {"Unassigned (CableHome)", special, NULL},
4556 /* 29 */ {"Unassigned (CableHome)", special, NULL},
4557 /* 30 */ {"Unassigned (CableHome)", special, NULL},
4558 /* *** 31-50: PacketCable *** */
4559 /* 31 */ {"MTA MAC Address", special, &hf_dhcp_option43_cl_mta_mac_address},
4560 /* 32 */ {"Correlation ID", val_u_long, &hf_dhcp_option43_cl_correlation_ID},
4561 /* 33 */ {"Unassigned (PacketCable)", special, NULL},
4562 /* 34 */ {"Unassigned (PacketCable)", special, NULL},
4563 /* 35 */ {"Unassigned (PacketCable)", special, NULL},
4564 /* 36 */ {"Unassigned (PacketCable)", special, NULL},
4565 /* 37 */ {"Unassigned (PacketCable)", special, NULL},
4566 /* 38 */ {"Unassigned (PacketCable)", special, NULL},
4567 /* 39 */ {"Unassigned (PacketCable)", special, NULL},
4568 /* 40 */ {"Unassigned (PacketCable)", special, NULL},
4569 /* 41 */ {"Unassigned (PacketCable)", special, NULL},
4570 /* 42 */ {"Unassigned (PacketCable)", special, NULL},
4571 /* 43 */ {"Unassigned (PacketCable)", special, NULL},
4572 /* 44 */ {"Unassigned (PacketCable)", special, NULL},
4573 /* 45 */ {"Unassigned (PacketCable)", special, NULL},
4574 /* 46 */ {"Unassigned (PacketCable)", special, NULL},
4575 /* 47 */ {"Unassigned (PacketCable)", special, NULL},
4576 /* 48 */ {"Unassigned (PacketCable)", special, NULL},
4577 /* 49 */ {"Unassigned (PacketCable)", special, NULL},
4578 /* 50 */ {"Unassigned (PacketCable)", special, NULL},
4579 /* *** 51-127: CableLabs *** */
4580 /* 51 */ {"Vendor Name", string, &hf_dhcp_option43_cl_vendor_name51},
4581 /* 52 */ {"CableCARD Capability", special, &hf_dhcp_option43_cl_cablecard_capability},
4582 /* 53 */ {"Device Identification (CA)", special, &hf_dhcp_option43_cl_device_id_ca},
4583 /* 54 */ {"Device Identification (X.509)", string, &hf_dhcp_option43_cl_device_id_x509},
4584 /* 55 */ {"Unassigned (CableLabs)", special, NULL},
4585 /* *** 128-254: Vendors *** */
4586 /* 128-254 {"Unassigned (Vendors)", special, NULL}, */
4587 /* 255 {"end options", special, &hf_dhcp_option43_cl_end} */
4590 subopt = tvb_get_uint8(tvb, optoff);
4591 suboptoff++;
4593 if (subopt == 0) {
4594 proto_tree_add_item(v_tree, hf_dhcp_option43_cl_padding, tvb, optoff, 1, ENC_BIG_ENDIAN);
4595 return (suboptoff);
4596 } else if (subopt == 255) { /* End Option */
4597 proto_tree_add_item(v_tree, hf_dhcp_option43_cl_end, tvb, optoff, 1, ENC_BIG_ENDIAN);
4598 /* Make sure we skip any junk left this option */
4599 return (optend);
4602 if (suboptoff >= optend) {
4603 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
4604 "Suboption %d: no room left in option for suboption length", subopt);
4605 return (optend);
4608 subopt_len = tvb_get_uint8(tvb, suboptoff);
4609 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option43_cl_suboption,
4610 tvb, optoff, subopt_len+2, subopt, "(%d) %s",
4611 subopt, val_to_str_const(subopt, option43_cl_suboption_vals, "Unknown"));
4613 o43cl_v_tree = proto_item_add_subtree(vti, ett_dhcp_option43_suboption);
4614 proto_tree_add_item(o43cl_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
4615 suboptoff++;
4617 if (suboptoff+subopt_len > optend) {
4618 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
4619 "Suboption %d: no room left in option for suboption value", subopt);
4620 return (optend);
4623 if ( (subopt < 1 ) || (subopt >= array_length(o43cablelabs_opt)) ) {
4624 proto_tree_add_item(o43cl_v_tree, hf_dhcp_option43_value, tvb, suboptoff, subopt_len, ENC_NA);
4625 } else if (o43cablelabs_opt[subopt].ftype == special) {
4626 switch(subopt)
4628 case 8:/* OUI */
4629 /* CableLabs specs treat 43.8 inconsistently
4630 * as either binary (3b) or string (6b) */
4631 if (subopt_len == 3) {
4632 proto_tree_add_bytes_format_value(o43cl_v_tree, hf_dhcp_option43_cl_oui_bytes, tvb, suboptoff, subopt_len, NULL,
4633 "%02x:%02x:%02x", tvb_get_uint8(tvb, suboptoff), tvb_get_uint8(tvb, suboptoff+1), tvb_get_uint8(tvb, suboptoff+2));
4634 } else if (subopt_len == 6) {
4635 proto_tree_add_item(o43cl_v_tree, hf_dhcp_option43_cl_oui_string, tvb, suboptoff, subopt_len, ENC_ASCII);
4636 } else {
4637 expert_add_info_format(pinfo, vti, &ei_dhcp_bad_length, "length isn't 3 or 6");
4639 break;
4640 case 31: /* MTA MAC address */
4641 if (subopt_len != 6) {
4642 expert_add_info_format(pinfo, vti, &ei_dhcp_bad_length, "length isn't 6");
4643 break;
4646 proto_tree_add_item(o43cl_v_tree, hf_dhcp_option43_cl_mta_mac_address, tvb, suboptoff, 6, ENC_NA);
4647 break;
4648 default:
4649 if (o43cablelabs_opt[subopt].phf != NULL)
4650 proto_tree_add_item(o43cl_v_tree, *o43cablelabs_opt[subopt].phf, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
4651 else
4652 proto_tree_add_item(o43cl_v_tree, hf_dhcp_option43_value, tvb, suboptoff, subopt_len, ENC_NA);
4655 else {
4656 if (dhcp_handle_basic_types(pinfo, o43cl_v_tree, vti, tvb, o43cablelabs_opt[subopt].ftype,
4657 suboptoff, subopt_len, o43cablelabs_opt[subopt].phf, &default_hfs) == 0) {
4658 expert_add_info_format(pinfo, vti, &ei_dhcp_subopt_unknown_type, "ERROR, please report: Unknown subopt type handler %d", subopt);
4662 optoff += (subopt_len + 2);
4663 return optoff;
4666 static bool
4667 dissect_cablelabs_vendor_info_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
4669 int offset = 0;
4670 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
4671 proto_tree* vendor_tree;
4673 /* Vendor Class IDs
4674 * DOCSIS - docsis
4675 * CableHome - CableHome
4676 * OpenCable2.0 - OpenCable2.0
4677 * PacketCable - pktc
4678 * DEMARC - DEMARC
4679 * sRouter - SROUTER
4680 * Remote PHY - RPD
4681 * eDOCSIS - PTA or ECM
4682 * OpenCable TRIF - TR
4685 if ((option_data->vendor_class_id != NULL) &&
4686 ((strncmp((const char*)option_data->vendor_class_id, "pktc", strlen("pktc")) == 0) ||
4687 (strncmp((const char*)option_data->vendor_class_id, "docsis", strlen("docsis")) == 0) ||
4688 (strncmp((const char*)option_data->vendor_class_id, "OpenCable2.0", strlen("OpenCable2.0")) == 0) ||
4689 (strncmp((const char*)option_data->vendor_class_id, "CableHome", strlen("CableHome")) == 0) ||
4690 (strncmp((const char*)option_data->vendor_class_id, "RPD", strlen("RPD")) == 0) ||
4691 (strncmp((const char*)option_data->vendor_class_id, "RMD", strlen("RMD")) == 0) ||
4692 (strncmp((const char*)option_data->vendor_class_id, "ECM", strlen("ECM")) == 0) ||
4693 (strncmp((const char*)option_data->vendor_class_id, "PTA", strlen("PTA")) == 0) ||
4694 (strncmp((const char*)option_data->vendor_class_id, "DEMARC", strlen("DEMARC")) == 0) ||
4695 (strncmp((const char*)option_data->vendor_class_id, "TR", strlen("TR")) == 0) ||
4696 (strncmp((const char*)option_data->vendor_class_id, "SROUTER", strlen("SROUTER")) == 0))) {
4697 /* CableLabs standard - see www.cablelabs.com/projects */
4698 proto_item_append_text(tree, " (CableLabs)");
4699 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
4701 while (tvb_reported_length_remaining(tvb, offset) > 0) {
4702 offset = dissect_vendor_cablelabs_suboption(pinfo, tree, vendor_tree,
4703 tvb, offset, tvb_reported_length(tvb));
4705 return true;
4708 return false;
4711 static bool
4712 dissect_aruba_ap_vendor_info_heur( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data)
4714 int offset = 0;
4715 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
4716 proto_tree* vendor_tree;
4718 if ((option_data->vendor_class_id == NULL) ||
4719 (strncmp((const char*)option_data->vendor_class_id, ARUBA_AP, strlen(ARUBA_AP)) != 0))
4720 return false;
4722 proto_item_append_text(tree, " (Aruba AP)");
4723 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
4725 proto_tree_add_item(vendor_tree, hf_dhcp_option43_arubaap_controllerip, tvb, offset, tvb_reported_length(tvb), ENC_ASCII);
4726 return true;
4729 static bool
4730 dissect_aruba_instant_ap_vendor_info_heur( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data)
4732 int offset = 0;
4733 int reported_len = tvb_reported_length(tvb);
4734 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
4735 proto_tree* vendor_tree;
4736 proto_item* vendor_item;
4737 int32_t nameorglen, ampiplen;
4739 /* Aruba Instant AP */
4740 if ((option_data->vendor_class_id == NULL) ||
4741 (strncmp((const char*)option_data->vendor_class_id, ARUBA_INSTANT_AP, strlen(ARUBA_INSTANT_AP)) != 0))
4742 return false;
4744 proto_item_append_text(tree, " (Aruba Instant AP)");
4746 vendor_item = proto_tree_add_item(tree, hf_dhcp_option43_arubaiap, tvb, offset, reported_len, ENC_ASCII);
4747 vendor_tree = proto_item_add_subtree(vendor_item, ett_dhcp_option43_suboption);
4748 nameorglen = tvb_find_uint8(tvb, offset, tvb_reported_length(tvb), ',');
4749 proto_tree_add_item(vendor_tree, hf_dhcp_option43_arubaiap_nameorg, tvb, offset, nameorglen, ENC_ASCII);
4750 offset += (nameorglen+1);
4751 ampiplen = tvb_find_uint8(tvb, offset, reported_len-nameorglen-1, ',') - offset;
4752 proto_tree_add_item(vendor_tree, hf_dhcp_option43_arubaiap_ampip, tvb, offset, ampiplen, ENC_ASCII);
4753 offset += (ampiplen+1);
4754 proto_tree_add_item(vendor_tree, hf_dhcp_option43_arubaiap_password, tvb, offset, tvb_reported_length_remaining(tvb, offset), ENC_ASCII);
4756 return true;
4759 static const value_string option43_bsdp_suboption_vals[] = {
4760 { 0, "Pad" },
4761 { 1, "Message Type" },
4762 { 2, "Version" },
4763 { 3, "Server Identifier" },
4764 { 4, "Server Priority" },
4765 { 5, "Reply Port" },
4766 { 6, "Boot Image List Path" },
4767 { 7, "Default Boot Image" },
4768 { 8, "Selected Boot Image" },
4769 { 9, "Boot Image List" },
4770 { 10, "NetBoot 1.0 Firmware" },
4771 { 11, "Boot Image Attributes Filter List" },
4772 { 12, "Maximum Message Size" },
4773 { 255, "End" },
4774 { 0, NULL}
4777 static void
4778 dissect_vendor_bsdp_boot_image(proto_tree *v_tree, tvbuff_t *tvb, int optoff)
4780 static int * const dhcp_o43_bsdp_attributes_flags[] = {
4781 &hf_dhcp_option43_bsdp_boot_image_attribute_install,
4782 &hf_dhcp_option43_bsdp_boot_image_attribute_kind,
4783 &hf_dhcp_option43_bsdp_boot_image_attribute_reserved,
4784 NULL
4787 proto_tree_add_bitmask(v_tree, tvb, optoff, hf_dhcp_option43_bsdp_boot_image_attribute, ett_dhcp_o43_bsdp_attributes_flags, dhcp_o43_bsdp_attributes_flags, ENC_NA);
4790 static int
4791 dissect_vendor_bsdp_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
4792 tvbuff_t *tvb, int optoff, int optend)
4794 int suboptoff = optoff;
4795 int attributes_off;
4796 uint8_t subopt, string_len;
4797 uint8_t subopt_len, attributes_len;
4798 unsigned item_len;
4799 proto_tree *o43bsdp_v_tree, *o43bsdp_va_tree, *o43bsdp_vb_tree, *o43bsdp_vc_tree, *o43bsdp_vd_tree;
4800 proto_item *vti, *ti, *tj;
4802 subopt = tvb_get_uint8(tvb, optoff);
4803 suboptoff++;
4805 if (subopt == 0 || subopt == 255) {
4806 /* Pad (0) and End (255) have implicit length of 1. */
4807 item_len = 1;
4808 } else if (suboptoff >= optend) {
4809 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
4810 "Suboption %d: no room left in option for suboption length", subopt);
4811 return (optend);
4812 } else {
4813 subopt_len = tvb_get_uint8(tvb, suboptoff);
4814 item_len = subopt_len + 2;
4817 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option43_bsdp_suboption,
4818 tvb, optoff, item_len, subopt, "(%d) %s",
4819 subopt, val_to_str_const(subopt, option43_bsdp_suboption_vals, "Unknown"));
4820 if (item_len == 1) {
4821 return (optoff + 1);
4824 o43bsdp_v_tree = proto_item_add_subtree(vti, ett_dhcp_option43_suboption);
4825 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
4826 suboptoff++;
4828 if (suboptoff+subopt_len > optend) {
4829 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
4830 "Suboption %d: no room left in option for suboption value", subopt);
4831 return (optend);
4834 switch(subopt)
4836 case 1:
4837 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_message_type, tvb, suboptoff, subopt_len, ENC_ASCII|ENC_NA);
4838 break;
4839 case 2:
4840 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_version, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
4841 break;
4842 case 3:
4843 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_server_identifier, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
4844 break;
4845 case 4:
4846 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_server_priority, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
4847 break;
4848 case 5:
4849 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_reply_port, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
4850 break;
4851 case 6:
4852 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_boot_image_list_path, tvb, suboptoff, subopt_len, ENC_ASCII);
4853 break;
4854 case 7:
4855 ti = proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_default_boot_image_id, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
4856 o43bsdp_va_tree = proto_item_add_subtree(ti, ett_dhcp_o43_bsdp_boot_image);
4857 dissect_vendor_bsdp_boot_image(o43bsdp_va_tree, tvb, suboptoff);
4858 proto_tree_add_item(o43bsdp_va_tree, hf_dhcp_option43_bsdp_boot_image_index, tvb, suboptoff+2, subopt_len-2, ENC_BIG_ENDIAN|ENC_NA);
4859 break;
4860 case 8:
4861 ti = proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_selected_boot_image_id, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
4862 o43bsdp_vc_tree = proto_item_add_subtree(ti, ett_dhcp_o43_bsdp_boot_image);
4863 dissect_vendor_bsdp_boot_image(o43bsdp_vc_tree, tvb, suboptoff);
4864 proto_tree_add_item(o43bsdp_vc_tree, hf_dhcp_option43_bsdp_boot_image_index, tvb, suboptoff+2, subopt_len-2, ENC_BIG_ENDIAN|ENC_NA);
4865 break;
4866 case 9:
4867 ti = proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_boot_image_list, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
4868 attributes_len = subopt_len;
4869 attributes_off = suboptoff;
4870 o43bsdp_vd_tree = proto_item_add_subtree(ti, ett_dhcp_o43_bsdp_image_desc_list);
4871 while (attributes_len >= 5) {
4872 string_len = tvb_get_uint8(tvb, attributes_off+4);
4873 if (string_len > 0) {
4874 tj = proto_tree_add_item(o43bsdp_vd_tree, hf_dhcp_option43_bsdp_image_desc, tvb, attributes_off, string_len+5, ENC_BIG_ENDIAN|ENC_NA);
4875 o43bsdp_vb_tree = proto_item_add_subtree(tj, ett_dhcp_o43_bsdp_image_desc);
4876 dissect_vendor_bsdp_boot_image(o43bsdp_vb_tree, tvb, attributes_off);
4877 proto_tree_add_item(o43bsdp_vb_tree, hf_dhcp_option43_bsdp_boot_image_index, tvb, attributes_off+2, 2, ENC_BIG_ENDIAN|ENC_NA);
4878 proto_tree_add_item(o43bsdp_vb_tree, hf_dhcp_option43_bsdp_boot_image_name_len, tvb, attributes_off+4, 1, ENC_BIG_ENDIAN|ENC_NA);
4879 proto_tree_add_item(o43bsdp_vb_tree, hf_dhcp_option43_bsdp_boot_image_name, tvb, attributes_off+5, string_len, ENC_UTF_8);
4881 attributes_off += 5 + string_len;
4882 attributes_len -= 5 + string_len;
4884 break;
4885 case 10:
4886 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_netboot_firmware, tvb, suboptoff, subopt_len, ENC_NA);
4887 break;
4888 case 11:
4889 ti = proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_attributes_filter_list, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
4890 attributes_len = subopt_len;
4891 attributes_off = suboptoff;
4892 o43bsdp_va_tree = proto_item_add_subtree(ti, ett_dhcp_o43_bsdp_attributes);
4893 while (attributes_len >= 2) {
4894 dissect_vendor_bsdp_boot_image(o43bsdp_va_tree, tvb, attributes_off);
4895 attributes_off+=2;
4896 attributes_len-=2;
4898 break;
4899 case 12:
4900 proto_tree_add_item(o43bsdp_v_tree, hf_dhcp_option43_bsdp_message_size, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN|ENC_NA);
4901 break;
4904 optoff += item_len;
4905 return optoff;
4908 static bool
4909 dissect_apple_bsdp_vendor_info_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
4911 int offset = 0;
4912 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
4913 proto_tree* vendor_tree;
4915 if ((option_data->vendor_class_id == NULL) ||
4916 (strncmp((const char*)option_data->vendor_class_id, APPLE_BSDP_SERVER, strlen(APPLE_BSDP_SERVER)) != 0))
4917 return false;
4919 /* Apple BSDP */
4920 proto_item_append_text(tree, " (Boot Server Discovery Protocol (BSDP))");
4921 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
4923 while (tvb_reported_length_remaining(tvb, offset) > 0) {
4924 offset = dissect_vendor_bsdp_suboption(pinfo, tree, vendor_tree,
4925 tvb, offset, tvb_reported_length(tvb));
4928 return true;
4931 /* Cisco Vendor Specific Information */
4934 { 1, "1" }, * D,R: 03 *
4935 { 2, "2" }, * D,R: 01 *
4936 { 3, "3" }, * D,R: 00 01 # O,A: 00 02 *
4937 { 4, "Node ID" }, * O,A: 00 00 00 ca *
4938 { 5, "5" }, * O,A: 01 *
4939 { 6, "6" }, * D,R: 01 # O,A: 01 *
4940 { 7, "Model" }, * D,R: N9K-C9336PQ *
4941 { 8, "APIC UUID" }, * O,A: 09bced36-69f1-11e6-96ce-8baf09371338 *
4942 { 9, "Fabricname" }, * O,A: ams-fab1 *
4943 { 10, "10" }, * D,R: 00 00 00 01 *
4944 { 11, "SerialNo" }, * D,R: SAL1926J4QW *
4945 { 12, "Client Int" }, * D,O: eth1/20.20 # R,A: eth1/20.20 *
4947 static const value_string option43_cisco_suboption_vals[] = {
4948 { 1, "Unk-1 (Node role?)" }, /* uint8 */
4949 { 2, "Unk-2 (Spine level?)" }, /* uint8 */
4950 { 3, "Unk-3 (Pod ID?)" }, /* uint16 */
4951 { 4, "Node ID" }, /* uint32 */
4952 { 5, "Unk-5" }, /* uint8 */
4953 { 6, "Unk-6" }, /* uint8 */
4954 { 7, "Model" }, /* String */
4955 { 8, "APIC UUID" }, /* String */
4956 { 9, "Fabricname" }, /* String */
4957 { 10, "Unk-10" }, /* uint32 */
4958 { 11, "SerialNo" }, /* String */
4959 { 12, "Interfacename" }, /* String */
4961 { 0, NULL}
4964 static int
4965 dissect_vendor_cisco_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
4966 tvbuff_t *tvb, int optoff, int optend)
4968 int suboptoff = optoff;
4969 uint8_t subopt;
4970 uint8_t subopt_len;
4971 unsigned item_len;
4972 proto_tree *o43cisco_v_tree;
4973 proto_item *vti;
4975 subopt = tvb_get_uint8(tvb, optoff);
4976 suboptoff++;
4978 if (suboptoff >= optend) {
4979 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
4980 "Suboption %d: No room left in option for suboption length", subopt);
4981 return (optend);
4982 } else {
4983 subopt_len = tvb_get_uint8(tvb, suboptoff);
4984 item_len = subopt_len + 2;
4987 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option43_cisco_suboption,
4988 tvb, optoff, item_len, subopt, "(%d) %s",
4989 subopt, val_to_str_const(subopt, option43_cisco_suboption_vals, "Unknown"));
4991 o43cisco_v_tree = proto_item_add_subtree(vti, ett_dhcp_option43_suboption);
4992 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
4993 suboptoff++;
4995 if (suboptoff+subopt_len > optend) {
4996 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
4997 "Suboption %d: Not sufficient room left in option for suboption value", subopt);
4998 return (optend);
5001 switch(subopt)
5003 case 1:
5004 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown1, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5005 break;
5006 case 2:
5007 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown2, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5008 break;
5009 case 3:
5010 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown3, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5011 break;
5012 case 4:
5013 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_nodeid, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5014 break;
5015 case 5:
5016 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown5, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5017 break;
5018 case 6:
5019 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown6, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5020 break;
5021 case 7:
5022 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_model, tvb, suboptoff, subopt_len, ENC_ASCII);
5023 break;
5024 case 8:
5025 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_apicuuid, tvb, suboptoff, subopt_len, ENC_ASCII);
5026 break;
5027 case 9:
5028 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_fabricname, tvb, suboptoff, subopt_len, ENC_ASCII);
5029 break;
5030 case 10:
5031 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown10, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5032 break;
5033 case 11:
5034 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_serialno, tvb, suboptoff, subopt_len, ENC_ASCII);
5035 break;
5036 case 12:
5037 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_clientint, tvb, suboptoff, subopt_len, ENC_ASCII);
5038 break;
5039 default:
5040 proto_tree_add_item(o43cisco_v_tree, hf_dhcp_option43_cisco_unknown, tvb, suboptoff, subopt_len, ENC_NA);
5043 optoff += item_len;
5044 return optoff;
5047 static bool
5048 dissect_cisco_vendor_info_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
5050 int offset = 0;
5051 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
5052 proto_tree* vendor_tree;
5054 if ((option_data->vendor_class_id == NULL) ||
5055 (strncmp((const char*)option_data->vendor_class_id, CISCO_VCID, strlen(CISCO_VCID)) != 0))
5056 return false;
5058 /* Cisco ACI Fabric*/
5059 proto_item_append_text(tree, " (Cisco ACI Fabric)");
5060 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
5062 while (tvb_reported_length_remaining(tvb, offset) > 0) {
5063 offset = dissect_vendor_cisco_suboption(pinfo, tree, vendor_tree,
5064 tvb, offset, tvb_reported_length(tvb));
5067 return true;
5070 /* Aerohive (Extremenetworks) Vendor Specific Information */
5072 static const value_string option43_aerohive_suboption_vals[] = {
5073 { 225, "XiqHostname" }, /* String */
5074 { 226, "XiqIpAddress" }, /* Ipv4address */
5076 { 0, NULL}
5079 static int
5080 dissect_vendor_aerohive_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
5081 tvbuff_t *tvb, int optoff, int optend)
5083 int suboptoff = optoff;
5084 uint8_t subopt;
5085 uint8_t subopt_len;
5086 unsigned item_len;
5087 proto_tree *o43aerohive_v_tree;
5088 proto_item *vti;
5090 subopt = tvb_get_uint8(tvb, optoff);
5091 suboptoff++;
5093 if (suboptoff >= optend) {
5094 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
5095 "Suboption %d: No room left in option for suboption length", subopt);
5096 return (optend);
5097 } else {
5098 subopt_len = tvb_get_uint8(tvb, suboptoff);
5099 item_len = subopt_len + 2;
5102 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option43_aerohive_suboption,
5103 tvb, optoff, item_len, subopt, "(%d) %s",
5104 subopt, val_to_str_const(subopt, option43_aerohive_suboption_vals, "Unknown"));
5106 o43aerohive_v_tree = proto_item_add_subtree(vti, ett_dhcp_option43_suboption);
5107 proto_tree_add_item(o43aerohive_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
5108 suboptoff++;
5110 if (suboptoff+subopt_len > optend) {
5111 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
5112 "Suboption %d: Not sufficient room left in option for suboption value", subopt);
5113 return (optend);
5116 switch(subopt)
5118 case 225:
5119 proto_tree_add_item(o43aerohive_v_tree, hf_dhcp_option43_aerohive_xiqhostname, tvb, suboptoff, subopt_len, ENC_ASCII);
5120 break;
5121 case 226:
5122 proto_tree_add_item(o43aerohive_v_tree, hf_dhcp_option43_aerohive_xiqipaddress, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
5123 break;
5124 default:
5125 proto_tree_add_item(o43aerohive_v_tree, hf_dhcp_option43_aerohive_unknown, tvb, suboptoff, subopt_len, ENC_NA);
5128 optoff += item_len;
5129 return optoff;
5132 static bool
5133 dissect_aerohive_vendor_info_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
5135 int offset = 0;
5136 dhcp_option_data_t *option_data = (dhcp_option_data_t*)data;
5137 proto_tree* vendor_tree;
5139 if ((option_data->vendor_class_id == NULL) ||
5140 (strncmp((const char*)option_data->vendor_class_id, AEROHIVE_VCID, strlen(AEROHIVE_VCID)) != 0))
5141 return false;
5143 /* Cisco ACI Fabric*/
5144 proto_item_append_text(tree, " (Aerohive)");
5145 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
5147 while (tvb_reported_length_remaining(tvb, offset) > 0) {
5148 offset = dissect_vendor_aerohive_suboption(pinfo, tree, vendor_tree,
5149 tvb, offset, tvb_reported_length(tvb));
5152 return true;
5155 static int
5156 dissect_vendor_generic_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
5157 tvbuff_t *tvb, uint32_t optoff, uint32_t optend)
5159 uint32_t suboptoff = optoff;
5160 uint8_t subopt;
5161 uint32_t subopt_len;
5162 proto_item *item;
5163 proto_tree *sub_tree;
5165 item = proto_tree_add_item(v_tree, hf_dhcp_vendor_unknown_suboption, tvb, optoff, 1, ENC_NA);
5166 subopt = tvb_get_uint8(tvb, optoff);
5168 suboptoff+=1;
5170 if (suboptoff >= optend) {
5171 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
5172 "Suboption %d: no room left in option for suboption length", subopt);
5173 return (optend);
5176 sub_tree = proto_item_add_subtree(item, ett_dhcp_option125_suboption);
5177 proto_tree_add_item_ret_uint(sub_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_NA, &subopt_len);
5178 suboptoff++;
5180 if (suboptoff+subopt_len > optend) {
5181 expert_add_info_format(pinfo, item, &ei_dhcp_missing_subopt_value,
5182 "Suboption %d: no room left in option for suboption value", subopt);
5183 return (optend);
5186 proto_tree_add_item(sub_tree, hf_dhcp_suboption_data, tvb, suboptoff, subopt_len, ENC_NA);
5187 suboptoff+= subopt_len;
5189 return suboptoff;
5193 static int
5194 dissect_dhcpopt_vi_vendor_specific_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
5196 uint32_t offset = 0;
5197 uint32_t enterprise = 0;
5198 uint32_t s_end = 0;
5199 uint32_t option_data_len = 0;
5200 proto_item *vti;
5201 proto_tree *e_tree;
5203 while (tvb_reported_length_remaining(tvb, offset) >= 5) {
5205 vti = proto_tree_add_item_ret_uint(tree, hf_dhcp_option125_enterprise, tvb, offset, 4, ENC_BIG_ENDIAN, &enterprise);
5206 e_tree = proto_item_add_subtree(vti, ett_dhcp_option);
5207 offset += 4;
5209 proto_tree_add_item_ret_uint(e_tree, hf_dhcp_option125_length, tvb, offset, 1, ENC_NA, &option_data_len);
5210 offset += 1;
5212 s_end = offset + option_data_len;
5213 if ( tvb_reported_length_remaining(tvb, s_end) < 0 ) {
5214 expert_add_info_format(pinfo, vti, &ei_dhcp_option125_enterprise_malformed, "no room left in option for enterprise %u data", enterprise);
5215 break;
5218 while (offset < s_end) {
5219 tvbuff_t *enterprise_tvb = tvb_new_subset_length(tvb, offset, option_data_len);
5220 int bytes_dissected = dissector_try_uint(dhcp_enterprise_specific_table, enterprise, enterprise_tvb, pinfo, e_tree);
5221 if (bytes_dissected == 0) {
5222 offset = dissect_vendor_generic_suboption(pinfo, vti, e_tree, tvb, offset, s_end);
5223 } else{
5224 offset += bytes_dissected;
5229 if (tvb_reported_length_remaining(tvb, offset) > 0) {
5230 expert_add_info_format(pinfo, tree, &ei_dhcp_bad_length, "length < 5");
5233 return tvb_captured_length(tvb);
5236 static const value_string option43_alcatel_suboption_vals[] = {
5237 { 0, "Padding" },
5238 { 58, "Voice VLAN ID" },
5239 { 64, "Spatial Redundancy TFTP1" },
5240 { 65, "Spatial Redundancy TFTP2" },
5241 { 66, "Application Type" },
5242 { 67, "SIP URL" },
5243 { 255, "Alcatel-Lucent End" },
5244 { 0, NULL}
5247 static const value_string option43_alcatel_app_type_vals[] = {
5248 { 0, "NOE" },
5249 { 1, "SIP" },
5250 { 0, NULL}
5253 /* If an Alcatel-Lucent Option 43 suboption has a known fixed length,
5254 * return that length. Returns 0 for variable length options and unknown
5255 * options.
5257 static unsigned
5258 get_alcatel_suboption_len(unsigned subopt)
5260 switch(subopt) {
5261 case 58: /* 0x3A - Alcatel-Lucent AVA VLAN Id */
5262 return 2;
5263 case 64: /* 0x40 - Alcatel-Lucent TFTP1 */
5264 return 4;
5265 case 65: /* 0x41 - Alcatel-Lucent TFTP2 */
5266 return 4;
5267 case 66: /* 0x42 - Alcatel-Lucent APPLICATION TYPE */
5268 return 1;
5269 case 0: /* Alcatel-Lucent Padding */
5270 case 67: /* 0x43 - Alcatel-Lucent SIP URL */
5271 case 255: /* Alcatel-Lucent End */
5272 default:
5273 return 0;
5277 static int
5278 dissect_vendor_alcatel_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
5279 tvbuff_t *tvb, int optoff, int optend)
5281 int suboptoff = optoff;
5282 uint8_t subopt;
5283 uint8_t subopt_len;
5284 proto_item *vti;
5285 proto_tree *o43alcatel_v_tree;
5287 subopt = tvb_get_uint8(tvb, optoff);
5288 suboptoff++;
5290 if (subopt == 0) {
5291 proto_tree_add_item(v_tree, hf_dhcp_option43_alcatel_padding, tvb, optoff, 1, ENC_BIG_ENDIAN);
5292 return (suboptoff);
5293 } else if (subopt == 255) { /* End Option */
5294 proto_tree_add_item(v_tree, hf_dhcp_option43_alcatel_end, tvb, optoff, 1, ENC_BIG_ENDIAN);
5295 /* Make sure we skip any junk left this option */
5296 return (optend);
5299 if (suboptoff >= optend) {
5300 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
5301 "Suboption %d: no room left in option for suboption length", subopt);
5302 return (optend);
5305 subopt_len = tvb_get_uint8(tvb, suboptoff);
5306 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option43_alcatel_suboption,
5307 tvb, optoff, subopt_len+2, subopt, "(%d) %s",
5308 subopt, val_to_str_const(subopt, option43_alcatel_suboption_vals, "Unknown"));
5310 o43alcatel_v_tree = proto_item_add_subtree(vti, ett_dhcp_option43_suboption);
5311 proto_tree_add_item(o43alcatel_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
5312 suboptoff++;
5314 if (suboptoff+subopt_len > optend) {
5315 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
5316 "Suboption %d: no room left in option for suboption value", subopt);
5317 return (optend);
5320 unsigned subopt_len_expected = get_alcatel_suboption_len(subopt);
5321 if (subopt_len_expected && subopt_len_expected != subopt_len) {
5322 expert_add_info_format(pinfo, vti, &ei_dhcp_bad_length, "length isn't %u", subopt_len_expected);
5323 return optend;
5325 switch (subopt)
5327 case 58: /* 0x3A - Alcatel-Lucent AVA VLAN Id */
5328 proto_tree_add_item(o43alcatel_v_tree, hf_dhcp_option43_alcatel_vlan_id, tvb, suboptoff, 2, ENC_BIG_ENDIAN);
5329 break;
5330 case 64: /* 0x40 - Alcatel-Lucent TFTP1 */
5331 proto_tree_add_item(o43alcatel_v_tree, hf_dhcp_option43_alcatel_tftp1, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
5332 break;
5333 case 65: /* 0x41 - Alcatel-Lucent TFTP2 */
5334 proto_tree_add_item(o43alcatel_v_tree, hf_dhcp_option43_alcatel_tftp2, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
5335 break;
5336 case 66: /* 0x42 - Alcatel-Lucent APPLICATION TYPE */
5337 proto_tree_add_item(o43alcatel_v_tree, hf_dhcp_option43_alcatel_app_type, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
5338 break;
5339 case 67: /* 0x43 - Alcatel-Lucent SIP URL */
5340 proto_tree_add_item(o43alcatel_v_tree, hf_dhcp_option43_alcatel_sip_url, tvb, suboptoff, subopt_len, ENC_ASCII);
5341 break;
5342 default:
5343 expert_add_info_format(pinfo, vti, &ei_dhcp_subopt_unknown_type, "ERROR, please report: Unknown subopt type handler %d", subopt);
5344 return optend;
5347 optoff += (subopt_len + 2);
5348 return optoff;
5351 static bool
5352 dissect_alcatel_lucent_vendor_info_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
5354 int offset = 0;
5355 uint8_t s_option;
5356 proto_tree* vendor_tree;
5358 if (tvb_reported_length(tvb) < 1)
5359 return false;
5361 s_option = tvb_get_uint8(tvb, offset);
5362 if ((s_option==58 || s_option==64 || s_option==65
5363 || s_option==66 || s_option==67)
5364 && test_encapsulated_vendor_options(tvb, offset, tvb_reported_length(tvb), get_alcatel_suboption_len)) {
5366 /* Alcatel-Lucent DHCP Extensions */
5367 proto_item_append_text(tree, " (Alcatel-Lucent)");
5368 vendor_tree = proto_item_add_subtree(tree, ett_dhcp_option);
5370 while (tvb_reported_length_remaining(tvb, offset) > 0) {
5371 offset = dissect_vendor_alcatel_suboption(pinfo, tree, vendor_tree,
5372 tvb, offset, tvb_reported_length(tvb));
5374 return true;
5377 return false;
5380 static const value_string option63_suboption_vals[] = {
5381 { 1, "NWIP does not exist on subnet" },
5382 { 2, "NWIP exists in options area" },
5383 { 3, "NWIP exists in sname/file" },
5384 { 4, "NWIP exists, but too big" },
5385 { 5, "Broadcast for nearest Netware server" },
5386 { 6, "Preferred DSS server" },
5387 { 7, "Nearest NWIP server" },
5388 { 8, "Autoretries" },
5389 { 9, "Autoretry delay, secs" },
5390 { 10, "Support NetWare/IP v1.1" },
5391 { 11, "Primary DSS" },
5392 { 0, NULL }
5395 static int
5396 dissect_netware_ip_suboption(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
5397 tvbuff_t *tvb, int optoff, int optend)
5399 int suboptoff = optoff;
5400 uint8_t subopt, subopt_len;
5401 proto_tree *o63_v_tree;
5402 proto_item *vti, *ti;
5404 static const struct basic_types_hfs default_hfs = {
5405 NULL,
5406 &hf_dhcp_option63_value_ip_address,
5407 &hf_dhcp_option63_value_ip_address,
5408 NULL,
5409 &hf_dhcp_option63_value_boolean,
5410 &hf_dhcp_option63_value_8,
5411 NULL,
5412 NULL,
5413 NULL,
5414 NULL,
5415 NULL
5418 static const struct opt_info o63_opt[]= {
5419 /* 0 */ {"",none,NULL},
5420 /* 1 */ {"NWIP does not exist on subnet",presence,NULL},
5421 /* 2 */ {"NWIP exists in options area",presence,NULL},
5422 /* 3 */ {"NWIP exists in sname/file",presence,NULL},
5423 /* 4 */ {"NWIP exists, but too big",presence,NULL},
5424 /* 5 */ {"Broadcast for nearest Netware server",val_boolean, &hf_dhcp_option63_broadcast},
5425 /* 6 */ {"Preferred DSS server",ipv4_list,&hf_dhcp_option63_preferred_dss_server},
5426 /* 7 */ {"Nearest NWIP server",ipv4_list,&hf_dhcp_option63_nearest_nwip_server},
5427 /* 8 */ {"Autoretries",val_u_byte,&hf_dhcp_option63_autoretries},
5428 /* 9 */ {"Autoretry delay, secs",val_u_byte,&hf_dhcp_option63_autoretry_delay},
5429 /* 10*/ {"Support NetWare/IP v1.1",val_boolean,&hf_dhcp_option63_support_netware_v1_1},
5430 /* 11*/ {"Primary DSS",ipv4,&hf_dhcp_option63_primary_dss}
5433 subopt = tvb_get_uint8(tvb, optoff);
5434 suboptoff++;
5436 if (suboptoff >= optend) {
5437 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
5438 "Suboption %d: no room left in option for suboption length", subopt);
5439 return (optend);
5442 subopt_len = tvb_get_uint8(tvb, suboptoff);
5443 vti = proto_tree_add_uint_format_value(v_tree, hf_dhcp_option63_suboption,
5444 tvb, optoff, subopt_len+2, subopt, "(%d) %s",
5445 subopt, val_to_str_const(subopt, option63_suboption_vals, "Unknown"));
5447 o63_v_tree = proto_item_add_subtree(vti, ett_dhcp_option63_suboption);
5448 proto_tree_add_item(o63_v_tree, hf_dhcp_suboption_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
5449 suboptoff++;
5451 ti = proto_tree_add_item(o63_v_tree, hf_dhcp_option63_value, tvb, suboptoff, subopt_len, ENC_NA);
5452 proto_item_set_hidden(ti);
5454 if (subopt < array_length(o63_opt)) {
5455 if (dhcp_handle_basic_types(pinfo, o63_v_tree, vti, tvb, o63_opt[subopt].ftype,
5456 suboptoff, subopt_len, o63_opt[subopt].phf, &default_hfs) == 0) {
5457 switch(o63_opt[subopt].ftype)
5459 case presence:
5460 if (subopt_len != 0) {
5461 expert_add_info_format(pinfo, vti, &ei_dhcp_bad_length, "length isn't 0");
5463 break;
5464 default:
5465 if (o63_opt[subopt].phf == NULL)
5466 proto_tree_add_item(o63_v_tree, hf_dhcp_option63_value, tvb, suboptoff, subopt_len, ENC_NA);
5467 break;
5471 optoff += (subopt_len + 2);
5472 return optoff;
5475 static int
5476 dissect_dhcpopt_netware_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
5478 int offset = 0;
5480 while (tvb_reported_length_remaining(tvb, offset) > 0) {
5481 offset = dissect_netware_ip_suboption(pinfo, tree, tree, tvb, offset, tvb_reported_length(tvb));
5484 return tvb_captured_length(tvb);
5487 static const value_string option125_tr111_suboption_vals[] = {
5488 { 1, "DeviceManufacturerOUI" },
5489 { 2, "DeviceSerialNumber" },
5490 { 3, "DeviceProductClass" },
5491 { 4, "GatewayManufacturerOUI" },
5492 { 5, "GatewaySerialNumber" },
5493 { 6, "GatewayProductClass" },
5494 { 0, NULL }
5497 static int
5498 dissect_vendor_tr111_suboption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
5500 int offset = 0;
5501 proto_tree *o125_v_tree;
5502 proto_item *vti, *ti;
5503 uint8_t subopt, subopt_len;
5505 static const struct basic_types_hfs default_hfs = {
5506 NULL,
5507 NULL,
5508 NULL,
5509 &hf_dhcp_option125_value_stringz,
5510 NULL,
5511 NULL,
5512 NULL,
5513 NULL,
5514 NULL,
5515 NULL,
5516 NULL
5519 /* Reference: TR-111 DHCP Option 125 Sub-Option Data Fields
5520 Page 10.
5523 static const struct opt_info o125_tr111_opt[]= {
5524 /* 0 */ {"nop", special, NULL}, /* dummy */
5525 /* 1 */ {"DeviceManufacturerOUI", oui, &hf_dhcp_option125_tr111_device_manufacturer_oui},
5526 /* 2 */ {"DeviceSerialNumber", string, &hf_dhcp_option125_tr111_device_serial_number},
5527 /* 3 */ {"DeviceProductClass", string, &hf_dhcp_option125_tr111_device_product_class},
5528 /* 4 */ {"GatewayManufacturerOUI", string, &hf_dhcp_option125_tr111_gateway_manufacturer_oui},
5529 /* 5 */ {"GatewaySerialNumber", string, &hf_dhcp_option125_tr111_gateway_serial_number},
5530 /* 6 */ {"GatewayProductClass", string, &hf_dhcp_option125_tr111_gateway_product_class},
5533 subopt = tvb_get_uint8(tvb, offset);
5534 offset++;
5536 if (tvb_reported_length_remaining(tvb, offset) < 1) {
5537 expert_add_info_format(pinfo, tree, &ei_dhcp_missing_subopt_length,
5538 "Suboption %d: no room left in option for suboption length", subopt);
5539 return offset;
5542 subopt_len = tvb_get_uint8(tvb, offset);
5543 vti = proto_tree_add_uint_format_value(tree, hf_dhcp_option125_tr111_suboption,
5544 tvb, offset, subopt_len+2, subopt, "(%d) %s",
5545 subopt, val_to_str_const(subopt, option125_tr111_suboption_vals, "Unknown"));
5547 o125_v_tree = proto_item_add_subtree(vti, ett_dhcp_option125_tr111_suboption);
5548 proto_tree_add_item(o125_v_tree, hf_dhcp_suboption_length, tvb, offset, 1, ENC_BIG_ENDIAN);
5549 offset++;
5551 if (tvb_reported_length_remaining(tvb, offset) < subopt_len) {
5552 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
5553 "Suboption %d: no room left in option for suboption value", subopt);
5554 return offset;
5557 ti = proto_tree_add_item(tree, hf_dhcp_option125_value, tvb, offset, subopt_len, ENC_NA);
5558 proto_item_set_hidden(ti);
5560 if (subopt < array_length(o125_tr111_opt)) {
5561 if (dhcp_handle_basic_types(pinfo, o125_v_tree, vti, tvb, o125_tr111_opt[subopt].ftype, offset, subopt_len, o125_tr111_opt[subopt].phf, &default_hfs) == 0) {
5562 if (o125_tr111_opt[subopt].ftype == special) {
5563 if (o125_tr111_opt[subopt].phf != NULL)
5564 proto_tree_add_item(o125_v_tree, *o125_tr111_opt[subopt].phf, tvb, offset, subopt_len, ENC_BIG_ENDIAN);
5565 else
5566 proto_tree_add_item(o125_v_tree, hf_dhcp_option125_value, tvb, offset, subopt_len, ENC_NA);
5568 else if (o125_tr111_opt[subopt].ftype == oui) {
5569 /* Get hex string. Expecting 6 characters. */
5570 const char *oui_string = (char *)tvb_get_string_enc(pinfo->pool, tvb, offset, subopt_len, ENC_ASCII);
5571 /* Convert to OUI number. Only 3 bytes so no data lost in downcast. */
5572 uint32_t oui_number = (uint32_t)strtol(oui_string, NULL, 16);
5573 /* Add item using oui_vals */
5574 proto_tree_add_uint(o125_v_tree, *o125_tr111_opt[subopt].phf, tvb, offset, subopt_len, oui_number);
5575 } else if (o125_tr111_opt[subopt].phf == NULL)
5576 proto_tree_add_item(o125_v_tree, hf_dhcp_option125_value, tvb, offset, subopt_len, ENC_NA);
5580 return subopt_len + 2;
5583 static const value_string option125_cl_suboption_vals[] = {
5584 { 1, "Option Request" },
5585 { 2, "TFTP Server Addresses" },
5586 { 3, "eRouter Container Option" },
5587 { 4, "MIB Environment Indicator Option" },
5588 { 5, "Modem Capabilities" },
5589 { 0, NULL }
5592 static const value_string pkt_mib_env_ind_opt_vals[] = {
5593 { 0x00, "Reserved" },
5594 { 0x01, "CableLabs" },
5595 { 0x02, "IETF" },
5596 { 0x03, "EuroCableLabs" },
5597 { 0, NULL }
5600 static int
5601 dissect_vendor_cl_suboption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
5603 int offset = 0;
5604 uint8_t subopt, subopt_len;
5605 proto_tree *o125_v_tree;
5606 proto_item *vti;
5608 static const struct basic_types_hfs default_hfs = {
5609 &hf_dhcp_option125_value,
5610 &hf_dhcp_option125_value_ip_address,
5611 &hf_dhcp_option125_value_ip_address,
5612 &hf_dhcp_option125_value_stringz,
5613 NULL,
5614 &hf_dhcp_option125_value_8,
5615 &hf_dhcp_option125_value_16,
5616 NULL,
5617 NULL,
5618 NULL,
5619 NULL
5622 static const struct opt_info o125_cl_opt[]= {
5623 /* 0 */ {"nop", special, NULL}, /* dummy */
5624 /* 1 */ {"Option Request = ", bytes, &hf_dhcp_option125_cl_option_request},
5625 /* 2 */ {"TFTP Server Addresses : ", ipv4_list, &hf_dhcp_option125_cl_tftp_server_addresses},
5626 /* 3 */ {"eRouter Container Option : ", bytes, &hf_dhcp_option125_cl_erouter_container_option},
5627 /* 4 */ {"MIB Environment Indicator Option = ", val_u_byte, &hf_dhcp_option125_cl_mib_environment_indicator_option},
5628 /* 5 */ {"Modem Capabilities : ", special, &hf_dhcp_option125_cl_modem_capabilities},
5631 subopt = tvb_get_uint8(tvb, offset);
5632 offset++;
5634 if (tvb_reported_length_remaining(tvb, offset) < 1) {
5635 expert_add_info_format(pinfo, tree, &ei_dhcp_missing_subopt_length,
5636 "Suboption %d: no room left in option for suboption length", subopt);
5637 return offset;
5640 subopt_len = tvb_get_uint8(tvb, offset);
5641 vti = proto_tree_add_uint_format_value(tree, hf_dhcp_option125_cl_suboption,
5642 tvb, offset, subopt_len+2, subopt, "(%d) %s",
5643 subopt, val_to_str_const(subopt, option125_cl_suboption_vals, "Unknown"));
5645 o125_v_tree = proto_item_add_subtree(vti, ett_dhcp_option125_cl_suboption);
5646 proto_tree_add_item(o125_v_tree, hf_dhcp_suboption_length, tvb, offset, 1, ENC_BIG_ENDIAN);
5647 offset++;
5649 if (tvb_reported_length_remaining(tvb, offset) < subopt_len) {
5650 expert_add_info_format(pinfo, vti, &ei_dhcp_missing_subopt_value,
5651 "Suboption %d: no room left in option for suboption value", subopt);
5652 return offset;
5655 if (subopt < array_length(o125_cl_opt)) {
5656 if (dhcp_handle_basic_types(pinfo, o125_v_tree, vti, tvb, o125_cl_opt[subopt].ftype,
5657 offset, subopt_len, o125_cl_opt[subopt].phf, &default_hfs) == 0) {
5659 switch(o125_cl_opt[subopt].ftype) {
5660 case special:
5661 if (o125_cl_opt[subopt].phf != NULL)
5662 proto_tree_add_item(o125_v_tree, *o125_cl_opt[subopt].phf, tvb, offset, subopt_len, ENC_BIG_ENDIAN);
5663 else
5664 proto_tree_add_item(o125_v_tree, hf_dhcp_option125_value, tvb, offset, subopt_len, ENC_NA);
5665 switch(subopt){
5666 case 5: /* Modem Capabilities */
5667 dissect_docsis_cm_cap(pinfo, o125_v_tree, tvb, offset-2, subopt_len+2, true);
5668 break;
5670 break;
5671 default:
5672 if (o125_cl_opt[subopt].phf == NULL)
5673 proto_tree_add_item(o125_v_tree, hf_dhcp_option125_value, tvb, offset, subopt_len, ENC_NA);
5674 break;
5679 return subopt_len + 2;
5682 /* PacketCable Multimedia Terminal Adapter device capabilities (option 60).
5683 Ref: PKT-SP-I05-021127 sections 8.2 and 10 */
5685 #define PKT_MDC_TLV_OFF 10
5688 /* These are ASCII-encoded hexadecimal digits. We use the raw hex equivalent for
5689 convenience. */
5690 #define PKT_MDC_VERSION 0x3031 /* "01" */
5691 #define PKT_MDC_TEL_END 0x3032 /* "02" */
5692 #define PKT_MDC_TGT 0x3033 /* "03" */
5693 #define PKT_MDC_HTTP_ACC 0x3034 /* "04" */
5694 #define PKT_MDC_SYSLOG 0x3035 /* "05" */
5695 #define PKT_MDC_NCS 0x3036 /* "06" */
5696 #define PKT_MDC_PRI_LINE 0x3037 /* "07" */
5697 #define PKT_MDC_VENDOR_TLV 0x3038 /* "08" */
5698 #define PKT_MDC_NVRAM_STOR 0x3039 /* "09" */
5699 #define PKT_MDC_PROV_REP 0x3041 /* "0A" */
5700 #define PKT_MDC_PROV_REP_LC 0x3061 /* "0a" */
5701 #define PKT_MDC_SUPP_CODECS 0x3042 /* "0B" */
5702 #define PKT_MDC_SUPP_CODECS_LC 0x3062 /* "0b" */
5703 #define PKT_MDC_SILENCE 0x3043 /* "0C" */
5704 #define PKT_MDC_SILENCE_LC 0x3063 /* "0c" */
5705 #define PKT_MDC_ECHO_CANCEL 0x3044 /* "0D" */
5706 #define PKT_MDC_ECHO_CANCEL_LC 0x3064 /* "0d" */
5707 #define PKT_MDC_RSVP 0x3045 /* "0E" */
5708 #define PKT_MDC_RSVP_LC 0x3065 /* "0e" */
5709 #define PKT_MDC_UGS_AD 0x3046 /* "0F" */
5710 #define PKT_MDC_UGS_AD_LC 0x3066 /* "0f" */
5711 #define PKT_MDC_IF_INDEX 0x3130 /* "10" */
5712 #define PKT_MDC_FLOW_LOG 0x3131 /* "11" */
5713 #define PKT_MDC_PROV_FLOWS 0x3132 /* "12" */
5714 /* PacketCable 1.5: */
5715 #define PKT_MDC_T38_VERSION 0x3133 /* "13" */
5716 #define PKT_MDC_T38_EC 0x3134 /* "14" */
5717 #define PKT_MDC_RFC2833_DTMF 0x3135 /* "15" */
5718 #define PKT_MDC_VOICE_METRICS 0x3136 /* "16" */
5719 #define PKT_MDC_MIBS 0x3137 /* "17" */
5720 #define PKT_MDC_MGPI 0x3138 /* "18" */
5721 #define PKT_MDC_V152 0x3139 /* "19" */
5722 #define PKT_MDC_CBS 0x3141 /* "1A" */
5723 #define PKT_MDC_CBS_LC 0x3161 /* "1a" */
5725 static const value_string pkt_mdc_type_vals[] = {
5726 { PKT_MDC_VERSION, "PacketCable Version" },
5727 { PKT_MDC_TEL_END, "Number Of Telephony Endpoints" },
5728 { PKT_MDC_TGT, "TGT Support" },
5729 { PKT_MDC_HTTP_ACC, "HTTP Download File Access Method Support" },
5730 { PKT_MDC_SYSLOG, "MTA-24 Event SYSLOG Notification Support" },
5731 { PKT_MDC_NCS, "NCS Service Flow Support" },
5732 { PKT_MDC_PRI_LINE, "Primary Line Support" },
5733 { PKT_MDC_VENDOR_TLV, "Vendor Specific TLV Type(s)" },
5734 { PKT_MDC_NVRAM_STOR, "NVRAM Ticket/Session Keys Storage Support" },
5735 { PKT_MDC_PROV_REP, "Provisioning Event Reporting Support" },
5736 { PKT_MDC_PROV_REP_LC, "Provisioning Event Reporting Support" },
5737 { PKT_MDC_SUPP_CODECS, "Supported CODEC(s)" },
5738 { PKT_MDC_SUPP_CODECS_LC, "Supported CODEC(s)" },
5739 { PKT_MDC_SILENCE, "Silence Suppression Support" },
5740 { PKT_MDC_SILENCE_LC, "Silence Suppression Support" },
5741 { PKT_MDC_ECHO_CANCEL, "Echo Cancellation Support" },
5742 { PKT_MDC_ECHO_CANCEL_LC, "Echo Cancellation Support" },
5743 { PKT_MDC_RSVP, "RSVP Support/ Reserved" },
5744 { PKT_MDC_RSVP_LC, "RSVP Support/ Reserved" },
5745 { PKT_MDC_UGS_AD, "UGS-AD Support" },
5746 { PKT_MDC_UGS_AD_LC, "UGS-AD Support" },
5747 { PKT_MDC_IF_INDEX, "MTA's \"ifIndex\" starting number in \"ifTable\"" },
5748 { PKT_MDC_FLOW_LOG, "Provisioning Flow Logging Support" },
5749 { PKT_MDC_PROV_FLOWS, "Supported Provisioning Flows" },
5750 /* PacketCable 1.5: */
5751 { PKT_MDC_T38_VERSION, "T38 Version Support" },
5752 { PKT_MDC_T38_EC, "T38 Error Correction Support" },
5753 { PKT_MDC_RFC2833_DTMF, "RFC 2833 DTMF Support" },
5754 { PKT_MDC_VOICE_METRICS, "Voice Metrics Support" },
5755 { PKT_MDC_MIBS, "MIB Support" },
5756 { PKT_MDC_MGPI, "Multiple Grants Per Interval Support" },
5757 { PKT_MDC_V152, "V.152 Support" },
5758 /* PacketCable 2.0: */
5759 { PKT_MDC_CBS, "Certificate Bootstrapping Support" },
5760 { PKT_MDC_CBS_LC, "Certificate Bootstrapping Support" },
5761 { 0, NULL }
5764 static const value_string pkt_mdc_version_vals[] = {
5765 { 0x3030, "PacketCable 1.0" },
5766 { 0x3031, "PacketCable 1.1/1.5" }, /* 1.5 replaces 1.1-1.3 */
5767 { 0x3032, "PacketCable 2.0" },
5768 { 0, NULL }
5771 static const value_string pkt_mdc_boolean_vals[] = {
5772 { 0x3030, "No" },
5773 { 0x3031, "Yes" },
5774 { 0, NULL }
5777 static const value_string pkt_mdc_codec_vals[] = {
5778 { 0x3031, "other" }, /* "01" */
5779 { 0x3032, "unknown" },
5780 { 0x3033, "G.729" },
5781 { 0x3034, "reserved" },
5782 { 0x3035, "G.729E" },
5783 { 0x3036, "PCMU" },
5784 { 0x3037, "G.726-32" },
5785 { 0x3038, "G.728" },
5786 { 0x3039, "PCMA" }, /* "09" */
5787 { 0x3041, "G.726-16" }, /* "0A" */
5788 { 0x3042, "G.726-24" },
5789 { 0x3043, "G.726-40" },
5790 { 0x3044, "iLBC" },
5791 { 0x3045, "BV16" },
5792 { 0x3046, "telephone-event" }, /* "0F" */
5793 { 0, NULL }
5796 static const value_string pkt_mdc_t38_version_vals[] = {
5797 { 0x3030, "Unsupported" },
5798 { 0x3031, "T.38 Version Zero" }, /* default */
5799 { 0x3032, "T.38 Version One" },
5800 { 0x3033, "T.38 Version Two" },
5801 { 0x3035, "T.38 Version Three" },
5802 { 0, NULL }
5805 static const value_string pkt_mdc_t38_ec_vals[] = {
5806 { 0x3030, "None" },
5807 { 0x3031, "Redundancy" }, /* default */
5808 { 0x3032, "FEC" },
5809 { 0, NULL }
5812 static const value_string pkt_mdc_mib_orgs[] = {
5813 { 0x3030, "CableLabs" },
5814 { 0x3031, "IETF" },
5815 { 0x3032, "EuroCableLabs" },
5816 { 0x3033, "Reserved" },
5817 { 0x3034, "Reserved" },
5818 { 0x3035, "Reserved" },
5819 { 0x3036, "Reserved" },
5820 { 0x3037, "Reserved" },
5821 { 0x3038, "Reserved" },
5822 { 0x3039, "Reserved" },
5823 { 0, NULL }
5826 static int hf_dhcp_pkt_mdc_supp_flow_secure;
5827 static int hf_dhcp_pkt_mdc_supp_flow_hybrid;
5828 static int hf_dhcp_pkt_mdc_supp_flow_basic;
5830 #define PKT_MDC_MIB_CL 0x3030
5831 static int hf_dhcp_pkt_mdc_mib_cl_mta;
5832 static int hf_dhcp_pkt_mdc_mib_cl_signaling;
5833 static int hf_dhcp_pkt_mdc_mib_cl_management_event;
5834 static int hf_dhcp_pkt_mdc_mib_cl_mta_extension;
5835 static int hf_dhcp_pkt_mdc_mib_cl_mta_signaling_extension;
5836 static int hf_dhcp_pkt_mdc_mib_cl_mta_mem_extension;
5837 static int hf_dhcp_pkt_mdc_mib_cl_reserved;
5839 #define PKT_MDC_MIB_IETF 0x3031
5840 static int hf_dhcp_pkt_mdc_mib_ietf_mta;
5841 static int hf_dhcp_pkt_mdc_mib_ietf_signaling;
5842 static int hf_dhcp_pkt_mdc_mib_ietf_management_event;
5843 static int hf_dhcp_pkt_mdc_mib_ietf_reserved;
5845 #define PKT_MDC_MIB_EURO 0x3032
5846 static int hf_dhcp_pkt_mdc_mib_euro_mta;
5847 static int hf_dhcp_pkt_mdc_mib_euro_signaling;
5848 static int hf_dhcp_pkt_mdc_mib_euro_management_event;
5849 static int hf_dhcp_pkt_mdc_mib_euro_mta_extension;
5850 static int hf_dhcp_pkt_mdc_mib_euro_mta_signaling_extension;
5851 static int hf_dhcp_pkt_mdc_mib_euro_mta_mem_extension;
5852 static int hf_dhcp_pkt_mdc_mib_euro_reserved;
5855 static void
5856 dissect_packetcable_mta_cap(proto_tree *v_tree, packet_info *pinfo, tvbuff_t *tvb, int voff, int len)
5858 uint16_t raw_val;
5859 uint32_t flow_val = 0;
5860 int off = PKT_MDC_TLV_OFF + voff;
5861 int subopt_off, max_len;
5862 unsigned tlv_len, i, mib_val;
5863 uint8_t flow_val_str[5];
5864 uint8_t *asc_val;
5865 proto_item *ti, *mib_ti;
5866 proto_tree *subtree, *subtree2;
5868 asc_val = tvb_get_string_enc(pinfo->pool, tvb, off, 2, ENC_ASCII);
5869 if (sscanf((char*)asc_val, "%x", &tlv_len) != 1 || tlv_len > 0xff) {
5870 proto_tree_add_expert_format(v_tree, pinfo, &ei_dhcp_bad_length, tvb, off, len - off,
5871 "Bogus length: %s",
5872 format_text_string(pinfo->pool, asc_val));
5873 return;
5874 } else {
5875 proto_tree_add_uint(v_tree, hf_dhcp_pkt_mta_cap_len, tvb, off, 2, tlv_len);
5876 off += 2;
5878 while (off - voff < len) {
5879 /* Type */
5880 raw_val = tvb_get_ntohs (tvb, off);
5882 /* Length */
5883 asc_val = tvb_get_string_enc(pinfo->pool, tvb, off + 2, 2, ENC_ASCII);
5884 if (sscanf((char*)asc_val, "%x", &tlv_len) != 1
5885 || tlv_len < 1 || tlv_len > UINT16_MAX) {
5886 proto_tree_add_expert_format(v_tree, pinfo, &ei_dhcp_bad_length, tvb, off, len - off,
5887 "Bogus length: %s",
5888 format_text_string(pinfo->pool, asc_val));
5889 return;
5890 } else {
5891 /* Value(s) */
5893 ti = proto_tree_add_uint_format(v_tree, hf_dhcp_pkt_mta_cap_type,
5894 tvb, off, 2, raw_val, "0x%s: %s = ",
5895 tvb_format_text(pinfo->pool, tvb, off, 2),
5896 val_to_str_const(raw_val, pkt_mdc_type_vals, "unknown"));
5897 proto_item_set_len(ti, (tlv_len * 2) + 4);
5898 switch (raw_val) {
5900 case PKT_MDC_VERSION:
5901 raw_val = tvb_get_ntohs(tvb, off + 4);
5902 proto_item_append_text(ti,
5903 "%s (%s)",
5904 val_to_str_const(raw_val, pkt_mdc_version_vals, "Reserved"),
5905 tvb_format_stringzpad(pinfo->pool, tvb, off + 4, 2) );
5906 break;
5908 case PKT_MDC_TEL_END:
5909 case PKT_MDC_IF_INDEX:
5910 proto_item_append_text(ti,
5911 "%s",
5912 tvb_format_stringzpad(pinfo->pool, tvb, off + 4, 2) );
5913 break;
5915 case PKT_MDC_TGT:
5916 case PKT_MDC_HTTP_ACC:
5917 case PKT_MDC_SYSLOG:
5918 case PKT_MDC_NCS:
5919 case PKT_MDC_PRI_LINE:
5920 case PKT_MDC_NVRAM_STOR:
5921 case PKT_MDC_PROV_REP:
5922 case PKT_MDC_PROV_REP_LC:
5923 case PKT_MDC_SILENCE:
5924 case PKT_MDC_SILENCE_LC:
5925 case PKT_MDC_ECHO_CANCEL:
5926 case PKT_MDC_ECHO_CANCEL_LC:
5927 case PKT_MDC_RSVP:
5928 case PKT_MDC_RSVP_LC:
5929 case PKT_MDC_UGS_AD:
5930 case PKT_MDC_UGS_AD_LC:
5931 case PKT_MDC_FLOW_LOG:
5932 case PKT_MDC_RFC2833_DTMF:
5933 case PKT_MDC_VOICE_METRICS:
5934 case PKT_MDC_MGPI:
5935 case PKT_MDC_V152:
5936 case PKT_MDC_CBS:
5937 case PKT_MDC_CBS_LC:
5938 raw_val = tvb_get_ntohs(tvb, off + 4);
5939 proto_item_append_text(ti,
5940 "%s (%s)",
5941 val_to_str_const(raw_val, pkt_mdc_boolean_vals, "unknown"),
5942 tvb_format_stringzpad(pinfo->pool, tvb, off + 4, 2) );
5943 break;
5945 case PKT_MDC_SUPP_CODECS:
5946 case PKT_MDC_SUPP_CODECS_LC:
5947 for (i = 0; i < tlv_len; i++) {
5948 raw_val = tvb_get_ntohs(tvb, off + 4 + (i * 2) );
5949 proto_item_append_text(ti,
5950 "%s%s (%s)",
5951 plurality(i + 1, "", ", "),
5952 val_to_str_const(raw_val, pkt_mdc_codec_vals, "unknown"),
5953 tvb_format_stringzpad(pinfo->pool, tvb, off + 4 + (i * 2), 2) );
5955 break;
5957 case PKT_MDC_PROV_FLOWS:
5958 tvb_memcpy(tvb, flow_val_str, off + 4, 4);
5959 flow_val_str[4] = '\0';
5960 /* We are only reading 4 digits which should fit in 32 bits */
5961 flow_val = (uint32_t)strtoul((char*)flow_val_str, NULL, 16);
5962 proto_item_append_text(ti,
5963 "0x%04x", flow_val);
5964 break;
5966 case PKT_MDC_T38_VERSION:
5967 raw_val = tvb_get_ntohs(tvb, off + 4);
5968 proto_item_append_text(ti,
5969 "%s (%s)",
5970 val_to_str_const(raw_val, pkt_mdc_t38_version_vals, "unknown"),
5971 tvb_format_stringzpad(pinfo->pool, tvb, off + 4, 2) );
5972 break;
5974 case PKT_MDC_T38_EC:
5975 raw_val = tvb_get_ntohs(tvb, off + 4);
5976 proto_item_append_text(ti,
5977 "%s (%s)",
5978 val_to_str_const(raw_val, pkt_mdc_t38_ec_vals, "unknown"),
5979 tvb_format_stringzpad(pinfo->pool, tvb, off + 4, 2) );
5980 break;
5982 case PKT_MDC_MIBS:
5983 break;
5985 case PKT_MDC_VENDOR_TLV:
5986 default:
5987 proto_item_append_text(ti,
5988 "%s",
5989 tvb_format_stringzpad(pinfo->pool, tvb, off + 4, tlv_len * 2) );
5990 break;
5993 subtree = proto_item_add_subtree(ti, ett_dhcp_option);
5994 if (raw_val == PKT_MDC_PROV_FLOWS) {
5995 static int * const flows[] = {
5996 &hf_dhcp_pkt_mdc_supp_flow_secure,
5997 &hf_dhcp_pkt_mdc_supp_flow_hybrid,
5998 &hf_dhcp_pkt_mdc_supp_flow_basic,
5999 NULL
6002 proto_tree_add_bitmask_list_value(subtree, tvb, off + 4, 4, flows, flow_val);
6003 } else if (raw_val == PKT_MDC_MIBS) {
6004 /* 17 06 02 00 38 02 01 07 */
6005 subopt_off = off + 4;
6006 max_len = subopt_off + (tlv_len * 2);
6007 while (subopt_off < max_len) {
6008 raw_val = tvb_get_ntohs(tvb, subopt_off);
6009 if (raw_val != 0x3032) { /* We only know how to handle a length of 2 */
6010 asc_val = tvb_get_string_enc(pinfo->pool, tvb, subopt_off, 2, ENC_ASCII);
6011 proto_tree_add_expert_format(subtree, pinfo, &ei_dhcp_bad_length, tvb, subopt_off, 2,
6012 "Bogus length: %s",
6013 format_text_string(pinfo->pool, asc_val));
6014 return;
6017 subopt_off += 2;
6018 raw_val = tvb_get_ntohs(tvb, subopt_off);
6019 asc_val = tvb_get_string_enc(pinfo->pool, tvb, subopt_off, 2, ENC_ASCII);
6020 subtree2 = proto_tree_add_subtree_format(subtree, tvb, subopt_off, 2,
6021 ett_dhcp_option, &mib_ti, "%s (%s)",
6022 val_to_str_const(raw_val, pkt_mdc_mib_orgs, "Unknown"),
6023 format_text_string(pinfo->pool, asc_val));
6024 if (subopt_off > off + 4 + 2) {
6025 proto_item_append_text(ti, ", ");
6027 proto_item_append_text(ti, "%s", val_to_str_const(raw_val, pkt_mdc_mib_orgs, "Unknown"));
6029 subopt_off += 2;
6030 asc_val = tvb_get_string_enc(pinfo->pool, tvb, subopt_off, 2, ENC_ASCII);
6031 if (sscanf((char*)asc_val, "%x", &mib_val) != 1) {
6032 proto_tree_add_expert_format(v_tree, pinfo, &ei_dhcp_bad_bitfield, tvb, subopt_off, 2,
6033 "Bogus bitfield: %s", format_text_string(pinfo->pool, asc_val));
6034 return;
6036 switch (raw_val) {
6038 case PKT_MDC_MIB_CL: {
6039 static int * const cl_flags[] = {
6040 &hf_dhcp_pkt_mdc_mib_cl_mta,
6041 &hf_dhcp_pkt_mdc_mib_cl_signaling,
6042 &hf_dhcp_pkt_mdc_mib_cl_management_event,
6043 &hf_dhcp_pkt_mdc_mib_cl_mta_extension,
6044 &hf_dhcp_pkt_mdc_mib_cl_mta_signaling_extension,
6045 &hf_dhcp_pkt_mdc_mib_cl_mta_mem_extension,
6046 &hf_dhcp_pkt_mdc_mib_cl_reserved,
6047 NULL
6050 proto_tree_add_bitmask_list_value(subtree2, tvb, subopt_off, 2, cl_flags, mib_val);
6052 break;
6054 case PKT_MDC_MIB_IETF: {
6055 static int * const ietf_flags[] = {
6056 &hf_dhcp_pkt_mdc_mib_ietf_mta,
6057 &hf_dhcp_pkt_mdc_mib_ietf_signaling,
6058 &hf_dhcp_pkt_mdc_mib_ietf_management_event,
6059 &hf_dhcp_pkt_mdc_mib_ietf_reserved,
6060 NULL
6063 proto_tree_add_bitmask_list_value(subtree2, tvb, subopt_off, 2, ietf_flags, mib_val);
6065 break;
6067 case PKT_MDC_MIB_EURO: {
6068 static int * const euro_flags[] = {
6069 &hf_dhcp_pkt_mdc_mib_euro_mta,
6070 &hf_dhcp_pkt_mdc_mib_euro_signaling,
6071 &hf_dhcp_pkt_mdc_mib_euro_management_event,
6072 &hf_dhcp_pkt_mdc_mib_euro_mta_extension,
6073 &hf_dhcp_pkt_mdc_mib_euro_mta_signaling_extension,
6074 &hf_dhcp_pkt_mdc_mib_euro_mta_mem_extension,
6075 &hf_dhcp_pkt_mdc_mib_euro_reserved,
6076 NULL
6079 proto_tree_add_bitmask_list_value(subtree2, tvb, subopt_off, 2, euro_flags, mib_val);
6081 break;
6083 default:
6084 break;
6086 subopt_off += 2;
6090 off += (tlv_len * 2) + 4;
6095 static bool
6096 dissect_packetcable_mta_vendor_id_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ )
6098 uint8_t* vendor_id;
6100 if (tvb_reported_length(tvb) < 8) {
6101 return false;
6104 vendor_id = tvb_get_string_enc(pinfo->pool, tvb, 0, 8, ENC_ASCII|ENC_NA);
6105 if ((strcmp((const char*)vendor_id, PACKETCABLE_MTA_CAP10) == 0) ||
6106 (strcmp((const char*)vendor_id, PACKETCABLE_MTA_CAP15) == 0) ||
6107 (strcmp((const char*)vendor_id, PACKETCABLE_MTA_CAP20) == 0)) {
6108 dissect_packetcable_mta_cap(tree, pinfo, tvb, 0, tvb_reported_length(tvb));
6109 return true;
6112 return false;
6115 /* DOCSIS Cable Modem device capabilities (option 60/option 125). */
6116 #define DOCSIS_CM_CAP_TLV_OFF 12
6118 #define DOCSIS_CM_CAP_CONCAT_SUP 0x01
6119 #define DOCSIS_CM_CAP_DOCSIS_VER 0x02
6120 #define DOCSIS_CM_CAP_FRAG_SUP 0x03
6121 #define DOCSIS_CM_CAP_PHS_SUP 0x04
6122 #define DOCSIS_CM_CAP_IGMP_SUP 0x05
6123 #define DOCSIS_CM_CAP_PRIV_SUP 0x06
6124 #define DOCSIS_CM_CAP_DSAID_SUP 0x07
6125 #define DOCSIS_CM_CAP_USSF_SUP 0x08
6126 #define DOCSIS_CM_CAP_FILT_SUP 0x09
6127 #define DOCSIS_CM_CAP_TET_MI 0x0a
6128 #define DOCSIS_CM_CAP_TET 0x0b
6129 #define DOCSIS_CM_CAP_DCC_SUP 0x0c
6130 #define DOCSIS_CM_CAP_IPFILT_SUP 0x0d
6131 #define DOCSIS_CM_CAP_LLCFILT_SUP 0x0e
6132 #define DOCSIS_CM_CAP_EXPUNI_SPACE 0x0f
6133 #define DOCSIS_CM_CAP_RNGHLDOFF_SUP 0x10
6134 #define DOCSIS_CM_CAP_L2VPN_SUP 0x11
6135 #define DOCSIS_CM_CAP_L2VPN_HOST_SUP 0x12
6136 #define DOCSIS_CM_CAP_DUTFILT_SUP 0x13
6137 #define DOCSIS_CM_CAP_USFREQRNG_SUP 0x14
6138 #define DOCSIS_CM_CAP_USSYMRATE_SUP 0x15
6139 #define DOCSIS_CM_CAP_SACM2_SUP 0x16
6140 #define DOCSIS_CM_CAP_SACM2HOP_SUP 0x17
6141 #define DOCSIS_CM_CAP_MULTTXCHAN_SUP 0x18
6142 #define DOCSIS_CM_CAP_512USTXCHAN_SUP 0x19
6143 #define DOCSIS_CM_CAP_256USTXCHAN_SUP 0x1a
6144 #define DOCSIS_CM_CAP_TOTALSIDCLU_SUP 0x1b
6145 #define DOCSIS_CM_CAP_SIDCLUPERSF_SUP 0x1c
6146 #define DOCSIS_CM_CAP_MULTRXCHAN_SUP 0x1d
6147 #define DOCSIS_CM_CAP_TOTALDSID_SUP 0x1e
6148 #define DOCSIS_CM_CAP_RESEQDSID_SUP 0x1f
6149 #define DOCSIS_CM_CAP_MULTDSID_SUP 0x20
6150 #define DOCSIS_CM_CAP_MULTDSIDFW_SUP 0x21
6151 #define DOCSIS_CM_CAP_FCTF_SUP 0x22
6152 #define DOCSIS_CM_CAP_DPV_SUP 0x23
6153 #define DOCSIS_CM_CAP_UGSPERUSFLOW_SUP 0x24
6154 #define DOCSIS_CM_CAP_MAPUCDRECEIPT_SUP 0x25
6155 #define DOCSIS_CM_CAP_USDROPCLASSIF_SUP 0x26
6156 #define DOCSIS_CM_CAP_IPV6_SUP 0x27
6157 #define DOCSIS_CM_CAP_ExUsTrPow 0x28
6158 #define DOCSIS_CM_CAP_Opt802MPLSSup 0x29
6159 #define DOCSIS_CM_CAP_DounEnc 0x2a
6160 #define DOCSIS_CM_CAP_EnrgMang 0x2c
6162 static const value_string docsis_cm_cap_type_vals[] = {
6163 { DOCSIS_CM_CAP_CONCAT_SUP, "Concatenation Support" },
6164 { DOCSIS_CM_CAP_DOCSIS_VER, "DOCSIS Version" },
6165 { DOCSIS_CM_CAP_FRAG_SUP, "Fragmentation Support" },
6166 { DOCSIS_CM_CAP_PHS_SUP, "Payload Header Suppression Support" },
6167 { DOCSIS_CM_CAP_IGMP_SUP, "IGMP Support" },
6168 { DOCSIS_CM_CAP_PRIV_SUP, "Privacy Support" },
6169 { DOCSIS_CM_CAP_DSAID_SUP, "Downstream SAID Support" },
6170 { DOCSIS_CM_CAP_USSF_SUP, "Upstream Service Flow Support" },
6171 { DOCSIS_CM_CAP_FILT_SUP, "Optional Filtering Support" },
6172 { DOCSIS_CM_CAP_TET_MI, "Transmit Equalizer Taps per Modulation Interval" },
6173 { DOCSIS_CM_CAP_TET, "Number of Transmit Equalizer Taps" },
6174 { DOCSIS_CM_CAP_DCC_SUP, "DCC Support" },
6175 { DOCSIS_CM_CAP_IPFILT_SUP, "IP Filters Support" },
6176 { DOCSIS_CM_CAP_LLCFILT_SUP, "LLC Filters Support" },
6177 { DOCSIS_CM_CAP_EXPUNI_SPACE, "Expanded Unicast SID Space" },
6178 { DOCSIS_CM_CAP_RNGHLDOFF_SUP, "Ranging Hold-Off Support" },
6179 { DOCSIS_CM_CAP_L2VPN_SUP, "L2VPN Capability" },
6180 { DOCSIS_CM_CAP_L2VPN_HOST_SUP, "L2VPN eSAFE Host Capability" },
6181 { DOCSIS_CM_CAP_DUTFILT_SUP, "Downstream Unencrypted Traffic (DUT) Filtering" },
6182 { DOCSIS_CM_CAP_USFREQRNG_SUP, "Upstream Frequency Range Support" },
6183 { DOCSIS_CM_CAP_USSYMRATE_SUP, "Upstream Symbol Rate Support" },
6184 { DOCSIS_CM_CAP_SACM2_SUP, "Selectable Active Code Mode 2 Support" },
6185 { DOCSIS_CM_CAP_SACM2HOP_SUP, "Code Hopping Mode 2 Support" },
6186 { DOCSIS_CM_CAP_MULTTXCHAN_SUP, "Multiple Transmit Channel Support" },
6187 { DOCSIS_CM_CAP_512USTXCHAN_SUP, "5.12 Msps Upstream Transmit Channel Support" },
6188 { DOCSIS_CM_CAP_256USTXCHAN_SUP, "2.56 Msps Upstream Transmit Channel Support" },
6189 { DOCSIS_CM_CAP_TOTALSIDCLU_SUP, "Total SID Cluster Support" },
6190 { DOCSIS_CM_CAP_SIDCLUPERSF_SUP, "SID Clusters per Service Flow Support" },
6191 { DOCSIS_CM_CAP_MULTRXCHAN_SUP, "Multiple Receive Channel Support" },
6192 { DOCSIS_CM_CAP_TOTALDSID_SUP, "Total Downstream Service ID (DSID) Support" },
6193 { DOCSIS_CM_CAP_RESEQDSID_SUP, "Resequencing Downstream Service ID (DSID) Support" },
6194 { DOCSIS_CM_CAP_MULTDSID_SUP, "Multicast Downstream Service ID (DSID) Support" },
6195 { DOCSIS_CM_CAP_MULTDSIDFW_SUP, "Multicast DSID Forwarding" },
6196 { DOCSIS_CM_CAP_FCTF_SUP, "Frame Control Type Forwarding Capability" },
6197 { DOCSIS_CM_CAP_DPV_SUP, "DPV Capability" },
6198 { DOCSIS_CM_CAP_UGSPERUSFLOW_SUP, "Unsolicited Grant Service/Upstream Service Flow Support" },
6199 { DOCSIS_CM_CAP_MAPUCDRECEIPT_SUP, "MAP and UCD Receipt Support" },
6200 { DOCSIS_CM_CAP_USDROPCLASSIF_SUP, "Upstream Drop Classifier Support" },
6201 { DOCSIS_CM_CAP_IPV6_SUP, "IPv6 Support" },
6202 { DOCSIS_CM_CAP_ExUsTrPow, "Extended Upstream Transmit Power Capability (1/4 dB)" },
6203 { DOCSIS_CM_CAP_Opt802MPLSSup, "Optional 802.1ad, 802.1ah, MPLS Classification Support" },
6204 { DOCSIS_CM_CAP_DounEnc, "D-ONU Capabilities Encoding" },
6205 { DOCSIS_CM_CAP_EnrgMang, "Energy Management Capabilities" },
6206 { 0, NULL }
6209 static const value_string docsis_cm_cap_supported_vals[] = {
6210 { 0x00, "Not Support" },
6211 { 0x01, "Supported" },
6212 { 0, NULL }
6215 static const value_string docsis_cm_cap_version_vals[] = {
6216 { 0x00, "DOCSIS 1.0" },
6217 { 0x01, "DOCSIS 1.1" },
6218 { 0x02, "DOCSIS 2.0" },
6219 { 0x03, "DOCSIS 3.0" },
6220 { 0, NULL }
6223 static const value_string docsis_cm_cap_privacy_vals[] = {
6224 { 0x00, "BPI Support" },
6225 { 0x01, "BPI Plus Support" },
6226 { 0, NULL }
6229 static int hf_dhcp_docsis_cm_cap_ranging_hold_off_cm;
6230 static int hf_dhcp_docsis_cm_cap_ranging_hold_off_eps;
6231 static int hf_dhcp_docsis_cm_cap_ranging_hold_off_emta;
6232 static int hf_dhcp_docsis_cm_cap_ranging_hold_off_dsg;
6234 static const value_string docsis_cm_cap_l2vpn_vals[] = {
6235 { 0x00, "CM not compliant with DOCSIS L2VPN Section 7 (default)" },
6236 { 0x01, "CM compliant with DOCSIS L2VPN Section 7" },
6237 { 0, NULL }
6240 static const value_string docsis_cm_cap_filt_vals[] = {
6241 { 0x00, "802.1P Filtering" },
6242 { 0x01, "802.1Q Filtering" },
6243 { 0, NULL }
6246 static int hf_dhcp_docsis_cm_cap_mpls_stpid;
6247 static int hf_dhcp_docsis_cm_cap_mpls_svid;
6248 static int hf_dhcp_docsis_cm_cap_mpls_spcp;
6249 static int hf_dhcp_docsis_cm_cap_mpls_sdei;
6250 static int hf_dhcp_docsis_cm_cap_mpls_ctpid;
6251 static int hf_dhcp_docsis_cm_cap_mpls_cvid;
6252 static int hf_dhcp_docsis_cm_cap_mpls_cpcp;
6253 static int hf_dhcp_docsis_cm_cap_mpls_ccfi;
6254 static int hf_dhcp_docsis_cm_cap_mpls_stci;
6255 static int hf_dhcp_docsis_cm_cap_mpls_ctci;
6256 static int hf_dhcp_docsis_cm_cap_mpls_itpid;
6257 static int hf_dhcp_docsis_cm_cap_mpls_isid;
6258 static int hf_dhcp_docsis_cm_cap_mpls_itci;
6259 static int hf_dhcp_docsis_cm_cap_mpls_ipcp;
6260 static int hf_dhcp_docsis_cm_cap_mpls_idei;
6261 static int hf_dhcp_docsis_cm_cap_mpls_iuca;
6262 static int hf_dhcp_docsis_cm_cap_mpls_btpid;
6263 static int hf_dhcp_docsis_cm_cap_mpls_btci;
6264 static int hf_dhcp_docsis_cm_cap_mpls_bpcp;
6265 static int hf_dhcp_docsis_cm_cap_mpls_bdei;
6266 static int hf_dhcp_docsis_cm_cap_mpls_bvid;
6267 static int hf_dhcp_docsis_cm_cap_mpls_bda;
6268 static int hf_dhcp_docsis_cm_cap_mpls_bsa;
6269 static int hf_dhcp_docsis_cm_cap_mpls_tc;
6270 static int hf_dhcp_docsis_cm_cap_mpls_label;
6272 static const value_string docsis_cm_cap_enrgmang_vals[] = {
6273 { 0x00, "Energy Management 1x1 Feature" },
6274 { 0, NULL }
6277 static const value_string docsis_cm_cap_usfreqrng_vals[] = {
6278 { 0x00, "Standard Upstream Frequency Range" },
6279 { 0x01, "Standard Upstream Frequency Range and Extended Upstream Frequency Range" },
6280 { 0, NULL }
6283 static const value_string docsis_cm_cap_map_ucd_receipt_vals[] = {
6284 { 0x00, "CM cannot support the receipt of MAPs and UCDs on downstreams other than the Primary Downstream Channel" },
6285 { 0x01, "CM can support the receipt of MAPs and UCDs on downstreams other than the Primary Downstream Channel" },
6286 { 0, NULL }
6289 static const value_string docsis_cm_cap_map_dpv_support_vals[] = {
6290 { 0x00, "U1 supported as a Start Reference Point for DPV per Path" },
6291 { 0x01, "U1 supported as a Start Reference Point for DPV per Packet" },
6292 { 0, NULL }
6295 static const value_string docsis_cm_cap_map_multDsidForward_support_vals[] = {
6296 { 0x00, "No support for multicast DSID forwarding" },
6297 { 0x01, "Support for GMAC explicit multicast DSID forwarding" },
6298 { 0x02, "Support for GMAC promiscuous multicast DSID forwarding" },
6299 { 0, NULL }
6302 static const value_string docsis_cm_cap_map_fctfc_support_vals[] = {
6303 { 0x00, "Isolation Packet PDU MAC Header (FC_Type of 10) is not forwarded" },
6304 { 0x01, "Isolation Packet PDU MAC Header (FC_Type of 10) is forwarded" },
6305 { 0, NULL }
6308 static const value_string docsis_cm_cap_map_l2vpn_esafe_index_support_vals[] = {
6309 { 0x01, "ePs or eRouter" },
6310 { 0x10, "eMTA" },
6311 { 0x11, "eSTB-IP" },
6312 { 0x12, "eSTB-DSG" },
6313 { 0x13, "eTEA" },
6314 { 0, NULL }
6317 static int hf_dhcp_docsis_cm_cap_ussymrate_160;
6318 static int hf_dhcp_docsis_cm_cap_ussymrate_320;
6319 static int hf_dhcp_docsis_cm_cap_ussymrate_640;
6320 static int hf_dhcp_docsis_cm_cap_ussymrate_1280;
6321 static int hf_dhcp_docsis_cm_cap_ussymrate_2560;
6322 static int hf_dhcp_docsis_cm_cap_ussymrate_5120;
6324 static void
6325 display_uint_with_range_checking(proto_item *ti, uint8_t val_byte, uint16_t val_uint16, int min_value, int max_value)
6327 uint16_t value;
6329 if (0 != val_byte)
6331 value = val_byte;
6333 else
6335 value = val_uint16;
6337 proto_item_append_text(ti, "%i", value);
6338 if ((value < min_value) ||
6339 (value > max_value))
6341 proto_item_append_text(ti, " (Value Out-of-Range [%i..%i])", min_value, max_value);
6345 static void get_opt125_tlv(wmem_allocator_t *scope, tvbuff_t *tvb, unsigned off, uint8_t *tlvtype, uint8_t *tlvlen, uint8_t **value)
6347 /* Type */
6348 *tlvtype = tvb_get_uint8(tvb, off);
6349 /* Length */
6350 *tlvlen = tvb_get_uint8(tvb, off+1);
6351 /* Value */
6352 *value = (uint8_t *)tvb_memdup(scope, tvb, off + 2, *tlvlen);
6355 static void get_opt60_tlv(wmem_allocator_t *scope, tvbuff_t *tvb, unsigned off, uint8_t *tlvtype, uint8_t *tlvlen, uint8_t **value)
6357 unsigned i;
6358 uint8_t *val_asc;
6360 val_asc = (uint8_t *)wmem_alloc0(scope, 4);
6361 /* Type */
6362 tvb_memcpy(tvb, val_asc, off, 2);
6363 *tlvtype = (uint8_t)strtoul((char*)val_asc, NULL, 16);
6364 /* Length */
6365 tvb_memcpy(tvb, val_asc, off + 2, 2);
6366 *tlvlen = (uint8_t)strtoul((char*)val_asc, NULL, 16);
6367 /* Value */
6368 *value = (uint8_t *)wmem_alloc0(scope, *tlvlen);
6369 for (i=0; i<*tlvlen; i++)
6371 memset(val_asc, 0, 4);
6372 tvb_memcpy(tvb, val_asc, off + ((i*2) + 4), 2);
6373 (*value)[i] = (uint8_t)strtoul((char*)val_asc, NULL, 16);
6377 static void
6378 dissect_docsis_cm_cap(packet_info *pinfo, proto_tree *v_tree, tvbuff_t *tvb, int voff, int len, bool opt125)
6380 uint8_t *asc_val;
6381 proto_item *ti;
6382 proto_tree *subtree;
6383 uint8_t tlv_type;
6384 uint8_t tlv_len;
6385 uint8_t val_byte = 0;
6386 uint16_t val_uint16 = 0;
6387 uint8_t *val_other = NULL;
6388 unsigned off = voff;
6390 asc_val = (uint8_t*)wmem_alloc0(pinfo->pool, 4);
6392 if (opt125)
6394 /* Option 125 is formatted as uint8's */
6395 /* Type */
6396 tlv_type = tvb_get_uint8(tvb, off);
6397 /* Length */
6398 tlv_len = tvb_get_uint8(tvb, off+1);
6399 proto_tree_add_uint(v_tree, hf_dhcp_docsis_cm_cap_len, tvb, off+1, 1, tlv_len);
6401 else
6403 /* Option 60 is formatted as an ASCII string.
6404 Since the capabilities are the same for both options
6405 I am converting the Option 60 values from ASCII to
6406 uint8s to allow the same parser to work for both */
6407 off += DOCSIS_CM_CAP_TLV_OFF;
6408 tvb_memcpy (tvb, asc_val, off, 2);
6409 tlv_len = (uint8_t)strtoul((char*)asc_val, NULL, 16);
6410 proto_tree_add_uint_format_value(v_tree, hf_dhcp_docsis_cm_cap_len, tvb, off+2, 2,
6411 tlv_len, "%d", tlv_len);
6414 off+=2;
6416 while (off - ((unsigned) voff) < ((unsigned) len))
6418 tlv_type = 0;
6419 tlv_len = 0;
6420 val_byte = 0;
6421 val_uint16 = 0;
6423 if (opt125)
6425 get_opt125_tlv(pinfo->pool, tvb, off, &tlv_type, &tlv_len, &val_other);
6426 ti = proto_tree_add_uint_format(v_tree, hf_dhcp_docsis_cm_cap_type, tvb, off,
6427 tlv_len + 2,
6428 tlv_type,
6429 "0x%02x: %s = ",
6430 tlv_type,
6431 val_to_str_const(tlv_type, docsis_cm_cap_type_vals, "unknown"));
6433 else
6435 /* Option 60 is formatted as an ASCII string. Since the capabilities
6436 are the same for both options I am converting the Option 60 values
6437 from ASCII to uint8s to allow the same parser to work for both */
6438 get_opt60_tlv(pinfo->pool, tvb, off, &tlv_type, &tlv_len, &val_other);
6439 ti = proto_tree_add_uint_format(v_tree, hf_dhcp_docsis_cm_cap_type, tvb, off,
6440 (tlv_len * 2) + 4,
6441 tlv_type,
6442 "0x%02x: %s = ",
6443 tlv_type,
6444 val_to_str_const(tlv_type, docsis_cm_cap_type_vals, "unknown"));
6447 if (tlv_len == 1)
6449 /* The value refers to a byte. */
6450 val_byte = val_other[0];
6452 else
6454 if (tlv_len == 2)
6456 /* The value refers to a uint16. */
6457 val_uint16 = (val_other[0] << 8) + val_other[1];
6461 switch (tlv_type)
6463 case DOCSIS_CM_CAP_CONCAT_SUP:
6464 case DOCSIS_CM_CAP_FRAG_SUP:
6465 case DOCSIS_CM_CAP_PHS_SUP:
6466 case DOCSIS_CM_CAP_IGMP_SUP:
6467 case DOCSIS_CM_CAP_DCC_SUP:
6468 case DOCSIS_CM_CAP_EXPUNI_SPACE:
6469 case DOCSIS_CM_CAP_DUTFILT_SUP:
6470 case DOCSIS_CM_CAP_SACM2_SUP:
6471 case DOCSIS_CM_CAP_SACM2HOP_SUP:
6472 case DOCSIS_CM_CAP_IPV6_SUP:
6473 proto_item_append_text(ti,
6474 "%s",
6475 val_to_str_const(val_byte, docsis_cm_cap_supported_vals, "Reserved"));
6476 break;
6477 case DOCSIS_CM_CAP_DOCSIS_VER:
6478 proto_item_append_text(ti,
6479 "%s",
6480 val_to_str_const(val_byte, docsis_cm_cap_version_vals, "Reserved"));
6481 break;
6482 case DOCSIS_CM_CAP_PRIV_SUP:
6483 proto_item_append_text(ti,
6484 "%s",
6485 val_to_str_const(val_byte, docsis_cm_cap_privacy_vals, "Reserved"));
6486 break;
6487 case DOCSIS_CM_CAP_FILT_SUP:
6488 proto_item_append_text(ti,
6489 "%s",
6490 val_to_str_const(val_byte, docsis_cm_cap_filt_vals, "Reserved"));
6491 break;
6492 case DOCSIS_CM_CAP_L2VPN_SUP:
6493 proto_item_append_text(ti,
6494 "%s",
6495 val_to_str_const(val_byte, docsis_cm_cap_l2vpn_vals, "Reserved"));
6496 break;
6497 case DOCSIS_CM_CAP_L2VPN_HOST_SUP:
6498 if (tlv_len == 7) {
6499 proto_item_append_text(ti,
6500 "eSAFE ifIndex %s (%i)/eSAFE MAC %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
6501 val_to_str_const(val_other[0], docsis_cm_cap_map_l2vpn_esafe_index_support_vals, "Reserved"),
6502 val_other[0],
6503 val_other[1],
6504 val_other[2],
6505 val_other[3],
6506 val_other[4],
6507 val_other[5],
6508 val_other[6]);
6509 } else {
6510 proto_item_append_text(ti,
6511 "Invalid (length should be 7, is %d)",
6512 tlv_len);
6514 break;
6515 case DOCSIS_CM_CAP_USFREQRNG_SUP:
6516 proto_item_append_text(ti,
6517 "%s",
6518 val_to_str_const(val_byte, docsis_cm_cap_usfreqrng_vals, "Reserved"));
6519 break;
6520 case DOCSIS_CM_CAP_MAPUCDRECEIPT_SUP:
6521 proto_item_append_text(ti,
6522 "%s",
6523 val_to_str_const(val_byte, docsis_cm_cap_map_ucd_receipt_vals, "Reserved"));
6524 break;
6525 case DOCSIS_CM_CAP_DPV_SUP:
6526 proto_item_append_text(ti,
6527 "%s",
6528 val_to_str_const(val_byte, docsis_cm_cap_map_dpv_support_vals, "Reserved"));
6529 break;
6530 case DOCSIS_CM_CAP_DSAID_SUP:
6531 case DOCSIS_CM_CAP_MULTTXCHAN_SUP:
6532 case DOCSIS_CM_CAP_512USTXCHAN_SUP:
6533 case DOCSIS_CM_CAP_256USTXCHAN_SUP:
6534 case DOCSIS_CM_CAP_TOTALSIDCLU_SUP:
6535 case DOCSIS_CM_CAP_MULTRXCHAN_SUP:
6536 case DOCSIS_CM_CAP_UGSPERUSFLOW_SUP:
6537 case DOCSIS_CM_CAP_USSF_SUP:
6538 display_uint_with_range_checking(ti, val_byte, val_uint16, 0, 255);
6539 break;
6540 case DOCSIS_CM_CAP_RESEQDSID_SUP:
6541 case DOCSIS_CM_CAP_MULTDSID_SUP:
6542 display_uint_with_range_checking(ti, val_byte, val_uint16, 16, 255);
6543 break;
6544 case DOCSIS_CM_CAP_SIDCLUPERSF_SUP:
6545 display_uint_with_range_checking(ti, val_byte, val_uint16, 2, 8);
6546 break;
6547 case DOCSIS_CM_CAP_TOTALDSID_SUP:
6548 display_uint_with_range_checking(ti, val_byte, val_uint16, 32, 255);
6549 break;
6550 case DOCSIS_CM_CAP_TET:
6551 display_uint_with_range_checking(ti, val_byte, val_uint16, 8, 64);
6552 break;
6553 case DOCSIS_CM_CAP_TET_MI:
6554 if ((val_byte == 1) ||
6555 (val_byte == 2) ||
6556 (val_byte == 4))
6558 proto_item_append_text(ti,
6559 " %i",
6560 val_byte);
6562 else
6564 proto_item_append_text(ti,
6565 " (Invalid Value %i : Should be [1,2,4]",
6566 val_byte);
6568 break;
6569 case DOCSIS_CM_CAP_IPFILT_SUP:
6570 case DOCSIS_CM_CAP_USDROPCLASSIF_SUP:
6571 display_uint_with_range_checking(ti, val_byte, val_uint16, 64, 65535);
6572 break;
6573 case DOCSIS_CM_CAP_LLCFILT_SUP:
6574 display_uint_with_range_checking(ti, val_byte, val_uint16, 10, 65535);
6575 break;
6576 case DOCSIS_CM_CAP_ExUsTrPow:
6577 if (val_byte == 0)
6579 proto_item_append_text(ti, "%i", val_byte);
6581 else
6583 display_uint_with_range_checking(ti, val_byte, val_uint16, 205, 244);
6585 break;
6586 case DOCSIS_CM_CAP_Opt802MPLSSup:
6587 proto_item_append_text(ti,
6588 "0x%02x", val_byte);
6589 case DOCSIS_CM_CAP_DounEnc:
6590 /* TODO: add D-ONU Capabilities Encoding according DPoE-SP-MULPIv1.0-I02-120607 */
6591 break;
6592 case DOCSIS_CM_CAP_EnrgMang:
6593 proto_item_append_text(ti,
6594 "%s",
6595 val_to_str_const(val_byte, docsis_cm_cap_enrgmang_vals, "Reserved"));
6596 break;
6597 case DOCSIS_CM_CAP_RNGHLDOFF_SUP:
6598 proto_item_append_text(ti,
6599 "Ranging ID ");
6600 if (tlv_len == 4)
6602 proto_item_append_text(ti,
6603 "(0x%04x)", (val_other[0] << sizeof(uint8_t)) + val_other[1]);
6604 proto_item_append_text(ti,
6605 " Component Bit Mask ");
6606 proto_item_append_text(ti,
6607 "(0x%04x)", (val_other[2] << sizeof(uint8_t)) + val_other[3]);
6609 else
6611 proto_item_append_text(ti,
6612 " (Invalid Length %u : Should be 4",
6613 tlv_len);
6615 break;
6616 case DOCSIS_CM_CAP_USSYMRATE_SUP:
6617 proto_item_append_text(ti,
6618 "0x%02x", val_byte);
6619 break;
6620 case DOCSIS_CM_CAP_FCTF_SUP:
6621 proto_item_append_text(ti,
6622 "%s",
6623 val_to_str_const(val_byte, docsis_cm_cap_map_fctfc_support_vals, "Reserved"));
6624 break;
6625 case DOCSIS_CM_CAP_MULTDSIDFW_SUP:
6626 proto_item_append_text(ti,
6627 "%s",
6628 val_to_str_const(val_byte, docsis_cm_cap_map_multDsidForward_support_vals, "Reserved"));
6629 break;
6632 subtree = proto_item_add_subtree(ti, ett_dhcp_option);
6633 if (tlv_type == DOCSIS_CM_CAP_RNGHLDOFF_SUP && tlv_len >= 4)
6635 static int * const flags[] = {
6636 &hf_dhcp_docsis_cm_cap_ranging_hold_off_cm,
6637 &hf_dhcp_docsis_cm_cap_ranging_hold_off_eps,
6638 &hf_dhcp_docsis_cm_cap_ranging_hold_off_emta,
6639 &hf_dhcp_docsis_cm_cap_ranging_hold_off_dsg,
6640 NULL
6642 val_uint16 = (val_other[2] << sizeof(uint8_t)) + val_other[3];
6644 proto_tree_add_bitmask_list_value(subtree, tvb, off + 2, 4, flags, val_uint16);
6646 if (tlv_type == DOCSIS_CM_CAP_USSYMRATE_SUP)
6648 static int * const flags[] = {
6649 &hf_dhcp_docsis_cm_cap_ussymrate_160,
6650 &hf_dhcp_docsis_cm_cap_ussymrate_320,
6651 &hf_dhcp_docsis_cm_cap_ussymrate_640,
6652 &hf_dhcp_docsis_cm_cap_ussymrate_1280,
6653 &hf_dhcp_docsis_cm_cap_ussymrate_2560,
6654 &hf_dhcp_docsis_cm_cap_ussymrate_5120,
6655 NULL
6658 proto_tree_add_bitmask_list_value(subtree, tvb, off + 2, 1, flags, val_byte);
6660 if (tlv_type == DOCSIS_CM_CAP_Opt802MPLSSup && tlv_len >= 4)
6662 static int * const flags[] = {
6663 &hf_dhcp_docsis_cm_cap_mpls_stpid,
6664 &hf_dhcp_docsis_cm_cap_mpls_svid,
6665 &hf_dhcp_docsis_cm_cap_mpls_spcp,
6666 &hf_dhcp_docsis_cm_cap_mpls_sdei,
6667 &hf_dhcp_docsis_cm_cap_mpls_ctpid,
6668 &hf_dhcp_docsis_cm_cap_mpls_cvid,
6669 &hf_dhcp_docsis_cm_cap_mpls_cpcp,
6670 &hf_dhcp_docsis_cm_cap_mpls_ccfi,
6671 &hf_dhcp_docsis_cm_cap_mpls_stci,
6672 &hf_dhcp_docsis_cm_cap_mpls_ctci,
6673 &hf_dhcp_docsis_cm_cap_mpls_itpid,
6674 &hf_dhcp_docsis_cm_cap_mpls_isid,
6675 &hf_dhcp_docsis_cm_cap_mpls_itci,
6676 &hf_dhcp_docsis_cm_cap_mpls_ipcp,
6677 &hf_dhcp_docsis_cm_cap_mpls_idei,
6678 &hf_dhcp_docsis_cm_cap_mpls_iuca,
6679 &hf_dhcp_docsis_cm_cap_mpls_btpid,
6680 &hf_dhcp_docsis_cm_cap_mpls_btci,
6681 &hf_dhcp_docsis_cm_cap_mpls_bpcp,
6682 &hf_dhcp_docsis_cm_cap_mpls_bdei,
6683 &hf_dhcp_docsis_cm_cap_mpls_bvid,
6684 &hf_dhcp_docsis_cm_cap_mpls_bda,
6685 &hf_dhcp_docsis_cm_cap_mpls_bsa,
6686 &hf_dhcp_docsis_cm_cap_mpls_tc,
6687 &hf_dhcp_docsis_cm_cap_mpls_label,
6688 NULL
6690 val_uint16 = (val_other[2] << sizeof(uint8_t)) + val_other[3];
6692 proto_tree_add_bitmask_list_value(subtree, tvb, off + 2, 4, flags, val_uint16);
6694 if (opt125)
6696 off += (tlv_len) + 2;
6698 else
6700 off += (tlv_len *2) + 4;
6706 static bool
6707 dissect_packetcable_cm_vendor_id_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ )
6709 uint8_t* vendor_id;
6711 if (tvb_reported_length(tvb) < 10) {
6712 return false;
6715 vendor_id = tvb_get_string_enc(pinfo->pool, tvb, 0, 10, ENC_ASCII|ENC_NA);
6716 if ((strcmp((const char*)vendor_id, PACKETCABLE_CM_CAP11) == 0) ||
6717 (strcmp((const char*)vendor_id, PACKETCABLE_CM_CAP20) == 0)) {
6718 dissect_docsis_cm_cap(pinfo, tree, tvb, 0, tvb_reported_length(tvb), false);
6719 return true;
6722 if ((strcmp((const char*)vendor_id, PACKETCABLE_CM_CAP30) == 0)) {
6723 proto_tree_add_item(tree, hf_dhcp_option_vendor_class_data, tvb, 0, tvb_reported_length(tvb), ENC_ASCII);
6724 return true;
6727 return false;
6730 static bool
6731 dissect_apple_bsdp_vendor_id_heur(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_)
6734 int vendor_id_len = (int)strlen(APPLE_BSDP_CLIENT);
6735 if ((int)tvb_reported_length(tvb) < vendor_id_len) {
6736 return false;
6739 if (tvb_memeql(tvb, 0, (const uint8_t*)APPLE_BSDP_CLIENT, vendor_id_len) == 0) {
6740 proto_tree_add_item(tree, hf_dhcp_option_vendor_class_data, tvb, vendor_id_len, tvb_reported_length_remaining(tvb, vendor_id_len), ENC_ASCII);
6741 return true;
6744 return false;
6748 /* Definitions specific to PKT-SP-PROV-I05-021127 begin with "PKT_CCC_I05".
6749 Definitions specific to IETF draft 5 and RFC 3495 begin with "PKT_CCC_IETF".
6750 Shared definitions begin with "PKT_CCC".
6752 #define PKT_CCC_PRI_DHCP 1
6753 #define PKT_CCC_SEC_DHCP 2
6754 #define PKT_CCC_I05_SNMP 3
6755 #define PKT_CCC_IETF_PROV_SRV 3
6756 #define PKT_CCC_I05_PRI_DNS 4
6757 #define PKT_CCC_IETF_AS_KRB 4
6758 #define PKT_CCC_I05_SEC_DNS 5
6759 #define PKT_CCC_IETF_AP_KRB 5
6760 #define PKT_CCC_KRB_REALM 6
6761 #define PKT_CCC_TGT_FLAG 7
6762 #define PKT_CCC_PROV_TIMER 8
6763 #define PKT_CCC_CMS_FQDN 9
6764 #define PKT_CCC_IETF_SEC_TKT 9
6765 #define PKT_CCC_AS_KRB 10
6766 #define PKT_CCC_AP_KRB 11
6767 #define PKT_CCC_MTA_KRB_CLEAR 12
6769 static const value_string pkt_i05_ccc_opt_vals[] = {
6770 { PKT_CCC_PRI_DHCP, "Primary DHCP Server" },
6771 { PKT_CCC_SEC_DHCP, "Secondary DHCP Server" },
6772 { PKT_CCC_I05_SNMP, "SNMP Entity" },
6773 { PKT_CCC_I05_PRI_DNS, "Primary DNS Server" },
6774 { PKT_CCC_I05_SEC_DNS, "Secondary DNS Server" },
6775 { PKT_CCC_KRB_REALM, "Kerberos Realm" },
6776 { PKT_CCC_TGT_FLAG, "MTA should fetch TGT?" },
6777 { PKT_CCC_PROV_TIMER, "Provisioning Timer" },
6778 { PKT_CCC_CMS_FQDN, "CMS FQDN" },
6779 { PKT_CCC_AS_KRB, "AS-REQ/AS-REP Backoff and Retry" },
6780 { PKT_CCC_AP_KRB, "AP-REQ/AP-REP Backoff and Retry" },
6781 { PKT_CCC_MTA_KRB_CLEAR, "MTA should clear Kerberos tickets?" },
6782 { 0, NULL },
6785 static const value_string pkt_draft5_ccc_opt_vals[] = {
6786 { PKT_CCC_PRI_DHCP, "TSP's Primary DHCP Server" },
6787 { PKT_CCC_SEC_DHCP, "TSP's Secondary DHCP Server" },
6788 { PKT_CCC_IETF_PROV_SRV, "TSP's Provisioning Server" },
6789 { PKT_CCC_IETF_AS_KRB, "TSP's AS-REQ/AS-REP Backoff and Retry" },
6790 { PKT_CCC_IETF_AP_KRB, "TSP's AP-REQ/AP-REP Backoff and Retry" },
6791 { PKT_CCC_KRB_REALM, "TSP's Kerberos Realm Name" },
6792 { PKT_CCC_TGT_FLAG, "TSP's Ticket Granting Server Utilization" },
6793 { PKT_CCC_PROV_TIMER, "TSP's Provisioning Timer Value" },
6794 { PKT_CCC_IETF_SEC_TKT, "PacketCable Security Ticket Control" },
6795 { 0, NULL },
6798 static const value_string pkt_i05_ccc_ticket_ctl_vals[] = {
6799 { 1, "Invalidate Provisioning Application Server's ticket" },
6800 { 2, "Invalidate all CMS Application Server tickets" },
6801 { 3, "Invalidate all Application Server tickets" },
6802 { 0, NULL },
6805 static int
6806 dissect_packetcable_i05_ccc(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
6807 tvbuff_t *tvb, int optoff, int optend)
6809 int suboptoff = optoff;
6810 uint8_t subopt, subopt_len, fetch_tgt, timer_val, ticket_ctl;
6811 proto_tree *pkt_s_tree;
6812 proto_item *vti;
6814 subopt = tvb_get_uint8(tvb, optoff);
6815 suboptoff++;
6817 if (suboptoff >= optend) {
6818 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
6819 "Suboption %d: no room left in option for suboption length", subopt);
6820 return (optend);
6823 subopt_len = tvb_get_uint8(tvb, optoff);
6824 suboptoff++;
6826 vti = proto_tree_add_uint(v_tree, hf_dhcp_pc_i05_ccc_suboption, tvb, optoff, 1, subopt);
6827 proto_item_set_len(vti, subopt_len + 2);
6828 proto_item_append_text(vti, ": ");
6830 switch (subopt) {
6832 case PKT_CCC_PRI_DHCP: /* String values */
6833 case PKT_CCC_SEC_DHCP:
6834 case PKT_CCC_I05_SNMP:
6835 case PKT_CCC_I05_PRI_DNS:
6836 case PKT_CCC_I05_SEC_DNS:
6837 case PKT_CCC_KRB_REALM:
6838 case PKT_CCC_CMS_FQDN:
6839 proto_item_append_text(vti, "%s (%u byte%s)",
6840 tvb_format_stringzpad(pinfo->pool, tvb, suboptoff, subopt_len),
6841 subopt_len,
6842 plurality(subopt_len, "", "s") );
6843 suboptoff += subopt_len;
6844 break;
6846 case PKT_CCC_TGT_FLAG:
6847 if (suboptoff+1 > optend) {
6848 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6849 return (optend);
6851 fetch_tgt = tvb_get_uint8(tvb, suboptoff);
6852 proto_item_append_text(vti, "%s (%u byte%s%s)",
6853 fetch_tgt ? "Yes" : "No",
6854 subopt_len,
6855 plurality(subopt_len, "", "s"),
6856 subopt_len != 1 ? " [Invalid]" : "");
6857 suboptoff += subopt_len;
6858 break;
6860 case PKT_CCC_PROV_TIMER:
6861 if (suboptoff+1 > optend) {
6862 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6863 return (optend);
6865 timer_val = tvb_get_uint8(tvb, suboptoff);
6866 proto_item_append_text(vti, "%u%s (%u byte%s%s)", timer_val,
6867 timer_val > 30 ? " [Invalid]" : "",
6868 subopt_len,
6869 plurality(subopt_len, "", "s"),
6870 subopt_len != 1 ? " [Invalid]" : "");
6871 suboptoff += subopt_len;
6872 break;
6874 case PKT_CCC_AS_KRB:
6875 if (suboptoff+12 > optend) {
6876 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6877 return (optend);
6879 proto_item_append_text(vti, "(%u byte%s%s)", subopt_len,
6880 plurality(subopt_len, "", "s"),
6881 subopt_len != 12 ? " [Invalid]" : "");
6882 if (subopt_len == 12) {
6883 pkt_s_tree = proto_item_add_subtree(vti, ett_dhcp_option);
6884 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_nom_timeout, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
6885 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_timeout, tvb, suboptoff + 4, 4, ENC_BIG_ENDIAN);
6886 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_retries, tvb, suboptoff + 8, 4, ENC_BIG_ENDIAN);
6888 suboptoff += subopt_len;
6889 break;
6891 case PKT_CCC_AP_KRB:
6892 if (suboptoff+12 > optend) {
6893 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6894 return (optend);
6896 proto_item_append_text(vti, "(%u byte%s%s)", subopt_len,
6897 plurality(subopt_len, "", "s"),
6898 subopt_len != 12 ? " [Invalid]" : "");
6899 if (subopt_len == 12) {
6900 pkt_s_tree = proto_item_add_subtree(vti, ett_dhcp_option);
6901 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_nom_timeout, tvb, suboptoff + 8, 4, ENC_BIG_ENDIAN);
6902 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_timeout, tvb, suboptoff + 8, 4, ENC_BIG_ENDIAN);
6903 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_retries, tvb, suboptoff + 8, 4, ENC_BIG_ENDIAN);
6905 suboptoff += subopt_len;
6906 break;
6908 case PKT_CCC_MTA_KRB_CLEAR:
6909 if (suboptoff+1 > optend) {
6910 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6911 return (optend);
6913 ticket_ctl = tvb_get_uint8(tvb, suboptoff);
6914 proto_item_append_text(vti, "%s (%u) (%u byte%s%s)",
6915 val_to_str_const (ticket_ctl, pkt_i05_ccc_ticket_ctl_vals, "unknown/invalid"),
6916 ticket_ctl,
6917 subopt_len,
6918 plurality(subopt_len, "", "s"),
6919 subopt_len != 1 ? " [Invalid]" : "");
6920 suboptoff += subopt_len;
6921 break;
6923 default:
6924 suboptoff += subopt_len;
6925 break;
6928 return suboptoff;
6931 static int hf_dhcp_ccc_ietf_sec_tkt_pc_provision_server;
6932 static int hf_dhcp_ccc_ietf_sec_tkt_all_pc_call_management;
6934 static int
6935 dissect_packetcable_ietf_ccc(packet_info *pinfo, proto_item *v_ti, proto_tree *v_tree,
6936 tvbuff_t *tvb, int optoff, int optend, int revision)
6938 int suboptoff = optoff;
6939 uint8_t subopt, subopt_len;
6940 uint8_t prov_type, fetch_tgt, timer_val;
6941 uint16_t sec_tcm;
6942 proto_tree *pkt_s_tree;
6943 proto_item *vti;
6944 int max_timer_val = 255;
6945 const unsigned char *dns_name;
6946 int dns_name_len;
6948 subopt = tvb_get_uint8(tvb, suboptoff);
6949 suboptoff++;
6951 if (suboptoff >= optend) {
6952 expert_add_info_format(pinfo, v_ti, &ei_dhcp_missing_subopt_length,
6953 "Suboption %d: no room left in option for suboption length", subopt);
6954 return (optend);
6956 subopt_len = tvb_get_uint8(tvb, suboptoff);
6957 suboptoff++;
6959 vti = proto_tree_add_uint(v_tree, hf_dhcp_pc_ietf_ccc_suboption, tvb, optoff, 1, subopt);
6960 proto_item_set_len(vti, subopt_len + 2);
6961 proto_item_append_text(vti, ": ");
6963 switch (subopt) {
6965 case PKT_CCC_PRI_DHCP: /* IPv4 values */
6966 case PKT_CCC_SEC_DHCP:
6967 if (suboptoff+4 > optend) {
6968 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6969 return (optend);
6971 proto_item_append_text(vti, "%s (%u byte%s%s)",
6972 tvb_ip_to_str(pinfo->pool, tvb, suboptoff),
6973 subopt_len,
6974 plurality(subopt_len, "", "s"),
6975 subopt_len != 4 ? " [Invalid]" : "");
6976 suboptoff += subopt_len;
6977 break;
6979 case PKT_CCC_IETF_PROV_SRV:
6980 if (suboptoff+1 > optend) {
6981 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6982 return (optend);
6984 prov_type = tvb_get_uint8(tvb, suboptoff);
6985 suboptoff += 1;
6986 switch (prov_type) {
6988 case 0:
6989 get_dns_name(tvb, suboptoff, subopt_len, suboptoff, (const char **)&dns_name, &dns_name_len);
6990 proto_item_append_text(vti, "%s (%u byte%s)", format_text(pinfo->pool, dns_name, dns_name_len),
6991 subopt_len - 1, plurality(subopt_len, "", "s") );
6992 break;
6994 case 1:
6995 if (suboptoff+4 > optend) {
6996 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
6997 return (optend);
6999 proto_item_append_text(vti, "%s (%u byte%s%s)",
7000 tvb_ip_to_str(pinfo->pool, tvb, suboptoff),
7001 subopt_len,
7002 plurality(subopt_len, "", "s"),
7003 subopt_len != 5 ? " [Invalid]" : "");
7004 break;
7006 default:
7007 proto_item_append_text(vti, "Invalid type: %u (%u byte%s)",
7008 prov_type,
7009 subopt_len,
7010 plurality(subopt_len, "", "s") );
7011 break;
7013 suboptoff += subopt_len - 1;
7014 break;
7016 case PKT_CCC_IETF_AS_KRB:
7017 if (suboptoff+12 > optend) {
7018 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
7019 return (optend);
7021 proto_item_append_text(vti, "(%u byte%s%s)", subopt_len,
7022 plurality(subopt_len, "", "s"),
7023 subopt_len != 12 ? " [Invalid]" : "");
7024 if (subopt_len == 12) {
7025 pkt_s_tree = proto_item_add_subtree(vti, ett_dhcp_option);
7026 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_nom_timeout, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
7027 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_timeout, tvb, suboptoff + 4, 4, ENC_BIG_ENDIAN);
7028 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_retries, tvb, suboptoff + 8, 4, ENC_BIG_ENDIAN);
7030 suboptoff += subopt_len;
7031 break;
7033 case PKT_CCC_IETF_AP_KRB:
7034 proto_item_append_text(vti, "(%u byte%s%s)", subopt_len,
7035 plurality(subopt_len, "", "s"),
7036 subopt_len != 12 ? " [Invalid]" : "");
7037 if (subopt_len == 12) {
7038 pkt_s_tree = proto_item_add_subtree(vti, ett_dhcp_option);
7039 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_nom_timeout, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
7040 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_timeout, tvb, suboptoff + 4, 4, ENC_BIG_ENDIAN);
7041 proto_tree_add_item(pkt_s_tree, hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_retries, tvb, suboptoff + 8, 4, ENC_BIG_ENDIAN);
7043 suboptoff += subopt_len;
7044 break;
7046 case PKT_CCC_KRB_REALM: /* String values */
7047 get_dns_name(tvb, suboptoff, subopt_len, suboptoff, (const char **)&dns_name, &dns_name_len);
7048 proto_item_append_text(vti, "%s (%u byte%s)", format_text(pinfo->pool, dns_name, dns_name_len),
7049 subopt_len, plurality(subopt_len, "", "s") );
7050 suboptoff += subopt_len;
7051 break;
7053 case PKT_CCC_TGT_FLAG:
7054 if (suboptoff+1 > optend) {
7055 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
7056 return (optend);
7058 fetch_tgt = tvb_get_uint8(tvb, suboptoff);
7059 proto_item_append_text(vti, "%s (%u byte%s%s)",
7060 fetch_tgt ? "Yes" : "No",
7061 subopt_len,
7062 plurality(subopt_len, "", "s"),
7063 subopt_len != 1 ? " [Invalid]" : "");
7064 suboptoff += 1;
7065 break;
7067 case PKT_CCC_PROV_TIMER:
7068 if (suboptoff+1 > optend) {
7069 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
7070 return (optend);
7072 if (revision == PACKETCABLE_CCC_DRAFT5)
7073 max_timer_val = 30;
7074 timer_val = tvb_get_uint8(tvb, suboptoff);
7075 proto_item_append_text(vti, "%u%s (%u byte%s%s)", timer_val,
7076 timer_val > max_timer_val ? " [Invalid]" : "",
7077 subopt_len,
7078 plurality(subopt_len, "", "s"),
7079 subopt_len != 1 ? " [Invalid]" : "");
7080 suboptoff += 1;
7081 break;
7083 case PKT_CCC_IETF_SEC_TKT:
7084 if (suboptoff+2 > optend) {
7085 expert_add_info(pinfo, vti, &ei_dhcp_missing_subopt_value);
7086 return (optend);
7088 sec_tcm = tvb_get_ntohs(tvb, suboptoff);
7089 proto_item_append_text(vti, "0x%04x (%u byte%s%s)", sec_tcm, subopt_len,
7090 plurality(subopt_len, "", "s"),
7091 subopt_len != 2 ? " [Invalid]" : "");
7092 if (subopt_len == 2) {
7093 pkt_s_tree = proto_item_add_subtree(vti, ett_dhcp_option);
7094 proto_tree_add_boolean(pkt_s_tree, hf_dhcp_ccc_ietf_sec_tkt_pc_provision_server, tvb, suboptoff, 2, sec_tcm);
7095 proto_tree_add_boolean(pkt_s_tree, hf_dhcp_ccc_ietf_sec_tkt_all_pc_call_management, tvb, suboptoff, 2, sec_tcm);
7097 suboptoff += subopt_len;
7098 break;
7100 default:
7101 suboptoff += subopt_len;
7102 break;
7104 return suboptoff;
7107 static int
7108 dissect_dhcpopt_packetcable_ccc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
7110 int offset = 0;
7112 while (tvb_reported_length_remaining(tvb, offset) > 0) {
7113 switch (pkt_ccc_protocol_version) {
7115 case PACKETCABLE_CCC_I05:
7116 offset = dissect_packetcable_i05_ccc(pinfo, tree, tree, tvb, offset, tvb_reported_length(tvb));
7117 break;
7118 case PACKETCABLE_CCC_DRAFT5:
7119 case PACKETCABLE_CCC_RFC_3495:
7120 offset = dissect_packetcable_ietf_ccc(pinfo, tree, tree, tvb, offset, tvb_reported_length(tvb), pkt_ccc_protocol_version);
7121 break;
7122 default: /* XXX Should we do something here? */
7123 break;
7127 return tvb_captured_length(tvb);
7130 #define BOOTREQUEST 1
7131 #define BOOTREPLY 2
7133 static const value_string op_vals[] = {
7134 { BOOTREQUEST, "Boot Request" },
7135 { BOOTREPLY, "Boot Reply" },
7136 { 0, NULL }
7139 static int
7140 dissect_dhcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
7142 proto_tree *bp_tree;
7143 proto_item *bp_ti, *ti;
7144 proto_item *file_ti, *sname_ti;
7145 proto_item *fi, *hidden_item;
7146 uint8_t op;
7147 uint8_t htype, hlen;
7148 int voff, eoff; /* vendor offset, end offset */
7149 int tmpvoff, tmpvoff_end;
7150 uint32_t ip_addr;
7151 bool at_end;
7152 bool isProxyDhcp;
7153 const char *dhcp_type = NULL;
7154 const uint8_t *vendor_class_id = NULL;
7155 uint16_t flags, secs;
7156 int offset_delta;
7157 uint8_t overload = 0; /* DHCP option overload */
7158 static int * const dhcp_flags[] = {
7159 &hf_dhcp_flags_broadcast,
7160 &hf_dhcp_flags_reserved,
7161 NULL
7164 if (pinfo->srcport == PROXYDHCP_UDP_PORT ||
7165 pinfo->destport == PROXYDHCP_UDP_PORT) {
7166 /* The "DHCP magic" is mandatory for proxyDHCP. Use it as a heuristic. */
7167 if (!tvb_bytes_exist(tvb, VENDOR_INFO_OFFSET, 4) ||
7168 tvb_get_ntohl(tvb, VENDOR_INFO_OFFSET) != 0x63825363) {
7169 /* Not a DHCP packet at all. */
7170 return 0;
7172 isProxyDhcp = true;
7173 } else {
7174 isProxyDhcp = false;
7177 col_set_str(pinfo->cinfo, COL_PROTOCOL, "BOOTP");
7179 * In case we throw an exception fetching the opcode, etc.
7181 col_clear(pinfo->cinfo, COL_INFO);
7183 op = tvb_get_uint8(tvb, 0);
7184 htype = tvb_get_uint8(tvb, 1);
7185 hlen = tvb_get_uint8(tvb, 2);
7186 switch (op) {
7188 case BOOTREQUEST:
7189 if ((htype == ARPHRD_ETHER || htype == ARPHRD_IEEE802)
7190 && hlen == 6) {
7191 col_add_fstr(pinfo->cinfo, COL_INFO, "Boot Request from %s (%s)",
7192 tvb_arphrdaddr_to_str(pinfo->pool, tvb, 28, hlen, htype),
7193 tvb_get_ether_name(tvb, 28));
7195 else {
7196 col_add_fstr(pinfo->cinfo, COL_INFO, "Boot Request from %s",
7197 tvb_arphrdaddr_to_str(pinfo->pool, tvb, 28, hlen, htype));
7199 break;
7201 case BOOTREPLY:
7202 col_set_str(pinfo->cinfo, COL_INFO, "Boot Reply");
7203 break;
7205 default:
7206 col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown BOOTP message type (%u)", op);
7207 break;
7210 voff = VENDOR_INFO_OFFSET;
7212 /* rfc2132 says it SHOULD exist, not that it MUST exist */
7213 if (tvb_bytes_exist(tvb, voff, 4) &&
7214 (tvb_get_ntohl(tvb, voff) == 0x63825363)) {
7215 voff += 4;
7216 } else {
7217 voff += 64;
7219 eoff = tvb_reported_length(tvb);
7221 bp_ti = proto_tree_add_item(tree, proto_dhcp, tvb, 0, -1, ENC_NA);
7222 bp_tree = proto_item_add_subtree(bp_ti, ett_dhcp);
7224 wmem_map_t *rfc3396_map = wmem_map_new(pinfo->pool, g_direct_hash, g_direct_equal);
7226 * In the first pass, we just look for the overload, DHCP message type
7227 * and Vendor class identifier options, and any repeated options for
7228 * RFC 3396 long option concatenation.
7230 tmpvoff = voff;
7231 at_end = false;
7232 while (tmpvoff < eoff && !at_end) {
7233 offset_delta = dhcp_option(tvb, pinfo, NULL, tmpvoff, eoff, true, &at_end,
7234 &dhcp_type, &vendor_class_id, &overload, rfc3396_map);
7235 if (offset_delta <= 0) {
7236 proto_tree_add_expert(bp_tree, pinfo, &ei_dhcp_option_parse_err,
7237 tvb, tmpvoff, eoff);
7238 return tmpvoff;
7240 tmpvoff += offset_delta;
7244 * If there was a DHCP message type option, flag this packet
7245 * as DHCP.
7247 if (dhcp_type != NULL) {
7249 * Yes, this is a DHCP packet, and "dhcp_type" is the
7250 * packet type.
7252 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DHCP");
7254 col_add_fstr(pinfo->cinfo, COL_INFO, "%sDHCP %-8s - Transaction ID 0x%x",
7255 isProxyDhcp ? "proxy" : "", dhcp_type, tvb_get_ntohl(tvb, 4));
7256 tap_queue_packet( dhcp_bootp_tap, pinfo, dhcp_type);
7260 * OK, now populate the protocol tree.
7263 proto_tree_add_uint(bp_tree, hf_dhcp_type, tvb,
7264 0, 1,
7265 op);
7266 proto_tree_add_item(bp_tree, hf_dhcp_hw_type, tvb,
7267 1, 1, ENC_BIG_ENDIAN);
7268 proto_tree_add_uint(bp_tree, hf_dhcp_hw_len, tvb,
7269 2, 1, hlen);
7270 proto_tree_add_item(bp_tree, hf_dhcp_hops, tvb,
7271 3, 1, ENC_BIG_ENDIAN);
7272 proto_tree_add_item(bp_tree, hf_dhcp_id, tvb,
7273 4, 4, ENC_BIG_ENDIAN);
7275 * Windows (98, XP and Vista tested) sends the "secs" value on
7276 * the wire formatted as little-endian. See if the LE value
7277 * makes sense, if autodetect is used.
7279 if (dhcp_secs_endian == DHCP_SECS_ENDIAN_AUTODETECT) {
7280 secs = tvb_get_letohs(tvb, 8);
7281 if (secs > 0 && secs <= 0xff) {
7282 ti = proto_tree_add_uint(bp_tree, hf_dhcp_secs, tvb, 8, 2, secs);
7283 expert_add_info_format(pinfo, ti, &ei_dhcp_secs_le, "Seconds elapsed appears to be encoded as little-endian");
7284 } else {
7285 proto_tree_add_item(bp_tree, hf_dhcp_secs, tvb,
7286 8, 2, ENC_BIG_ENDIAN);
7289 else {
7290 /* Use whatever endianness is configured */
7291 proto_tree_add_item(bp_tree, hf_dhcp_secs, tvb, 8, 2, dhcp_secs_endian);
7293 flags = tvb_get_ntohs(tvb, 10);
7294 fi = proto_tree_add_bitmask(bp_tree, tvb, 10, hf_dhcp_flags,
7295 ett_dhcp_flags, dhcp_flags, ENC_NA);
7296 proto_item_append_text(fi, " (%s)",
7297 (flags & BOOTP_BC) ? "Broadcast" : "Unicast");
7299 proto_tree_add_item(bp_tree, hf_dhcp_ip_client, tvb,
7300 12, 4, ENC_BIG_ENDIAN);
7301 proto_tree_add_item(bp_tree, hf_dhcp_ip_your, tvb,
7302 16, 4, ENC_BIG_ENDIAN);
7303 proto_tree_add_item(bp_tree, hf_dhcp_ip_server, tvb,
7304 20, 4, ENC_BIG_ENDIAN);
7305 proto_tree_add_item(bp_tree, hf_dhcp_ip_relay, tvb,
7306 24, 4, ENC_BIG_ENDIAN);
7308 if (hlen > 0 && hlen <= 16) {
7309 if ((htype == ARPHRD_ETHER || htype == ARPHRD_IEEE802)
7310 && hlen == 6)
7311 proto_tree_add_item(bp_tree, hf_dhcp_hw_ether_addr, tvb, 28, 6, ENC_NA);
7312 else
7313 /* The chaddr element is 16 bytes in length,
7314 although only the first hlen bytes are used */
7315 proto_tree_add_bytes_format_value(bp_tree, hf_dhcp_hw_addr, tvb, 28, 16,
7316 NULL, "%s", tvb_arphrdaddr_to_str(pinfo->pool, tvb, 28, hlen, htype));
7317 if ((16 - hlen) > 0)
7318 proto_tree_add_item(bp_tree, hf_dhcp_hw_addr_padding, tvb, 28+hlen, 16-hlen, ENC_NA);
7319 } else {
7320 proto_tree_add_expert(bp_tree, pinfo, &ei_dhcp_client_address_not_given, tvb, 28, 16);
7323 /* RFC 3396 5: "The aggregate option buffer is made up of the optional
7324 * parameters field, the file field, and the sname field, in that order.
7325 * WARNING: This is not the physical ordering of these fields in the
7326 * DHCP packet."
7328 * RFC 3396 6: "[I]f an option were split into three parts and each
7329 * part went into one of the possible option fields, the first part
7330 * would go into the optional parameters field, the second part would
7331 * go into the file field, and the third part would go into the sname
7332 * field."
7334 * So we process and reassemble the options in the order listed above,
7335 * and move the items after processing so that they are generally in
7336 * physical ordering in the tree. (Whichever ordering choice we make
7337 * is bound to confused someone.)
7340 if (overload & OPT_OVERLOAD_FILE) {
7341 file_ti = proto_tree_add_expert(bp_tree, pinfo, &ei_dhcp_boot_filename_overloaded_by_dhcp, tvb,
7342 FILE_NAME_OFFSET, FILE_NAME_LEN);
7343 tmpvoff = FILE_NAME_OFFSET;
7344 tmpvoff_end = FILE_NAME_OFFSET + FILE_NAME_LEN;
7345 at_end = false;
7346 while (tmpvoff < tmpvoff_end && !at_end) {
7347 tmpvoff += dhcp_option(tvb, pinfo, NULL, tmpvoff,
7348 tmpvoff_end, true, &at_end,
7349 &dhcp_type, &vendor_class_id,
7350 NULL, rfc3396_map);
7352 } else {
7353 /* Boot file is optional */
7354 if (tvb_get_uint8(tvb, FILE_NAME_OFFSET) != '\0') {
7355 file_ti = proto_tree_add_item(bp_tree, hf_dhcp_file, tvb,
7356 FILE_NAME_OFFSET,
7357 FILE_NAME_LEN, ENC_ASCII);
7358 } else {
7359 file_ti = proto_tree_add_string_format(bp_tree, hf_dhcp_file, tvb,
7360 FILE_NAME_OFFSET,
7361 FILE_NAME_LEN,
7362 "", "Boot file name not given");
7367 if (overload & OPT_OVERLOAD_SNAME) {
7368 sname_ti = proto_tree_add_expert(bp_tree, pinfo, &ei_dhcp_server_name_overloaded_by_dhcp, tvb,
7369 SERVER_NAME_OFFSET, SERVER_NAME_LEN);
7370 tmpvoff = SERVER_NAME_OFFSET;
7371 tmpvoff_end = SERVER_NAME_OFFSET + SERVER_NAME_LEN;
7372 at_end = false;
7373 while (tmpvoff < tmpvoff_end && !at_end) {
7374 tmpvoff += dhcp_option(tvb, pinfo, NULL, tmpvoff,
7375 tmpvoff_end, true, &at_end,
7376 &dhcp_type, &vendor_class_id,
7377 NULL, rfc3396_map);
7379 } else {
7380 /* The server host name is optional */
7381 if (tvb_get_uint8(tvb, SERVER_NAME_OFFSET) != '\0') {
7382 sname_ti = proto_tree_add_item(bp_tree, hf_dhcp_server, tvb,
7383 SERVER_NAME_OFFSET,
7384 SERVER_NAME_LEN, ENC_ASCII);
7386 } else {
7387 sname_ti = proto_tree_add_string_format(bp_tree, hf_dhcp_server, tvb,
7388 SERVER_NAME_OFFSET,
7389 SERVER_NAME_LEN,
7390 "", "Server host name not given");
7394 proto_tree_move_item(bp_tree, sname_ti, file_ti);
7396 voff = VENDOR_INFO_OFFSET;
7397 if (dhcp_type == NULL) {
7398 hidden_item = proto_tree_add_boolean(bp_tree, hf_dhcp_bootp, tvb, 0, 0, 1);
7399 proto_item_set_hidden(hidden_item);
7401 if (tvb_bytes_exist(tvb, voff, 4) &&
7402 (tvb_get_ntohl(tvb, voff) == 0x63825363)) {
7403 ip_addr = tvb_get_ipv4(tvb, voff);
7404 proto_tree_add_ipv4_format_value(bp_tree, hf_dhcp_cookie, tvb,
7405 voff, 4, ip_addr, "DHCP");
7406 voff += 4;
7407 } else {
7408 proto_tree_add_item(bp_tree, hf_dhcp_vendor_specific_options, tvb,
7409 voff, 64, ENC_NA);
7410 voff += 64;
7413 at_end = false;
7414 while (voff < eoff && !at_end) {
7415 offset_delta = dhcp_option(tvb, pinfo, bp_tree, voff, eoff, false, &at_end,
7416 &dhcp_type, &vendor_class_id, &overload, rfc3396_map);
7417 if (offset_delta <= 0) {
7418 proto_tree_add_expert(bp_tree, pinfo, &ei_dhcp_option_parse_err,
7419 tvb, voff, eoff);
7420 return voff;
7422 voff += offset_delta;
7424 if ((dhcp_type != NULL) && (!at_end))
7426 expert_add_info(pinfo, bp_ti, &ei_dhcp_end_option_missing);
7429 if (overload & OPT_OVERLOAD_FILE) {
7430 proto_item *oti;
7431 proto_tree *overload_tree = proto_tree_add_subtree(bp_tree, tvb,
7432 FILE_NAME_OFFSET, FILE_NAME_LEN, ett_dhcp_filename_option, &oti,
7433 "Boot file name option overload");
7434 tmpvoff = FILE_NAME_OFFSET;
7435 tmpvoff_end = FILE_NAME_OFFSET + FILE_NAME_LEN;
7436 at_end = false;
7437 while (tmpvoff < tmpvoff_end && !at_end) {
7438 tmpvoff += dhcp_option(tvb, pinfo, overload_tree, tmpvoff,
7439 tmpvoff_end, false, &at_end,
7440 &dhcp_type, &vendor_class_id,
7441 NULL, rfc3396_map);
7443 if (!at_end)
7445 expert_add_info(pinfo, oti, &ei_dhcp_opt_overload_file_end_missing);
7447 proto_tree_move_item(bp_tree, file_ti, oti);
7449 if (overload & OPT_OVERLOAD_SNAME) {
7450 proto_item *oti;
7451 proto_tree *overload_tree = proto_tree_add_subtree(bp_tree, tvb,
7452 SERVER_NAME_OFFSET, SERVER_NAME_LEN, ett_dhcp_server_hostname, &oti,
7453 "Server host name option overload");
7454 tmpvoff = SERVER_NAME_OFFSET;
7455 tmpvoff_end = SERVER_NAME_OFFSET + SERVER_NAME_LEN;
7456 at_end = false;
7457 while (tmpvoff < tmpvoff_end && !at_end) {
7458 tmpvoff += dhcp_option(tvb, pinfo, overload_tree, tmpvoff,
7459 tmpvoff_end, false, &at_end,
7460 &dhcp_type, &vendor_class_id,
7461 NULL, rfc3396_map);
7463 if (!at_end)
7465 expert_add_info(pinfo, oti, &ei_dhcp_opt_overload_sname_end_missing);
7467 proto_tree_move_item(bp_tree, sname_ti, oti);
7470 if (voff < eoff) {
7472 * Padding after the end option.
7474 proto_tree_add_item(bp_tree, hf_dhcp_option_padding, tvb, voff, eoff - voff, ENC_NA);
7477 return tvb_captured_length(tvb);
7480 static void
7481 dhcp_init_protocol(void)
7483 unsigned i;
7485 /* first copy default_dhcp_opt[] to dhcp_opt[]. This resets all values to default */
7486 memcpy(dhcp_opt, default_dhcp_opt, sizeof(dhcp_opt));
7488 if ((num_dhcp_records_uat > 0) && (saved_uat_opts == NULL))
7490 saved_uat_opts = wmem_list_new(NULL);
7493 /* Now apply the custom options */
7494 for (i = 0; i < num_dhcp_records_uat; i++)
7496 dhcp_opt[uat_dhcp_records[i].opt].text = wmem_strdup(wmem_file_scope(), uat_dhcp_records[i].text);
7497 dhcp_opt[uat_dhcp_records[i].opt].ftype = uat_dhcp_records[i].ftype;
7498 dhcp_opt[uat_dhcp_records[i].opt].phf = NULL;
7500 /* Apply the custom option to the dissection table*/
7501 dissector_change_uint("dhcp.option", uat_dhcp_records[i].opt, dhcpopt_basic_handle);
7503 /* Save the option so it can be cleared later */
7504 wmem_list_append(saved_uat_opts, GUINT_TO_POINTER(uat_dhcp_records[i].opt));
7508 static void
7509 dhcp_clear_uat_dhcpopt(void *data, void *user_data _U_)
7511 dissector_reset_uint("dhcp.option", GPOINTER_TO_UINT(data));
7514 static void
7515 dhcp_cleanup_protocol(void)
7517 if (saved_uat_opts != NULL) {
7518 wmem_list_foreach(saved_uat_opts, dhcp_clear_uat_dhcpopt,
7519 NULL);
7521 wmem_destroy_list(saved_uat_opts);
7522 saved_uat_opts = NULL;
7527 /* TAP STAT INFO */
7528 typedef enum
7530 MESSAGE_TYPE_COLUMN = 0,
7531 PACKET_COLUMN
7532 } dhcp_stat_columns;
7534 static stat_tap_table_item dhcp_stat_fields[] = {{TABLE_ITEM_STRING, TAP_ALIGN_LEFT, "DHCP Message Type", "%-25s"}, {TABLE_ITEM_UINT, TAP_ALIGN_RIGHT, "Packets", "%d"}};
7536 static void dhcp_stat_init(stat_tap_table_ui* new_stat)
7538 const char *table_name = "DHCP Statistics";
7539 int num_fields = array_length(dhcp_stat_fields);
7540 stat_tap_table *table;
7541 int i = 0;
7542 stat_tap_table_item_type items[array_length(dhcp_stat_fields)];
7544 table = stat_tap_find_table(new_stat, table_name);
7545 if (table) {
7546 if (new_stat->stat_tap_reset_table_cb) {
7547 new_stat->stat_tap_reset_table_cb(table);
7549 return;
7552 table = stat_tap_init_table(table_name, num_fields, 0, NULL);
7553 stat_tap_add_table(new_stat, table);
7555 memset(items, 0x0, sizeof(items));
7556 /* Add a row for each value type */
7557 while (opt53_text[i].strptr)
7559 items[MESSAGE_TYPE_COLUMN].type = TABLE_ITEM_STRING;
7560 items[MESSAGE_TYPE_COLUMN].value.string_value = opt53_text[i].strptr;
7561 items[PACKET_COLUMN].type = TABLE_ITEM_UINT;
7562 items[PACKET_COLUMN].value.uint_value = 0;
7564 stat_tap_init_table_row(table, i, num_fields, items);
7565 i++;
7569 static tap_packet_status
7570 dhcp_stat_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *data, tap_flags_t flags _U_)
7572 stat_data_t* stat_data = (stat_data_t*)tapdata;
7573 const char* value = (const char*)data;
7574 stat_tap_table* table;
7575 stat_tap_table_item_type* msg_data;
7576 int idx;
7578 idx = str_to_val_idx(value, opt53_text);
7579 if (idx < 0)
7580 return TAP_PACKET_DONT_REDRAW;
7582 table = g_array_index(stat_data->stat_tap_data->tables, stat_tap_table*, 0);
7583 msg_data = stat_tap_get_field_data(table, idx, PACKET_COLUMN);
7584 msg_data->value.uint_value++;
7585 stat_tap_set_field_data(table, idx, PACKET_COLUMN, msg_data);
7587 return TAP_PACKET_REDRAW;
7590 static void
7591 dhcp_stat_reset(stat_tap_table* table)
7593 unsigned element;
7594 stat_tap_table_item_type* item_data;
7596 for (element = 0; element < table->num_elements; element++)
7598 item_data = stat_tap_get_field_data(table, element, PACKET_COLUMN);
7599 item_data->value.uint_value = 0;
7600 stat_tap_set_field_data(table, element, PACKET_COLUMN, item_data);
7604 void
7605 proto_register_dhcp(void)
7607 static const value_string dhcp_custom_type_vals[] = {
7608 { ipv4, "IP Address"},
7609 { ipv4_list, "IP Address List" },
7610 { string, "string" },
7611 { bytes, "bytes" },
7612 { val_boolean, "boolean" },
7613 { val_u_byte, "byte" },
7614 { val_u_short, "unsigned short" },
7615 { val_u_short_list, "unsigned short list" },
7616 { val_u_long, "unsigned long" },
7617 { time_in_s_secs, "integer time in seconds" },
7618 { time_in_u_secs, "unsigned integer time in seconds" },
7619 { 0x00, NULL }
7622 static hf_register_info hf[] = {
7623 { &hf_dhcp_bootp,
7624 { "Frame is BOOTP", "dhcp.bootp",
7625 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
7626 NULL, HFILL }},
7628 { &hf_dhcp_type,
7629 { "Message type", "dhcp.type",
7630 FT_UINT8, BASE_DEC, VALS(op_vals), 0x0,
7631 NULL, HFILL }},
7633 { &hf_dhcp_hw_type,
7634 { "Hardware type", "dhcp.hw.type",
7635 FT_UINT8, BASE_HEX, VALS(arp_hrd_vals), 0x0,
7636 NULL, HFILL }},
7638 { &hf_dhcp_hw_len,
7639 { "Hardware address length", "dhcp.hw.len",
7640 FT_UINT8, BASE_DEC, NULL, 0x0,
7641 NULL, HFILL }},
7643 { &hf_dhcp_hops,
7644 { "Hops", "dhcp.hops",
7645 FT_UINT8, BASE_DEC, NULL, 0x0,
7646 NULL, HFILL }},
7648 { &hf_dhcp_id,
7649 { "Transaction ID", "dhcp.id",
7650 FT_UINT32, BASE_HEX, NULL, 0x0,
7651 NULL, HFILL }},
7653 { &hf_dhcp_secs,
7654 { "Seconds elapsed", "dhcp.secs",
7655 FT_UINT16, BASE_DEC, NULL, 0x0,
7656 NULL, HFILL }},
7658 { &hf_dhcp_flags,
7659 { "Bootp flags", "dhcp.flags",
7660 FT_UINT16, BASE_HEX, NULL, 0x0,
7661 NULL, HFILL }},
7663 { &hf_dhcp_flags_broadcast,
7664 { "Broadcast flag", "dhcp.flags.bc",
7665 FT_BOOLEAN, 16, TFS(&flag_set_broadcast), BOOTP_BC,
7666 NULL, HFILL }},
7668 { &hf_dhcp_flags_reserved,
7669 { "Reserved flags", "dhcp.flags.reserved",
7670 FT_UINT16, BASE_HEX, NULL, BOOTP_MBZ,
7671 NULL, HFILL }},
7673 { &hf_dhcp_ip_client,
7674 { "Client IP address", "dhcp.ip.client",
7675 FT_IPv4, BASE_NONE, NULL, 0x0,
7676 NULL, HFILL }},
7678 { &hf_dhcp_ip_your,
7679 { "Your (client) IP address", "dhcp.ip.your",
7680 FT_IPv4, BASE_NONE, NULL, 0x0,
7681 NULL, HFILL }},
7683 { &hf_dhcp_ip_server,
7684 { "Next server IP address", "dhcp.ip.server",
7685 FT_IPv4, BASE_NONE, NULL, 0x0,
7686 NULL, HFILL }},
7688 { &hf_dhcp_ip_relay,
7689 { "Relay agent IP address", "dhcp.ip.relay",
7690 FT_IPv4, BASE_NONE, NULL, 0x0,
7691 NULL, HFILL }},
7693 { &hf_dhcp_hw_addr,
7694 { "Client hardware address", "dhcp.hw.addr",
7695 FT_BYTES, BASE_NONE, NULL, 0x0,
7696 NULL, HFILL }},
7698 { &hf_dhcp_hw_addr_padding,
7699 { "Client hardware address padding", "dhcp.hw.addr_padding",
7700 FT_BYTES, BASE_NONE, NULL, 0x0,
7701 NULL, HFILL }},
7703 { &hf_dhcp_hw_ether_addr,
7704 { "Client MAC address", "dhcp.hw.mac_addr",
7705 FT_ETHER, BASE_NONE, NULL, 0x0,
7706 NULL, HFILL }},
7708 { &hf_dhcp_server,
7709 { "Server host name", "dhcp.server",
7710 FT_STRING, BASE_NONE, NULL, 0x0,
7711 NULL, HFILL }},
7713 { &hf_dhcp_file,
7714 { "Boot file name", "dhcp.file",
7715 FT_STRING, BASE_NONE, NULL, 0x0,
7716 NULL, HFILL }},
7718 { &hf_dhcp_cookie,
7719 { "Magic cookie", "dhcp.cookie",
7720 FT_IPv4, BASE_NONE, NULL, 0x0,
7721 NULL, HFILL }},
7723 { &hf_dhcp_vendor_specific_options,
7724 { "Bootp vendor specific options", "dhcp.vendor_specific_options",
7725 FT_BYTES, BASE_NONE, NULL, 0x0,
7726 NULL, HFILL }},
7728 { &hf_dhcp_fqdn_s,
7729 { "Server", "dhcp.fqdn.s",
7730 FT_BOOLEAN, 8, TFS(&tfs_server_client), F_FQDN_S,
7731 "If true, server should do DDNS update", HFILL }},
7733 { &hf_dhcp_fqdn_o,
7734 { "Server overrides", "dhcp.fqdn.o",
7735 FT_BOOLEAN, 8, TFS(&tfs_fqdn_o), F_FQDN_O,
7736 "If true, server insists on doing DDNS update", HFILL }},
7738 { &hf_dhcp_fqdn_e,
7739 { "Encoding", "dhcp.fqdn.e",
7740 FT_BOOLEAN, 8, TFS(&tfs_fqdn_e), F_FQDN_E,
7741 "If true, name is binary encoded", HFILL }},
7743 { &hf_dhcp_fqdn_n,
7744 { "Server DDNS", "dhcp.fqdn.n",
7745 FT_BOOLEAN, 8, TFS(&tfs_fqdn_n), F_FQDN_N,
7746 "If true, server should not do any DDNS updates", HFILL }},
7748 { &hf_dhcp_fqdn_flags,
7749 { "Flags", "dhcp.fqdn.flags",
7750 FT_UINT8, BASE_HEX, NULL, 0,
7751 NULL, HFILL }},
7753 { &hf_dhcp_fqdn_mbz,
7754 { "Reserved flags", "dhcp.fqdn.mbz",
7755 FT_UINT8, BASE_HEX, NULL, F_FQDN_MBZ,
7756 NULL, HFILL }},
7758 { &hf_dhcp_fqdn_rcode1,
7759 { "A-RR result", "dhcp.fqdn.rcode1",
7760 FT_UINT8, BASE_DEC, NULL, 0x0,
7761 "Result code of A-RR update", HFILL }},
7763 { &hf_dhcp_fqdn_rcode2,
7764 { "PTR-RR result", "dhcp.fqdn.rcode2",
7765 FT_UINT8, BASE_DEC, NULL, 0x0,
7766 "Result code of PTR-RR update", HFILL }},
7768 { &hf_dhcp_fqdn_name,
7769 { "Client name", "dhcp.fqdn.name",
7770 FT_STRING, BASE_NONE, NULL, 0x0,
7771 "Name to register via DDNS", HFILL }},
7773 { &hf_dhcp_fqdn_asciiname,
7774 { "Client name", "dhcp.fqdn.name",
7775 FT_STRING, BASE_NONE, NULL, 0x0,
7776 "Name to register via DDNS", HFILL }},
7778 { &hf_dhcp_pkt_mta_cap_len,
7779 { "MTA DC Length", "dhcp.vendor.pktc.mta_cap_len",
7780 FT_UINT16, BASE_DEC, NULL, 0x0,
7781 "PacketCable MTA Device Capabilities Length", HFILL }},
7783 { &hf_dhcp_pkt_mta_cap_type,
7784 { "Type", "dhcp.vendor.pktc.mta_cap_type",
7785 FT_UINT16, BASE_DEC, VALS(pkt_mdc_type_vals), 0x0,
7786 NULL, HFILL }},
7788 { &hf_dhcp_pkt_mdc_supp_flow_secure,
7789 { "Secure Flow (Full Secure Provisioning Flow)", "dhcp.vendor.pktc.mdc.supp_flow.secure",
7790 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001,
7791 NULL, HFILL }},
7793 { &hf_dhcp_pkt_mdc_supp_flow_hybrid,
7794 { "Hybrid Flow", "dhcp.vendor.pktc.mdc.supp_flow.hybrid",
7795 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002,
7796 NULL, HFILL }},
7798 { &hf_dhcp_pkt_mdc_supp_flow_basic,
7799 { "Basic Flow", "dhcp.vendor.pktc.mdc.supp_flow.basic",
7800 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004,
7801 NULL, HFILL }},
7803 { &hf_dhcp_pkt_mdc_mib_cl_mta,
7804 { "PacketCable 1.5 MTA MIB", "dhcp.vendor.pktc.mdc_cl.mib.mta",
7805 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
7806 NULL, HFILL }},
7808 { &hf_dhcp_pkt_mdc_mib_cl_signaling,
7809 { "PacketCable 1.5 Signaling MIB", "dhcp.vendor.pktc.mdc_cl.mib.signaling",
7810 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
7811 NULL, HFILL }},
7813 { &hf_dhcp_pkt_mdc_mib_cl_management_event,
7814 { "PacketCable 1.5 Management Event MIB", "dhcp.vendor.pktc.mdc_cl.mib.management_event",
7815 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
7816 NULL, HFILL }},
7818 { &hf_dhcp_pkt_mdc_mib_cl_mta_extension,
7819 { "PacketCable 1.5 MTA Extension MIB", "dhcp.vendor.pktc.mdc_cl.mib.mta_extension",
7820 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
7821 NULL, HFILL }},
7823 { &hf_dhcp_pkt_mdc_mib_cl_mta_signaling_extension,
7824 { "PacketCable 1.5 Signaling Extension MIB", "dhcp.vendor.pktc.mdc_cl.mib.signaling_extension",
7825 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
7826 NULL, HFILL }},
7828 { &hf_dhcp_pkt_mdc_mib_cl_mta_mem_extension,
7829 { "PacketCable 1.5 MEM Extension MIB", "dhcp.vendor.pktc.mdc_cl.mib.mem_extension",
7830 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
7831 NULL, HFILL }},
7833 { &hf_dhcp_pkt_mdc_mib_cl_reserved,
7834 { "Reserved", "dhcp.vendor.pktc.mdc_cl.mib.reserved",
7835 FT_UINT8, BASE_HEX, NULL, 0xC0,
7836 NULL, HFILL }},
7838 { &hf_dhcp_pkt_mdc_mib_ietf_mta,
7839 { "IETF MTA MIB", "dhcp.vendor.pktc.mdc_ietf.mib.mta",
7840 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
7841 NULL, HFILL }},
7843 { &hf_dhcp_pkt_mdc_mib_ietf_signaling,
7844 { "IETF Signaling MIB", "dhcp.vendor.pktc.mdc_ietf.mib.signaling",
7845 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
7846 NULL, HFILL }},
7848 { &hf_dhcp_pkt_mdc_mib_ietf_management_event,
7849 { "IETF Management Event MIB", "dhcp.vendor.pktc.mdc_ietf.mib.management_event",
7850 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
7851 NULL, HFILL }},
7853 { &hf_dhcp_pkt_mdc_mib_ietf_reserved,
7854 { "Reserved", "dhcp.vendor.pktc.mdc_ietf.mib.reserved",
7855 FT_UINT8, BASE_HEX, NULL, 0xF8,
7856 NULL, HFILL }},
7858 { &hf_dhcp_pkt_mdc_mib_euro_mta,
7859 { "PacketCable 1.5 MTA MIB", "dhcp.vendor.pktc.mdc_euro.mib.mta",
7860 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
7861 NULL, HFILL }},
7863 { &hf_dhcp_pkt_mdc_mib_euro_signaling,
7864 { "PacketCable 1.5 Signaling MIB", "dhcp.vendor.pktc.mdc_euro.mib.signaling",
7865 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
7866 NULL, HFILL }},
7868 { &hf_dhcp_pkt_mdc_mib_euro_management_event,
7869 { "PacketCable 1.5 Management Event MIB", "dhcp.vendor.pktc.mdc_euro.mib.management_event",
7870 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
7871 NULL, HFILL }},
7873 { &hf_dhcp_pkt_mdc_mib_euro_mta_extension,
7874 { "PacketCable 1.5 MTA Extension MIB", "dhcp.vendor.pktc.mdc_euro.mib.mta_extension",
7875 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
7876 NULL, HFILL }},
7878 { &hf_dhcp_pkt_mdc_mib_euro_mta_signaling_extension,
7879 { "PacketCable 1.5 Signaling Extension MIB", "dhcp.vendor.pktc.mdc_euro.mib.signaling_extension",
7880 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
7881 NULL, HFILL }},
7883 { &hf_dhcp_pkt_mdc_mib_euro_mta_mem_extension,
7884 { "PacketCable 1.5 MEM Extension MIB", "dhcp.vendor.pktc.mdc_euro.mib.mem_extension",
7885 FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
7886 NULL, HFILL }},
7888 { &hf_dhcp_pkt_mdc_mib_euro_reserved,
7889 { "Reserved", "dhcp.vendor.pktc.mdc_euro.mib.reserved",
7890 FT_UINT8, BASE_HEX, NULL, 0xC0,
7891 NULL, HFILL }},
7893 { &hf_dhcp_docsis_cm_cap_len,
7894 { "CM DC Length", "dhcp.vendor.docsis.cm_cap_len",
7895 FT_UINT8, BASE_DEC, NULL, 0x0,
7896 "DOCSIS Cable Modem Device Capabilities Length", HFILL }},
7898 { &hf_dhcp_docsis_cm_cap_type,
7899 { "CM DC Type", "dhcp.docsis_cm_cap_type",
7900 FT_UINT16, BASE_DEC, VALS(docsis_cm_cap_type_vals), 0x0,
7901 "Docsis Cable Modem Device Capability type", HFILL }},
7903 { &hf_dhcp_docsis_cm_cap_ranging_hold_off_cm,
7904 { "CM", "dhcp.docsis_cm_cap.ranging_hold_off.cm",
7905 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001,
7906 NULL, HFILL }},
7908 { &hf_dhcp_docsis_cm_cap_ranging_hold_off_eps,
7909 { "ePS or eRouter", "dhcp.docsis_cm_cap.ranging_hold_off.eps",
7910 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002,
7911 NULL, HFILL }},
7913 { &hf_dhcp_docsis_cm_cap_ranging_hold_off_emta,
7914 { "EMTA or EDVA", "dhcp.docsis_cm_cap.ranging_hold_off.emta",
7915 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004,
7916 NULL, HFILL }},
7918 { &hf_dhcp_docsis_cm_cap_ranging_hold_off_dsg,
7919 { "DSG/eSTB", "dhcp.docsis_cm_cap.ranging_hold_off.dsg",
7920 FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0008,
7921 NULL, HFILL }},
7924 { &hf_dhcp_docsis_cm_cap_mpls_stpid,
7925 { "[IEEE 802.1ad] S-TPID", "dhcp.docsis_cm_cap.mpls.stpid",
7926 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000001,
7927 NULL, HFILL }},
7929 { &hf_dhcp_docsis_cm_cap_mpls_svid,
7930 { "[IEEE 802.1ad] S-VID", "dhcp.docsis_cm_cap.mpls.svid",
7931 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000002,
7932 NULL, HFILL }},
7934 { &hf_dhcp_docsis_cm_cap_mpls_spcp,
7935 { "[IEEE 802.1ad] S-PCP", "dhcp.docsis_cm_cap.mpls.spcp",
7936 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000004,
7937 NULL, HFILL }},
7939 { &hf_dhcp_docsis_cm_cap_mpls_sdei,
7940 { "[IEEE 802.1ad] S-DEI", "dhcp.docsis_cm_cap.mpls.sdei",
7941 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000008,
7942 NULL, HFILL }},
7944 { &hf_dhcp_docsis_cm_cap_mpls_ctpid,
7945 { "[IEEE 802.1ad] C-TPID", "dhcp.docsis_cm_cap.mpls.ctpid",
7946 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
7947 NULL, HFILL }},
7949 { &hf_dhcp_docsis_cm_cap_mpls_cvid,
7950 { "[IEEE 802.1ad] C-VID", "dhcp.docsis_cm_cap.mpls.cvid",
7951 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
7952 NULL, HFILL }},
7954 { &hf_dhcp_docsis_cm_cap_mpls_cpcp,
7955 { "[IEEE 802.1ad] C-PCP", "dhcp.docsis_cm_cap.mpls.cpcp",
7956 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000040,
7957 NULL, HFILL }},
7959 { &hf_dhcp_docsis_cm_cap_mpls_ccfi,
7960 { "[IEEE 802.1ad] C-CFI", "dhcp.docsis_cm_cap.mpls.ccfi",
7961 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000080,
7962 NULL, HFILL }},
7964 { &hf_dhcp_docsis_cm_cap_mpls_stci,
7965 { "[IEEE 802.1ad] S-TCI", "dhcp.docsis_cm_cap.mpls.stci",
7966 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000100,
7967 NULL, HFILL }},
7969 { &hf_dhcp_docsis_cm_cap_mpls_ctci,
7970 { "[IEEE 802.1ad] C-TCI", "dhcp.docsis_cm_cap.mpls.ctci",
7971 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000200,
7972 NULL, HFILL }},
7974 { &hf_dhcp_docsis_cm_cap_mpls_itpid,
7975 { "[IEEE 802.1ad] I-TPID", "dhcp.docsis_cm_cap.mpls.itpid",
7976 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000400,
7977 NULL, HFILL }},
7979 { &hf_dhcp_docsis_cm_cap_mpls_isid,
7980 { "[IEEE 802.1ad] I-SID", "dhcp.docsis_cm_cap.mpls.isid",
7981 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000800,
7982 NULL, HFILL }},
7984 { &hf_dhcp_docsis_cm_cap_mpls_itci,
7985 { "[IEEE 802.1ad] I-TCI", "dhcp.docsis_cm_cap.mpls.itci",
7986 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00001000,
7987 NULL, HFILL }},
7989 { &hf_dhcp_docsis_cm_cap_mpls_ipcp,
7990 { "[IEEE 802.1ad] I-PCP", "dhcp.docsis_cm_cap.mpls.ipcp",
7991 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00002000,
7992 NULL, HFILL }},
7994 { &hf_dhcp_docsis_cm_cap_mpls_idei,
7995 { "[IEEE 802.1ad] I-DEI", "dhcp.docsis_cm_cap.mpls.idei",
7996 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00004000,
7997 NULL, HFILL }},
7999 { &hf_dhcp_docsis_cm_cap_mpls_iuca,
8000 { "[IEEE 802.1ad] I-UCA", "dhcp.docsis_cm_cap.mpls.iuca",
8001 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00008000,
8002 NULL, HFILL }},
8004 { &hf_dhcp_docsis_cm_cap_mpls_btpid,
8005 { "[IEEE 802.1ad] B-TPID", "dhcp.docsis_cm_cap.mpls.btpid",
8006 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00010000,
8007 NULL, HFILL }},
8009 { &hf_dhcp_docsis_cm_cap_mpls_btci,
8010 { "[IEEE 802.1ad] B-TCI", "dhcp.docsis_cm_cap.mpls.btci",
8011 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00020000,
8012 NULL, HFILL }},
8014 { &hf_dhcp_docsis_cm_cap_mpls_bpcp,
8015 { "[IEEE 802.1ad] B-PCP", "dhcp.docsis_cm_cap.mpls.bpcp",
8016 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00040000,
8017 NULL, HFILL }},
8019 { &hf_dhcp_docsis_cm_cap_mpls_bdei,
8020 { "[IEEE 802.1ad] B-DEI", "dhcp.docsis_cm_cap.mpls.bdei",
8021 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00080000,
8022 NULL, HFILL }},
8024 { &hf_dhcp_docsis_cm_cap_mpls_bvid,
8025 { "[IEEE 802.1ad] B-VID", "dhcp.docsis_cm_cap.mpls.bvid",
8026 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00100000,
8027 NULL, HFILL }},
8029 { &hf_dhcp_docsis_cm_cap_mpls_bda,
8030 { "[IEEE 802.1ad] B-DA", "dhcp.docsis_cm_cap.mpls.bda",
8031 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00200000,
8032 NULL, HFILL }},
8034 { &hf_dhcp_docsis_cm_cap_mpls_bsa,
8035 { "[IEEE 802.1ad] B-SA", "dhcp.docsis_cm_cap.mpls.bsa",
8036 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00400000,
8037 NULL, HFILL }},
8039 { &hf_dhcp_docsis_cm_cap_mpls_tc,
8040 { "MPLS TC", "dhcp.docsis_cm_cap.mpls.tc",
8041 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00800000,
8042 NULL, HFILL }},
8044 { &hf_dhcp_docsis_cm_cap_mpls_label,
8045 { "MPLS Label", "dhcp.docsis_cm_cap.mpls.label",
8046 FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x01000000,
8047 NULL, HFILL }},
8050 { &hf_dhcp_docsis_cm_cap_ussymrate_160,
8051 { "160 ksps symbol rate", "dhcp.docsis_cm_cap.ussymrate.160",
8052 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
8053 NULL, HFILL }},
8055 { &hf_dhcp_docsis_cm_cap_ussymrate_320,
8056 { "320 ksps symbol rate", "dhcp.docsis_cm_cap.ussymrate.320",
8057 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
8058 NULL, HFILL }},
8060 { &hf_dhcp_docsis_cm_cap_ussymrate_640,
8061 { "640 ksps symbol rate", "dhcp.docsis_cm_cap.ussymrate.640",
8062 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
8063 NULL, HFILL }},
8065 { &hf_dhcp_docsis_cm_cap_ussymrate_1280,
8066 { "1280 ksps symbol rate", "dhcp.docsis_cm_cap.ussymrate.1280",
8067 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
8068 NULL, HFILL }},
8070 { &hf_dhcp_docsis_cm_cap_ussymrate_2560,
8071 { "2560 ksps symbol rate", "dhcp.docsis_cm_cap.ussymrate.2560",
8072 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
8073 NULL, HFILL }},
8075 { &hf_dhcp_docsis_cm_cap_ussymrate_5120,
8076 { "5120 ksps symbol rate", "dhcp.docsis_cm_cap.ussymrate.5120",
8077 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
8078 NULL, HFILL }},
8080 { &hf_dhcp_client_identifier_uuid,
8081 { "Client Identifier (UUID)", "dhcp.client_id.uuid",
8082 FT_GUID, BASE_NONE, NULL, 0x0,
8083 "Client Machine Identifier (UUID)", HFILL }},
8085 { &hf_dhcp_client_hardware_address,
8086 { "Client hardware address", "dhcp.client_hardware_address",
8087 FT_STRING, BASE_NONE, NULL, 0x0,
8088 NULL, HFILL }},
8090 { &hf_dhcp_client_id_iaid,
8091 { "IAID", "dhcp.client_id.iaid",
8092 FT_STRING, BASE_NONE, NULL, 0x0,
8093 NULL, HFILL }},
8095 { &hf_dhcp_client_id_duid_type,
8096 { "DUID Type", "dhcp.client_id.duid_type",
8097 FT_UINT16, BASE_DEC, VALS(duidtype_vals), 0x0,
8098 NULL, HFILL }},
8100 { &hf_dhcp_client_identifier_duid_llt_hw_type,
8101 { "Hardware type", "dhcp.client_id.duid_llt_hw_type",
8102 FT_UINT16, BASE_DEC, VALS(arp_hrd_vals), 0x0,
8103 "Client Identifier DUID LLT Hardware type", HFILL }},
8105 { &hf_dhcp_client_identifier_duid_ll_hw_type,
8106 { "Hardware type", "dhcp.client_id.duid_ll_hw_type",
8107 FT_UINT16, BASE_DEC, VALS(arp_hrd_vals), 0x0,
8108 "Client Identifier DUID LL Hardware type", HFILL }},
8110 { &hf_dhcp_client_identifier_time,
8111 { "Time", "dhcp.client_id.time",
8112 FT_UINT32, BASE_DEC, NULL, 0x0,
8113 NULL, HFILL }},
8115 { &hf_dhcp_client_identifier_link_layer_address,
8116 { "Link layer address", "dhcp.client_id.link_layer_address",
8117 FT_STRING, BASE_NONE, NULL, 0x0,
8118 NULL, HFILL }},
8120 { &hf_dhcp_client_identifier_link_layer_address_ether,
8121 { "Link layer address (Ethernet)", "dhcp.client_id.link_layer_address_ether",
8122 FT_ETHER, BASE_NONE, NULL, 0x0,
8123 NULL, HFILL }},
8125 { &hf_dhcp_client_identifier_enterprise_num,
8126 { "Enterprise-number", "dhcp.client_id.enterprise_num",
8127 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0,
8128 NULL, HFILL }},
8130 { &hf_dhcp_client_identifier,
8131 { "Identifier", "dhcp.client_id",
8132 FT_BYTES, BASE_NONE, NULL, 0x0,
8133 NULL, HFILL }},
8135 { &hf_dhcp_client_identifier_type,
8136 { "Type", "dhcp.client_id.type",
8137 FT_UINT8, BASE_DEC, NULL, 0x0,
8138 NULL, HFILL }},
8140 { &hf_dhcp_client_identifier_undef,
8141 { "Client Identifier", "dhcp.client_id.undef",
8142 FT_STRING, BASE_NONE, NULL, 0x0,
8143 NULL, HFILL }},
8145 { &hf_dhcp_option_type,
8146 { "Option", "dhcp.option.type",
8147 FT_UINT8, BASE_DEC, NULL, 0x0,
8148 "DHCP/BOOTP option type", HFILL }},
8150 { &hf_dhcp_option_length,
8151 { "Length", "dhcp.option.length",
8152 FT_UINT8, BASE_DEC, NULL, 0x0,
8153 "DHCP/BOOTP option length", HFILL }},
8155 { &hf_dhcp_suboption_length,
8156 { "Length", "dhcp.option.suboption_length",
8157 FT_UINT8, BASE_DEC, NULL, 0x0,
8158 "Suboption length", HFILL }},
8160 { &hf_dhcp_option_value,
8161 { "Value", "dhcp.option.value",
8162 FT_BYTES, BASE_NONE, NULL, 0x0,
8163 "DHCP/BOOTP option value", HFILL }},
8165 { &hf_dhcp_option_value_8,
8166 { "Value", "dhcp.option.value.uint",
8167 FT_UINT8, BASE_DEC, NULL, 0x0,
8168 "8-bit DHCP/BOOTP option value", HFILL }},
8170 { &hf_dhcp_option_value_16,
8171 { "Value", "dhcp.option.value.uint",
8172 FT_UINT16, BASE_DEC, NULL, 0x0,
8173 "16-bit DHCP/BOOTP option value", HFILL }},
8175 { &hf_dhcp_option_value_u32,
8176 { "Value", "dhcp.option.value.uint",
8177 FT_UINT32, BASE_HEX, NULL, 0x0,
8178 "32-bit DHCP/BOOTP option value", HFILL }},
8180 { &hf_dhcp_option_value_s_secs,
8181 { "Value", "dhcp.option.value.secs",
8182 FT_INT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_s_secs_fmt), 0x0,
8183 "32-bit DHCP/BOOTP option value", HFILL }},
8185 { &hf_dhcp_option_value_u_secs,
8186 { "Value", "dhcp.option.value.usecs",
8187 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
8188 "32-bit DHCP/BOOTP option value", HFILL }},
8190 { &hf_dhcp_option_value_stringz,
8191 { "Value", "dhcp.option.value.string",
8192 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8193 "Z-String DHCP/BOOTP option value", HFILL }},
8195 { &hf_dhcp_option_value_ip_address,
8196 { "Value", "dhcp.option.value.address",
8197 FT_IPv4, BASE_NONE, NULL, 0x00,
8198 "IP address DHCP/BOOTP option value", HFILL }},
8200 { &hf_dhcp_option_value_boolean,
8201 { "Value", "dhcp.option.value.bool",
8202 FT_BOOLEAN, BASE_NONE, NULL, 0x00,
8203 "Boolean DHCP/BOOTP option value", HFILL }},
8205 { &hf_dhcp_option_rfc_3396_detected,
8206 { "Encoding Long Options detected (RFC 3396)", "dhcp.option.rfc_3396_detected",
8207 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8208 NULL, HFILL }},
8210 { &hf_dhcp_option_padding,
8211 { "Padding", "dhcp.option.padding",
8212 FT_BYTES, BASE_NONE, NULL, 0x0,
8213 "Option 0: Padding", HFILL }},
8215 { &hf_dhcp_option_subnet_mask,
8216 { "Subnet Mask", "dhcp.option.subnet_mask",
8217 FT_IPv4, BASE_NETMASK, NULL, 0x00,
8218 "Option 1: Subnet Mask", HFILL }},
8220 { &hf_dhcp_option_time_offset,
8221 { "Time Offset", "dhcp.option.time_offset",
8222 FT_INT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_s_secs_fmt), 0x0,
8223 "Option 2: Time Offset", HFILL }},
8225 { &hf_dhcp_option_router,
8226 { "Router", "dhcp.option.router",
8227 FT_IPv4, BASE_NONE, NULL, 0x00,
8228 "Option 3: Router", HFILL }},
8230 { &hf_dhcp_option_time_server,
8231 { "Time Server", "dhcp.option.time_server",
8232 FT_IPv4, BASE_NONE, NULL, 0x00,
8233 "Option 4: Time Server", HFILL }},
8235 { &hf_dhcp_option_name_server,
8236 { "Name Server", "dhcp.option.name_server",
8237 FT_IPv4, BASE_NONE, NULL, 0x00,
8238 "Option 5: Name Server", HFILL }},
8240 { &hf_dhcp_option_domain_name_server,
8241 { "Domain Name Server", "dhcp.option.domain_name_server",
8242 FT_IPv4, BASE_NONE, NULL, 0x00,
8243 "Option 6: Domain Name Server", HFILL }},
8245 { &hf_dhcp_option_log_server,
8246 { "Log Server", "dhcp.option.log_server",
8247 FT_IPv4, BASE_NONE, NULL, 0x00,
8248 "Option 7: Log Server", HFILL }},
8250 { &hf_dhcp_option_quotes_server,
8251 { "Quotes Server", "dhcp.option.quotes_server",
8252 FT_IPv4, BASE_NONE, NULL, 0x00,
8253 "Option 8: Quotes Server", HFILL }},
8255 { &hf_dhcp_option_lpr_server,
8256 { "LPR Server", "dhcp.option.lpr_server",
8257 FT_IPv4, BASE_NONE, NULL, 0x00,
8258 "Option 9: LPR Server", HFILL }},
8260 { &hf_dhcp_option_impress_server,
8261 { "Impress Server", "dhcp.option.impress_server",
8262 FT_IPv4, BASE_NONE, NULL, 0x00,
8263 "Option 10: Impress Server", HFILL }},
8265 { &hf_dhcp_option_resource_location_server,
8266 { "Resource Location Server", "dhcp.option.resource_location_server",
8267 FT_IPv4, BASE_NONE, NULL, 0x00,
8268 "Option 11: Resource Location Server", HFILL }},
8270 { &hf_dhcp_option_hostname,
8271 { "Host Name", "dhcp.option.hostname",
8272 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8273 "Option 12: Host Name", HFILL }},
8275 { &hf_dhcp_option_boot_file_size,
8276 { "Boot File Size", "dhcp.option.boot_file_size",
8277 FT_UINT16, BASE_DEC, NULL, 0x0,
8278 "Option 13: Boot File Size", HFILL }},
8280 { &hf_dhcp_option_merit_dump_file,
8281 { "Merit Dump File", "dhcp.option.merit_dump_file",
8282 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8283 "Option 14: Merit Dump File", HFILL }},
8285 { &hf_dhcp_option_domain_name,
8286 { "Domain Name", "dhcp.option.domain_name",
8287 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8288 "Option 15: Domain Name", HFILL }},
8290 { &hf_dhcp_option_swap_server,
8291 { "Swap Server", "dhcp.option.swap_server",
8292 FT_IPv4, BASE_NONE, NULL, 0x00,
8293 "Option 16: Swap Server", HFILL }},
8295 { &hf_dhcp_option_root_path,
8296 { "Root Path", "dhcp.option.root_path",
8297 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8298 "Option 17: Root Path", HFILL }},
8300 { &hf_dhcp_option_extension_path,
8301 { "Extensions Path", "dhcp.option.extension_path",
8302 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8303 "Option 18: Extensions Path", HFILL }},
8305 { &hf_dhcp_option_ip_forwarding,
8306 { "IP Forwarding", "dhcp.option.ip_forwarding",
8307 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8308 "Option 19: IP Forwarding", HFILL }},
8310 { &hf_dhcp_option_policy_filter_ip,
8311 { "IP Address", "dhcp.option.policy_filter.ip",
8312 FT_IPv4, BASE_NONE, NULL, 0x00,
8313 "Option 21: IP address", HFILL }},
8315 { &hf_dhcp_option_policy_filter_subnet_mask,
8316 { "Subnet Mask", "dhcp.option.policy_filter.subnet_mask",
8317 FT_IPv4, BASE_NETMASK, NULL, 0x00,
8318 "Option 21: Subnet Mask", HFILL }},
8320 { &hf_dhcp_option_non_local_source_routing,
8321 { "Non-Local Source Routing", "dhcp.option.non_local_source_routing",
8322 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8323 "Option 20: Non-Local Source Routing", HFILL }},
8325 { &hf_dhcp_option_max_datagram_reassembly_size,
8326 { "Maximum Datagram Reassembly Size", "dhcp.option.max_datagram_reassembly_size",
8327 FT_UINT16, BASE_DEC, NULL, 0x0,
8328 "Option 22: Maximum Datagram Reassembly Size", HFILL }},
8330 { &hf_dhcp_option_default_ip_ttl,
8331 { "Default IP Time-to-Live", "dhcp.option.default_ip_ttl",
8332 FT_UINT8, BASE_DEC, NULL, 0x0,
8333 "Option 23: Default IP Time-to-Live", HFILL }},
8335 { &hf_dhcp_option_path_mtu_aging_timeout,
8336 { "Path MTU Aging Timeout", "dhcp.option.path_mtu_aging_timeout",
8337 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
8338 "Option 24: Path MTU Aging Timeout", HFILL }},
8340 { &hf_dhcp_option_path_mtu_plateau_table_item,
8341 { "Path MTU Plateau Table Item", "dhcp.option.path_mtu_plateau_table_item",
8342 FT_UINT16, BASE_DEC, NULL, 0x0,
8343 "Option 25: Path MTU Plateau Table Item", HFILL }},
8345 { &hf_dhcp_option_interface_mtu,
8346 { "Interface MTU", "dhcp.option.interface_mtu",
8347 FT_UINT16, BASE_DEC, NULL, 0x0,
8348 "Option 26: Interface MTU", HFILL }},
8350 { &hf_dhcp_option_all_subnets_are_local,
8351 { "All Subnets are Local", "dhcp.option.all_subnets_are_local",
8352 FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x00,
8353 "Option 27: All Subnets are Local", HFILL }},
8355 { &hf_dhcp_option_broadcast_address,
8356 { "Broadcast Address", "dhcp.option.broadcast_address",
8357 FT_IPv4, BASE_NONE, NULL, 0x00,
8358 "Option 28: Broadcast Address", HFILL }},
8360 { &hf_dhcp_option_perform_mask_discovery,
8361 { "Perform Mask Discovery", "dhcp.option.perform_mask_discovery",
8362 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8363 "Option 29: Perform Mask Discovery", HFILL }},
8365 { &hf_dhcp_option_mask_supplier,
8366 { "Mask Supplier", "dhcp.option.mask_supplier",
8367 FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x00,
8368 "Option 30: Mask Supplier", HFILL }},
8370 { &hf_dhcp_option_perform_router_discover,
8371 { "Perform Router Discover", "dhcp.option.perform_router_discover",
8372 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8373 "Option 31: Perform Router Discover", HFILL }},
8375 { &hf_dhcp_option_router_solicitation_address,
8376 { "Router Solicitation Address", "dhcp.option.router_solicitation_address",
8377 FT_IPv4, BASE_NONE, NULL, 0x00,
8378 "Option 32: Router Solicitation Address", HFILL }},
8380 { &hf_dhcp_option_static_route_ip,
8381 { "Destination IP Address", "dhcp.option.static_route.ip",
8382 FT_IPv4, BASE_NONE, NULL, 0x00,
8383 "Option 33: Destination IP address", HFILL }},
8385 { &hf_dhcp_option_static_route_router,
8386 { "Destination Router", "dhcp.option.static_route.router",
8387 FT_IPv4, BASE_NONE, NULL, 0x00,
8388 "Option 33: Destination Router", HFILL }},
8390 { &hf_dhcp_option_trailer_encapsulation,
8391 { "Trailer Encapsulation", "dhcp.option.trailer_encapsulation",
8392 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8393 "Option 34: Trailer Encapsulation", HFILL }},
8395 { &hf_dhcp_option_arp_cache_timeout,
8396 { "ARP Cache Timeout", "dhcp.option.arp_cache_timeout",
8397 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
8398 "Option 35: ARP Cache Timeout", HFILL }},
8400 { &hf_dhcp_option_ethernet_encapsulation,
8401 { "Ethernet Encapsulation", "dhcp.option.ethernet_encapsulation",
8402 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8403 "Option 36: Ethernet Encapsulation", HFILL }},
8405 { &hf_dhcp_option_tcp_default_ttl,
8406 { "TCP Default TTL", "dhcp.option.tcp_default_ttl",
8407 FT_UINT8, BASE_DEC, NULL, 0x0,
8408 "Option 37: TCP Default TTL", HFILL }},
8410 { &hf_dhcp_option_tcp_keepalive_interval,
8411 { "TCP Keepalive Interval", "dhcp.option.tcp_keepalive_interval",
8412 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
8413 "Option 38: TCP Keepalive Interval", HFILL }},
8415 { &hf_dhcp_option_tcp_keepalive_garbage,
8416 { "TCP Keepalive Garbage", "dhcp.option.tcp_keepalive_garbage",
8417 FT_BOOLEAN, BASE_NONE, TFS(&tfs_enabled_disabled), 0x00,
8418 "Option 39: TCP Keepalive Garbage", HFILL }},
8420 { &hf_dhcp_option_nis_domain,
8421 { "Network Information Service Domain", "dhcp.option.nis_domain",
8422 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8423 "Option 40: Network Information Service Domain", HFILL }},
8425 { &hf_dhcp_option_nis_server,
8426 { "Network Information Service Server", "dhcp.option.nis_server",
8427 FT_IPv4, BASE_NONE, NULL, 0x00,
8428 "Option 41: Network Information Service Server", HFILL }},
8430 { &hf_dhcp_option_ntp_server,
8431 { "Network Time Protocol Server", "dhcp.option.ntp_server",
8432 FT_IPv4, BASE_NONE, NULL, 0x00,
8433 "Option 42: Network Time Protocol Server", HFILL }},
8435 { &hf_dhcp_option43_suboption,
8436 { "Option 43 Suboption", "dhcp.option.vendor.suboption",
8437 FT_UINT8, BASE_DEC, NULL, 0x0,
8438 NULL, HFILL }},
8440 { &hf_dhcp_option43_value,
8441 { "Value", "dhcp.option.vendor.value",
8442 FT_BYTES, BASE_NONE, NULL, 0x0,
8443 "Option 43: Suboption value", HFILL }},
8445 { &hf_dhcp_option43_value_8,
8446 { "Value", "dhcp.option.vendor.value.uint",
8447 FT_UINT8, BASE_DEC, NULL, 0x0,
8448 "Option 43: Suboption 8-bit value", HFILL }},
8450 { &hf_dhcp_option43_value_32,
8451 { "Value", "dhcp.option.vendor.value.uint",
8452 FT_UINT32, BASE_DEC, NULL, 0x0,
8453 "Option 43: Suboption 32-bit value", HFILL }},
8455 { &hf_dhcp_option43_value_stringz,
8456 { "Value", "dhcp.option.vendor.value.string",
8457 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8458 "Option 43: Suboption Z-String value", HFILL }},
8460 { &hf_dhcp_option43_value_ip_address,
8461 { "Value", "dhcp.option.vendor.value.address",
8462 FT_IPv4, BASE_NONE, NULL, 0x00,
8463 "Option 43: Suboption IP address", HFILL }},
8466 { &hf_dhcp_option43_pxeclient_suboption,
8467 { "Option 43 Suboption", "dhcp.option.vendor.pxeclient.suboption",
8468 FT_UINT8, BASE_DEC, VALS(option43_pxeclient_suboption_vals), 0x0,
8469 "Option 43:PXE Client Suboption", HFILL }},
8471 { &hf_dhcp_option43_pxeclient_padding,
8472 { "Padding", "dhcp.option.vendor.pxeclient.padding",
8473 FT_UINT8, BASE_DEC, NULL, 0x0,
8474 "Option 43:PXE Client 0 Padding", HFILL }},
8476 { &hf_dhcp_option43_pxeclient_mtftp_ip,
8477 { "mtftp IP", "dhcp.option.vendor.pxeclient.mtftp_ip",
8478 FT_IPv4, BASE_NONE, NULL, 0x00,
8479 "Option 43:PXE Client 1 mtftp IP", HFILL }},
8481 { &hf_dhcp_option43_pxeclient_mtftp_client_port,
8482 { "mtftp client port", "dhcp.option.vendor.pxeclient.mtftp_client_port",
8483 FT_UINT16, BASE_DEC, NULL, 0x00,
8484 "Option 43:PXE Client 2 mtftp client port", HFILL }},
8486 { &hf_dhcp_option43_pxeclient_mtftp_server_port,
8487 { "mtftp server port", "dhcp.option.vendor.pxeclient.mtftp_server_port",
8488 FT_UINT16, BASE_DEC, NULL, 0x00,
8489 "Option 43:PXE Client 3 mtftp server port", HFILL }},
8491 { &hf_dhcp_option43_pxeclient_mtftp_timeout,
8492 { "mtftp timeout", "dhcp.option.vendor.pxeclient.mtftp_timeout",
8493 FT_UINT8, BASE_DEC, NULL, 0x0,
8494 "Option 43:PXE Client 4 mtftp timeout", HFILL }},
8496 { &hf_dhcp_option43_pxeclient_mtftp_delay,
8497 { "mtftp delay", "dhcp.option.vendor.pxeclient.mtftp_delay",
8498 FT_UINT8, BASE_DEC, NULL, 0x0,
8499 "Option 43:PXE Client 5 mtftp delay", HFILL }},
8501 { &hf_dhcp_option43_pxeclient_discovery_control,
8502 { "discovery control", "dhcp.option.vendor.pxeclient.discovery_control",
8503 FT_UINT8, BASE_HEX, NULL, 0x0,
8504 "Option 43:PXE Client 6 discovery control", HFILL }},
8506 { &hf_dhcp_option43_pxeclient_discovery_control_bc,
8507 { "Disable Broadcast", "dhcp.option.vendor.pxeclient.discovery_control.broadcast",
8508 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
8509 NULL, HFILL }},
8511 { &hf_dhcp_option43_pxeclient_discovery_control_mc,
8512 { "Disable Multicast", "dhcp.option.vendor.pxeclient.discovery_control.multicast",
8513 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
8514 NULL, HFILL }},
8516 { &hf_dhcp_option43_pxeclient_discovery_control_serverlist,
8517 { "Serverlist only", "dhcp.option.vendor.pxeclient.discovery_control.serverlist",
8518 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
8519 NULL, HFILL }},
8521 { &hf_dhcp_option43_pxeclient_discovery_control_bstrap,
8522 { "Bootstrap override", "dhcp.option.vendor.pxeclient.discovery_control.bstrap",
8523 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x08,
8524 NULL, HFILL }},
8526 { &hf_dhcp_option43_pxeclient_multicast_address,
8527 { "multicast address", "dhcp.option.vendor.pxeclient.multicast_address",
8528 FT_IPv4, BASE_NONE, NULL, 0x00,
8529 "Option 43:PXE Client 7 multicast address", HFILL }},
8531 { &hf_dhcp_option43_pxeclient_boot_servers,
8532 { "boot servers", "dhcp.option.vendor.pxeclient.boot_servers",
8533 FT_BYTES, BASE_NONE, NULL, 0x0,
8534 "Option 43:PXE Client 8 boot servers", HFILL }},
8536 { &hf_dhcp_option43_pxeclient_boot_server_type,
8537 { "Type", "dhcp.option.vendor.pxeclient.boot_servers.type",
8538 FT_UINT16, BASE_DEC, VALS(o43pxeclient_boot_server_types), 0x0,
8539 NULL, HFILL }},
8541 { &hf_dhcp_option43_pxeclient_boot_server_count,
8542 { "IP count", "dhcp.option.vendor.pxeclient.boot_servers.count",
8543 FT_UINT8, BASE_DEC, NULL, 0x0,
8544 NULL, HFILL }},
8546 { &hf_dhcp_option43_pxeclient_boot_server_ip,
8547 { "IP", "dhcp.option.vendor.pxeclient.boot_servers.ip",
8548 FT_IPv4, BASE_NONE, NULL, 0x0,
8549 NULL, HFILL }},
8551 { &hf_dhcp_option43_pxeclient_boot_menu,
8552 { "boot menu", "dhcp.option.vendor.pxeclient.boot_menu",
8553 FT_BYTES, BASE_NONE, NULL, 0x0,
8554 "Option 43:PXE Client 9 boot menu", HFILL }},
8556 { &hf_dhcp_option43_pxeclient_boot_menu_type,
8557 { "Type", "dhcp.option.vendor.pxeclient.boot_menu.type",
8558 FT_UINT16, BASE_DEC, VALS(o43pxeclient_boot_menu_types), 0x0,
8559 NULL, HFILL }},
8561 { &hf_dhcp_option43_pxeclient_boot_menu_length,
8562 { "Length", "dhcp.option.vendor.pxeclient.boot_menu.length",
8563 FT_UINT8, BASE_DEC, NULL, 0x0,
8564 NULL, HFILL }},
8566 { &hf_dhcp_option43_pxeclient_boot_menu_desc,
8567 { "Description", "dhcp.option.vendor.pxeclient.boot_menu.desc",
8568 FT_STRING, BASE_NONE, NULL, 0x0,
8569 NULL, HFILL }},
8571 { &hf_dhcp_option43_pxeclient_menu_prompt,
8572 { "menu prompt", "dhcp.option.vendor.pxeclient.menu_prompt",
8573 FT_BYTES, BASE_NONE, NULL, 0x0,
8574 "Option 43:PXE Client 10 menu prompt", HFILL }},
8576 { &hf_dhcp_option43_pxeclient_menu_prompt_timeout,
8577 { "Timeout", "dhcp.option.vendor.pxeclient.menu_prompt.timeout",
8578 FT_UINT8, BASE_DEC, NULL, 0x0,
8579 NULL, HFILL }},
8581 { &hf_dhcp_option43_pxeclient_menu_prompt_prompt,
8582 { "Prompt", "dhcp.option.vendor.pxeclient.menu_prompt.prompt",
8583 FT_STRING, BASE_NONE, NULL, 0x0,
8584 NULL, HFILL }},
8586 { &hf_dhcp_option43_pxeclient_multicast_address_alloc,
8587 { "multicast address alloc", "dhcp.option.vendor.pxeclient.multicast_address_alloc",
8588 FT_BYTES, BASE_NONE, NULL, 0x0,
8589 "Option 43:PXE Client 11 multicast address alloc", HFILL }},
8591 { &hf_dhcp_option43_pxeclient_credential_types,
8592 { "credential types", "dhcp.option.vendor.pxeclient.credential_types",
8593 FT_BYTES, BASE_NONE, NULL, 0x0,
8594 "Option 43:PXE Client 12 credential types", HFILL }},
8596 { &hf_dhcp_option43_pxeclient_boot_item,
8597 { "boot item", "dhcp.option.vendor.pxeclient.boot_item",
8598 FT_BYTES, BASE_NONE, NULL, 0x0,
8599 "Option 43:PXE Client 71 boot item", HFILL }},
8601 { &hf_dhcp_option43_pxeclient_boot_item_type,
8602 { "Type", "dhcp.option.vendor.pxeclient.boot_item.type",
8603 FT_UINT16, BASE_DEC, NULL, 0x0,
8604 NULL, HFILL }},
8606 { &hf_dhcp_option43_pxeclient_boot_item_layer,
8607 { "Layer", "dhcp.option.vendor.pxeclient.boot_item.layer",
8608 FT_BYTES, BASE_NONE, NULL, 0x0,
8609 NULL, HFILL }},
8611 { &hf_dhcp_option43_pxeclient_lcm_server,
8612 { "LCM Server Name", "dhcp.option.vendor.pxeclient.lcm_server",
8613 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8614 "Option 43:PXE Client 179 LCM Server", HFILL }},
8616 { &hf_dhcp_option43_pxeclient_lcm_domain,
8617 { "LCM Domain", "dhcp.option.vendor.pxeclient.lcm_domain",
8618 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8619 "Option 43:PXE Client 180 LCM Domain", HFILL }},
8621 { &hf_dhcp_option43_pxeclient_lcm_nic_option,
8622 { "LCM NIC option", "dhcp.option.vendor.pxeclient.lcm_nic_option",
8623 FT_BYTES, BASE_NONE, NULL, 0x0,
8624 "Option 43:PXE Client 181 LCM NIC Option", HFILL }},
8626 { &hf_dhcp_option43_pxeclient_lcm_workgroup,
8627 { "LCM Workgroup", "dhcp.option.vendor.pxeclient.lcm_workgroup",
8628 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8629 "Option 43:PXE Client 190 LCM Workgroup", HFILL }},
8631 { &hf_dhcp_option43_pxeclient_discovery,
8632 { "Discovery", "dhcp.option.vendor.pxeclient.discovery",
8633 FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x0,
8634 "Option 43:PXE Client 191 Discovery", HFILL }},
8636 { &hf_dhcp_option43_pxeclient_configured,
8637 { "Configured", "dhcp.option.vendor.pxeclient.configured",
8638 FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x0,
8639 "Option 43:PXE Client 192 Configured", HFILL }},
8641 { &hf_dhcp_option43_pxeclient_lcm_version,
8642 { "LCM Version", "dhcp.option.vendor.pxeclient.lcm_version",
8643 FT_UINT32, BASE_DEC, NULL, 0x0,
8644 "Option 43:PXE Client 193 LCM Version", HFILL }},
8646 { &hf_dhcp_option43_pxeclient_lcm_serial,
8647 { "LCM Serial Number", "dhcp.option.vendor.pxeclient.lcm_serial",
8648 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8649 "Option 43:PXE Client 194 LCM Serial Number", HFILL }},
8651 { &hf_dhcp_option43_pxeclient_end,
8652 { "PXE Client End", "dhcp.option.vendor.pxeclient.end",
8653 FT_UINT8, BASE_DEC, NULL, 0x0,
8654 "Option 43:PXE Client 255 End", HFILL }},
8657 /* AEROHIVE (Extremenetworks) vendor suboptions */
8658 { &hf_dhcp_option43_aerohive_suboption,
8659 { "Option 43 Suboption", "dhcp.option.vendor.aerohive.suboption",
8660 FT_UINT8, BASE_DEC, VALS(option43_aerohive_suboption_vals), 0x0,
8661 "Option 43:AEROHIVE Suboption", HFILL }},
8663 { &hf_dhcp_option43_aerohive_unknown,
8664 { "Unknown", "dhcp.option.vendor.aerohive.unknown",
8665 FT_BYTES, BASE_NONE, NULL, 0x0,
8666 NULL, HFILL }},
8668 { &hf_dhcp_option43_aerohive_xiqhostname,
8669 { "HM FQDN", "dhcp.option.vendor.aerohive.xiqhostname",
8670 FT_STRING, BASE_NONE, NULL, 0x0,
8671 "Hive Manager NG FQDN", HFILL }},
8673 { &hf_dhcp_option43_aerohive_xiqipaddress,
8674 { "HM IP", "dhcp.option.vendor.aerohive.xiqipaddress",
8675 FT_IPv4, BASE_NONE, NULL, 0x0,
8676 "Hive Manager NG IP address", HFILL }},
8679 { &hf_dhcp_option43_cl_suboption,
8680 { "Option 43 Suboption", "dhcp.option.vendor.cl.suboption",
8681 FT_UINT8, BASE_DEC, VALS(option43_cl_suboption_vals), 0x0,
8682 "Option 43:CL Suboption", HFILL }},
8684 { &hf_dhcp_option43_cl_padding,
8685 { "Padding", "dhcp.option.vendor.cl.padding",
8686 FT_UINT8, BASE_DEC, NULL, 0x0,
8687 "Option 43:CL 0 Padding", HFILL }},
8689 { &hf_dhcp_option43_cl_suboption_request_list,
8690 { "Suboption Request List", "dhcp.option.vendor.cl.suboption_request_list",
8691 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8692 "Option 43:CL 1 Suboption Request List", HFILL }},
8694 { &hf_dhcp_option43_cl_device_type,
8695 { "Device Type", "dhcp.option.vendor.cl.device_type",
8696 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8697 "Option 43:CL 2 Device Type", HFILL }},
8699 { &hf_dhcp_option43_cl_esafe_type,
8700 { "eSAFE Types", "dhcp.option.vendor.cl.esafe_type",
8701 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8702 "Option 43:CL 3 eSAFE Types", HFILL }},
8704 { &hf_dhcp_option43_cl_serial_number,
8705 { "Serial Number", "dhcp.option.vendor.cl.serial_number",
8706 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8707 "Option 43:CL 4 Serial Number", HFILL }},
8709 { &hf_dhcp_option43_cl_hardware_version,
8710 { "Hardware Version", "dhcp.option.vendor.cl.hardware_version",
8711 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8712 "Option 43:CL 5 Hardware Version", HFILL }},
8714 { &hf_dhcp_option43_cl_software_version,
8715 { "Software Version", "dhcp.option.vendor.cl.software_version",
8716 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8717 "Option 43:CL 6 Software Version", HFILL }},
8719 { &hf_dhcp_option43_cl_boot_rom_version,
8720 { "Boot ROM version", "dhcp.option.vendor.cl.boot_rom_version",
8721 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8722 "Option 43:CL 7 Boot ROM version", HFILL }},
8724 { &hf_dhcp_option43_cl_oui_string,
8725 { "Organizationally Unique Identifier", "dhcp.option.vendor.cl.oui_string",
8726 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8727 "Option 43:CL 8 Organizationally Unique Identifier", HFILL }},
8729 { &hf_dhcp_option43_cl_oui_bytes,
8730 { "Organizationally Unique Identifier", "dhcp.option.vendor.cl.oui_bytes",
8731 FT_BYTES, BASE_NONE, NULL, 0x0,
8732 "Option 43:CL 8 Organizationally Unique Identifier", HFILL }},
8734 { &hf_dhcp_option43_cl_model_number,
8735 { "Model Number", "dhcp.option.vendor.cl.model_number",
8736 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8737 "Option 43:CL 9 Model Number", HFILL }},
8739 { &hf_dhcp_option43_cl_vendor_name10,
8740 { "Vendor Name", "dhcp.option.vendor.cl.vendor_name10",
8741 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8742 "Option 43:CL 10 Vendor Name", HFILL }},
8744 { &hf_dhcp_option43_cl_address_realm,
8745 { "Address Realm", "dhcp.option.vendor.cl.address_realm",
8746 FT_UINT8, BASE_DEC, VALS(cablehome_subopt11_vals), 0x0,
8747 "Option 43:CL 11 Address Realm", HFILL }},
8749 { &hf_dhcp_option43_cl_cm_ps_system_desc,
8750 { "CM/PS System Description", "dhcp.option.vendor.cl.cm_ps_system_desc",
8751 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8752 "Option 43:CL 12 CM/PS System Description", HFILL }},
8754 { &hf_dhcp_option43_cl_cm_ps_firmware_revision,
8755 { "CM/PS Firmware Revision", "dhcp.option.vendor.cl.cm_ps_firmware_revision",
8756 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8757 "Option 43:CL 13 CM/PS Firmware Revision", HFILL }},
8759 { &hf_dhcp_option43_cl_firewall_policy_file_version,
8760 { "Firewall Policy File Version", "dhcp.option.vendor.cl.firewall_policy_file_version",
8761 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8762 "Option 43:CL 14 Firewall Policy File Version", HFILL }},
8764 { &hf_dhcp_option43_cl_esafe_config_file_devices,
8765 { "eSafe Config File Devices", "dhcp.option.vendor.cl.esafe_config_file_devices",
8766 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8767 "Option 43:CL 15 eSafe Config File Devices", HFILL }},
8769 { &hf_dhcp_option43_cl_video_security_tape,
8770 { "Video Security Type", "dhcp.option.vendor.cl.video_security_tape",
8771 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8772 "Option 43:CL 18 Video Security Type", HFILL }},
8774 { &hf_dhcp_option43_cl_mta_mac_address,
8775 { "MTA MAC Address", "dhcp.option.vendor.cl.mta_mac_address",
8776 FT_ETHER, BASE_NONE, NULL, 0x0,
8777 "Option 43:CL 31 MTA MAC Address", HFILL }},
8779 { &hf_dhcp_option43_cl_correlation_ID,
8780 { "Correlation ID", "dhcp.option.vendor.cl.correlation_ID",
8781 FT_UINT32, BASE_DEC, NULL, 0x0,
8782 "Option 43: CL 32 Correlation ID", HFILL }},
8784 { &hf_dhcp_option43_cl_vendor_name51,
8785 { "Vendor Name", "dhcp.option.vendor.cl.vendor_name51",
8786 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8787 "Option 43:CL 51 Vendor Name", HFILL }},
8789 { &hf_dhcp_option43_cl_cablecard_capability,
8790 { "CableCARD Capability", "dhcp.option.vendor.cl.cablecard_capability",
8791 FT_BYTES, BASE_NONE, NULL, 0x0,
8792 "Option 43:CL 52 CableCARD Capability", HFILL }},
8794 { &hf_dhcp_option43_cl_device_id_ca,
8795 { "Device Identification (CA)", "dhcp.option.vendor.cl.device_id_ca",
8796 FT_BYTES, BASE_NONE, NULL, 0x0,
8797 "Option 43:CL 53 Device Identification (CA)", HFILL }},
8799 { &hf_dhcp_option43_cl_device_id_x509,
8800 { "Device Identification (X.509)", "dhcp.option.vendor.cl.device_id_x509",
8801 FT_STRINGZ, BASE_NONE, NULL, 0x0,
8802 "Option 43:CL 54 Device Identification (X.509)", HFILL }},
8804 { &hf_dhcp_option43_cl_end,
8805 { "CL End", "dhcp.option.vendor.cl.end",
8806 FT_UINT8, BASE_DEC, NULL, 0x0,
8807 "Option 43:CL 255 End", HFILL }},
8810 { &hf_dhcp_option43_alcatel_suboption,
8811 { "Option 43 Suboption", "dhcp.option.vendor.alu.suboption",
8812 FT_UINT8, BASE_DEC, VALS(option43_alcatel_suboption_vals), 0x0,
8813 "Option 43:Alcatel Suboption", HFILL }},
8815 { &hf_dhcp_option43_alcatel_padding,
8816 { "Padding", "dhcp.option.vendor.alu.padding",
8817 FT_UINT8, BASE_DEC, NULL, 0x0,
8818 "Option 43:Alcatel 0 Padding", HFILL }},
8820 { &hf_dhcp_option43_alcatel_vlan_id,
8821 { "Voice VLAN ID", "dhcp.option.vendor.alu.vid",
8822 FT_UINT16, BASE_DEC, NULL, 0x0,
8823 "Option 43:Alcatel 58 Voice VLAN ID", HFILL }},
8825 { &hf_dhcp_option43_alcatel_tftp1,
8826 { "Spatial Redundancy TFTP1", "dhcp.option.vendor.alu.tftp1",
8827 FT_IPv4, BASE_NONE, NULL, 0x0,
8828 "Option 43:Alcatel 64 Spatial Redundancy TFTP1", HFILL }},
8830 { &hf_dhcp_option43_alcatel_tftp2,
8831 { "Spatial Redundancy TFTP2", "dhcp.option.vendor.alu.tftp2",
8832 FT_IPv4, BASE_NONE, NULL, 0x0,
8833 "Option 43:Alcatel 65 Spatial Redundancy TFTP2", HFILL }},
8835 { &hf_dhcp_option43_alcatel_app_type,
8836 { "Application Type", "dhcp.option.vendor.alu.app_type",
8837 FT_UINT8, BASE_DEC, VALS(option43_alcatel_app_type_vals), 0x0,
8838 "Option 43:Alcatel 66 Application Type", HFILL }},
8840 { &hf_dhcp_option43_alcatel_sip_url,
8841 { "SIP URL", "dhcp.option.vendor.alu.sip_url",
8842 FT_STRING, BASE_NONE, NULL, 0x0,
8843 "Option 43:Alcatel 67 SIP URL", HFILL }},
8845 { &hf_dhcp_option43_alcatel_end,
8846 { "Alcatel End", "dhcp.option.vendor.alu.end",
8847 FT_UINT8, BASE_DEC, NULL, 0x0,
8848 "Option 43:Alcatel 255 End", HFILL }},
8850 { &hf_dhcp_option43_arubaap_controllerip,
8851 { "Aruba Controller IP", "dhcp.option.vendor.arubaap.controllerip",
8852 FT_STRING, BASE_NONE, NULL, 0x0,
8853 "Address IP of Aruba controller", HFILL }},
8855 { &hf_dhcp_option43_arubaiap,
8856 { "Aruba Instant AP", "dhcp.option.vendor.arubaiap",
8857 FT_STRING, BASE_NONE, NULL, 0x0,
8858 "nameorg,amp-ip-address,password", HFILL }},
8860 { &hf_dhcp_option43_arubaiap_nameorg,
8861 { "Name Organisation", "dhcp.option.vendor.arubaiap.name_org",
8862 FT_STRING, BASE_NONE, NULL, 0x0,
8863 NULL, HFILL }},
8865 { &hf_dhcp_option43_arubaiap_ampip,
8866 { "AMP IP Address", "dhcp.option.vendor.arubaiap.amp_ip",
8867 FT_STRING, BASE_NONE, NULL, 0x0,
8868 "Address IP of Airwave server (AMP)", HFILL }},
8870 { &hf_dhcp_option43_arubaiap_password,
8871 { "Password", "dhcp.option.vendor.arubaiap.password",
8872 FT_STRING, BASE_NONE, NULL, 0x0,
8873 "Password for Instant AP Airwave server (AMP)", HFILL }},
8876 { &hf_dhcp_option43_bsdp_suboption,
8877 { "Option 43 Suboption", "dhcp.option.vendor.bsdp.suboption",
8878 FT_UINT8, BASE_DEC, VALS(option43_cl_suboption_vals), 0x0,
8879 "Option 43:BSDP Suboption", HFILL }},
8881 { &hf_dhcp_option43_bsdp_message_type,
8882 { "Message Type", "dhcp.option.vendor.bsdp.message_type",
8883 FT_UINT8, BASE_DEC, VALS(o43_bsdp_message_type_vals), 0x0,
8884 NULL, HFILL }},
8886 { &hf_dhcp_option43_bsdp_version,
8887 { "Version", "dhcp.option.vendor.bsdp.version",
8888 FT_UINT16, BASE_HEX, NULL, 0x0,
8889 NULL, HFILL }},
8891 { &hf_dhcp_option43_bsdp_server_identifier,
8892 { "Server Identifier", "dhcp.option.vendor.bsdp.server_identifier",
8893 FT_IPv4, BASE_NONE, NULL, 0x0,
8894 NULL, HFILL }},
8896 { &hf_dhcp_option43_bsdp_server_priority,
8897 { "Server Priority", "dhcp.option.vendor.bsdp.server_priority",
8898 FT_UINT16, BASE_DEC, NULL, 0x0,
8899 NULL, HFILL }},
8901 { &hf_dhcp_option43_bsdp_reply_port,
8902 { "Reply Port", "dhcp.option.vendor.bsdp.reply_port",
8903 FT_UINT16, BASE_DEC, NULL, 0x0,
8904 NULL, HFILL }},
8906 { &hf_dhcp_option43_bsdp_boot_image_list_path,
8907 { "Boot Image List Path", "dhcp.option.vendor.bsdp.boot_image_list_path",
8908 FT_STRING, BASE_NONE, NULL, 0x0,
8909 NULL, HFILL }},
8911 { &hf_dhcp_option43_bsdp_boot_image_index,
8912 { "Boot Image Index", "dhcp.option.vendor.bsdp.boot_image.index",
8913 FT_UINT16, BASE_HEX, NULL, 0x0,
8914 NULL, HFILL }},
8916 { &hf_dhcp_option43_bsdp_default_boot_image_id,
8917 { "Default Boot Image ID", "dhcp.option.vendor.bsdp.default_boot_image_id",
8918 FT_UINT32, BASE_HEX, NULL, 0x0,
8919 NULL, HFILL }},
8921 { &hf_dhcp_option43_bsdp_selected_boot_image_id,
8922 { "Selected Boot Image ID", "dhcp.option.vendor.bsdp.selected_boot_image_id",
8923 FT_UINT32, BASE_HEX, NULL, 0x0,
8924 NULL, HFILL }},
8926 { &hf_dhcp_option43_bsdp_boot_image_list,
8927 { "Boot Image List", "dhcp.option.vendor.bsdp.boot_image_list",
8928 FT_BYTES, BASE_NONE, NULL, 0x0,
8929 NULL, HFILL }},
8931 { &hf_dhcp_option43_bsdp_image_desc,
8932 { "Boot Image Description", "dhcp.option.vendor.bsdp.boot_image.desc",
8933 FT_BYTES, BASE_NONE, NULL, 0x0,
8934 NULL, HFILL }},
8936 { &hf_dhcp_option43_bsdp_boot_image_name_len,
8937 { "Boot Image Name Length", "dhcp.option.vendor.bsdp.boot_image.name_len",
8938 FT_UINT8, BASE_DEC, NULL, 0x0,
8939 NULL, HFILL }},
8941 { &hf_dhcp_option43_bsdp_boot_image_name,
8942 { "Boot Image Name", "dhcp.option.vendor.bsdp.boot_image.name",
8943 FT_STRING, BASE_NONE, NULL, 0x0,
8944 NULL, HFILL }},
8946 { &hf_dhcp_option43_bsdp_netboot_firmware,
8947 { "NetBoot 1.0 Firmware", "dhcp.option.vendor.bsdp.netboot_firmware",
8948 FT_NONE, BASE_NONE, NULL, 0x0,
8949 NULL, HFILL }},
8951 { &hf_dhcp_option43_bsdp_attributes_filter_list,
8952 { "Boot Image Attributes Filter List", "dhcp.option.vendor.bsdp.attributes_filter_list",
8953 FT_BYTES, BASE_NONE, NULL, 0x0,
8954 NULL, HFILL }},
8956 { &hf_dhcp_option43_bsdp_boot_image_attribute,
8957 { "Boot Image Attribute", "dhcp.option.vendor.bsdp.boot_image.attribute",
8958 FT_UINT16, BASE_HEX, NULL, 0x0,
8959 NULL, HFILL }},
8961 { &hf_dhcp_option43_bsdp_boot_image_attribute_install,
8962 { "Install", "dhcp.option.vendor.bsdp.boot_image.attribute.install",
8963 FT_UINT16, BASE_HEX, VALS(o43_bsdp_boot_image_install_vals), 0x8000,
8964 "Boot Image Attribute Install", HFILL }},
8966 { &hf_dhcp_option43_bsdp_boot_image_attribute_kind,
8967 { "Kind", "dhcp.option.vendor.bsdp.boot_image.attribute.kind",
8968 FT_UINT16, BASE_HEX, VALS(o43_bsdp_boot_image_kind_vals), 0x7f00,
8969 "Boot Image Attribute Kind", HFILL }},
8971 { &hf_dhcp_option43_bsdp_boot_image_attribute_reserved,
8972 { "Reserved", "dhcp.option.vendor.bsdp.boot_image.attribute.reserved",
8973 FT_UINT16, BASE_HEX, NULL, 0x00ff,
8974 "Boot Image Attribute Reserved", HFILL }},
8976 { &hf_dhcp_option43_bsdp_message_size,
8977 { "Message Size", "dhcp.option.vendor.bsdp.message_size",
8978 FT_UINT16, BASE_DEC, NULL, 0x0,
8979 NULL, HFILL }},
8982 { &hf_dhcp_option_netbios_over_tcpip_name_server,
8983 { "NetBIOS over TCP/IP Name Server", "dhcp.option.netbios_over_tcpip_name_server",
8984 FT_IPv4, BASE_NONE, NULL, 0x00,
8985 "Option 44: NetBIOS over TCP/IP Name Server", HFILL }},
8987 { &hf_dhcp_option_netbios_over_tcpip_dd_name_server,
8988 { "NetBIOS over TCP/IP Datagram Distribution Name Server", "dhcp.option.netbios_over_tcpip_dd_name_server",
8989 FT_IPv4, BASE_NONE, NULL, 0x00,
8990 "Option 45: NetBIOS over TCP/IP Datagram Distribution Name Server", HFILL }},
8992 { &hf_dhcp_option_netbios_over_tcpip_node_type,
8993 { "NetBIOS over TCP/IP Node Type", "dhcp.option.netbios_over_tcpip_node_type",
8994 FT_UINT8, BASE_DEC, VALS(dhcp_nbnt_vals), 0x0,
8995 "Option 46: NetBIOS over TCP/IP Node Type", HFILL }},
8997 { &hf_dhcp_option_netbios_over_tcpip_scope,
8998 { "NetBIOS over TCP/IP Scope", "dhcp.option.netbios_over_tcpip_scope",
8999 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9000 "Option 47: NetBIOS over TCP/IP Scope", HFILL }},
9002 { &hf_dhcp_option_xwindows_system_font_server,
9003 { "X Window System Font Server", "dhcp.option.xwindows_system_font_server",
9004 FT_IPv4, BASE_NONE, NULL, 0x00,
9005 "Option 48: X Window System Font Server", HFILL }},
9007 { &hf_dhcp_option_xwindows_system_display_manager,
9008 { "X Window System Display Manager", "dhcp.option.xwindows_system_display_manager",
9009 FT_IPv4, BASE_NONE, NULL, 0x00,
9010 "Option 49: X Window System Display Manager", HFILL }},
9012 { &hf_dhcp_option_requested_ip_address,
9013 { "Requested IP Address", "dhcp.option.requested_ip_address",
9014 FT_IPv4, BASE_NONE, NULL, 0x00,
9015 "Option 50: Requested IP Address", HFILL }},
9017 { &hf_dhcp_option_ip_address_lease_time,
9018 { "IP Address Lease Time", "dhcp.option.ip_address_lease_time",
9019 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
9020 "Option 51: IP Address Lease Time", HFILL }},
9022 { &hf_dhcp_option_option_overload,
9023 { "Option Overload", "dhcp.option.option_overload",
9024 FT_UINT8, BASE_DEC, VALS(opt_overload_vals), 0x0,
9025 "Option 52: Option Overload", HFILL }},
9027 { &hf_dhcp_option_dhcp,
9028 { "DHCP", "dhcp.option.dhcp",
9029 FT_UINT8, BASE_DEC, VALS(opt53_text), 0x0,
9030 "Option 53: DHCP option", HFILL }},
9032 { &hf_dhcp_option_dhcp_server_id,
9033 { "DHCP Server Identifier", "dhcp.option.dhcp_server_id",
9034 FT_IPv4, BASE_NONE, NULL, 0x00,
9035 "Option 54: DHCP Server Identifier", HFILL }},
9037 { &hf_dhcp_option_parameter_request_list_item,
9038 { "Parameter Request List Item", "dhcp.option.request_list_item",
9039 FT_UINT8, BASE_DEC, NULL, 0x0,
9040 "Option 55: Parameter Request List Item", HFILL }},
9042 { &hf_dhcp_option_message,
9043 { "Message", "dhcp.option.message",
9044 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9045 "Option 56: Option message", HFILL }},
9047 { &hf_dhcp_option_dhcp_max_message_size,
9048 { "Maximum DHCP Message Size", "dhcp.option.dhcp_max_message_size",
9049 FT_UINT16, BASE_DEC, NULL, 0x0,
9050 "Option 57: Maximum DHCP Message Size", HFILL }},
9052 { &hf_dhcp_option_renewal_time_value,
9053 { "Renewal Time Value", "dhcp.option.renewal_time_value",
9054 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
9055 "Option 58: Renewal Time Value", HFILL }},
9057 { &hf_dhcp_option_rebinding_time_value,
9058 { "Rebinding Time Value", "dhcp.option.rebinding_time_value",
9059 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
9060 "Option 59: Rebinding Time Value", HFILL }},
9062 { &hf_dhcp_option_vendor_class_id,
9063 { "Vendor class identifier", "dhcp.option.vendor_class_id",
9064 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9065 "Option 60: Vendor class identifier", HFILL }},
9067 { &hf_dhcp_option_vendor_class_data,
9068 { "vendor-class-data", "dhcp.option.vendor_class_data",
9069 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9070 "Option 60: Vendor class data", HFILL }},
9072 { &hf_dhcp_option_novell_netware_ip_domain,
9073 { "Novell/Netware IP domain", "dhcp.option.novell_netware_ip_domain",
9074 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9075 "Option 62: Novell/Netware IP domain", HFILL }},
9077 { &hf_dhcp_option63_suboption,
9078 { "Option 63 Suboption", "dhcp.option.novell_options.suboption",
9079 FT_UINT8, BASE_DEC, VALS(option63_suboption_vals), 0x0,
9080 "Option 63: Suboption", HFILL }},
9082 { &hf_dhcp_option63_value,
9083 { "Value", "dhcp.option.novell_options.value",
9084 FT_BYTES, BASE_NONE, NULL, 0x0,
9085 "Option 63: Suboption value", HFILL }},
9087 { &hf_dhcp_option63_value_8,
9088 { "Value", "dhcp.option.novell_options.value.uint",
9089 FT_UINT8, BASE_DEC, NULL, 0x0,
9090 "Option 63: Suboption 8-bit value", HFILL }},
9092 { &hf_dhcp_option63_value_ip_address,
9093 { "Value", "dhcp.option.novell_options.value.address",
9094 FT_IPv4, BASE_NONE, NULL, 0x00,
9095 "Option 63: Suboption IP address", HFILL }},
9097 { &hf_dhcp_option63_value_boolean,
9098 { "Value", "dhcp.option.novell_options.value.bool",
9099 FT_BOOLEAN, BASE_NONE, NULL, 0x00,
9100 "Option 63: Suboption Boolean value", HFILL }},
9102 { &hf_dhcp_option63_broadcast,
9103 { "Broadcast for nearest Netware server", "dhcp.option.novell_options.broadcast",
9104 FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x00,
9105 "Option 63:5 Broadcast for nearest Netware server", HFILL }},
9107 { &hf_dhcp_option63_preferred_dss_server,
9108 { "Preferred DSS server", "dhcp.option.novell_options.preferred_dss_server",
9109 FT_IPv4, BASE_NONE, NULL, 0x00,
9110 "Option 63:6 Preferred DSS server", HFILL }},
9112 { &hf_dhcp_option63_nearest_nwip_server,
9113 { "Nearest NWIP server", "dhcp.option.novell_options.nearest_nwip_server",
9114 FT_IPv4, BASE_NONE, NULL, 0x00,
9115 "Option 63:7 Nearest NWIP server", HFILL }},
9117 { &hf_dhcp_option63_autoretries,
9118 { "Autoretries", "dhcp.option.novell_options.autoretries",
9119 FT_UINT8, BASE_DEC, NULL, 0x0,
9120 "Option 63:8 Autoretries", HFILL }},
9122 { &hf_dhcp_option63_autoretry_delay,
9123 { "Autoretry delay, sec",
9124 "dhcp.option.novell_options.autoretry_delay", FT_UINT8, BASE_DEC, NULL,
9125 0x0, "Option 63:9 Autoretry delay, sec", HFILL }},
9127 { &hf_dhcp_option63_support_netware_v1_1,
9128 { "Broadcast for nearest Netware server", "dhcp.option.novell_options.support_netware_v1_1",
9129 FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x00,
9130 "Option 63:10 Broadcast for nearest Netware server", HFILL }},
9132 { &hf_dhcp_option63_primary_dss,
9133 { "Primary DSS", "dhcp.option.novell_options.primary_dss",
9134 FT_IPv4, BASE_NONE, NULL, 0x00,
9135 "Option 63:11 Primary DSS", HFILL }},
9138 { &hf_dhcp_option_nis_plus_domain,
9139 { "Network Information Service+ Domain", "dhcp.option.nis_plus_domain",
9140 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9141 "Option 64: Network Information Service+ Domain", HFILL }},
9143 { &hf_dhcp_option_nis_plus_server,
9144 { "Network Information Service+ Server", "dhcp.option.nis_plus_server",
9145 FT_IPv4, BASE_NONE, NULL, 0x00,
9146 "Option 65: Network Information Service+ Server", HFILL }},
9148 { &hf_dhcp_option_tftp_server_name,
9149 { "TFTP Server Name", "dhcp.option.tftp_server_name",
9150 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9151 "Option 66: TFTP Server Name", HFILL }},
9153 { &hf_dhcp_option_bootfile_name,
9154 { "Bootfile name", "dhcp.option.bootfile_name",
9155 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9156 "Option 67: Bootfile name", HFILL }},
9158 { &hf_dhcp_option_mobile_ip_home_agent,
9159 { "Mobile IP Home Agent", "dhcp.option.mobile_ip_home_agent",
9160 FT_IPv4, BASE_NONE, NULL, 0x00,
9161 "Option 68: Mobile IP Home Agent", HFILL }},
9163 { &hf_dhcp_option_smtp_server,
9164 { "SMTP Server", "dhcp.option.smtp_server",
9165 FT_IPv4, BASE_NONE, NULL, 0x00,
9166 "Option 69: SMTP Server", HFILL }},
9168 { &hf_dhcp_option_pop3_server,
9169 { "POP3 Server", "dhcp.option.pop3_server",
9170 FT_IPv4, BASE_NONE, NULL, 0x00,
9171 "Option 70: POP3 Server", HFILL }},
9173 { &hf_dhcp_option_nntp_server,
9174 { "NNTP Server", "dhcp.option.nntp_server",
9175 FT_IPv4, BASE_NONE, NULL, 0x00,
9176 "Option 71: NNTP Server", HFILL }},
9178 { &hf_dhcp_option_default_www_server,
9179 { "Default WWW Server", "dhcp.option.default_www_server",
9180 FT_IPv4, BASE_NONE, NULL, 0x00,
9181 "Option 72: Default WWW Server", HFILL }},
9183 { &hf_dhcp_option_default_finger_server,
9184 { "Default Finger Server", "dhcp.option.default_finger_server",
9185 FT_IPv4, BASE_NONE, NULL, 0x00,
9186 "Option 73: Default Finger Server", HFILL }},
9188 { &hf_dhcp_option_default_irc_server,
9189 { "Default IRC Server", "dhcp.option.default_irc_server",
9190 FT_IPv4, BASE_NONE, NULL, 0x00,
9191 "Option 74: Default IRC Server", HFILL }},
9193 { &hf_dhcp_option_streettalk_server,
9194 { "StreetTalk Server", "dhcp.option.streettalk_server",
9195 FT_IPv4, BASE_NONE, NULL, 0x00,
9196 "Option 75: StreetTalk Server", HFILL }},
9198 { &hf_dhcp_option_streettalk_da_server,
9199 { "StreetTalk Directory Assistance Server", "dhcp.option.streettalk_da_server",
9200 FT_IPv4, BASE_NONE, NULL, 0x00,
9201 "Option 76: StreetTalk Directory Assistance Server", HFILL }},
9203 { &hf_dhcp_option77_user_class,
9204 { "Instance of User Class", "dhcp.option.user_class",
9205 FT_UINT8, BASE_DEC, NULL, 0x0,
9206 NULL, HFILL }},
9208 { &hf_dhcp_option77_user_class_length,
9209 { "User Class Length", "dhcp.option.user_class.length",
9210 FT_UINT8, BASE_DEC, NULL, 0x0,
9211 "Length of User Class Instance", HFILL }},
9213 { &hf_dhcp_option77_user_class_data,
9214 { "User Class Data", "dhcp.option.user_class.data",
9215 FT_BYTES, BASE_NONE, NULL, 0x0,
9216 "Data of User Class Instance", HFILL }},
9218 { &hf_dhcp_option77_user_class_text,
9219 { "User Class Data (Text)", "dhcp.option.user_class.text",
9220 FT_STRING, BASE_NONE, NULL, 0x0,
9221 "Text of User Class Instance", HFILL }},
9223 { &hf_dhcp_option77_user_class_binary_data_length,
9224 { "User Class Binary Data Length", "dhcp.option.user_class_binary_data_length",
9225 FT_UINT16, BASE_DEC, NULL, 0x0,
9226 "Length of User Class Binary Data (Microsoft)", HFILL }},
9228 { &hf_dhcp_option77_user_class_binary_data,
9229 { "User Class Binary Data", "dhcp.option.user_class_binary_data",
9230 FT_STRING, BASE_NONE, NULL, 0x0,
9231 "User Class Binary Data (Microsoft)", HFILL }},
9233 { &hf_dhcp_option77_user_class_padding,
9234 { "User Class padding", "dhcp.option.user_class_padding",
9235 FT_BYTES, BASE_NONE, NULL, 0x0,
9236 "User Class padding (Microsoft)", HFILL }},
9238 { &hf_dhcp_option77_user_class_name_length,
9239 { "User Class Name Length", "dhcp.option.user_class_name_length",
9240 FT_UINT16, BASE_DEC, NULL, 0x0,
9241 "Length of User Class Name (Microsoft)", HFILL }},
9243 { &hf_dhcp_option77_user_class_name,
9244 { "User Class Name", "dhcp.option.user_class_name",
9245 FT_STRINGZPAD, BASE_NONE, NULL, 0x0,
9246 "User Class Name (Microsoft)", HFILL }},
9248 { &hf_dhcp_option77_user_class_description_length,
9249 { "User Class Description Length", "dhcp.option.user_class_description_length",
9250 FT_UINT16, BASE_DEC, NULL, 0x0,
9251 "Length of User Class Description (Microsoft)", HFILL }},
9253 { &hf_dhcp_option77_user_class_description,
9254 { "User Class Description", "dhcp.option.user_class_description",
9255 FT_STRINGZPAD, BASE_NONE, NULL, 0x0,
9256 "User Class Description (Microsoft)", HFILL }},
9258 { &hf_dhcp_option_slp_directory_agent_value,
9259 { "Value", "dhcp.option.slp_directory_agent.value",
9260 FT_UINT8, BASE_DEC, VALS(slpda_vals), 0x0,
9261 "Option 78: SLPDA Value", HFILL }},
9263 { &hf_dhcp_option_slp_directory_agent_slpda_address,
9264 { "IP Address", "dhcp.option.slp_directory_agent.slpda_address",
9265 FT_IPv4, BASE_NONE, NULL, 0x00,
9266 "Option 78: SLPDA Address", HFILL }},
9268 { &hf_dhcp_option_slp_service_scope_value,
9269 { "Value", "dhcp.option.slp_service_scope.value",
9270 FT_UINT8, BASE_DEC, VALS(slp_scope_vals), 0x0,
9271 "Option 79: SLP Service Scope Value", HFILL }},
9273 { &hf_dhcp_option_slp_service_scope_string,
9274 { "SLP Service Scope", "dhcp.option.slp_service_scope.string",
9275 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9276 "Option 79: SLP Service Scope", HFILL }},
9279 { &hf_dhcp_option82_suboption,
9280 { "Option 82 Suboption", "dhcp.option.agent_information_option.suboption",
9281 FT_UINT8, BASE_DEC, VALS(option82_suboption_vals), 0x0,
9282 "Option 82: Suboption", HFILL }},
9284 { &hf_dhcp_option82_value,
9285 { "Value", "dhcp.option.agent_information_option.value",
9286 FT_BYTES, BASE_NONE, NULL, 0x0,
9287 "Option 82: Suboption value", HFILL }},
9289 { &hf_dhcp_option82_value_8,
9290 { "Value", "dhcp.option.agent_information_option.value.uint",
9291 FT_UINT8, BASE_DEC, NULL, 0x0,
9292 "Option 82: Suboption 8-bit value", HFILL }},
9294 { &hf_dhcp_option82_value_16,
9295 { "Value", "dhcp.option.agent_information_option.value.uint",
9296 FT_UINT16, BASE_DEC, NULL, 0x0,
9297 "Option 162: Suboption 16-bit value", HFILL }},
9299 { &hf_dhcp_option82_value_32,
9300 { "Value", "dhcp.option.agent_information_option.value.uint",
9301 FT_UINT32, BASE_DEC, NULL, 0x0,
9302 "Option 82: Suboption 32-bit value", HFILL }},
9304 { &hf_dhcp_option82_value_ip_address,
9305 { "Value", "dhcp.option.agent_information_option.value.address",
9306 FT_IPv4, BASE_NONE, NULL, 0x00,
9307 "Option 82: Suboption IP address", HFILL }},
9309 { &hf_dhcp_option82_value_stringz,
9310 { "Value", "dhcp.option.agent_information_option.value.string",
9311 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9312 "Option 82: Suboption Z-String value", HFILL }},
9314 { &hf_dhcp_option82_padding,
9315 { "Padding", "dhcp.option.agent_information_option.padding",
9316 FT_UINT8, BASE_DEC, NULL, 0x0,
9317 "Option 82:0 Padding", HFILL }},
9319 { &hf_dhcp_option82_agent_circuit_id,
9320 { "Agent Circuit ID", "dhcp.option.agent_information_option.agent_circuit_id",
9321 FT_BYTES, BASE_NONE, NULL, 0x0,
9322 "Option 82:1 Agent Circuit ID", HFILL }},
9324 { &hf_dhcp_option82_agent_remote_id,
9325 { "Agent Remote ID", "dhcp.option.agent_information_option.agent_remote_id",
9326 FT_BYTES, BASE_NONE, NULL, 0x0,
9327 "Option 82:2 Agent Remote ID", HFILL }},
9329 { &hf_dhcp_option82_reserved,
9330 { "Reserved", "dhcp.option.agent_information_option.reserved",
9331 FT_BYTES, BASE_NONE, NULL, 0x0,
9332 "Option 82:3 Reserved", HFILL }},
9334 { &hf_dhcp_option82_docsis_device_class,
9335 { "DOCSIS Device Class", "dhcp.option.agent_information_option.docsis_device_class",
9336 FT_UINT32, BASE_HEX, NULL, 0x0,
9337 "Option 82:4 DOCSIS Device Class", HFILL }},
9339 { &hf_dhcp_option82_link_selection,
9340 { "Link selection", "dhcp.option.agent_information_option.link_selection",
9341 FT_IPv4, BASE_NONE, NULL, 0x00,
9342 "Option 82:5 Link selection", HFILL }},
9344 { &hf_dhcp_option82_subscriber_id,
9345 { "Subscriber ID", "dhcp.option.agent_information_option.subscriber_id",
9346 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9347 "Option 82:6 Subscriber ID", HFILL }},
9349 { &hf_dhcp_option82_radius_attributes,
9350 { "RADIUS Attributes", "dhcp.option.agent_information_option.radius_attributes",
9351 FT_BYTES, BASE_NONE, NULL, 0x0,
9352 "Option 82:7 RADIUS Attributes", HFILL }},
9354 { &hf_dhcp_option82_authentication,
9355 { "Authentication", "dhcp.option.agent_information_option.authentication",
9356 FT_BYTES, BASE_NONE, NULL, 0x0,
9357 "Option 82:8 Authentication", HFILL }},
9359 { &hf_dhcp_option82_vi,
9360 { "Vendor-Specific Information", "dhcp.option.agent_information_option.vi",
9361 FT_BYTES, BASE_NONE, NULL, 0x0,
9362 "Option 82:9 Vendor-Specific Information", HFILL }},
9364 { &hf_dhcp_option82_vi_enterprise,
9365 { "Enterprise", "dhcp.option.agent_information_option.vi.enterprise",
9366 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0,
9367 "Option 82:9 VI Enterprise", HFILL }},
9369 { &hf_dhcp_option82_vi_data_length,
9370 { "Data Length", "dhcp.option.agent_information_option.vi.data_length",
9371 FT_UINT8, BASE_DEC, NULL, 0x0,
9372 "Option 82:9 VI Data Length", HFILL }},
9374 { &hf_dhcp_option82_vi_cl_option,
9375 { "Option", "dhcp.option.agent_information_option.vi.cl.option",
9376 FT_UINT8, BASE_DEC, NULL, 0x0,
9377 "Option 82:9 VI CL Option", HFILL }},
9379 { &hf_dhcp_option82_vi_cl_option_length,
9380 { "Option Length", "dhcp.option.agent_information_option.vi.cl.option_length",
9381 FT_UINT8, BASE_DEC, NULL, 0x0,
9382 "Option 82:9 VI CL Option Length", HFILL }},
9384 { &hf_dhcp_option82_vi_cl_tag,
9385 { "Tag", "dhcp.option.agent_information_option.vi.cl.tag",
9386 FT_UINT8, BASE_DEC, VALS(option82_cl_tag_vals), 0x0,
9387 "Option 82:9 VI CL Tag", HFILL }},
9389 { &hf_dhcp_option82_vi_cl_tag_length,
9390 { "Tag Length", "dhcp.option.agent_information_option.vi.cl.tag_length",
9391 FT_UINT8, BASE_DEC, NULL, 0x0,
9392 "Option 82:9 VI CL Tag Length", HFILL }},
9394 { &hf_dhcp_option82_vi_cl_docsis_version,
9395 { "DOCSIS Version Number", "dhcp.option.agent_information_option.vi.cl.docsis_version",
9396 FT_UINT16, BASE_HEX, NULL, 0x0,
9397 "Option 82:9 VI CL DOCSIS Version Number", HFILL }},
9399 { &hf_dhcp_option82_vi_cl_dpoe_system_version,
9400 { "DPoE System Version Number", "dhcp.option.agent_information_option.vi.cl.dpoe_system_version",
9401 FT_UINT16, BASE_HEX, NULL, 0x0,
9402 "Option 82:9 VI CL DPoE System Version Number", HFILL }},
9404 { &hf_dhcp_option82_vi_cl_dpoe_system_pbb_service,
9405 { "DPoE System PBB Service", "dhcp.option.agent_information_option.vi.cl.dpoe_system_pbb_service",
9406 FT_BYTES, BASE_NONE, NULL, 0x0,
9407 "Option 82:9 VI CL DPoE System PBB Service", HFILL }},
9409 { &hf_dhcp_option82_vi_cl_service_class_name,
9410 { "Service Class Name", "dhcp.option.agent_information_option.vi.cl.service_class_name",
9411 FT_STRING, BASE_NONE, NULL, 0x0,
9412 "Option 82:9 VI CL Service Class Name", HFILL }},
9414 { &hf_dhcp_option82_vi_cl_mso_defined_text,
9415 { "MSO Defined Text", "dhcp.option.agent_information_option.vi.cl.mso_defined_text",
9416 FT_STRING, BASE_NONE, NULL, 0x0,
9417 "Option 82:9 VI CL MSO Defined Text", HFILL }},
9419 { &hf_dhcp_option82_vi_cl_secure_file_transfer_uri,
9420 { "Secure File Transfer URI", "dhcp.option.agent_information_option.vi.cl.secure_file_transfer_uri",
9421 FT_STRING, BASE_NONE, NULL, 0x0,
9422 "Option 82:9 VI CL Secure File Transfer URI", HFILL }},
9424 { &hf_dhcp_option82_flags,
9425 { "Flags", "dhcp.option.agent_information_option.flags",
9426 FT_UINT8, BASE_HEX, NULL, 0x0,
9427 "Option 82:10 Flags", HFILL }},
9429 { &hf_dhcp_option82_server_id_override,
9430 { "Server ID Override", "dhcp.option.agent_information_option.server_id_override",
9431 FT_IPv4, BASE_NONE, NULL, 0x00,
9432 "Option 82:11 Server ID Override", HFILL }},
9434 { &hf_dhcp_option82_relay_agent_id,
9435 { "Relay Agent Identifier", "dhcp.option.agent_information_option.relay_agent_id",
9436 FT_BYTES, BASE_NONE, NULL, 0x00,
9437 "Option 82:12 Relay Agent Identifier", HFILL }},
9439 { &hf_dhcp_option82_option_ani_att,
9440 { "Access Technology Type", "dhcp.option.agent_information_option.ani_att",
9441 FT_UINT8, BASE_DEC, NULL, 0x00,
9442 "Option 82:13 Access Technology Type", HFILL }},
9444 { &hf_dhcp_option82_option_ani_att_res,
9445 { "Access Technology Type", "dhcp.option.agent_information_option.ani_att.res",
9446 FT_UINT8, BASE_DEC, NULL, 0x00,
9447 "Option 82:13 Access Technology Type Reserved", HFILL }},
9449 { &hf_dhcp_option82_option_ani_att_att,
9450 { "Access Technology Type", "dhcp.option.agent_information_option.ani_att.att",
9451 FT_UINT8, BASE_DEC, NULL, 0x00,
9452 "Option 82:13 Access Technology Type Value", HFILL }},
9454 { &hf_dhcp_option82_option_ani_network_name,
9455 { "Access Network Name", "dhcp.option.agent_information_option.ani_network_name",
9456 FT_STRING, BASE_NONE, NULL, 0x00,
9457 "Option 82:14 Access Network Name", HFILL }},
9459 { &hf_dhcp_option82_option_ani_ap_name,
9460 { "Access Point Name", "dhcp.option.agent_information_option.ani_ap_name",
9461 FT_STRING, BASE_NONE, NULL, 0x00,
9462 "Option 82:15 Access Point Name", HFILL }},
9464 { &hf_dhcp_option82_option_ani_ap_bssid,
9465 { "Access Point BSSID", "dhcp.option.agent_information_option.ani_ap_bssid",
9466 FT_ETHER, BASE_NONE, NULL, 0x0,
9467 "Option 82:16 Access Point BSSID", HFILL }},
9469 { &hf_dhcp_option82_option_ani_operator_id,
9470 { "Access Network Operator ID", "dhcp.option.agent_information_option.ani_operator_id",
9471 FT_BYTES, BASE_NONE, NULL, 0x00,
9472 "Option 82:17 Access Network Operator ID", HFILL }},
9474 { &hf_dhcp_option82_option_ani_operator_realm,
9475 { "Access Network Operator Realm", "dhcp.option.agent_information_option.ani_operator_realm",
9476 FT_STRING, BASE_NONE, NULL, 0x00,
9477 "Option 82:18 Access Network Operator Realm", HFILL }},
9479 { &hf_dhcp_option82_option_source_port,
9480 { "Source Port", "dhcp.option.agent_information_option.source_port",
9481 FT_NONE, BASE_NONE, NULL, 0x00,
9482 "Option 82:19 Source Port", HFILL }},
9484 { &hf_dhcp_option82_link_selection_cisco,
9485 { "Link selection (Cisco proprietary)", "dhcp.option.agent_information_option.link_selection_cisco",
9486 FT_IPv4, BASE_NONE, NULL, 0x00,
9487 "Option 82:150 Link selection (Cisco proprietary)", HFILL }},
9489 { &hf_dhcp_option82_vrf_name_vpn_id,
9490 { "VRF name/VPN ID", "dhcp.option.agent_information_option.vrf_name.vpn_id",
9491 FT_BYTES, BASE_NONE, NULL, 0x00,
9492 "Option 82:151 VRF name/VPN ID", HFILL }},
9494 { &hf_dhcp_option82_vrf_name_global,
9495 { "Global, default VPN", "dhcp.option.agent_information_option.vrf_name.global",
9496 FT_UINT8, BASE_DEC, NULL, 0x00,
9497 "Option 82:151 Global, default VPN", HFILL }},
9499 { &hf_dhcp_option82_vrf_name,
9500 { "VRF name", "dhcp.option.agent_information_option.vrf_name",
9501 FT_STRING, BASE_NONE, NULL, 0x00,
9502 "Option 82:151 VRF name", HFILL }},
9504 { &hf_dhcp_option82_vrf_name_vpn_id_oui,
9505 { "VRF name/VPN ID OUI", "dhcp.option.agent_information_option.vrf_name.vpn_id.oui",
9506 FT_UINT24, BASE_HEX, NULL, 0x00,
9507 "Option 82:151 VRF name/VPN ID OUI", HFILL }},
9509 { &hf_dhcp_option82_vrf_name_vpn_id_index,
9510 { "VRF name/VPN ID Index", "dhcp.option.agent_information_option.vrf_name.vpn_id.index",
9511 FT_UINT32, BASE_HEX, NULL, 0x00,
9512 "Option 82:151 VRF name/VPN ID Index", HFILL }},
9514 { &hf_dhcp_option82_server_id_override_cisco,
9515 { "Server ID Override (Cisco proprietary)", "dhcp.option.agent_information_option.server_id_override_cisco",
9516 FT_IPv4, BASE_NONE, NULL, 0x00,
9517 "Option 82:152 Server ID Override (Cisco proprietary)", HFILL }},
9520 { &hf_dhcp_option_isns_functions,
9521 { "iSNS Functions", "dhcp.option.isns.functions",
9522 FT_UINT16, BASE_HEX, NULL, 0x00,
9523 "iSNS: the functions supported by the iSNS servers", HFILL }},
9525 { &hf_dhcp_option_isns_functions_enabled,
9526 { "Function Fields Enabled", "dhcp.option.isns.functions.enabled",
9527 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_FUNCTIONS_ENABLED,
9528 "If set to zero, then the contents of all other iSNS Function fields MUST be ignored", HFILL }},
9530 { &hf_dhcp_option_isns_functions_dd_authorization,
9531 { "Discovery Domain based Authorization", "dhcp.option.isns.functions.dd_base_authorization",
9532 FT_BOOLEAN, 16, TFS(&tfs_isns_function_dd_based_auth), F_ISNS_FUNCTIONS_DD_AUTH,
9533 "If set to zero, then access authorization must be explicitly performed by each device", HFILL }},
9535 { &hf_dhcp_option_isns_functions_sec_policy_distibution,
9536 { "Security Policy Distribution", "dhcp.option.isns.functions.sec_policy_distribution",
9537 FT_BOOLEAN, 16, TFS(&tfs_isns_functions_sec_distrib), F_ISNS_FUNCTIONS_SEC_POLICY,
9538 NULL, HFILL }},
9540 { &hf_dhcp_option_isns_functions_reserved,
9541 { "Reserved flags", "dhcp.option.isns.functions.reserved",
9542 FT_UINT16, BASE_HEX, NULL, F_ISNS_FUNCTIONS_RESERVED,
9543 NULL, HFILL }},
9545 { &hf_dhcp_option_isns_discovery_domain_access,
9546 { "Discovery Domain Access flags", "dhcp.option.isns.discovery_domain_access",
9547 FT_UINT16, BASE_HEX, NULL, 0x00,
9548 "iSNS: the types of iSNS clients that are allowed to modify Discovery Domains", HFILL }},
9550 { &hf_dhcp_option_isns_discovery_domain_access_enabled,
9551 { "Discovery Domain Enabled", "dhcp.option.isns.discovery_domain_access.enabled",
9552 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_ENABLED,
9553 "If set to zero, then the contents of the remainder of this field MUST be ignored", HFILL }},
9555 { &hf_dhcp_option_isns_discovery_domain_access_control_node,
9556 { "Control Node", "dhcp.option.isns.discovery_domain_access_control.node",
9557 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_CTRL_NODE,
9558 NULL, HFILL }},
9560 { &hf_dhcp_option_isns_discovery_domain_access_iscsi_target,
9561 { "iSCSI Target", "dhcp.option.isns.discovery_domain_access.iscsi_target",
9562 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_ISCSI_TARGET,
9563 NULL, HFILL }},
9565 { &hf_dhcp_option_isns_discovery_domain_access_iscsi_inititator,
9566 { "iSCSI Initiator", "dhcp.option.isns.discovery_domain_access.iscsi_initiator",
9567 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_ISCSI_INITIATOR,
9568 NULL, HFILL }},
9570 { &hf_dhcp_option_isns_discovery_domain_access_ifcp_target_port,
9571 { "iFCP Target Port", "dhcp.option.isns.discovery_domain_access.ifcp_target_port",
9572 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_IFCP_TARGET_PORT,
9573 NULL, HFILL }},
9575 { &hf_dhcp_option_isns_discovery_domain_access_ifcp_initiator_port,
9576 { "iFCP Initiator Port", "dhcp.option.isns.discovery_domain_access.initiator_target_port",
9577 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_DD_ACCESS_IFCP_INITIATOR_PORT,
9578 NULL, HFILL }},
9580 { &hf_dhcp_option_isns_discovery_domain_access_reserved,
9581 { "Reserved Flags", "dhcp.option.isns.discovery_domain_access.reserved",
9582 FT_UINT16, BASE_HEX, NULL, F_ISNS_DD_ACCESS_RESERVED,
9583 NULL, HFILL }},
9585 { &hf_dhcp_option_isns_administrative_flags,
9586 { "Administrative Flags", "dhcp.option.isns.administrative_flags",
9587 FT_UINT16, BASE_HEX, NULL, 0x00,
9588 "iSNS: administrative settings for the iSNS servers discovered through the DHCP query", HFILL }},
9590 { &hf_dhcp_option_isns_administrative_flags_enabled,
9591 { "Administrative Flags Enabled", "dhcp.option.isns.administrative_flags.enabled",
9592 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_ENABLED,
9593 NULL, HFILL }},
9595 { &hf_dhcp_option_isns_administrative_flags_heartbeat,
9596 { "Heartbeat", "dhcp.option.isns.administrative_flags.heartbeat",
9597 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_HEARTBEAT,
9598 NULL, HFILL }},
9600 { &hf_dhcp_option_isns_administrative_flags_management_scns,
9601 { "Management SCNs", "dhcp.option.isns.administrative_flags.management_scns",
9602 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_MANAGEMENT_SCNS,
9603 NULL, HFILL }},
9605 { &hf_dhcp_option_isns_administrative_flags_default_dd,
9606 { "Default Discovery Domain", "dhcp.option.isns.administrative_flags.default_discovery_domain",
9607 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_ADMIN_FLAGS_DEFAULT_DD,
9608 NULL, HFILL }},
9610 { &hf_dhcp_option_isns_administrative_flags_reserved,
9611 { "Reserved Flags", "dhcp.option.isns.administrative_flags.reserved",
9612 FT_UINT16, BASE_HEX, NULL, F_ISNS_ADMIN_FLAGS_RESERVED,
9613 NULL, HFILL }},
9615 { &hf_dhcp_option_isns_server_security_bitmap,
9616 { "iSNS Server Security Bitmap", "dhcp.option.isns.server_security_bitmap",
9617 FT_UINT32, BASE_HEX, NULL, 0x00,
9618 "iSNS: server security settings", HFILL }},
9620 { &hf_dhcp_option_isns_server_security_bitmap_enabled,
9621 { "Server Security Bitmap Enabled", "dhcp.option.isns.server_security_bitmap.enabled",
9622 FT_BOOLEAN, 16, TFS(&tfs_yes_no), F_ISNS_SRV_SEC_BITMAP_ENABLED,
9623 NULL, HFILL }},
9625 { &hf_dhcp_option_isns_server_security_bitmap_ike_ipsec_enabled,
9626 { "IKE/IPSec", "dhcp.option.isns.server_security_bitmap.ike_ipsec_enabled",
9627 FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_IKE_IPSEC,
9628 NULL, HFILL }},
9630 { &hf_dhcp_option_isns_server_security_bitmap_main_mode,
9631 { "Main Mode", "dhcp.option.isns.server_security_bitmap.main_mode",
9632 FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_MAIN_MODE,
9633 NULL, HFILL }},
9635 { &hf_dhcp_option_isns_server_security_bitmap_aggressive_mode,
9636 { "Aggressive Mode", "dhcp.option.isns.server_security_bitmap.aggressive_mode",
9637 FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_AGGRESSIVE,
9638 NULL, HFILL }},
9640 { &hf_dhcp_option_isns_server_security_bitmap_pfs,
9641 { "PFS", "dhcp.option.isns.server_security_bitmap.pfs",
9642 FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), F_ISNS_SRV_SEC_BITMAP_PFS,
9643 NULL, HFILL }},
9645 { &hf_dhcp_option_isns_server_security_bitmap_transport_mode,
9646 { "Transport Mode", "dhcp.option.isns.server_security_bitmap.transport_mode",
9647 FT_BOOLEAN, 16, TFS(&tfs_preferred_no_preference), F_ISNS_SRV_SEC_BITMAP_TRASPORT_MODE,
9648 NULL, HFILL }},
9650 { &hf_dhcp_option_isns_server_security_bitmap_tunnel_mode,
9651 { "Tunnel Mode", "dhcp.option.isns.server_security_bitmap.tunnel_mode",
9652 FT_BOOLEAN, 16, TFS(&tfs_preferred_no_preference), F_ISNS_SRV_SEC_BITMAP_TUNNEL_MODE,
9653 NULL, HFILL }},
9655 { &hf_dhcp_option_isns_server_security_bitmap_reserved,
9656 { "Reserved Flags", "dhcp.option.isns.server_security_bitmap.reserved",
9657 FT_UINT16, BASE_HEX, NULL, F_ISNS_SRV_SEC_BITMAP_RESERVED,
9658 NULL, HFILL }},
9660 { &hf_dhcp_option_isns_primary_server_addr,
9661 { "Primary Server Address", "dhcp.option.isns.primary_server_addr",
9662 FT_IPv4, BASE_NONE, NULL, 0x00,
9663 "iSNS: IP address of the primary server", HFILL }},
9665 { &hf_dhcp_option_isns_heartbeat_originator_addr,
9666 { "Heartbeat Originator Address", "dhcp.option.isns.heartbeat_originator_addr",
9667 FT_IPv4, BASE_NONE, NULL, 0x00,
9668 "iSNS: IP address from which the iSNS heartbeat originates", HFILL }},
9670 { &hf_dhcp_option_isns_secondary_server_addr_list,
9671 { "Secondary Server Address", "dhcp.option.isns.secondary_server_addr",
9672 FT_IPv4, BASE_NONE, NULL, 0x00,
9673 "iSNS: a list of IP addresses of the secondary iSNS servers", HFILL }},
9676 { &hf_dhcp_option_novell_dss_string,
9677 { "Novell Directory Services Servers String", "dhcp.option.novell_dss.string",
9678 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9679 "Option 85: Novell Directory Services Servers String", HFILL }},
9681 { &hf_dhcp_option_novell_dss_ip,
9682 { "IP Address", "dhcp.option.novell_dss.ip",
9683 FT_IPv4, BASE_NONE, NULL, 0x00,
9684 "Option 85: Novell Directory Services Servers IP Address", HFILL }},
9686 { &hf_dhcp_option_novell_ds_tree_name,
9687 { "Novell Directory Services Tree Name", "dhcp.option.novell_ds_tree_name",
9688 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9689 "Option 86: Novell Directory Services Tree Name", HFILL }},
9691 { &hf_dhcp_option_novell_ds_context,
9692 { "Novell Directory Services Context", "dhcp.option.novell_ds_context",
9693 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9694 "Option 87: Novell Directory Services Context", HFILL }},
9696 { &hf_dhcp_option_dhcp_authentication_protocol,
9697 { "Protocol", "dhcp.option.dhcp_authentication.protocol",
9698 FT_UINT8, BASE_DEC, VALS(authen_protocol_vals), 0x0,
9699 "Option 90: Authentication Protocol", HFILL }},
9701 { &hf_dhcp_option_dhcp_authentication_alg_delay,
9702 { "Delay Algorithm", "dhcp.option.dhcp_authentication.alg_delay",
9703 FT_UINT8, BASE_DEC, VALS(authen_da_algo_vals), 0x0,
9704 "Option 90: Delayed Authentication Algorithm", HFILL }},
9706 { &hf_dhcp_option_dhcp_authentication_algorithm,
9707 { "Algorithm", "dhcp.option.dhcp_authentication.algorithm",
9708 FT_UINT8, BASE_DEC, NULL, 0x0,
9709 "Option 90: Authentication Algorithm", HFILL }},
9711 { &hf_dhcp_option_dhcp_authentication_rdm,
9712 { "Replay Detection Method", "dhcp.option.dhcp_authentication.rdm",
9713 FT_UINT8, BASE_DEC, VALS(authen_rdm_vals), 0x0,
9714 "Option 90: Replay Detection Method", HFILL }},
9716 { &hf_dhcp_option_dhcp_authentication_rdm_replay_detection,
9717 { "RDM Replay Detection Value", "dhcp.option.dhcp_authentication.rdm_replay_detection",
9718 FT_UINT64, BASE_HEX, NULL, 0x0,
9719 "Option 90: RDM Replay Detection Value", HFILL }},
9721 { &hf_dhcp_option_dhcp_authentication_rdm_rdv,
9722 { "Replay Detection Value", "dhcp.option.dhcp_authentication.rdm_rdv",
9723 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9724 "Option 90: Replay Detection Value", HFILL }},
9726 { &hf_dhcp_option_dhcp_authentication_secret_id,
9727 { "Secret ID", "dhcp.option.dhcp_authentication.secret_id",
9728 FT_UINT32, BASE_HEX, NULL, 0x0,
9729 "Option 90: Secret ID", HFILL }},
9731 { &hf_dhcp_option_dhcp_authentication_hmac_md5_hash,
9732 { "HMAC MD5 Hash", "dhcp.option.dhcp_authentication.hmac_md5_hash",
9733 FT_BYTES, BASE_NONE, NULL, 0x0,
9734 "Option 90: HMAC MD5 Hash", HFILL }},
9736 { &hf_dhcp_option_dhcp_authentication_information,
9737 { "Authentication Information", "dhcp.option.dhcp_authentication.information",
9738 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9739 "Option 90: Authentication Information", HFILL }},
9741 { &hf_dhcp_option_client_last_transaction_time,
9742 { "Client last transaction time", "dhcp.option.client_last_transaction_time",
9743 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
9744 "Option 91: Client last transaction time", HFILL }},
9746 { &hf_dhcp_option_associated_ip_option,
9747 { "Associated IP option", "dhcp.option.associated_ip_option",
9748 FT_IPv4, BASE_NONE, NULL, 0x00,
9749 "Option 92: Associated IP option", HFILL }},
9751 { &hf_dhcp_option_client_system_architecture,
9752 { "Client System Architecture", "dhcp.option.client_system_architecture",
9753 FT_UINT16, BASE_DEC, VALS(dhcp_client_arch), 0x0,
9754 "Option 93: Client System Architecture", HFILL }},
9756 { &hf_dhcp_option_client_network_id_major_ver,
9757 { "Major Version", "dhcp.client_network_id_major",
9758 FT_UINT8, BASE_DEC, NULL, 0x0,
9759 "Option 94: Major Version", HFILL }},
9761 { &hf_dhcp_option_client_network_id_minor_ver,
9762 { "Minor Version", "dhcp.client_network_id_minor",
9763 FT_UINT8, BASE_DEC, NULL, 0x0,
9764 "Option 94: Minor Version", HFILL }},
9766 { &hf_dhcp_option_civic_location_what,
9767 { "What", "dhcp.option.civic_location.what",
9768 FT_UINT8, BASE_DEC, VALS(civic_address_what_values), 0x0,
9769 "Option 99: What", HFILL }},
9771 { &hf_dhcp_option_civic_location_country,
9772 { "Country", "dhcp.option.civic_location.country",
9773 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9774 "Option 99: Country", HFILL }},
9776 { &hf_dhcp_option_civic_location_ca_type,
9777 { "CA Type", "dhcp.option.civic_location.ca_type",
9778 FT_UINT8, BASE_DEC, VALS(civic_address_type_values), 0x0,
9779 "Option 99: CA Type", HFILL }},
9781 { &hf_dhcp_option_civic_location_ca_length,
9782 { "CA Length", "dhcp.option.civic_location.ca_length",
9783 FT_UINT8, BASE_DEC, NULL, 0x0,
9784 "Option 99: CA Length", HFILL }},
9786 { &hf_dhcp_option_civic_location_ca_value,
9787 { "CA Value", "dhcp.option.civic_location.ca_value",
9788 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9789 "Option 99: CA Value", HFILL }},
9791 { &hf_dhcp_option_tz_pcode,
9792 { "TZ PCode", "dhcp.option.tz_pcode",
9793 FT_STRING, BASE_NONE, NULL, 0x0,
9794 "Option 100: TZ PCode", HFILL }},
9796 { &hf_dhcp_option_tz_tcode,
9797 { "TZ TCode", "dhcp.option.tz_tcode",
9798 FT_STRING, BASE_NONE, NULL, 0x0,
9799 "Option 101: TZ TCode", HFILL }},
9801 { &hf_dhcp_option_ipv6_only_preferred_wait_time,
9802 { "IPv6-Only Preferred wait time", "dhcp.option.ipv6only_preferred_wait_time",
9803 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
9804 "Option 108: IPv6-Only Preferred wait time", HFILL }},
9806 { &hf_dhcp_option_netinfo_parent_server_address,
9807 { "NetInfo Parent Server Address", "dhcp.option.netinfo_parent_server_address",
9808 FT_IPv4, BASE_NONE, NULL, 0x00,
9809 "Option 112: NetInfo Parent Server Address", HFILL }},
9811 { &hf_dhcp_option_netinfo_parent_server_tag,
9812 { "NetInfo Parent Server Tag", "dhcp.option.netinfo_parent_server_tag",
9813 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9814 "Option 113: NetInfo Parent Server Tag", HFILL }},
9816 { &hf_dhcp_option_dhcp_auto_configuration,
9817 { "DHCP Auto-Configuration", "dhcp.option.dhcp_auto_configuration",
9818 FT_UINT8, BASE_DEC, VALS(dhcp_autoconfig), 0x0,
9819 "Option 116: DHCP Auto-Configuration", HFILL }},
9821 { &hf_dhcp_option_dhcp_name_service_search_option,
9822 { "Name Service", "dhcp.option.dhcp_name_service_search_option",
9823 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9824 "Option 117: Name Service", HFILL }},
9826 { &hf_dhcp_option_dhcp_dns_domain_search_list_fqdn,
9827 { "FQDN", "dhcp.option.dhcp_dns_domain_search_list_fqdn",
9828 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9829 "Option 119: FQDN", HFILL }},
9831 { &hf_dhcp_option_sip_server_enc,
9832 { "SIP Server Encoding", "dhcp.option.sip_server.encoding",
9833 FT_UINT8, BASE_DEC, VALS(sip_server_enc_vals), 0x0,
9834 "Option 120: SIP Server encoding", HFILL }},
9836 { &hf_dhcp_option_sip_server_name,
9837 { "SIP Server Name", "dhcp.option.sip_server.name",
9838 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9839 "Option 120: SIP Server Name", HFILL }},
9841 { &hf_dhcp_option_sip_server_address,
9842 { "SIP Server Address", "dhcp.option.sip_server.address",
9843 FT_IPv4, BASE_NONE, NULL, 0x0,
9844 "Option 120: SIP Server Address", HFILL }},
9846 { &hf_dhcp_option_classless_static_route,
9847 { "Subnet/MaskWidth-Router", "dhcp.option.classless_static_route",
9848 FT_BYTES, BASE_NONE, NULL, 0x0,
9849 "Option 121: Subnet/MaskWidth-Router", HFILL }},
9851 { &hf_dhcp_option_rfc3825_error,
9852 { "Error", "dhcp.option.rfc3825.error",
9853 FT_UINT8, BASE_DEC, VALS(rfc3825_error_types), 0x0,
9854 "Option 123: Error", HFILL }},
9856 { &hf_dhcp_option_rfc3825_latitude,
9857 { "Latitude", "dhcp.option.rfc3825.latitude",
9858 FT_DOUBLE, BASE_NONE, NULL, 0x0,
9859 "Option 123: Latitude", HFILL }},
9861 { &hf_dhcp_option_rfc3825_longitude,
9862 { "Longitude", "dhcp.option.rfc3825.longitude",
9863 FT_DOUBLE, BASE_NONE, NULL, 0x0,
9864 "Option 123: Longitude", HFILL }},
9866 { &hf_dhcp_option_rfc3825_latitude_res,
9867 { "Latitude resolution", "dhcp.option.rfc3825.latitude_res",
9868 FT_DOUBLE, BASE_NONE, NULL, 0x0,
9869 "Option 123: Latitude resolution", HFILL }},
9871 { &hf_dhcp_option_rfc3825_longitude_res,
9872 { "Longitude resolution", "dhcp.option.rfc3825.longitude_res",
9873 FT_DOUBLE, BASE_NONE, NULL, 0x0,
9874 "Option 123: Longitude resolution", HFILL }},
9876 { &hf_dhcp_option_rfc3825_altitude,
9877 { "Altitude", "dhcp.option.rfc3825.altitude",
9878 FT_DOUBLE, BASE_NONE, NULL, 0x0,
9879 "Option 123: Altitude", HFILL }},
9881 { &hf_dhcp_option_rfc3825_altitude_res,
9882 { "Altitude resolution", "dhcp.option.rfc3825.altitude_res",
9883 FT_DOUBLE, BASE_NONE, NULL, 0x0,
9884 "Option 123: Altitude resolution", HFILL }},
9886 { &hf_dhcp_option_rfc3825_altitude_type,
9887 { "Altitude type", "dhcp.option.rfc3825.altitude_type",
9888 FT_UINT8, BASE_DEC, VALS(altitude_type_values), 0x0,
9889 "Option 123: Altitude type", HFILL }},
9891 { &hf_dhcp_option_rfc3825_map_datum,
9892 { "Map Datum", "dhcp.option.rfc3825.map_datum",
9893 FT_UINT8, BASE_DEC, VALS(map_datum_type_values), 0x0,
9894 "Option 123: Map Datum", HFILL }},
9896 { &hf_dhcp_option_cl_dss_id_option,
9897 { "DSS_ID Type", "dhcp.option.cl_dss_id.option",
9898 FT_UINT8, BASE_DEC, VALS(cl_dss_id_type_vals), 0x0,
9899 "Option 123:CL DSS_ID Type", HFILL }},
9901 { &hf_dhcp_option_cl_dss_id_len,
9902 { "DSS_ID Length", "dhcp.option.cl_dss_id.len",
9903 FT_UINT8, BASE_DEC, NULL, 0x0,
9904 "Option 123:CL DSS_ID Length", HFILL }},
9906 { &hf_dhcp_option_cl_dss_id,
9907 { "Country", "dhcp.option.cl_dss_id",
9908 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9909 "Option 123:CL DSS_ID", HFILL }},
9911 { &hf_dhcp_option_vi_class_cl_address_mode,
9912 { "CableLab Address Mode", "dhcp.option.vi_class.cl_address_mode",
9913 FT_UINT8, BASE_DEC, VALS(cablelab_ipaddr_mode_vals), 0x0,
9914 "Option 124: CableLab Address Mode", HFILL }},
9916 { &hf_dhcp_option_vi_class_enterprise,
9917 { "Enterprise", "dhcp.option.vi_class.enterprise",
9918 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x00,
9919 "Option 124: Enterprise", HFILL }},
9921 { &hf_dhcp_option_vi_class_data_length,
9922 { "Length", "dhcp.option.vi_class.length",
9923 FT_UINT8, BASE_DEC, NULL, 0x0,
9924 "Option 124: Length", HFILL }},
9926 { &hf_dhcp_option_vi_class_data_item_length,
9927 { "Length", "dhcp.option.vi_class.vendor_class_data.item.length",
9928 FT_UINT8, BASE_DEC, NULL, 0x0,
9929 "Option 124: Length", HFILL }},
9931 { &hf_dhcp_option_vi_class_data_item_data,
9932 { "Data", "dhcp.option.vi_class.vendor_class_data.item.data",
9933 FT_BYTES, BASE_NONE, NULL, 0x0,
9934 "Option 124: Data", HFILL }},
9936 { &hf_dhcp_option125_enterprise,
9937 { "Enterprise", "dhcp.option.vi.enterprise",
9938 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x00,
9939 "Option 125: Enterprise", HFILL }},
9941 { &hf_dhcp_option125_length,
9942 { "Length", "dhcp.option.vi.length",
9943 FT_UINT8, BASE_DEC, NULL, 0x00,
9944 "Option 125: Length", HFILL }},
9946 { &hf_dhcp_option125_value,
9947 { "Value", "dhcp.option.vi.value",
9948 FT_BYTES, BASE_NONE, NULL, 0x0,
9949 "Option 125: Suboption value", HFILL }},
9951 { &hf_dhcp_option125_value_8,
9952 { "Value", "dhcp.option.vi.value.uint",
9953 FT_UINT8, BASE_DEC, NULL, 0x0,
9954 "Option 125: Suboption 8-bit value", HFILL }},
9956 { &hf_dhcp_option125_value_16,
9957 { "Value", "dhcp.option.vi.value.uint",
9958 FT_UINT16, BASE_DEC, NULL, 0x0,
9959 "Option 125: Suboption 16-bit value", HFILL }},
9961 { &hf_dhcp_option125_value_ip_address,
9962 { "Value", "dhcp.option.vi.value.address",
9963 FT_IPv4, BASE_NONE, NULL, 0x00,
9964 "Option 125: Suboption IP address value", HFILL }},
9966 { &hf_dhcp_option125_value_stringz,
9967 { "Value", "dhcp.option.vi.value.string",
9968 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9969 "Option 125: Suboption Z-String value", HFILL }},
9971 { &hf_dhcp_option125_tr111_suboption,
9972 { "Option 125 Suboption", "dhcp.option.vi.tr111.suboption",
9973 FT_UINT8, BASE_DEC, VALS(option125_tr111_suboption_vals), 0x0,
9974 "Option 125:TR 111 Suboption", HFILL }},
9976 { &hf_dhcp_option125_tr111_device_manufacturer_oui,
9977 { "DeviceManufacturerOUI", "dhcp.option.vi.tr111.device_manufacturer_oui",
9978 FT_UINT24, BASE_OUI, NULL, 0x0,
9979 "Option 125:TR 111 1 DeviceManufacturerOUI", HFILL }},
9981 { &hf_dhcp_option125_tr111_device_serial_number,
9982 { "DeviceSerialNumber", "dhcp.option.vi.tr111.device_serial_number",
9983 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9984 "Option 125:TR 111 2 DeviceSerialNumber", HFILL }},
9986 { &hf_dhcp_option125_tr111_device_product_class,
9987 { "DeviceProductClass", "dhcp.option.vi.tr111.device_product_class",
9988 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9989 "Option 125:TR 111 3 DeviceProductClass", HFILL }},
9991 { &hf_dhcp_option125_tr111_gateway_manufacturer_oui,
9992 { "GatewayManufacturerOUI", "dhcp.option.vi.tr111.gateway_manufacturer_oui",
9993 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9994 "Option 125:TR 111 4 GatewayManufacturerOUI", HFILL }},
9996 { &hf_dhcp_option125_tr111_gateway_serial_number,
9997 { "GatewaySerialNumber", "dhcp.option.vi.tr111.gateway_serial_number",
9998 FT_STRINGZ, BASE_NONE, NULL, 0x0,
9999 "Option 125:TR 111 5 GatewaySerialNumber", HFILL }},
10001 { &hf_dhcp_option125_tr111_gateway_product_class,
10002 { "GatewayProductClass", "dhcp.option.vi.tr111.gateway_product_class",
10003 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10004 "Option 125:TR 111 6 GatewayProductClass", HFILL }},
10006 { &hf_dhcp_option125_cl_suboption,
10007 { "Option 125 Suboption", "dhcp.option.vi.cl.suboption",
10008 FT_UINT8, BASE_DEC, VALS(option125_cl_suboption_vals), 0x0,
10009 "Option 125:CL Suboption", HFILL }},
10011 { &hf_dhcp_option125_cl_option_request,
10012 { "Option Request", "dhcp.option.vi.cl.option_request",
10013 FT_BYTES, SEP_SPACE, NULL, 0x0,
10014 "Option 125:CL 1 Option Request", HFILL }},
10016 { &hf_dhcp_option125_cl_tftp_server_addresses,
10017 { "TFTP Server Addresses", "dhcp.option.vi.cl.tftp_server_addresses",
10018 FT_IPv4, BASE_NONE, NULL, 0x00,
10019 "Option 125:CL 2 TFTP Server Addresses", HFILL }},
10021 { &hf_dhcp_option125_cl_erouter_container_option,
10022 { "eRouter Container Option", "dhcp.option.vi.cl.erouter_container_option",
10023 FT_BYTES, BASE_NONE, NULL, 0x0,
10024 "Option 125:CL 3 eRouter Container Option", HFILL }},
10026 { &hf_dhcp_option125_cl_mib_environment_indicator_option,
10027 { "MIB Environment Indicator Option", "dhcp.option.vi.cl.mib_environment_indicator_option",
10028 FT_UINT8, BASE_DEC, VALS(pkt_mib_env_ind_opt_vals), 0x0,
10029 "Option 125:CL 4 MIB Environment Indicator Option", HFILL }},
10031 { &hf_dhcp_option125_cl_modem_capabilities,
10032 { "Modem Capabilities", "dhcp.option.vi.cl.modem_capabilities",
10033 FT_BYTES, BASE_NONE, NULL, 0x0,
10034 "Option 125:CL 5 Modem Capabilities", HFILL }},
10036 { &hf_dhcp_option_subnet_selection_option,
10037 { "Subnet Selection Option", "dhcp.option.subnet_selection_option",
10038 FT_IPv4, BASE_NONE, NULL, 0x00,
10039 "Option 118: Subnet Selection Option", HFILL }},
10041 { &hf_dhcp_option_pana_agent,
10042 { "PAA IPv4 Address", "dhcp.option.pana_agent",
10043 FT_IPv4, BASE_NONE, NULL, 0x0,
10044 "Protocol for Carrying Authentication for Network Access (PANA) Authentication Agents IPv4 Address", HFILL }},
10046 { &hf_dhcp_option_lost_server_domain_name,
10047 { "LoST Server Domain Name", "dhcp.option.lost_server_domain_name",
10048 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10049 "Option 137: LoST Server Domain Name", HFILL }},
10051 { &hf_dhcp_option_capwap_access_controller,
10052 { "CAPWAP Access Controllers", "dhcp.option.capwap_access_controller",
10053 FT_IPv4, BASE_NONE, NULL, 0x00,
10054 "Option 138: CAPWAP Access Controllers", HFILL }},
10056 { &hf_dhcp_option_andsf_server,
10057 { "ANDSF Server", "dhcp.option.andsf_server",
10058 FT_IPv4, BASE_NONE, NULL, 0x00,
10059 "ANDSF (Access Network Discovery and Selection Function) Server", HFILL }},
10061 { &hf_dhcp_option_forcerenew_nonce_algo,
10062 { "Algorithm", "dhcp.option.forcerenew_nonce.algorithm",
10063 FT_UINT8, BASE_DEC, VALS(forcerenew_nonce_algo_vals), 0x00,
10064 "Forcenew Nonce Algorithm", HFILL }},
10066 { &hf_dhcp_option_rdnss_reserved,
10067 { "Reserved", "dhcp.option.rdnss.reserved",
10068 FT_UINT8, BASE_HEX, NULL, 0xfc,
10069 "RDNSS Reserved", HFILL }},
10071 { &hf_dhcp_option_rdnss_pref,
10072 { "Preference", "dhcp.option.rdnss.preference",
10073 FT_UINT8, BASE_DEC, VALS(rdnss_pref_vals), 0x03,
10074 "RDNSS (Recursive DNS Server) Preference", HFILL }},
10076 { &hf_dhcp_option_rdnss_prim_dns_server,
10077 { "Primary DNS", "dhcp.option.rdnss.primary_dns",
10078 FT_IPv4, BASE_NONE, NULL, 0x00,
10079 "RDNSS Primary DNS-recursive-name-server's IPv4 address", HFILL }},
10081 { &hf_dhcp_option_rdnss_sec_dns_server,
10082 { "Secondary DNS", "dhcp.option.rdnss.secondary_dns",
10083 FT_IPv4, BASE_NONE, NULL, 0x00,
10084 "RDNSS Secondary DNS-recursive-name-server's IPv4 address", HFILL }},
10086 { &hf_dhcp_option_rdnss_domain,
10087 { "Domains and networks", "dhcp.option.rdnss.domain",
10088 FT_STRING, BASE_NONE, NULL, 0x00,
10089 "RDNSS Domains and networks", HFILL }},
10091 { &hf_dhcp_option_dots_ri,
10092 { "DOTS Reference Identifier", "dhcp.option.dots.ri",
10093 FT_STRING, BASE_NONE, NULL, 0x00,
10094 "Peer DOTS Agent name", HFILL }},
10096 { &hf_dhcp_option_dots_address,
10097 { "DOTS Address", "dhcp.option.dots.address",
10098 FT_IPv4, BASE_NONE, NULL, 0x00,
10099 "Peer DOTS Agent Address", HFILL }},
10101 { &hf_dhcp_option_tftp_server_address,
10102 { "TFTP Server Address", "dhcp.option.tftp_server_address",
10103 FT_IPv4, BASE_NONE, NULL, 0x00,
10104 "Option 150: TFTP Server Address", HFILL }},
10106 { &hf_dhcp_option_bulk_lease_status_code,
10107 { "Status Code", "dhcp.option.bulk_lease.status_code",
10108 FT_UINT8, BASE_DEC, VALS(bulk_lease_dhcp_status_code_vals), 0x00,
10109 "DHCPv4 Bulk Leasequery Status Code", HFILL }},
10111 { &hf_dhcp_option_bulk_lease_status_message,
10112 { "Status Code Message", "dhcp.option.bulk_lease.status_code_message",
10113 FT_STRING, BASE_NONE, NULL, 0x00,
10114 "DHCPv4 Bulk Leasequery Status Code Message", HFILL }},
10116 { &hf_dhcp_option_bulk_lease_base_time,
10117 { "Base Time", "dhcp.option.bulk_lease.base_time",
10118 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x00,
10119 "DHCPv4 Bulk Leasequery Base Time", HFILL }},
10121 { &hf_dhcp_option_bulk_lease_start_time_of_state,
10122 { "Start Time Of State", "dhcp.option.bulk_lease.start_time_of_state",
10123 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
10124 "DHCPv4 Bulk Leasequery Start Time Of State", HFILL }},
10126 { &hf_dhcp_option_bulk_lease_query_start,
10127 { "Query Start Time", "dhcp.option.bulk_lease.query_start_time",
10128 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x00,
10129 "DHCPv4 Bulk Leasequery Query Start Time", HFILL }},
10131 { &hf_dhcp_option_bulk_lease_query_end,
10132 { "Query End Time", "dhcp.option.bulk_lease.query_end_time",
10133 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x00,
10134 "DHCPv4 Bulk Leasequery Query End Time", HFILL }},
10136 { &hf_dhcp_option_bulk_lease_dhcp_state,
10137 { "Dhcp State", "dhcp.option.bulk_lease.dhcp_state",
10138 FT_UINT8, BASE_DEC, VALS(bulk_lease_dhcp_state_vals), 0x00,
10139 "DHCPv4 Bulk Leasequery Dhcp State", HFILL }},
10141 { &hf_dhcp_option_bulk_lease_data_source,
10142 { "Data Source", "dhcp.option.bulk_lease.data_source",
10143 FT_BOOLEAN, BASE_NONE, TFS(&tfs_bulk_lease_data_source), 0x00,
10144 "DHCPv4 Bulk Leasequery Data Source", HFILL }},
10146 { &hf_dhcp_option_pcp_list_length,
10147 { "List-Length", "dhcp.option.pcp.list_length",
10148 FT_UINT8, BASE_DEC, NULL, 0x0,
10149 "Port Control Protocol (PCP) List Length", HFILL }},
10151 { &hf_dhcp_option_pcp_server,
10152 { "PCP Server", "dhcp.option.pcp.server",
10153 FT_IPv4, BASE_NONE, NULL, 0x0,
10154 "Port Control Protocol (PCP) Server", HFILL }},
10156 { &hf_dhcp_option_portparams_offset,
10157 { "Offset", "dhcp.option.portparams.offset",
10158 FT_UINT8, BASE_DEC, NULL, 0x0,
10159 "Port Set ID (PSID) offset", HFILL }},
10161 { &hf_dhcp_option_portparams_psid_length,
10162 { "PSID-Length", "dhcp.option.portparams.psid_length",
10163 FT_UINT8, BASE_DEC, NULL, 0x0,
10164 "Port Set ID (PSID) Length", HFILL }},
10166 { &hf_dhcp_option_portparams_psid,
10167 { "PSID", "dhcp.option.portparams.psid",
10168 FT_BYTES, BASE_NONE, NULL, 0x0,
10169 "Port Set ID (PSID)", HFILL }},
10171 { &hf_dhcp_option_mudurl,
10172 { "MUDURL", "dhcp.option.mudurl",
10173 FT_STRING, BASE_NONE, NULL, 0x0,
10174 "Option 161: MUDURL", HFILL }},
10176 { &hf_dhcp_option_pxe_config_file,
10177 { "PXELINUX configuration file", "dhcp.option.pxe_config_file",
10178 FT_STRING, BASE_NONE, NULL, 0x0,
10179 "Option 209: PXE Configuration File", HFILL }},
10181 { &hf_dhcp_option_pxe_path_prefix,
10182 { "PXELINUX path prefix", "dhcp.option.pxe_path_prefix",
10183 FT_STRING, BASE_NONE, NULL, 0x0,
10184 "Option 210: PXE Path Prefix", HFILL }},
10186 { &hf_dhcp_option_pxe_reboot_time,
10187 { "PXELINUX Reboot Time", "dhcp.option.pxe_reboot_time",
10188 FT_UINT32, BASE_CUSTOM, CF_FUNC(dhcp_time_in_u_secs_fmt), 0x0,
10189 "Option 211: PXE Reboot Time", HFILL }},
10191 { &hf_dhcp_option_captive_portal,
10192 { "Captive Portal", "dhcp.option.captive_portal",
10193 FT_STRING, BASE_NONE, NULL, 0x0,
10194 "The contact URI for the captive portal that the user should connect to", HFILL }},
10196 { &hf_dhcp_option_6RD_ipv4_mask_len,
10197 { "6RD IPv4 Mask Length", "dhcp.option.6RD.ipv4_mask_len",
10198 FT_UINT8, BASE_DEC, NULL, 0x0,
10199 "Option 212: 6RD IPv4 Mask Length", HFILL }},
10201 { &hf_dhcp_option_6RD_prefix_len,
10202 { "6RD Prefix Length", "dhcp.option.6RD.prefix_len",
10203 FT_UINT8, BASE_DEC, NULL, 0x0,
10204 "Option 212: 6RD Prefix Length", HFILL }},
10206 { &hf_dhcp_option_6RD_prefix,
10207 { "6RD Prefix", "dhcp.option.6RD.prefix",
10208 FT_IPv6, BASE_NONE, NULL, 0x00,
10209 "Option 212: 6RD Prefix", HFILL }},
10211 { &hf_dhcp_option_6RD_border_relay_ip,
10212 { "Border Relay IP", "dhcp.option.6RD.border_relay_ip",
10213 FT_IPv4, BASE_NONE, NULL, 0x00,
10214 "Option 212: Border Relay IP", HFILL }},
10216 { &hf_dhcp_option_private_proxy_autodiscovery,
10217 { "Private/Proxy autodiscovery", "dhcp.option.private_proxy_autodiscovery",
10218 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10219 "Option 252: Private/Proxy autodiscovery", HFILL }},
10221 { &hf_dhcp_option_end,
10222 { "Option End", "dhcp.option.end",
10223 FT_UINT8, BASE_DEC, NULL, 0x0,
10224 "Option 255: End", HFILL }},
10226 { &hf_dhcp_option_end_overload,
10227 { "Option End (Overload)", "dhcp.option.end",
10228 FT_UINT8, BASE_DEC, NULL, 0x0,
10229 "Option 255: End (Overload)", HFILL }},
10231 { &hf_dhcp_vendor_unknown_suboption,
10232 { "Option 125 Suboption", "dhcp.vendor.suboption",
10233 FT_UINT8, BASE_DEC, NULL, 0x0,
10234 NULL, HFILL }},
10236 { &hf_dhcp_suboption_data,
10237 { "Data", "dhcp.vendor.data",
10238 FT_BYTES, BASE_NONE, NULL, 0x0,
10239 NULL, HFILL }},
10241 { &hf_dhcp_pc_ietf_ccc_suboption,
10242 { "Suboption", "dhcp.vendor.pc.ietf_ccc.suboption",
10243 FT_UINT8, BASE_DEC, VALS(pkt_draft5_ccc_opt_vals), 0x0,
10244 NULL, HFILL }},
10246 { &hf_dhcp_pc_i05_ccc_suboption,
10247 { "Suboption", "dhcp.vendor.pc.i05_ccc.suboption",
10248 FT_UINT8, BASE_DEC, VALS(pkt_i05_ccc_opt_vals), 0x0,
10249 NULL, HFILL }},
10251 { &hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_nom_timeout,
10252 { "pktcMtaDevRealmUnsolicitedKeyNomTimeout", "dhcp.cl.ietf_ccc.dev_realm_unc_key_nom_timeout",
10253 FT_UINT32, BASE_DEC, NULL, 0x0,
10254 NULL, HFILL }},
10256 { &hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_timeout,
10257 { "pktcMtaDevRealmUnsolicitedKeyMaxTimeout", "dhcp.cl.ietf_ccc.dev_realm_unc_key_max_timeout",
10258 FT_UINT32, BASE_DEC, NULL, 0x0,
10259 NULL, HFILL }},
10261 { &hf_dhcp_cl_ietf_ccc_dev_realm_unc_key_max_retries,
10262 { "pktcMtaDevRealmUnsolicitedKeyMaxRetries", "dhcp.cl.ietf_ccc.dev_realm_unc_key_max_retries",
10263 FT_UINT32, BASE_DEC, NULL, 0x0,
10264 NULL, HFILL }},
10266 { &hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_nom_timeout,
10267 { "pktcMtaDevProvUnsolicitedKeyNomTimeout", "dhcp.cl.ietf_ccc.dev_prov_unc_key_nom_timeout",
10268 FT_UINT32, BASE_DEC, NULL, 0x0,
10269 NULL, HFILL }},
10271 { &hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_timeout,
10272 { "pktcMtaDevProvUnsolicitedKeyMaxTimeout", "dhcp.cl.ietf_ccc.dev_prov_unc_key_max_timeout",
10273 FT_UINT32, BASE_DEC, NULL, 0x0,
10274 NULL, HFILL }},
10276 { &hf_dhcp_cl_ietf_ccc_dev_prov_unc_key_max_retries,
10277 { "pktcMtaDevProvUnsolicitedKeyMaxRetries", "dhcp.cl.ietf_ccc.dev_prov_unc_key_max_retries",
10278 FT_UINT32, BASE_DEC, NULL, 0x0,
10279 NULL, HFILL }},
10281 { &hf_dhcp_ccc_ietf_sec_tkt_pc_provision_server,
10282 { "Invalidate PacketCable Provisioning Server", "dhcp.ccc.ietf.sec_tkt.pc_provision_server",
10283 FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0001,
10284 NULL, HFILL }},
10286 { &hf_dhcp_ccc_ietf_sec_tkt_all_pc_call_management,
10287 { "Invalidate All PacketCable Call Management Servers", "dhcp.ccc.ietf.sec_tkt.all_pc_call_management",
10288 FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0002,
10289 NULL, HFILL }},
10291 { &hf_dhcp_option242_avaya,
10292 { "Private/Avaya IP Telephone", "dhcp.option.vendor.avaya",
10293 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10294 "Option 242: Private/Avaya IP Telephone", HFILL }},
10296 { &hf_dhcp_option242_avaya_tlssrvr,
10297 { "TLSSRVR", "dhcp.option.vendor.avaya.tlssrvr",
10298 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10299 "Option 242: TLSSRVR (HTTPS server(s) to download configuration)", HFILL }},
10301 { &hf_dhcp_option242_avaya_httpsrvr,
10302 { "HTTPSRVR", "dhcp.option.vendor.avaya.httpsrvr",
10303 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10304 "Option 242: HTTPSRVR (HTTP server(s) to download configuration)", HFILL }},
10306 { &hf_dhcp_option242_avaya_httpdir,
10307 { "HTTPDIR", "dhcp.option.vendor.avaya.httpdir",
10308 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10309 "Option 242: HTTPDIR (Path to configuration files)", HFILL }},
10311 { &hf_dhcp_option242_avaya_static,
10312 { "STATIC", "dhcp.option.vendor.avaya.static",
10313 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10314 "Option 242: STATIC (Static programming override flag)", HFILL }},
10316 { &hf_dhcp_option242_avaya_mcipadd,
10317 { "MCIPADD", "dhcp.option.vendor.avaya.mcipadd",
10318 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10319 "Option 242: MCIPADD (List of CM server(s))", HFILL }},
10321 { &hf_dhcp_option242_avaya_dot1x,
10322 { "DOT1X", "dhcp.option.vendor.avaya.dot1x",
10323 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10324 "Option 242: DOT1X (802.1X Supplicant operation mode)", HFILL }},
10326 { &hf_dhcp_option242_avaya_icmpdu,
10327 { "ICMPDU", "dhcp.option.vendor.avaya.icmpdu",
10328 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10329 "Option 242: ICMPDU (ICMP Destination Unreachable processing)", HFILL }},
10331 { &hf_dhcp_option242_avaya_icmpred,
10332 { "ICMPRED", "dhcp.option.vendor.avaya.icmpred",
10333 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10334 "Option 242: ICMPRED (ICMP Redirect handling)", HFILL }},
10336 { &hf_dhcp_option242_avaya_l2q,
10337 { "L2Q", "dhcp.option.vendor.avaya.l2q",
10338 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10339 "Option 242: L2Q (Controls 802.1Q tagging)", HFILL }},
10341 { &hf_dhcp_option242_avaya_l2qvlan,
10342 { "L2QVLAN", "dhcp.option.vendor.avaya.l2qvlan",
10343 FT_INT32, BASE_DEC, NULL, 0x0,
10344 "Option 242: L2QVLAN (VLAN ID)", HFILL }},
10346 { &hf_dhcp_option242_avaya_loglocal,
10347 { "LOGLOCAL", "dhcp.option.vendor.avaya.loglocal",
10348 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10349 "Option 242: LOGLOCAL (Log level)", HFILL }},
10351 { &hf_dhcp_option242_avaya_phy1stat,
10352 { "PHY1STAT", "dhcp.option.vendor.avaya.phy1stat",
10353 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10354 "Option 242: PHY1STAT (Interface configuration)", HFILL }},
10356 { &hf_dhcp_option242_avaya_phy2stat,
10357 { "PHY2STAT", "dhcp.option.vendor.avaya.phy2stat",
10358 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10359 "Option 242: PHY2STAT (Interface configuration)", HFILL }},
10361 { &hf_dhcp_option242_avaya_procpswd,
10362 { "PROCPSWD", "dhcp.option.vendor.avaya.procpswd",
10363 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10364 "Option 242: PROCPSWD (Security string used to access local procedures)", HFILL }},
10366 { &hf_dhcp_option242_avaya_procstat,
10367 { "PROCSTAT", "dhcp.option.vendor.avaya.procstat",
10368 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10369 "Option 242: PROCSTAT (Local (dialpad) Administrative access)", HFILL }},
10371 { &hf_dhcp_option242_avaya_snmpadd,
10372 { "SNMPADD", "dhcp.option.vendor.avaya.snmpadd",
10373 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10374 "Option 242: SNMPADD (Allowable source IP Address(es) for SNMP queries)", HFILL }},
10376 { &hf_dhcp_option242_avaya_snmpstring,
10377 { "SNMPSTRING", "dhcp.option.vendor.avaya.snmpstring",
10378 FT_STRINGZ, BASE_NONE, NULL, 0x0,
10379 "Option 242: SNMPSTRING (SNMP community string)", HFILL }},
10381 { &hf_dhcp_option242_avaya_vlantest,
10382 { "VLANTEST", "dhcp.option.vendor.avaya.vlantest",
10383 FT_INT32, BASE_DEC, NULL, 0x0,
10384 "Option 242: VLANTEST (Timeout in seconds)", HFILL }},
10386 /* Cisco vendor suboptions */
10387 { &hf_dhcp_option43_cisco_suboption,
10388 { "Option 43 Suboption", "dhcp.option.vendor.cisco.suboption",
10389 FT_UINT8, BASE_DEC, VALS(option43_cisco_suboption_vals), 0x0,
10390 "Option 43:Cisco Suboption", HFILL }},
10392 { &hf_dhcp_option43_cisco_unknown,
10393 { "Unknown", "dhcp.option.vendor.cisco.unknown",
10394 FT_BYTES, BASE_NONE, NULL, 0x0,
10395 NULL, HFILL }},
10397 { &hf_dhcp_option43_cisco_unknown1,
10398 { "Unknown1", "dhcp.option.vendor.cisco.unknown1",
10399 FT_UINT8, BASE_DEC, NULL, 0x0,
10400 NULL, HFILL }},
10402 { &hf_dhcp_option43_cisco_unknown2,
10403 { "Unknown2", "dhcp.option.vendor.cisco.unknown2",
10404 FT_UINT8, BASE_DEC, NULL, 0x0,
10405 NULL, HFILL }},
10407 { &hf_dhcp_option43_cisco_unknown3,
10408 { "Unknown3", "dhcp.option.vendor.cisco.unknown3",
10409 FT_UINT16, BASE_DEC, NULL, 0x0,
10410 NULL, HFILL }},
10412 { &hf_dhcp_option43_cisco_nodeid,
10413 { "Node ID", "dhcp.option.vendor.cisco.nodeid",
10414 FT_UINT32, BASE_DEC, NULL, 0x0,
10415 NULL, HFILL }},
10417 { &hf_dhcp_option43_cisco_unknown5,
10418 { "Unknown5", "dhcp.option.vendor.cisco.unknown5",
10419 FT_UINT8, BASE_DEC, NULL, 0x0,
10420 NULL, HFILL }},
10422 { &hf_dhcp_option43_cisco_unknown6,
10423 { "Unknown6", "dhcp.option.vendor.cisco.unknown6",
10424 FT_UINT8, BASE_DEC, NULL, 0x0,
10425 NULL, HFILL }},
10427 { &hf_dhcp_option43_cisco_model,
10428 { "Model", "dhcp.option.vendor.cisco.model",
10429 FT_STRING, BASE_NONE, NULL, 0x0,
10430 NULL, HFILL }},
10432 { &hf_dhcp_option43_cisco_apicuuid,
10433 { "APIC UUID", "dhcp.option.vendor.cisco.apicuuid",
10434 FT_STRING, BASE_NONE, NULL, 0x0,
10435 NULL, HFILL }},
10437 { &hf_dhcp_option43_cisco_fabricname,
10438 { "Fabricname", "dhcp.option.vendor.cisco.fabricname",
10439 FT_STRING, BASE_NONE, NULL, 0x0,
10440 NULL, HFILL }},
10442 { &hf_dhcp_option43_cisco_unknown10,
10443 { "Unknown10", "dhcp.option.vendor.cisco.unknown10",
10444 FT_UINT32, BASE_DEC, NULL, 0x0,
10445 NULL, HFILL }},
10447 { &hf_dhcp_option43_cisco_serialno,
10448 { "SerialNo", "dhcp.option.vendor.cisco.serialno",
10449 FT_STRING, BASE_NONE, NULL, 0x0,
10450 NULL, HFILL }},
10452 { &hf_dhcp_option43_cisco_clientint,
10453 { "Client Int", "dhcp.option.vendor.cisco.clientint",
10454 FT_STRING, BASE_NONE, NULL, 0x0,
10455 NULL, HFILL }},
10458 static uat_field_t dhcp_uat_flds[] = {
10459 UAT_FLD_DEC(uat_dhcp_records, opt, "Option number", "Custom Option Number"),
10460 UAT_FLD_CSTRING(uat_dhcp_records, text, "Option Name", "Custom Option Name"),
10461 UAT_FLD_VS(uat_dhcp_records, ftype, "Option type", dhcp_custom_type_vals, "Option datatype"),
10462 UAT_END_FIELDS
10465 static int *ett[] = {
10466 &ett_dhcp,
10467 &ett_dhcp_flags,
10468 &ett_dhcp_option,
10469 &ett_dhcp_option43_suboption,
10470 &ett_dhcp_option43_suboption_discovery,
10471 &ett_dhcp_option43_suboption_tree,
10472 &ett_dhcp_option63_suboption,
10473 &ett_dhcp_option77_instance,
10474 &ett_dhcp_option82_suboption,
10475 &ett_dhcp_option82_suboption9,
10476 &ett_dhcp_option124_vendor_class_data_item,
10477 &ett_dhcp_option125_suboption,
10478 &ett_dhcp_option125_tr111_suboption,
10479 &ett_dhcp_option125_cl_suboption,
10480 &ett_dhcp_option242_suboption,
10481 &ett_dhcp_fqdn,
10482 &ett_dhcp_filename_option,
10483 &ett_dhcp_server_hostname,
10484 &ett_dhcp_fqdn_flags,
10485 &ett_dhcp_isns_functions,
10486 &ett_dhcp_isns_discovery_domain_access,
10487 &ett_dhcp_isns_administrative_flags,
10488 &ett_dhcp_isns_server_security_bitmap,
10489 &ett_dhcp_isns_secondary_server_addr,
10490 &ett_dhcp_o43_bsdp_boot_image,
10491 &ett_dhcp_o43_bsdp_attributes,
10492 &ett_dhcp_o43_bsdp_image_desc_list,
10493 &ett_dhcp_o43_bsdp_image_desc,
10494 &ett_dhcp_o43_bsdp_attributes_flags,
10495 &ett_dhcp_option158_pcp_list,
10498 static ei_register_info ei[] = {
10499 { &ei_dhcp_bad_length, { "dhcp.bad_length", PI_PROTOCOL, PI_ERROR, "length isn't 0", EXPFILL }},
10500 { &ei_dhcp_bad_bitfield, { "dhcp.bad_bitfield", PI_PROTOCOL, PI_ERROR, "Bogus bitfield", EXPFILL }},
10501 { &ei_dhcp_missing_subopt_length, { "dhcp.missing_subopt_length", PI_PROTOCOL, PI_ERROR, "no room left in option for suboption length", EXPFILL }},
10502 { &ei_dhcp_missing_subopt_value, { "dhcp.missing_subopt_value", PI_PROTOCOL, PI_ERROR, "no room left in option for suboption value", EXPFILL }},
10503 { &ei_dhcp_mal_duid, { "dhcp.malformed.duid", PI_PROTOCOL, PI_ERROR, "DUID: malformed option", EXPFILL }},
10504 { &ei_dhcp_rfc3396_refer_last_option, { "dhcp.option.refer_last_option", PI_REASSEMBLE, PI_CHAT, "For the data, please refer to the last option of this type", EXPFILL }},
10505 { &ei_dhcp_opt_overload_wrong_field, { "dhcp.option.option_overload.wrong_field", PI_PROTOCOL, PI_WARN, "overload option makes no sense in the file or sname field", EXPFILL }},
10506 { &ei_dhcp_opt_overload_file_end_missing, { "dhcp.option.option_overload.file_end_missing", PI_PROTOCOL, PI_ERROR, "file overload end option missing", EXPFILL }},
10507 { &ei_dhcp_opt_overload_sname_end_missing, { "dhcp.option.option_overload.sname_end_missing", PI_PROTOCOL, PI_ERROR, "sname overload end option missing", EXPFILL }},
10508 { &ei_dhcp_subopt_unknown_type, { "dhcp.subopt.unknown_type", PI_PROTOCOL, PI_ERROR, "ERROR, please report: Unknown subopt type handler", EXPFILL }},
10509 { &ei_dhcp_option_civic_location_bad_cattype, { "dhcp.option.civic_location.bad_cattype", PI_PROTOCOL, PI_ERROR, "Error with CAType", EXPFILL }},
10510 { &ei_dhcp_option_dhcp_name_service_invalid, { "dhcp.option.dhcp_name_service.invalid", PI_PROTOCOL, PI_ERROR, "Invalid Name Service", EXPFILL }},
10511 { &ei_dhcp_option_sip_server_address_encoding, { "dhcp.option.sip_server_address.encoding", PI_PROTOCOL, PI_ERROR, "RFC 3361 defines only 0 and 1 for Encoding byte", EXPFILL }},
10512 { &ei_dhcp_option_classless_static_route, { "dhcp.option.classless_static.route", PI_PROTOCOL, PI_ERROR, "Mask width > 32", EXPFILL }},
10513 { &ei_dhcp_option125_enterprise_malformed, { "dhcp.option.enterprise.malformed", PI_PROTOCOL, PI_ERROR, "no room left in option for enterprise data", EXPFILL }},
10514 { &ei_dhcp_option_6RD_malformed, { "dhcp.option.6RD.malformed", PI_PROTOCOL, PI_ERROR, "6RD: malformed option", EXPFILL }},
10515 { &ei_dhcp_option82_vi_cl_tag_unknown, { "dhcp.option.option.vi.cl.tag_unknown", PI_PROTOCOL, PI_ERROR, "Unknown tag", EXPFILL }},
10516 { &ei_dhcp_option_parse_err, { "dhcp.option.parse_err", PI_PROTOCOL, PI_ERROR, "Parse error", EXPFILL }},
10517 { &ei_dhcp_nonstd_option_data, { "dhcp.option.nonstd_data", PI_PROTOCOL, PI_NOTE, "Non standard compliant option data", EXPFILL }},
10518 { &ei_dhcp_suboption_invalid, { "dhcp.suboption_invalid", PI_PROTOCOL, PI_ERROR, "Invalid suboption", EXPFILL }},
10519 { &ei_dhcp_secs_le, { "dhcp.secs_le", PI_PROTOCOL, PI_NOTE, "Seconds elapsed appears to be encoded as little-endian", EXPFILL }},
10520 { &ei_dhcp_end_option_missing, { "dhcp.end_option_missing", PI_PROTOCOL, PI_ERROR, "End option missing", EXPFILL }},
10521 { &ei_dhcp_client_address_not_given, { "dhcp.client_address_not_given", PI_PROTOCOL, PI_NOTE, "Client address not given", EXPFILL }},
10522 { &ei_dhcp_server_name_overloaded_by_dhcp, { "dhcp.server_name_overloaded_by_dhcp", PI_PROTOCOL, PI_NOTE, "Server name option overloaded by DHCP", EXPFILL }},
10523 { &ei_dhcp_boot_filename_overloaded_by_dhcp, { "dhcp.boot_filename_overloaded_by_dhcp", PI_PROTOCOL, PI_NOTE, "Boot file name option overloaded by DHCP", EXPFILL }},
10524 { &ei_dhcp_option_isns_ignored_bitfield, { "dhcp.option.isns.ignored_bitfield", PI_PROTOCOL, PI_NOTE, "Enabled field is not set - non-zero bitmask ignored", EXPFILL }},
10525 { &ei_dhcp_option242_avaya_l2qvlan_invalid, { "dhcp.option.vendor.avaya.l2qvlan.invalid", PI_PROTOCOL, PI_ERROR, "Option 242 (L2QVLAN) invalid", EXPFILL }},
10526 { &ei_dhcp_option242_avaya_vlantest_invalid, { "dhcp.option.vendor.avaya.vlantest.invalid", PI_PROTOCOL, PI_ERROR, "Option 242 (avaya vlantest) invalid", EXPFILL }},
10527 { &ei_dhcp_option93_client_arch_ambiguous, { "dhcp.option.client_architecture.ambiguous", PI_PROTOCOL, PI_WARN, "Client Architecture ID may be ambiguous", EXPFILL }},
10530 static tap_param dhcp_stat_params[] = {
10531 { PARAM_FILTER, "filter", "Filter", NULL, true }
10534 static stat_tap_table_ui dhcp_stat_table = {
10535 REGISTER_PACKET_STAT_GROUP_UNSORTED,
10536 "DHCP (BOOTP) Statistics",
10537 "dhcp",
10538 "dhcp,stat",
10539 dhcp_stat_init,
10540 dhcp_stat_packet,
10541 dhcp_stat_reset,
10542 NULL,
10543 NULL,
10544 array_length(dhcp_stat_fields), dhcp_stat_fields,
10545 array_length(dhcp_stat_params), dhcp_stat_params,
10546 NULL,
10550 module_t *dhcp_module;
10551 expert_module_t* expert_dhcp;
10553 proto_dhcp = proto_register_protocol("Dynamic Host Configuration Protocol", "DHCP/BOOTP", "dhcp");
10554 proto_register_field_array(proto_dhcp, hf, array_length(hf));
10555 proto_register_alias(proto_dhcp, "bootp");
10556 proto_register_subtree_array(ett, array_length(ett));
10557 dhcp_bootp_tap = register_tap("dhcp");
10559 expert_dhcp = expert_register_protocol(proto_dhcp);
10560 expert_register_field_array(expert_dhcp, ei, array_length(ei));
10562 dhcp_option_table = register_dissector_table("dhcp.option", "BOOTP Options", proto_dhcp, FT_UINT8, BASE_DEC);
10563 dhcp_vendor_id_subdissector = register_heur_dissector_list_with_description("dhcp.vendor_id", "DHCP Vendor ID", proto_dhcp);
10564 dhcp_vendor_info_subdissector = register_heur_dissector_list_with_description("dhcp.vendor_info", "DHCP Vendor Info", proto_dhcp);
10565 dhcp_enterprise_class_table = register_dissector_table("dhcp.enterprise_class", "V-I Vendor Class Enterprise", proto_dhcp, FT_UINT32, BASE_DEC);
10566 dhcp_enterprise_specific_table = register_dissector_table("dhcp.enterprise", "V-I Vendor Specific Enterprise", proto_dhcp, FT_UINT32, BASE_DEC);
10568 /* register init/cleanup routine to handle the custom dhcp options */
10569 register_init_routine(&dhcp_init_protocol);
10570 register_cleanup_routine(&dhcp_cleanup_protocol);
10572 /* Allow dissector to find be found by name. */
10573 dhcp_handle = register_dissector("dhcp", dissect_dhcp, proto_dhcp);
10575 dhcp_module = prefs_register_protocol(proto_dhcp, NULL);
10577 prefs_register_bool_preference(dhcp_module, "novellserverstring",
10578 "Decode Option 85 as String",
10579 "Novell Servers option 85 can be configured as a string instead of address",
10580 &novell_string);
10582 prefs_register_enum_preference(dhcp_module, "pkt.ccc.protocol_version",
10583 "PacketCable CCC protocol version",
10584 "The PacketCable CCC protocol version",
10585 &pkt_ccc_protocol_version,
10586 pkt_ccc_protocol_versions,
10587 false);
10589 prefs_register_uint_preference(dhcp_module, "pkt.ccc.option",
10590 "PacketCable CCC option",
10591 "Option Number for PacketCable CableLabs Client Configuration",
10593 &pkt_ccc_option);
10595 prefs_register_enum_preference(dhcp_module, "uuid.endian",
10596 "Endianness of UUID",
10597 "Endianness applied to UUID fields",
10598 &dhcp_uuid_endian,
10599 dhcp_uuid_endian_vals,
10600 false);
10602 prefs_register_enum_preference(dhcp_module, "secs.endian",
10603 "Endianness of seconds elapsed field",
10604 "Endianness applied to seconds elapsed field",
10605 &dhcp_secs_endian,
10606 dhcp_secs_endian_vals,
10607 false);
10609 prefs_register_obsolete_preference(dhcp_module, "displayasstring");
10611 dhcp_uat = uat_new("Custom DHCP/BootP Options (Excl. suboptions)",
10612 sizeof(uat_dhcp_record_t), /* record size */
10613 "custom_bootp", /* filename */
10614 true, /* from_profile */
10615 &uat_dhcp_records, /* data_ptr */
10616 &num_dhcp_records_uat, /* numitems_ptr */
10617 UAT_AFFECTS_DISSECTION, /* affects dissection of packets, but not set of named fields */
10618 NULL, /* help */
10619 uat_dhcp_record_copy_cb, /* copy callback */
10620 uat_dhcp_record_update_cb, /* update callback */
10621 uat_dhcp_record_free_cb, /* free callback */
10622 NULL, /* post update callback */
10623 NULL, /* reset callback */
10624 dhcp_uat_flds); /* UAT field definitions */
10626 prefs_register_uat_preference(dhcp_module,
10627 "custom_dhcp_table",
10628 "Custom DHCP/BootP Options (Excl. suboptions)",
10629 "Custom DHCP/BootP Options (Excl. suboptions)",
10630 dhcp_uat);
10632 register_stat_tap_table_ui(&dhcp_stat_table);
10635 void
10636 proto_reg_handoff_dhcp(void)
10638 range_t *dhcpopt_basictype_range;
10640 dissector_add_uint_range_with_preference("udp.port", DHCP_UDP_PORT_RANGE, dhcp_handle);
10642 /* Create dissection function handles for all DHCP/BOOTP options */
10643 dhcpopt_basic_handle = create_dissector_handle( dissect_dhcpopt_basic_type, proto_dhcp );
10644 range_convert_str(wmem_epan_scope(), &dhcpopt_basictype_range, DHCP_OPTION_BASICTYPE_RANGE, 0xFF);
10645 dissector_add_uint_range("dhcp.option", dhcpopt_basictype_range, dhcpopt_basic_handle);
10647 dissector_add_uint("dhcp.option", 21, create_dissector_handle( dissect_dhcpopt_policy_filter, proto_dhcp ));
10648 dissector_add_uint("dhcp.option", 33, create_dissector_handle( dissect_dhcpopt_static_route, proto_dhcp ));
10649 dissector_add_uint("dhcp.option", 43, create_dissector_handle( dissect_dhcpopt_vendor_specific_info, proto_dhcp ));
10650 dissector_add_uint("dhcp.option", 52, create_dissector_handle( dissect_dhcpopt_option_overload, proto_dhcp ));
10651 dissector_add_uint("dhcp.option", 53, create_dissector_handle( dissect_dhcpopt_dhcp, proto_dhcp ));
10652 dissector_add_uint("dhcp.option", 55, create_dissector_handle( dissect_dhcpopt_param_request_list, proto_dhcp ));
10653 dissector_add_uint("dhcp.option", 60, create_dissector_handle( dissect_dhcpopt_vendor_class_identifier, proto_dhcp ));
10654 dissector_add_uint("dhcp.option", 61, create_dissector_handle( dissect_dhcpopt_client_identifier, proto_dhcp ));
10655 dissector_add_uint("dhcp.option", 63, create_dissector_handle( dissect_dhcpopt_netware_ip, proto_dhcp ));
10656 dissector_add_uint("dhcp.option", 77, create_dissector_handle( dissect_dhcpopt_user_class_information, proto_dhcp ));
10657 dissector_add_uint("dhcp.option", 78, create_dissector_handle( dissect_dhcpopt_slp_directory_agent, proto_dhcp ));
10658 dissector_add_uint("dhcp.option", 79, create_dissector_handle( dissect_dhcpopt_slp_service_scope, proto_dhcp ));
10659 dissector_add_uint("dhcp.option", 81, create_dissector_handle( dissect_dhcpopt_client_full_domain_name, proto_dhcp ));
10660 dissector_add_uint("dhcp.option", 82, create_dissector_handle( dissect_dhcpopt_relay_agent_info, proto_dhcp ));
10661 dissector_add_uint("dhcp.option", 83, create_dissector_handle( dissect_dhcpopt_isns, proto_dhcp ));
10662 dissector_add_uint("dhcp.option", 85, create_dissector_handle( dissect_dhcpopt_novell_servers, proto_dhcp ));
10663 dissector_add_uint("dhcp.option", 90, create_dissector_handle( dissect_dhcpopt_dhcp_authentication, proto_dhcp ));
10664 dissector_add_uint("dhcp.option", 93, create_dissector_handle( dissect_dhcpopt_client_architecture, proto_dhcp ));
10665 dissector_add_uint("dhcp.option", 94, create_dissector_handle( dissect_dhcpopt_client_network_interface_id, proto_dhcp ));
10666 dissector_add_uint("dhcp.option", 97, create_dissector_handle( dissect_dhcpopt_client_identifier_uuid, proto_dhcp ));
10667 dissector_add_uint("dhcp.option", 99, create_dissector_handle( dissect_dhcpopt_civic_location, proto_dhcp ));
10668 dissector_add_uint("dhcp.option", 114, create_dissector_handle( dissect_dhcpopt_dhcp_captive_portal, proto_dhcp ));
10669 dissector_add_uint("dhcp.option", 117, create_dissector_handle( dissect_dhcpopt_name_server_search, proto_dhcp ));
10670 dissector_add_uint("dhcp.option", 119, create_dissector_handle( dissect_dhcpopt_dhcp_domain_search, proto_dhcp ));
10671 dissector_add_uint("dhcp.option", 120, create_dissector_handle( dissect_dhcpopt_sip_servers, proto_dhcp ));
10672 dissector_add_uint("dhcp.option", 121, create_dissector_handle( dissect_dhcpopt_classless_static_route, proto_dhcp ));
10673 /* The PacketCable CCC option number can vary. Still handled through preference */
10674 dissector_add_uint("dhcp.option", 122, create_dissector_handle( dissect_dhcpopt_packetcable_ccc, proto_dhcp ));
10676 dissector_add_uint("dhcp.option", 123, create_dissector_handle( dissect_dhcpopt_coordinate_based_location, proto_dhcp ));
10677 dissector_add_uint("dhcp.option", 124, create_dissector_handle( dissect_dhcpopt_vi_vendor_class, proto_dhcp ));
10678 dissector_add_uint("dhcp.option", 125, create_dissector_handle( dissect_dhcpopt_vi_vendor_specific_info, proto_dhcp ));
10679 dissector_add_uint("dhcp.option", 145, create_dissector_handle( dissect_dhcpopt_forcerenew_nonce, proto_dhcp ));
10680 dissector_add_uint("dhcp.option", 146, create_dissector_handle( dissect_dhcpopt_rdnss, proto_dhcp ));
10681 dissector_add_uint("dhcp.option", 151, create_dissector_handle( dissect_dhcpopt_bulk_lease_status_code, proto_dhcp ));
10682 dissector_add_uint("dhcp.option", 152, create_dissector_handle( dissect_dhcpopt_bulk_lease_base_time, proto_dhcp ));
10683 dissector_add_uint("dhcp.option", 154, create_dissector_handle( dissect_dhcpopt_bulk_lease_query_start, proto_dhcp ));
10684 dissector_add_uint("dhcp.option", 155, create_dissector_handle( dissect_dhcpopt_bulk_lease_query_end, proto_dhcp ));
10685 dissector_add_uint("dhcp.option", 158, create_dissector_handle( dissect_dhcpopt_pcp_server, proto_dhcp ));
10686 dissector_add_uint("dhcp.option", 159, create_dissector_handle( dissect_dhcpopt_portparams, proto_dhcp ));
10687 dissector_add_uint("dhcp.option", 160, create_dissector_handle( dissect_dhcpopt_dhcp_captive_portal, proto_dhcp ));
10688 dissector_add_uint("dhcp.option", 212, create_dissector_handle( dissect_dhcpopt_6RD_option, proto_dhcp ));
10689 dissector_add_uint("dhcp.option", 242, create_dissector_handle( dissect_dhcpopt_avaya_ip_telephone, proto_dhcp ));
10690 dissector_add_uint("dhcp.option", 249, create_dissector_handle( dissect_dhcpopt_classless_static_route, proto_dhcp ));
10692 /* Create heuristic dissection for DHCP vendor class id */
10693 heur_dissector_add( "dhcp.vendor_id", dissect_packetcable_mta_vendor_id_heur, "PacketCable MTA", "packetcable_mta_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10694 heur_dissector_add( "dhcp.vendor_id", dissect_packetcable_cm_vendor_id_heur, "PacketCable CM", "packetcable_cm_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10695 heur_dissector_add( "dhcp.vendor_id", dissect_apple_bsdp_vendor_id_heur, "Apple BSDP", "apple_bsdp_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10697 /* Create heuristic dissection for DHCP vendor specific information */
10699 /* Note that this is a rather weak (permissive) heuristic,
10700 it's put first so it ends up at the end of the list, I guess this is OK.
10701 Add any stronger (less permissive) heuristics after this!
10702 XXX - Should we just disable by default? */
10703 heur_dissector_add( "dhcp.vendor_info", dissect_alcatel_lucent_vendor_info_heur, "Alcatel-Lucent", "alcatel_lucent_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10705 heur_dissector_add( "dhcp.vendor_info", dissect_pxeclient_vendor_info_heur, "PXEClient", "pxeclient_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10706 heur_dissector_add( "dhcp.vendor_info", dissect_cablelabs_vendor_info_heur, "CableLabs", "cablelabs_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10707 heur_dissector_add( "dhcp.vendor_info", dissect_aruba_ap_vendor_info_heur, ARUBA_AP, "aruba_ap_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10708 heur_dissector_add( "dhcp.vendor_info", dissect_aruba_instant_ap_vendor_info_heur, ARUBA_INSTANT_AP, "aruba_instant_ap_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10709 heur_dissector_add( "dhcp.vendor_info", dissect_apple_bsdp_vendor_info_heur, "Apple BSDP", "apple_bsdp_info_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10710 heur_dissector_add( "dhcp.vendor_info", dissect_aerohive_vendor_info_heur, "AEROHIVE", "aerohive_info_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10711 heur_dissector_add( "dhcp.vendor_info", dissect_cisco_vendor_info_heur, "Cisco", "cisco_info_dhcp", proto_dhcp, HEURISTIC_ENABLE );
10713 /* Create dissection function handles for DHCP Enterprise dissection */
10714 dissector_add_uint("dhcp.enterprise", 4491, create_dissector_handle( dissect_vendor_cl_suboption, proto_dhcp ));
10715 dissector_add_uint("dhcp.enterprise", 3561, create_dissector_handle( dissect_vendor_tr111_suboption, proto_dhcp ));
10719 * Editor modelines - https://www.wireshark.org/tools/modelines.html
10721 * Local variables:
10722 * c-basic-offset: 8
10723 * tab-width: 8
10724 * indent-tabs-mode: t
10725 * End:
10727 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
10728 * :indentSize=8:tabSize=8:noTabs=false: