Coverage Report

Created: 2026-07-12 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-icmpv6.c
Line
Count
Source
1
/* packet-icmpv6.c
2
 * Routines for ICMPv6 packet disassembly
3
 *
4
 * Wireshark - Network traffic analyzer
5
 * By Gerald Combs <gerald@wireshark.org>
6
 * Copyright 1998 Gerald Combs
7
 *
8
 * MobileIPv6 support added by Tomislav Borosa <tomislav.borosa@siemens.hr>
9
 * Copyright 2006, Nicolas DICHTEL - 6WIND - <nicolas.dichtel@6wind.com>
10
 *
11
 * HMIPv6 support added by Martti Kuparinen <martti.kuparinen@iki.fi>
12
 *
13
 * FMIPv6 support added by Martin Andre <andre@clarinet.u-strasbg.fr>
14
 *
15
 * RPL support added by Colin O'Flynn & Owen Kirby.
16
 *
17
 * Enhance ICMPv6 dissector by Alexis La Goutte
18
 *
19
 * P2P-RPL support added by Cenk Gundogan <cnkgndgn@gmail.com>
20
 *
21
 * SPDX-License-Identifier: GPL-2.0-or-later
22
 */
23
24
#include "config.h"
25
26
#include <math.h>
27
28
#include <epan/packet.h>
29
#include <epan/in_cksum.h>
30
#include <epan/expert.h>
31
#include <epan/conversation.h>
32
#include <epan/sequence_analysis.h>
33
#include <epan/tap.h>
34
#include <epan/capture_dissectors.h>
35
#include <epan/unit_strings.h>
36
#include <epan/proto_data.h>
37
#include <epan/strutil.h>
38
#include <epan/tfs.h>
39
#include <epan/iana-info.h>
40
#include <wsutil/array.h>
41
#include <wsutil/pow2.h>
42
43
#include "packet-ber.h"
44
#include "packet-dns.h"
45
#include "packet-x509af.h"
46
#include "packet-x509if.h"
47
#include "packet-icmp.h"    /* same transaction_t used for both v4 and v6 */
48
#include "packet-ieee802154.h"
49
#include "packet-6lowpan.h"
50
#include "packet-ip.h"
51
52
void proto_register_icmpv6(void);
53
void proto_reg_handoff_icmpv6(void);
54
55
/*
56
 * The information used comes from:
57
 * RFC 1885/2463/4443: Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification
58
 * RFC 2461/4861: Neighbor Discovery for IP Version 6 (IPv6)
59
 * RFC 2491: IPv6 over Non-Broadcast Multiple Access (NBMA) networks
60
 * RFC 2710: Multicast Listener Discovery for IPv6
61
 * RFC 2894: Router Renumbering for IPv6
62
 * RFC 3122: Extensions to IPv6 Neighbor Discovery for Inverse Discovery Specification
63
 * RFC 3775/6275: Mobility Support in IPv6
64
 * RFC 3810: Multicast Listener Discovery Version 2 (MLDv2) for IPv6
65
 * RFC 3971: SEcure Neighbor Discovery (SEND)
66
 * RFC 4065: Instructions for Seamoby and Experimental Mobility Protocol IANA Allocations
67
 * RFC 4068/5268/5568: Fast Handovers for Mobile IPv6 (Mobile IPv6 Fast Handovers)
68
 * RFC 4140/5380: Hierarchical Mobile IPv6 Mobility Management (HMIPv6)
69
 * RFC 4191: Default Router Preferences and More-Specific Routes
70
 * RFC 4286: Multicast Router Discovery
71
 * RFC 4620: IPv6 Node Information Queries
72
 * RFC 5006/6106: IPv6 Router Advertisement Options for DNS Configuration
73
 * RFC 5075/5175: IPv6 Router Advertisement Flags Option
74
 * RFC 5269: Distributing a Symmetric Fast Mobile IPv6 (FMIPv6) Handover Key Using SEcure Neighbor Discovery (SEND)
75
 * RFC 5271: Mobile IPv6 Fast Handovers for 3G CDMA Networks
76
 * RFC 6275: Mobility Support in IPv6
77
 * RFC 6495: Subject Key Identifier (SKI) SEND Name Type fields
78
 * RFC 6496: Secure Proxy ND Support for SEND
79
 * RFC 6550: RPL: IPv6 Routing Protocol for Low power and Lossy Networks
80
 * RFC 6554: An IPv6 Routing Header for Source Routes with RPL
81
 * RFC 6743: ICMP Locator Update message for ILNPv6
82
 * RFC 6775: Neighbor Discovery Optimization for Low Power and Lossy Networks (6LoWPAN)
83
 * RFC 6997: Reactive Discovery of Point-to-Point Routes in Low-Power and Lossy Networks
84
 * RFC 7112: Implications of Oversized IPv6 Header Chains
85
 * RFC 7400: 6LoWPAN-GHC: Generic Header Compression for IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs)
86
 * RFC 7731: MPL Control Message
87
 * RFC 8335: PROBE: A Utility for Probing Interfaces
88
 * RFC 8781: Discovering PREF64 in Router Advertisements
89
 * RFC 8505: Registration Extensions for IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Neighbor Discovery
90
 * RFC 8801: Discovering Provisioning Domain Names and Data
91
 * RFC 9009: Efficient Route Invalidation
92
 * http://www.iana.org/assignments/icmpv6-parameters (last updated 2016-02-24)
93
 */
94
95
static int proto_icmpv6;
96
static int hf_icmpv6_type;
97
static int hf_icmpv6_code;
98
static int hf_icmpv6_mcast_ra_ad_interval;
99
static int hf_icmpv6_mcast_ra_reserved;
100
static int hf_icmpv6_checksum;
101
static int hf_icmpv6_checksum_status;
102
static int hf_icmpv6_reserved;
103
static int hf_icmpv6_data;
104
static int hf_icmpv6_unknown_data;
105
static int hf_icmpv6_mtu;
106
static int hf_icmpv6_pointer;
107
static int hf_icmpv6_echo_identifier;
108
static int hf_icmpv6_echo_sequence_number;
109
static int hf_icmpv6_nonce;
110
static int hf_icmpv6_data_time;
111
static int hf_icmpv6_data_time_relative;
112
113
/* RFC 2461/4861 : Neighbor Discovery for IP version 6 (IPv6) */
114
static int hf_icmpv6_nd_ra_cur_hop_limit;
115
static int hf_icmpv6_nd_ra_flag;
116
static int hf_icmpv6_nd_ra_flag_m;
117
static int hf_icmpv6_nd_ra_flag_o;
118
static int hf_icmpv6_nd_ra_flag_h;
119
static int hf_icmpv6_nd_ra_flag_prf;
120
static int hf_icmpv6_nd_ra_flag_p;
121
static int hf_icmpv6_nd_ra_flag_s;
122
static int hf_icmpv6_nd_ra_flag_rsv;
123
static int hf_icmpv6_nd_ra_router_lifetime;
124
static int hf_icmpv6_nd_ra_reachable_time;
125
static int hf_icmpv6_nd_ra_retrans_timer;
126
static int hf_icmpv6_nd_ns_target_address;
127
static int hf_icmpv6_nd_na_flag;
128
static int hf_icmpv6_nd_na_flag_r;
129
static int hf_icmpv6_nd_na_flag_s;
130
static int hf_icmpv6_nd_na_flag_o;
131
static int hf_icmpv6_nd_na_flag_rsv;
132
static int hf_icmpv6_nd_na_target_address;
133
static int hf_icmpv6_nd_rd_target_address;
134
static int hf_icmpv6_nd_rd_destination_address;
135
136
/* ND Options */
137
static int hf_icmpv6_opt;
138
static int hf_icmpv6_opt_type;
139
static int hf_icmpv6_opt_length;
140
static int hf_icmpv6_opt_linkaddr_mac;
141
static int hf_icmpv6_opt_src_linkaddr_mac;
142
static int hf_icmpv6_opt_target_linkaddr_mac;
143
static int hf_icmpv6_opt_linkaddr;
144
static int hf_icmpv6_opt_src_linkaddr;
145
static int hf_icmpv6_opt_target_linkaddr;
146
static int hf_icmpv6_opt_linkaddr_eui64;
147
static int hf_icmpv6_opt_src_linkaddr_eui64;
148
static int hf_icmpv6_opt_target_linkaddr_eui64;
149
static int hf_icmpv6_opt_prefix_len;
150
static int hf_icmpv6_opt_prefix_flag;
151
static int hf_icmpv6_opt_prefix_flag_l;
152
static int hf_icmpv6_opt_prefix_flag_a;
153
static int hf_icmpv6_opt_prefix_flag_r;
154
static int hf_icmpv6_opt_prefix_flag_p;
155
static int hf_icmpv6_opt_prefix_flag_reserved;
156
static int hf_icmpv6_opt_prefix_valid_lifetime;
157
static int hf_icmpv6_opt_prefix_preferred_lifetime;
158
static int hf_icmpv6_opt_prefix;
159
static int hf_icmpv6_opt_naack_option_code;
160
static int hf_icmpv6_opt_naack_status;
161
static int hf_icmpv6_opt_naack_supplied_ncoa;
162
static int hf_icmpv6_opt_cga_pad_len;
163
static int hf_icmpv6_opt_cga;
164
static int hf_icmpv6_opt_cga_modifier;
165
static int hf_icmpv6_opt_cga_subnet_prefix;
166
static int hf_icmpv6_opt_cga_count;
167
static int hf_icmpv6_opt_cga_subject_public_key_info;
168
static int hf_icmpv6_opt_cga_ext_type;
169
static int hf_icmpv6_opt_cga_ext_length;
170
static int hf_icmpv6_opt_cga_ext_data;
171
static int hf_icmpv6_opt_rsa_key_hash;
172
static int hf_icmpv6_opt_digital_signature_padding;
173
static int hf_icmpv6_opt_ps_key_hash;
174
static int hf_icmpv6_opt_timestamp;
175
static int hf_icmpv6_opt_nonce;
176
static int hf_icmpv6_opt_certificate_padding;
177
static int hf_icmpv6_opt_ipa_option_code;
178
static int hf_icmpv6_opt_ipa_prefix_len;
179
static int hf_icmpv6_opt_ipa_ipv6_address;
180
static int hf_icmpv6_opt_nrpi_option_code;
181
static int hf_icmpv6_opt_nrpi_prefix_len;
182
static int hf_icmpv6_opt_nrpi_prefix;
183
static int hf_icmpv6_opt_lla_option_code;
184
static int hf_icmpv6_opt_lla_bytes;
185
static int hf_icmpv6_opt_pvd_id_flags;
186
static int hf_icmpv6_opt_pvd_id_flags_h;
187
static int hf_icmpv6_opt_pvd_id_flags_l;
188
static int hf_icmpv6_opt_pvd_id_flags_r;
189
static int hf_icmpv6_opt_pvd_id_flags_reserved;
190
static int hf_icmpv6_opt_pvd_id_delay;
191
static int hf_icmpv6_opt_pvd_id_sequence_number;
192
static int hf_icmpv6_opt_pvd_id_fqdn;
193
static int hf_icmpv6_opt_map_dist;
194
static int hf_icmpv6_opt_map_pref;
195
static int hf_icmpv6_opt_map_flag;
196
static int hf_icmpv6_opt_map_flag_r;
197
static int hf_icmpv6_opt_map_flag_reserved;
198
static int hf_icmpv6_opt_map_valid_lifetime;
199
static int hf_icmpv6_opt_map_global_address;
200
static int hf_icmpv6_opt_route_info_flag;
201
static int hf_icmpv6_opt_route_info_flag_route_preference;
202
static int hf_icmpv6_opt_route_info_flag_reserved;
203
static int hf_icmpv6_opt_route_lifetime;
204
static int hf_icmpv6_opt_name_type;
205
static int hf_icmpv6_opt_name_x501;
206
static int hf_icmpv6_opt_name_fqdn;
207
static int hf_icmpv6_opt_cert_type;
208
static int hf_icmpv6_x509if_Name;
209
static int hf_icmpv6_x509af_Certificate;
210
static int hf_icmpv6_opt_redirected_packet;
211
static int hf_icmpv6_opt_mtu;
212
static int hf_icmpv6_opt_nbma_shortcut_limit;
213
static int hf_icmpv6_opt_advertisement_interval;
214
static int hf_icmpv6_opt_home_agent_preference;
215
static int hf_icmpv6_opt_home_agent_lifetime;
216
static int hf_icmpv6_opt_ipv6_address;
217
static int hf_icmpv6_opt_reserved;
218
static int hf_icmpv6_opt_padding;
219
static int hf_icmpv6_opt_rdnss_lifetime;
220
static int hf_icmpv6_opt_rdnss;
221
static int hf_icmpv6_opt_efo;
222
static int hf_icmpv6_opt_efo_rsv;
223
static int hf_icmpv6_opt_efo_pex;
224
static int hf_icmpv6_opt_hkr_pad_length;
225
static int hf_icmpv6_opt_hkr_at;
226
static int hf_icmpv6_opt_hkr_reserved;
227
static int hf_icmpv6_opt_hkr_encryption_public_key;
228
static int hf_icmpv6_opt_hkr_padding;
229
static int hf_icmpv6_opt_hkr_lifetime;
230
static int hf_icmpv6_opt_hkr_encrypted_handover_key;
231
static int hf_icmpv6_opt_hai_option_code;
232
static int hf_icmpv6_opt_hai_length;
233
static int hf_icmpv6_opt_hai_value;
234
static int hf_icmpv6_opt_mn_option_code;
235
static int hf_icmpv6_opt_mn_length;
236
static int hf_icmpv6_opt_mn_value;
237
static int hf_icmpv6_opt_dnssl_lifetime;
238
static int hf_icmpv6_opt_dnssl;
239
240
static int hf_icmpv6_opt_aro_status;
241
static int hf_icmpv6_opt_earo_opaque;
242
static int hf_icmpv6_opt_earo_flag;
243
static int hf_icmpv6_opt_earo_flag_reserved;
244
static int hf_icmpv6_opt_earo_flag_c;
245
static int hf_icmpv6_opt_earo_flag_p;
246
static int hf_icmpv6_opt_earo_flag_i;
247
static int hf_icmpv6_opt_earo_flag_t;
248
static int hf_icmpv6_opt_earo_flag_r;
249
static int hf_icmpv6_opt_earo_tid;
250
static int hf_icmpv6_opt_earo_rovr;
251
static int hf_icmpv6_opt_earo_flag_f;
252
static int hf_icmpv6_opt_earo_prefix_len;
253
static int hf_icmpv6_opt_earo_reserved;
254
static int hf_icmpv6_opt_aro_registration_lifetime;
255
static int hf_icmpv6_opt_aro_eui64;
256
static int hf_icmpv6_opt_6co_context_length;
257
static int hf_icmpv6_opt_6co_flag;
258
static int hf_icmpv6_opt_6co_flag_c;
259
static int hf_icmpv6_opt_6co_flag_cid;
260
static int hf_icmpv6_opt_6co_flag_reserved;
261
static int hf_icmpv6_opt_6co_valid_lifetime;
262
static int hf_icmpv6_opt_6co_context_prefix;
263
static int hf_icmpv6_opt_abro_version_low;
264
static int hf_icmpv6_opt_abro_version_high;
265
static int hf_icmpv6_opt_abro_valid_lifetime;
266
static int hf_icmpv6_opt_abro_6lbr_address;
267
static int hf_icmpv6_opt_6cio_flag;
268
static int hf_icmpv6_opt_6cio_flag_experimental;
269
static int hf_icmpv6_opt_6cio_flag_x;
270
static int hf_icmpv6_opt_6cio_flag_a;
271
static int hf_icmpv6_opt_6cio_flag_d;
272
static int hf_icmpv6_opt_6cio_flag_l;
273
static int hf_icmpv6_opt_6cio_flag_b;
274
static int hf_icmpv6_opt_6cio_flag_p;
275
static int hf_icmpv6_opt_6cio_flag_e;
276
static int hf_icmpv6_opt_6cio_flag_g;
277
static int hf_icmpv6_opt_6cio_flag_f;
278
static int hf_icmpv6_opt_6cio_flag_reserved;
279
280
static int hf_icmpv6_opt_captive_portal;
281
282
static int hf_icmpv6_opt_pref64_scaled_lifetime;
283
static int hf_icmpv6_opt_pref64_plc;
284
static int hf_icmpv6_opt_pref64_prefix;
285
static int hf_icmpv6_opt_dnr_svcpriority;
286
static int hf_icmpv6_opt_dnr_lifetime;
287
static int hf_icmpv6_opt_dnr_auth_domain_name_len;
288
static int hf_icmpv6_opt_dnr_auth_domain_name;
289
static int hf_icmpv6_opt_dnr_addrs_len;
290
static int hf_icmpv6_opt_dnr_addrs;
291
static int hf_icmpv6_opt_dnr_addrs_ip;
292
static int hf_icmpv6_opt_dnr_svc_params_len;
293
static int hf_icmpv6_opt_dnr_padding;
294
295
/* RFC 2710: Multicast Listener Discovery for IPv6 */
296
static int hf_icmpv6_mld_mrd;
297
static int hf_icmpv6_mld_multicast_address;
298
299
/* RFC 2894: Router Renumbering for IPv6 */
300
static int hf_icmpv6_rr_sequencenumber;
301
static int hf_icmpv6_rr_segmentnumber;
302
static int hf_icmpv6_rr_flag;
303
static int hf_icmpv6_rr_flag_t;
304
static int hf_icmpv6_rr_flag_r;
305
static int hf_icmpv6_rr_flag_a;
306
static int hf_icmpv6_rr_flag_s;
307
static int hf_icmpv6_rr_flag_p;
308
static int hf_icmpv6_rr_flag_rsv;
309
static int hf_icmpv6_rr_maxdelay;
310
static int hf_icmpv6_rr_pco_mp_part;
311
static int hf_icmpv6_rr_pco_mp_opcode;
312
static int hf_icmpv6_rr_pco_mp_oplength;
313
static int hf_icmpv6_rr_pco_mp_ordinal;
314
static int hf_icmpv6_rr_pco_mp_matchlen;
315
static int hf_icmpv6_rr_pco_mp_minlen;
316
static int hf_icmpv6_rr_pco_mp_maxlen;
317
static int hf_icmpv6_rr_pco_mp_matchprefix;
318
static int hf_icmpv6_rr_pco_up_part;
319
static int hf_icmpv6_rr_pco_up_uselen;
320
static int hf_icmpv6_rr_pco_up_keeplen;
321
static int hf_icmpv6_rr_pco_up_flagmask;
322
static int hf_icmpv6_rr_pco_up_flagmask_l;
323
static int hf_icmpv6_rr_pco_up_flagmask_a;
324
static int hf_icmpv6_rr_pco_up_flagmask_reserved;
325
static int hf_icmpv6_rr_pco_up_raflags;
326
static int hf_icmpv6_rr_pco_up_raflags_l;
327
static int hf_icmpv6_rr_pco_up_raflags_a;
328
static int hf_icmpv6_rr_pco_up_raflags_reserved;
329
static int hf_icmpv6_rr_pco_up_validlifetime;
330
static int hf_icmpv6_rr_pco_up_preferredlifetime;
331
static int hf_icmpv6_rr_pco_up_flag;
332
static int hf_icmpv6_rr_pco_up_flag_v;
333
static int hf_icmpv6_rr_pco_up_flag_p;
334
static int hf_icmpv6_rr_pco_up_flag_reserved;
335
static int hf_icmpv6_rr_pco_up_useprefix;
336
static int hf_icmpv6_rr_rm;
337
static int hf_icmpv6_rr_rm_flag;
338
static int hf_icmpv6_rr_rm_flag_b;
339
static int hf_icmpv6_rr_rm_flag_f;
340
static int hf_icmpv6_rr_rm_flag_reserved;
341
static int hf_icmpv6_rr_rm_ordinal;
342
static int hf_icmpv6_rr_rm_matchedlen;
343
static int hf_icmpv6_rr_rm_interfaceindex;
344
static int hf_icmpv6_rr_rm_matchedprefix;
345
346
/* RFC 3810: Multicast Listener Discovery Version 2 (MLDv2) for IPv6 */
347
static int hf_icmpv6_mld_mrc;
348
static int hf_icmpv6_mld_flag;
349
static int hf_icmpv6_mld_flag_s;
350
static int hf_icmpv6_mld_flag_qrv;
351
static int hf_icmpv6_mld_flag_rsv;
352
static int hf_icmpv6_mld_qqi;
353
static int hf_icmpv6_mld_nb_sources;
354
static int hf_icmpv6_mld_source_address;
355
static int hf_icmpv6_mldr_nb_mcast_records;
356
static int hf_icmpv6_mldr_mar;
357
static int hf_icmpv6_mldr_mar_record_type;
358
static int hf_icmpv6_mldr_mar_aux_data_len;
359
static int hf_icmpv6_mldr_mar_nb_sources;
360
static int hf_icmpv6_mldr_mar_multicast_address;
361
static int hf_icmpv6_mldr_mar_source_address;
362
static int hf_icmpv6_mldr_mar_auxiliary_data;
363
364
/* RFC3775/6275: Mobility Support in IPv6 */
365
static int hf_icmpv6_mip6_identifier;
366
static int hf_icmpv6_mip6_home_agent_address;
367
static int hf_icmpv6_mip6_flag;
368
static int hf_icmpv6_mip6_flag_m;
369
static int hf_icmpv6_mip6_flag_o;
370
static int hf_icmpv6_mip6_flag_rsv;
371
372
/* RFC3971: SEcure Neighbor Discovery (SEND) */
373
static int hf_icmpv6_send_identifier;
374
static int hf_icmpv6_send_all_components;
375
static int hf_icmpv6_send_component;
376
377
/* RFC 4068/5268/5568: Fast Handovers for Mobile IPv6 ( Mobile IPv6 Fast Handovers ) */
378
static int hf_icmpv6_fmip6_subtype;
379
static int hf_icmpv6_fmip6_hi_flag;
380
static int hf_icmpv6_fmip6_hi_flag_s;
381
static int hf_icmpv6_fmip6_hi_flag_u;
382
static int hf_icmpv6_fmip6_hi_flag_reserved;
383
static int hf_icmpv6_fmip6_identifier;
384
385
/* RFC 4286: Multicast Router Discovery */
386
static int hf_icmpv6_mcast_ra_query_interval;
387
static int hf_icmpv6_mcast_ra_robustness_variable;
388
389
/* RFC 4620: IPv6 Node Information Queries */
390
static int hf_icmpv6_ni_qtype;
391
static int hf_icmpv6_ni_flag;
392
static int hf_icmpv6_ni_flag_g;
393
static int hf_icmpv6_ni_flag_s;
394
static int hf_icmpv6_ni_flag_l;
395
static int hf_icmpv6_ni_flag_c;
396
static int hf_icmpv6_ni_flag_a;
397
static int hf_icmpv6_ni_flag_t;
398
static int hf_icmpv6_ni_flag_rsv;
399
static int hf_icmpv6_ni_nonce;
400
static int hf_icmpv6_ni_query_subject_ipv6;
401
static int hf_icmpv6_ni_query_subject_fqdn;
402
static int hf_icmpv6_ni_query_subject_ipv4;
403
static int hf_icmpv6_ni_reply_node_ttl;
404
static int hf_icmpv6_ni_reply_node_name;
405
static int hf_icmpv6_ni_reply_node_address;
406
static int hf_icmpv6_ni_reply_ipv4_address;
407
408
/* RFC 4884: Extended ICMP */
409
static int hf_icmpv6_length;
410
411
/* RPL: RFC 6550/6997/9009 : Routing and Discovery of P2P Routes in Low-Power and Lossy Networks. Efficient route invalidation. */
412
static int hf_icmpv6_rpl_dis_flag;
413
static int hf_icmpv6_rpl_dio_instance;
414
static int hf_icmpv6_rpl_dio_version;
415
static int hf_icmpv6_rpl_dio_rank;
416
static int hf_icmpv6_rpl_dio_flag;
417
static int hf_icmpv6_rpl_dio_flag_g;
418
static int hf_icmpv6_rpl_dio_flag_0;
419
static int hf_icmpv6_rpl_dio_flag_mop;
420
static int hf_icmpv6_rpl_dio_flag_prf;
421
static int hf_icmpv6_rpl_dio_dtsn;
422
static int hf_icmpv6_rpl_dio_dagid;
423
static int hf_icmpv6_rpl_dao_instance;
424
static int hf_icmpv6_rpl_dao_flag;
425
static int hf_icmpv6_rpl_dao_flag_k;
426
static int hf_icmpv6_rpl_dao_flag_d;
427
static int hf_icmpv6_rpl_dao_flag_rsv;
428
static int hf_icmpv6_rpl_dao_sequence;
429
static int hf_icmpv6_rpl_dao_dodagid;
430
static int hf_icmpv6_rpl_daoack_instance;
431
static int hf_icmpv6_rpl_daoack_flag;
432
static int hf_icmpv6_rpl_daoack_flag_d;
433
static int hf_icmpv6_rpl_daoack_flag_rsv;
434
static int hf_icmpv6_rpl_daoack_sequence;
435
static int hf_icmpv6_rpl_daoack_status;
436
static int hf_icmpv6_rpl_daoack_dodagid;
437
static int hf_icmpv6_rpl_dco_instance;
438
static int hf_icmpv6_rpl_dco_flags;
439
static int hf_icmpv6_rpl_dco_flag_k;
440
static int hf_icmpv6_rpl_dco_flag_d;
441
static int hf_icmpv6_rpl_dco_flag_rsv;
442
static int hf_icmpv6_rpl_dco_status;
443
static int hf_icmpv6_rpl_dco_sequence;
444
static int hf_icmpv6_rpl_dco_dodagid;
445
static int hf_icmpv6_rpl_dcoack_instance;
446
static int hf_icmpv6_rpl_dcoack_flag;
447
static int hf_icmpv6_rpl_dcoack_flag_d;
448
static int hf_icmpv6_rpl_dcoack_flag_rsv;
449
static int hf_icmpv6_rpl_dcoack_sequence;
450
static int hf_icmpv6_rpl_dcoack_status;
451
static int hf_icmpv6_rpl_dcoack_dodagid;
452
static int hf_icmpv6_rpl_cc_instance;
453
static int hf_icmpv6_rpl_cc_flag;
454
static int hf_icmpv6_rpl_cc_flag_r;
455
static int hf_icmpv6_rpl_cc_flag_rsv;
456
static int hf_icmpv6_rpl_cc_nonce;
457
static int hf_icmpv6_rpl_cc_dodagid;
458
static int hf_icmpv6_rpl_cc_destination_counter;
459
static int hf_icmpv6_rpl_secure_flag;
460
static int hf_icmpv6_rpl_secure_flag_t;
461
static int hf_icmpv6_rpl_secure_flag_rsv;
462
static int hf_icmpv6_rpl_secure_algorithm;
463
static int hf_icmpv6_rpl_secure_kim;
464
static int hf_icmpv6_rpl_secure_lvl;
465
static int hf_icmpv6_rpl_secure_rsv;
466
static int hf_icmpv6_rpl_secure_counter;
467
static int hf_icmpv6_rpl_secure_key_source;
468
static int hf_icmpv6_rpl_secure_key_index;
469
static int hf_icmpv6_rpl_opt;
470
static int hf_icmpv6_rpl_opt_type;
471
static int hf_icmpv6_rpl_opt_length;
472
static int hf_icmpv6_rpl_opt_reserved;
473
static int hf_icmpv6_rpl_opt_padn;
474
static int hf_icmpv6_rpl_opt_metric_type;
475
static int hf_icmpv6_rpl_opt_metric_flags;
476
static int hf_icmpv6_rpl_opt_metric_reserved;
477
static int hf_icmpv6_rpl_opt_metric_flag_p;
478
static int hf_icmpv6_rpl_opt_metric_flag_c;
479
static int hf_icmpv6_rpl_opt_metric_flag_o;
480
static int hf_icmpv6_rpl_opt_metric_flag_r;
481
static int hf_icmpv6_rpl_opt_metric_a;
482
static int hf_icmpv6_rpl_opt_metric_prec;
483
static int hf_icmpv6_rpl_opt_metric_len;
484
static int hf_icmpv6_rpl_opt_metric_nsa_object;
485
static int hf_icmpv6_rpl_opt_metric_nsa_object_reserved;
486
static int hf_icmpv6_rpl_opt_metric_nsa_object_flags;
487
static int hf_icmpv6_rpl_opt_metric_nsa_object_flag_a;
488
static int hf_icmpv6_rpl_opt_metric_nsa_object_flag_o;
489
static int hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object;
490
static int hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_type;
491
static int hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_length;
492
static int hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_data;
493
static int hf_icmpv6_rpl_opt_metric_ne_object;
494
static int hf_icmpv6_rpl_opt_metric_ne_object_flags;
495
static int hf_icmpv6_rpl_opt_metric_ne_object_flag_i;
496
static int hf_icmpv6_rpl_opt_metric_ne_object_type;
497
static int hf_icmpv6_rpl_opt_metric_ne_object_flag_e;
498
static int hf_icmpv6_rpl_opt_metric_ne_object_energy;
499
static int hf_icmpv6_rpl_opt_metric_hp_object;
500
static int hf_icmpv6_rpl_opt_metric_hp_object_reserved;
501
static int hf_icmpv6_rpl_opt_metric_hp_object_flags;
502
static int hf_icmpv6_rpl_opt_metric_hp_object_hp;
503
static int hf_icmpv6_rpl_opt_metric_lt_object_lt;
504
static int hf_icmpv6_rpl_opt_metric_ll_object_ll;
505
static int hf_icmpv6_rpl_opt_metric_lql_object;
506
static int hf_icmpv6_rpl_opt_metric_lql_object_res;
507
static int hf_icmpv6_rpl_opt_metric_lql_object_val;
508
static int hf_icmpv6_rpl_opt_metric_lql_object_counter;
509
static int hf_icmpv6_rpl_opt_metric_etx_object_etx;
510
static int hf_icmpv6_rpl_opt_metric_lc_object;
511
static int hf_icmpv6_rpl_opt_metric_lc_object_res;
512
static int hf_icmpv6_rpl_opt_metric_lc_object_lc;
513
static int hf_icmpv6_rpl_opt_metric_lc_object_counter;
514
static int hf_icmpv6_rpl_opt_metric_lc_object_reserved;
515
static int hf_icmpv6_rpl_opt_metric_lc_object_flag_i;
516
static int hf_icmpv6_rpl_opt_route_prefix_length;
517
static int hf_icmpv6_rpl_opt_route_flag;
518
static int hf_icmpv6_rpl_opt_route_pref;
519
static int hf_icmpv6_rpl_opt_route_reserved;
520
static int hf_icmpv6_rpl_opt_route_lifetime;
521
static int hf_icmpv6_rpl_opt_route_prefix;
522
static int hf_icmpv6_rpl_opt_config_flag;
523
static int hf_icmpv6_rpl_opt_config_reserved;
524
static int hf_icmpv6_rpl_opt_config_auth;
525
static int hf_icmpv6_rpl_opt_config_pcs;
526
static int hf_icmpv6_rpl_opt_config_doublings;
527
static int hf_icmpv6_rpl_opt_config_min_interval;
528
static int hf_icmpv6_rpl_opt_config_redundancy;
529
static int hf_icmpv6_rpl_opt_config_rank_incr;
530
static int hf_icmpv6_rpl_opt_config_hop_rank_inc;
531
static int hf_icmpv6_rpl_opt_config_ocp;
532
static int hf_icmpv6_rpl_opt_config_rsv;
533
static int hf_icmpv6_rpl_opt_config_def_lifetime;
534
static int hf_icmpv6_rpl_opt_config_lifetime_unit;
535
static int hf_icmpv6_rpl_opt_target_flag;
536
static int hf_icmpv6_rpl_opt_target_prefix_length;
537
static int hf_icmpv6_rpl_opt_target_prefix;
538
static int hf_icmpv6_rpl_opt_transit_flag;
539
static int hf_icmpv6_rpl_opt_transit_flag_e;
540
static int hf_icmpv6_rpl_opt_transit_flag_i;
541
static int hf_icmpv6_rpl_opt_transit_flag_rsv;
542
static int hf_icmpv6_rpl_opt_transit_pathseq;
543
static int hf_icmpv6_rpl_opt_transit_pathctl;
544
static int hf_icmpv6_rpl_opt_transit_pathctl_pc1;
545
static int hf_icmpv6_rpl_opt_transit_pathctl_pc2;
546
static int hf_icmpv6_rpl_opt_transit_pathctl_pc3;
547
static int hf_icmpv6_rpl_opt_transit_pathctl_pc4;
548
static int hf_icmpv6_rpl_opt_transit_pathlifetime;
549
static int hf_icmpv6_rpl_opt_transit_parent;
550
static int hf_icmpv6_rpl_opt_solicited_instance;
551
static int hf_icmpv6_rpl_opt_solicited_flag;
552
static int hf_icmpv6_rpl_opt_solicited_flag_v;
553
static int hf_icmpv6_rpl_opt_solicited_flag_i;
554
static int hf_icmpv6_rpl_opt_solicited_flag_d;
555
static int hf_icmpv6_rpl_opt_solicited_flag_rsv;
556
static int hf_icmpv6_rpl_opt_solicited_dodagid;
557
static int hf_icmpv6_rpl_opt_solicited_version;
558
static int hf_icmpv6_rpl_opt_prefix;
559
static int hf_icmpv6_rpl_opt_prefix_flag;
560
static int hf_icmpv6_rpl_opt_prefix_flag_l;
561
static int hf_icmpv6_rpl_opt_prefix_flag_a;
562
static int hf_icmpv6_rpl_opt_prefix_flag_r;
563
static int hf_icmpv6_rpl_opt_prefix_flag_rsv;
564
static int hf_icmpv6_rpl_opt_prefix_vlifetime;
565
static int hf_icmpv6_rpl_opt_prefix_plifetime;
566
static int hf_icmpv6_rpl_opt_prefix_length;
567
static int hf_icmpv6_rpl_opt_targetdesc;
568
static int hf_icmpv6_rpl_opt_route_discovery_flag;
569
static int hf_icmpv6_rpl_opt_route_discovery_reply;
570
static int hf_icmpv6_rpl_opt_route_discovery_hop_by_hop;
571
static int hf_icmpv6_rpl_opt_route_discovery_num_of_routes;
572
static int hf_icmpv6_rpl_opt_route_discovery_compr;
573
static int hf_icmpv6_rpl_opt_route_discovery_lifetime;
574
static int hf_icmpv6_rpl_opt_route_discovery_nh;
575
static int hf_icmpv6_rpl_opt_route_discovery_maxrank;
576
static int hf_icmpv6_rpl_opt_route_discovery_target_addr;
577
static int hf_icmpv6_rpl_opt_route_discovery_addr_vec;
578
static int hf_icmpv6_rpl_opt_route_discovery_addr_vec_addr;
579
static int hf_icmpv6_rpl_p2p_dro_instance;
580
static int hf_icmpv6_rpl_p2p_dro_version;
581
static int hf_icmpv6_rpl_p2p_dro_flag;
582
static int hf_icmpv6_rpl_p2p_dro_flag_stop;
583
static int hf_icmpv6_rpl_p2p_dro_flag_ack;
584
static int hf_icmpv6_rpl_p2p_dro_flag_seq;
585
static int hf_icmpv6_rpl_p2p_dro_flag_reserved;
586
static int hf_icmpv6_rpl_p2p_dro_dagid;
587
static int hf_icmpv6_rpl_p2p_droack_flag;
588
static int hf_icmpv6_rpl_p2p_droack_flag_seq;
589
static int hf_icmpv6_rpl_p2p_droack_flag_reserved;
590
591
/* RFC6743 Locator Update (156) */
592
static int hf_icmpv6_ilnp_nb_locs;
593
static int hf_icmpv6_ilnp_locator;
594
static int hf_icmpv6_ilnp_preference;
595
static int hf_icmpv6_ilnp_lifetime;
596
597
static int hf_icmpv6_da_code_prefix;
598
static int hf_icmpv6_da_code_suffix;
599
static int hf_icmpv6_dar_code_suffix;
600
static int hf_icmpv6_dac_code_suffix;
601
static int hf_icmpv6_da_status;
602
static int hf_icmpv6_da_rsv;
603
static int hf_icmpv6_da_lifetime;
604
static int hf_icmpv6_da_rovr;
605
static int hf_icmpv6_da_eui64;
606
static int hf_icmpv6_da_raddr;
607
608
static heur_dissector_list_t icmpv6_heur_subdissector_list;
609
static int icmpv6_tap;
610
611
/* RFC 7731 MPL (159) */
612
static int hf_icmpv6_mpl_seed_info_min_sequence;
613
static int hf_icmpv6_mpl_seed_info_bm_len;
614
static int hf_icmpv6_mpl_seed_info_s;
615
static int hf_icmpv6_mpl_seed_info_seed_id;
616
static int hf_icmpv6_mpl_seed_info_sequence;
617
618
/* Extended Echo - Probe  (RFC8335)*/
619
static int hf_icmpv6_ext_echo_seq_num;
620
static int hf_icmpv6_ext_echo_req_reserved;
621
static int hf_icmpv6_ext_echo_req_local;
622
static int hf_icmpv6_ext_echo_rsp_state;
623
static int hf_icmpv6_ext_echo_rsp_reserved;
624
static int hf_icmpv6_ext_echo_rsp_active;
625
static int hf_icmpv6_ext_echo_rsp_ipv4;
626
static int hf_icmpv6_ext_echo_rsp_ipv6;
627
628
/* Conversation related data */
629
static int hf_icmpv6_resp_in;
630
static int hf_icmpv6_resp_to;
631
static int hf_icmpv6_no_resp;
632
static int hf_icmpv6_resptime;
633
634
typedef struct _icmpv6_conv_info_t {
635
    wmem_tree_t *unmatched_pdus;
636
    wmem_tree_t *matched_pdus;
637
} icmpv6_conv_info_t;
638
639
static icmp_transaction_t *transaction_start(packet_info *pinfo, proto_tree *tree, uint32_t *key);
640
static icmp_transaction_t *transaction_end(packet_info *pinfo, proto_tree *tree, uint32_t *key);
641
642
static int ett_icmpv6;
643
static int ett_icmpv6_opt;
644
static int ett_icmpv6_mar;
645
static int ett_icmpv6_flag_prefix;
646
static int ett_icmpv6_flag_map;
647
static int ett_icmpv6_flag_pvd_id;
648
static int ett_icmpv6_flag_route_info;
649
static int ett_icmpv6_flag_6lowpan;
650
static int ett_icmpv6_flag_efo;
651
static int ett_icmpv6_flag_earo;
652
static int ett_icmpv6_rpl_opt;
653
static int ett_icmpv6_rpl_metric_type;
654
static int ett_icmpv6_rpl_metric_flags;
655
static int ett_icmpv6_rpl_metric_nsa_object;
656
static int ett_icmpv6_rpl_metric_nsa_object_tlv_type;
657
static int ett_icmpv6_rpl_metric_ne_object;
658
static int ett_icmpv6_rpl_metric_hp_object;
659
static int ett_icmpv6_rpl_metric_lql_object;
660
static int ett_icmpv6_rpl_metric_lc_object;
661
static int ett_icmpv6_rpl_flag_routing;
662
static int ett_icmpv6_rpl_flag_config;
663
static int ett_icmpv6_rpl_flag_transit;
664
static int ett_icmpv6_rpl_flag_solicited;
665
static int ett_icmpv6_rpl_flag_prefix;
666
static int ett_icmpv6_rpl_route_discovery_flag;
667
static int ett_icmpv6_rpl_route_discovery_addr_vec;
668
static int ett_icmpv6_rpl_transit_pathctl;
669
static int ett_icmpv6_rpl_p2p_dro_flag;
670
static int ett_icmpv6_rpl_p2p_droack_flag;
671
static int ett_icmpv6_flag_ni;
672
static int ett_icmpv6_flag_rr;
673
static int ett_icmpv6_rr_mp;
674
static int ett_icmpv6_rr_up;
675
static int ett_icmpv6_rr_up_flag_mask;
676
static int ett_icmpv6_rr_up_flag_ra;
677
static int ett_icmpv6_rr_up_flag;
678
static int ett_icmpv6_rr_rm;
679
static int ett_icmpv6_rr_rm_flag;
680
static int ett_icmpv6_flag_mld;
681
static int ett_icmpv6_flag_ra;
682
static int ett_icmpv6_flag_na;
683
static int ett_icmpv6_flag_mip6;
684
static int ett_icmpv6_flag_fmip6;
685
static int ett_icmpv6_flag_secure;
686
static int ett_icmpv6_flag_rpl_dio;
687
static int ett_icmpv6_flag_rpl_dao;
688
static int ett_icmpv6_flag_rpl_daoack;
689
static int ett_icmpv6_flag_rpl_dco;
690
static int ett_icmpv6_flag_rpl_dcoack;
691
static int ett_icmpv6_flag_rpl_cc;
692
static int ett_icmpv6_flag_6cio;
693
static int ett_icmpv6_opt_name;
694
static int ett_icmpv6_cga_param_name;
695
static int ett_icmpv6_mpl_seed_info;
696
static int ett_icmpv6_mpl_seed_info_bm;
697
static int ett_icmpv6_opt_dnr_addrs;
698
699
static expert_field ei_icmpv6_type_error;
700
static expert_field ei_icmpv6_invalid_option_length;
701
static expert_field ei_icmpv6_opt_dnr_adn_only_mode;
702
static expert_field ei_icmpv6_undecoded_option;
703
static expert_field ei_icmpv6_unknown_data;
704
static expert_field ei_icmpv6_undecoded_rpl_option;
705
static expert_field ei_icmpv6_undecoded_type;
706
static expert_field ei_icmpv6_rr_pco_mp_matchlen;
707
static expert_field ei_icmpv6_rr_pco_mp_matchedlen;
708
static expert_field ei_icmpv6_checksum;
709
static expert_field ei_icmpv6_resp_not_found;
710
static expert_field ei_icmpv6_rpl_unknown_metric;
711
static expert_field ei_icmpv6_rpl_p2p_hop_by_hop;
712
static expert_field ei_icmpv6_rpl_p2p_num_of_routes;
713
static expert_field ei_icmpv6_rpl_p2p_dro_rdo_zero;
714
static expert_field ei_icmpv6_rpl_p2p_dro_zero;
715
716
static dissector_handle_t icmpv6_handle;
717
718
static dissector_handle_t ipv6_handle;
719
static dissector_handle_t icmp_extension_handle;
720
static dissector_handle_t svc_params_handle;
721
722
/* Cached protocol identifier */
723
static int proto_ieee802154;
724
725
354
#define ICMP6_DST_UNREACH                 1
726
785
#define ICMP6_PACKET_TOO_BIG              2
727
1.08k
#define ICMP6_TIME_EXCEEDED               3
728
196
#define ICMP6_PARAM_PROB                  4
729
5.13k
#define ICMP6_ECHO_REQUEST              128
730
2.54k
#define ICMP6_ECHO_REPLY                129
731
48
#define ICMP6_MEMBERSHIP_QUERY          130
732
23
#define ICMP6_MEMBERSHIP_REPORT         131
733
26
#define ICMP6_MEMBERSHIP_REDUCTION      132
734
4
#define ICMP6_ND_ROUTER_SOLICIT         133
735
89
#define ICMP6_ND_ROUTER_ADVERT          134
736
32
#define ICMP6_ND_NEIGHBOR_SOLICIT       135
737
35
#define ICMP6_ND_NEIGHBOR_ADVERT        136
738
36
#define ICMP6_ND_REDIRECT               137
739
170
#define ICMP6_ROUTER_RENUMBERING        138
740
32
#define ICMP6_NI_QUERY                  139
741
31
#define ICMP6_NI_REPLY                  140
742
14
#define ICMP6_IND_SOLICIT               141
743
29
#define ICMP6_IND_ADVERT                142
744
31
#define ICMP6_MLDV2_REPORT              143
745
2
#define ICMP6_MIP6_DHAAD_REQUEST        144
746
15
#define ICMP6_MIP6_DHAAD_REPLY          145
747
2
#define ICMP6_MIP6_MPS                  146
748
22
#define ICMP6_MIP6_MPA                  147
749
17
#define ICMP6_CERT_PATH_SOL             148
750
20
#define ICMP6_CERT_PATH_AD              149
751
22
#define ICMP6_EXPERIMENTAL_MOBILITY     150
752
4
#define ICMP6_MCAST_ROUTER_ADVERT       151
753
10
#define ICMP6_MCAST_ROUTER_SOLICIT      152
754
14
#define ICMP6_MCAST_ROUTER_TERM         153
755
33
#define ICMP6_FMIPV6_MESSAGES           154
756
714
#define ICMP6_RPL_CONTROL               155
757
16
#define ICMP6_ILNPV6                    156
758
2.54k
#define ICMP6_6LOWPANND_DAR             157
759
2.54k
#define ICMP6_6LOWPANND_DAC             158
760
99
#define ICMP6_MPL_CONTROL               159
761
4
#define ICMP6_EXTECHO                   160
762
6
#define ICMP6_EXTECHOREPLY              161
763
764
765
static const value_string icmpv6_type_val[] = {
766
    { ICMP6_DST_UNREACH,           "Destination Unreachable" },                         /* [RFC4443] */
767
    { ICMP6_PACKET_TOO_BIG,        "Packet Too Big" },                                  /* [RFC4443] */
768
    { ICMP6_TIME_EXCEEDED,         "Time Exceeded" },                                   /* [RFC4443] */
769
    { ICMP6_PARAM_PROB,            "Parameter Problem" },                               /* [RFC4443] */
770
    { 100,                         "Private experimentation" },                         /* [RFC4443] */
771
    { 101,                         "Private experimentation" },                         /* [RFC4443] */
772
    { 127,                         "Reserved for expansion of ICMPv6 error messages" }, /* [RFC4443] */
773
    { ICMP6_ECHO_REQUEST,          "Echo (ping) request" },                             /* [RFC4443] */
774
    { ICMP6_ECHO_REPLY,            "Echo (ping) reply" },                               /* [RFC4443] */
775
    { ICMP6_MEMBERSHIP_QUERY,      "Multicast Listener Query" },                        /* [RFC2710] */
776
    { ICMP6_MEMBERSHIP_REPORT,     "Multicast Listener Report" },                       /* [RFC2710] */
777
    { ICMP6_MEMBERSHIP_REDUCTION,  "Multicast Listener Done" },                         /* [RFC2710] */
778
    { ICMP6_ND_ROUTER_SOLICIT,     "Router Solicitation" },                             /* [RFC4861] */
779
    { ICMP6_ND_ROUTER_ADVERT,      "Router Advertisement" },                            /* [RFC4861] */
780
    { ICMP6_ND_NEIGHBOR_SOLICIT,   "Neighbor Solicitation" },                           /* [RFC4861] */
781
    { ICMP6_ND_NEIGHBOR_ADVERT,    "Neighbor Advertisement" },                          /* [RFC4861] */
782
    { ICMP6_ND_REDIRECT,           "Redirect" },                                        /* [RFC4861] */
783
    { ICMP6_ROUTER_RENUMBERING,    "Router Renumbering" },                              /* [RFC2894] */
784
    { ICMP6_NI_QUERY,              "Node Information Query" },                          /* [RFC4620] */
785
    { ICMP6_NI_REPLY,              "Node Information Reply" },                          /* [RFC4620] */
786
    { ICMP6_IND_SOLICIT,           "Inverse Neighbor Discovery Solicitation" },         /* [RFC3122] */
787
    { ICMP6_IND_ADVERT,            "Inverse Neighbor Discovery Advertisement" },        /* [RFC3122] */
788
    { ICMP6_MLDV2_REPORT,          "Multicast Listener Report Message v2" },            /* [RFC3810] */
789
    { ICMP6_MIP6_DHAAD_REQUEST,    "Home Agent Address Discovery Request" },            /* [RFC6275] */
790
    { ICMP6_MIP6_DHAAD_REPLY,      "Home Agent Address Discovery Reply" },              /* [RFC6275] */
791
    { ICMP6_MIP6_MPS,              "Mobile Prefix Solicitation" },                      /* [RFC6275] */
792
    { ICMP6_MIP6_MPA,              "Mobile Prefix Advertisement" },                     /* [RFC6275] */
793
    { ICMP6_CERT_PATH_SOL,         "Certification Path Solicitation" },                 /* [RFC3971] */
794
    { ICMP6_CERT_PATH_AD,          "Certification Path Advertisement" },                /* [RFC3971] */
795
    { ICMP6_EXPERIMENTAL_MOBILITY, "Experimental Mobility" },                           /* [RFC4065] */
796
    { ICMP6_MCAST_ROUTER_ADVERT,   "Multicast Router Advertisement" },                  /* [RFC4286] */
797
    { ICMP6_MCAST_ROUTER_SOLICIT,  "Multicast Router Solicitation" },                   /* [RFC4286] */
798
    { ICMP6_MCAST_ROUTER_TERM,     "Multicast Router Termination" },                    /* [RFC4286] */
799
    { ICMP6_FMIPV6_MESSAGES,       "FMIPv6" },                                          /* [RFC5568] */
800
    { ICMP6_RPL_CONTROL,           "RPL Control" },                                     /* [RFC6550] */
801
    { ICMP6_ILNPV6,                "Locator Update"},                                   /* [RFC6743] */
802
    { ICMP6_6LOWPANND_DAR,         "Duplicate Address Request"},                        /* [RFC6775] */
803
    { ICMP6_6LOWPANND_DAC,         "Duplicate Address Confirmation"},                   /* [RFC6775] */
804
    { ICMP6_MPL_CONTROL,           "MPL Control Message"},                              /* [RFC7731] */
805
    { ICMP6_EXTECHO,               "Extended Echo request"},                            /* [RFC8335] */
806
    { ICMP6_EXTECHOREPLY,          "Extended Echo reply"},                              /* [RFC8335] */
807
    { 200,                         "Private experimentation" },                         /* [RFC4443] */
808
    { 201,                         "Private experimentation" },                         /* [RFC4443] */
809
    { 255,                         "Reserved for expansion of ICMPv6 informational messages" }, /* [RFC4443] */
810
    { 0, NULL }
811
};
812
813
#define ICMP6_DST_UNREACH_NOROUTE               0       /* no route to destination */
814
#define ICMP6_DST_UNREACH_ADMIN                 1       /* administratively prohibited */
815
#define ICMP6_DST_UNREACH_NOTNEIGHBOR           2       /* not a neighbor(obsolete) */
816
#define ICMP6_DST_UNREACH_BEYONDSCOPE           2       /* beyond scope of source address */
817
#define ICMP6_DST_UNREACH_ADDR                  3       /* address unreachable */
818
#define ICMP6_DST_UNREACH_NOPORT                4       /* port unreachable */
819
#define ICMP6_DST_UNREACH_INGR_EGR              5       /* source address failed ingress/egress policy */
820
#define ICMP6_DST_UNREACH_REJECT                6       /* reject route to destination */
821
#define ICMP6_DST_UNREACH_ERROR                 7       /* error in Source Routing Header */
822
#define ICMP6_DST_UNREACH_HEADERS_TOO_LONG      8       /* headers too long */
823
824
static const value_string icmpv6_unreach_code_val[] = {
825
    { ICMP6_DST_UNREACH_NOROUTE,          "No route to destination" },
826
    { ICMP6_DST_UNREACH_ADMIN,            "Administratively prohibited" },
827
    { ICMP6_DST_UNREACH_BEYONDSCOPE,      "Beyond scope of source address" },
828
    { ICMP6_DST_UNREACH_ADDR,             "Address unreachable" },
829
    { ICMP6_DST_UNREACH_NOPORT,           "Port unreachable" },
830
    { ICMP6_DST_UNREACH_INGR_EGR,         "Source address failed ingress/egress policy" },
831
    { ICMP6_DST_UNREACH_REJECT,           "Reject route to destination" },
832
    { ICMP6_DST_UNREACH_ERROR,            "Error in Source Routing Header" }, /* [RFC6550] [RFC6554] */
833
    { ICMP6_DST_UNREACH_HEADERS_TOO_LONG, "Headers too long" }, /* [RFC8883] */
834
    { 0, NULL }
835
};
836
837
#define ICMP6_TIME_EXCEED_TRANSIT       0       /* ttl==0 in transit */
838
#define ICMP6_TIME_EXCEED_REASSEMBLY    1       /* ttl==0 in reass */
839
840
static const value_string icmpv6_timeex_code_val[] = {
841
    { ICMP6_TIME_EXCEED_TRANSIT,    "Hop limit exceeded in transit" },
842
    { ICMP6_TIME_EXCEED_REASSEMBLY, "Fragment reassembly time exceeded" },
843
    { 0, NULL }
844
};
845
846
#define ICMP6_PARAMPROB_HEADER                  0       /* erroneous header field */
847
#define ICMP6_PARAMPROB_NEXTHEADER              1       /* unrecognized next header */
848
#define ICMP6_PARAMPROB_OPTION                  2       /* unrecognized option */
849
#define ICMP6_PARAMPROB_FIRSTFRAG               3       /* IPv6 First Fragment has incomplete IPv6 Header Chain [RFC 7112] */
850
#define ICMP6_PARAMPROB_HEADERERROR             4       /* SR Upper-layer Header Error [RFC8754] */
851
#define ICMP6_PARAMPROB_NEXTHEADER_INTERMEDIATE 5       /* Unrecognized Next Header type encountered by intermediate node [RFC8883] */
852
#define ICMP6_PARAMPROB_HEADER_TOO_BIG          6       /* Extension header too big [RFC8883] */
853
#define ICMP6_PARAMPROB_HEADER_CHAIN_TOO_LONG   7       /* Extension header chain too long [RFC8883] */
854
#define ICMP6_PARAMPROB_TOO_MANY_EXTENTIONS     8       /* Too many extension headers [RFC8883] */
855
#define ICMP6_PARAMPROB_TOO_MANY_OPTIONS        9       /* Too many options in extension header [RFC8883] */
856
#define ICMP6_PARAMPROB_OPTION_TOO_BIG         10       /* Option too big [RFC8883] */
857
858
static const value_string icmpv6_paramprob_code_val[] = {
859
    { ICMP6_PARAMPROB_HEADER,                  "Erroneous header field encountered" },
860
    { ICMP6_PARAMPROB_NEXTHEADER,              "Unrecognized Next Header type encountered" },
861
    { ICMP6_PARAMPROB_OPTION,                  "Unrecognized IPv6 option encountered" },
862
    { ICMP6_PARAMPROB_FIRSTFRAG,               "IPv6 First Fragment has incomplete IPv6 Header Chain" },
863
    { ICMP6_PARAMPROB_HEADERERROR,             "SR Upper-layer Header Error" },
864
    { ICMP6_PARAMPROB_NEXTHEADER_INTERMEDIATE, "Unrecognized Next Header type encountered by intermediate node" },
865
    { ICMP6_PARAMPROB_HEADER_TOO_BIG,          "Extension header too big" },
866
    { ICMP6_PARAMPROB_HEADER_CHAIN_TOO_LONG,   "Extension header chain too long" },
867
    { ICMP6_PARAMPROB_TOO_MANY_EXTENTIONS,     "Too many extension headers" },
868
    { ICMP6_PARAMPROB_TOO_MANY_OPTIONS,        "Too many options in extension header" },
869
    { ICMP6_PARAMPROB_OPTION_TOO_BIG,          "Option too big" },
870
    { 0, NULL }
871
};
872
873
874
/* RFC2894 - Router Renumbering for IPv6 */
875
876
83
#define ICMP6_ROUTER_RENUMBERING_COMMAND          0     /* rr command */
877
23
#define ICMP6_ROUTER_RENUMBERING_RESULT           1     /* rr result */
878
#define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255     /* rr seq num reset */
879
880
static const value_string icmpv6_rr_code_val[] = {
881
    { ICMP6_ROUTER_RENUMBERING_COMMAND,      "Command" },
882
    { ICMP6_ROUTER_RENUMBERING_RESULT,       "Result" },
883
    { ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET, "Sequence number reset" },
884
    { 0, NULL }
885
};
886
887
15
#define RR_FLAG_T       0x80
888
15
#define RR_FLAG_R       0x40
889
15
#define RR_FLAG_A       0x20
890
15
#define RR_FLAG_S       0x10
891
15
#define RR_FLAG_P       0x08
892
15
#define RR_FLAG_RSV     0x07
893
894
static const value_string rr_pco_mp_opcode_val[] = {
895
    { 1,    "Add" },
896
    { 2,    "Change" },
897
    { 3,    "Set Global" },
898
    { 0,    NULL }
899
};
900
901
902
/* RFC3810 - Multicast Listener Discovery Version 2 (MLDv2) for IPv6 */
903
904
22
#define MLDV2_PACKET_MINLEN 28
905
906
15
#define MLD_FLAG_S      0x08
907
15
#define MLD_FLAG_QRV    0x07
908
15
#define MLD_FLAG_RSV    0xF0
909
910
static const value_string mldr_record_type_val[] = {
911
    { 1, "Include" },
912
    { 2, "Exclude" },
913
    { 3, "Changed to include" },
914
    { 4, "Changed to exclude" },
915
    { 5, "Allow new sources" },
916
    { 6, "Block old sources" },
917
    { 0, NULL }
918
};
919
920
/* RFC 4068/5268/5568: Fast Handovers for Mobile IPv6 ( Mobile IPv6 Fast Handovers ) */
921
922
3
#define FMIP6_SUBTYPE_RTSOLPR   2
923
2
#define FMIP6_SUBTYPE_PRRTADV   3
924
1
#define FMIP6_SUBTYPE_HI        4
925
1
#define FMIP6_SUBTYPE_HACK      5
926
927
static const value_string fmip6_subtype_val[] = {
928
    { FMIP6_SUBTYPE_RTSOLPR,    "Router Solicitation for Proxy Advertisement" },
929
    { FMIP6_SUBTYPE_PRRTADV,    "Proxy Router Advertisement" },
930
    { FMIP6_SUBTYPE_HI,         "Handover Initiate" },
931
    { FMIP6_SUBTYPE_HACK,       "Handover Acknowledge" },
932
    { 0,                        NULL }
933
};
934
935
static const value_string fmip6_prrtadv_code_val[] = {
936
    { 0,   "MN should use AP-ID, AR-info tuple" },
937
    { 1,   "Network Initiated Handover trigger" },
938
    { 2,   "No new router information" },
939
    { 3,   "Limited new router information" },
940
    { 4,   "Unsolicited" },
941
    { 0,    NULL }
942
};
943
944
static const value_string fmip6_hi_code_val[] = {
945
    { 0,    "FBU sent from previous link" },
946
    { 1,    "FBU sent from new link" },
947
    { 0,    NULL }
948
};
949
950
static const value_string fmip6_hack_code_val[] = {
951
    { 0,    "Handover Accepted, NCoA valid" },
952
    { 1,    "Handover Accepted, NCoA not valid" },
953
    { 2,    "Handover Accepted, NCoA in use" },
954
    { 3,    "Handover Accepted, NCoA assigned" },
955
    { 4,    "Handover Accepted, NCoA not assigned" },
956
    { 128,  "Handover Not Accepted, reason unspecified" },
957
    { 129,  "Administratively prohibited" },
958
    { 130,  "Insufficient resources" },
959
    { 0,    NULL }
960
};
961
962
15
#define FMIP6_HI_FLAG_S     0x80
963
15
#define FMIP6_HI_FLAG_U     0x40
964
15
#define FMIP6_HI_FLAG_RSV   0x3F
965
966
/* RFC 4620 - IPv6 Node Information Queries */
967
968
2
#define ICMP6_NI_SUBJ_IPV6      0   /* Query Subject is an IPv6 address */
969
1
#define ICMP6_NI_SUBJ_FQDN      1   /* Query Subject is a Domain name */
970
1
#define ICMP6_NI_SUBJ_IPV4      2   /* Query Subject is an IPv4 address */
971
972
#define ICMP6_NI_SUCCESS        0   /* node information successful reply */
973
#define ICMP6_NI_REFUSED        1   /* node information request is refused */
974
#define ICMP6_NI_UNKNOWN        2   /* unknown Qtype */
975
976
0
#define NI_QTYPE_NOOP           0   /* NOOP  */
977
#define NI_QTYPE_SUPTYPES       1   /* Supported Qtypes (Obso) */
978
0
#define NI_QTYPE_NODENAME       2   /* Node Name */
979
2
#define NI_QTYPE_NODEADDR       3   /* Node Addresses */
980
6
#define NI_QTYPE_IPV4ADDR       4   /* IPv4 Addresses */
981
982
static const value_string ni_query_code_val[] = {
983
    { ICMP6_NI_SUBJ_IPV6,   "Query subject = IPv6 addresses" },
984
    { ICMP6_NI_SUBJ_FQDN,   "Query subject = DNS name or empty" },
985
    { ICMP6_NI_SUBJ_IPV4,   "Query subject = IPv4 addresses" },
986
    { 0, NULL }
987
};
988
989
static const value_string ni_reply_code_val[] = {
990
    { ICMP6_NI_SUCCESS,   "Successful" },
991
    { ICMP6_NI_REFUSED,   "Refused" },
992
    { ICMP6_NI_UNKNOWN,   "Unknown query type" },
993
    { 0, NULL }
994
};
995
static const value_string ni_qtype_val[] = {
996
    { NI_QTYPE_NOOP,            "NOOP" },
997
    { NI_QTYPE_SUPTYPES,        "Supported query types (Obsolete)" },
998
    { NI_QTYPE_NODENAME,        "Node Name" },
999
    { NI_QTYPE_NODEADDR,        "Node addresses" },
1000
    { NI_QTYPE_IPV4ADDR,        "IPv4 node addresses" },
1001
    { 0,                        NULL }
1002
};
1003
1004
15
#define NI_FLAG_G       0x0020
1005
15
#define NI_FLAG_S       0x0010
1006
15
#define NI_FLAG_L       0x0008
1007
15
#define NI_FLAG_C       0x0004
1008
15
#define NI_FLAG_A       0x0002
1009
15
#define NI_FLAG_T       0x0001
1010
15
#define NI_FLAG_RSV     0xFFC0
1011
1012
static const true_false_string tfs_ni_flag_a = {
1013
    "All unicast address",
1014
    "Unicast addresses on the queried interface"
1015
};
1016
1017
157
#define ND_OPT_SOURCE_LINKADDR           1
1018
83
#define ND_OPT_TARGET_LINKADDR           2
1019
39
#define ND_OPT_PREFIX_INFORMATION        3
1020
31
#define ND_OPT_REDIRECTED_HEADER         4
1021
53
#define ND_OPT_MTU                       5
1022
6
#define ND_OPT_NBMA                      6
1023
14
#define ND_OPT_ADVINTERVAL               7
1024
9
#define ND_OPT_HOMEAGENT_INFO            8
1025
25
#define ND_OPT_SOURCE_ADDRLIST           9
1026
53
#define ND_OPT_TARGET_ADDRLIST          10
1027
25
#define ND_OPT_CGA                      11
1028
8
#define ND_OPT_RSA                      12
1029
15
#define ND_OPT_TIMESTAMP                13
1030
8
#define ND_OPT_NONCE                    14
1031
8
#define ND_OPT_TRUST_ANCHOR             15
1032
18
#define ND_OPT_CERTIFICATE              16
1033
6
#define ND_OPT_IP_ADDRESS_PREFIX        17
1034
4
#define ND_OPT_NEW_ROUTER_PREFIX_INFO   18
1035
3
#define ND_OPT_LINK_LAYER_ADDRESS       19
1036
5
#define ND_OPT_NEIGHBOR_ADV_ACK         20
1037
39
#define ND_OPT_PVD_ID                   21
1038
7
#define ND_OPT_MAP                      23
1039
7
#define ND_OPT_ROUTE_INFO               24
1040
22
#define ND_OPT_RECURSIVE_DNS_SERVER     25
1041
4
#define ND_OPT_FLAGS_EXTENSION          26
1042
8
#define ND_OPT_HANDOVER_KEY_REQUEST     27
1043
8
#define ND_OPT_HANDOVER_KEY_REPLY       28
1044
14
#define ND_OPT_HANDOVER_ASSIST_INFO     29
1045
5
#define ND_OPT_MOBILE_NODE_ID           30
1046
22
#define ND_OPT_DNS_SEARCH_LIST          31
1047
39
#define ND_OPT_PROXY_SIGNATURE          32
1048
11
#define ND_OPT_ADDR_REGISTRATION        33
1049
9
#define ND_OPT_6LOWPAN_CONTEXT          34
1050
4
#define ND_OPT_AUTH_BORDER_ROUTER       35
1051
4
#define ND_OPT_6CIO                     36
1052
3
#define ND_OPT_CAPPORT                  37
1053
20
#define ND_OPT_PREF64                   38
1054
#define ND_OPT_CRYPTOID_PARAMETERS      39
1055
#define ND_OPT_NDP_SIGNATURE            40
1056
#define ND_OPT_RESOURCE_DIR_ADDRESS     41
1057
#define ND_OPT_CONSISTENT_UPTIME        42
1058
13
#define ND_OPT_ENCRYPTED_DNS           144
1059
1060
static const value_string option_vals[] = {
1061
/*  1 */   { ND_OPT_SOURCE_LINKADDR,           "Source link-layer address" },
1062
/*  2 */   { ND_OPT_TARGET_LINKADDR,           "Target link-layer address" },
1063
/*  3 */   { ND_OPT_PREFIX_INFORMATION,        "Prefix information" },
1064
/*  4 */   { ND_OPT_REDIRECTED_HEADER,         "Redirected header" },
1065
/*  5 */   { ND_OPT_MTU,                       "MTU" },
1066
/*  6 */   { ND_OPT_NBMA,                      "NBMA Shortcut Limit Option" },             /* [RFC2491] */
1067
/*  7 */   { ND_OPT_ADVINTERVAL,               "Advertisement Interval" },                 /* [RFC6275] */
1068
/*  8 */   { ND_OPT_HOMEAGENT_INFO,            "Home Agent Information" },                 /* [RFC6275] */
1069
/*  9 */   { ND_OPT_SOURCE_ADDRLIST,           "Source Address List" },                    /* [RFC3122] */
1070
/* 10 */   { ND_OPT_TARGET_ADDRLIST,           "Target Address List" },                    /* [RFC3122] */
1071
/* 11 */   { ND_OPT_CGA,                       "CGA" },                                    /* [RFC3971] */
1072
/* 12 */   { ND_OPT_RSA,                       "RSA Signature" },                          /* [RFC3971] */
1073
/* 13 */   { ND_OPT_TIMESTAMP,                 "Timestamp" },                              /* [RFC3971] */
1074
/* 14 */   { ND_OPT_NONCE,                     "Nonce" },                                  /* [RFC3971] */
1075
/* 15 */   { ND_OPT_TRUST_ANCHOR,              "Trust Anchor" },                           /* [RFC3971] */
1076
/* 16 */   { ND_OPT_CERTIFICATE,               "Certificate" },                            /* [RFC3971] */
1077
/* 17 */   { ND_OPT_IP_ADDRESS_PREFIX,         "IP Address/Prefix Option" },               /* [RFC5568] */
1078
/* 18 */   { ND_OPT_NEW_ROUTER_PREFIX_INFO,    "New Router Prefix Information" },          /* [RFC4068] OBSO */
1079
/* 19 */   { ND_OPT_LINK_LAYER_ADDRESS,        "Link-layer Address" },                     /* [RFC5568] */
1080
/* 20 */   { ND_OPT_NEIGHBOR_ADV_ACK,          "Neighbor Advertisement Acknowledgment" },  /* [RFC5568] */
1081
/* 21 */   { ND_OPT_PVD_ID,                    "PvD ID" },                                 /* [RFC8801] */
1082
/* 22   Unassigned */
1083
/* 23 */   { ND_OPT_MAP,                       "MAP" },                                    /* [RFC4140] */
1084
/* 24 */   { ND_OPT_ROUTE_INFO,                "Route Information" },                      /* [RFC4191] */
1085
/* 25 */   { ND_OPT_RECURSIVE_DNS_SERVER,      "Recursive DNS Server" },                   /* [RFC6106] */
1086
/* 26 */   { ND_OPT_FLAGS_EXTENSION,           "RA Flags Extension" },                     /* [RFC5175] */
1087
/* 27 */   { ND_OPT_HANDOVER_KEY_REQUEST,      "Handover Key Request" },                   /* [RFC5269] */
1088
/* 28 */   { ND_OPT_HANDOVER_KEY_REPLY,        "Handover Key Reply" },                     /* [RFC5269] */
1089
/* 29 */   { ND_OPT_HANDOVER_ASSIST_INFO,      "Handover Assist Information" },            /* [RFC5271] */
1090
/* 30 */   { ND_OPT_MOBILE_NODE_ID,            "Mobile Node Identifier Option" },          /* [RFC5271] */
1091
/* 31 */   { ND_OPT_DNS_SEARCH_LIST,           "DNS Search List Option" },                 /* [RFC6106] */
1092
/* 32 */   { ND_OPT_PROXY_SIGNATURE,           "Proxy Signature (PS)" },                   /* [RFC6496] */
1093
/* 33 */   { ND_OPT_ADDR_REGISTRATION,         "Address Registration Option" },            /* [RFC6775] */
1094
/* 34 */   { ND_OPT_6LOWPAN_CONTEXT,           "6LoWPAN Context Option" },                 /* [RFC6775] */
1095
/* 35 */   { ND_OPT_AUTH_BORDER_ROUTER,        "Authoritative Border Router" },            /* [RFC6775] */
1096
/* 36 */   { ND_OPT_6CIO,                      "6LoWPAN Capability Indication Option" },   /* [RFC7400] */
1097
/* 37 */   { ND_OPT_CAPPORT,                   "DHCP Captive-Portal" },                    /* [RFC7710] */
1098
/* 38 */   { ND_OPT_PREF64,                    "PREF64 Option" },                          /* [RFC8781] */
1099
/* 39 */   { ND_OPT_CRYPTOID_PARAMETERS,       "Crypto-ID Parameters Option (CIPO)" },     /* [RFC8928] */
1100
/* 40 */   { ND_OPT_NDP_SIGNATURE,             "NDP Signature Option (NDPSO)" },           /* [RFC8928] */
1101
/* 41 */   { ND_OPT_RESOURCE_DIR_ADDRESS,      "Resource Directory Address Option" },      /* [RFC9176] */
1102
/* 42 */   { ND_OPT_CONSISTENT_UPTIME,         "Consistent Uptime Option" },               /* [RFC-ietf-6lo-multicast-registration-19] */
1103
/* 43-137  Unassigned */
1104
   { 138,                              "CARD Request" },                           /* [RFC4065] */
1105
   { 139,                              "CARD Reply" },                             /* [RFC4065] */
1106
/* 140-143 Unassigned */
1107
/* 144 */  { ND_OPT_ENCRYPTED_DNS,             "Encrypted DNS Option" },                   /* [RFC9463] */
1108
/* 145-252 Unassigned */
1109
   { 253,                              "RFC3692-style Experiment 1" },             /* [RFC4727] */
1110
   { 254,                              "RFC3692-style Experiment 2" },             /* [RFC4727] */
1111
   { 0,                                NULL }
1112
};
1113
1114
15
#define ND_RA_FLAG_M    0x80
1115
15
#define ND_RA_FLAG_O    0x40
1116
15
#define ND_RA_FLAG_H    0x20
1117
15
#define ND_RA_FLAG_PRF  0x18
1118
15
#define ND_RA_FLAG_P    0x04
1119
15
#define ND_RA_FLAG_S    0x02
1120
15
#define ND_RA_FLAG_RSV  0x01
1121
1122
45
#define ND_NA_FLAG_R    0x80000000
1123
45
#define ND_NA_FLAG_S    0x40000000
1124
45
#define ND_NA_FLAG_O    0x20000000
1125
15
#define ND_NA_FLAG_RSV  0x1FFFFFFF
1126
1127
static const value_string nd_flag_router_pref[] = {
1128
    { 0, "Medium" },
1129
    { 1, "High" },
1130
    { 2, "Reserved" },
1131
    { 3, "Low" },
1132
    { 0, NULL}
1133
};
1134
1135
static const value_string nd_opt_ipa_option_code_val[] = {
1136
    { 1, "Old Care-of Address" },
1137
    { 2, "New Care-of Address" },
1138
    { 3, "NAR's IP address" },
1139
    { 4, "NAR's Prefix (sent in PrRtAdv)" },
1140
    { 0, NULL }
1141
};
1142
1143
static const value_string nd_opt_lla_option_code_val[] = {
1144
    { 0, "Wildcard" },
1145
    { 1, "Link-layer Address of the New Access Point" },
1146
    { 2, "Link-layer Address of the MN" },
1147
    { 3, "Link-layer Address of the NAR" },
1148
    { 4, "Link-layer Address of the source" },
1149
    { 5, "The AP belongs to the current interface of the router" },
1150
    { 6, "No prefix information available" },
1151
    { 7, "No fast handovers support available" },
1152
    { 0, NULL }
1153
};
1154
1155
static const value_string nd_opt_hai_option_code_val[] = {
1156
    { 1, "Access Network Identifier (AN ID)" },
1157
    { 2, "Sector ID" },
1158
    { 0, NULL }
1159
};
1160
1161
static const value_string nd_opt_mn_option_code_val[] = {
1162
    { 1, "NAI" },
1163
    { 2, "IMSI" },
1164
    { 0, NULL }
1165
};
1166
static const value_string nd_opt_naack_status_val[] = {
1167
    { 1,    "New CoA is invalid, perform address configuration" },
1168
    { 2,    "New CoA is invalid, use the supplied CoA" },
1169
    { 3,    "NCoA is invalid, use NAR's IP address as NCoA in FBU" },
1170
    { 4,    "PCoA supplied, do not send FBU" },
1171
    { 128,  "LLA is unrecognized" },
1172
    { 0,    NULL }
1173
};
1174
1175
static const value_string nd_opt_earo_status_val[] = {
1176
    { 0,  "Success" },
1177
    { 1,  "Duplicate Address" },
1178
    { 2,  "Neighbor Cache Full" },
1179
    { 3,  "Moved" },
1180
    { 4,  "Removed" },
1181
    { 5,  "Validation Requested" },
1182
    { 6,  "Duplicate Source Address" },
1183
    { 7,  "Invalid Source Address" },
1184
    { 8,  "Registered Address Topologically Incorrect" },
1185
    { 9,  "6LBR Registry Saturated" },
1186
    { 10, "Validation Failed" },
1187
    { 11, "Registration Refresh Request" },
1188
    { 12, "Invalid Registration" },
1189
    { 0,  NULL }
1190
};
1191
1192
15
#define ND_OPT_EARO_FLAG_RESERVED 0x80
1193
15
#define ND_OPT_EARO_FLAG_C        0x40
1194
15
#define ND_OPT_EARO_FLAG_P        0x30
1195
15
#define ND_OPT_EARO_FLAG_I        0x0C
1196
15
#define ND_OPT_EARO_FLAG_R        0x02
1197
26
#define ND_OPT_EARO_FLAG_T        0x01
1198
1199
static const value_string nd_opt_earo_p_val[] = {
1200
    { 0, "Unicast Address" },
1201
    { 1, "Multicast Address" },
1202
    { 2, "Anycast Address" },
1203
    { 3, "Unicast Prefix" },
1204
    { 0, NULL }
1205
};
1206
1207
static const value_string nd_opt_earo_i_val[] = {
1208
    { 0, "Default" },
1209
    { 0, NULL }
1210
};
1211
1212
15
#define ND_OPT_6CO_FLAG_C        0x10
1213
24
#define ND_OPT_6CO_FLAG_CID      0x0F
1214
15
#define ND_OPT_6CO_FLAG_RESERVED 0xE0
1215
1216
static const value_string nd_opt_da_status_val[] = {
1217
    { 0, "Success" },
1218
    { 1, "Duplicate Address" },
1219
    { 2, "Neighbor Cache Full" },
1220
    { 0, NULL }
1221
};
1222
1223
#define ND_OPT_DA_DA      0
1224
2
#define ND_OPT_DA_EDA_64  1
1225
0
#define ND_OPT_DA_EDA_128 2
1226
0
#define ND_OPT_DA_EDA_192 3
1227
0
#define ND_OPT_DA_EDA_256 4
1228
1229
static const value_string nd_opt_dar_code_suffix_val[] = {
1230
    { ND_OPT_DA_DA,      "DAR message" },
1231
    { ND_OPT_DA_EDA_64,  "EDAR message with 64-bit ROVR field" },
1232
    { ND_OPT_DA_EDA_128, "EDAR message with 128-bit ROVR field" },
1233
    { ND_OPT_DA_EDA_192, "EDAR message with 192-bit ROVR field" },
1234
    { ND_OPT_DA_EDA_256, "EDAR message with 256-bit ROVR field" },
1235
    { 0,                  NULL }
1236
};
1237
1238
static const value_string nd_opt_dac_code_suffix_val[] = {
1239
    { ND_OPT_DA_DA,      "DAC message" },
1240
    { ND_OPT_DA_EDA_64,  "EDAC message with 64-bit ROVR field" },
1241
    { ND_OPT_DA_EDA_128, "EDAC message with 128-bit ROVR field" },
1242
    { ND_OPT_DA_EDA_192, "EDAC message with 192-bit ROVR field" },
1243
    { ND_OPT_DA_EDA_256, "EDAC message with 256-bit ROVR field" },
1244
    { 0,                  NULL }
1245
};
1246
1247
static const value_string icmpv6_option_name_type_vals[] = {
1248
    { 1,    "DER Encoded X.501 Name" },
1249
    { 2,    "FQDN" },
1250
    { 3,    "SHA-1 Subject Key Identifier (SKI)" },
1251
    { 4,    "SHA-224 Subject Key Identifier (SKI)" },
1252
    { 5,    "SHA-256 Subject Key Identifier (SKI)" },
1253
    { 6,    "SHA-384 Subject Key Identifier (SKI)" },
1254
    { 7,    "SHA-512 Subject Key Identifier (SKI)" },
1255
    { 253,  "Reserved for Experimental Use" },
1256
    { 254,  "Reserved for Experimental Use" },
1257
    { 255,  "Reserved" },
1258
    { 0,    NULL }
1259
};
1260
1261
static const value_string icmpv6_option_cert_type_vals[] = {
1262
    { 1,    "X.509v3 Certificate" },
1263
    { 0,    NULL }
1264
};
1265
1266
/* RFC 4191: Default Router Preferences and More-Specific Routes  */
1267
1268
22
#define ND_RA_FLAG_RTPREF_MASK  0x18 /* 00011000 */
1269
15
#define ND_RA_FLAG_RESERV_MASK  0xE7 /* 11100111 */
1270
1271
/* RFC 5175 : IPv6 Router Advertisement Flags Expansion Option */
1272
15
#define FLAGS_EO_RSV    0xFFFFFFFFFFFC
1273
15
#define FLAGS_EO_PEX    0x000000000003
1274
1275
/* RFC 6275: Mobility Support in IPv6 */
1276
15
#define FLAGS_MIP6_M   0x8000
1277
15
#define FLAGS_MIP6_O   0x4000
1278
15
#define FLAGS_MIP6_RSV 0x3FFF
1279
1280
/* RPL: RFC 6550 : Routing over Low-Power and Lossy Networks. */
1281
/* RPL ICMPv6 Codes */
1282
258
#define ICMP6_RPL_DIS           0x00   /* DODAG Information Solicitation */
1283
15
#define ICMP6_RPL_DIO           0x01   /* DODAG Information Object */
1284
6
#define ICMP6_RPL_DAO           0x02   /* Destination Advertisement Object */
1285
8
#define ICMP6_RPL_DAOACK        0x03   /* Destination Advertisement Object Ack */
1286
2
#define ICMP6_RPL_DCO           0x07   /* Destination Cleanup Object */
1287
3
#define ICMP6_RPL_DCOACK        0x08   /* Destination Cleanup Object Acknowledgement */
1288
155
#define ICMP6_RPL_P2P_DRO       0x04   /* P2P Discovery Reply Object */
1289
2
#define ICMP6_RPL_P2P_DROACK    0x05   /* P2P Discovery Reply Object Acknowledgement */
1290
264
#define ICMP6_RPL_SDIS          0x80   /* Secure DODAG Information Solicitation */
1291
15
#define ICMP6_RPL_SDIO          0x81   /* Secure DODAG Information Object */
1292
8
#define ICMP6_RPL_SDAO          0x82   /* Secure Destination Advertisement Object */
1293
8
#define ICMP6_RPL_SDAOACK       0x83   /* Secure Destination Advertisement Object Ack */
1294
95
#define ICMP6_RPL_P2P_SDRO      0x84   /* Secure P2P Discovery Reply Object */
1295
2
#define ICMP6_RPL_P2P_SDROACK   0x85   /* Secure P2P Discovery Reply Object Acknowledgement */
1296
2
#define ICMP6_RPL_CC            0x8A   /* Consistency Check */
1297
1298
1299
/* RPL DIO Flags */
1300
15
#define RPL_DIO_FLAG_G           0x80
1301
15
#define RPL_DIO_FLAG_0           0x40
1302
15
#define RPL_DIO_FLAG_MOP         0x38
1303
15
#define RPL_DIO_FLAG_PRF         0x07
1304
1305
/* RPL DAO Flags */
1306
15
#define RPL_DAO_FLAG_K                  0x80
1307
23
#define RPL_DAO_FLAG_D                  0x40
1308
15
#define RPL_DAO_FLAG_RESERVED           0x3F
1309
1310
/* RPL DAO ACK Flags */
1311
23
#define RPL_DAOACK_FLAG_D               0x80
1312
15
#define RPL_DAOACK_FLAG_RESERVED        0x7F
1313
1314
/* RPL DCO Flags */
1315
15
#define RPL_DCO_FLAG_K                  0x80
1316
17
#define RPL_DCO_FLAG_D                  0x40
1317
15
#define RPL_DCO_FLAG_RESERVED           0x3F
1318
1319
/* RPL DCO ACK Flags */
1320
18
#define RPL_DCOACK_FLAG_D               0x80
1321
15
#define RPL_DCOACK_FLAG_RESERVED        0x7F
1322
1323
/* RPL CC Flags */
1324
15
#define RPL_CC_FLAG_R               0x80
1325
15
#define RPL_CC_FLAG_RESERVED        0x7F
1326
1327
/* RPL Secure */
1328
357
#define ICMP6_RPL_SECURE    0x80
1329
1330
15
#define RPL_SECURE_FLAG_T   0x80
1331
15
#define RPL_SECURE_FLAG_RSV 0x7F
1332
1333
35
#define RPL_SECURE_LVL      0x07
1334
35
#define RPL_SECURE_KIM      0xC0
1335
15
#define RPL_SECURE_RSV      0x38
1336
1337
/* RPL P2P DRO Flags */
1338
15
#define RPL_P2P_DRO_FLAG_S      0x8000
1339
15
#define RPL_P2P_DRO_FLAG_A      0x4000
1340
15
#define RPL_P2P_DRO_FLAG_SEQ    0x3000
1341
15
#define RPL_P2P_DRO_FLAG_RSV    0x0FFF
1342
1343
/* RPL P2P DROACK Flags */
1344
15
#define RPL_P2P_DROACK_FLAG_SEQ    0xc000
1345
15
#define RPL_P2P_DROACK_FLAG_RSV    0x3FFF
1346
1347
/* RPL Option Bitfields */
1348
15
#define RPL_OPT_PREFIX_FLAG_L           0x80
1349
15
#define RPL_OPT_PREFIX_FLAG_A           0x40
1350
15
#define RPL_OPT_PREFIX_FLAG_R           0x20
1351
15
#define RPL_OPT_PREFIX_FLAG_RSV         0x1F
1352
15
#define RPL_OPT_ROUTE_PREFERENCE        0x18
1353
15
#define RPL_OPT_ROUTE_RESERVED          0xE7
1354
15
#define RPL_OPT_CONFIG_FLAG_AUTH        0x08
1355
15
#define RPL_OPT_CONFIG_FLAG_PCS         0x07
1356
15
#define RPL_OPT_CONFIG_FLAG_RESERVED    0xF0
1357
15
#define RPL_OPT_TRANSIT_FLAG_E          0x80
1358
15
#define RPL_OPT_TRANSIT_FLAG_I          0x40
1359
15
#define RPL_OPT_TRANSIT_FLAG_RSV        0x3F
1360
15
#define RPL_OPT_TRANSIT_PATHCTL_PC1     0xC0
1361
15
#define RPL_OPT_TRANSIT_PATHCTL_PC2     0x30
1362
15
#define RPL_OPT_TRANSIT_PATHCTL_PC3     0x0C
1363
15
#define RPL_OPT_TRANSIT_PATHCTL_PC4     0x03
1364
15
#define RPL_OPT_SOLICITED_FLAG_V        0x80
1365
15
#define RPL_OPT_SOLICITED_FLAG_I        0x40
1366
15
#define RPL_OPT_SOLICITED_FLAG_D        0x20
1367
15
#define RPL_OPT_SOLICITED_FLAG_RSV      0x1F
1368
66
#define RPL_OPT_ROUTE_DISCOVERY_R       0x80
1369
66
#define RPL_OPT_ROUTE_DISCOVERY_H       0x40
1370
66
#define RPL_OPT_ROUTE_DISCOVERY_N       0x30
1371
97
#define RPL_OPT_ROUTE_DISCOVERY_COMPR   0x0F
1372
46
#define RPL_OPT_ROUTE_DISCOVERY_L       0xC0
1373
81
#define RPL_OPT_ROUTE_DISCOVERY_MR_NH   0x3F
1374
1375
/* RPL Metric Bitfields */
1376
15
#define RPL_METRIC_RESERVED              0xF800
1377
15
#define RPL_METRIC_FLAG_P                0x0400
1378
1.72k
#define RPL_METRIC_FLAG_C                0x0200
1379
15
#define RPL_METRIC_FLAG_O                0x0100
1380
1.13k
#define RPL_METRIC_FLAG_R                0x0080
1381
15
#define RPL_METRIC_A                     0x0070
1382
15
#define RPL_METRIC_PREC                  0x000F
1383
15
#define RPL_METRIC_NSA_OBJECT_RESERVED   0xFF00
1384
15
#define RPL_METRIC_NSA_OBJECT_FLAGS      0x00FC
1385
15
#define RPL_METRIC_NSA_OBJECT_FLAG_A     0x0002
1386
15
#define RPL_METRIC_NSA_OBJECT_FLAG_O     0x0001
1387
15
#define RPL_METRIC_NE_OBJECT_FLAGS       0xF000
1388
15
#define RPL_METRIC_NE_OBJECT_FLAG_I      0x0800
1389
15
#define RPL_METRIC_NE_OBJECT_TYPE        0x0600
1390
15
#define RPL_METRIC_NE_OBJECT_FLAG_E      0x0100
1391
15
#define RPL_METRIC_NE_OBJECT_ENERGY      0x00FF
1392
15
#define RPL_METRIC_HP_OBJECT_RESERVED    0xF000
1393
15
#define RPL_METRIC_HP_OBJECT_FLAGS       0x0F00
1394
15
#define RPL_METRIC_HP_OBJECT_HP          0x00FF
1395
15
#define RPL_METRIC_LQL_OBJECT_RES        0xFF
1396
15
#define RPL_METRIC_LQL_OBJECT_VAL        0xE0
1397
15
#define RPL_METRIC_LQL_OBJECT_COUNTER    0x1F
1398
15
#define RPL_METRIC_LC_OBJECT_RES         0xFF
1399
15
#define RPL_METRIC_LC_OBJECT_LC          0xFFC0
1400
15
#define RPL_METRIC_LC_OBJECT_COUNTER     0x003F
1401
15
#define RPL_METRIC_LC_OBJECT_RESERVED    0x003E
1402
15
#define RPL_METRIC_LC_OBJECT_FLAG_I      0x0001
1403
1404
static const value_string rpl_dio_map_val[] = {
1405
    { 0, "No Downward routes maintained by RPL" },
1406
    { 1, "Non-Storing Mode of Operation" },
1407
    { 2, "Storing Mode of Operation with no multicast support" },
1408
    { 3, "Storing Mode of Operation with multicast support" },
1409
    { 4, "P2P Route Discovery Mode of Operation" },
1410
    { 0, NULL }
1411
};
1412
static const value_string rpl_code_val[] = {
1413
    { ICMP6_RPL_DIS,        "DODAG Information Solicitation" },
1414
    { ICMP6_RPL_DIO,        "DODAG Information Object" },
1415
    { ICMP6_RPL_DAO,        "Destination Advertisement Object" },
1416
    { ICMP6_RPL_DAOACK,     "Destination Advertisement Object Acknowledgment" },
1417
    { ICMP6_RPL_DCO,        "Destination Cleanup Object" },
1418
    { ICMP6_RPL_DCOACK,     "Destination Cleanup Object Acknowledgment" },
1419
    { ICMP6_RPL_SDIS,       "Secure DODAG Information Solicitation" },
1420
    { ICMP6_RPL_SDIO,       "Secure DODAG Information Object" },
1421
    { ICMP6_RPL_SDAO,       "Secure Destination Advertisement Object" },
1422
    { ICMP6_RPL_SDAOACK,    "Secure Destination Advertisement Object Acknowledgment" },
1423
    { ICMP6_RPL_CC,         "Consistency Check" },
1424
    { ICMP6_RPL_P2P_DRO,    "P2P Discovery Reply Object" },
1425
    { ICMP6_RPL_P2P_SDRO,   "P2P Secure Discovery Reply Object" },
1426
    { ICMP6_RPL_P2P_DROACK, "P2P Discovery Reply Object Acknowledgement" },
1427
    { ICMP6_RPL_P2P_SDROACK,"P2P Secure Discovery Reply Object Acknowledgement" },
1428
    { 0, NULL }
1429
};
1430
1431
static const value_string rpl_secure_algorithm_vals[] = {
1432
    { 0, "Encryption: CCM with AES-128 / Signature: RSA with SHA-256" },
1433
    { 0, NULL }
1434
};
1435
1436
/* RPL Option Types */
1437
/* Pending IANA Assignment */
1438
6.80k
#define RPL_OPT_PAD1            0   /* 1-byte padding */
1439
255
#define RPL_OPT_PADN            1   /* n-byte padding */
1440
578
#define RPL_OPT_METRIC          2   /* DAG metric container */
1441
208
#define RPL_OPT_ROUTING         3   /* Routing Information */
1442
118
#define RPL_OPT_CONFIG          4   /* DAG configuration */
1443
204
#define RPL_OPT_TARGET          5   /* RPL Target */
1444
221
#define RPL_OPT_TRANSIT         6   /* Transit */
1445
96
#define RPL_OPT_SOLICITED       7   /* Solicited Information */
1446
149
#define RPL_OPT_PREFIX          8   /* Destination prefix */
1447
49
#define RPL_OPT_TARGETDESC      9   /* RPL Target Descriptor */
1448
82
#define RPL_OPT_ROUTE_DISCOVERY 10  /* P2P Route Discovery */
1449
1450
static const value_string rpl_option_vals[] = {
1451
    { RPL_OPT_PAD1,             "1-byte padding" },
1452
    { RPL_OPT_PADN,             "n-byte padding" },
1453
    { RPL_OPT_METRIC,           "DAG Metric container" },
1454
    { RPL_OPT_ROUTING,          "Routing Information"},
1455
    { RPL_OPT_CONFIG,           "DODAG configuration" },
1456
    { RPL_OPT_TARGET,           "RPL Target" },
1457
    { RPL_OPT_TRANSIT,          "Transit Information" },
1458
    { RPL_OPT_SOLICITED,        "Solicited Information"},
1459
    { RPL_OPT_PREFIX,           "Prefix Information"},
1460
    { RPL_OPT_TARGETDESC,       "RPL Target Descriptor"},
1461
    { RPL_OPT_ROUTE_DISCOVERY,  "P2P Route Discovery"},
1462
    { 0, NULL }
1463
};
1464
1465
/* RPL Metric Types */
1466
/* RFC 6551 */
1467
150
#define RPL_METRIC_NSA 1  /* Node State and Attribute */
1468
312
#define RPL_METRIC_NE  2  /* Node Energy */
1469
103
#define RPL_METRIC_HP  3  /* Hop Count */
1470
141
#define RPL_METRIC_LT  4  /* Link Throughput */
1471
101
#define RPL_METRIC_LL  5  /* Link Latency */
1472
118
#define RPL_METRIC_LQL 6  /* Link Quality Level */
1473
74
#define RPL_METRIC_ETX 7  /* Link ETX */
1474
158
#define RPL_METRIC_LC  8  /* Link Color */
1475
1476
static const value_string rpl_metric_vals[] = {
1477
  { RPL_METRIC_NSA,  "Node State and Attribute" },
1478
  { RPL_METRIC_NE,   "Node Energy" },
1479
  { RPL_METRIC_HP,   "Hop Count" },
1480
  { RPL_METRIC_LT,   "Link Throughput" },
1481
  { RPL_METRIC_LL,   "Link Latency" },
1482
  { RPL_METRIC_LQL,  "Link Quality Level" },
1483
  { RPL_METRIC_ETX,  "Link ETX" },
1484
  { RPL_METRIC_LC,   "Link Color" },
1485
  { 0, NULL }
1486
};
1487
1488
static const value_string rpl_ocp_vals[] = {
1489
    { 0, "Objective Function Zero (OF0)" },
1490
    { 1, "Minimum Rank with Hysteresis Objective Function (MRHOF)" },
1491
    { 0, NULL }
1492
};
1493
1494
/* RFC 7400, 8505, 8928, 9685, 9926 */
1495
15
#define ND_OPT_6CIO_FLAG_RESERVED     0x00007FFFFFFF
1496
15
#define ND_OPT_6CIO_FLAG_F            0x000080000000
1497
15
#define ND_OPT_6CIO_FLAG_G            0x000100000000
1498
15
#define ND_OPT_6CIO_FLAG_E            0x000200000000
1499
15
#define ND_OPT_6CIO_FLAG_P            0x000400000000
1500
15
#define ND_OPT_6CIO_FLAG_B            0x000800000000
1501
15
#define ND_OPT_6CIO_FLAG_L            0x001000000000
1502
15
#define ND_OPT_6CIO_FLAG_D            0x002000000000
1503
15
#define ND_OPT_6CIO_FLAG_A            0x004000000000
1504
15
#define ND_OPT_6CIO_FLAG_X            0x008000000000
1505
15
#define ND_OPT_6CIO_FLAG_EXPERIMENTAL 0xFF0000000000
1506
1507
/* RFC 7731 */
1508
15
#define MPL_SEED_INFO_BM_LEN        0xFC
1509
15
#define MPL_SEED_INFO_S             0x03
1510
static const value_string mpl_seed_id_lengths[] = {
1511
    { 0, "0 bit, not included in MPL Seed Info" },
1512
    { 1, "16 bits" },
1513
    { 2, "64 bits" },
1514
    { 3, "128 bits" },
1515
    { 0, NULL}
1516
};
1517
static const uint8_t mpl_seed_id_code_to_length[] = { 0, 2, 8, 16 }; /* bytes */
1518
1519
1.60k
#define LIFETIME_INFINITY 0xFFFFFFFF
1520
1521
static const value_string unique_infinity[] = {
1522
    { LIFETIME_INFINITY, "Infinity" },
1523
    { 0, NULL}
1524
};
1525
1526
static const value_string dnssl_infinity[] = {
1527
    { 0, "DNSSL domain name MUST no longer be used" },
1528
    { LIFETIME_INFINITY, "Infinity" },
1529
    { 0, NULL}
1530
};
1531
1532
static const value_string rdnss_infinity[] = {
1533
    { 0, "RDNSS address MUST no longer be used" },
1534
    { LIFETIME_INFINITY, "Infinity" },
1535
    { 0, NULL}
1536
};
1537
1538
static const value_string ext_echo_req_code_str[] = {
1539
    { 0, "No error"},
1540
    { 0, NULL}
1541
};
1542
1543
static const value_string ext_echo_reply_code_str[] = {
1544
    { 0, "No error"},
1545
    { 1, "Malformed Query"},
1546
    { 2, "No Such Interface"},
1547
    { 3, "No Such Table Entry"},
1548
    { 4, "Multiple Interfaces Satisfy Query"},
1549
    { 0, NULL}
1550
    };
1551
1552
static const value_string ext_echo_reply_state_str[] = {
1553
    { 0, "Reserved"},
1554
    { 1, "Incomplete"},
1555
    { 2, "Reachable"},
1556
    { 3, "Stale"},
1557
    { 4, "Delay"},
1558
    { 5, "Probe"},
1559
    { 6, "Failed"},
1560
    { 0, NULL}
1561
    };
1562
1563
1564
/* RFC 8781 */
1565
15
#define ND_OPT_PREF64_SL          0xFFF8
1566
15
#define ND_OPT_PREF64_PLC         0x0007
1567
1568
static const value_string pref64_plc_str[] = {
1569
    { 0, "96 bits prefix length"},
1570
    { 1, "64 bits prefix length"},
1571
    { 2, "56 bits prefix length"},
1572
    { 3, "48 bits prefix length"},
1573
    { 4, "40 bits prefix length"},
1574
    { 5, "32 bits prefix length"},
1575
    { 0, NULL}
1576
    };
1577
1578
/* whenever a ICMPv6 packet is seen by the tap listener */
1579
/* Add a new frame into the graph */
1580
static tap_packet_status
1581
icmpv6_seq_analysis_packet( void *ptr, packet_info *pinfo, epan_dissect_t *edt _U_, const void *dummy _U_, tap_flags_t flags _U_)
1582
0
{
1583
0
    seq_analysis_info_t *sainfo = (seq_analysis_info_t *) ptr;
1584
0
    seq_analysis_item_t *sai = sequence_analysis_create_sai_with_addresses(pinfo, sainfo);
1585
1586
0
    if (!sai)
1587
0
        return TAP_PACKET_DONT_REDRAW;
1588
1589
0
    sai->frame_number = pinfo->num;
1590
1591
0
    sequence_analysis_use_color_filter(pinfo, sai);
1592
1593
0
    sai->port_src=pinfo->srcport;
1594
0
    sai->port_dst=pinfo->destport;
1595
1596
0
    sequence_analysis_use_col_info_as_label_comment(pinfo, sai);
1597
1598
0
    if (pinfo->ptype == PT_NONE) {
1599
0
        icmp_info_t *p_icmp_info = (icmp_info_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_icmpv6, 0);
1600
1601
0
        if (p_icmp_info != NULL) {
1602
0
            sai->port_src = 0;
1603
0
            sai->port_dst = p_icmp_info->type * 256 + p_icmp_info->code;
1604
0
        }
1605
0
    }
1606
1607
0
    sai->line_style = 1;
1608
0
    sai->conv_num = 0;
1609
0
    sai->display = true;
1610
1611
0
    g_queue_push_tail(sainfo->items, sai);
1612
1613
0
    return TAP_PACKET_REDRAW;
1614
0
}
1615
1616
1617
static int
1618
dissect_contained_icmpv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1619
1.53k
{
1620
1.53k
    bool      save_in_error_pkt;
1621
1.53k
    int offset;
1622
1623
    /* Save the current value of the "we're inside an error packet"
1624
       flag, and set that flag; subdissectors may treat packets
1625
       that are the payload of error packets differently from
1626
       "real" packets. */
1627
1.53k
    save_in_error_pkt = pinfo->flags.in_error_pkt;
1628
1.53k
    pinfo->flags.in_error_pkt = true;
1629
1630
    /* tiny sanity check */
1631
1.53k
    if ((tvb_get_uint8(tvb, 0) & 0xf0) == 0x60) {
1632
        /* The contained packet is an IPv6 datagram; dissect it. */
1633
1.48k
        offset = call_dissector(ipv6_handle, tvb, pinfo, tree);
1634
1.48k
    } else {
1635
54
        offset = call_data_dissector(tvb, pinfo, tree);
1636
54
    }
1637
1638
    /* Restore the "we're inside an error packet" flag. */
1639
1.53k
    pinfo->flags.in_error_pkt = save_in_error_pkt;
1640
1641
1.53k
    return offset;
1642
1.53k
}
1643
1644
1645
/* ======================================================================= */
1646
static conversation_t *_find_or_create_conversation(packet_info *pinfo)
1647
19
{
1648
19
    conversation_t *conv = NULL;
1649
1650
    /* Have we seen this conversation before? */
1651
19
    conv = find_conversation(pinfo->num, &pinfo->src, &pinfo->dst,
1652
19
        conversation_pt_to_conversation_type(pinfo->ptype), 0, 0, 0);
1653
19
    if (conv == NULL) {
1654
        /* No, this is a new conversation. */
1655
14
        conv = conversation_new(pinfo->num, &pinfo->src, &pinfo->dst,
1656
14
            conversation_pt_to_conversation_type(pinfo->ptype), 0, 0, 0);
1657
14
    }
1658
19
    return conv;
1659
19
}
1660
1661
/* ======================================================================= */
1662
/*
1663
    Note: We are tracking conversations via these keys:
1664
1665
    0                   1                   2                   3
1666
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1667
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1668
   |                             |G|            Checksum           |
1669
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1670
   |           Identifier          |        Sequence Number        |
1671
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1672
   |                            VLAN ID                            |
1673
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1674
*/
1675
static icmp_transaction_t *transaction_start(packet_info *pinfo, proto_tree *tree, uint32_t *key)
1676
19
{
1677
19
    conversation_t     *conversation;
1678
19
    icmpv6_conv_info_t *icmpv6_info;
1679
19
    icmp_transaction_t *icmpv6_trans;
1680
19
    wmem_tree_key_t     icmpv6_key[3];
1681
19
    proto_item         *it;
1682
1683
    /* Handle the conversation tracking */
1684
19
    conversation = _find_or_create_conversation(pinfo);
1685
19
    icmpv6_info = (icmpv6_conv_info_t *)conversation_get_proto_data(conversation, proto_icmpv6);
1686
19
    if (icmpv6_info == NULL) {
1687
14
        icmpv6_info = wmem_new(wmem_file_scope(), icmpv6_conv_info_t);
1688
14
        icmpv6_info->unmatched_pdus = wmem_tree_new(wmem_file_scope());
1689
14
        icmpv6_info->matched_pdus = wmem_tree_new(wmem_file_scope());
1690
14
        conversation_add_proto_data(conversation, proto_icmpv6, icmpv6_info);
1691
14
    }
1692
1693
19
    if (!PINFO_FD_VISITED(pinfo)) {
1694
        /*
1695
         * This is a new request, create a new transaction structure and map it
1696
         * to the unmatched table.
1697
         */
1698
19
        icmpv6_key[0].length = 3;
1699
19
        icmpv6_key[0].key = key;
1700
19
        icmpv6_key[1].length = 0;
1701
19
        icmpv6_key[1].key = NULL;
1702
1703
19
        icmpv6_trans = wmem_new(wmem_file_scope(), icmp_transaction_t);
1704
19
        icmpv6_trans->rqst_frame = pinfo->num;
1705
19
        icmpv6_trans->resp_frame = 0;
1706
19
        icmpv6_trans->rqst_time = pinfo->abs_ts;
1707
19
        nstime_set_zero(&icmpv6_trans->resp_time);
1708
19
        wmem_tree_insert32_array(icmpv6_info->unmatched_pdus, icmpv6_key, (void *)icmpv6_trans);
1709
19
    } else {
1710
        /* Already visited this frame */
1711
0
        uint32_t frame_num = pinfo->num;
1712
1713
0
        icmpv6_key[0].length = 3;
1714
0
        icmpv6_key[0].key = key;
1715
0
        icmpv6_key[1].length = 1;
1716
0
        icmpv6_key[1].key = &frame_num;
1717
0
        icmpv6_key[2].length = 0;
1718
0
        icmpv6_key[2].key = NULL;
1719
1720
0
        icmpv6_trans = (icmp_transaction_t *)wmem_tree_lookup32_array(icmpv6_info->matched_pdus, icmpv6_key);
1721
0
    }
1722
1723
19
    if (icmpv6_trans == NULL) {
1724
0
        if (pinfo->dst.type == AT_IPv6 &&
1725
0
                    in6_addr_is_multicast((const ws_in6_addr *)pinfo->dst.data)) {
1726
            /* XXX We should support multicast echo requests, but we don't currently */
1727
            /* Note the multicast destination and skip transaction tracking */
1728
0
            col_append_str(pinfo->cinfo, COL_INFO, " (multicast)");
1729
0
        } else if (PINFO_FD_VISITED(pinfo)) {
1730
            /* No response found - add field and expert info */
1731
0
            it = proto_tree_add_item(tree, hf_icmpv6_no_resp, NULL, 0, 0,
1732
0
                                     ENC_NA);
1733
0
            proto_item_set_generated(it);
1734
1735
0
            col_append_str(pinfo->cinfo, COL_INFO, " (no response found!)");
1736
1737
            /* Expert info.  TODO: add to _icmp_transaction_t type and sequence number
1738
               so can report here (and in taps) */
1739
0
            expert_add_info_format(pinfo, it, &ei_icmpv6_resp_not_found,
1740
0
                                   "No response seen to ICMPv6 request in frame %u",
1741
0
                                   pinfo->num);
1742
0
        }
1743
1744
0
        return NULL;
1745
0
    }
1746
1747
    /* Print state tracking in the tree */
1748
19
    if (icmpv6_trans->resp_frame) {
1749
0
        if (tree) {
1750
0
            it = proto_tree_add_uint(tree, hf_icmpv6_resp_in, NULL, 0, 0,
1751
0
                icmpv6_trans->resp_frame);
1752
0
            proto_item_set_generated(it);
1753
0
        }
1754
0
        col_append_frame_number(pinfo, COL_INFO, " (reply in %d)", icmpv6_trans->resp_frame);
1755
0
    }
1756
1757
19
    return icmpv6_trans;
1758
1759
19
} /* transaction_start() */
1760
1761
/* ======================================================================= */
1762
static icmp_transaction_t *transaction_end(packet_info *pinfo, proto_tree *tree, uint32_t *key)
1763
4
{
1764
4
    conversation_t     *conversation;
1765
4
    icmpv6_conv_info_t *icmpv6_info;
1766
4
    icmp_transaction_t *icmpv6_trans;
1767
4
    wmem_tree_key_t     icmpv6_key[3];
1768
4
    proto_item         *it;
1769
4
    nstime_t            ns;
1770
4
    double resp_time;
1771
1772
4
    conversation = find_conversation(pinfo->num, &pinfo->src, &pinfo->dst,
1773
4
        conversation_pt_to_conversation_type(pinfo->ptype), 0, 0, 0);
1774
4
    if (conversation == NULL)
1775
4
        return NULL;
1776
1777
0
    icmpv6_info = (icmpv6_conv_info_t *)conversation_get_proto_data(conversation, proto_icmpv6);
1778
0
    if (icmpv6_info == NULL)
1779
0
        return NULL;
1780
1781
0
    if (!PINFO_FD_VISITED(pinfo)) {
1782
0
        uint32_t frame_num;
1783
1784
0
        icmpv6_key[0].length = 3;
1785
0
        icmpv6_key[0].key = key;
1786
0
        icmpv6_key[1].length = 0;
1787
0
        icmpv6_key[1].key = NULL;
1788
1789
0
        icmpv6_trans = (icmp_transaction_t *)wmem_tree_lookup32_array(icmpv6_info->unmatched_pdus, icmpv6_key);
1790
0
        if (icmpv6_trans == NULL)
1791
0
            return NULL;
1792
1793
        /* we have already seen this response, or an identical one */
1794
0
        if (icmpv6_trans->resp_frame != 0)
1795
0
            return NULL;
1796
1797
0
        icmpv6_trans->resp_frame = pinfo->num;
1798
1799
        /*
1800
         * we found a match.  Add entries to the matched table for both
1801
         * request and reply frames
1802
         */
1803
0
        icmpv6_key[0].length = 3;
1804
0
        icmpv6_key[0].key = key;
1805
0
        icmpv6_key[1].length = 1;
1806
0
        icmpv6_key[1].key = &frame_num;
1807
0
        icmpv6_key[2].length = 0;
1808
0
        icmpv6_key[2].key = NULL;
1809
1810
0
        frame_num = icmpv6_trans->rqst_frame;
1811
0
        wmem_tree_insert32_array(icmpv6_info->matched_pdus, icmpv6_key, (void *)icmpv6_trans);
1812
1813
0
        frame_num = icmpv6_trans->resp_frame;
1814
0
        wmem_tree_insert32_array(icmpv6_info->matched_pdus, icmpv6_key, (void *)icmpv6_trans);
1815
0
    } else {
1816
        /* Already visited this frame */
1817
0
        uint32_t frame_num = pinfo->num;
1818
1819
0
        icmpv6_key[0].length = 3;
1820
0
        icmpv6_key[0].key = key;
1821
0
        icmpv6_key[1].length = 1;
1822
0
        icmpv6_key[1].key = &frame_num;
1823
0
        icmpv6_key[2].length = 0;
1824
0
        icmpv6_key[2].key = NULL;
1825
1826
0
        icmpv6_trans = (icmp_transaction_t *)wmem_tree_lookup32_array(icmpv6_info->matched_pdus, icmpv6_key);
1827
0
        if (icmpv6_trans == NULL)
1828
0
            return NULL;
1829
0
    }
1830
1831
    /* Print state tracking in the tree */
1832
0
    if (tree) {
1833
0
        it = proto_tree_add_uint(tree, hf_icmpv6_resp_to, NULL, 0, 0,
1834
0
            icmpv6_trans->rqst_frame);
1835
0
        proto_item_set_generated(it);
1836
0
    }
1837
1838
0
    nstime_delta(&ns, &pinfo->abs_ts, &icmpv6_trans->rqst_time);
1839
0
    icmpv6_trans->resp_time = ns;
1840
0
    if (tree) {
1841
0
        resp_time = nstime_to_msec(&ns);
1842
0
        it = proto_tree_add_double_format_value(tree, hf_icmpv6_resptime, NULL,
1843
0
            0, 0, resp_time, "%.3f ms", resp_time);
1844
0
        proto_item_set_generated(it);
1845
0
    }
1846
1847
0
    col_append_frame_number(pinfo, COL_INFO, " (request in %d)",
1848
0
        icmpv6_trans->rqst_frame);
1849
1850
0
    return icmpv6_trans;
1851
1852
0
} /* transaction_end() */
1853
1854
// This is recursive, but we'll run out of PDU before we'll run out of stack.
1855
// NOLINTNEXTLINE(misc-no-recursion)
1856
static unsigned dissect_icmpv6_nd_opt(tvbuff_t *tvb, unsigned offset, packet_info *pinfo, proto_tree *tree, uint8_t icmpv6_type)
1857
324
{
1858
324
    proto_tree *icmp6opt_tree;
1859
324
    proto_item *ti, *ti_opt, *ti_opt_len;
1860
324
    uint8_t     opt_type;
1861
324
    unsigned    opt_len;
1862
324
    unsigned    opt_offset;
1863
324
    tvbuff_t   *opt_tvb;
1864
324
    unsigned    used_bytes;
1865
1866
1.07k
    while (tvb_reported_length(tvb) > offset) {
1867
        /* there are more options */
1868
1869
        /* ICMPv6 Option */
1870
984
        opt_len = tvb_get_uint8(tvb, offset + 1) * 8;
1871
984
        ti = proto_tree_add_item(tree, hf_icmpv6_opt, tvb, offset, opt_len, ENC_NA);
1872
984
        icmp6opt_tree = proto_item_add_subtree(ti, ett_icmpv6_opt);
1873
984
        opt_offset = offset;
1874
1875
        /* Option type */
1876
984
        proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_type, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &opt_type);
1877
984
        opt_offset += 1;
1878
1879
        /* Add option name to option root label */
1880
984
        proto_item_append_text(ti, " (%s", val_to_str(pinfo->pool, opt_type, option_vals, "Unknown %d"));
1881
1882
        /* Option length */
1883
984
        ti_opt_len = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_length, tvb,opt_offset, 1, ENC_BIG_ENDIAN);
1884
984
        opt_offset += 1;
1885
1886
        /* Add length value in bytes */
1887
984
        proto_item_append_text(ti_opt_len, " (%i bytes)", opt_len);
1888
1889
984
        if(opt_len == 0){
1890
36
            expert_add_info_format(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length, "Invalid option length (Zero)");
1891
36
            return opt_offset;
1892
36
        }
1893
1894
        /* decode... */
1895
948
        switch (opt_type) {
1896
157
            case ND_OPT_SOURCE_LINKADDR: /* Source Link-layer Address (1) */
1897
157
            {
1898
157
                const char *link_str;
1899
                /* if the opt len is 8, the Link Addr is MAC Address */
1900
157
                if(opt_len == 8){
1901
131
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr_mac, tvb, opt_offset, 6, ENC_NA);
1902
131
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_src_linkaddr_mac, tvb, opt_offset, 6, ENC_NA);
1903
131
                    proto_item_set_hidden(ti_opt);
1904
1905
131
                    link_str = tvb_ether_to_str(pinfo->pool, tvb, opt_offset);
1906
131
                    col_append_fstr(pinfo->cinfo, COL_INFO, " from %s", link_str);
1907
131
                    proto_item_append_text(ti, " : %s", link_str);
1908
                /* if the opt len is 16 and the 6 last bytes is 0n the Link Addr is EUI64 Address */
1909
131
                }else if(opt_len == 16 && tvb_get_ntohl(tvb, opt_offset + 8) == 0 && tvb_get_ntohs(tvb, opt_offset + 12) == 0){
1910
1
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr_eui64, tvb, opt_offset, 8, ENC_BIG_ENDIAN);
1911
1
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_src_linkaddr_eui64, tvb, opt_offset, 8, ENC_BIG_ENDIAN);
1912
1
                    proto_item_set_hidden(ti_opt);
1913
1
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr, tvb, opt_offset, 8, ENC_NA);
1914
1
                    proto_item_set_hidden(ti_opt);
1915
1
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_src_linkaddr, tvb, opt_offset, 8, ENC_NA);
1916
1
                    proto_item_set_hidden(ti_opt);
1917
1918
                    /* Padding: 6 bytes */
1919
1
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset + 8, 6, ENC_NA);
1920
1921
1
                    link_str = tvb_address_to_str(pinfo->pool, tvb, AT_EUI64, opt_offset);
1922
1
                    col_append_fstr(pinfo->cinfo, COL_INFO, " from %s", link_str);
1923
1
                    proto_item_append_text(ti, " : %s", link_str);
1924
25
                }else{
1925
25
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr, tvb, opt_offset, opt_len-2, ENC_NA);
1926
25
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_src_linkaddr, tvb, opt_offset, opt_len-2, ENC_NA);
1927
25
                    proto_item_set_hidden(ti_opt);
1928
25
                }
1929
157
                opt_offset += opt_len;
1930
1931
157
                break;
1932
0
            }
1933
83
            case ND_OPT_TARGET_LINKADDR: /* Target Link-layer Address (2) */
1934
83
            {
1935
83
                const char *link_str;
1936
                /* if the opt len is 8, the Link Addr is MAC Address */
1937
83
                if(opt_len == 8){
1938
13
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr_mac, tvb, opt_offset, 6, ENC_NA);
1939
13
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_target_linkaddr_mac, tvb, opt_offset, 6, ENC_NA);
1940
13
                    proto_item_set_hidden(ti_opt);
1941
1942
13
                    link_str = tvb_ether_to_str(pinfo->pool, tvb, opt_offset);
1943
13
                    col_append_fstr(pinfo->cinfo, COL_INFO, " is at %s", link_str);
1944
13
                    proto_item_append_text(ti, " : %s", link_str);
1945
1946
                /* if the opt len is 16 and the 6 last bytes is 0n the Link Addr is EUI64 Address */
1947
70
                }else if(opt_len == 16 && tvb_get_ntohl(tvb, opt_offset + 8) == 0 && tvb_get_ntohs(tvb, opt_offset + 12) == 0){
1948
3
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr_eui64, tvb, opt_offset, 8, ENC_BIG_ENDIAN);
1949
3
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_target_linkaddr_eui64, tvb, opt_offset, 8, ENC_BIG_ENDIAN);
1950
3
                    proto_item_set_hidden(ti_opt);
1951
1952
                    /* Padding: 6 bytes */
1953
3
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset + 8, 6, ENC_NA);
1954
1955
3
                    link_str = tvb_address_to_str(pinfo->pool, tvb, AT_EUI64, opt_offset);
1956
3
                    col_append_fstr(pinfo->cinfo, COL_INFO, " from %s", link_str);
1957
3
                    proto_item_append_text(ti, " : %s", link_str);
1958
67
                }else{
1959
67
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_linkaddr, tvb, opt_offset, opt_len-2, ENC_NA);
1960
67
                    ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_target_linkaddr, tvb, opt_offset, opt_len-2, ENC_NA);
1961
67
                    proto_item_set_hidden(ti_opt);
1962
67
                }
1963
83
                opt_offset += opt_len;
1964
83
                break;
1965
0
            }
1966
39
            case ND_OPT_PREFIX_INFORMATION: /* Prefix Information (3) */
1967
39
            {
1968
39
                static int * const prefix_flag[] = {
1969
39
                    &hf_icmpv6_opt_prefix_flag_l,
1970
39
                    &hf_icmpv6_opt_prefix_flag_a,
1971
39
                    &hf_icmpv6_opt_prefix_flag_r,
1972
39
                    &hf_icmpv6_opt_prefix_flag_p,
1973
39
                    &hf_icmpv6_opt_prefix_flag_reserved,
1974
39
                    NULL
1975
39
                };
1976
1977
39
                uint32_t lifetime;
1978
39
                uint8_t prefix_len;
1979
                /* RFC 4861 */
1980
1981
                /* Prefix Length */
1982
39
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_prefix_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &prefix_len);
1983
39
                opt_offset += 1;
1984
1985
                /* Flags */
1986
39
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_prefix_flag, ett_icmpv6_flag_prefix, prefix_flag, ENC_BIG_ENDIAN);
1987
39
                opt_offset += 1;
1988
1989
                /* Prefix Valid Lifetime */
1990
39
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_prefix_valid_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
1991
39
                if (lifetime != LIFETIME_INFINITY) {
1992
37
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
1993
37
                }
1994
39
                opt_offset += 4;
1995
1996
                /* Prefix Preferred Lifetime */
1997
39
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_prefix_preferred_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
1998
39
                if (lifetime != LIFETIME_INFINITY) {
1999
37
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
2000
37
                }
2001
39
                opt_offset += 4;
2002
2003
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 4, ENC_NA);
2004
39
                opt_offset += 4;
2005
2006
                /* Prefix */
2007
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_prefix, tvb, opt_offset, 16, ENC_NA);
2008
39
                proto_item_append_text(ti, " : %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
2009
39
                opt_offset += 16;
2010
2011
39
                break;
2012
0
            }
2013
31
            case ND_OPT_REDIRECTED_HEADER: /* Redirected Header (4) */
2014
2015
31
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 6, ENC_NA);
2016
31
                opt_offset += 6;
2017
2018
31
                if (opt_len > 8) {
2019
28
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_redirected_packet, tvb, opt_offset, opt_len - 8, ENC_NA);
2020
28
                    opt_tvb = tvb_new_subset_length(tvb, opt_offset, opt_len - 8);
2021
28
                    opt_offset += dissect_contained_icmpv6(opt_tvb, pinfo, icmp6opt_tree);
2022
28
                }
2023
31
                break;
2024
53
            case ND_OPT_MTU: /* MTU (5) */
2025
2026
53
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2027
53
                opt_offset += 2;
2028
2029
53
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_mtu, tvb, opt_offset, 4, ENC_BIG_ENDIAN);
2030
53
                proto_item_append_text(ti, " : %d", tvb_get_ntohl(tvb, opt_offset));
2031
53
                opt_offset += 4;
2032
53
                break;
2033
6
            case ND_OPT_NBMA: /* NBMA Shortcut Limit Option (6) */
2034
2035
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_nbma_shortcut_limit, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2036
6
                proto_item_append_text(ti, " : %d", tvb_get_uint8(tvb, opt_offset));
2037
2038
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 1, ENC_NA);
2039
6
                opt_offset += 1;
2040
2041
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 4, ENC_NA);
2042
6
                opt_offset += 4;
2043
2044
6
                break;
2045
14
            case ND_OPT_ADVINTERVAL: /* Advertisement Interval Option (7) */
2046
2047
14
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2048
14
                opt_offset += 2;
2049
2050
14
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_advertisement_interval, tvb, opt_offset, 4, ENC_BIG_ENDIAN);
2051
14
                proto_item_append_text(ti, " : %d", tvb_get_ntohl(tvb, opt_offset));
2052
14
                opt_offset += 4;
2053
2054
14
                break;
2055
9
            case ND_OPT_HOMEAGENT_INFO: /* Home Agent Information Option (8) */
2056
9
            {
2057
2058
9
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2059
9
                opt_offset += 2;
2060
2061
9
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_home_agent_preference, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2062
9
                opt_offset += 2;
2063
2064
9
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_home_agent_lifetime, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2065
9
                opt_offset += 2;
2066
9
                break;
2067
0
            }
2068
25
            case  ND_OPT_SOURCE_ADDRLIST: /* Source Address List (9) */
2069
53
            case  ND_OPT_TARGET_ADDRLIST: /* Target Address List (10)*/
2070
53
            {
2071
53
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 6, ENC_NA);
2072
53
                opt_offset += 6;
2073
2074
357
                while(opt_offset < (offset + opt_len) ) {
2075
304
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_ipv6_address, tvb, opt_offset, 16, ENC_NA);
2076
304
                    proto_item_append_text(ti, " %s", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset));
2077
304
                    opt_offset += 16;
2078
304
                }
2079
53
                break;
2080
25
            }
2081
25
            case ND_OPT_CGA: /* CGA Option (11) */
2082
25
            {
2083
25
                proto_tree *cga_tree;
2084
25
                proto_item *cga_item;
2085
25
                uint16_t ext_data_len;
2086
25
                uint8_t padd_length;
2087
25
                unsigned par_len;
2088
25
                asn1_ctx_t asn1_ctx;
2089
2090
                /* Pad Length */
2091
25
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_cga_pad_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2092
25
                padd_length = tvb_get_uint8(tvb, opt_offset);
2093
25
                opt_offset += 1;
2094
2095
                /* Reserved 8 bits */
2096
2097
25
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 1, ENC_NA);
2098
25
                opt_offset += 1;
2099
2100
                /* CGA Parameters A variable-length field containing the CGA Parameters data
2101
                 * structure described in Section 4 of
2102
                 * "Cryptographically Generated Addresses (CGA)", RFC3972.
2103
                 */
2104
25
                par_len = opt_len -4 -padd_length;
2105
25
                cga_item = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_cga, tvb, opt_offset, par_len, ENC_NA);
2106
25
                par_len += opt_offset;
2107
2108
25
                cga_tree = proto_item_add_subtree(cga_item, ett_icmpv6_cga_param_name);
2109
25
                proto_tree_add_item(cga_tree, hf_icmpv6_opt_cga_modifier, tvb, opt_offset, 16, ENC_NA);
2110
25
                opt_offset += 16;
2111
2112
25
                proto_tree_add_item(cga_tree, hf_icmpv6_opt_cga_subnet_prefix, tvb, opt_offset, 8, ENC_NA);
2113
25
                opt_offset += 8;
2114
2115
25
                proto_tree_add_item(cga_tree, hf_icmpv6_opt_cga_count, tvb, opt_offset, 1, ENC_NA);
2116
25
                opt_offset += 1;
2117
2118
25
                asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
2119
25
                opt_offset = dissect_x509af_SubjectPublicKeyInfo(false, tvb, opt_offset, &asn1_ctx, cga_tree, hf_icmpv6_opt_cga_subject_public_key_info);
2120
2121
                /* Process RFC 4581*/
2122
71
                while (opt_offset < par_len) {
2123
46
                    proto_tree_add_item(cga_tree, hf_icmpv6_opt_cga_ext_type, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2124
46
                    opt_offset += 2;
2125
2126
46
                    ext_data_len = tvb_get_ntohs(tvb, opt_offset);
2127
46
                    proto_tree_add_item(cga_tree, hf_icmpv6_opt_cga_ext_length, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2128
46
                    opt_offset += 2;
2129
2130
46
                    proto_tree_add_item(cga_tree, hf_icmpv6_opt_cga_ext_data, tvb, opt_offset, ext_data_len, ENC_NA);
2131
46
                    opt_offset += ext_data_len;
2132
46
                }
2133
2134
                /* Padding */
2135
25
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, padd_length, ENC_NA);
2136
25
                opt_offset += padd_length;
2137
25
                break;
2138
25
            }
2139
8
            case ND_OPT_RSA: /* RSA Signature Option (12) */
2140
8
            {
2141
8
                int par_len;
2142
                /*5.2.  RSA Signature Option */
2143
                /* Reserved, A 16-bit field reserved for future use. */
2144
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2145
8
                opt_offset = opt_offset + 2;
2146
2147
                /* Key Hash
2148
                 * A 128-bit field containing the most significant (leftmost) 128
2149
                 * bits of a SHA-1 [14] hash of the public key used for constructing
2150
                 * the signature.
2151
                 */
2152
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_rsa_key_hash, tvb, opt_offset, 16, ENC_NA);
2153
8
                opt_offset = opt_offset + 16;
2154
2155
                /* Digital Signature */
2156
8
                par_len = opt_len - 20;
2157
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_digital_signature_padding , tvb, opt_offset, par_len, ENC_NA);
2158
8
                opt_offset += par_len;
2159
2160
                /* Padding */
2161
                /* TODO: Calculate padding length and exclude from the signature */
2162
8
                break;
2163
25
            }
2164
15
            case ND_OPT_TIMESTAMP: /* Timestamp Option (13) */
2165
                /* Reserved A 48-bit field reserved for future use. */
2166
15
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 6, ENC_NA);
2167
15
                opt_offset += 6;
2168
2169
                /* Timestamp
2170
                 * A 64-bit unsigned integer field containing a timestamp.  The value
2171
                 * indicates the number of seconds since January 1, 1970, 00:00 UTC,
2172
                 * by using a fixed point format.  In this format, the integer number
2173
                 * of seconds is contained in the first 48 bits of the field, and the
2174
                 * remaining 16 bits indicate the number of 1/64K fractions of a
2175
                 * second.
2176
                 */
2177
15
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_timestamp, tvb, opt_offset, 8, ENC_TIME_RFC_3971|ENC_BIG_ENDIAN);
2178
15
                opt_offset += 8;
2179
15
                break;
2180
8
            case ND_OPT_NONCE: /* Nonce option (14) */
2181
2182
                /* 5.3.2.  Nonce Option */
2183
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_nonce, tvb, opt_offset, opt_len - 2, ENC_NA);
2184
8
                opt_offset += opt_len -2;
2185
8
                break;
2186
8
            case ND_OPT_TRUST_ANCHOR: /* Trust Anchor Option (15) */
2187
8
            {
2188
8
                proto_tree *name_tree;
2189
8
                proto_item *name_item;
2190
8
                uint8_t name_type;
2191
8
                uint8_t padd_length;
2192
8
                int par_len;
2193
8
                asn1_ctx_t asn1_ctx;
2194
2195
                /* Name Type */
2196
8
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_name_type, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &name_type);
2197
8
                opt_offset += 1;
2198
2199
                /* Pad Length */
2200
8
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_cga_pad_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &padd_length);
2201
8
                opt_offset += 1;
2202
2203
8
                par_len = opt_len - 4 - padd_length;
2204
2205
8
                switch (name_type){
2206
1
                    case 1:
2207
                        /* DER Encoded X.501 Name */
2208
1
                        name_item = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_name_x501, tvb, opt_offset, par_len, ENC_NA);
2209
1
                        name_tree = proto_item_add_subtree(name_item, ett_icmpv6_opt_name);
2210
1
                        asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
2211
1
                        dissect_x509if_Name(false, tvb, opt_offset, &asn1_ctx, name_tree, hf_icmpv6_x509if_Name);
2212
1
                        break;
2213
1
                    case 2:
2214
                        /* FQDN */
2215
1
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_name_fqdn, tvb, opt_offset, par_len, ENC_ASCII);
2216
1
                        break;
2217
6
                    default:
2218
6
                        break;
2219
8
                }
2220
6
                opt_offset += par_len;
2221
2222
                /* Padding */
2223
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, padd_length, ENC_NA);
2224
6
                opt_offset += padd_length;
2225
2226
6
                break;
2227
8
            }
2228
18
            case ND_OPT_CERTIFICATE: /* Certificate Option (16) */
2229
18
            {
2230
18
                uint8_t cert_type;
2231
18
                uint8_t padd_length;
2232
18
                asn1_ctx_t asn1_ctx;
2233
2234
                /* Cert Type */
2235
18
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_cert_type, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &cert_type);
2236
18
                opt_offset += 1;
2237
2238
                /* Reserved */
2239
18
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 1, ENC_NA);
2240
18
                opt_offset += 1;
2241
2242
                /* Certificate */
2243
2244
18
                if(cert_type == 1){
2245
3
                    asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
2246
3
                    opt_offset = dissect_x509af_Certificate(false, tvb, opt_offset, &asn1_ctx, icmp6opt_tree, hf_icmpv6_x509af_Certificate);
2247
3
                    padd_length = opt_len - (opt_offset - offset);
2248
                    /* Padding */
2249
3
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, padd_length, ENC_NA);
2250
3
                    opt_offset += padd_length;
2251
15
                }else{
2252
15
                    padd_length = opt_len - 4;
2253
15
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_certificate_padding, tvb, opt_offset, padd_length, ENC_NA);
2254
15
                    opt_offset += padd_length;
2255
15
                }
2256
18
                break;
2257
2258
8
            }
2259
6
            case ND_OPT_IP_ADDRESS_PREFIX: /* IP Address/Prefix Option (17) */
2260
6
            {
2261
6
                uint8_t prefix_len;
2262
2263
                /* Option-code */
2264
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_ipa_option_code, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2265
6
                opt_offset += 1;
2266
2267
                /* Prefix Len */
2268
6
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_ipa_prefix_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &prefix_len);
2269
6
                opt_offset += 1;
2270
2271
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 4, ENC_NA);
2272
6
                opt_offset += 4;
2273
2274
                /* IPv6 Address */
2275
6
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_ipa_ipv6_address, tvb, opt_offset, 16, ENC_NA);
2276
6
                proto_item_append_text(ti, " %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
2277
6
                opt_offset += 16;
2278
2279
6
                break;
2280
8
            }
2281
4
            case ND_OPT_NEW_ROUTER_PREFIX_INFO: /* New Router Prefix Information Option (18) OBSO... */
2282
4
            {
2283
2284
4
                uint8_t prefix_len;
2285
2286
                /* Option-code */
2287
4
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_nrpi_option_code, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2288
4
                opt_offset += 1;
2289
2290
                /* Prefix Len */
2291
4
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_nrpi_prefix_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &prefix_len);
2292
4
                opt_offset += 1;
2293
2294
4
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 4, ENC_NA);
2295
4
                opt_offset += 4;
2296
2297
                /* Prefix */
2298
4
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_nrpi_prefix, tvb, opt_offset, 16, ENC_NA);
2299
4
                proto_item_append_text(ti, " %s/%u", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
2300
4
                opt_offset += 16;
2301
2302
4
                break;
2303
8
            }
2304
3
            case ND_OPT_LINK_LAYER_ADDRESS: /* Link-layer Address Option (19) */
2305
3
            {
2306
                /* Option-Code */
2307
3
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_lla_option_code, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2308
3
                opt_offset += 1;
2309
2310
                /* Link Layer Address */
2311
3
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_lla_bytes, tvb, opt_offset, opt_len-3, ENC_NA);
2312
3
                opt_offset += opt_len - 3;
2313
3
                break;
2314
8
            }
2315
2316
5
            case ND_OPT_NEIGHBOR_ADV_ACK: /* Neighbor Advertisement Acknowledgment Option (20) */
2317
5
            {
2318
5
                uint8_t status;
2319
2320
                /* Option-Code */
2321
5
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_naack_option_code, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2322
5
                opt_offset += 1;
2323
2324
                /* Status */
2325
5
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_naack_status, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &status);
2326
5
                opt_offset += 1;
2327
2328
5
                if(status == 2){
2329
0
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_naack_supplied_ncoa, tvb, opt_offset, 16, ENC_NA);
2330
0
                    opt_offset += 16;
2331
5
                }else{
2332
5
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, opt_len - 4, ENC_NA);
2333
5
                    opt_offset += opt_len - 4;
2334
5
                }
2335
5
                break;
2336
8
            }
2337
39
            case ND_OPT_PVD_ID: /* PvD ID (21) */
2338
39
            {
2339
39
                int dns_len;
2340
39
                const char *dns_name, *name_out;
2341
39
                uint64_t flags;
2342
2343
39
                static int * const pvd_id_flags[] = {
2344
39
                    &hf_icmpv6_opt_pvd_id_flags_h,
2345
39
                    &hf_icmpv6_opt_pvd_id_flags_l,
2346
39
                    &hf_icmpv6_opt_pvd_id_flags_r,
2347
39
                    &hf_icmpv6_opt_pvd_id_flags_reserved,
2348
39
                    NULL
2349
39
                };
2350
2351
                /* Flags */
2352
39
                proto_tree_add_bitmask_with_flags_ret_uint64(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_pvd_id_flags,
2353
39
                  ett_icmpv6_flag_pvd_id, pvd_id_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
2354
2355
                /* Delay */
2356
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_pvd_id_delay, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2357
39
                opt_offset += 2;
2358
2359
                /* Sequence Number */
2360
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_pvd_id_sequence_number, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2361
39
                opt_offset += 2;
2362
2363
                /* PvD ID FQDN */
2364
39
                used_bytes = get_dns_name(pinfo->pool, tvb, opt_offset, 0, opt_offset, &dns_name, &dns_len);
2365
39
                name_out = format_text(pinfo->pool, dns_name, dns_len);
2366
39
                proto_tree_add_string(icmp6opt_tree, hf_icmpv6_opt_pvd_id_fqdn, tvb, opt_offset, used_bytes, name_out);
2367
39
                proto_item_append_text(ti, " : %s", name_out);
2368
39
                opt_offset += used_bytes;
2369
2370
                /* Padding */
2371
39
                if (opt_offset & 0x07) {
2372
25
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, 8 - (opt_offset & 0x07), ENC_NA);
2373
25
                    opt_offset += 8 - (opt_offset & 0x07);
2374
25
                }
2375
2376
                /*
2377
                 * When the R-flag is set, a full Router Advertisement message header as specified in [RFC4861].
2378
                 * The sender MUST set the Type field to 134 (the value for "Router Advertisement") and set the Code field to 0.
2379
                 * Receivers MUST ignore both of these fields. The Checksum field MUST be set to 0 by the sender;
2380
                 * non-zero checksums MUST be ignored by the receiver without causing the processing of the message to fail.
2381
                 * All other fields are to be set and parsed as specified in [RFC4861] or any updating documents.
2382
                 */
2383
39
                if(flags & 0x200) {
2384
15
                    tvbuff_t *ra_tvb;
2385
15
                    ra_tvb = tvb_new_subset_length(tvb, opt_offset, 16);
2386
15
                    call_dissector(icmpv6_handle, ra_tvb, pinfo, icmp6opt_tree);
2387
15
                    opt_offset += 16;
2388
15
                }
2389
2390
                /* https://datatracker.ietf.org/doc/html/rfc8801#section-3.1-3.24
2391
                 * Zero or more RA options to be ignored by hosts that are not
2392
                 * PvD aware. */
2393
39
                if (opt_offset < offset + opt_len) {
2394
                    // Don't dissect options in the main body.
2395
25
                    opt_tvb = tvb_new_subset_length(tvb, opt_offset, offset + opt_len - opt_offset);
2396
25
                    opt_offset += dissect_icmpv6_nd_opt(opt_tvb, 0, pinfo, icmp6opt_tree, icmpv6_type);
2397
25
                }
2398
2399
39
                break;
2400
8
            }
2401
7
            case ND_OPT_MAP: /* MAP Option (23) */
2402
7
            {
2403
7
                static int * const map_flags[] = {
2404
7
                    &hf_icmpv6_opt_map_flag_r,
2405
7
                    &hf_icmpv6_opt_map_flag_reserved,
2406
7
                    NULL
2407
7
                };
2408
2409
7
                uint32_t lifetime;
2410
2411
                /* Dist */
2412
7
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_map_dist, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2413
2414
                /* Pref */
2415
7
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_map_pref, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2416
7
                opt_offset += 1;
2417
2418
                /* Flags */
2419
7
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_map_flag, ett_icmpv6_flag_map, map_flags, ENC_BIG_ENDIAN);
2420
7
                opt_offset += 1;
2421
2422
                /* Valid Lifetime */
2423
7
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_map_valid_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
2424
7
                proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
2425
7
                opt_offset += 4;
2426
2427
                /* Global Address */
2428
7
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_map_global_address, tvb, opt_offset, 16, ENC_NA);
2429
7
                opt_offset += 16;
2430
7
                break;
2431
8
            }
2432
7
            case ND_OPT_ROUTE_INFO: /* Route Information Option (24) */
2433
7
            {
2434
                /* RFC 4191 */
2435
7
                uint8_t prefix_len;
2436
7
                uint8_t route_preference;
2437
7
                uint32_t lifetime;
2438
7
                ws_in6_addr prefix;
2439
7
                address prefix_addr;
2440
7
                static int * const route_flags[] = {
2441
7
                    &hf_icmpv6_opt_route_info_flag_route_preference,
2442
7
                    &hf_icmpv6_opt_route_info_flag_reserved,
2443
7
                    NULL
2444
7
                };
2445
2446
                /* Prefix Len */
2447
7
                proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_opt_prefix_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &prefix_len);
2448
7
                opt_offset += 1;
2449
2450
                /* Flags */
2451
7
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_route_info_flag, ett_icmpv6_flag_route_info, route_flags, ENC_BIG_ENDIAN);
2452
2453
7
                route_preference = tvb_get_uint8(tvb, opt_offset);
2454
7
                route_preference = (route_preference & ND_RA_FLAG_RTPREF_MASK) >> 3;
2455
7
                proto_item_append_text(ti, " : %s", val_to_str(pinfo->pool, route_preference, nd_flag_router_pref, "Unknown %d") );
2456
7
                opt_offset += 1;
2457
2458
                /* Route Lifetime */
2459
7
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_route_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
2460
7
                if (lifetime != LIFETIME_INFINITY) {
2461
7
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
2462
7
                }
2463
7
                opt_offset += 4;
2464
2465
                /* Prefix */
2466
7
                switch(opt_len){
2467
1
                    case 8: /* Default Option Length without prefix */
2468
1
                        proto_item_append_text(ti, " ::/%d", prefix_len);
2469
1
                        break;
2470
0
                    case 16:
2471
0
                        memset(&prefix, 0, sizeof(prefix));
2472
0
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 8);
2473
0
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_prefix, tvb, opt_offset, 8, &prefix);
2474
0
                        set_address(&prefix_addr, AT_IPv6, 16, prefix.bytes);
2475
0
                        proto_item_append_text(ti, " %s/%d", address_to_str(pinfo->pool, &prefix_addr), prefix_len);
2476
0
                        opt_offset += 8;
2477
0
                        break;
2478
1
                    case 24:
2479
1
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_prefix, tvb, opt_offset, 16, ENC_NA);
2480
1
                        proto_item_append_text(ti, " %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
2481
1
                        opt_offset += 16;
2482
1
                        break;
2483
5
                    default:
2484
5
                        expert_add_info(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length);
2485
5
                        break;
2486
7
                }
2487
7
                break;
2488
2489
7
            }
2490
2491
22
            case ND_OPT_RECURSIVE_DNS_SERVER: /* Recursive DNS Server Option (25) */
2492
22
            {
2493
22
                uint32_t lifetime;
2494
2495
                /* Reserved */
2496
22
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2497
22
                opt_offset += 2;
2498
2499
                /* RDNSS Lifetime */
2500
22
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_rdnss_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
2501
22
                if (lifetime != LIFETIME_INFINITY) {
2502
21
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
2503
21
                }
2504
22
                opt_offset += 4;
2505
2506
179
                while(opt_offset < (offset + opt_len) ) {
2507
157
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_rdnss, tvb, opt_offset, 16, ENC_NA);
2508
157
                    proto_item_append_text(ti, " %s", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset));
2509
157
                    opt_offset += 16;
2510
2511
157
                }
2512
22
                break;
2513
7
            }
2514
4
            case ND_OPT_FLAGS_EXTENSION: /* RA Flags Extension Option (26) */
2515
4
            {
2516
4
                static int * const extension_flags[] = {
2517
4
                    &hf_icmpv6_opt_efo_rsv,
2518
4
                    &hf_icmpv6_opt_efo_pex,
2519
4
                    NULL
2520
4
                };
2521
2522
4
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_efo, ett_icmpv6_flag_efo, extension_flags, ENC_BIG_ENDIAN);
2523
4
                opt_offset += 6;
2524
4
                break;
2525
7
            }
2526
8
            case ND_OPT_HANDOVER_KEY_REQUEST: /* Handover Key Request Option (27) */
2527
8
            {
2528
8
                int par_len;
2529
8
                unsigned padd_length;
2530
2531
                /* Pad Length */
2532
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_pad_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2533
8
                padd_length = tvb_get_uint8(tvb, opt_offset);
2534
8
                opt_offset += 1;
2535
2536
                /* AT */
2537
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_at, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2538
2539
                /* Reserved */
2540
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_reserved, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2541
8
                opt_offset += 1;
2542
2543
                /* Handover Key Encryption Public Key */
2544
8
                par_len = opt_len-4-padd_length;
2545
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_encryption_public_key, tvb, opt_offset, par_len, ENC_NA);
2546
8
                opt_offset += par_len;
2547
2548
                /* Padding */
2549
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_padding, tvb, opt_offset, padd_length, ENC_NA);
2550
8
                opt_offset += 1;
2551
8
                break;
2552
7
            }
2553
8
            case ND_OPT_HANDOVER_KEY_REPLY: /* Handover Key Reply Option (28) */
2554
8
            {
2555
8
                int par_len;
2556
8
                unsigned padd_length;
2557
2558
                /* Pad Length */
2559
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_pad_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2560
8
                padd_length = tvb_get_uint8(tvb, opt_offset);
2561
8
                opt_offset += 1;
2562
2563
                /* AT */
2564
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_at, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2565
2566
                /* Reserved */
2567
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_reserved, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2568
8
                opt_offset += 1;
2569
2570
                /* Lifetime */
2571
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_lifetime, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2572
8
                opt_offset += 2;
2573
2574
                /* Encrypted Handover Key */
2575
8
                par_len = opt_len-6-padd_length;
2576
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_encrypted_handover_key, tvb, opt_offset, par_len, ENC_NA);
2577
8
                opt_offset += par_len;
2578
2579
                /* Padding */
2580
8
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hkr_padding, tvb, opt_offset, padd_length, ENC_NA);
2581
8
                opt_offset += 1;
2582
8
                break;
2583
7
            }
2584
14
            case ND_OPT_HANDOVER_ASSIST_INFO: /* Handover Assist Information Option (29) */
2585
14
            {
2586
14
                uint8_t hai_len;
2587
14
                int padd_length;
2588
                /* Option-Code */
2589
14
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hai_option_code, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2590
14
                opt_offset += 1;
2591
2592
                /* HAI Length */
2593
14
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hai_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2594
14
                hai_len = tvb_get_uint8(tvb, opt_offset);
2595
14
                opt_offset += 1;
2596
2597
                /* HAI Value */
2598
14
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_hai_value, tvb, opt_offset, hai_len, ENC_NA);
2599
14
                opt_offset += hai_len;
2600
2601
                /* Padding... */
2602
14
                padd_length = opt_len - (opt_offset - offset);
2603
14
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, padd_length, ENC_NA);
2604
14
                opt_offset += padd_length;
2605
2606
14
                break;
2607
7
            }
2608
5
            case ND_OPT_MOBILE_NODE_ID: /* Mobile Node Identifier Option (30) */
2609
5
            {
2610
5
                uint8_t mn_len;
2611
5
                int padd_length;
2612
                /* Option-Code */
2613
5
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_mn_option_code, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2614
5
                opt_offset += 1;
2615
2616
                /* MN Length */
2617
5
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_mn_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2618
5
                mn_len = tvb_get_uint8(tvb, opt_offset);
2619
5
                opt_offset += 1;
2620
2621
                /* MN Value */
2622
5
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_mn_value, tvb, opt_offset, mn_len, ENC_NA);
2623
5
                opt_offset += mn_len;
2624
2625
                /* Padding... */
2626
5
                padd_length = opt_len - (opt_offset - offset);
2627
5
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, padd_length, ENC_NA);
2628
5
                opt_offset += padd_length;
2629
2630
5
                break;
2631
7
            }
2632
22
            case ND_OPT_DNS_SEARCH_LIST: /* DNS Search List Option (31) */
2633
22
            {
2634
22
                uint32_t lifetime;
2635
22
                int dnssl_len;
2636
22
                const char *dnssl_name, *name_out;
2637
2638
                /* Reserved */
2639
22
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2640
22
                opt_offset += 2;
2641
2642
                /* DNSSL Lifetime */
2643
22
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_dnssl_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
2644
22
                if (lifetime != LIFETIME_INFINITY) {
2645
21
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
2646
21
                }
2647
22
                opt_offset += 4;
2648
50
                while(opt_offset < (offset + opt_len) ) {
2649
2650
43
                    if(tvb_get_uint8(tvb, opt_offset) == 0){
2651
                        /* Padding... */
2652
15
                        int padd_length = (offset + opt_len) - opt_offset;
2653
15
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_padding, tvb, opt_offset, padd_length, ENC_NA);
2654
15
                        opt_offset += padd_length;
2655
15
                        break;
2656
15
                    }
2657
28
                    used_bytes = get_dns_name(pinfo->pool, tvb, opt_offset, 0, opt_offset, &dnssl_name, &dnssl_len);
2658
28
                    name_out = format_text(pinfo->pool, dnssl_name, dnssl_len);
2659
28
                    proto_tree_add_string(icmp6opt_tree, hf_icmpv6_opt_dnssl, tvb, opt_offset, used_bytes, name_out);
2660
28
                    proto_item_append_text(ti, " %s", name_out);
2661
28
                    opt_offset += used_bytes;
2662
2663
28
                }
2664
22
                break;
2665
7
            }
2666
39
            case ND_OPT_PROXY_SIGNATURE: /* Proxy Signature Option (32) */
2667
39
            {
2668
39
                int par_len;
2669
2670
                /* Reserved */
2671
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2672
39
                opt_offset +=  2;
2673
2674
                /* Key Hash
2675
                 * A 128-bit field containing the most significant (leftmost) 128
2676
                 * bits of a SHA-1 [14] hash of the public key used for constructing
2677
                 * the signature.
2678
                 */
2679
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_ps_key_hash, tvb, opt_offset, 16, ENC_NA);
2680
39
                opt_offset += 16;
2681
2682
                /* Digital Signature */
2683
39
                par_len = opt_len - 20;
2684
39
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_digital_signature_padding , tvb, opt_offset, par_len, ENC_NA);
2685
39
                opt_offset += par_len;
2686
                /* Padding */
2687
                /* TODO: Calculate padding length and exclude from the signature */
2688
39
                break;
2689
7
            }
2690
11
            case ND_OPT_ADDR_REGISTRATION:
2691
11
            {
2692
                /* 6lowpan-ND */
2693
11
                uint8_t status_field;
2694
2695
11
                static int * const earo_prefix_flags[] = {
2696
11
                    &hf_icmpv6_opt_earo_flag_f,
2697
11
                    NULL
2698
11
                };
2699
2700
11
                static int * const earo_flags[] = {
2701
11
                    &hf_icmpv6_opt_earo_flag_reserved,
2702
11
                    &hf_icmpv6_opt_earo_flag_c,
2703
11
                    &hf_icmpv6_opt_earo_flag_p,
2704
11
                    &hf_icmpv6_opt_earo_flag_i,
2705
11
                    &hf_icmpv6_opt_earo_flag_r,
2706
11
                    &hf_icmpv6_opt_earo_flag_t,
2707
11
                    NULL
2708
11
                };
2709
2710
                /* T-Flag determines EARO instead of ARO */
2711
11
                bool is_earo = tvb_get_uint8(tvb, opt_offset + 2) & ND_OPT_EARO_FLAG_T;
2712
2713
                /* Status/Prefix length
2714
                 * Re-use of field (RFC 9926/9927)
2715
                 *
2716
                 * With EARO messages, the 8-bit status field is re-used for
2717
                 *
2718
                 * NS: 1 bit F-Flag; 7 bits Prefix length
2719
                 * NA: 2 bits reserved, 6 bits Status
2720
                 */
2721
11
                status_field = tvb_get_uint8(tvb, opt_offset);
2722
2723
11
                if(is_earo && icmpv6_type == ICMP6_ND_NEIGHBOR_SOLICIT) {
2724
2725
3
                    proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_earo_flag, ett_icmpv6_flag_earo, earo_prefix_flags, ENC_BIG_ENDIAN);
2726
2727
                    /* No status_field, we don't need to store or correct its value */
2728
3
                    proto_tree_add_uint(icmp6opt_tree, hf_icmpv6_opt_earo_prefix_len, tvb, opt_offset, 1, (uint32_t)(status_field & 0x7F));
2729
2730
8
                } else if(is_earo && icmpv6_type == ICMP6_ND_NEIGHBOR_ADVERT) {
2731
2732
                    /* Reserved: 2 MSB of status_field */
2733
0
                    proto_tree_add_uint(icmp6opt_tree, hf_icmpv6_opt_earo_reserved, tvb, opt_offset, 1, (uint32_t)((status_field & 0xC0) >> 6));
2734
2735
                    /* Set status_field to the actual status (6 LSB) */
2736
0
                    status_field &= 0x3F;
2737
0
                    proto_tree_add_uint(icmp6opt_tree, hf_icmpv6_opt_aro_status, tvb, opt_offset, 1, (uint32_t)status_field);
2738
2739
8
                } else {
2740
2741
                    /* "Regular" ARO status */
2742
8
                    proto_tree_add_uint(icmp6opt_tree, hf_icmpv6_opt_aro_status, tvb, opt_offset, 1, (uint32_t)status_field);
2743
2744
8
                }
2745
11
                opt_offset += 1;
2746
2747
                /* EARO Opaque */
2748
11
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_earo_opaque, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2749
11
                opt_offset += 1;
2750
2751
                /* EARO Flags */
2752
11
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_earo_flag, ett_icmpv6_flag_earo, earo_flags, ENC_BIG_ENDIAN);
2753
11
                opt_offset += 1;
2754
2755
                /* EARO Transaction ID */
2756
11
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_earo_tid, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2757
11
                opt_offset += 1;
2758
2759
                /* Lifetime */
2760
11
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_aro_registration_lifetime, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2761
11
                opt_offset += 2;
2762
2763
                /* RFC 6775 defines the field for the EUI-64 interface ID.
2764
                 * With RFC 8505 which introduced 'Extended Address Registration Option' (EARO),
2765
                 * the field is used for 'Registration Ownership Verifier' (ROVR).
2766
                 *
2767
                 * RFC 8505 Sect. 4.1:
2768
                 * The ROVR size MUST be 64 bits when backward compatibility is needed;
2769
                 * otherwise, the size MAY be 128, 192, or 256 bits
2770
                 *
2771
                 * In genaral, the T-flag indicates the presence of the TID and therefore
2772
                 * distinguishes between ARO (T=0) and EARO (T=1).
2773
                 */
2774
11
                if(is_earo) {
2775
2776
                    /* Check length, dissect arbitrary data and add expert item if length violates rules above.
2777
                     *
2778
                     * We already dissected 8 octets in the option.
2779
                     * opt_len-8 is the remaining data in this option.
2780
                     *
2781
                     * ToDo: Add proper dissection of ROVR data (RFC 8505) or Crypto-ID (RFC 8928).
2782
                     */
2783
8
                    unsigned int opt_remaining = opt_len-8;
2784
2785
8
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_earo_rovr, tvb, opt_offset, opt_remaining, ENC_NA);
2786
8
                    if(opt_remaining != 8 && opt_remaining != 16 && opt_remaining != 24 && opt_remaining != 32)
2787
6
                        expert_add_info_format(pinfo, ti, &ei_icmpv6_invalid_option_length, "Invalid ROVR length (%i)", opt_remaining);
2788
2789
8
                    opt_offset += opt_remaining;
2790
8
                } else {
2791
3
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_aro_eui64, tvb, opt_offset, 8, ENC_BIG_ENDIAN);
2792
3
                    proto_item_append_text(ti, " : Register %s %s", tvb_address_to_str(pinfo->pool, tvb, AT_EUI64, opt_offset), val_to_str(pinfo->pool, status_field, nd_opt_earo_status_val, "Unknown %d"));
2793
3
                    opt_offset += 8;
2794
3
                }
2795
2796
11
            }
2797
11
            break;
2798
9
            case ND_OPT_6LOWPAN_CONTEXT: /* 6LoWPAN Context (TBD2 Pending IANA...) */
2799
9
            {
2800
9
                ieee802154_hints_t *hints;
2801
                /* 6lowpan-ND */
2802
9
                uint8_t context_id;
2803
9
                uint8_t context_len;
2804
9
                ws_in6_addr context_prefix;
2805
9
                address context_prefix_addr;
2806
9
                static int * const _6lowpan_context_flags[] = {
2807
9
                    &hf_icmpv6_opt_6co_flag_c,
2808
9
                    &hf_icmpv6_opt_6co_flag_cid,
2809
9
                    &hf_icmpv6_opt_6co_flag_reserved,
2810
9
                    NULL
2811
9
                };
2812
2813
                /* Context Length */
2814
9
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_6co_context_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
2815
9
                context_len = tvb_get_uint8(tvb, opt_offset);
2816
9
                opt_offset += 1;
2817
2818
                /*  Flags & CID */
2819
9
                context_id = tvb_get_uint8(tvb, opt_offset) & ND_OPT_6CO_FLAG_CID;
2820
9
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_6co_flag, ett_icmpv6_flag_6lowpan, _6lowpan_context_flags, ENC_BIG_ENDIAN);
2821
9
                opt_offset += 1;
2822
2823
                /* Reserved */
2824
9
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_reserved, tvb, opt_offset, 2, ENC_NA);
2825
9
                opt_offset += 2;
2826
2827
                /* Lifetime */
2828
9
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_6co_valid_lifetime, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2829
9
                opt_offset += 2;
2830
2831
                /* Context */
2832
9
                memset(&context_prefix.bytes, 0, sizeof(context_prefix));
2833
9
                switch(opt_len){
2834
0
                    case 8: /* Default Option Length without context prefix */
2835
0
                        proto_item_append_text(ti, " ::/%d", context_len);
2836
0
                        break;
2837
4
                    case 16:
2838
4
                        tvb_memcpy(tvb, (uint8_t *)&context_prefix.bytes, opt_offset, 8);
2839
4
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_6co_context_prefix, tvb, opt_offset, 8, &context_prefix);
2840
4
                        set_address(&context_prefix_addr, AT_IPv6, 16, context_prefix.bytes);
2841
4
                        proto_item_append_text(ti, " %s/%d", address_to_str(pinfo->pool, &context_prefix_addr), context_len);
2842
4
                        opt_offset += 8;
2843
4
                        break;
2844
0
                    case 24:
2845
0
                        tvb_memcpy(tvb, (uint8_t *)&context_prefix.bytes, opt_offset, 16);
2846
0
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_6co_context_prefix, tvb, opt_offset, 16, ENC_NA);
2847
0
                        proto_item_append_text(ti, " %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), context_len);
2848
0
                        opt_offset += 16;
2849
0
                        break;
2850
5
                    default:
2851
5
                        expert_add_info(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length);
2852
5
                        break;
2853
9
                }
2854
                /* Update the 6LoWPAN dissectors with new context information. */
2855
9
                hints = (ieee802154_hints_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_ieee802154, 0);
2856
9
                if ((opt_len <= 24) && hints) {
2857
0
                    lowpan_context_insert(context_id, hints->src_pan, context_len, &context_prefix, pinfo->num);
2858
0
                }
2859
9
            }
2860
0
            break;
2861
4
            case ND_OPT_AUTH_BORDER_ROUTER: /* Authoritative Border Router (33) */
2862
4
            {
2863
4
                uint32_t version_low, version_high, valid_lifetime;
2864
2865
                /* Version low*/
2866
4
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_abro_version_low, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &version_low);
2867
4
                opt_offset += 2;
2868
2869
                /* Version high */
2870
4
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_abro_version_high, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &version_high);
2871
4
                opt_offset += 2;
2872
2873
                /* Valid lifetime */
2874
4
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_abro_valid_lifetime, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &valid_lifetime);
2875
4
                opt_offset += 2;
2876
2877
                /* 6LBR Address */
2878
4
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_abro_6lbr_address, tvb, opt_offset, 16, ENC_NA);
2879
4
                proto_item_append_text(ti, " : Version %d.%d, Valid Lifetime : %d, 6LBR : %s", version_high, version_low, valid_lifetime, tvb_ip6_to_str(pinfo->pool, tvb, opt_offset));
2880
4
                opt_offset += 16;
2881
2882
4
            }
2883
4
            break;
2884
4
            case ND_OPT_6CIO: /* 6LoWPAN Capability Indication Option (35) */
2885
4
            {
2886
2887
4
                static int * const opt_6cio_flags[] = {
2888
4
                    &hf_icmpv6_opt_6cio_flag_reserved,
2889
4
                    &hf_icmpv6_opt_6cio_flag_f,
2890
4
                    &hf_icmpv6_opt_6cio_flag_g,
2891
4
                    &hf_icmpv6_opt_6cio_flag_e,
2892
4
                    &hf_icmpv6_opt_6cio_flag_p,
2893
4
                    &hf_icmpv6_opt_6cio_flag_b,
2894
4
                    &hf_icmpv6_opt_6cio_flag_l,
2895
4
                    &hf_icmpv6_opt_6cio_flag_d,
2896
4
                    &hf_icmpv6_opt_6cio_flag_a,
2897
4
                    &hf_icmpv6_opt_6cio_flag_x,
2898
4
                    &hf_icmpv6_opt_6cio_flag_experimental,
2899
4
                    NULL
2900
4
                };
2901
2902
4
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_opt_6cio_flag,
2903
4
                                ett_icmpv6_flag_6cio, opt_6cio_flags, ENC_BIG_ENDIAN);
2904
4
                opt_offset += 6;
2905
2906
2907
4
            }
2908
4
            break;
2909
3
            case ND_OPT_CAPPORT: /* DHCP Captive-Portal Option (37) */
2910
3
            {
2911
3
                proto_item *ti_cp;
2912
2913
3
                ti_cp = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_captive_portal, tvb, opt_offset, opt_len-2, ENC_ASCII);
2914
3
                proto_item_set_url(ti_cp);
2915
3
                opt_offset += opt_len - 2;
2916
2917
3
            }
2918
3
            break;
2919
20
            case ND_OPT_PREF64: /* PREF64 Option (38) */
2920
20
            {
2921
20
                ws_in6_addr prefix;
2922
20
                uint32_t plc;
2923
2924
20
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_pref64_scaled_lifetime, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2925
20
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_pref64_plc, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &plc);
2926
20
                opt_offset += 2;
2927
2928
                /* Prefix */
2929
20
                memset(&prefix.bytes, 0, sizeof(prefix));
2930
20
                switch(plc){
2931
3
                    case 0: /* 96 bits prefix length */
2932
3
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 12);
2933
3
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_pref64_prefix, tvb, opt_offset, 12, &prefix);
2934
3
                        break;
2935
3
                    case 1: /* 64 bits prefix length */
2936
3
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 8);
2937
3
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_pref64_prefix, tvb, opt_offset, 8, &prefix);
2938
3
                        break;
2939
2
                    case 2: /* 56 bits prefix length */
2940
2
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 7);
2941
2
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_pref64_prefix, tvb, opt_offset, 7, &prefix);
2942
2
                        break;
2943
3
                    case 3: /* 48 bits prefix length */
2944
3
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 6);
2945
3
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_pref64_prefix, tvb, opt_offset, 6, &prefix);
2946
3
                        break;
2947
3
                    case 4: /* 40 bits prefix length */
2948
3
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 5);
2949
3
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_pref64_prefix, tvb, opt_offset, 5, &prefix);
2950
3
                        break;
2951
3
                    case 5: /* 32 bits prefix length */
2952
3
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 4);
2953
3
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_opt_pref64_prefix, tvb, opt_offset, 4, &prefix);
2954
3
                        break;
2955
3
                    default:
2956
3
                        expert_add_info(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length);
2957
3
                        break;
2958
20
                }
2959
18
                opt_offset += 12;
2960
18
            }
2961
0
            break;
2962
13
            case ND_OPT_ENCRYPTED_DNS: /* Encrypted DNS Option (144) */
2963
13
            {
2964
13
                unsigned opt_start = opt_offset;
2965
13
                unsigned opt_end = opt_offset + opt_len - 2;
2966
13
                uint32_t lifetime;
2967
13
                uint32_t adn_len = 0;
2968
13
                int adn_parsed_len;
2969
13
                const char *adn;
2970
13
                uint32_t addrs_len = 0;
2971
13
                uint32_t svc_params_len = 0;
2972
13
                uint32_t i;
2973
13
                tvbuff_t *next_tvb;
2974
13
                proto_tree *dnr_addrs_tree;
2975
13
                int padding_len;
2976
2977
13
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_dnr_svcpriority, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
2978
13
                opt_offset += 2;
2979
2980
13
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_dnr_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
2981
13
                if (lifetime != LIFETIME_INFINITY) {
2982
13
                    proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
2983
13
                }
2984
13
                opt_offset += 4;
2985
2986
13
                if (opt_offset + 2 > opt_end) {
2987
0
                    expert_add_info_format(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length, "DNR: truncated option (no ADN length)");
2988
0
                    break;
2989
0
                }
2990
2991
13
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_dnr_auth_domain_name_len, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &adn_len);
2992
13
                opt_offset += 2;
2993
2994
13
                if (opt_offset + adn_len > opt_end) {
2995
3
                    expert_add_info_format(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length, "DNR: truncated option (ADN too long)");
2996
3
                    break;
2997
3
                }
2998
2999
10
                get_dns_name(pinfo->pool, tvb, opt_offset, adn_len, opt_offset, &adn, &adn_parsed_len);
3000
10
                proto_tree_add_string(icmp6opt_tree, hf_icmpv6_opt_dnr_auth_domain_name, tvb, opt_offset, adn_len, format_text(pinfo->pool, adn, adn_parsed_len));
3001
10
                opt_offset += adn_len;
3002
3003
                // If a DNR option ends after the authentication-domain-name (ADN), it is in ADN-only mode (see RFC 9463, Section 3.1.6).
3004
                // However, since ND options must be a multiple of 8 bytes, there could be padding. Technically in order for the DNR
3005
                // option to be valid and not in ADN-only mode, there must be at least 20 bytes after the ADN (2 bytes addrs_len + 16
3006
                // bytes IPv6 address + 2 bytes svc_params_len), but just assume here that ADN-only mode will reach to the next 8 byte
3007
                // boundary.
3008
10
                if ((opt_end - opt_offset) < 8) {
3009
0
                    proto_tree_add_expert(icmp6opt_tree, pinfo, &ei_icmpv6_opt_dnr_adn_only_mode, tvb, opt_start - 2, opt_len);
3010
3011
0
                    padding_len = opt_end - opt_offset;
3012
0
                    if (padding_len > 0) {
3013
0
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_dnr_padding, tvb, opt_offset, padding_len, ENC_NA);
3014
0
                    }
3015
3016
0
                    opt_offset += padding_len;
3017
3018
0
                    break;
3019
0
                }
3020
3021
10
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_dnr_addrs_len, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &addrs_len);
3022
10
                opt_offset += 2;
3023
3024
10
                if ((unsigned)opt_offset + addrs_len > (unsigned)opt_end) {
3025
1
                    expert_add_info_format(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length, "DNR: truncated option (addrs_len too long)");
3026
1
                    break;
3027
1
                }
3028
3029
9
                if (addrs_len == 0 || addrs_len % 16 != 0) {
3030
3
                    expert_add_info_format(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length, "DNR: invalid addrs_len %d (not divisible by 16)", addrs_len);
3031
3
                    break;
3032
3
                }
3033
3034
6
                ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_dnr_addrs, tvb, opt_offset, addrs_len, ENC_NA);
3035
6
                dnr_addrs_tree = proto_item_add_subtree(ti_opt, ett_icmpv6_opt_dnr_addrs);
3036
3037
6
                proto_item_append_text(ti_opt, ":");
3038
3039
46
                for (i = 0; i < addrs_len; i += 16) {
3040
40
                    proto_tree_add_item(dnr_addrs_tree, hf_icmpv6_opt_dnr_addrs_ip, tvb, opt_offset + i, 16, ENC_NA);
3041
40
                    proto_item_append_text(ti_opt, "%c%s", (i == 0 ? ' ' : ','), tvb_ip6_to_str(pinfo->pool, tvb, opt_offset + i));
3042
40
                }
3043
3044
6
                opt_offset += addrs_len;
3045
3046
                // Handle the service parameters.
3047
6
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_opt_dnr_svc_params_len, tvb, opt_offset, 2, ENC_BIG_ENDIAN, &svc_params_len);
3048
6
                opt_offset += 2;
3049
3050
6
                if ((unsigned)opt_offset + svc_params_len > (unsigned)opt_end) {
3051
1
                    expert_add_info_format(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length, "DNR: truncated option (svc_params_len too long)");
3052
1
                    break;
3053
1
                }
3054
3055
5
                next_tvb = tvb_new_subset_length(tvb, opt_offset, svc_params_len);
3056
5
                opt_offset += call_dissector(svc_params_handle, next_tvb, pinfo, icmp6opt_tree);
3057
3058
5
                padding_len = opt_end - opt_offset;
3059
5
                if (padding_len > 0) {
3060
1
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_opt_dnr_padding, tvb, opt_offset, padding_len, ENC_NA);
3061
3062
1
                    opt_offset += padding_len;
3063
1
                }
3064
5
            }
3065
0
            break;
3066
163
            default :
3067
163
                expert_add_info_format(pinfo, ti, &ei_icmpv6_undecoded_option,
3068
163
                                       "Dissector for ICMPv6 Option (%d)"
3069
163
                                       " code not implemented, Contact Wireshark developers"
3070
163
                                       " if you want this supported", opt_type);
3071
163
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_data, tvb, opt_offset, opt_len-2, ENC_NA);
3072
163
                opt_offset += opt_len - 2;
3073
163
                break;
3074
3075
948
        } /* switch (opt_type) */
3076
3077
747
        offset += opt_len;
3078
3079
747
        if(offset > opt_offset){
3080
176
            ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_unknown_data, tvb, opt_offset, offset - opt_offset, ENC_NA);
3081
176
            expert_add_info(pinfo, ti_opt, &ei_icmpv6_unknown_data);
3082
176
        }
3083
        /* Close the ) to option root label */
3084
747
        proto_item_append_text(ti, ")");
3085
747
    }
3086
87
    return offset;
3087
324
}
3088
3089
3090
/* RPL: RFC 6550/6997 : Routing and Discovery of P2P Routes in Low-Power and Lossy Networks. */
3091
static int
3092
dissect_icmpv6_rpl_opt(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, uint8_t icmp6_code)
3093
343
{
3094
343
    proto_tree *icmp6opt_tree, *flag_tree;
3095
343
    proto_item *ti, *ti_opt, *ti_opt_len, *ti_opt_reply, *ti_opt_hop_by_hop, *ti_opt_num_of_routes,
3096
343
               *ti_opt_lifetime, *ti_opt_mr_nh = NULL;
3097
343
    uint8_t     opt_type;
3098
343
    int         opt_len;
3099
343
    int         opt_offset;
3100
3101
6.85k
    while ((int)tvb_reported_length(tvb) > offset) {
3102
        /* there are more options */
3103
3104
        /* ICMPv6 RPL Option */
3105
6.80k
        ti = proto_tree_add_item(tree, hf_icmpv6_rpl_opt, tvb, offset, 1, ENC_NA);
3106
6.80k
        icmp6opt_tree = proto_item_add_subtree(ti, ett_icmpv6_rpl_opt);
3107
6.80k
        opt_offset = offset;
3108
3109
        /* Option type */
3110
6.80k
        proto_tree_add_item_ret_uint8(icmp6opt_tree, hf_icmpv6_rpl_opt_type, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &opt_type);
3111
6.80k
        opt_offset += 1;
3112
3113
        /* Add option name to option root label */
3114
6.80k
        proto_item_append_text(ti, " (%s", val_to_str(pinfo->pool, opt_type, rpl_option_vals, "Unknown %d"));
3115
3116
        /* The Pad1 option is a special case, and contains no data. */
3117
6.80k
        if (opt_type == RPL_OPT_PAD1) {
3118
3.74k
            offset += 1;
3119
3.74k
            proto_item_append_text(ti, ")");
3120
3.74k
            continue;
3121
3.74k
        }
3122
3123
        /* Option length */
3124
3.06k
        ti_opt_len = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3125
3.06k
        opt_len = tvb_get_uint8(tvb, opt_offset);
3126
3.06k
        proto_item_set_len(ti, opt_len + 2);
3127
3.06k
        opt_offset += 1;
3128
3129
        /* decode... */
3130
3.06k
        switch (opt_type) {
3131
255
            case RPL_OPT_PADN:
3132
                /* n-byte padding */
3133
255
                ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_padn, tvb, opt_offset, opt_len, ENC_NA);
3134
255
                proto_item_append_text(ti_opt, " (Length : %i bytes)", opt_len);
3135
255
                opt_offset += opt_len;
3136
255
                break;
3137
578
            case RPL_OPT_METRIC: {
3138
                /* DAG metric container */
3139
                /* See RFC 6551 for formatting. */
3140
3141
578
                proto_tree *metric_constraint_tree;
3142
578
                proto_item *ti_metric_constraint;
3143
578
                uint8_t metric_constraint_type;
3144
                /* N.B. keeping this as a signed value to detect potential underflow. */
3145
578
                int metric_len;
3146
3147
5.16k
                while (opt_offset < offset + opt_len) {
3148
4.70k
                    static int * const rpl_metric_flags[] = {
3149
4.70k
                        &hf_icmpv6_rpl_opt_metric_reserved,
3150
4.70k
                        &hf_icmpv6_rpl_opt_metric_flag_p,
3151
4.70k
                        &hf_icmpv6_rpl_opt_metric_flag_c,
3152
4.70k
                        &hf_icmpv6_rpl_opt_metric_flag_o,
3153
4.70k
                        &hf_icmpv6_rpl_opt_metric_flag_r,
3154
4.70k
                        &hf_icmpv6_rpl_opt_metric_a,
3155
4.70k
                        &hf_icmpv6_rpl_opt_metric_prec,
3156
4.70k
                        NULL
3157
4.70k
                    };
3158
4.70k
                    uint16_t metric_constraint_flags;
3159
3160
                    /* Metric/Constraint type */
3161
4.70k
                    metric_constraint_type = tvb_get_uint8(tvb, opt_offset);
3162
4.70k
                    ti_metric_constraint = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_metric_type, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3163
4.70k
                    metric_constraint_tree = proto_item_add_subtree(ti_metric_constraint, ett_icmpv6_rpl_metric_type);
3164
4.70k
                    opt_offset += 1;
3165
3166
                    /* Flags */
3167
4.70k
                    proto_tree_add_bitmask(metric_constraint_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_metric_flags, ett_icmpv6_rpl_metric_flags, rpl_metric_flags, ENC_BIG_ENDIAN);
3168
4.70k
                    metric_constraint_flags = tvb_get_uint16(tvb, opt_offset, ENC_BIG_ENDIAN);
3169
4.70k
                    opt_offset += 2;
3170
3171
                    /* Metric length */
3172
4.70k
                    metric_len = tvb_get_uint8(tvb, opt_offset);
3173
4.70k
                    proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_len, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3174
4.70k
                    proto_item_set_len(ti_metric_constraint, metric_len + 4);
3175
4.70k
                    opt_offset += 1;
3176
3177
                    /* Metric/Constraint Type */
3178
4.70k
                    switch(metric_constraint_type) {
3179
150
                        case RPL_METRIC_NSA: /* Node State and Attribute Object */
3180
150
                            {
3181
150
                            static int * const metric_nsa_flags[] = {
3182
150
                                &hf_icmpv6_rpl_opt_metric_nsa_object_reserved,
3183
150
                                &hf_icmpv6_rpl_opt_metric_nsa_object_flags,
3184
150
                                &hf_icmpv6_rpl_opt_metric_nsa_object_flag_a,
3185
150
                                &hf_icmpv6_rpl_opt_metric_nsa_object_flag_o,
3186
150
                                NULL
3187
150
                            };
3188
3189
150
                            proto_item *ti_metric_nsa_object =  proto_tree_add_bitmask(metric_constraint_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_metric_nsa_object,
3190
150
                                                    ett_icmpv6_rpl_metric_nsa_object, metric_nsa_flags, ENC_BIG_ENDIAN);
3191
150
                            proto_item_set_len(ti_metric_nsa_object, 2);
3192
150
                            opt_offset += 2;
3193
150
                            metric_len -= 2;
3194
3195
3196
480
                            while(metric_len > 0){
3197
                              /* TLV */
3198
330
                              tvb_get_uint8(tvb, opt_offset);
3199
330
                              proto_item *ti_metric_nsa_tlv = proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3200
330
                              proto_tree * metric_nsa_tlv_tree = proto_item_add_subtree(ti_metric_nsa_tlv, ett_icmpv6_rpl_metric_nsa_object_tlv_type);
3201
3202
                              /* TLV type */
3203
330
                              proto_tree_add_item(metric_nsa_tlv_tree, hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_type, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3204
330
                              opt_offset += 1;
3205
330
                              metric_len -= 1;
3206
3207
                              /* TLV length */
3208
330
                              int nsa_tlv_len = tvb_get_uint8(tvb, opt_offset);
3209
330
                              proto_tree_add_item(metric_nsa_tlv_tree, hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3210
330
                              proto_item_set_len(ti_metric_nsa_tlv, nsa_tlv_len + 2);
3211
330
                              opt_offset += 1;
3212
330
                              metric_len -= 1;
3213
3214
                              /* TLV data */
3215
330
                              proto_tree_add_item(metric_nsa_tlv_tree, hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_data, tvb, opt_offset, nsa_tlv_len, ENC_NA);
3216
330
                              opt_offset += nsa_tlv_len;
3217
330
                              metric_len -= nsa_tlv_len;
3218
330
                            }
3219
150
                            break;
3220
0
                            }
3221
312
                        case RPL_METRIC_NE: /* Node Energy */
3222
312
                            {
3223
312
                            static int * const metric_ne_flags[] = {
3224
312
                                &hf_icmpv6_rpl_opt_metric_ne_object_flags,
3225
312
                                &hf_icmpv6_rpl_opt_metric_ne_object_flag_i,
3226
312
                                &hf_icmpv6_rpl_opt_metric_ne_object_type,
3227
312
                                &hf_icmpv6_rpl_opt_metric_ne_object_flag_e,
3228
312
                                &hf_icmpv6_rpl_opt_metric_ne_object_energy,
3229
312
                                NULL
3230
312
                            };
3231
3232
2.05k
                            for (; metric_len > 0; metric_len -= 2) {
3233
1.74k
                                proto_tree_add_bitmask(metric_constraint_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_metric_ne_object,
3234
1.74k
                                                    ett_icmpv6_rpl_metric_ne_object, metric_ne_flags, ENC_BIG_ENDIAN);
3235
1.74k
                                opt_offset += 2;
3236
1.74k
                            }
3237
312
                            break;
3238
0
                            }
3239
103
                        case RPL_METRIC_HP: /* Hop Count Object */
3240
103
                            {
3241
103
                            static int * const metric_hp_flags[] = {
3242
103
                                &hf_icmpv6_rpl_opt_metric_hp_object_reserved,
3243
103
                                &hf_icmpv6_rpl_opt_metric_hp_object_flags,
3244
103
                                &hf_icmpv6_rpl_opt_metric_hp_object_hp,
3245
103
                                NULL
3246
103
                            };
3247
103
                            proto_tree_add_bitmask(metric_constraint_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_metric_hp_object,
3248
103
                                                    ett_icmpv6_rpl_metric_hp_object, metric_hp_flags, ENC_BIG_ENDIAN);
3249
103
                            opt_offset += 2;
3250
103
                            break;
3251
0
                            }
3252
141
                        case RPL_METRIC_LT: /* Link Throughput Object */
3253
1.02k
                            for (; metric_len > 0; metric_len -= 4) {
3254
882
                                proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_lt_object_lt, tvb, opt_offset, 4, ENC_BIG_ENDIAN);
3255
882
                                opt_offset += 4;
3256
882
                            }
3257
141
                            break;
3258
101
                        case RPL_METRIC_LL: /* Link Latency Object */
3259
632
                            for (; metric_len > 0; metric_len -= 4) {
3260
531
                                proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_ll_object_ll, tvb, opt_offset, 4, ENC_BIG_ENDIAN);
3261
531
                                opt_offset += 4;
3262
531
                            }
3263
101
                            break;
3264
118
                        case RPL_METRIC_LQL: /* Link Quality Level Object */
3265
118
                            {
3266
118
                            static int * const metric_lql_flags[] = {
3267
118
                                &hf_icmpv6_rpl_opt_metric_lql_object_val,
3268
118
                                &hf_icmpv6_rpl_opt_metric_lql_object_counter,
3269
118
                                NULL
3270
118
                            };
3271
3272
118
                            proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_lql_object_res, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3273
118
                            opt_offset += 1;
3274
118
                            metric_len -= 1;
3275
2.05k
                            for (; metric_len > 0; metric_len -= 1) {
3276
1.93k
                                proto_tree_add_bitmask(metric_constraint_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_metric_lql_object,
3277
1.93k
                                                    ett_icmpv6_rpl_metric_lql_object, metric_lql_flags, ENC_BIG_ENDIAN);
3278
1.93k
                                opt_offset += 1;
3279
1.93k
                            }
3280
118
                            break;
3281
0
                            }
3282
74
                        case RPL_METRIC_ETX: /* ETX Object */
3283
548
                            for (; metric_len > 0; metric_len -= 2) {
3284
474
                                proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_etx_object_etx, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3285
474
                                opt_offset += 2;
3286
474
                            }
3287
74
                            break;
3288
158
                        case RPL_METRIC_LC: /* Link Color Object */
3289
158
                            proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_lc_object_res, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3290
158
                            opt_offset += 1;
3291
158
                            metric_len -= 1;
3292
1.86k
                            for (; metric_len > 0; metric_len -= 2) {
3293
1.71k
                                ti_opt = proto_tree_add_item(metric_constraint_tree, hf_icmpv6_rpl_opt_metric_lc_object, tvb, opt_offset, 2, ENC_NA);
3294
1.71k
                                flag_tree = proto_item_add_subtree(ti_opt, ett_icmpv6_rpl_metric_lc_object);
3295
1.71k
                                proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_metric_lc_object_lc, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3296
1.71k
                                if (metric_constraint_flags & RPL_METRIC_FLAG_C) {
3297
586
                                    proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_metric_lc_object_reserved, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3298
586
                                    proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_metric_lc_object_flag_i, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3299
1.12k
                                } else if (metric_constraint_flags & RPL_METRIC_FLAG_R) {
3300
307
                                    proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_metric_lc_object_counter, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3301
817
                                } else {
3302
817
                                    expert_add_info(pinfo, ti_opt, &ei_icmpv6_rpl_unknown_metric);
3303
817
                                }
3304
1.71k
                                opt_offset += 2;
3305
1.71k
                            }
3306
158
                            break;
3307
3.52k
                        default:
3308
3.52k
                            expert_add_info(pinfo, ti_opt_len, &ei_icmpv6_rpl_unknown_metric);
3309
3.52k
                            break;
3310
4.70k
                    }
3311
4.70k
                }
3312
455
                break;
3313
578
            }
3314
455
            case RPL_OPT_ROUTING: {
3315
208
                uint8_t prefix_len;
3316
208
                ws_in6_addr prefix;
3317
208
                address prefix_addr;
3318
208
                uint32_t lifetime;
3319
3320
208
                static int * const rpl_flags[] = {
3321
208
                    &hf_icmpv6_rpl_opt_route_pref,
3322
208
                    &hf_icmpv6_rpl_opt_route_reserved,
3323
208
                    NULL
3324
208
                };
3325
3326
                /* Prefix length */
3327
208
                prefix_len = tvb_get_uint8(tvb, opt_offset);
3328
208
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_prefix_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3329
208
                opt_offset +=1;
3330
3331
                /* Flags */
3332
208
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_route_flag,
3333
208
                                    ett_icmpv6_rpl_flag_routing, rpl_flags, ENC_BIG_ENDIAN);
3334
208
                opt_offset +=1;
3335
3336
                /* Prefix lifetime. */
3337
208
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_rpl_opt_route_lifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
3338
208
                if (lifetime != LIFETIME_INFINITY) {
3339
204
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
3340
204
                }
3341
208
                opt_offset += 4;
3342
3343
208
                switch(opt_len){
3344
6
                    case 6: /* Default Option Length without prefix */
3345
6
                        proto_item_append_text(ti, " ::/%d", prefix_len);
3346
6
                        break;
3347
0
                    case 14:
3348
0
                        memset(&prefix, 0, sizeof(prefix));
3349
0
                        tvb_memcpy(tvb, (uint8_t *)&prefix.bytes, opt_offset, 8);
3350
0
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_rpl_opt_route_prefix, tvb, opt_offset, 8, &prefix);
3351
0
                        set_address(&prefix_addr, AT_IPv6, 16, prefix.bytes);
3352
0
                        proto_item_append_text(ti, " %s/%d", address_to_str(pinfo->pool, &prefix_addr), prefix_len);
3353
0
                        opt_offset += 8;
3354
0
                        break;
3355
1
                    case 22:
3356
1
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_prefix, tvb, opt_offset, 16, ENC_NA);
3357
1
                        proto_item_append_text(ti, " %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
3358
1
                        opt_offset += 16;
3359
1
                        break;
3360
199
                    default:
3361
199
                        expert_add_info(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length);
3362
199
                        break;
3363
208
                }
3364
205
                break;
3365
208
            }
3366
205
            case RPL_OPT_CONFIG: {
3367
118
                static int * const rpl_config_flags[] = {
3368
118
                    &hf_icmpv6_rpl_opt_config_reserved,
3369
118
                    &hf_icmpv6_rpl_opt_config_auth,
3370
118
                    &hf_icmpv6_rpl_opt_config_pcs,
3371
118
                    NULL
3372
118
                };
3373
118
                proto_item *pi;
3374
3375
                /* Flags */
3376
118
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_config_flag,
3377
118
                                    ett_icmpv6_rpl_flag_config, rpl_config_flags, ENC_BIG_ENDIAN);
3378
118
                opt_offset += 1;
3379
3380
                /* DIOIntervalDoublings */
3381
118
                pi = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_doublings, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3382
118
                proto_item_append_text(pi, " (Imax=%.0fms)", pow(2, tvb_get_uint8(tvb, opt_offset + 1) + tvb_get_uint8(tvb, opt_offset)));
3383
118
                opt_offset += 1;
3384
3385
                /* DIOIntervalMin */
3386
118
                pi = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_min_interval, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3387
118
                proto_item_append_text(pi, " (Imin=%.0fms)", pow(2, tvb_get_uint8(tvb, opt_offset)));
3388
118
                opt_offset += 1;
3389
3390
                /* DIORedundancyConstant */
3391
118
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_redundancy, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3392
118
                opt_offset += 1;
3393
3394
                /* MaxRankIncrease */
3395
118
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_rank_incr, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3396
118
                opt_offset += 2;
3397
3398
                /* MinHopRankInc */
3399
118
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_hop_rank_inc, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3400
118
                opt_offset += 2;
3401
3402
                /* OCP */
3403
118
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_ocp, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3404
118
                opt_offset += 2;
3405
3406
                /* Reserved */
3407
118
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_rsv, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3408
118
                opt_offset += 1;
3409
3410
                /* Default Lifetime */
3411
118
                pi = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_def_lifetime, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3412
118
                proto_item_append_text(pi, " (%us)", tvb_get_uint8(tvb, opt_offset) * tvb_get_ntohs(tvb, opt_offset + 1));
3413
118
                opt_offset += 1;
3414
3415
                /* Lifetime Unit */
3416
118
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_config_lifetime_unit, tvb, opt_offset, 2, ENC_BIG_ENDIAN);
3417
118
                opt_offset += 2;
3418
118
                break;
3419
208
            }
3420
204
            case RPL_OPT_TARGET: {
3421
204
                uint8_t             prefix_len;
3422
204
                ws_in6_addr   target_prefix;
3423
204
                address target_prefix_addr;
3424
3425
                /* Flag */
3426
204
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_target_flag, tvb, opt_offset, 1, ENC_NA);
3427
204
                opt_offset += 1;
3428
3429
                /* Prefix length */
3430
204
                prefix_len = tvb_get_uint8(tvb, opt_offset);
3431
204
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_target_prefix_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3432
204
                opt_offset += 1;
3433
3434
                /* Target Prefix */
3435
3436
204
                switch(opt_len){
3437
13
                    case 2: /* Default Option Length without prefix */
3438
13
                        proto_item_append_text(ti, " ::/%d", prefix_len);
3439
13
                        break;
3440
1
                    case 10:
3441
1
                        memset(&target_prefix, 0, sizeof(target_prefix));
3442
1
                        tvb_memcpy(tvb, (uint8_t *)&target_prefix.bytes, opt_offset, 8);
3443
1
                        proto_tree_add_ipv6(icmp6opt_tree, hf_icmpv6_rpl_opt_target_prefix, tvb, opt_offset, 8, &target_prefix);
3444
1
                        set_address(&target_prefix_addr, AT_IPv6, 16, target_prefix.bytes);
3445
1
                        proto_item_append_text(ti, " %s/%d", address_to_str(pinfo->pool, &target_prefix_addr), prefix_len);
3446
1
                        opt_offset += 8;
3447
1
                        break;
3448
1
                    case 18:
3449
1
                        proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_target_prefix, tvb, opt_offset, 16, ENC_NA);
3450
1
                        proto_item_append_text(ti, " %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
3451
1
                        opt_offset += 16;
3452
1
                        break;
3453
189
                    default:
3454
189
                        expert_add_info(pinfo, ti_opt_len, &ei_icmpv6_invalid_option_length);
3455
189
                        break;
3456
204
                }
3457
204
                break;
3458
204
            }
3459
221
            case RPL_OPT_TRANSIT: {
3460
221
                static int * const rpl_transit_flags[] = {
3461
221
                    &hf_icmpv6_rpl_opt_transit_flag_e,
3462
221
                    &hf_icmpv6_rpl_opt_transit_flag_i,
3463
221
                    &hf_icmpv6_rpl_opt_transit_flag_rsv,
3464
221
                    NULL
3465
221
                };
3466
221
                static int * const rpl_transit_pathctl[] = {
3467
221
                    &hf_icmpv6_rpl_opt_transit_pathctl_pc1,
3468
221
                    &hf_icmpv6_rpl_opt_transit_pathctl_pc2,
3469
221
                    &hf_icmpv6_rpl_opt_transit_pathctl_pc3,
3470
221
                    &hf_icmpv6_rpl_opt_transit_pathctl_pc4,
3471
221
                    NULL,
3472
221
                };
3473
3474
                /* Flags */
3475
221
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_transit_flag,
3476
221
                                    ett_icmpv6_rpl_flag_transit, rpl_transit_flags, ENC_BIG_ENDIAN);
3477
221
                opt_offset += 1;
3478
3479
                /* Path Control */
3480
221
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_transit_pathctl,
3481
221
                                    ett_icmpv6_rpl_transit_pathctl, rpl_transit_pathctl, ENC_BIG_ENDIAN);
3482
221
                opt_offset += 1;
3483
3484
                /* Path Sequence */
3485
221
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_transit_pathseq, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3486
221
                opt_offset += 1;
3487
3488
                /* Path Lifetime */
3489
221
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_transit_pathlifetime, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3490
221
                opt_offset += 1;
3491
3492
                /* Option contains parent */
3493
221
                if(opt_len > 4)
3494
184
                {
3495
184
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_transit_parent, tvb, opt_offset, 16, ENC_NA);
3496
184
                    proto_item_append_text(ti, " %s", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset));
3497
184
                    opt_offset += 16;
3498
184
                }
3499
3500
221
                break;
3501
204
            }
3502
96
            case RPL_OPT_SOLICITED: {
3503
96
                static int * const rpl_solicited_flags[] = {
3504
96
                    &hf_icmpv6_rpl_opt_solicited_flag_v,
3505
96
                    &hf_icmpv6_rpl_opt_solicited_flag_i,
3506
96
                    &hf_icmpv6_rpl_opt_solicited_flag_d,
3507
96
                    &hf_icmpv6_rpl_opt_solicited_flag_rsv,
3508
96
                    NULL
3509
96
                };
3510
3511
                /*Instance ID */
3512
96
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_solicited_instance, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3513
96
                opt_offset += 1;
3514
3515
                /* Flags */
3516
96
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_solicited_flag,
3517
96
                                    ett_icmpv6_rpl_flag_solicited, rpl_solicited_flags, ENC_BIG_ENDIAN);
3518
96
                opt_offset += 1;
3519
3520
                /* DODAG ID */
3521
96
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_solicited_dodagid, tvb, opt_offset, 16, ENC_NA);
3522
96
                opt_offset += 16;
3523
3524
                /* Version Number */
3525
96
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_solicited_version, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3526
96
                opt_offset += 1;
3527
3528
96
                break;
3529
204
            }
3530
149
            case RPL_OPT_PREFIX: {
3531
                /* Destination prefix option. */
3532
149
                uint32_t lifetime;
3533
149
                uint32_t prefix_len;
3534
149
                static int * const rpl_prefix_flags[] = {
3535
149
                    &hf_icmpv6_rpl_opt_prefix_flag_l,
3536
149
                    &hf_icmpv6_rpl_opt_prefix_flag_a,
3537
149
                    &hf_icmpv6_rpl_opt_prefix_flag_r,
3538
149
                    &hf_icmpv6_rpl_opt_prefix_flag_rsv,
3539
149
                    NULL
3540
149
                };
3541
3542
                /* Prefix length */
3543
149
                proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_rpl_opt_prefix_length, tvb, opt_offset, 1, ENC_BIG_ENDIAN, &prefix_len);
3544
149
                opt_offset +=1;
3545
3546
                /* Flags */
3547
149
                proto_tree_add_bitmask(icmp6opt_tree, tvb, opt_offset, hf_icmpv6_rpl_opt_prefix_flag,
3548
149
                                    ett_icmpv6_rpl_flag_prefix, rpl_prefix_flags, ENC_BIG_ENDIAN);
3549
149
                opt_offset += 1;
3550
3551
                /* Valid Lifetime */
3552
149
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_rpl_opt_prefix_vlifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
3553
149
                if (lifetime != LIFETIME_INFINITY) {
3554
140
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
3555
140
                }
3556
149
                opt_offset += 4;
3557
3558
                /* Preferred Lifetime */
3559
149
                ti_opt = proto_tree_add_item_ret_uint(icmp6opt_tree, hf_icmpv6_rpl_opt_prefix_plifetime, tvb, opt_offset, 4, ENC_BIG_ENDIAN, &lifetime);
3560
149
                if (lifetime != LIFETIME_INFINITY) {
3561
135
                  proto_item_append_text(ti_opt, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
3562
135
                }
3563
149
                opt_offset += 4;
3564
3565
                /* 4 reserved bytes. */
3566
149
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_reserved, tvb, opt_offset, 4, ENC_NA);
3567
149
                opt_offset += 4;
3568
3569
                /* Prefix */
3570
149
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_prefix, tvb, opt_offset, 16, ENC_NA);
3571
149
                proto_item_append_text(ti, " %s/%d", tvb_ip6_to_str(pinfo->pool, tvb, opt_offset), prefix_len);
3572
149
                opt_offset += 16;
3573
3574
149
                break;
3575
204
            }
3576
3577
49
            case RPL_OPT_TARGETDESC: {
3578
3579
                /* Descriptor */
3580
49
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_targetdesc, tvb, opt_offset, 4, ENC_BIG_ENDIAN);
3581
49
                opt_offset += 4;
3582
49
                break;
3583
204
            }
3584
3585
82
            case RPL_OPT_ROUTE_DISCOVERY: {
3586
82
                int num_of_addr = 0;
3587
82
                uint8_t flags = 0, compr = 0, addr_len = 0, lt_mr_nh = 0;
3588
82
                uint8_t addr[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
3589
3590
                /* Flags */
3591
82
                ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_discovery_flag, tvb, opt_offset, 1, ENC_NA);
3592
82
                flag_tree = proto_item_add_subtree(ti_opt, ett_icmpv6_rpl_route_discovery_flag);
3593
3594
82
                flags = tvb_get_uint8(tvb, opt_offset);
3595
82
                compr = flags & RPL_OPT_ROUTE_DISCOVERY_COMPR;
3596
3597
                /* Reply */
3598
82
                ti_opt_reply = proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_route_discovery_reply, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3599
3600
                /* Hop-by-Hop */
3601
82
                ti_opt_hop_by_hop = proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_route_discovery_hop_by_hop, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3602
3603
                /* Num of Source Routes */
3604
82
                ti_opt_num_of_routes = proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_route_discovery_num_of_routes, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3605
3606
                /* Compr */
3607
82
                proto_tree_add_item(flag_tree, hf_icmpv6_rpl_opt_route_discovery_compr, tvb, opt_offset, 1, ENC_BIG_ENDIAN);
3608
82
                opt_offset +=1;
3609
3610
                /* Lifetime / MaxRank / NH */
3611
82
                lt_mr_nh = tvb_get_uint8(tvb, opt_offset);
3612
82
                ti_opt_lifetime = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_discovery_lifetime, tvb, opt_offset, 1, ENC_NA);
3613
3614
82
                if ((icmp6_code == ICMP6_RPL_P2P_DRO) || (icmp6_code == ICMP6_RPL_P2P_SDRO)) {
3615
31
                    proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_discovery_nh, tvb, opt_offset, 1, ENC_NA);
3616
51
                } else {
3617
51
                    ti_opt_mr_nh = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_discovery_maxrank, tvb, opt_offset, 1, ENC_NA);
3618
51
                }
3619
3620
82
                opt_offset +=1;
3621
3622
                /* add expert and auxiliary info */
3623
82
                switch (icmp6_code) {
3624
0
                    case ICMP6_RPL_P2P_SDRO:
3625
31
                    case ICMP6_RPL_P2P_DRO:
3626
3627
31
                        if (flags & RPL_OPT_ROUTE_DISCOVERY_R) {
3628
13
                            expert_add_info(pinfo, ti_opt_reply, &ei_icmpv6_rpl_p2p_dro_rdo_zero);
3629
13
                        }
3630
3631
31
                        if (flags & RPL_OPT_ROUTE_DISCOVERY_N) {
3632
15
                            expert_add_info(pinfo, ti_opt_num_of_routes, &ei_icmpv6_rpl_p2p_dro_rdo_zero);
3633
15
                        }
3634
3635
31
                        if (lt_mr_nh & RPL_OPT_ROUTE_DISCOVERY_L) {
3636
15
                            expert_add_info(pinfo, ti_opt_lifetime, &ei_icmpv6_rpl_p2p_dro_rdo_zero);
3637
15
                        }
3638
3639
31
                        break;
3640
51
                    default:
3641
3642
51
                        if (flags & RPL_OPT_ROUTE_DISCOVERY_H) {
3643
20
                            if (!(flags & RPL_OPT_ROUTE_DISCOVERY_R)) {
3644
9
                                expert_add_info(pinfo, ti_opt_hop_by_hop, &ei_icmpv6_rpl_p2p_hop_by_hop);
3645
9
                            }
3646
3647
20
                            if (flags & RPL_OPT_ROUTE_DISCOVERY_N) {
3648
13
                                expert_add_info(pinfo, ti_opt_num_of_routes, &ei_icmpv6_rpl_p2p_num_of_routes);
3649
13
                            }
3650
20
                        }
3651
3652
51
                        proto_item_append_text(ti_opt_lifetime, " (%u sec)", pow4(uint32_t, (lt_mr_nh & RPL_OPT_ROUTE_DISCOVERY_L) >> 6));
3653
3654
51
                        if (!(lt_mr_nh & RPL_OPT_ROUTE_DISCOVERY_MR_NH)) {
3655
24
                            proto_item_append_text(ti_opt_mr_nh, " (Infinity)");
3656
24
                        }
3657
3658
51
                        break;
3659
82
                }
3660
3661
                /* TargetAddr */
3662
82
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_discovery_target_addr, tvb, opt_offset, 16, ENC_NA);
3663
82
                opt_offset +=16;
3664
3665
82
                addr_len = (16 - compr);
3666
82
                num_of_addr = (opt_len - 18) / addr_len;
3667
3668
                /* Address Vector */
3669
82
                ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_rpl_opt_route_discovery_addr_vec, tvb, opt_offset, (opt_len - 18), ENC_NA);
3670
82
                flag_tree = proto_item_add_subtree(ti_opt, ett_icmpv6_rpl_route_discovery_addr_vec);
3671
3672
82
                proto_item_append_text(flag_tree, " (%d Address%s)", num_of_addr, num_of_addr != 1 ? "es" : "");
3673
3674
1.17k
                while (num_of_addr--) {
3675
1.09k
                    memset(addr, 0, sizeof(addr));
3676
1.09k
                    tvb_memcpy(tvb, addr + compr, opt_offset, addr_len);
3677
1.09k
                    proto_tree_add_ipv6(flag_tree, hf_icmpv6_rpl_opt_route_discovery_addr_vec_addr, tvb, opt_offset, addr_len, (ws_in6_addr *)addr);
3678
1.09k
                    opt_offset += addr_len;
3679
1.09k
                }
3680
3681
82
                break;
3682
82
            }
3683
1.09k
            default :
3684
1.09k
                expert_add_info_format(pinfo, ti, &ei_icmpv6_undecoded_rpl_option,
3685
1.09k
                                       "Dissector for ICMPv6 RPL Option"
3686
1.09k
                                       " (%d) code not implemented, Contact"
3687
1.09k
                                       " Wireshark developers if you want this supported", opt_type);
3688
1.09k
                proto_tree_add_item(icmp6opt_tree, hf_icmpv6_data, tvb, opt_offset, opt_len, ENC_NA);
3689
1.09k
                opt_offset += opt_len;
3690
1.09k
                break;
3691
3.06k
        } /* switch (opt_type) */
3692
3693
2.76k
        offset += opt_len + 2;
3694
3695
2.76k
        if(offset > opt_offset){
3696
606
            ti_opt = proto_tree_add_item(icmp6opt_tree, hf_icmpv6_unknown_data, tvb, opt_offset, offset - opt_offset, ENC_NA);
3697
606
            expert_add_info(pinfo, ti_opt, &ei_icmpv6_unknown_data);
3698
606
        }
3699
3700
        /* Close the ) to option root label */
3701
2.76k
        proto_item_append_text(ti, ")");
3702
2.76k
    } /* while */
3703
48
    return offset;
3704
343
}
3705
3706
static int
3707
dissect_rpl_control(tvbuff_t *tvb, int rpl_offset, packet_info *pinfo _U_, proto_tree *icmp6_tree, uint8_t icmp6_type _U_, uint8_t icmp6_code)
3708
357
{
3709
357
    proto_item *ti;
3710
3711
    /* Secure RPL ? (ICMP Code start to 0x8x) */
3712
357
    if(icmp6_code & ICMP6_RPL_SECURE)
3713
20
    {
3714
20
        uint8_t kim, lvl;
3715
20
        static int * const rpl_secure_flags[] = {
3716
20
            &hf_icmpv6_rpl_secure_flag_t,
3717
20
            &hf_icmpv6_rpl_secure_flag_rsv,
3718
20
            NULL
3719
20
        };
3720
20
        static int * const rpl_secure_flags2[] = {
3721
20
            &hf_icmpv6_rpl_secure_kim,
3722
20
            &hf_icmpv6_rpl_secure_lvl,
3723
20
            &hf_icmpv6_rpl_secure_rsv,
3724
20
            NULL
3725
20
        };
3726
3727
        /* Flags */
3728
20
        proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_secure_flag,
3729
20
                            ett_icmpv6_flag_secure, rpl_secure_flags, ENC_BIG_ENDIAN);
3730
20
        rpl_offset += 1;
3731
3732
        /* Algorithm */
3733
20
        proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_algorithm, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3734
20
        rpl_offset += 1;
3735
3736
        /* KIM & LVL */
3737
20
        proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_secure_flag,
3738
20
                            ett_icmpv6_flag_secure, rpl_secure_flags2, ENC_BIG_ENDIAN);
3739
20
        kim = tvb_get_uint8(tvb, rpl_offset) & RPL_SECURE_KIM >> 6;
3740
20
        lvl = tvb_get_uint8(tvb, rpl_offset) & RPL_SECURE_LVL;
3741
20
        rpl_offset += 1;
3742
3743
        /* Flags */
3744
20
        proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_flag, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3745
20
        rpl_offset += 1;
3746
3747
        /* Counter */
3748
20
        proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_counter, tvb, rpl_offset, 4, ENC_BIG_ENDIAN);
3749
20
        rpl_offset += 4;
3750
3751
        /*  Key Identifier */
3752
20
        switch(kim){
3753
7
            case 0:
3754
7
            {
3755
7
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_key_index, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3756
7
                rpl_offset += 1;
3757
7
                break;
3758
0
            }
3759
4
            case 1:
3760
4
            {
3761
                /* No Key Identifier */
3762
4
                break;
3763
0
            }
3764
5
            case 2:
3765
5
            {
3766
5
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_key_source, tvb, rpl_offset, 8, ENC_NA);
3767
5
                rpl_offset += 8;
3768
5
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_key_index, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3769
5
                rpl_offset += 1;
3770
5
                break;
3771
0
            }
3772
4
            case 3:
3773
4
            {
3774
4
                if(lvl == 1 || lvl == 3)
3775
2
                {
3776
2
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_key_source, tvb, rpl_offset, 8, ENC_NA);
3777
2
                    rpl_offset += 8;
3778
2
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_secure_key_index, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3779
2
                    rpl_offset += 1;
3780
2
                }
3781
4
                break;
3782
0
            }
3783
3784
20
        }
3785
3786
20
    }
3787
357
    switch(icmp6_code){
3788
258
        case ICMP6_RPL_DIS: /* DODAG Information Solicitation (0) */
3789
264
        case ICMP6_RPL_SDIS: /* Secure DODAG Information Solicitation (128) */
3790
264
        {
3791
            /* Flags */
3792
264
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dis_flag, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3793
264
            rpl_offset += 1;
3794
3795
            /* Reserved */
3796
264
            proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, rpl_offset, 1, ENC_NA);
3797
264
            rpl_offset += 1;
3798
3799
            /* RPL Options */
3800
264
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
3801
264
            break;
3802
258
        }
3803
15
        case ICMP6_RPL_DIO: /* DODAG Information Object (1) */
3804
15
        case ICMP6_RPL_SDIO: /* Secure DODAG Information Object (129) */
3805
15
        {
3806
15
            static int * const rpl_dio_flags[] = {
3807
15
                &hf_icmpv6_rpl_dio_flag_g,
3808
15
                &hf_icmpv6_rpl_dio_flag_0,
3809
15
                &hf_icmpv6_rpl_dio_flag_mop,
3810
15
                &hf_icmpv6_rpl_dio_flag_prf,
3811
15
                NULL
3812
15
            };
3813
3814
            /* RPLInstanceID */
3815
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dio_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3816
15
            rpl_offset += 1;
3817
3818
            /* Version Number */
3819
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dio_version, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3820
15
            rpl_offset += 1;
3821
3822
            /* Rank */
3823
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dio_rank, tvb, rpl_offset, 2, ENC_BIG_ENDIAN);
3824
15
            rpl_offset += 2;
3825
3826
            /* Flags */
3827
15
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_dio_flag,
3828
15
                                ett_icmpv6_flag_rpl_dio, rpl_dio_flags, ENC_BIG_ENDIAN);
3829
15
            rpl_offset += 1;
3830
3831
            /* Destination Advertisement Trigger Sequence Number (DTSN) */
3832
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dio_dtsn, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3833
15
            rpl_offset += 1;
3834
3835
            /* Flags */
3836
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dio_flag, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3837
15
            rpl_offset += 1;
3838
3839
            /* Reserved */
3840
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, rpl_offset, 1, ENC_NA);
3841
15
            rpl_offset += 1;
3842
3843
            /* DODAGID */
3844
15
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dio_dagid, tvb, rpl_offset, 16, ENC_NA);
3845
15
            rpl_offset += 16;
3846
3847
            /* RPL Options */
3848
15
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
3849
15
            break;
3850
15
        }
3851
6
        case ICMP6_RPL_DAO: /* Destination Advertisement Object (2) */
3852
8
        case ICMP6_RPL_SDAO: /* Secure Destination Advertisement Object (130) */
3853
8
        {
3854
8
            uint8_t flags;
3855
8
            static int * const rpl_dao_flags[] = {
3856
8
                &hf_icmpv6_rpl_dao_flag_k,
3857
8
                &hf_icmpv6_rpl_dao_flag_d,
3858
8
                &hf_icmpv6_rpl_dao_flag_rsv,
3859
8
                NULL
3860
8
            };
3861
3862
            /* DAO Instance */
3863
8
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dao_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3864
8
            rpl_offset += 1;
3865
3866
            /* Flags */
3867
8
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_dao_flag,
3868
8
                                ett_icmpv6_flag_rpl_dao, rpl_dao_flags, ENC_BIG_ENDIAN);
3869
8
            flags = tvb_get_uint8(tvb, rpl_offset);
3870
8
            rpl_offset += 1;
3871
3872
            /* Reserved */
3873
8
            proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, rpl_offset, 1, ENC_NA);
3874
8
            rpl_offset += 1;
3875
3876
            /* Sequence */
3877
8
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dao_sequence, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3878
8
            rpl_offset += 1;
3879
3880
            /* DODAGID */
3881
8
            if(flags & RPL_DAO_FLAG_D)
3882
4
            {
3883
4
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dao_dodagid, tvb, rpl_offset, 16, ENC_NA);
3884
4
                rpl_offset += 16;
3885
4
            }
3886
            /* Options */
3887
8
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
3888
8
            break;
3889
6
        }
3890
8
        case ICMP6_RPL_DAOACK: /* Destination Advertisement Object Acknowledgment (3) */
3891
8
        case ICMP6_RPL_SDAOACK: /* Secure Destination Advertisement Object Acknowledgment (131) */
3892
8
        {
3893
8
            uint8_t flags;
3894
8
            static int * const rpl_daoack_flags[] = {
3895
8
                &hf_icmpv6_rpl_daoack_flag_d,
3896
8
                &hf_icmpv6_rpl_daoack_flag_rsv,
3897
8
                NULL
3898
8
            };
3899
3900
            /* DAO Instance */
3901
8
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_daoack_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3902
8
            rpl_offset += 1;
3903
3904
            /* Flags */
3905
8
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_daoack_flag,
3906
8
                                ett_icmpv6_flag_rpl_daoack, rpl_daoack_flags, ENC_BIG_ENDIAN);
3907
8
            flags = tvb_get_uint8(tvb, rpl_offset);
3908
8
            rpl_offset += 1;
3909
3910
            /* DAO Sequence */
3911
8
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_daoack_sequence, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3912
8
            rpl_offset += 1;
3913
3914
            /* Status */
3915
8
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_daoack_status, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3916
8
            rpl_offset += 1;
3917
3918
            /* DODAGID */
3919
8
            if(flags & RPL_DAOACK_FLAG_D)
3920
1
            {
3921
1
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_daoack_dodagid, tvb, rpl_offset, 16, ENC_NA);
3922
1
                rpl_offset += 16;
3923
1
            }
3924
3925
            /* Options */
3926
8
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
3927
8
            break;
3928
8
        }
3929
2
        case ICMP6_RPL_DCO: /* Destination Cleanup Object (7) */
3930
3931
2
        {
3932
2
            uint8_t flags;
3933
2
            static int * const rpl_dco_flags[] = {
3934
2
                &hf_icmpv6_rpl_dco_flag_k,
3935
2
                &hf_icmpv6_rpl_dco_flag_d,
3936
2
                &hf_icmpv6_rpl_dco_flag_rsv,
3937
2
                NULL
3938
2
            };
3939
3940
            /* DCO Instance */
3941
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dco_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3942
2
            rpl_offset += 1;
3943
3944
            /* Flags */
3945
2
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_dco_flags,
3946
2
                                ett_icmpv6_flag_rpl_dco, rpl_dco_flags, ENC_BIG_ENDIAN);
3947
2
            flags = tvb_get_uint8(tvb, rpl_offset);
3948
2
            rpl_offset += 1;
3949
3950
            /* RPL status */
3951
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dco_status, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3952
2
            rpl_offset += 1;
3953
3954
            /* Sequence */
3955
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dco_sequence, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3956
2
            rpl_offset += 1;
3957
3958
            /* DODAGID */
3959
2
            if(flags & RPL_DCO_FLAG_D)
3960
0
            {
3961
0
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dco_dodagid, tvb, rpl_offset, 16, ENC_NA);
3962
0
                rpl_offset += 16;
3963
0
            }
3964
            /* Options */
3965
2
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
3966
2
            break;
3967
8
        }
3968
3
        case ICMP6_RPL_DCOACK: /* Destination Advertisement Object Acknowledgment (8) */
3969
3970
3
        {
3971
3
            uint8_t flags;
3972
3
            static int * const rpl_dcoack_flags[] = {
3973
3
                &hf_icmpv6_rpl_dcoack_flag_d,
3974
3
                &hf_icmpv6_rpl_dcoack_flag_rsv,
3975
3
                NULL
3976
3
            };
3977
3978
            /* DCO Instance */
3979
3
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dcoack_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3980
3
            rpl_offset += 1;
3981
3982
            /* Flags */
3983
3
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_dcoack_flag,
3984
3
                                ett_icmpv6_flag_rpl_dcoack, rpl_dcoack_flags, ENC_BIG_ENDIAN);
3985
3
            flags = tvb_get_uint8(tvb, rpl_offset);
3986
3
            rpl_offset += 1;
3987
3988
            /* DCO Sequence */
3989
3
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dcoack_sequence, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3990
3
            rpl_offset += 1;
3991
3992
            /* Status */
3993
3
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dcoack_status, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
3994
3
            rpl_offset += 1;
3995
3996
            /* DODAGID */
3997
3
            if(flags & RPL_DCOACK_FLAG_D)
3998
0
            {
3999
0
                proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_dcoack_dodagid, tvb, rpl_offset, 16, ENC_NA);
4000
0
                rpl_offset += 16;
4001
0
            }
4002
4003
            /* Options */
4004
3
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
4005
3
            break;
4006
8
        }
4007
2
       case ICMP6_RPL_CC:
4008
2
       {
4009
2
            static int * const rpl_cc_flags[] = {
4010
2
                &hf_icmpv6_rpl_cc_flag_r,
4011
2
                &hf_icmpv6_rpl_cc_flag_rsv,
4012
2
                NULL
4013
2
            };
4014
4015
            /* CC Instance */
4016
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_cc_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
4017
2
            rpl_offset += 1;
4018
4019
            /* Flags */
4020
2
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_cc_flag,
4021
2
                                ett_icmpv6_flag_rpl_cc, rpl_cc_flags, ENC_BIG_ENDIAN);
4022
2
            rpl_offset += 1;
4023
4024
            /* CC Nonce */
4025
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_cc_nonce, tvb, rpl_offset, 2, ENC_BIG_ENDIAN);
4026
2
            rpl_offset += 2;
4027
4028
            /* DODAGID */
4029
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_cc_dodagid, tvb, rpl_offset, 16, ENC_NA);
4030
2
            rpl_offset += 16;
4031
4032
            /* Destination Counter */
4033
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_cc_destination_counter, tvb, rpl_offset, 4, ENC_BIG_ENDIAN);
4034
2
            rpl_offset += 4;
4035
4036
            /* Options */
4037
2
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
4038
2
            break;
4039
8
       }
4040
42
        case ICMP6_RPL_P2P_DRO: /* P2P Discovery Reply Object (0x4) */
4041
44
        case ICMP6_RPL_P2P_SDRO: /* Secure P2P Discovery Reply Object (0x84) */
4042
44
        {
4043
44
            static int * const rpl_p2p_dro_flags[] = {
4044
44
                &hf_icmpv6_rpl_p2p_dro_flag_stop,
4045
44
                &hf_icmpv6_rpl_p2p_dro_flag_ack,
4046
44
                &hf_icmpv6_rpl_p2p_dro_flag_seq,
4047
44
                &hf_icmpv6_rpl_p2p_dro_flag_reserved,
4048
44
                NULL
4049
44
            };
4050
4051
            /* RPLInstanceID */
4052
44
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_p2p_dro_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
4053
44
            rpl_offset += 1;
4054
4055
            /* Version Number */
4056
44
            ti = proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_p2p_dro_version, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
4057
44
            if (tvb_get_uint8(tvb, rpl_offset)) {
4058
37
                expert_add_info(pinfo, ti, &ei_icmpv6_rpl_p2p_dro_zero);
4059
37
            }
4060
44
            rpl_offset += 1;
4061
4062
            /* Flags */
4063
44
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_p2p_dro_flag,
4064
44
                                ett_icmpv6_rpl_p2p_dro_flag, rpl_p2p_dro_flags, ENC_BIG_ENDIAN);
4065
44
            rpl_offset += 2;
4066
4067
            /* DODAGID */
4068
44
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_p2p_dro_dagid, tvb, rpl_offset, 16, ENC_NA);
4069
44
            rpl_offset += 16;
4070
4071
            /* RPL Options */
4072
44
            rpl_offset = dissect_icmpv6_rpl_opt(tvb, rpl_offset, pinfo, icmp6_tree, icmp6_code);
4073
44
            break;
4074
42
        }
4075
2
        case ICMP6_RPL_P2P_DROACK:  /* P2P Discovery Reply Object Acknowledgement (0x5) */
4076
2
        case ICMP6_RPL_P2P_SDROACK: /* Secure P2P Discovery Reply Object Acknowledgement (0x85) */
4077
2
        {
4078
2
            static int * const rpl_p2p_droack_flags[] = {
4079
2
                &hf_icmpv6_rpl_p2p_droack_flag_seq,
4080
2
                &hf_icmpv6_rpl_p2p_droack_flag_reserved,
4081
2
                NULL
4082
2
            };
4083
4084
            /* RPLInstanceID */
4085
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_p2p_dro_instance, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
4086
2
            rpl_offset += 1;
4087
4088
            /* Version Number */
4089
2
            ti = proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_p2p_dro_version, tvb, rpl_offset, 1, ENC_BIG_ENDIAN);
4090
2
            if (tvb_get_uint8(tvb, rpl_offset)) {
4091
2
                expert_add_info(pinfo, ti, &ei_icmpv6_rpl_p2p_dro_zero);
4092
2
            }
4093
2
            rpl_offset += 1;
4094
4095
            /* Flags */
4096
2
            proto_tree_add_bitmask(icmp6_tree, tvb, rpl_offset, hf_icmpv6_rpl_p2p_droack_flag,
4097
2
                                ett_icmpv6_rpl_p2p_droack_flag, rpl_p2p_droack_flags, ENC_BIG_ENDIAN);
4098
2
            rpl_offset += 2;
4099
4100
            /* DODAGID */
4101
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_rpl_p2p_dro_dagid, tvb, rpl_offset, 16, ENC_NA);
4102
2
            rpl_offset += 16;
4103
2
            break;
4104
2
        }
4105
4106
357
    }
4107
31
    return rpl_offset;
4108
357
}
4109
/* RFC 4620 - IPv6 Node Information Queries */
4110
4111
static int
4112
dissect_nodeinfo(tvbuff_t *tvb, int ni_offset, packet_info *pinfo _U_, proto_tree *tree, uint8_t icmp6_type, uint8_t icmp6_code)
4113
19
{
4114
19
    uint16_t    qtype;
4115
19
    unsigned    used_bytes;
4116
19
    static int * const ni_flags[] = {
4117
19
        &hf_icmpv6_ni_flag_g,
4118
19
        &hf_icmpv6_ni_flag_s,
4119
19
        &hf_icmpv6_ni_flag_l,
4120
19
        &hf_icmpv6_ni_flag_c,
4121
19
        &hf_icmpv6_ni_flag_a,
4122
19
        &hf_icmpv6_ni_flag_t,
4123
19
        &hf_icmpv6_ni_flag_rsv,
4124
19
        NULL
4125
19
    };
4126
4127
    /* Qtype */
4128
19
    proto_tree_add_item_ret_uint16(tree, hf_icmpv6_ni_qtype, tvb, ni_offset, 2, ENC_BIG_ENDIAN, &qtype);
4129
19
    ni_offset += 2;
4130
4131
    /* Flags */
4132
19
    proto_tree_add_bitmask(tree, tvb, ni_offset, hf_icmpv6_ni_flag,
4133
19
                        ett_icmpv6_flag_ni, ni_flags, ENC_BIG_ENDIAN);
4134
19
    ni_offset += 2;
4135
4136
    /* Nonce */
4137
19
    proto_tree_add_item(tree, hf_icmpv6_ni_nonce, tvb, ni_offset, 8, ENC_BIG_ENDIAN);
4138
19
    ni_offset += 8;
4139
4140
    /* Data ? */
4141
19
    if(tvb_reported_length_remaining(tvb, ni_offset) == 0){
4142
1
        return ni_offset;
4143
1
    }
4144
4145
18
    if(icmp6_type == ICMP6_NI_QUERY){
4146
6
        switch(icmp6_code){
4147
2
            case ICMP6_NI_SUBJ_IPV6: {
4148
2
                proto_tree_add_item(tree, hf_icmpv6_ni_query_subject_ipv6, tvb, ni_offset, 16, ENC_NA);
4149
2
                ni_offset += 16;
4150
2
                break;
4151
0
            }
4152
1
            case ICMP6_NI_SUBJ_FQDN: {
4153
1
                int fqdn_len;
4154
1
                const char *fqdn_name;
4155
1
                used_bytes = get_dns_name(pinfo->pool, tvb, ni_offset, 0, ni_offset, &fqdn_name, &fqdn_len);
4156
1
                proto_tree_add_string(tree, hf_icmpv6_ni_query_subject_fqdn, tvb, ni_offset, used_bytes,
4157
1
                    format_text(pinfo->pool, fqdn_name, fqdn_len));
4158
1
                ni_offset += used_bytes;
4159
1
                break;
4160
0
            }
4161
1
            case ICMP6_NI_SUBJ_IPV4: {
4162
1
                proto_tree_add_item(tree, hf_icmpv6_ni_query_subject_ipv4, tvb, ni_offset, 4, ENC_BIG_ENDIAN);
4163
1
                ni_offset += 4;
4164
1
                break;
4165
0
            }
4166
6
        }
4167
12
    } else { /* It is ICMP6_NI_REPLY */
4168
12
        switch(qtype){
4169
0
            case NI_QTYPE_NOOP:
4170
0
                break;
4171
0
            case NI_QTYPE_NODENAME: {
4172
0
                int node_name_len;
4173
0
                const char *node_name;
4174
                /* TTL */
4175
0
                proto_tree_add_item(tree, hf_icmpv6_ni_reply_node_ttl, tvb, ni_offset, 4, ENC_BIG_ENDIAN);
4176
0
                ni_offset += 4;
4177
                /* Data ? */
4178
0
                if(tvb_reported_length_remaining(tvb, ni_offset) == 0){
4179
0
                    return ni_offset;
4180
0
                }
4181
0
                while(ni_offset < (int)tvb_reported_length(tvb) ) {
4182
4183
0
                    if(tvb_get_uint8(tvb, ni_offset) == 0){ /* if Zero there is padding, skip the loop */
4184
0
                        break;
4185
0
                    }
4186
                    /* Node Name */
4187
0
                    used_bytes = get_dns_name(pinfo->pool, tvb, ni_offset, 0, ni_offset, &node_name, &node_name_len);
4188
0
                    proto_tree_add_string(tree, hf_icmpv6_ni_reply_node_name, tvb, ni_offset, used_bytes,
4189
0
                        format_text(pinfo->pool, node_name, node_name_len));
4190
0
                    ni_offset += used_bytes;
4191
0
                }
4192
0
                break;
4193
0
            }
4194
2
            case NI_QTYPE_NODEADDR: {
4195
6
                while(ni_offset < (int)tvb_reported_length(tvb) ) {
4196
                    /* TTL */
4197
4
                    proto_tree_add_item(tree, hf_icmpv6_ni_reply_node_ttl, tvb, ni_offset, 4, ENC_BIG_ENDIAN);
4198
4
                    ni_offset += 4;
4199
                    /* Node Addresses */
4200
4
                    proto_tree_add_item(tree, hf_icmpv6_ni_reply_node_address, tvb, ni_offset, 16, ENC_NA);
4201
4
                    ni_offset += 16;
4202
4
                }
4203
2
                break;
4204
0
            }
4205
6
            case NI_QTYPE_IPV4ADDR: {
4206
85
                while(ni_offset < (int)tvb_reported_length(tvb) ) {
4207
                    /* TTL */
4208
79
                    proto_tree_add_item(tree, hf_icmpv6_ni_reply_node_ttl, tvb, ni_offset, 4, ENC_BIG_ENDIAN);
4209
79
                    ni_offset += 4;
4210
                    /* IPv4 Address */
4211
79
                    proto_tree_add_item(tree, hf_icmpv6_ni_reply_ipv4_address, tvb, ni_offset, 4, ENC_BIG_ENDIAN);
4212
79
                    ni_offset += 4;
4213
79
                }
4214
6
                break;
4215
0
            }
4216
12
        }
4217
12
    }
4218
11
    return ni_offset;
4219
18
}
4220
/* RFC 2894 - Router Renumbering for IPv6 */
4221
4222
static int
4223
dissect_rrenum(tvbuff_t *tvb, int rr_offset, packet_info *pinfo, proto_tree *tree, uint8_t icmp6_type _U_, uint8_t icmp6_code)
4224
85
{
4225
85
    proto_tree *mp_tree, *up_tree, *rm_tree;
4226
85
    proto_item *ti,        *ti_mp,   *ti_up,   *ti_rm;
4227
85
    static int * const rr_flags[] = {
4228
85
        &hf_icmpv6_rr_flag_t,
4229
85
        &hf_icmpv6_rr_flag_r,
4230
85
        &hf_icmpv6_rr_flag_a,
4231
85
        &hf_icmpv6_rr_flag_s,
4232
85
        &hf_icmpv6_rr_flag_p,
4233
85
        &hf_icmpv6_rr_flag_rsv,
4234
85
        NULL
4235
85
    };
4236
4237
    /* Sequence Number */
4238
85
    proto_tree_add_item(tree, hf_icmpv6_rr_sequencenumber, tvb, rr_offset, 4, ENC_BIG_ENDIAN);
4239
85
    rr_offset += 4;
4240
4241
    /* Segment Number */
4242
85
    proto_tree_add_item(tree, hf_icmpv6_rr_segmentnumber, tvb, rr_offset, 1, ENC_BIG_ENDIAN);
4243
85
    rr_offset += 1;
4244
4245
    /* Flags */
4246
85
    proto_tree_add_bitmask(tree, tvb, rr_offset, hf_icmpv6_rr_flag,
4247
85
                        ett_icmpv6_flag_rr, rr_flags, ENC_BIG_ENDIAN);
4248
85
    rr_offset += 1;
4249
4250
    /* Max Delay */
4251
85
    proto_tree_add_item(tree, hf_icmpv6_rr_maxdelay, tvb, rr_offset, 2, ENC_BIG_ENDIAN);
4252
85
    rr_offset += 2;
4253
4254
    /* Reserved */
4255
85
    proto_tree_add_item(tree, hf_icmpv6_reserved, tvb, rr_offset, 4, ENC_NA);
4256
85
    rr_offset += 4;
4257
4258
    /* Data ? */
4259
85
    if(tvb_reported_length_remaining(tvb, rr_offset) == 0){
4260
2
        return rr_offset;
4261
2
    }
4262
4263
83
    if(icmp6_code == ICMP6_ROUTER_RENUMBERING_COMMAND){
4264
        /* Match-Prefix Part */
4265
60
        uint8_t opcode, matchlen, minlen, maxlen;
4266
4267
60
        ti_mp = proto_tree_add_item(tree, hf_icmpv6_rr_pco_mp_part, tvb, rr_offset, 24, ENC_NA);
4268
60
        mp_tree = proto_item_add_subtree(ti_mp, ett_icmpv6_rr_mp);
4269
4270
        /* OpCode */
4271
60
        proto_tree_add_item_ret_uint8(mp_tree, hf_icmpv6_rr_pco_mp_opcode, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &opcode);
4272
60
        rr_offset += 1;
4273
4274
        /* OpLength */
4275
60
        proto_tree_add_item(mp_tree, hf_icmpv6_rr_pco_mp_oplength, tvb, rr_offset, 1, ENC_BIG_ENDIAN);
4276
60
        rr_offset += 1;
4277
4278
        /* Ordinal */
4279
60
        proto_tree_add_item(mp_tree, hf_icmpv6_rr_pco_mp_ordinal, tvb, rr_offset, 1, ENC_BIG_ENDIAN);
4280
60
        rr_offset += 1;
4281
4282
        /* MatchLen  */
4283
60
        ti = proto_tree_add_item_ret_uint8(mp_tree, hf_icmpv6_rr_pco_mp_matchlen, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &matchlen);
4284
60
        if (matchlen > 128) {
4285
25
            expert_add_info(pinfo, ti, &ei_icmpv6_rr_pco_mp_matchlen);
4286
25
        }
4287
60
        rr_offset += 1;
4288
4289
        /* MinLen  */
4290
60
        proto_tree_add_item_ret_uint8(mp_tree, hf_icmpv6_rr_pco_mp_minlen, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &minlen);
4291
60
        rr_offset += 1;
4292
4293
        /* MaxLen  */
4294
60
        proto_tree_add_item_ret_uint8(mp_tree, hf_icmpv6_rr_pco_mp_maxlen, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &maxlen);
4295
60
        rr_offset += 1;
4296
4297
        /* Reserved  */
4298
60
        proto_tree_add_item(mp_tree, hf_icmpv6_reserved, tvb, rr_offset, 2, ENC_NA);
4299
60
        rr_offset += 2;
4300
4301
        /* Match Prefix  */
4302
60
        proto_tree_add_item(mp_tree, hf_icmpv6_rr_pco_mp_matchprefix, tvb, rr_offset, 16, ENC_NA);
4303
4304
        /* Add Info (Prefix, Length...) to Match Prefix Part label */
4305
60
        proto_item_append_text(ti_mp, ": %s %s/%u (%u-%u)", val_to_str(pinfo->pool, opcode, rr_pco_mp_opcode_val, "Unknown %d"), tvb_ip6_to_str(pinfo->pool, tvb, rr_offset), matchlen, minlen, maxlen);
4306
60
        rr_offset += 16;
4307
4308
536
        while ((int)tvb_reported_length(tvb) > rr_offset) {
4309
            /* Use-Prefix Part */
4310
476
            uint8_t uselen, keeplen;
4311
476
            uint32_t lifetime;
4312
476
            static int * const mask_flags[] = {
4313
476
                &hf_icmpv6_rr_pco_up_flagmask_l,
4314
476
                &hf_icmpv6_rr_pco_up_flagmask_a,
4315
476
                &hf_icmpv6_rr_pco_up_flagmask_reserved,
4316
476
                NULL
4317
476
            };
4318
476
            static int * const ra_flags[] = {
4319
476
                &hf_icmpv6_rr_pco_up_raflags_l,
4320
476
                &hf_icmpv6_rr_pco_up_raflags_a,
4321
476
                &hf_icmpv6_rr_pco_up_raflags_reserved,
4322
476
                NULL
4323
476
            };
4324
476
            static int * const up_flags[] = {
4325
476
                &hf_icmpv6_rr_pco_up_flag_v,
4326
476
                &hf_icmpv6_rr_pco_up_flag_p,
4327
476
                &hf_icmpv6_rr_pco_up_flag_reserved,
4328
476
                NULL
4329
476
            };
4330
4331
476
            ti_up = proto_tree_add_item(tree, hf_icmpv6_rr_pco_up_part, tvb, rr_offset, 32, ENC_NA);
4332
476
            up_tree = proto_item_add_subtree(ti_up, ett_icmpv6_rr_up);
4333
4334
            /* UseLen */
4335
476
            proto_tree_add_item_ret_uint8(up_tree, hf_icmpv6_rr_pco_up_uselen, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &uselen);
4336
476
            rr_offset += 1;
4337
4338
            /* KeepLen */
4339
476
            proto_tree_add_item_ret_uint8(up_tree, hf_icmpv6_rr_pco_up_keeplen, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &keeplen);
4340
476
            rr_offset += 1;
4341
4342
            /* FlagMask */
4343
476
            proto_tree_add_bitmask(up_tree, tvb, rr_offset, hf_icmpv6_rr_pco_up_flagmask, ett_icmpv6_rr_up_flag_mask, mask_flags, ENC_BIG_ENDIAN);
4344
476
            rr_offset += 1;
4345
4346
            /* RaFlags */
4347
476
            proto_tree_add_bitmask(up_tree, tvb, rr_offset, hf_icmpv6_rr_pco_up_raflags, ett_icmpv6_rr_up_flag_ra, ra_flags, ENC_BIG_ENDIAN);
4348
476
            rr_offset += 1;
4349
4350
            /* Valid Lifetime */
4351
476
            ti = proto_tree_add_item_ret_uint(up_tree, hf_icmpv6_rr_pco_up_validlifetime, tvb, rr_offset, 4, ENC_BIG_ENDIAN, &lifetime);
4352
476
            if (lifetime != LIFETIME_INFINITY) {
4353
377
              proto_item_append_text(ti, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
4354
377
            }
4355
476
            rr_offset += 4;
4356
4357
            /* Preferred Lifetime */
4358
476
            ti = proto_tree_add_item_ret_uint(up_tree, hf_icmpv6_rr_pco_up_preferredlifetime, tvb, rr_offset, 4, ENC_BIG_ENDIAN, &lifetime);
4359
476
            if (lifetime != LIFETIME_INFINITY) {
4360
375
              proto_item_append_text(ti, " (%s)", unsigned_time_secs_to_str(pinfo->pool, lifetime));
4361
375
            }
4362
476
            rr_offset += 4;
4363
4364
            /* Flags */
4365
476
            proto_tree_add_bitmask(up_tree, tvb, rr_offset, hf_icmpv6_rr_pco_up_flag, ett_icmpv6_rr_up_flag, up_flags, ENC_BIG_ENDIAN);
4366
476
            rr_offset += 4;
4367
4368
            /* UsePrefix */
4369
476
            proto_tree_add_item(up_tree, hf_icmpv6_rr_pco_up_useprefix, tvb, rr_offset, 16, ENC_NA);
4370
4371
            /* Add Info (Prefix, Length...) to Use Prefix Part label */
4372
476
            proto_item_append_text(ti_up, ": %s/%u (keep %u)", tvb_ip6_to_str(pinfo->pool, tvb, rr_offset), uselen, keeplen);
4373
476
            rr_offset += 16;
4374
476
        }
4375
4376
60
    }else if(icmp6_code == ICMP6_ROUTER_RENUMBERING_RESULT){
4377
229
        while ((int)tvb_reported_length(tvb) > rr_offset) {
4378
208
        uint8_t matchlen;
4379
208
        uint32_t interfaceindex;
4380
208
        static int * const rm_flags[] = {
4381
208
            &hf_icmpv6_rr_rm_flag_reserved,
4382
208
            &hf_icmpv6_rr_rm_flag_b,
4383
208
            &hf_icmpv6_rr_rm_flag_f,
4384
208
            NULL
4385
208
        };
4386
        /* Result Message */
4387
4388
208
        ti_rm = proto_tree_add_item(tree, hf_icmpv6_rr_rm, tvb, rr_offset, 24, ENC_NA);
4389
208
        rm_tree = proto_item_add_subtree(ti_rm, ett_icmpv6_rr_rm);
4390
4391
        /* Flags */
4392
208
        proto_tree_add_bitmask(rm_tree, tvb, rr_offset, hf_icmpv6_rr_rm_flag, ett_icmpv6_rr_rm_flag, rm_flags, ENC_BIG_ENDIAN);
4393
208
        rr_offset +=2;
4394
4395
        /* Ordinal */
4396
208
        proto_tree_add_item(rm_tree, hf_icmpv6_rr_rm_ordinal, tvb, rr_offset, 1, ENC_BIG_ENDIAN);
4397
208
        rr_offset +=1;
4398
4399
        /* MatchLen */
4400
208
        ti = proto_tree_add_item_ret_uint8(rm_tree, hf_icmpv6_rr_rm_matchedlen, tvb, rr_offset, 1, ENC_BIG_ENDIAN, &matchlen);
4401
208
        if (matchlen > 128) {
4402
89
            expert_add_info(pinfo, ti, &ei_icmpv6_rr_pco_mp_matchedlen);
4403
89
        }
4404
208
        rr_offset +=1;
4405
4406
        /* InterfaceIndex */
4407
208
        proto_tree_add_item_ret_uint(rm_tree, hf_icmpv6_rr_rm_interfaceindex, tvb, rr_offset, 4, ENC_BIG_ENDIAN, &interfaceindex);
4408
208
        rr_offset +=4;
4409
4410
        /* MatchedPrefix */
4411
208
        proto_tree_add_item(rm_tree, hf_icmpv6_rr_rm_matchedprefix, tvb, rr_offset, 16, ENC_NA);
4412
4413
        /* Add Info (Prefix, Length...) to Use Resultant Message label */
4414
208
        proto_item_append_text(ti_rm, ": %s/%u (interface %u)", tvb_ip6_to_str(pinfo->pool, tvb, rr_offset), matchlen, interfaceindex);
4415
208
        rr_offset +=16;
4416
208
        }
4417
21
    }
4418
83
    return rr_offset;
4419
85
}
4420
4421
4422
static int
4423
dissect_mldrv2( tvbuff_t *tvb, uint32_t offset, packet_info *pinfo _U_, proto_tree *tree )
4424
31
{
4425
31
    proto_tree *mar_tree;
4426
31
    proto_item *ti_mar;
4427
31
    int         mldr_offset = offset;
4428
4429
    /* Reserved */
4430
31
    proto_tree_add_item(tree, hf_icmpv6_reserved, tvb, mldr_offset, 2, ENC_NA );
4431
31
    mldr_offset += 2;
4432
4433
    /* Nr of Mcast Address Records (M) */
4434
31
    proto_tree_add_item(tree, hf_icmpv6_mldr_nb_mcast_records, tvb, mldr_offset, 2, ENC_BIG_ENDIAN );
4435
31
    mldr_offset += 2;
4436
4437
    /* Multicast Address Record */
4438
133
    while(mldr_offset < (int)tvb_reported_length(tvb) ) {
4439
102
        uint8_t aux_data_len, record_type;
4440
102
        uint16_t i, nb_sources;
4441
4442
102
        ti_mar = proto_tree_add_item(tree, hf_icmpv6_mldr_mar, tvb, mldr_offset, -1, ENC_NA);
4443
102
        mar_tree = proto_item_add_subtree(ti_mar, ett_icmpv6_mar);
4444
4445
        /* Record Type */
4446
102
        proto_tree_add_item_ret_uint8(mar_tree, hf_icmpv6_mldr_mar_record_type, tvb, mldr_offset, 1, ENC_BIG_ENDIAN, &record_type);
4447
102
        mldr_offset += 1;
4448
4449
        /* Aux Data Len */
4450
102
        proto_tree_add_item_ret_uint8(mar_tree, hf_icmpv6_mldr_mar_aux_data_len, tvb, mldr_offset, 1, ENC_BIG_ENDIAN, &aux_data_len);
4451
102
        mldr_offset += 1;
4452
4453
        /* Number of Sources (N) */
4454
102
        proto_tree_add_item_ret_uint16(mar_tree, hf_icmpv6_mldr_mar_nb_sources, tvb, mldr_offset, 2, ENC_BIG_ENDIAN, &nb_sources);
4455
102
        mldr_offset += 2;
4456
4457
        /* Multicast Address */
4458
102
        proto_tree_add_item(mar_tree, hf_icmpv6_mldr_mar_multicast_address, tvb, mldr_offset, 16, ENC_NA);
4459
102
        proto_item_append_text(ti_mar, " %s: %s", val_to_str(pinfo->pool, record_type, mldr_record_type_val,"Unknown Record Type (%d)"), tvb_ip6_to_str(pinfo->pool, tvb, mldr_offset));
4460
102
        mldr_offset += 16;
4461
4462
        /* Source Address */
4463
319
        for (i=0; i < nb_sources; i++){
4464
217
            proto_tree_add_item(mar_tree, hf_icmpv6_mldr_mar_source_address, tvb, mldr_offset, 16, ENC_NA);
4465
217
            mldr_offset += 16;
4466
217
        }
4467
4468
        /* Auxiliary Data ? */
4469
102
        if(aux_data_len)
4470
11
        {
4471
11
            proto_tree_add_item(mar_tree, hf_icmpv6_mldr_mar_auxiliary_data, tvb, mldr_offset, aux_data_len * 4, ENC_NA);
4472
11
            mldr_offset += aux_data_len * 4;
4473
11
        }
4474
4475
        /* Multicast Address Record Length */
4476
102
        proto_item_set_len(ti_mar, 4 + 16 + (16 * nb_sources) + (aux_data_len * 4));
4477
4478
102
    }
4479
31
    return mldr_offset;
4480
31
}
4481
4482
static int
4483
dissect_mpl_control(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, uint8_t type _U_, uint8_t code)
4484
99
{
4485
99
    proto_tree *seed_info_tree, *bm_tree;
4486
99
    proto_item *ti;
4487
99
    const int length_of_fixed_part = 2;
4488
99
    int body_offset = offset;
4489
99
    uint8_t min_seqno, bm_len, s;
4490
99
    int remaining, id_len = 0;
4491
99
    uint16_t seed_info_index = 0;
4492
99
    char *seed_id = NULL;
4493
99
    int i, j;
4494
99
    uint8_t b;
4495
4496
99
    if (code != 0) {
4497
        /* code must be 0 */
4498
2
        ti = proto_tree_add_item(tree, hf_icmpv6_unknown_data, tvb, body_offset, 1, ENC_NA);
4499
2
        expert_add_info_format(pinfo, ti, &ei_icmpv6_unknown_data, "Code must be 0");
4500
2
        return body_offset;
4501
2
    }
4502
4503
97
    remaining = tvb_captured_length_remaining(tvb, body_offset);
4504
1.70k
    while (remaining >= length_of_fixed_part) {
4505
1.68k
        seed_info_index++;
4506
4507
1.68k
        seed_info_tree = proto_tree_add_subtree_format(tree, tvb, body_offset, length_of_fixed_part, ett_icmpv6_mpl_seed_info, NULL,
4508
1.68k
                                                       "MPL Seed Info: [%u]", seed_info_index);
4509
4510
1.68k
        min_seqno = tvb_get_uint8(tvb, body_offset);
4511
1.68k
        proto_tree_add_item(seed_info_tree, hf_icmpv6_mpl_seed_info_min_sequence, tvb, body_offset, 1, ENC_BIG_ENDIAN);
4512
1.68k
        body_offset++;
4513
4514
1.68k
        bm_len = tvb_get_uint8(tvb, body_offset) >> 2;
4515
1.68k
        s = tvb_get_uint8(tvb, body_offset) & 0x03;
4516
1.68k
        proto_tree_add_item(seed_info_tree, hf_icmpv6_mpl_seed_info_bm_len, tvb, body_offset, 1, ENC_BIG_ENDIAN);
4517
1.68k
        proto_tree_add_item(seed_info_tree, hf_icmpv6_mpl_seed_info_s, tvb, body_offset, 1, ENC_BIG_ENDIAN);
4518
1.68k
        body_offset++;
4519
4520
1.68k
        id_len = mpl_seed_id_code_to_length[s];
4521
1.68k
        if ((remaining - length_of_fixed_part) < id_len) {
4522
            /* Invalid length; remaining data is too short for Seed ID */
4523
21
            ti = proto_tree_add_item(seed_info_tree, hf_icmpv6_unknown_data, tvb, body_offset,
4524
21
                                     remaining - length_of_fixed_part, ENC_NA);
4525
21
            expert_add_info_format(pinfo, ti, &ei_icmpv6_unknown_data,
4526
21
                                   "Remaining data, %u bytes, is too short for Seed ID of %u bytes",
4527
21
                                   remaining - length_of_fixed_part, id_len);
4528
21
            return remaining - length_of_fixed_part;
4529
21
        }
4530
1.65k
        switch (s) {
4531
1.12k
            case 0:
4532
1.12k
                seed_id = address_to_str(pinfo->pool, &pinfo->src);
4533
1.12k
                break;
4534
230
            case 1:
4535
230
                seed_id = wmem_strdup_printf(pinfo->pool, "%04x", tvb_get_ntohs(tvb, body_offset));
4536
230
                break;
4537
163
            case 2:
4538
163
                seed_id = tvb_eui64_to_str(pinfo->pool, tvb, body_offset);
4539
163
                break;
4540
142
            case 3:
4541
142
                seed_id = tvb_ip6_to_str(pinfo->pool, tvb, body_offset);
4542
142
                break;
4543
0
            default:
4544
                /* not reached */
4545
0
                break;
4546
1.65k
        }
4547
1.65k
        proto_tree_add_string(seed_info_tree, hf_icmpv6_mpl_seed_info_seed_id, tvb, body_offset, id_len, seed_id);
4548
1.65k
        body_offset += id_len;
4549
4550
1.65k
        if((remaining - length_of_fixed_part - id_len) < bm_len) {
4551
            /* Invalid length; remaining data is too short for Buffered Messages */
4552
55
            ti = proto_tree_add_item(seed_info_tree, hf_icmpv6_unknown_data, tvb, body_offset,
4553
55
                                     remaining - length_of_fixed_part - id_len, ENC_NA);
4554
55
            expert_add_info_format(pinfo, ti, &ei_icmpv6_unknown_data,
4555
55
                                   "Remaining data, %u bytes, is too short for Buffered Messages of %u bytes",
4556
55
                                   remaining - length_of_fixed_part - id_len, bm_len);
4557
55
            return body_offset - length_of_fixed_part - id_len;
4558
55
        }
4559
4560
1.60k
        if (bm_len > 0) {
4561
576
            bm_tree = proto_tree_add_subtree_format(seed_info_tree, tvb, body_offset, bm_len, ett_icmpv6_mpl_seed_info_bm, NULL,
4562
576
                                                    "Buffered Messages");
4563
11.5k
            for (i = 0; i < bm_len; i++) {
4564
10.9k
                b = tvb_get_uint8(tvb, body_offset + i);
4565
98.5k
                for (j = 0; j < 8; j++) {
4566
87.6k
                    if (b & (0x80 >> j)) {
4567
                        /* From RFC 1982: s' = (s + n) modulo (2 ^ SERIAL_BITS), where SERIAL_BITS is 8 */
4568
31.7k
                        proto_tree_add_uint(bm_tree, hf_icmpv6_mpl_seed_info_sequence, tvb, body_offset + i, 1, (min_seqno + 8 * i + j) % 0x100);
4569
31.7k
                    }
4570
87.6k
                }
4571
10.9k
            }
4572
576
        }
4573
1.60k
        body_offset += bm_len;
4574
4575
1.60k
        remaining = tvb_captured_length_remaining(tvb, body_offset);
4576
1.60k
    }
4577
4578
21
    if (remaining != 0) {
4579
        /* Invalid length; there is remaining data after dissecting MPL Control Message */
4580
10
        ti = proto_tree_add_item(tree, hf_icmpv6_unknown_data, tvb, body_offset, body_offset - offset, ENC_NA);
4581
10
        expert_add_info_format(pinfo, ti, &ei_icmpv6_unknown_data,
4582
10
                               "%u bytes data is left after dissecting MPL Control Message", remaining);
4583
10
    }
4584
4585
21
    return body_offset;
4586
97
}
4587
4588
static bool
4589
capture_icmpv6(const unsigned char *pd _U_, int offset _U_, int len _U_, capture_packet_info_t *cpinfo, const union wtap_pseudo_header *pseudo_header _U_)
4590
0
{
4591
0
    capture_dissector_increment_count(cpinfo, proto_icmpv6);
4592
0
    return true;
4593
0
}
4594
4595
static int
4596
dissect_icmpv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
4597
2.54k
{
4598
2.54k
    proto_tree         *icmp6_tree = NULL;
4599
2.54k
    proto_item         *ti         = NULL, *checksum_item = NULL, *code_item = NULL;
4600
2.54k
    const char         *code_name  = NULL;
4601
2.54k
    unsigned            length     = 0, reported_length;
4602
2.54k
    vec_t               cksum_vec[4];
4603
2.54k
    uint32_t            phdr[2];
4604
2.54k
    uint16_t            cksum;
4605
2.54k
    unsigned            offset;
4606
2.54k
    tvbuff_t           *next_tvb;
4607
2.54k
    uint8_t             icmp6_type, icmp6_code, icmp6_code_prefix, icmp6_code_suffix;
4608
2.54k
    icmp_transaction_t *trans      = NULL;
4609
2.54k
    ws_ip6 *iph = WS_IP6_PTR(data);
4610
4611
2.54k
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "ICMPv6");
4612
2.54k
    col_clear(pinfo->cinfo, COL_INFO);
4613
4614
2.54k
    offset = 0;
4615
4616
2.54k
    if (tree) {
4617
2.54k
        ti = proto_tree_add_item(tree, proto_icmpv6, tvb, offset, -1, ENC_NA);
4618
2.54k
        icmp6_tree = proto_item_add_subtree(ti, ett_icmpv6);
4619
4620
        /* Type */
4621
2.54k
        ti = proto_tree_add_item(icmp6_tree, hf_icmpv6_type, tvb, offset, 1, ENC_BIG_ENDIAN);
4622
2.54k
    }
4623
2.54k
    icmp6_type = tvb_get_uint8(tvb, offset);
4624
2.54k
    if (!(icmp6_type & 0x80)) {
4625
1.54k
        expert_add_info(pinfo, ti, &ei_icmpv6_type_error);
4626
1.54k
    }
4627
2.54k
    offset += 1;
4628
4629
2.54k
    col_add_str(pinfo->cinfo, COL_INFO, val_to_str(pinfo->pool, icmp6_type, icmpv6_type_val, "Unknown (%d)"));
4630
4631
2.54k
    switch (icmp6_type) {
4632
2
        case ICMP6_MCAST_ROUTER_ADVERT:
4633
            // Code field is reused for Advertisement Interval
4634
2
            proto_tree_add_item(icmp6_tree, hf_icmpv6_mcast_ra_ad_interval, tvb, offset, 1, ENC_BIG_ENDIAN);
4635
2
            break;
4636
4
        case ICMP6_MCAST_ROUTER_SOLICIT:
4637
6
        case ICMP6_MCAST_ROUTER_TERM:
4638
            // Code field is reserved
4639
6
            proto_tree_add_item(icmp6_tree, hf_icmpv6_mcast_ra_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
4640
6
            break;
4641
2.53k
        default:
4642
2.53k
            code_item = proto_tree_add_item(icmp6_tree, hf_icmpv6_code, tvb, offset, 1, ENC_BIG_ENDIAN);
4643
2.54k
    }
4644
4645
2.54k
    icmp6_code = tvb_get_uint8(tvb, offset);
4646
4647
    /* Split ICMPv6 code into two 4-bit fields for ICMPv6 types which need it */
4648
2.54k
    icmp6_code_prefix = (icmp6_code & 0xF0) >> 4;
4649
2.54k
    icmp6_code_suffix = (icmp6_code & 0x0F);
4650
4651
2.54k
    if(icmp6_type == ICMP6_6LOWPANND_DAR) {
4652
4
        proto_tree_add_uint(icmp6_tree, hf_icmpv6_da_code_prefix, tvb, offset, 1, icmp6_code_prefix);
4653
4
        proto_tree_add_uint(icmp6_tree, hf_icmpv6_dar_code_suffix, tvb, offset, 1, icmp6_code_suffix);
4654
4
        proto_item *pi_csfx = proto_tree_add_uint(icmp6_tree, hf_icmpv6_da_code_suffix, tvb, offset, 1, icmp6_code_suffix);
4655
4
        proto_item_set_hidden(pi_csfx);
4656
4
    }
4657
2.54k
    else if(icmp6_type == ICMP6_6LOWPANND_DAC) {
4658
3
        proto_tree_add_uint(icmp6_tree, hf_icmpv6_da_code_prefix, tvb, offset, 1, icmp6_code_prefix);
4659
3
        proto_tree_add_uint(icmp6_tree, hf_icmpv6_dac_code_suffix, tvb, offset, 1, icmp6_code_suffix);
4660
3
        proto_item *pi_csfx = proto_tree_add_uint(icmp6_tree, hf_icmpv6_da_code_suffix, tvb, offset, 1, icmp6_code_suffix);
4661
3
        proto_item_set_hidden(pi_csfx);
4662
3
    }
4663
2.54k
    offset += 1;
4664
4665
2.54k
    switch (icmp6_type) {
4666
177
        case ICMP6_DST_UNREACH:
4667
177
            code_name = val_to_str_const(icmp6_code, icmpv6_unreach_code_val, "Unknown");
4668
177
            break;
4669
455
        case ICMP6_TIME_EXCEEDED:
4670
455
            code_name = val_to_str(pinfo->pool, icmp6_code, icmpv6_timeex_code_val, "Unknown (%d)");
4671
455
            break;
4672
98
        case ICMP6_PARAM_PROB:
4673
98
            code_name = val_to_str(pinfo->pool, icmp6_code, icmpv6_paramprob_code_val, "Unknown (%d)");
4674
98
            break;
4675
85
        case ICMP6_ROUTER_RENUMBERING:
4676
85
            code_name = val_to_str(pinfo->pool, icmp6_code, icmpv6_rr_code_val, "Unknown (%d)");
4677
85
            break;
4678
7
        case ICMP6_NI_QUERY:
4679
7
            code_name = val_to_str(pinfo->pool, icmp6_code, ni_query_code_val, "Unknown (%d)");
4680
7
            break;
4681
12
        case ICMP6_NI_REPLY:
4682
12
            code_name = val_to_str(pinfo->pool, icmp6_code, ni_reply_code_val, "Unknown (%d)");
4683
12
            break;
4684
357
        case ICMP6_RPL_CONTROL:
4685
357
            code_name = val_to_str(pinfo->pool, icmp6_code, rpl_code_val, "Unknown (%d)");
4686
357
            break;
4687
2
        case ICMP6_EXTECHO:
4688
2
            code_name = val_to_str(pinfo->pool, icmp6_code, ext_echo_req_code_str, "Unknown (%d)");
4689
2
            break;
4690
3
        case ICMP6_EXTECHOREPLY:
4691
3
            code_name = val_to_str(pinfo->pool, icmp6_code, ext_echo_reply_code_str, "Unknown (%d)");
4692
3
            break;
4693
2.54k
    }
4694
4695
2.54k
    if (code_item && code_name) {
4696
1.19k
        proto_item_append_text(code_item, " (%s)", code_name);
4697
1.19k
        col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", code_name);
4698
1.19k
    }
4699
4700
    /* RFC 4380
4701
     * 2.7.   Teredo UDP Port
4702
     * 5.2.9. Direct IPv6 Connectivity Test  */
4703
2.54k
    if (pinfo->destport == 3544 && icmp6_type == ICMP6_ECHO_REQUEST) {
4704
0
        col_set_str(pinfo->cinfo, COL_PROTOCOL, "Teredo");
4705
0
        col_set_str(pinfo->cinfo, COL_INFO, "Direct IPv6 Connectivity Test");
4706
0
    }
4707
4708
2.54k
    cksum = tvb_get_ntohs(tvb, offset);
4709
2.54k
    length = tvb_captured_length(tvb);
4710
2.54k
    reported_length = tvb_reported_length(tvb);
4711
2.54k
    if (!pinfo->fragmented && length >= reported_length && !pinfo->flags.in_error_pkt) {
4712
        /* The packet isn't part of a fragmented datagram, isn't truncated,
4713
         * and we aren't in an ICMP error packet, so we can checksum it.
4714
         */
4715
4716
        /* Set up the fields of the pseudo-header. */
4717
2.37k
        SET_CKSUM_VEC_PTR(cksum_vec[0], (const uint8_t *)pinfo->src.data, pinfo->src.len);
4718
2.37k
        SET_CKSUM_VEC_PTR(cksum_vec[1], (const uint8_t *)pinfo->dst.data, pinfo->dst.len);
4719
2.37k
        phdr[0] = g_htonl(reported_length);
4720
2.37k
        phdr[1] = g_htonl(IP_PROTO_IPV6_ICMP);
4721
2.37k
        SET_CKSUM_VEC_PTR(cksum_vec[2], (const uint8_t *)&phdr, 8);
4722
2.37k
        SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, reported_length);
4723
4724
2.37k
        proto_tree_add_checksum(icmp6_tree, tvb, 2, hf_icmpv6_checksum, hf_icmpv6_checksum_status, &ei_icmpv6_checksum, pinfo, in_cksum(cksum_vec, 4),
4725
2.37k
                                ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM);
4726
2.37k
    } else {
4727
168
        checksum_item = proto_tree_add_checksum(icmp6_tree, tvb, 2, hf_icmpv6_checksum, hf_icmpv6_checksum_status, &ei_icmpv6_checksum, pinfo, 0,
4728
168
                                                ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
4729
168
        proto_item_append_text(checksum_item, " [%s]",
4730
168
            pinfo->flags.in_error_pkt ? "in ICMP error packet" : "fragmented datagram");
4731
168
    }
4732
2.54k
    offset += 2;
4733
4734
2.54k
    if (icmp6_type == ICMP6_ECHO_REQUEST || icmp6_type == ICMP6_ECHO_REPLY) {
4735
25
        uint16_t identifier, sequence;
4736
4737
        /* Identifier */
4738
25
        proto_tree_add_item_ret_uint16(icmp6_tree, hf_icmpv6_echo_identifier, tvb, offset, 2, ENC_BIG_ENDIAN, &identifier);
4739
25
        offset += 2;
4740
4741
        /* Sequence Number */
4742
25
        if (tree)
4743
24
            proto_tree_add_item(icmp6_tree, hf_icmpv6_echo_sequence_number, tvb, offset, 2, ENC_BIG_ENDIAN);
4744
25
        sequence = tvb_get_ntohs(tvb, offset);
4745
25
        offset += 2;
4746
4747
25
        col_append_fstr(pinfo->cinfo, COL_INFO, " id=0x%04x, seq=%u",
4748
25
            identifier, sequence);
4749
25
        if (iph != NULL) {
4750
15
            col_append_fstr(pinfo->cinfo, COL_INFO, ", hop limit=%u",
4751
15
                            iph->ip6_hop);
4752
15
        }
4753
4754
25
        if (pinfo->destport == 3544 && icmp6_type == ICMP6_ECHO_REQUEST) {
4755
            /* RFC 4380
4756
             * 2.7.   Teredo UDP Port
4757
             * 5.2.9. Direct IPv6 Connectivity Test
4758
             *
4759
             * TODO: Clarify the nonce:  The RFC states, "(It is recommended to
4760
             * use a random number [the nonce] at least 64 bits long.)"
4761
             *
4762
             * Shouldn't the nonce be at least 8 then?  Why not just use (-1),
4763
             * as it could really be any length, couldn't it?
4764
             */
4765
0
            proto_tree_add_item(icmp6_tree, hf_icmpv6_nonce, tvb, offset, 4, ENC_NA);
4766
0
            offset += 4;
4767
25
        } else {
4768
25
            if (!pinfo->flags.in_error_pkt) {
4769
23
                uint32_t conv_key[3];
4770
4771
23
                conv_key[1] = (uint32_t)((identifier << 16) | sequence);
4772
23
                conv_key[2] = prefs.strict_conversation_tracking_heuristics ? pinfo->vlan_id : 0;
4773
4774
23
                if (icmp6_type == ICMP6_ECHO_REQUEST) {
4775
19
                    conv_key[0] = (uint32_t)cksum;
4776
19
                    if (conv_key[0] == 0xffff)
4777
1
                        conv_key[0] = 0;
4778
19
                    if (pinfo->flags.in_gre_pkt && prefs.strict_conversation_tracking_heuristics)
4779
0
                        conv_key[0] |= 0x00010000; /* set a bit for "in GRE" */
4780
19
                    trans = transaction_start(pinfo, icmp6_tree, conv_key);
4781
19
                } else { /* ICMP6_ECHO_REPLY */
4782
4
                    uint16_t tmp[2];
4783
4784
4
                    tmp[0] = ~cksum;
4785
4
                    tmp[1] = ~0x0100; /* The difference between echo request & reply */
4786
4
                    SET_CKSUM_VEC_PTR(cksum_vec[0], (uint8_t *)tmp, sizeof(tmp));
4787
4
                    conv_key[0] = in_cksum(cksum_vec, 1);
4788
4
                    if (pinfo->flags.in_gre_pkt && prefs.strict_conversation_tracking_heuristics)
4789
0
                        conv_key[0] |= 0x00010000; /* set a bit for "in GRE" */
4790
4
                    trans = transaction_end(pinfo, icmp6_tree, conv_key);
4791
4
                }
4792
23
            }
4793
4794
            /* Interpret the first 8 or 16 bytes of the Echo data as a timestamp
4795
             * But only if it does look like it's a timestamp.
4796
             */
4797
4798
25
            nstime_t ts, time_relative;
4799
25
            int len = get_best_guess_timestamp(tvb, offset, &pinfo->abs_ts, &ts);
4800
25
            if (len) {
4801
5
                proto_tree_add_time(icmp6_tree, hf_icmpv6_data_time, tvb, offset, len, &ts);
4802
5
                nstime_delta(&time_relative, &pinfo->abs_ts, &ts);
4803
5
                ti = proto_tree_add_time(icmp6_tree, hf_icmpv6_data_time_relative, tvb, offset, len, &time_relative);
4804
5
                proto_item_set_generated(ti);
4805
5
                offset += len;
4806
5
            }
4807
25
            heur_dtbl_entry_t *hdtbl_entry;
4808
25
            next_tvb = tvb_new_subset_remaining(tvb, offset);
4809
25
            bool result = dissector_try_heuristic(icmpv6_heur_subdissector_list, next_tvb, pinfo, tree, &hdtbl_entry, NULL);
4810
25
            if (!result) {
4811
22
                offset += call_data_dissector(next_tvb, pinfo, icmp6_tree);
4812
22
            }
4813
3
            else {
4814
3
                offset += tvb_reported_length(next_tvb);
4815
3
            }
4816
25
        }
4817
25
    }
4818
4819
2.54k
    if (1) { /* There are expert infos buried in here so always execute */
4820
        /* decode... */
4821
        /* FIXME: The following messages MUST have a TTL^WHop-Limit of 255:
4822
                133-137, 141-142, 148-149. Detect this and add expert items. */
4823
2.54k
        switch (icmp6_type) {
4824
177
            case ICMP6_DST_UNREACH: /* Destination Unreachable (1) */
4825
632
            case ICMP6_TIME_EXCEEDED: /* Time Exceeded (3) */
4826
632
            {
4827
632
                char orig_datagram_length = tvb_get_uint8(tvb, offset);
4828
632
                if (orig_datagram_length) {
4829
                  /* RFC 4884 Original datagram length */
4830
621
                  proto_tree_add_item(icmp6_tree, hf_icmpv6_length, tvb, offset, 1, ENC_NA);
4831
621
                  offset += 1;
4832
621
                  proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 3, ENC_NA);
4833
621
                  offset += 3;
4834
621
                } else {
4835
                  /* Reserved */
4836
11
                  proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 4, ENC_NA);
4837
11
                  offset += 4;
4838
11
                }
4839
4840
632
                next_tvb = tvb_new_subset_remaining(tvb, offset);
4841
632
                int contained_len = dissect_contained_icmpv6(next_tvb, pinfo, icmp6_tree);
4842
632
                if (orig_datagram_length) {
4843
621
                  offset += 8 * orig_datagram_length;
4844
621
                  tvbuff_t * extension_tvb = tvb_new_subset_remaining(tvb, offset);
4845
621
                  offset += call_dissector(icmp_extension_handle, extension_tvb, pinfo, icmp6_tree);
4846
621
                } else {
4847
11
                  offset += contained_len;
4848
11
                }
4849
632
                break;
4850
177
            }
4851
785
            case ICMP6_PACKET_TOO_BIG: /* Packet Too Big (2) */
4852
                /* MTU */
4853
785
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mtu, tvb, offset, 4, ENC_BIG_ENDIAN);
4854
785
                offset += 4;
4855
4856
785
                next_tvb = tvb_new_subset_remaining(tvb, offset);
4857
785
                offset += dissect_contained_icmpv6(next_tvb, pinfo, icmp6_tree);
4858
785
                break;
4859
98
            case ICMP6_PARAM_PROB: /* Parameter Problem (4) */
4860
                /* MTU */
4861
98
                proto_tree_add_item(icmp6_tree, hf_icmpv6_pointer, tvb, offset, 4, ENC_BIG_ENDIAN);
4862
98
                offset += 4;
4863
4864
98
                next_tvb = tvb_new_subset_remaining(tvb, offset);
4865
98
                offset += dissect_contained_icmpv6(next_tvb, pinfo, icmp6_tree);
4866
98
                break;
4867
20
            case ICMP6_ECHO_REQUEST:    /* Echo Request (128) */
4868
24
            case ICMP6_ECHO_REPLY:      /* Echo Reply (129) */
4869
                /* Already handled above */
4870
24
                break;
4871
22
            case ICMP6_MEMBERSHIP_QUERY: /* Multicast Listener Query (130) */
4872
23
            case ICMP6_MEMBERSHIP_REPORT: /* Multicast Listener Report (131) */
4873
26
            case ICMP6_MEMBERSHIP_REDUCTION: /* Multicast Listener Done (132) */
4874
26
            {
4875
                /* It is MLDv2 packet ? (the min length for a MLDv2 packet is 28) */
4876
26
                if ((icmp6_type == ICMP6_MEMBERSHIP_QUERY) && (length >= MLDV2_PACKET_MINLEN)) {
4877
20
                    uint32_t mrc;
4878
20
                    uint16_t qqi, i, nb_sources;
4879
20
                    static int * const mld_flags[] = {
4880
20
                        &hf_icmpv6_mld_flag_s,
4881
20
                        &hf_icmpv6_mld_flag_qrv,
4882
20
                        &hf_icmpv6_mld_flag_rsv,
4883
20
                        NULL
4884
20
                    };
4885
4886
                    /* Maximum Response Code */
4887
20
                    mrc = tvb_get_ntohs(tvb, offset);
4888
20
                    if (mrc >= 32768){
4889
11
                        mrc = ((mrc & 0x0fff) | 0x1000) << (((mrc & 0x7000) >> 12) + 3);
4890
11
                    }
4891
20
                    proto_tree_add_uint(icmp6_tree, hf_icmpv6_mld_mrc, tvb, offset, 2, mrc);
4892
20
                    offset += 2;
4893
4894
                    /* Reserved */
4895
20
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
4896
20
                    offset += 2;
4897
4898
                    /* Multicast Address */
4899
20
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_mld_multicast_address, tvb, offset, 16, ENC_NA);
4900
20
                    offset += 16;
4901
4902
                    /* Flag */
4903
20
                    proto_tree_add_bitmask(icmp6_tree, tvb, offset, hf_icmpv6_mld_flag, ett_icmpv6_flag_mld, mld_flags, ENC_BIG_ENDIAN);
4904
20
                    offset += 1;
4905
4906
                    /* QQI */
4907
20
                    qqi = tvb_get_uint8(tvb, offset);
4908
20
                    if (qqi >= 128){
4909
9
                        qqi = ((qqi & 0x0f) | 0x10) << (((qqi & 0x70) >> 4) + 3);
4910
9
                    }
4911
20
                    proto_tree_add_uint(icmp6_tree, hf_icmpv6_mld_qqi, tvb, offset, 1, qqi);
4912
20
                    offset += 1;
4913
4914
                    /* Number of Sources */
4915
20
                    proto_tree_add_item_ret_uint16(icmp6_tree, hf_icmpv6_mld_nb_sources, tvb, offset, 2, ENC_BIG_ENDIAN, &nb_sources);
4916
20
                    offset += 2;
4917
4918
                    /* Source Address */
4919
177
                    for (i=0; i < nb_sources; i++){
4920
157
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_mld_source_address, tvb, offset, 16, ENC_NA);
4921
157
                        offset += 16;
4922
157
                    }
4923
4924
20
                }else{ /* It is a MLDv1 Packet */
4925
4926
6
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_mld_mrd, tvb, offset, 2, ENC_BIG_ENDIAN);
4927
6
                    offset += 2;
4928
4929
                    /* Reserved */
4930
6
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
4931
6
                    offset += 2;
4932
4933
                    /* Multicast Address */
4934
6
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_mld_multicast_address, tvb, offset, 16, ENC_NA);
4935
6
                    offset += 16;
4936
6
                }
4937
26
                break;
4938
23
            }
4939
4
            case ICMP6_ND_ROUTER_SOLICIT: /* Router Solicitation (133) */
4940
4
            {
4941
                /* Reserved */
4942
4
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 4, ENC_NA);
4943
4
                offset += 4;
4944
4945
                /* Show options */
4946
4
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
4947
4
                break;
4948
23
            }
4949
89
            case ICMP6_ND_ROUTER_ADVERT: /* Router Advertisement (134) */
4950
89
            {
4951
89
                static int * const nd_ra_flags[] = {
4952
89
                    &hf_icmpv6_nd_ra_flag_m,
4953
89
                    &hf_icmpv6_nd_ra_flag_o,
4954
89
                    &hf_icmpv6_nd_ra_flag_h,
4955
89
                    &hf_icmpv6_nd_ra_flag_prf,
4956
89
                    &hf_icmpv6_nd_ra_flag_p,
4957
89
                    &hf_icmpv6_nd_ra_flag_s,
4958
89
                    &hf_icmpv6_nd_ra_flag_rsv,
4959
89
                    NULL
4960
89
                };
4961
4962
                /* Current hop limit */
4963
89
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_ra_cur_hop_limit, tvb, offset, 1, ENC_BIG_ENDIAN);
4964
89
                offset += 1;
4965
4966
                /* Flags */
4967
89
                proto_tree_add_bitmask(icmp6_tree, tvb, offset, hf_icmpv6_nd_ra_flag, ett_icmpv6_flag_ra, nd_ra_flags, ENC_BIG_ENDIAN);
4968
89
                offset += 1;
4969
4970
                /* Router lifetime */
4971
89
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_ra_router_lifetime, tvb, offset, 2, ENC_BIG_ENDIAN);
4972
89
                offset += 2;
4973
4974
                /* Reachable time */
4975
89
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_ra_reachable_time, tvb, offset, 4, ENC_BIG_ENDIAN);
4976
89
                offset += 4;
4977
4978
                /* Retrans timer */
4979
89
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_ra_retrans_timer, tvb, offset, 4, ENC_BIG_ENDIAN);
4980
89
                offset += 4;
4981
4982
                /* Show options */
4983
89
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
4984
89
                break;
4985
23
            }
4986
24
            case ICMP6_ND_NEIGHBOR_SOLICIT: /* Neighbor Solicitation (135) */
4987
24
            {
4988
                /* Reserved */
4989
24
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 4, ENC_NA);
4990
24
                offset += 4;
4991
4992
                /* Target Address */
4993
24
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_ns_target_address, tvb, offset, 16, ENC_NA);
4994
24
                col_append_fstr(pinfo->cinfo, COL_INFO, " for %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
4995
4996
24
                offset += 16;
4997
4998
                /* Show options */
4999
24
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5000
24
                break;
5001
23
            }
5002
30
            case ICMP6_ND_NEIGHBOR_ADVERT: /* Neighbor Advertisement (136) */
5003
30
            {
5004
30
                uint32_t na_flags;
5005
30
                wmem_strbuf_t *flags_strbuf = wmem_strbuf_create(pinfo->pool);
5006
30
                static int * const nd_na_flags[] = {
5007
30
                    &hf_icmpv6_nd_na_flag_r,
5008
30
                    &hf_icmpv6_nd_na_flag_s,
5009
30
                    &hf_icmpv6_nd_na_flag_o,
5010
30
                    &hf_icmpv6_nd_na_flag_rsv,
5011
30
                    NULL
5012
30
                };
5013
5014
                /* Flags */
5015
30
                proto_tree_add_bitmask(icmp6_tree, tvb, offset, hf_icmpv6_nd_na_flag, ett_icmpv6_flag_na, nd_na_flags, ENC_BIG_ENDIAN);
5016
30
                na_flags = tvb_get_ntohl(tvb, offset);
5017
30
                offset += 4;
5018
5019
                /* Target Address */
5020
30
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_na_target_address, tvb, offset, 16, ENC_NA);
5021
5022
5023
30
                if (na_flags & ND_NA_FLAG_R) {
5024
15
                    wmem_strbuf_append(flags_strbuf, "rtr, ");
5025
15
                }
5026
30
                if (na_flags & ND_NA_FLAG_S) {
5027
9
                    wmem_strbuf_append(flags_strbuf, "sol, ");
5028
9
                }
5029
30
                if (na_flags & ND_NA_FLAG_O) {
5030
8
                    wmem_strbuf_append(flags_strbuf, "ovr, ");
5031
8
                }
5032
30
                if (wmem_strbuf_get_len(flags_strbuf) > 2) {
5033
21
                    wmem_strbuf_truncate(flags_strbuf, wmem_strbuf_get_len(flags_strbuf) - 2);
5034
21
                } else {
5035
9
                    wmem_strbuf_truncate(flags_strbuf, 0);
5036
9
                    wmem_strbuf_append(flags_strbuf, "none");
5037
9
                }
5038
5039
30
                col_append_fstr(pinfo->cinfo, COL_INFO, " %s (%s)", tvb_ip6_to_str(pinfo->pool, tvb, offset), wmem_strbuf_get_str(flags_strbuf));
5040
30
                offset += 16;
5041
5042
                /* Show options */
5043
30
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5044
30
                break;
5045
23
            }
5046
36
            case ICMP6_ND_REDIRECT: /* Redirect Message (137) */
5047
36
            {
5048
                /* Reserved */
5049
36
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 4, ENC_NA);
5050
36
                offset += 4;
5051
5052
                /* Target Address */
5053
36
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_rd_target_address, tvb, offset, 16, ENC_NA);
5054
36
                offset += 16;
5055
5056
                /* Destination Address */
5057
36
                proto_tree_add_item(icmp6_tree, hf_icmpv6_nd_rd_destination_address, tvb, offset, 16, ENC_NA);
5058
36
                offset += 16;
5059
5060
                /* Show options */
5061
36
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5062
36
                break;
5063
23
            }
5064
85
            case ICMP6_ROUTER_RENUMBERING: /* Router Renumbering (138) */
5065
85
            {
5066
85
                offset = dissect_rrenum(tvb, offset, pinfo, icmp6_tree, icmp6_type, icmp6_code);
5067
85
                break;
5068
23
            }
5069
7
            case ICMP6_NI_QUERY: /* ICMP Node Information Query (139) */
5070
19
            case ICMP6_NI_REPLY: /* ICMP Node Information Response (140) */
5071
19
            {
5072
19
                offset = dissect_nodeinfo(tvb, offset, pinfo, icmp6_tree, icmp6_type, icmp6_code);
5073
19
                break;
5074
7
            }
5075
14
            case ICMP6_IND_SOLICIT: /* Inverse Neighbor Discovery Solicitation Message (141) */
5076
29
            case ICMP6_IND_ADVERT: /* Inverse Neighbor Discovery Advertisement Message (142) */
5077
29
            {
5078
                /* Reserved */
5079
29
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 4, ENC_NA);
5080
29
                offset += 4;
5081
5082
                /* Show options */
5083
29
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5084
29
                break;
5085
14
            }
5086
31
            case ICMP6_MLDV2_REPORT: /* Version 2 Multicast Listener Report (143) */
5087
31
            {
5088
31
                offset = dissect_mldrv2( tvb, offset, pinfo, icmp6_tree );
5089
31
                break;
5090
14
            }
5091
2
            case ICMP6_MIP6_DHAAD_REQUEST: /* Home Agent Address Discovery Request Message (144) */
5092
2
            {
5093
                /* Identifier */
5094
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mip6_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5095
2
                offset += 2;
5096
5097
                /* Reserved */
5098
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
5099
2
                offset += 2;
5100
5101
2
                break;
5102
14
            }
5103
15
            case ICMP6_MIP6_DHAAD_REPLY: /* Home Agent Address Discovery Reply Message (145) */
5104
15
            {
5105
                /* Identifier */
5106
15
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mip6_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5107
15
                offset += 2;
5108
5109
                /* Reserved */
5110
15
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
5111
15
                offset += 2;
5112
5113
                /* Show all Home Agent Addresses */
5114
225
                while(length > offset)
5115
210
                {
5116
210
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_mip6_home_agent_address, tvb, offset, 16, ENC_NA);
5117
210
                    offset += 16;
5118
210
                }
5119
15
                break;
5120
14
            }
5121
2
            case ICMP6_MIP6_MPS: /* Mobile Prefix Solicitation (146) */
5122
2
            {
5123
                /* Identifier */
5124
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mip6_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5125
2
                offset += 2;
5126
5127
                /* Reserved */
5128
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
5129
2
                offset += 2;
5130
2
                break;
5131
14
            }
5132
22
            case ICMP6_MIP6_MPA: /* Mobile Prefix Advertisement (147) */
5133
22
            {
5134
22
                static int * const mip6_flags[] = {
5135
22
                    &hf_icmpv6_mip6_flag_m,
5136
22
                    &hf_icmpv6_mip6_flag_o,
5137
22
                    &hf_icmpv6_mip6_flag_rsv,
5138
22
                    NULL
5139
22
                };
5140
5141
                /* Identifier */
5142
22
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mip6_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5143
22
                offset += 2;
5144
5145
                /* Flags */
5146
22
                proto_tree_add_bitmask(icmp6_tree, tvb, offset, hf_icmpv6_mip6_flag, ett_icmpv6_flag_mip6, mip6_flags, ENC_BIG_ENDIAN);
5147
22
                offset += 2;
5148
5149
                /* Show options */
5150
22
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5151
22
                break;
5152
14
            }
5153
17
            case ICMP6_CERT_PATH_SOL: /* Certification Path Solicitation Message (148) */
5154
17
            {
5155
5156
                /* Identifier */
5157
17
                proto_tree_add_item(icmp6_tree, hf_icmpv6_send_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5158
17
                offset += 2;
5159
5160
                /* Component  */
5161
17
                proto_tree_add_item(icmp6_tree, hf_icmpv6_send_component, tvb, offset, 2, ENC_BIG_ENDIAN);
5162
17
                offset += 2;
5163
5164
                /* Show options */
5165
17
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5166
17
                break;
5167
14
            }
5168
20
            case ICMP6_CERT_PATH_AD: /* Certification Path Advertisement Message (149) */
5169
20
            {
5170
5171
                /* Identifier */
5172
20
                proto_tree_add_item(icmp6_tree, hf_icmpv6_send_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5173
20
                offset += 2;
5174
5175
                /* All Components */
5176
20
                proto_tree_add_item(icmp6_tree, hf_icmpv6_send_all_components, tvb, offset, 2, ENC_BIG_ENDIAN);
5177
20
                offset += 2;
5178
5179
                /* Component  */
5180
20
                proto_tree_add_item(icmp6_tree, hf_icmpv6_send_component, tvb, offset, 2, ENC_BIG_ENDIAN);
5181
20
                offset += 2;
5182
5183
                /* Reserved */
5184
20
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
5185
20
                offset += 2;
5186
5187
                /* Show options */
5188
20
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5189
20
                break;
5190
14
            }
5191
22
            case ICMP6_EXPERIMENTAL_MOBILITY: /* ICMP messages utilized by experimental mobility protocols (150) */
5192
33
            case ICMP6_FMIPV6_MESSAGES:  /* FMIPv6 Messages (154)*/
5193
33
            {
5194
33
                uint8_t subtype;
5195
5196
                /* Subtype */
5197
33
                proto_tree_add_item_ret_uint8(icmp6_tree, hf_icmpv6_fmip6_subtype, tvb, offset, 1, ENC_BIG_ENDIAN, &subtype);
5198
33
                col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str(pinfo->pool, subtype, fmip6_subtype_val, "Unknown (%d)"));
5199
33
                offset += 1;
5200
5201
33
                switch(subtype){
5202
3
                    case FMIP6_SUBTYPE_RTSOLPR:
5203
3
                    {
5204
                        /* Reserved */
5205
3
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 1, ENC_NA);
5206
3
                    }
5207
3
                    break;
5208
2
                    case FMIP6_SUBTYPE_PRRTADV:
5209
2
                    {
5210
2
                        proto_item_append_text(code_item, " (%s)", val_to_str(pinfo->pool, icmp6_code, fmip6_prrtadv_code_val, "Unknown %d") );
5211
                        /* Reserved */
5212
2
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 1, ENC_NA);
5213
2
                    }
5214
2
                    break;
5215
1
                    case FMIP6_SUBTYPE_HI:
5216
1
                    {
5217
1
                        static int * const fmip6_hi_flags[] = {
5218
1
                            &hf_icmpv6_fmip6_hi_flag_s,
5219
1
                            &hf_icmpv6_fmip6_hi_flag_u,
5220
1
                            &hf_icmpv6_fmip6_hi_flag_reserved,
5221
1
                            NULL
5222
1
                        };
5223
5224
1
                        proto_item_append_text(code_item, " (%s)", val_to_str(pinfo->pool, icmp6_code, fmip6_hi_code_val, "Unknown %d") );
5225
                        /* Flags */
5226
1
                        proto_tree_add_bitmask(icmp6_tree, tvb, offset, hf_icmpv6_fmip6_hi_flag, ett_icmpv6_flag_fmip6, fmip6_hi_flags, ENC_BIG_ENDIAN);
5227
1
                    }
5228
1
                    break;
5229
1
                    case FMIP6_SUBTYPE_HACK:
5230
1
                    {
5231
1
                        proto_item_append_text(code_item, " (%s)", val_to_str(pinfo->pool, icmp6_code, fmip6_hack_code_val, "Unknown %d") );
5232
                        /* Reserved */
5233
1
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 1, ENC_NA);
5234
1
                    }
5235
1
                    break;
5236
33
                }
5237
33
                offset +=1;
5238
5239
                /* Identifier */
5240
33
                proto_tree_add_item(icmp6_tree, hf_icmpv6_fmip6_identifier, tvb, offset, 2, ENC_BIG_ENDIAN);
5241
33
                offset += 2;
5242
5243
                /* Show options */
5244
33
                offset = dissect_icmpv6_nd_opt(tvb, offset, pinfo, icmp6_tree, icmp6_type);
5245
33
                break;
5246
33
            }
5247
2
            case ICMP6_MCAST_ROUTER_ADVERT: /* Multicast Router Advertisement (151) */
5248
2
            {
5249
                /* Query Interval */
5250
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mcast_ra_query_interval, tvb, offset, 2, ENC_BIG_ENDIAN);
5251
2
                offset += 2;
5252
5253
                /* Robustness Variable */
5254
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_mcast_ra_robustness_variable, tvb, offset, 2, ENC_BIG_ENDIAN);
5255
2
                offset += 2;
5256
2
            }
5257
6
            case ICMP6_MCAST_ROUTER_SOLICIT: /* Multicast Router Solicitation (152) */
5258
8
            case ICMP6_MCAST_ROUTER_TERM: /* Multicast Router Termination (153) */
5259
8
            {
5260
                /* No Action... */
5261
8
                break;
5262
6
            }
5263
357
            case ICMP6_RPL_CONTROL: /* RPL Control (155) */
5264
357
            {
5265
                /* RPL: RFC 6550 : Routing over Low-Power and Lossy Networks. */
5266
357
                offset = dissect_rpl_control(tvb, offset, pinfo, icmp6_tree, icmp6_type, icmp6_code);
5267
357
                break;
5268
6
            }
5269
16
            case ICMP6_ILNPV6: /* Locator Update (156) */
5270
16
            {
5271
16
                uint8_t nb_locs, i;
5272
                /* Number of locs */
5273
16
                proto_tree_add_item_ret_uint8(icmp6_tree, hf_icmpv6_ilnp_nb_locs, tvb, offset, 1, ENC_BIG_ENDIAN, &nb_locs);
5274
16
                offset += 1;
5275
5276
                /* Reserved */
5277
16
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 1, ENC_NA);
5278
16
                offset += 1;
5279
5280
                /* Reserved */
5281
16
                proto_tree_add_item(icmp6_tree, hf_icmpv6_reserved, tvb, offset, 2, ENC_NA);
5282
16
                offset += 2;
5283
5284
                /* Locator / Preference / Lifetime */
5285
165
                for (i=0; i < nb_locs; i++){
5286
149
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_ilnp_locator, tvb, offset, 8, ENC_BIG_ENDIAN);
5287
149
                    offset += 8;
5288
5289
149
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_ilnp_preference, tvb, offset, 2, ENC_BIG_ENDIAN);
5290
149
                    offset += 2;
5291
5292
149
                    proto_tree_add_item(icmp6_tree, hf_icmpv6_ilnp_lifetime, tvb, offset, 2, ENC_BIG_ENDIAN);
5293
149
                    offset += 2;
5294
5295
149
                }
5296
16
                break;
5297
6
            }
5298
4
            case ICMP6_6LOWPANND_DAR:
5299
7
            case ICMP6_6LOWPANND_DAC:
5300
7
            {
5301
                /* Status */
5302
7
                proto_tree_add_item(icmp6_tree, hf_icmpv6_da_status, tvb, offset, 1, ENC_BIG_ENDIAN);
5303
7
                offset += 1;
5304
5305
                /* Reserved */
5306
7
                proto_tree_add_item(icmp6_tree, hf_icmpv6_da_rsv, tvb, offset, 1, ENC_BIG_ENDIAN);
5307
7
                offset += 1;
5308
5309
                /* Lifetime */
5310
7
                proto_tree_add_item(icmp6_tree, hf_icmpv6_da_lifetime, tvb, offset, 2, ENC_BIG_ENDIAN);
5311
7
                offset += 2;
5312
5313
7
                switch (icmp6_code_suffix) {
5314
5315
2
                    case ND_OPT_DA_EDA_64:
5316
2
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_da_rovr, tvb, offset, 8, ENC_NA);
5317
2
                        offset += 8;
5318
2
                        break;
5319
5320
0
                    case ND_OPT_DA_EDA_128:
5321
0
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_da_rovr, tvb, offset, 16, ENC_NA);
5322
0
                        offset += 16;
5323
0
                        break;
5324
5325
0
                    case ND_OPT_DA_EDA_192:
5326
0
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_da_rovr, tvb, offset, 24, ENC_NA);
5327
0
                        offset += 24;
5328
0
                        break;
5329
5330
0
                    case ND_OPT_DA_EDA_256:
5331
0
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_da_rovr, tvb, offset, 32, ENC_NA);
5332
0
                        offset += 32;
5333
0
                        break;
5334
5335
5
                    default:
5336
                        /* EUI-64 */
5337
5
                        proto_tree_add_item(icmp6_tree, hf_icmpv6_da_eui64, tvb, offset, 8, ENC_BIG_ENDIAN);
5338
5
                        offset += 8;
5339
5
                        break;
5340
7
                }
5341
5342
                /* Address */
5343
6
                proto_tree_add_item(icmp6_tree, hf_icmpv6_da_raddr, tvb, offset, 16, ENC_NA);
5344
6
                offset += 16;
5345
6
                break;
5346
7
            }
5347
99
            case ICMP6_MPL_CONTROL: /* MPL Control (159) */
5348
99
            {
5349
                /* RFC 7731: Multicast Protocol for Low-Power and Lossy Networks (MPL) */
5350
99
                offset = dissect_mpl_control(tvb, offset, pinfo, icmp6_tree, icmp6_type, icmp6_code);
5351
99
                break;
5352
7
            }
5353
5354
2
            case ICMP6_EXTECHO: /* Extended Echo - Probe - (RFC8335) */
5355
2
            {
5356
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_echo_identifier, tvb, offset, 2,
5357
2
                                    ENC_BIG_ENDIAN);
5358
2
                offset += 2;
5359
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_seq_num, tvb, offset, 1,
5360
2
                                    ENC_BIG_ENDIAN);
5361
2
                offset += 1;
5362
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_req_reserved, tvb, offset, 1,
5363
2
                                    ENC_BIG_ENDIAN);
5364
2
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_req_local, tvb, offset, 1,
5365
2
                                    ENC_BIG_ENDIAN);
5366
2
                offset += 1;
5367
5368
2
                tvbuff_t * extension_tvb = tvb_new_subset_remaining(tvb, offset);
5369
2
                offset += call_dissector(icmp_extension_handle, extension_tvb, pinfo, icmp6_tree);
5370
2
                break;
5371
7
            }
5372
5373
3
            case ICMP6_EXTECHOREPLY:
5374
3
            {
5375
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_echo_identifier, tvb, offset, 2,
5376
3
                                    ENC_BIG_ENDIAN);
5377
3
                offset += 2;
5378
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_seq_num, tvb, offset, 1,
5379
3
                                    ENC_BIG_ENDIAN);
5380
3
                offset += 1;
5381
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_rsp_state, tvb, offset, 1,
5382
3
                                    ENC_BIG_ENDIAN);
5383
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_rsp_reserved, tvb, offset, 1,
5384
3
                                    ENC_BIG_ENDIAN);
5385
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_rsp_active, tvb, offset, 1,
5386
3
                                    ENC_BIG_ENDIAN);
5387
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_rsp_ipv4, tvb, offset, 1,
5388
3
                                    ENC_BIG_ENDIAN);
5389
3
                proto_tree_add_item(icmp6_tree, hf_icmpv6_ext_echo_rsp_ipv6, tvb, offset, 1,
5390
3
                                    ENC_BIG_ENDIAN);
5391
3
                offset += 1;
5392
3
                break;
5393
7
            }
5394
5395
27
            default:
5396
27
                expert_add_info_format(pinfo, ti, &ei_icmpv6_undecoded_type,
5397
27
                                       "Dissector for ICMPv6 Type (%d)"
5398
27
                                       " code not implemented, Contact Wireshark"
5399
27
                                       " developers if you want this supported", icmp6_type);
5400
27
                proto_tree_add_item(icmp6_tree, hf_icmpv6_data, tvb, offset, -1, ENC_NA);
5401
27
                break;
5402
2.54k
        } /* switch (icmp6_type) */
5403
2.54k
    } /* if (1) */
5404
5405
1.55k
    if (!PINFO_FD_VISITED(pinfo)) {
5406
1.55k
        icmp_info_t *p_icmp_info = wmem_new(wmem_file_scope(), icmp_info_t);
5407
1.55k
        p_icmp_info->type = icmp6_type;
5408
1.55k
        p_icmp_info->code = icmp6_code;
5409
1.55k
        p_add_proto_data(wmem_file_scope(), pinfo, proto_icmpv6, 0, p_icmp_info);
5410
1.55k
    }
5411
5412
1.55k
    if (trans)
5413
19
        tap_queue_packet(icmpv6_tap, pinfo, trans);
5414
5415
1.55k
    return offset;
5416
2.54k
}
5417
5418
void
5419
proto_register_icmpv6(void)
5420
15
{
5421
15
    static hf_register_info hf[] = {
5422
15
        { &hf_icmpv6_type,
5423
15
          { "Type", "icmpv6.type", FT_UINT8, BASE_DEC, VALS(icmpv6_type_val), 0x0,
5424
15
            "Indicates the type of the message", HFILL }},
5425
15
        { &hf_icmpv6_code,
5426
15
          { "Code", "icmpv6.code", FT_UINT8, BASE_DEC, NULL, 0x0,
5427
15
            "Depends on the message type.  It is used to create an additional level of message granularity", HFILL }},
5428
15
        { &hf_icmpv6_mcast_ra_ad_interval,
5429
15
          { "Ad. Interval", "icmpv6.mcast_ra.adv_int", FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0,
5430
15
            "Advertisement Interval of MRD Advertisement Packet", HFILL }},
5431
15
        { &hf_icmpv6_mcast_ra_reserved,
5432
15
          { "Reserved", "icmpv6.mcast_ra.reserved", FT_UINT8, BASE_DEC, NULL, 0x0,
5433
15
            NULL, HFILL }},
5434
15
        { &hf_icmpv6_checksum,
5435
15
          { "Checksum", "icmpv6.checksum", FT_UINT16, BASE_HEX, NULL, 0x0,
5436
15
            "Used to detect data corruption in the ICMPv6 message and parts of the IPv6 header", HFILL }},
5437
15
        { &hf_icmpv6_checksum_status,
5438
15
          { "Checksum Status", "icmpv6.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
5439
15
            NULL, HFILL }},
5440
15
        { &hf_icmpv6_reserved,
5441
15
          { "Reserved", "icmpv6.reserved", FT_BYTES, BASE_NONE, NULL, 0x0,
5442
15
            "Must be Zero", HFILL }},
5443
15
        { &hf_icmpv6_data,
5444
15
          { "Data", "icmpv6.data", FT_BYTES, BASE_NONE, NULL, 0x0,
5445
15
            NULL, HFILL }},
5446
15
        { &hf_icmpv6_unknown_data,
5447
15
          { "Unknown Data", "icmpv6.unknown_data", FT_BYTES, BASE_NONE, NULL, 0x0,
5448
15
            "Not interpreted Data", HFILL }},
5449
15
        { &hf_icmpv6_mtu,
5450
15
          { "MTU", "icmpv6.mtu", FT_UINT32, BASE_DEC, NULL, 0x0,
5451
15
            "The Maximum Transmission Unit of the next-hop link", HFILL }},
5452
15
        { &hf_icmpv6_pointer,
5453
15
          { "Pointer", "icmpv6.pointer", FT_UINT32, BASE_DEC, NULL, 0x0,
5454
15
            "Identifies the octet offset within the invoking packet where the error was detected", HFILL }},
5455
15
        { &hf_icmpv6_echo_identifier,
5456
15
          { "Identifier", "icmpv6.echo.identifier", FT_UINT16, BASE_HEX, NULL, 0x0,
5457
15
            "An identifier to aid in matching with Request and Reply", HFILL }},
5458
15
        { &hf_icmpv6_echo_sequence_number,
5459
15
          { "Sequence", "icmpv6.echo.sequence_number", FT_UINT16, BASE_DEC, NULL, 0x0,
5460
15
            "A sequence number to aid in matching Echo Replies to this Echo Request", HFILL }},
5461
15
        { &hf_icmpv6_nonce,
5462
15
          { "Nonce", "icmpv6.nonce", FT_BYTES, BASE_NONE, NULL, 0x0,
5463
15
            NULL, HFILL }},
5464
15
        { &hf_icmpv6_data_time,
5465
15
          { "Timestamp from Echo data", "icmpv6.data_time",
5466
15
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
5467
15
            "The timestamp in the first 8 or 16 bytes of the Echo data",
5468
15
            HFILL }},
5469
15
        { &hf_icmpv6_data_time_relative,
5470
15
          { "Timestamp from Echo data (relative)", "icmpv6.data_time_relative",
5471
15
            FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0,
5472
15
            "The timestamp of the packet, relative to the timestamp in the first 8 or 16 bytes of the Echo data",
5473
15
            HFILL }},
5474
        /* RFC 2461/4861 : Neighbor Discovery for IP version 6 (IPv6) */
5475
15
        { &hf_icmpv6_nd_ra_cur_hop_limit,
5476
15
          { "Cur hop limit", "icmpv6.nd.ra.cur_hop_limit", FT_UINT8, BASE_DEC, NULL, 0x0,
5477
15
            "The default value that should be placed in the Hop Count field of the IP header for outgoing IP packets", HFILL }},
5478
15
        { &hf_icmpv6_nd_ra_flag,
5479
15
          { "Flags", "icmpv6.nd.ra.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
5480
15
            NULL, HFILL }},
5481
15
        { &hf_icmpv6_nd_ra_flag_m,
5482
15
          { "Managed address configuration", "icmpv6.nd.ra.flag.m", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_RA_FLAG_M,
5483
15
            "When set, it indicates that addresses are available via DHCPv6", HFILL }},
5484
15
        { &hf_icmpv6_nd_ra_flag_o,
5485
15
          { "Other configuration", "icmpv6.nd.ra.flag.o", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_RA_FLAG_O,
5486
15
            "When set, it indicates that other configuration information is available via DHCPv6", HFILL }},
5487
15
        { &hf_icmpv6_nd_ra_flag_h,
5488
15
          { "Home Agent", "icmpv6.nd.ra.flag.h", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_RA_FLAG_H,
5489
15
            "When set, it indicate that the router sending this Router Advertisement is also functioning as a Mobile IPv6 home agent on this link", HFILL }},
5490
15
        { &hf_icmpv6_nd_ra_flag_prf,
5491
15
          { "Prf (Default Router Preference)", "icmpv6.nd.ra.flag.prf", FT_UINT8, BASE_DEC, VALS(nd_flag_router_pref), ND_RA_FLAG_PRF,
5492
15
            "Indicates whether to prefer this router over other default routers", HFILL }},
5493
15
        { &hf_icmpv6_nd_ra_flag_p,
5494
15
          { "ND Proxy", "icmpv6.nd.ra.flag.p", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_RA_FLAG_P,
5495
15
            "Neighbor Discovery Proxy (Experimental - RFC4389)" , HFILL }},
5496
15
          { &hf_icmpv6_nd_ra_flag_s,
5497
15
          { "SNAC Router", "icmpv6.nd.ra.flag.s", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_RA_FLAG_S,
5498
15
            "Indicates whether the router operates as Stub Network Auto-Configuring (SNAC) router" , HFILL }},
5499
15
        { &hf_icmpv6_nd_ra_flag_rsv,
5500
15
          { "Reserved", "icmpv6.nd.ra.flag.rsv", FT_UINT8, BASE_DEC, NULL, ND_RA_FLAG_RSV,
5501
15
            "Must be Zero", HFILL }},
5502
15
        { &hf_icmpv6_nd_ra_router_lifetime,
5503
15
          { "Router lifetime (s)", "icmpv6.nd.ra.router_lifetime", FT_UINT16, BASE_DEC, NULL, 0x0,
5504
15
            "The lifetime associated with the default router", HFILL }},
5505
15
        { &hf_icmpv6_nd_ra_reachable_time,
5506
15
          { "Reachable time (ms)", "icmpv6.nd.ra.reachable_time", FT_UINT32, BASE_DEC, NULL, 0x0,
5507
15
            "The time that a node assumes a neighbor is reachable after having received a reachability confirmation", HFILL }},
5508
15
        { &hf_icmpv6_nd_ra_retrans_timer,
5509
15
          { "Retrans timer (ms)", "icmpv6.nd.ra.retrans_timer", FT_UINT32, BASE_DEC, NULL, 0x0,
5510
15
            "The time between retransmitted Neighbor Solicitation messages", HFILL }},
5511
15
        { &hf_icmpv6_nd_ns_target_address,
5512
15
          { "Target Address", "icmpv6.nd.ns.target_address", FT_IPv6, BASE_NONE, NULL, 0x0,
5513
15
            "The IP address of the target of the solicitation", HFILL }},
5514
15
        { &hf_icmpv6_nd_na_flag,
5515
15
          { "Flags", "icmpv6.nd.na.flag", FT_UINT32, BASE_HEX, NULL, 0x0,
5516
15
            NULL, HFILL }},
5517
15
        { &hf_icmpv6_nd_na_flag_r,
5518
15
          { "Router", "icmpv6.nd.na.flag.r", FT_BOOLEAN, 32, TFS(&tfs_set_notset), ND_NA_FLAG_R,
5519
15
            "When set, it indicates that the sender is a router", HFILL }},
5520
15
        { &hf_icmpv6_nd_na_flag_s,
5521
15
          { "Solicited", "icmpv6.nd.na.flag.s", FT_BOOLEAN, 32, TFS(&tfs_set_notset), ND_NA_FLAG_S,
5522
15
            "When set, it indicates that the advertisement was sent in response to a Neighbor Solicitation from the Destination address", HFILL }},
5523
15
        { &hf_icmpv6_nd_na_flag_o,
5524
15
          { "Override", "icmpv6.nd.na.flag.o", FT_BOOLEAN, 32, TFS(&tfs_set_notset), ND_NA_FLAG_O,
5525
15
            "When set, it indicates that the advertisement should override an existing cache entry and update the cached link-layer address", HFILL }},
5526
15
        { &hf_icmpv6_nd_na_flag_rsv,
5527
15
          { "Reserved", "icmpv6.nd.na.flag.rsv", FT_UINT32, BASE_DEC, NULL, ND_NA_FLAG_RSV,
5528
15
            "Must be Zero", HFILL }},
5529
15
        { &hf_icmpv6_nd_na_target_address,
5530
15
          { "Target Address", "icmpv6.nd.na.target_address", FT_IPv6, BASE_NONE, NULL, 0x0,
5531
15
            "the Target Address field in the Neighbor Solicitation message that prompted this advertisement", HFILL }},
5532
15
        { &hf_icmpv6_nd_rd_target_address,
5533
15
          { "Target Address", "icmpv6.nd.rd.target_address", FT_IPv6, BASE_NONE, NULL, 0x0,
5534
15
            "An IP address that is a better first hop to use for the ICMP Destination Address", HFILL }},
5535
15
        { &hf_icmpv6_nd_rd_destination_address,
5536
15
          { "Destination Address", "icmpv6.rd.na.destination_address", FT_IPv6, BASE_NONE, NULL, 0x0,
5537
15
            "The IP address of the destination that is redirected to the target", HFILL }},
5538
15
        { &hf_icmpv6_opt,
5539
15
          { "ICMPv6 Option", "icmpv6.opt", FT_NONE, BASE_NONE, NULL, 0x0,
5540
15
            NULL, HFILL }},
5541
15
        { &hf_icmpv6_opt_type,
5542
15
          { "Type", "icmpv6.opt.type", FT_UINT8, BASE_DEC, VALS(option_vals), 0x0,
5543
15
            "Options type", HFILL }},
5544
15
        { &hf_icmpv6_opt_length,
5545
15
          { "Length", "icmpv6.opt.length", FT_UINT8, BASE_DEC, NULL, 0x0,
5546
15
            "The length (in units of 8 bytes) of the option (including the Type and Length fields)", HFILL }},
5547
15
        { &hf_icmpv6_opt_reserved,
5548
15
          { "Reserved", "icmpv6.opt.reserved", FT_NONE, BASE_NONE, NULL, 0x0,
5549
15
            "Reserved (Must be 0)", HFILL }},
5550
15
        { &hf_icmpv6_opt_padding,
5551
15
          { "Padding", "icmpv6.opt.padding", FT_NONE, BASE_NONE, NULL, 0x0,
5552
15
            "Padding (Must be 0)", HFILL }},
5553
15
        { &hf_icmpv6_opt_linkaddr,
5554
15
          { "Link-layer address", "icmpv6.opt.linkaddr", FT_BYTES, BASE_NONE, NULL, 0x0,
5555
15
            NULL, HFILL }},
5556
15
       { &hf_icmpv6_opt_src_linkaddr,
5557
15
          { "Source Link-layer address", "icmpv6.opt.src_linkaddr", FT_BYTES, BASE_NONE, NULL, 0x0,
5558
15
            NULL, HFILL }},
5559
15
       { &hf_icmpv6_opt_target_linkaddr,
5560
15
          { "Target Link-layer address", "icmpv6.opt.target_linkaddr", FT_BYTES, BASE_NONE, NULL, 0x0,
5561
15
            NULL, HFILL }},
5562
15
        { &hf_icmpv6_opt_linkaddr_mac,
5563
15
          { "Link-layer address", "icmpv6.opt.linkaddr", FT_ETHER, BASE_NONE, NULL, 0x0,
5564
15
            NULL, HFILL }},
5565
15
       { &hf_icmpv6_opt_src_linkaddr_mac,
5566
15
          { "Source Link-layer address", "icmpv6.opt.src_linkaddr", FT_ETHER, BASE_NONE, NULL, 0x0,
5567
15
            NULL, HFILL }},
5568
15
       { &hf_icmpv6_opt_target_linkaddr_mac,
5569
15
          { "Target Link-layer address", "icmpv6.opt.target_linkaddr", FT_ETHER, BASE_NONE, NULL, 0x0,
5570
15
            NULL, HFILL }},
5571
15
        { &hf_icmpv6_opt_linkaddr_eui64,
5572
15
          { "Link-layer address", "icmpv6.opt.linkaddr_eui64", FT_EUI64, BASE_NONE, NULL, 0x0,
5573
15
            NULL, HFILL }},
5574
15
       { &hf_icmpv6_opt_src_linkaddr_eui64,
5575
15
          { "Source Link-layer address", "icmpv6.opt.src_linkaddr_eui64", FT_EUI64, BASE_NONE, NULL, 0x0,
5576
15
            NULL, HFILL }},
5577
15
       { &hf_icmpv6_opt_target_linkaddr_eui64,
5578
15
          { "Target Link-layer address", "icmpv6.opt.target_linkaddr_eui64", FT_EUI64, BASE_NONE, NULL, 0x0,
5579
15
            NULL, HFILL }},
5580
15
        { &hf_icmpv6_opt_prefix_len,
5581
15
          { "Prefix Length", "icmpv6.opt.prefix.length", FT_UINT8, BASE_DEC, NULL, 0x0,
5582
15
            "The number of leading bits in the Prefix that are valid", HFILL }},
5583
15
        { &hf_icmpv6_opt_prefix_flag,
5584
15
          { "Flag", "icmpv6.opt.prefix.flag", FT_UINT8, BASE_HEX, NULL, 0x00,
5585
15
            NULL, HFILL }},
5586
15
        { &hf_icmpv6_opt_prefix_flag_l,
5587
15
          { "On-link Flag (L)", "icmpv6.opt.prefix.flag.l", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80,
5588
15
            "When set, indicates that this prefix can be used for on-link determination, and traffic to those destinations is sent directly (not via routers)", HFILL }},
5589
15
        { &hf_icmpv6_opt_prefix_flag_a,
5590
15
          { "Autonomous Address Configuration Flag (A)", "icmpv6.opt.prefix.flag.a", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x40,
5591
15
            "When set, indicates that this prefix can be used for stateless address configuration", HFILL }},
5592
15
        { &hf_icmpv6_opt_prefix_flag_r,
5593
15
          { "Router Address Flag (R)", "icmpv6.opt.prefix.flag.r", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x20,
5594
15
            "When set, indicates that the Prefix field contains a complete IP address assigned to the sending router", HFILL }},
5595
15
        { &hf_icmpv6_opt_prefix_flag_p,
5596
15
          { "DHCPv6-PD Preferred Flag (P)", "icmpv6.opt.prefix.flag.p", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x10,
5597
15
            "When set, indicates that the network prefers that clients use Prefix Delegation (PD) instead of acquiring individual addresses via SLAAC or DHCPv6 address assignment.", HFILL }},
5598
15
        { &hf_icmpv6_opt_prefix_flag_reserved,
5599
15
          { "Reserved", "icmpv6.opt.prefix.flag.reserved", FT_UINT8, BASE_DEC, NULL, 0xf,
5600
15
            NULL, HFILL }},
5601
15
        { &hf_icmpv6_opt_prefix_valid_lifetime,
5602
15
          { "Valid Lifetime", "icmpv6.opt.prefix.valid_lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x00,
5603
15
            "The length of time in seconds that the prefix is valid for the purpose of on-link determination", HFILL }},
5604
15
        { &hf_icmpv6_opt_prefix_preferred_lifetime,
5605
15
          { "Preferred Lifetime", "icmpv6.opt.prefix.preferred_lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x00,
5606
15
            "The length of time in seconds that addresses generated from the prefix via stateless address autoconfiguration remain preferred", HFILL }},
5607
15
        { &hf_icmpv6_opt_prefix,
5608
15
          { "Prefix", "icmpv6.opt.prefix", FT_IPv6, BASE_NONE, NULL, 0x00,
5609
15
            "An IP address or a prefix of an IP address", HFILL }},
5610
15
        { &hf_icmpv6_opt_cga_pad_len,
5611
15
          { "Pad Length", "icmpv6.opt.cga.pad_length", FT_UINT8, BASE_DEC, NULL, 0x0,
5612
15
            "Pad Length (in bytes)", HFILL }},
5613
15
        { &hf_icmpv6_opt_cga,
5614
15
          { "CGA", "icmpv6.opt.cga", FT_BYTES, BASE_NONE, NULL, 0x0,
5615
15
            NULL, HFILL }},
5616
15
        { &hf_icmpv6_opt_cga_modifier,
5617
15
          { "Modifier", "icmpv6.opt.cga.modifier", FT_BYTES, BASE_NONE, NULL, 0x0,
5618
15
            NULL, HFILL }},
5619
15
        { &hf_icmpv6_opt_cga_subnet_prefix,
5620
15
          { "Subnet Prefix", "icmpv6.opt.cga.subnet_prefix", FT_BYTES, BASE_NONE, NULL, 0x0,
5621
15
            NULL, HFILL }},
5622
15
        { &hf_icmpv6_opt_cga_count,
5623
15
          { "Count", "icmpv6.opt.cga.count", FT_BYTES, BASE_NONE, NULL, 0x0,
5624
15
            NULL, HFILL }},
5625
15
        { &hf_icmpv6_opt_cga_subject_public_key_info,
5626
15
          { "Subject Public Key Info", "icmpv6.opt.cga.subject_public_key_info", FT_NONE, BASE_NONE, NULL, 0x0,
5627
15
            NULL, HFILL }},
5628
15
        { &hf_icmpv6_opt_cga_ext_type,
5629
15
          { "Ext Type", "icmpv6.opt.cga.ext_type", FT_UINT16, BASE_DEC, NULL, 0x0,
5630
15
            NULL, HFILL }},
5631
15
        { &hf_icmpv6_opt_cga_ext_length,
5632
15
          { "Ext Length", "icmpv6.opt.cga.ext_length", FT_UINT16, BASE_DEC, NULL, 0x0,
5633
15
            NULL, HFILL }},
5634
15
        { &hf_icmpv6_opt_cga_ext_data,
5635
15
          { "Ext Data", "icmpv6.opt.cga.ext_data", FT_BYTES, BASE_NONE, NULL, 0x0,
5636
15
            NULL, HFILL }},
5637
15
        { &hf_icmpv6_opt_rsa_key_hash,
5638
15
          { "Key Hash", "icmpv6.opt.rsa.key_hash", FT_BYTES, BASE_NONE, NULL, 0x0,
5639
15
            NULL, HFILL }},
5640
15
        { &hf_icmpv6_opt_digital_signature_padding,
5641
15
          { "Digital Signature and Padding", "icmpv6.opt.digital_signature_padding", FT_NONE, BASE_NONE, NULL, 0x0,
5642
15
            "TO DO FIX ME !!", HFILL }},
5643
15
        { &hf_icmpv6_opt_ps_key_hash,
5644
15
          { "Key Hash", "icmpv6.opt.ps.key_hash", FT_BYTES, BASE_NONE, NULL, 0x0,
5645
15
            NULL, HFILL }},
5646
15
        { &hf_icmpv6_opt_timestamp,
5647
15
          { "Timestamp", "icmpv6.opt.timestamp", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
5648
15
            "The value indicates the number of seconds since January 1, 1970, 00:00 UTC", HFILL }},
5649
15
        { &hf_icmpv6_opt_nonce,
5650
15
          { "Nonce", "icmpv6.opt.nonce", FT_BYTES, BASE_NONE, NULL, 0x0,
5651
15
            "A field containing a random number selected by the sender of the solicitation message", HFILL }},
5652
15
        { &hf_icmpv6_opt_certificate_padding,
5653
15
          { "Certificate and Padding", "icmpv6.opt.certificate_padding", FT_NONE, BASE_NONE, NULL, 0x0,
5654
15
            NULL, HFILL }},
5655
15
        { &hf_icmpv6_opt_ipa_option_code,
5656
15
          { "Option-code", "icmpv6.opt.ipa.option_code", FT_UINT8, BASE_DEC, VALS(nd_opt_ipa_option_code_val), 0x00,
5657
15
            NULL, HFILL }},
5658
15
        { &hf_icmpv6_opt_ipa_prefix_len,
5659
15
          { "Prefix Length", "icmpv6.opt.ipa.prefix_len", FT_UINT8, BASE_DEC, NULL, 0x00,
5660
15
            "That indicates the length of the IPv6 Address Prefix", HFILL }},
5661
15
        { &hf_icmpv6_opt_ipa_ipv6_address,
5662
15
          { "IPv6 Address", "icmpv6.opt.ipa.ipv6_address", FT_IPv6, BASE_NONE, NULL, 0x00,
5663
15
            "The IP address/prefix defined by the Option-Code field", HFILL }},
5664
15
        { &hf_icmpv6_opt_nrpi_option_code,
5665
15
          { "Option-code", "icmpv6.opt.nrpi.option_code", FT_UINT8, BASE_DEC, NULL, 0x00,
5666
15
            NULL, HFILL }},
5667
15
        { &hf_icmpv6_opt_nrpi_prefix_len,
5668
15
          { "Prefix Length", "icmpv6.opt.nrpi.prefix_len", FT_UINT8, BASE_DEC, NULL, 0x00,
5669
15
            "The number of leading bits in the Prefix that are valid", HFILL }},
5670
15
        { &hf_icmpv6_opt_nrpi_prefix,
5671
15
          { "Prefix", "icmpv6.opt.nrpi.prefix", FT_IPv6, BASE_NONE, NULL, 0x00,
5672
15
            "An IP address or a prefix of an IP address", HFILL }},
5673
15
        { &hf_icmpv6_opt_lla_option_code,
5674
15
          { "Option-code", "icmpv6.opt.lla.option_code", FT_UINT8, BASE_DEC, VALS(nd_opt_lla_option_code_val), 0x00,
5675
15
            NULL, HFILL }},
5676
15
        { &hf_icmpv6_opt_lla_bytes,
5677
15
          { "Link-Layer Address", "icmpv6.opt.lla.bytes", FT_BYTES, BASE_NONE, NULL, 0x00,
5678
15
            "(in Bytes Format)", HFILL }},
5679
15
        { &hf_icmpv6_opt_naack_option_code,
5680
15
          { "Option-Code", "icmpv6.opt.naack.option_code", FT_UINT8, BASE_DEC, NULL, 0x00,
5681
15
            NULL, HFILL }},
5682
15
        { &hf_icmpv6_opt_naack_status,
5683
15
          { "Status", "icmpv6.opt.naack.status", FT_UINT8, BASE_DEC, VALS(nd_opt_naack_status_val), 0x00,
5684
15
            "Indicating the disposition of the Unsolicited Neighbor Advertisement message", HFILL }},
5685
15
        { &hf_icmpv6_opt_naack_supplied_ncoa,
5686
15
          { "Supplied NCoA", "icmpv6.opt.naack.supplied_ncoa", FT_IPv6, BASE_NONE, NULL, 0x00,
5687
15
            NULL, HFILL }},
5688
5689
15
        { &hf_icmpv6_opt_pvd_id_flags,
5690
15
          { "Flags", "icmpv6.opt.pvd_id.flags", FT_UINT16, BASE_HEX, NULL, 0xFFF0,
5691
15
            NULL, HFILL }},
5692
15
        { &hf_icmpv6_opt_pvd_id_flags_h,
5693
15
          { "H-Flag", "icmpv6.opt.pvd_id.flags.h", FT_BOOLEAN, 16, NULL, 0x8000,
5694
15
            "'HTTP' flag stating whether some PvD Additional Information is made available through HTTP over TLS", HFILL }},
5695
15
        { &hf_icmpv6_opt_pvd_id_flags_l,
5696
15
          { "L-Flag", "icmpv6.opt.pvd_id.flags.l", FT_BOOLEAN, 16, NULL, 0x4000,
5697
15
            "'Legacy' flag stating whether the PvD is associated with IPv4 information assigned using DHCPv4", HFILL }},
5698
15
        { &hf_icmpv6_opt_pvd_id_flags_r,
5699
15
          { "R-Flag", "icmpv6.opt.pvd_id.flags.r", FT_BOOLEAN, 16, NULL, 0x2000,
5700
15
            "'Router Advertisement' flag stating whether the PvD Option header is followed (right after padding to the next 64-bit boundary) by a Router Advertisement message header", HFILL }},
5701
15
        { &hf_icmpv6_opt_pvd_id_flags_reserved,
5702
15
          { "Reserved", "icmpv6.opt.pvd_id.flags.reserved", FT_UINT16, BASE_HEX, NULL, 0x1FF0,
5703
15
            "Must be 0", HFILL }},
5704
15
        { &hf_icmpv6_opt_pvd_id_delay,
5705
15
          { "Delay", "icmpv6.opt.pvd_id.delay", FT_UINT16, BASE_DEC, NULL, 0x000F,
5706
15
            "Unsigned integer used to delay HTTP GET queries from hosts by a randomized backoff", HFILL }},
5707
15
        { &hf_icmpv6_opt_pvd_id_sequence_number,
5708
15
          { "Sequence Number", "icmpv6.opt.pvd_id.sequence_number", FT_UINT16, BASE_DEC, NULL, 0x0,
5709
15
            "Sequence number for the PvD Additional Information", HFILL }},
5710
15
        { &hf_icmpv6_opt_pvd_id_fqdn,
5711
15
          { "PvD ID FQDN", "icmpv6.opt.pvd_id.fqdn", FT_STRING, BASE_NONE, NULL, 0x0,
5712
15
            NULL, HFILL }},
5713
5714
5715
15
        { &hf_icmpv6_opt_map_dist,
5716
15
          { "Distance", "icmpv6.opt.map.distance", FT_UINT8, BASE_DEC, NULL, 0xF0,
5717
15
            "Identifying the distance between MAP and the receiver of the advertisement (in the number of hops)", HFILL }},
5718
15
        { &hf_icmpv6_opt_map_pref,
5719
15
          { "Preference", "icmpv6.opt.map.preference", FT_UINT8, BASE_DEC, NULL, 0x0F,
5720
15
            "Used as an indicator of operator preference (Highest is better)", HFILL }},
5721
15
        { &hf_icmpv6_opt_map_flag,
5722
15
          { "Flag", "icmpv6.opt.map.flag", FT_UINT8, BASE_HEX, NULL, 0x00,
5723
15
            NULL, HFILL }},
5724
15
        { &hf_icmpv6_opt_map_flag_r,
5725
15
          { "RCoA Flag", "icmpv6.opt.map.flag.r", FT_BOOLEAN, 8, NULL, 0x80,
5726
15
            "It indicates that the mobile node is allocated the RCoA by the MAP", HFILL }},
5727
15
        { &hf_icmpv6_opt_map_flag_reserved,
5728
15
          { "Reserved", "icmpv6.opt.map.flag.reserved", FT_UINT8, BASE_DEC, NULL, 0x7F,
5729
15
            "Must be 0", HFILL }},
5730
15
        { &hf_icmpv6_opt_map_valid_lifetime,
5731
15
          { "Valid Lifetime", "icmpv6.opt.map.valid_lifetime", FT_UINT32, BASE_DEC, NULL, 0x0,
5732
15
            "This value indicates the validity of the MAP's address and the RCoA.", HFILL }},
5733
15
        { &hf_icmpv6_opt_map_global_address,
5734
15
          { "Global Address", "icmpv6.opt.map.global_address", FT_IPv6, BASE_NONE, NULL, 0x0,
5735
15
            "One of the MAP's global addresses", HFILL }},
5736
15
        { &hf_icmpv6_opt_route_info_flag,
5737
15
          { "Flag", "icmpv6.opt.route_info.flag", FT_UINT8, BASE_HEX, NULL, 0x00,
5738
15
            NULL, HFILL }},
5739
15
        { &hf_icmpv6_opt_route_info_flag_route_preference,
5740
15
          { "Route Preference", "icmpv6.opt.route_info.flag.route_preference", FT_UINT8, BASE_DEC, VALS(nd_flag_router_pref), ND_RA_FLAG_RTPREF_MASK,
5741
15
            "The Route Preference indicates whether to prefer the router associated with this prefix over others", HFILL }},
5742
15
        { &hf_icmpv6_opt_route_info_flag_reserved,
5743
15
          { "Reserved", "icmpv6.opt.route_info.flag.reserved", FT_UINT8, BASE_DEC, NULL, ND_RA_FLAG_RESERV_MASK,
5744
15
            "Must be 0", HFILL }},
5745
15
        { &hf_icmpv6_opt_route_lifetime,
5746
15
          { "Route Lifetime", "icmpv6.opt.route_lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x00,
5747
15
            "The length of time in seconds that the prefix is valid for the purpose of route determination", HFILL }},
5748
15
        { &hf_icmpv6_opt_name_type,
5749
15
          { "Name Type", "icmpv6.opt.name_type", FT_UINT8, BASE_DEC, VALS(icmpv6_option_name_type_vals), 0x0,
5750
15
            NULL, HFILL }},
5751
15
        { &hf_icmpv6_opt_name_x501,
5752
15
          { "DER Encoded X.501 Name", "icmpv6.opt.name_x501", FT_BYTES, BASE_NONE, NULL, 0x0,
5753
15
            NULL, HFILL }},
5754
15
        { &hf_icmpv6_opt_name_fqdn,
5755
15
          { "FQDN", "icmpv6.opt.name_type.fqdn", FT_STRING, BASE_NONE, NULL, 0x0,
5756
15
            NULL, HFILL }},
5757
15
        { &hf_icmpv6_opt_cert_type,
5758
15
          { "Cert Type", "icmpv6.opt.cert_type", FT_UINT8, BASE_DEC, VALS(icmpv6_option_cert_type_vals), 0x0,
5759
15
            NULL, HFILL }},
5760
        /* RFC3971:  SEcure Neighbor Discovery (SEND) */
5761
15
        { &hf_icmpv6_send_identifier,
5762
15
          { "Identifier", "icmpv6.send.identifier", FT_UINT16, BASE_DEC, NULL, 0x0,
5763
15
            "An identifier to aid in matching with Request and Reply", HFILL }},
5764
15
        { &hf_icmpv6_send_all_components,
5765
15
          { "All Components", "icmpv6.send.all_components", FT_UINT16, BASE_DEC, NULL, 0x0,
5766
15
            "Inform the receiver of the number of certificates in the entire path", HFILL }},
5767
15
        { &hf_icmpv6_send_component,
5768
15
          { "Component", "icmpv6.send.component", FT_UINT16, BASE_DEC, NULL, 0x0,
5769
15
            "If the field is set to 65,535 if the sender seeks to retrieve all certificates", HFILL }},
5770
5771
15
        { &hf_icmpv6_x509if_Name,
5772
15
          { "Name", "icmpv6.x509_Name", FT_UINT32, BASE_DEC, VALS(x509if_Name_vals), 0x0,
5773
15
            NULL, HFILL }},
5774
15
        { &hf_icmpv6_x509af_Certificate,
5775
15
          { "Certificate", "icmpv6.x509_Certificate", FT_NONE, BASE_NONE, NULL, 0x0,
5776
15
            NULL, HFILL }},
5777
15
        { &hf_icmpv6_opt_redirected_packet,
5778
15
          { "Redirected Packet", "icmpv6.opt.redirected_packet", FT_NONE, BASE_NONE, NULL, 0x0,
5779
15
            NULL, HFILL }},
5780
15
        { &hf_icmpv6_opt_mtu,
5781
15
          { "MTU", "icmpv6.opt.mtu", FT_UINT32, BASE_DEC, NULL, 0x0,
5782
15
            "The recommended MTU for the link", HFILL }},
5783
15
        { &hf_icmpv6_opt_nbma_shortcut_limit,
5784
15
          { "Shortcut Limit", "icmpv6.opt.nbma.shortcut_limit", FT_UINT8, BASE_DEC, NULL, 0x0,
5785
15
            "Hop limit for shortcut attempt", HFILL }},
5786
15
        { &hf_icmpv6_opt_advertisement_interval,
5787
15
          { "Advertisement Interval", "icmpv6.opt.advertisement_interval", FT_UINT32, BASE_DEC, NULL, 0x0,
5788
15
            "The maximum time (in milliseconds) between successive unsolicited Router Advertisement messages sent by this router on this network interface", HFILL }},
5789
15
        { &hf_icmpv6_opt_home_agent_preference,
5790
15
          { "Home Agent Preference", "icmpv6.opt.home_agent_preference", FT_UINT16, BASE_DEC, NULL, 0x0,
5791
15
            "The preference for the home agent sending this Router Advertisement", HFILL }},
5792
15
        { &hf_icmpv6_opt_home_agent_lifetime,
5793
15
          { "Home Agent Preference", "icmpv6.opt.home_agent_lifetime", FT_UINT16, BASE_DEC, NULL, 0x0,
5794
15
            "The lifetime associated with the home agent in units of seconds.", HFILL }},
5795
15
        { &hf_icmpv6_opt_ipv6_address,
5796
15
          { "IPv6 Address", "icmpv6.opt.ipv6_address", FT_IPv6, BASE_NONE, NULL, 0x0,
5797
15
            "IPv6 addresses of the interface", HFILL }},
5798
15
        { &hf_icmpv6_opt_rdnss_lifetime,
5799
15
          { "Lifetime", "icmpv6.opt.rdnss.lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(rdnss_infinity), 0x0,
5800
15
            NULL, HFILL }},
5801
15
        { &hf_icmpv6_opt_rdnss,
5802
15
          { "Recursive DNS Servers", "icmpv6.opt.rdnss", FT_IPv6, BASE_NONE, NULL, 0x0,
5803
15
            NULL, HFILL }},
5804
15
        { &hf_icmpv6_opt_efo,
5805
15
          { "Flags Expansion Option", "icmpv6.opt.efo", FT_UINT48, BASE_HEX, NULL, 0x0,
5806
15
            NULL, HFILL }},
5807
15
        { &hf_icmpv6_opt_efo_rsv,
5808
15
          { "Reserved", "icmpv6.opt.efo.rsv", FT_UINT48, BASE_HEX, NULL, FLAGS_EO_RSV,
5809
15
            "Must be Zero", HFILL }},
5810
15
        { &hf_icmpv6_opt_efo_pex,
5811
15
          { "Private Experimentation", "icmpv6.opt.efo.pex", FT_UINT48, BASE_HEX, NULL, FLAGS_EO_PEX,
5812
15
            NULL, HFILL }},
5813
15
        { &hf_icmpv6_opt_hkr_pad_length,
5814
15
          { "Pad Length", "icmpv6.opt.hkr.pad_length", FT_UINT8, BASE_DEC, NULL, 0x0,
5815
15
            "The number of padding octets beyond the end of the Handover Key", HFILL }},
5816
15
        { &hf_icmpv6_opt_hkr_at,
5817
15
          { "AT", "icmpv6.opt.hkr.at", FT_UINT8, BASE_DEC, NULL, 0xF0,
5818
15
            "The algorithm type field describing the algorithm used by FMIPv6 to calculate the authenticator", HFILL }},
5819
15
        { &hf_icmpv6_opt_hkr_reserved,
5820
15
          { "Reserved", "icmpv6.opt.hkr.reserved", FT_UINT8, BASE_DEC, NULL, 0x0F,
5821
15
            "Reserved (Must be Zero)", HFILL }},
5822
15
        { &hf_icmpv6_opt_hkr_encryption_public_key,
5823
15
          { "Handover Key Encryption Public Key", "icmpv6.opt.hkr.encryption_public_key", FT_BYTES, BASE_NONE, NULL, 0x0,
5824
15
            NULL, HFILL }},
5825
15
        { &hf_icmpv6_opt_hkr_padding,
5826
15
          { "Padding", "icmpv6.opt.hkr.padding", FT_BYTES, BASE_NONE, NULL, 0x0,
5827
15
            "A variable-length field making the option length a multiple of 8", HFILL }},
5828
15
        { &hf_icmpv6_opt_hkr_lifetime,
5829
15
          { "Padding", "icmpv6.opt.hkr.lifetime", FT_UINT16, BASE_DEC, NULL, 0x0,
5830
15
            "Lifetime of the handover key (in seconds)", HFILL }},
5831
15
        { &hf_icmpv6_opt_hkr_encrypted_handover_key,
5832
15
          { "Encrypted Handover Key", "icmpv6.opt.hkr.encrypted_handover_key", FT_BYTES, BASE_NONE, NULL, 0x0,
5833
15
            "The shared handover key, encrypted with the MN's handover key encryption public key", HFILL }},
5834
15
        { &hf_icmpv6_opt_hai_option_code,
5835
15
          { "Option-Code", "icmpv6.opt.hai.option_code", FT_UINT8, BASE_DEC, VALS(nd_opt_hai_option_code_val), 0x0,
5836
15
            NULL, HFILL }},
5837
15
        { &hf_icmpv6_opt_hai_length,
5838
15
          { "HAI-Length", "icmpv6.opt.hai.length", FT_UINT8, BASE_DEC, NULL, 0x0,
5839
15
            "The size of the HAI-Value field in octets", HFILL }},
5840
15
        { &hf_icmpv6_opt_hai_value,
5841
15
          { "HAI-Value", "icmpv6.opt.hai.value", FT_BYTES, BASE_NONE, NULL, 0x0,
5842
15
            "The value specified by the Option-Code", HFILL }},
5843
15
        { &hf_icmpv6_opt_mn_option_code,
5844
15
          { "Option-Code", "icmpv6.opt.mn.option_code", FT_UINT8, BASE_DEC, VALS(nd_opt_mn_option_code_val), 0x0,
5845
15
            NULL, HFILL }},
5846
15
        { &hf_icmpv6_opt_mn_length,
5847
15
          { "MN-Length", "icmpv6.opt.mn.length", FT_UINT8, BASE_DEC, NULL, 0x0,
5848
15
            "The size of the MN-Value field in octets", HFILL }},
5849
15
        { &hf_icmpv6_opt_mn_value,
5850
15
          { "MN-Value", "icmpv6.opt.mn.value", FT_BYTES, BASE_NONE, NULL, 0x0,
5851
15
            "The value specified by the Option-Code", HFILL }},
5852
15
        { &hf_icmpv6_opt_dnssl_lifetime,
5853
15
          { "Lifetime", "icmpv6.opt.dnssl.lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(dnssl_infinity), 0x0,
5854
15
            NULL, HFILL }},
5855
15
        { &hf_icmpv6_opt_dnssl,
5856
15
          { "Domain Names", "icmpv6.opt.dnssl", FT_STRING, BASE_NONE, NULL, 0x0,
5857
15
            NULL, HFILL }},
5858
15
        { &hf_icmpv6_opt_aro_status,
5859
15
          { "Status", "icmpv6.opt.aro.status", FT_UINT8, BASE_DEC, VALS(nd_opt_earo_status_val), 0x00,
5860
15
            "Indicates the status of a registration in the NA response", HFILL }},
5861
15
        { &hf_icmpv6_opt_earo_reserved,
5862
15
          { "Reserved", "icmpv6.opt.earo.reserved", FT_UINT8, BASE_DEC, NULL, 0x00,
5863
15
            NULL, HFILL }},
5864
15
        { &hf_icmpv6_opt_earo_opaque,
5865
15
          { "Opaque", "icmpv6.opt.earo.opaque", FT_UINT8, BASE_HEX, NULL, 0x00,
5866
15
            "An opaque field whose content is dictated by flag I", HFILL }},
5867
15
        { &hf_icmpv6_opt_earo_flag,
5868
15
          { "Flags", "icmpv6.opt.earo.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
5869
15
            NULL, HFILL }},
5870
15
        { &hf_icmpv6_opt_earo_flag_reserved,
5871
15
          { "Reserved", "icmpv6.opt.earo.flag.reserved", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_OPT_EARO_FLAG_RESERVED,
5872
15
            NULL, HFILL }},
5873
15
        { &hf_icmpv6_opt_earo_flag_c,
5874
15
          { "C", "icmpv6.opt.earo.flag.c", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_OPT_EARO_FLAG_C,
5875
15
            "Indicates that the ROVR field contains a Crypto-ID", HFILL }},
5876
15
        { &hf_icmpv6_opt_earo_flag_p,
5877
15
          { "P", "icmpv6.opt.earo.flag.p", FT_UINT8, BASE_DEC, VALS(nd_opt_earo_p_val), ND_OPT_EARO_FLAG_P,
5878
15
            "Registered Address Type Indicator (RATInd)", HFILL }},
5879
15
        { &hf_icmpv6_opt_earo_flag_i,
5880
15
          { "I", "icmpv6.opt.earo.flag.i", FT_UINT8, BASE_DEC, VALS(nd_opt_earo_i_val), ND_OPT_EARO_FLAG_I,
5881
15
            "Indicates the contents of the Opaque field", HFILL }},
5882
15
        { &hf_icmpv6_opt_earo_flag_r,
5883
15
          { "R", "icmpv6.opt.earo.flag.r", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_OPT_EARO_FLAG_R,
5884
15
            "Request reachability services for the Registered Address from a Routing Registrar", HFILL }},
5885
15
        { &hf_icmpv6_opt_earo_flag_t,
5886
15
          { "T", "icmpv6.opt.earo.flag.t", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_OPT_EARO_FLAG_T,
5887
15
            "When 0, the Transaction ID field must be ignored", HFILL }},
5888
15
        { &hf_icmpv6_opt_earo_flag_f,
5889
15
          { "F", "icmpv6.opt.earo.flag.f", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80,
5890
15
            NULL, HFILL }},
5891
15
        { &hf_icmpv6_opt_earo_prefix_len,
5892
15
          { "Prefix Length", "icmpv6.opt.earo.prefix_len", FT_UINT8, BASE_DEC, NULL, 0x00,
5893
15
            NULL, HFILL }},
5894
15
        { &hf_icmpv6_opt_earo_tid,
5895
15
          { "TID (Transaction ID)", "icmpv6.opt.earo.tid", FT_UINT8, BASE_DEC, NULL, 0x00,
5896
15
            "Unsigned integer maintained by the node and incremented with each registration.", HFILL }},
5897
15
        { &hf_icmpv6_opt_earo_rovr,
5898
15
          { "ROVR", "icmpv6.opt.earo.rovr", FT_BYTES, BASE_NONE, NULL, 0x00,
5899
15
            "Registration Ownership Verifier (ROVR)", HFILL }},
5900
15
        { &hf_icmpv6_opt_aro_registration_lifetime,
5901
15
          { "Registration Lifetime", "icmpv6.opt.aro.registration_lifetime", FT_UINT16, BASE_DEC, NULL, 0x00,
5902
15
            "The amount of time (in a unit of 60 seconds) that the router should retain the Neighbor Cache entry", HFILL }},
5903
15
        { &hf_icmpv6_opt_aro_eui64,
5904
15
          { "EUI-64", "icmpv6.opt.aro.eui64", FT_EUI64, BASE_NONE, NULL, 0x00,
5905
15
            "This field is used to uniquely identify the interface of the registered address", HFILL }},
5906
15
        { &hf_icmpv6_opt_6co_context_length,
5907
15
          { "Context Length", "icmpv6.opt.6co.context_length", FT_UINT8, BASE_DEC, NULL, 0x00,
5908
15
            "The number of leading bits in the Context Prefix field that are valid", HFILL }},
5909
15
        { &hf_icmpv6_opt_6co_flag,
5910
15
          { "Flag", "icmpv6.opt.6co.flag", FT_UINT8, BASE_HEX, NULL, 0x00,
5911
15
            NULL, HFILL }},
5912
15
        { &hf_icmpv6_opt_6co_flag_c,
5913
15
          { "Compression Flag", "icmpv6.opt.6co.flag.c", FT_BOOLEAN, 8, TFS(&tfs_set_notset), ND_OPT_6CO_FLAG_C,
5914
15
            "This flag indicates if the context is valid for use in compression", HFILL }},
5915
15
        { &hf_icmpv6_opt_6co_flag_cid,
5916
15
          { "CID", "icmpv6.opt.6co.flag.cid", FT_UINT8, BASE_DEC, NULL, ND_OPT_6CO_FLAG_CID,
5917
15
            "Context Identifier for this prefix information", HFILL }},
5918
15
        { &hf_icmpv6_opt_6co_flag_reserved,
5919
15
          { "Reserved", "icmpv6.opt.6co.flag.reserved", FT_UINT8, BASE_DEC, NULL, ND_OPT_6CO_FLAG_RESERVED,
5920
15
            "Must be zero", HFILL }},
5921
15
        { &hf_icmpv6_opt_6co_valid_lifetime,
5922
15
          { "Lifetime", "icmpv6.opt.6co.valid_lifetime", FT_UINT16, BASE_DEC, NULL, 0x00,
5923
15
            "The length of time in a unit of 60 seconds that the context is valid for the purpose of header compression or decompression", HFILL }},
5924
15
        { &hf_icmpv6_opt_6co_context_prefix,
5925
15
          { "Context Prefix", "icmpv6.opt.6co.context_prefix", FT_IPv6, BASE_NONE, NULL, 0x00,
5926
15
            "The IPv6 prefix or address corresponding to the Context ID (CID) field", HFILL }},
5927
15
        { &hf_icmpv6_opt_abro_version_low,
5928
15
          { "Version Low", "icmpv6.opt.abro.version_low", FT_UINT16, BASE_DEC, NULL, 0x00,
5929
15
            "The version number low (the least significant 16 bits) corresponding to this set of information contained in the RA message", HFILL }},
5930
15
        { &hf_icmpv6_opt_abro_version_high,
5931
15
          { "Version", "icmpv6.opt.abro.version_high", FT_UINT16, BASE_DEC, NULL, 0x00,
5932
15
            "The version number high (most significant 16 bits) corresponding to this set of information contained in the RA message", HFILL }},
5933
15
        { &hf_icmpv6_opt_abro_valid_lifetime,
5934
15
          { "Valid Lifetime", "icmpv6.opt.abro.valid_lifetime", FT_UINT16, BASE_DEC, NULL, 0x00,
5935
15
            "The length of time in a unit of 60 seconds (relative to the time the packet is received) that this set of border router information is valid.", HFILL }},
5936
15
        { &hf_icmpv6_opt_abro_6lbr_address,
5937
15
          { "6LBR Address", "icmpv6.opt.abro.6lbr_address", FT_IPv6, BASE_NONE, NULL, 0x00,
5938
15
            "IPv6 address of the 6LBR that is the origin of the included version number", HFILL }},
5939
15
        { &hf_icmpv6_opt_6cio_flag,
5940
15
          { "Capability Bits", "icmpv6.opt.6cio.flag", FT_UINT48, BASE_HEX, NULL, 0x00,
5941
15
            NULL, HFILL }},
5942
15
        { &hf_icmpv6_opt_6cio_flag_reserved,
5943
15
          { "Reserved", "icmpv6.opt.6cio.flag.reserved", FT_BOOLEAN, 48, TFS(&tfs_set_notset), ND_OPT_6CIO_FLAG_RESERVED,
5944
15
            NULL, HFILL }},
5945
15
        { &hf_icmpv6_opt_6cio_flag_f,
5946
15
          { "Prefix registration (F bit)", "icmpv6.opt.6cio.flag.f", FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), ND_OPT_6CIO_FLAG_F,
5947
15
            "Registration for prefixes supported (RFC9926)", HFILL }},
5948
15
        { &hf_icmpv6_opt_6cio_flag_g,
5949
15
          { "GHC (G bit)", "icmpv6.opt.6cio.flag.g", FT_BOOLEAN, 48, TFS(&tfs_capable_not_capable), ND_OPT_6CIO_FLAG_G,
5950
15
            "GHC capable (RFC7400)", HFILL }},
5951
15
        { &hf_icmpv6_opt_6cio_flag_e,
5952
15
          { "EARO (E bit)", "icmpv6.opt.6cio.flag.e", FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), ND_OPT_6CIO_FLAG_E,
5953
15
            "EARO support (RFC8505)", HFILL }},
5954
15
        { &hf_icmpv6_opt_6cio_flag_p,
5955
15
          { "Routing Registrar (P bit)", "icmpv6.opt.6cio.flag.p", FT_BOOLEAN, 48, TFS(&tfs_set_notset), ND_OPT_6CIO_FLAG_P,
5956
15
            "Routing Registrar (RFC8505)", HFILL }},
5957
15
        { &hf_icmpv6_opt_6cio_flag_b,
5958
15
          { "6LBR (B bit)", "icmpv6.opt.6cio.flag.b", FT_BOOLEAN, 48, TFS(&tfs_capable_not_capable), ND_OPT_6CIO_FLAG_B,
5959
15
            "6LBR capable (RFC8505)", HFILL }},
5960
15
        { &hf_icmpv6_opt_6cio_flag_l,
5961
15
          { "6LR (L bit)", "icmpv6.opt.6cio.flag.l", FT_BOOLEAN, 48, TFS(&tfs_capable_not_capable), ND_OPT_6CIO_FLAG_L,
5962
15
            "6LR capable (RFC8505)", HFILL }},
5963
15
        { &hf_icmpv6_opt_6cio_flag_d,
5964
15
          { "EDA (D bit)", "icmpv6.opt.6cio.flag.d", FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), ND_OPT_6CIO_FLAG_D,
5965
15
            "EDA Support (RFC8505)", HFILL }},
5966
15
        { &hf_icmpv6_opt_6cio_flag_a,
5967
15
          { "AP-ND (A bit)", "icmpv6.opt.6cio.flag.a", FT_BOOLEAN, 48, TFS(&tfs_enabled_disabled), ND_OPT_6CIO_FLAG_A,
5968
15
            "AP-ND Enabled (RFC8928)", HFILL }},
5969
15
        { &hf_icmpv6_opt_6cio_flag_x,
5970
15
          { "Address registration (X bit)", "icmpv6.opt.6cio.flag.x", FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), ND_OPT_6CIO_FLAG_X,
5971
15
            "Registration for Unicast, Multicast, and Anycast Addresses Supported (RFC9685)", HFILL }},
5972
15
        { &hf_icmpv6_opt_6cio_flag_experimental,
5973
15
          { "Reserved", "icmpv6.opt.6cio.flag.experimental", FT_BOOLEAN, 48, TFS(&tfs_set_notset), ND_OPT_6CIO_FLAG_EXPERIMENTAL,
5974
15
            NULL, HFILL }},
5975
5976
15
        { &hf_icmpv6_opt_captive_portal,
5977
15
           { "Captive Portal", "icmpv6.opt.captive_portal", FT_STRING, BASE_NONE, NULL, 0x00,
5978
15
             "The contact URI for the captive portal that the user should connect to", HFILL }},
5979
5980
15
        { &hf_icmpv6_opt_pref64_scaled_lifetime,
5981
15
          { "Scaled Lifetime", "icmpv6.opt.pref64.scaled_lifetime", FT_UINT16, BASE_DEC, NULL, ND_OPT_PREF64_SL,
5982
15
            "The maximum time in units of 8 seconds over which this NAT64 prefix MAY be used", HFILL }},
5983
15
        { &hf_icmpv6_opt_pref64_plc,
5984
15
          { "PLC (Prefix Length Code)", "icmpv6.opt.pref64.plc", FT_UINT16, BASE_HEX, VALS(pref64_plc_str), ND_OPT_PREF64_PLC,
5985
15
            "This field encodes the NAT64 Prefix Length", HFILL }},
5986
15
        { &hf_icmpv6_opt_pref64_prefix,
5987
15
          { "Prefix", "icmpv6.opt.pref64.prefix", FT_IPv6, BASE_NONE, NULL, 0x00,
5988
15
            "NAT64 Prefix", HFILL }},
5989
15
        { &hf_icmpv6_opt_dnr_svcpriority,
5990
15
          { "Service priority", "icmpv6.opt.dnr.svcpriority", FT_UINT16, BASE_DEC, NULL, 0x00,
5991
15
            "DNR service priority", HFILL }},
5992
15
        { &hf_icmpv6_opt_dnr_lifetime,
5993
15
          { "Lifetime", "icmpv6.opt.dnr.lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x00,
5994
15
            "DNR lifetime in seconds", HFILL }},
5995
15
        { &hf_icmpv6_opt_dnr_auth_domain_name_len,
5996
15
          { "Authentication domain name length", "icmpv6.opt.dnr.adn_len", FT_UINT16, BASE_DEC, NULL, 0x00,
5997
15
            "DNR authentication domain name length", HFILL }},
5998
15
        { &hf_icmpv6_opt_dnr_auth_domain_name,
5999
15
          { "Authentication domain name", "icmpv6.opt.dnr.adn", FT_STRING, BASE_NONE, NULL, 0x00,
6000
15
            "DNR authentication domain name", HFILL }},
6001
15
        { &hf_icmpv6_opt_dnr_addrs_len,
6002
15
          { "Addresses length", "icmpv6.opt.dnr.addrs_len", FT_UINT16, BASE_DEC, NULL, 0x00,
6003
15
            "DNR addresses length", HFILL }},
6004
15
        { &hf_icmpv6_opt_dnr_addrs,
6005
15
          { "Addresses", "icmpv6.opt.dnr.addrs", FT_NONE, BASE_NONE, NULL, 0x00,
6006
15
            "DNR address", HFILL }},
6007
15
        { &hf_icmpv6_opt_dnr_addrs_ip,
6008
15
          { "Address", "icmpv6.opt.dnr.addrs.ip", FT_IPv6, BASE_NONE, NULL, 0x00,
6009
15
            "DNR address", HFILL }},
6010
15
        { &hf_icmpv6_opt_dnr_svc_params_len,
6011
15
          { "SVC params length", "icmpv6.opt.dnr.svc_params_len", FT_UINT16, BASE_DEC, NULL, 0x00,
6012
15
            "DNR SVC params length", HFILL }},
6013
15
        { &hf_icmpv6_opt_dnr_padding,
6014
15
          { "Padding", "icmpv6.opt.dnr.padding", FT_BYTES, BASE_NONE, NULL, 0x00,
6015
15
            "DNR padding", HFILL }},
6016
6017
        /* RFC2710:  Multicast Listener Discovery for IPv6 */
6018
15
        { &hf_icmpv6_mld_mrd,
6019
15
          { "Maximum Response Delay [ms]", "icmpv6.mld.maximum_response_delay", FT_UINT16, BASE_DEC, NULL, 0x0,
6020
15
            "Specifies the maximum allowed delay before sending a responding Report, in units of milliseconds", HFILL }},
6021
15
        { &hf_icmpv6_mld_multicast_address,
6022
15
          { "Multicast Address", "icmpv6.mld.multicast_address", FT_IPv6, BASE_NONE, NULL, 0x0,
6023
15
            "Specific IPv6 multicast address", HFILL }},
6024
        /* RFC 2894: Router Renumbering for IPv6 */
6025
15
        { &hf_icmpv6_rr_sequencenumber,
6026
15
           { "Sequence Number", "icmpv6.rr.sequence_number", FT_UINT32, BASE_DEC, NULL, 0x0,
6027
15
             "The sequence number MUST be non-decreasing between Sequence Number Resets", HFILL }},
6028
15
        { &hf_icmpv6_rr_segmentnumber,
6029
15
           { "Segment Number", "icmpv6.rr.segment_number", FT_UINT8, BASE_DEC, NULL, 0x0,
6030
15
             "Enumerates different valid RR messages having the same Sequence Number", HFILL }},
6031
15
        { &hf_icmpv6_rr_flag,
6032
15
           { "Flags", "icmpv6.rr.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6033
15
             "Five are defined and three bits are reserved", HFILL }},
6034
15
        { &hf_icmpv6_rr_flag_t,
6035
15
           { "Test Command", "icmpv6.rr.flag.t", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RR_FLAG_T,
6036
15
             "Indicates a Test message: processing is to be simulated and no configuration changes are to be made", HFILL }},
6037
15
        { &hf_icmpv6_rr_flag_r,
6038
15
           { "Result requested", "icmpv6.rr.flag.r", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RR_FLAG_R,
6039
15
             "Indicates that the router send a Result message upon completion of processing the Command message", HFILL }},
6040
15
        { &hf_icmpv6_rr_flag_a,
6041
15
           { "All Interfaces", "icmpv6.rr.flag.a", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RR_FLAG_A,
6042
15
             "Indicates that the Command be applied to all interfaces regardless of administrative shutdown status", HFILL }},
6043
15
        { &hf_icmpv6_rr_flag_s,
6044
15
           { "Site-specific", "icmpv6.rr.flag.s", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RR_FLAG_S,
6045
15
             "Indicates that the Command be applied only to interfaces which belong to the same site as the interface to which the Command is addressed", HFILL }},
6046
15
        { &hf_icmpv6_rr_flag_p,
6047
15
           { "Processed previously", "icmpv6.rr.flag.p", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RR_FLAG_P,
6048
15
             "Indicates that the Command message was previously processed (and is not a Test) and the responding router is not processing it again", HFILL }},
6049
15
        { &hf_icmpv6_rr_flag_rsv,
6050
15
           { "Reserved", "icmpv6.rr.flag.rsv", FT_UINT8, BASE_DEC, NULL, RR_FLAG_RSV,
6051
15
             "Must be Zero", HFILL }},
6052
15
        { &hf_icmpv6_rr_maxdelay,
6053
15
           { "Max Delay", "icmpv6.rr.maxdelay", FT_UINT16, BASE_DEC, NULL, 0x0,
6054
15
             "Specifying the maximum time (in milliseconds) by which a router MUST delay sending any reply to this Command", HFILL }},
6055
6056
15
        { &hf_icmpv6_rr_pco_mp_part,
6057
15
           { "Match-Prefix Part", "icmpv6.rr.pco.mp", FT_NONE, BASE_NONE, NULL, 0x0,
6058
15
             NULL, HFILL }},
6059
15
        { &hf_icmpv6_rr_pco_mp_opcode,
6060
15
           { "OpCode", "icmpv6.rr.pco.mp.opcode", FT_UINT8, BASE_DEC, VALS(rr_pco_mp_opcode_val), 0x0,
6061
15
             "Specifying the operation to be performed when the associated MatchPrefix matches an interface's prefix or address", HFILL }},
6062
15
        { &hf_icmpv6_rr_pco_mp_oplength,
6063
15
           { "OpLength", "icmpv6.rr.pco.mp.oplength", FT_UINT8, BASE_DEC, NULL, 0x0,
6064
15
             "The total length of this Prefix Control Operation (in units of 8 octets)", HFILL }},
6065
15
        { &hf_icmpv6_rr_pco_mp_ordinal,
6066
15
           { "Ordinal", "icmpv6.rr.pco.mp.ordinal", FT_UINT8, BASE_HEX, NULL, 0x0,
6067
15
             "The value is otherwise unconstrained", HFILL }},
6068
15
        { &hf_icmpv6_rr_pco_mp_matchlen,
6069
15
           { "MatchLen", "icmpv6.rr.pco.mp.matchlen", FT_UINT8, BASE_DEC, NULL, 0x0,
6070
15
             "Between 0 and 128 inclusive specifying the number of initial bits of MatchPrefix which are significant in matching", HFILL }},
6071
15
        { &hf_icmpv6_rr_pco_mp_minlen,
6072
15
           { "MinLen", "icmpv6.rr.pco.mp.minlen", FT_UINT8, BASE_DEC, NULL, 0x0,
6073
15
             "Specifying the minimum length which any configured prefix must have in order to be eligible for testing against the MatchPrefix", HFILL }},
6074
15
        { &hf_icmpv6_rr_pco_mp_maxlen,
6075
15
           { "MaxLen", "icmpv6.rr.pco.mp.maxlen", FT_UINT8, BASE_DEC, NULL, 0x0,
6076
15
             "Specifying the maximum length which any configured prefix must have in order to be eligible for testing against the MatchPrefix", HFILL }},
6077
15
        { &hf_icmpv6_rr_pco_mp_matchprefix,
6078
15
           { "MatchPrefix", "icmpv6.rr.pco.mp.matchprefix", FT_IPv6, BASE_NONE, NULL, 0x0,
6079
15
             "The 128-bit prefix to be compared with each interface's prefix or address", HFILL }},
6080
15
        { &hf_icmpv6_rr_pco_up_part,
6081
15
           { "Use-Prefix Part", "icmpv6.rr.pco.up", FT_NONE, BASE_NONE, NULL, 0x0,
6082
15
             NULL, HFILL }},
6083
15
        { &hf_icmpv6_rr_pco_up_uselen,
6084
15
           { "UseLen", "icmpv6.rr.pco.up.uselen", FT_UINT8, BASE_DEC, NULL, 0x0,
6085
15
             "specifying the number of initial bits of UsePrefix to use in creating a new prefix for an interface", HFILL }},
6086
15
        { &hf_icmpv6_rr_pco_up_keeplen,
6087
15
           { "KeepLen", "icmpv6.rr.pco.up.keeplen", FT_UINT8, BASE_DEC, NULL, 0x0,
6088
15
             "Specifying the number of bits of the prefix or address which matched the associated Match-Prefix which should be retained in the new prefix", HFILL }},
6089
15
        { &hf_icmpv6_rr_pco_up_flagmask,
6090
15
           { "FlagMask", "icmpv6.rr.pco.up.flagmask", FT_UINT8, BASE_HEX, NULL, 0x0,
6091
15
             "A 1 bit in any position means that the corresponding flag bit in a Router Advertisement (RA) Prefix Information Option for the New Prefix should be set from the RAFlags field in this Use-Prefix Part", HFILL }},
6092
6093
15
        { &hf_icmpv6_rr_pco_up_flagmask_l,
6094
15
          { "On-link flag(L)", "icmpv6.rr.pco.up.flagmask.l", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80,
6095
15
            "When set, indicates the On-link (L) flag bit in a Router Advertisement (RA) Prefix Information Option for the New Prefix should be set from the RAFlags field in this Use-Prefix Part", HFILL }},
6096
15
        { &hf_icmpv6_rr_pco_up_flagmask_a,
6097
15
          { "Autonomous address-configuration flag(A)", "icmpv6.rr.pco.up.flagmask.a", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x40,
6098
15
            "When set, indicates the Autonomous address-configuration (A) flag bit in a Router Advertisement (RA) Prefix Information Option for the New Prefix should be set from the RAFlags field in this Use-Prefix Part", HFILL }},
6099
15
        { &hf_icmpv6_rr_pco_up_flagmask_reserved,
6100
15
          { "Reserved", "icmpv6.rr.pco.up.flagmask.reserved", FT_UINT8, BASE_DEC, NULL, 0x3f,
6101
15
            NULL, HFILL }},
6102
15
        { &hf_icmpv6_rr_pco_up_raflags,
6103
15
           { "RAFlags", "icmpv6.rr.pco.up.raflags", FT_UINT8, BASE_HEX, NULL, 0x0,
6104
15
             "Under control of the FlagMask field, may be used to initialize the flags in Router Advertisement Prefix Information Options  which advertise the New Prefix", HFILL }},
6105
15
        { &hf_icmpv6_rr_pco_up_raflags_l,
6106
15
          { "On-link flag(L)", "icmpv6.rr.pco.up.flagmask.l", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80,
6107
15
            "When set, indicates that this prefix can be used for on-link determination", HFILL }},
6108
15
        { &hf_icmpv6_rr_pco_up_raflags_a,
6109
15
          { "Autonomous address-configuration flag(A)", "icmpv6.rr.pco.up.flagmask.a", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x40,
6110
15
            "When set indicates that this prefix can be used for stateless address configuration", HFILL }},
6111
15
        { &hf_icmpv6_rr_pco_up_raflags_reserved,
6112
15
          { "Reserved", "icmpv6.rr.pco.up.flagmask.reserved", FT_UINT8, BASE_DEC, NULL, 0x3f,
6113
15
            NULL, HFILL }},
6114
15
        { &hf_icmpv6_rr_pco_up_validlifetime,
6115
15
           { "Valid Lifetime", "icmpv6.rr.pco.up.validlifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x0,
6116
15
             "The number of seconds for which the New Prefix will be valid", HFILL }},
6117
15
        { &hf_icmpv6_rr_pco_up_preferredlifetime,
6118
15
           { "Preferred Lifetime", "icmpv6.rr.pco.up.preferredlifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x0,
6119
15
             "The number of seconds for which the New Prefix will be preferred", HFILL }},
6120
15
        { &hf_icmpv6_rr_pco_up_flag,
6121
15
           { "Flags", "icmpv6.rr.pco.up.flag", FT_UINT32, BASE_HEX, NULL, 0x0,
6122
15
             NULL, HFILL }},
6123
15
        { &hf_icmpv6_rr_pco_up_flag_v,
6124
15
          { "Decrement valid lifetime", "icmpv6.rr.pco.up.flag.v", FT_BOOLEAN, 32, TFS(&tfs_set_notset), 0x80000000,
6125
15
            "When set, indicating that the valid lifetime of the New Prefix MUST be effectively decremented in real time", HFILL }},
6126
15
        { &hf_icmpv6_rr_pco_up_flag_p,
6127
15
          { "Decrement preferred lifetime", "icmpv6.rr.pco.up.flag.p", FT_BOOLEAN, 32, TFS(&tfs_set_notset), 0x40000000,
6128
15
            "When set, indicating that the preferred lifetime of the New Prefix MUST be effectively decremented in real time", HFILL }},
6129
15
        { &hf_icmpv6_rr_pco_up_flag_reserved,
6130
15
          { "Reserved", "icmpv6.rr.pco.up.flag.reserved", FT_UINT32, BASE_DEC, NULL, 0x3FFFFFFF,
6131
15
            NULL, HFILL }},
6132
15
        { &hf_icmpv6_rr_pco_up_useprefix,
6133
15
           { "UsePrefix", "icmpv6.rr.pco.up.useprefix", FT_IPv6, BASE_NONE, NULL, 0x0,
6134
15
             "The 128-bit Use-prefix which either becomes or is used in forming (if KeepLen is nonzero) the New Prefix", HFILL }},
6135
15
        { &hf_icmpv6_rr_rm,
6136
15
           { "Result Message", "icmpv6.rr.rm", FT_NONE, BASE_NONE, NULL, 0x0,
6137
15
             NULL, HFILL }},
6138
15
        { &hf_icmpv6_rr_rm_flag,
6139
15
           { "Flags", "icmpv6.rr.rm.flag", FT_UINT16, BASE_HEX, NULL, 0x0,
6140
15
             NULL, HFILL }},
6141
15
        { &hf_icmpv6_rr_rm_flag_b,
6142
15
          { "Bounds", "icmpv6.rr.rm.flag.b", FT_BOOLEAN, 16, TFS(&tfs_set_notset), 0x0002,
6143
15
            "When set, indicates that one or more fields in the associated PCO were out of bounds", HFILL }},
6144
15
        { &hf_icmpv6_rr_rm_flag_f,
6145
15
          { "Forbidden", "icmpv6.rr.rm.flag.f", FT_BOOLEAN, 16, TFS(&tfs_set_notset), 0x0001,
6146
15
            "When set, indicates that one or more Use-Prefix parts from the associated PCO were not honored by the router because of attempted formation of a forbidden prefix format, such as a multicast or loopback address", HFILL }},
6147
15
        { &hf_icmpv6_rr_rm_flag_reserved,
6148
15
          { "Reserved", "icmpv6.rr.rm.flag.reserved", FT_UINT16, BASE_DEC, NULL, 0xFFFC,
6149
15
            "Must be Zero", HFILL }},
6150
15
        { &hf_icmpv6_rr_rm_ordinal,
6151
15
           { "Ordinal", "icmpv6.rr.rm.ordinal", FT_UINT8, BASE_HEX, NULL, 0x0,
6152
15
             "The value is otherwise unconstrained", HFILL }},
6153
15
        { &hf_icmpv6_rr_rm_matchedlen,
6154
15
           { "MatchedLen", "icmpv6.rr.rm.matchedlen", FT_UINT8, BASE_DEC, NULL, 0x0,
6155
15
             "The length of the Matched Prefix", HFILL }},
6156
15
        { &hf_icmpv6_rr_rm_interfaceindex,
6157
15
           { "InterfaceIndex", "icmpv6.rr.rm.interfaceindex", FT_UINT32, BASE_DEC, NULL, 0x0,
6158
15
             "The router's numeric designation of the interface on which the MatchedPrefix was configured", HFILL }},
6159
15
        { &hf_icmpv6_rr_rm_matchedprefix,
6160
15
           { "MatchedPrefix", "icmpv6.rr.rm.matchedprefix", FT_IPv6, BASE_NONE, NULL, 0x0,
6161
15
             "The 128 Bits MatchedPrefix", HFILL }},
6162
6163
        /* RFC3775/6275: Mobility Support in IPv6 */
6164
15
        { &hf_icmpv6_mip6_identifier,
6165
15
          { "Identifier", "icmpv6.mip6.identifier", FT_UINT16, BASE_DEC_HEX, NULL, 0x0,
6166
15
            "An identifier to aid in matching with Request and Reply", HFILL }},
6167
15
        { &hf_icmpv6_mip6_home_agent_address,
6168
15
          { "Home Agent Address", "icmpv6.mip6.home_agent_address", FT_IPv6, BASE_NONE, NULL, 0x0,
6169
15
            "A list of addresses of home agents on the home link for the mobile node", HFILL }},
6170
15
        { &hf_icmpv6_mip6_flag,
6171
15
          { "Flags", "icmpv6.mip6.flag", FT_UINT16, BASE_HEX, NULL, 0x0,
6172
15
            NULL, HFILL }},
6173
15
        { &hf_icmpv6_mip6_flag_m,
6174
15
          { "Managed address configuration", "icmpv6.mip6.flag.m", FT_BOOLEAN, 16, TFS(&tfs_set_notset), FLAGS_MIP6_M,
6175
15
            "When set, it indicates that addresses are available via DHCPv6", HFILL }},
6176
15
        { &hf_icmpv6_mip6_flag_o,
6177
15
          { "Other configuration", "icmpv6.mip6.flag.o", FT_BOOLEAN, 16, TFS(&tfs_set_notset), FLAGS_MIP6_O,
6178
15
            "When set, it indicates that other configuration information is available via DHCPv6", HFILL }},
6179
15
        { &hf_icmpv6_mip6_flag_rsv,
6180
15
          { "Reserved", "icmpv6.mip6.flag.rsv", FT_UINT16, BASE_DEC, NULL, FLAGS_MIP6_RSV,
6181
15
            "Must be Zero", HFILL }},
6182
6183
        /* RFC3810: Multicast Listener Discovery Version 2 (MLDv2) for IPv6 */
6184
15
        { &hf_icmpv6_mld_mrc,
6185
15
          { "Maximum Response Code", "icmpv6.mld.maximum_response_code", FT_UINT16, BASE_DEC, NULL, 0x0,
6186
15
            "Specifies the maximum allowed delay before sending a responding Report", HFILL }},
6187
15
       { &hf_icmpv6_mld_flag,
6188
15
          { "Flags", "icmpv6.mld.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6189
15
            NULL, HFILL }},
6190
15
       { &hf_icmpv6_mld_flag_s,
6191
15
          { "Suppress Router-Side Processing", "icmpv6.mld.flag.s", FT_BOOLEAN, 8, NULL, MLD_FLAG_S,
6192
15
            "Indicates to any receiving multicast routers that they have to suppress the normal timer updates they perform upon hearing a Query", HFILL }},
6193
15
       { &hf_icmpv6_mld_flag_qrv,
6194
15
          { "QRV (Querier's Robustness Variable)", "icmpv6.mld.flag.qrv", FT_UINT8, BASE_DEC, NULL, MLD_FLAG_QRV,
6195
15
            "Contains the RV (Robustness Variable) value used by the Querier", HFILL }},
6196
15
       { &hf_icmpv6_mld_flag_rsv,
6197
15
          { "Reserved", "icmpv6.mld.flag.reserved", FT_UINT8, BASE_DEC, NULL, MLD_FLAG_RSV,
6198
15
            "Must Be Zero", HFILL }},
6199
15
       { &hf_icmpv6_mld_qqi,
6200
15
          { "QQIC (Querier's Query Interval Code)", "icmpv6.mld.qqi", FT_UINT8, BASE_DEC, NULL, 0x0,
6201
15
            "Specifies the QI (Query Interval) used by the Querier", HFILL }},
6202
15
       { &hf_icmpv6_mld_nb_sources,
6203
15
          { "Number of Sources", "icmpv6.mld.nb_sources", FT_UINT16, BASE_DEC, NULL, 0x0,
6204
15
            "Specifies how many source addresses are present in the Query", HFILL }},
6205
15
       { &hf_icmpv6_mld_source_address,
6206
15
          { "Source Address", "icmpv6.mld.source_address", FT_IPv6, BASE_NONE, NULL, 0x0,
6207
15
            "The Source Address fields are a vector of unicast addresses", HFILL }},
6208
15
        { &hf_icmpv6_mldr_nb_mcast_records,
6209
15
          { "Number of Multicast Address Records", "icmpv6.mldr.nb_mcast_records", FT_UINT16, BASE_DEC, NULL, 0x0,
6210
15
            "Specifies how many Multicast Address Records are present in this Report", HFILL }},
6211
15
        { &hf_icmpv6_mldr_mar,
6212
15
          { "Multicast Address Record", "icmpv6.mldr.mar", FT_NONE, BASE_NONE, NULL, 0x0,
6213
15
            "Each Multicast Address Record is a block of fields that contain information on the sender listening to a single multicast address on the interface from which the Report is sent", HFILL }},
6214
15
        { &hf_icmpv6_mldr_mar_record_type,
6215
15
          { "Record Type", "icmpv6.mldr.mar.record_type", FT_UINT8, BASE_DEC, VALS(mldr_record_type_val), 0x0,
6216
15
            "It specifies the type of the Multicast Address Record", HFILL }},
6217
15
        { &hf_icmpv6_mldr_mar_aux_data_len,
6218
15
          { "Aux Data Len", "icmpv6.mldr.mar.aux_data_len", FT_UINT8, BASE_DEC, NULL, 0x0,
6219
15
            "The Aux Data Len field contains the length (in units of 32-bit words) of the Auxiliary Data Field in this Multicast Address Record", HFILL }},
6220
15
        { &hf_icmpv6_mldr_mar_nb_sources,
6221
15
          { "Number of Sources", "icmpv6.mldr.mar.nb_sources", FT_UINT16, BASE_DEC, NULL, 0x0,
6222
15
            "The Number of Sources field specifies how many source addresses are present in this Multicast Address Record", HFILL }},
6223
15
        { &hf_icmpv6_mldr_mar_multicast_address,
6224
15
          { "Multicast Address", "icmpv6.mldr.mar.multicast_address", FT_IPv6, BASE_NONE, NULL, 0x0,
6225
15
            "The Multicast Address field contains the multicast address to which this Multicast Address Record pertains", HFILL }},
6226
15
        { &hf_icmpv6_mldr_mar_source_address,
6227
15
          { "Source Address", "icmpv6.mldr.mar.source_address", FT_IPv6, BASE_NONE, NULL, 0x0,
6228
15
            "The Source Address fields are a vector of unicast addresses", HFILL }},
6229
15
        { &hf_icmpv6_mldr_mar_auxiliary_data,
6230
15
          { "Auxiliary Data", "icmpv6.mldr.mar.auxiliary_data", FT_BYTES, BASE_NONE, NULL, 0x0,
6231
15
            "Contains additional information that pertain to this Multicast Address Record", HFILL }},
6232
        /* RFC 4068/5268/5568: Fast Handovers for Mobile IPv6 ( Mobile IPv6 Fast Handovers ) */
6233
15
        { &hf_icmpv6_fmip6_subtype,
6234
15
           { "Subtype", "icmpv6.fmip6.subtype", FT_UINT8, BASE_DEC, VALS(fmip6_subtype_val), 0x0,
6235
15
             "Designates the Subtype of information", HFILL }},
6236
15
        { &hf_icmpv6_fmip6_hi_flag,
6237
15
          { "Flag", "icmpv6.fmip6.hi.flag", FT_UINT8, BASE_HEX, NULL, 0x00,
6238
15
            NULL, HFILL }},
6239
15
        { &hf_icmpv6_fmip6_hi_flag_s,
6240
15
          { "Assigned address configuration", "icmpv6.fmip6.hi.flag.s", FT_BOOLEAN, 8, TFS(&tfs_set_notset), FMIP6_HI_FLAG_S,
6241
15
            "When set, this message requests a new CoA to be returned by the destination", HFILL }},
6242
15
        { &hf_icmpv6_fmip6_hi_flag_u,
6243
15
          { "Buffer", "icmpv6.fmip6.hi.flag.a", FT_BOOLEAN, 8, TFS(&tfs_set_notset), FMIP6_HI_FLAG_U,
6244
15
            "When set, the destination SHOULD buffer any packets toward the node indicated in the options of this message", HFILL }},
6245
15
        { &hf_icmpv6_fmip6_hi_flag_reserved,
6246
15
          { "Reserved", "icmpv6.fmip6.hi.flag.reserved", FT_UINT8, BASE_DEC, NULL, FMIP6_HI_FLAG_RSV,
6247
15
            NULL, HFILL }},
6248
15
        { &hf_icmpv6_fmip6_identifier,
6249
15
          { "Identifier", "icmpv6.fmip6.identifier", FT_UINT16, BASE_DEC_HEX, NULL, 0x0,
6250
15
            "An identifier to aid in matching with Request and Reply", HFILL }},
6251
6252
        /* RFC 4286: Multicast Router Discovery */
6253
15
        { &hf_icmpv6_mcast_ra_query_interval,
6254
15
          { "Query Interval", "icmpv6.mcast_ra.query_interval", FT_UINT16, BASE_DEC, NULL, 0x0,
6255
15
            "The Query Interval value (in seconds) in use by MLD on the interface.", HFILL }},
6256
15
        { &hf_icmpv6_mcast_ra_robustness_variable,
6257
15
          { "Robustness Variable", "icmpv6.mcast_ra.robustness_variable", FT_UINT16, BASE_DEC, NULL, 0x0,
6258
15
            "The Robustness Variable in use by MLD on the advertising interface", HFILL }},
6259
6260
        /* RFC 4620: IPv6 Node Information Queries */
6261
15
        { &hf_icmpv6_ni_qtype,
6262
15
           { "Qtype", "icmpv6.ni.qtype", FT_UINT16, BASE_DEC, VALS(ni_qtype_val), 0x0,
6263
15
             "Designates the type of information", HFILL }},
6264
15
        { &hf_icmpv6_ni_flag,
6265
15
           { "Flags", "icmpv6.ni.flag", FT_UINT16, BASE_HEX, NULL, 0x0,
6266
15
             "Qtype-specific flags that may be defined for certain Query types and their Replies", HFILL }},
6267
15
        { &hf_icmpv6_ni_flag_g,
6268
15
           { "Global-scope addresses", "icmpv6.ni.flag.g", FT_BOOLEAN, 16, TFS(&tfs_set_notset), NI_FLAG_G,
6269
15
             "Global-scope addresses are requested", HFILL }},
6270
15
        { &hf_icmpv6_ni_flag_s,
6271
15
           { "Site-local addresses", "icmpv6.ni.flag.s", FT_BOOLEAN, 16, TFS(&tfs_set_notset), NI_FLAG_S,
6272
15
             "Site-local addresses are requested", HFILL }},
6273
15
        { &hf_icmpv6_ni_flag_l,
6274
15
           { "Link-local addresses", "icmpv6.ni.flag.l", FT_BOOLEAN, 16, TFS(&tfs_set_notset), NI_FLAG_L,
6275
15
             "Link-local addresses are requested", HFILL }},
6276
15
        { &hf_icmpv6_ni_flag_c,
6277
15
           { "Compression", "icmpv6.ni.flag.c", FT_BOOLEAN, 16, TFS(&tfs_set_notset), NI_FLAG_C,
6278
15
             "IPv4-compatible (now deprecated) and IPv4-mapped addresses are requested", HFILL }},
6279
15
        { &hf_icmpv6_ni_flag_a,
6280
15
           { "Unicast Addresses", "icmpv6.ni.flag.a", FT_BOOLEAN, 16, TFS(&tfs_ni_flag_a), NI_FLAG_A,
6281
15
             "Responder's unicast addresses", HFILL }},
6282
15
        { &hf_icmpv6_ni_flag_t,
6283
15
           { "Truncated", "icmpv6.ni.flag.t", FT_BOOLEAN, 16, TFS(&tfs_set_notset), NI_FLAG_T,
6284
15
             "Defined in a Reply only, indicates that the set of addresses is incomplete for space reasons", HFILL }},
6285
15
        { &hf_icmpv6_ni_flag_rsv,
6286
15
           { "Reserved", "icmpv6.ni.flag.rsv", FT_UINT16, BASE_HEX, NULL, NI_FLAG_RSV,
6287
15
             "Must be Zero", HFILL }},
6288
15
        { &hf_icmpv6_ni_nonce,
6289
15
           { "Nonce", "icmpv6.ni.nonce", FT_UINT64, BASE_HEX, NULL, 0x0,
6290
15
             "An opaque 64-bit field", HFILL }},
6291
15
        { &hf_icmpv6_ni_query_subject_ipv6,
6292
15
           { "IPv6 subject address", "icmpv6.ni.query.subject_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
6293
15
             NULL, HFILL }},
6294
15
        { &hf_icmpv6_ni_query_subject_fqdn,
6295
15
           { "FQDN subject", "icmpv6.ni.query.subject_fqdn", FT_STRING, BASE_NONE, NULL, 0x0,
6296
15
             NULL, HFILL }},
6297
15
        { &hf_icmpv6_ni_query_subject_ipv4,
6298
15
           { "IPv4 subject address", "icmpv6.ni.query.subject_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
6299
15
             NULL, HFILL }},
6300
15
        { &hf_icmpv6_ni_reply_node_ttl,
6301
15
           { "TTL", "icmpv6.ni.reply.node_ttl", FT_UINT32, BASE_DEC, NULL, 0x0,
6302
15
             NULL, HFILL }},
6303
15
        { &hf_icmpv6_ni_reply_node_name,
6304
15
           { "Name Node", "icmpv6.ni.reply.node_name", FT_STRING, BASE_NONE, NULL, 0x0,
6305
15
             NULL, HFILL }},
6306
15
        { &hf_icmpv6_ni_reply_node_address,
6307
15
           { "IPv6 Node address", "icmpv6.ni.reply.node_address", FT_IPv6, BASE_NONE, NULL, 0x0,
6308
15
             NULL, HFILL }},
6309
15
        { &hf_icmpv6_ni_reply_ipv4_address,
6310
15
           { "IPv4 Node address", "icmpv6.ni.reply.ipv4_address", FT_IPv4, BASE_NONE, NULL, 0x0,
6311
15
             NULL, HFILL }},
6312
6313
        /* RFC 4884: Extended ICMP */
6314
15
        { &hf_icmpv6_length,
6315
15
          { "Length of original datagram", "icmpv6.length", FT_UINT8, BASE_DEC, NULL, 0x0,
6316
15
            "The length of the original datagram", HFILL }},
6317
6318
        /* RPL: RFC 6550 : Routing over Low-Power and Lossy Networks. */
6319
15
        { &hf_icmpv6_rpl_dis_flag,
6320
15
           { "Flags", "icmpv6.rpl.dis.flags", FT_UINT8, BASE_DEC, NULL, 0x0,
6321
15
             "8-bit unused field reserved for flags", HFILL }},
6322
15
        { &hf_icmpv6_rpl_dio_instance,
6323
15
           { "RPLInstanceID", "icmpv6.rpl.dio.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6324
15
             "Set by the DODAG root that indicates which RPL Instance the DODAG is part of", HFILL }},
6325
15
        { &hf_icmpv6_rpl_dio_version,
6326
15
           { "Version", "icmpv6.rpl.dio.version", FT_UINT8, BASE_DEC, NULL, 0x0,
6327
15
             "Set by the DODAG root to the DODAGVersionNumber", HFILL }},
6328
15
        { &hf_icmpv6_rpl_dio_rank,
6329
15
           { "Rank", "icmpv6.rpl.dio.rank", FT_UINT16, BASE_DEC, NULL, 0x0,
6330
15
             "Indicating the DODAG rank of the node sending the DIO message", HFILL }},
6331
15
        { &hf_icmpv6_rpl_dio_flag,
6332
15
           { "Flags", "icmpv6.rpl.dio.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6333
15
             NULL, HFILL }},
6334
15
        { &hf_icmpv6_rpl_dio_flag_g,
6335
15
           { "Grounded (G)", "icmpv6.rpl.dio.flag.g", FT_BOOLEAN, 8, NULL, RPL_DIO_FLAG_G,
6336
15
             "Indicates whether the DODAG advertised can satisfy the application-defined goal", HFILL }},
6337
15
        { &hf_icmpv6_rpl_dio_flag_0,
6338
15
           { "Zero", "icmpv6.rpl.dio.flag.0", FT_BOOLEAN, 8, NULL, RPL_DIO_FLAG_0,
6339
15
             NULL, HFILL }},
6340
15
        { &hf_icmpv6_rpl_dio_flag_mop,
6341
15
           { "Mode of Operation (MOP)", "icmpv6.rpl.dio.flag.mop", FT_UINT8, BASE_HEX, VALS(rpl_dio_map_val), RPL_DIO_FLAG_MOP,
6342
15
             "Identifies the mode of operation of the RPL Instance as administratively provisioned at and distributed by the DODAG Root", HFILL }},
6343
15
        { &hf_icmpv6_rpl_dio_flag_prf,
6344
15
           { "DODAG Preference", "icmpv6.rpl.dio.flag.preference", FT_UINT8, BASE_DEC, NULL, RPL_DIO_FLAG_PRF,
6345
15
             "Defines how preferable the root of this DODAG is compared to other DODAG roots within the instance", HFILL }},
6346
15
        { &hf_icmpv6_rpl_dio_dtsn,
6347
15
           { "Destination Advertisement Trigger Sequence Number (DTSN)", "icmpv6.rpl.dio.dtsn", FT_UINT8, BASE_DEC, NULL, 0x0,
6348
15
             "The DTSN is used as part of the procedure to maintain downward routes.", HFILL }},
6349
15
        { &hf_icmpv6_rpl_dio_dagid,
6350
15
           { "DODAGID", "icmpv6.rpl.dio.dagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6351
15
             "IPv6 address set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6352
15
        { &hf_icmpv6_rpl_dao_instance,
6353
15
           { "RPLInstanceID", "icmpv6.rpl.dao.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6354
15
             "Indicating the topology instance associated with the DODAG as learned from the DIO", HFILL }},
6355
15
        { &hf_icmpv6_rpl_dao_flag,
6356
15
           { "Flags", "icmpv6.rpl.dao.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6357
15
             NULL, HFILL }},
6358
15
        { &hf_icmpv6_rpl_dao_flag_k,
6359
15
           { "DAO-ACK Request (K)", "icmpv6.rpl.dao.flag.k", FT_BOOLEAN, 8, NULL, RPL_DAO_FLAG_K,
6360
15
             "Indicates that the recipient is expected to send a DAO-ACK back", HFILL }},
6361
15
        { &hf_icmpv6_rpl_dao_flag_d,
6362
15
           { "DODAGID Present (D)", "icmpv6.rpl.dao.flag.d", FT_BOOLEAN, 8, NULL, RPL_DAO_FLAG_D,
6363
15
             "Indicates that the DODAGID field is present", HFILL }},
6364
15
        { &hf_icmpv6_rpl_dao_flag_rsv,
6365
15
           { "Reserved", "icmpv6.rpl.dao.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_DAO_FLAG_RESERVED,
6366
15
             "Must be zero", HFILL }},
6367
15
        { &hf_icmpv6_rpl_dao_sequence,
6368
15
           { "DAO Sequence", "icmpv6.rpl.dao.sequence", FT_UINT8, BASE_DEC, NULL, 0x0,
6369
15
             "Incremented at each unique DAO message from a node and echoed in the DAO-ACK message", HFILL }},
6370
15
        { &hf_icmpv6_rpl_dao_dodagid,
6371
15
           { "DODAGID", "icmpv6.rpl.dao.dodagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6372
15
             "IPv6 address set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6373
15
        { &hf_icmpv6_rpl_daoack_instance,
6374
15
           { "RPLInstanceID", "icmpv6.rpl.daoack.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6375
15
             "Indicating the topology instance associated with the DODAG, as learned from the DIO", HFILL }},
6376
15
        { &hf_icmpv6_rpl_daoack_flag,
6377
15
           { "Flag", "icmpv6.rpl.daoack.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6378
15
             NULL, HFILL }},
6379
15
        { &hf_icmpv6_rpl_daoack_flag_d,
6380
15
           { "DODAGID Present (D)", "icmpv6.rpl.daoack.flag.d", FT_BOOLEAN, 8, NULL, RPL_DAOACK_FLAG_D,
6381
15
             "Indicates that the DODAGID field is present", HFILL }},
6382
15
        { &hf_icmpv6_rpl_daoack_flag_rsv,
6383
15
           { "Reserved", "icmpv6.rpl.daoack.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_DAOACK_FLAG_RESERVED,
6384
15
             "Must be zero", HFILL }},
6385
15
        { &hf_icmpv6_rpl_daoack_sequence,
6386
15
           { "DAO-ACK Sequence", "icmpv6.rpl.daoack.sequence", FT_UINT8, BASE_DEC, NULL, 0x0,
6387
15
             "Incremented at each DAO message from a node, and echoed in the DAO-ACK by the recipient", HFILL }},
6388
15
        { &hf_icmpv6_rpl_daoack_status,
6389
15
           { "Status", "icmpv6.rpl.daoack.status", FT_UINT8, BASE_DEC, NULL, 0x0,
6390
15
             "Indicates the completion", HFILL }},
6391
15
        { &hf_icmpv6_rpl_daoack_dodagid,
6392
15
           { "DODAGID", "icmpv6.rpl.daoack.dodagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6393
15
             "IPv6 address integer set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6394
15
        { &hf_icmpv6_rpl_dco_instance,
6395
15
           { "RPLInstanceID", "icmpv6.rpl.dco.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6396
15
             "Indicating the topology instance associated with the DODAG as learned from the DIO", HFILL }},
6397
15
        { &hf_icmpv6_rpl_dco_flags,
6398
15
           { "Flags", "icmpv6.rpl.dco.flags", FT_UINT8, BASE_HEX, NULL, 0x0,
6399
15
             NULL, HFILL }},
6400
15
        { &hf_icmpv6_rpl_dco_flag_k,
6401
15
           { "DCO-ACK Request (K)", "icmpv6.rpl.dco.flag.k", FT_BOOLEAN, 8, NULL, RPL_DCO_FLAG_K,
6402
15
             "Indicates that the recipient is expected to send a DCO-ACK back", HFILL }},
6403
15
        { &hf_icmpv6_rpl_dco_flag_d,
6404
15
           { "DODAGID Present (D)", "icmpv6.rpl.dco.flag.d", FT_BOOLEAN, 8, NULL, RPL_DCO_FLAG_D,
6405
15
             "Indicates that the DODAGID field is present", HFILL }},
6406
15
        { &hf_icmpv6_rpl_dco_flag_rsv,
6407
15
           { "Reserved", "icmpv6.rpl.dco.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_DCO_FLAG_RESERVED,
6408
15
             "Must be zero", HFILL }},
6409
15
        {&hf_icmpv6_rpl_dco_status,
6410
15
           {"RPL Status", "icmpv6.rpl.dco.status", FT_UINT8, BASE_DEC, NULL, 0x0,
6411
15
            "Set by the root common parent that generates the DCO, propagated unchanged", HFILL }},
6412
15
        { &hf_icmpv6_rpl_dco_sequence,
6413
15
           { "DCO Sequence", "icmpv6.rpl.dco.sequence", FT_UINT8, BASE_DEC, NULL, 0x0,
6414
15
             "Incremented at each unique DCO message from a node and echoed in the DCO-ACK message", HFILL }},
6415
15
        { &hf_icmpv6_rpl_dco_dodagid,
6416
15
           { "DODAGID", "icmpv6.rpl.dco.dodagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6417
15
             "IPv6 address set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6418
15
        { &hf_icmpv6_rpl_dcoack_instance,
6419
15
           { "RPLInstanceID", "icmpv6.rpl.dcoack.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6420
15
             "Indicating the topology instance associated with the DODAG, as learned from the DIO", HFILL }},
6421
15
        { &hf_icmpv6_rpl_dcoack_flag,
6422
15
           { "Flag", "icmpv6.rpl.dcoack.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6423
15
             NULL, HFILL }},
6424
15
        { &hf_icmpv6_rpl_dcoack_flag_d,
6425
15
           { "DODAGID Present (D)", "icmpv6.rpl.dcoack.flag.d", FT_BOOLEAN, 8, NULL, RPL_DCOACK_FLAG_D,
6426
15
             "Indicates that the DODAGID field is present", HFILL }},
6427
15
        { &hf_icmpv6_rpl_dcoack_flag_rsv,
6428
15
           { "Reserved", "icmpv6.rpl.dcoack.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_DCOACK_FLAG_RESERVED,
6429
15
             "Must be zero", HFILL }},
6430
15
        { &hf_icmpv6_rpl_dcoack_sequence,
6431
15
           { "DCO-ACK Sequence", "icmpv6.rpl.dcoack.sequence", FT_UINT8, BASE_DEC, NULL, 0x0,
6432
15
             "Incremented at each DCO message from a node, and echoed in the DCO-ACK by the recipient", HFILL }},
6433
15
        { &hf_icmpv6_rpl_dcoack_status,
6434
15
           { "Status", "icmpv6.rpl.dcoack.status", FT_UINT8, BASE_DEC, NULL, 0x0,
6435
15
             "Indicates the completion", HFILL }},
6436
15
        { &hf_icmpv6_rpl_dcoack_dodagid,
6437
15
           { "DODAGID", "icmpv6.rpl.dcoack.dodagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6438
15
             "IPv6 address integer set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6439
15
        { &hf_icmpv6_rpl_cc_instance,
6440
15
           { "RPLInstanceID", "icmpv6.rpl.cc.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6441
15
             "Indicating the topology instance associated with the DODAG, as learned from the DIO", HFILL }},
6442
15
        { &hf_icmpv6_rpl_cc_flag,
6443
15
           { "Flag", "icmpv6.rpl.cc.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6444
15
             NULL, HFILL }},
6445
15
        { &hf_icmpv6_rpl_cc_flag_r,
6446
15
           { "Response (R)", "icmpv6.rpl.cc.flag.r", FT_BOOLEAN, 8, NULL, RPL_CC_FLAG_R,
6447
15
             "Indicates whether the CC message is a response", HFILL }},
6448
15
        { &hf_icmpv6_rpl_cc_flag_rsv,
6449
15
           { "Reserved", "icmpv6.rpl.cc.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_CC_FLAG_RESERVED,
6450
15
             "Must be zero", HFILL }},
6451
15
        { &hf_icmpv6_rpl_cc_nonce,
6452
15
           { "CC Nonce", "icmpv6.rpl.cc.nonce", FT_UINT16, BASE_HEX, NULL, 0x0,
6453
15
             "The corresponding CC response includes the same CC nonce value as the request, as learned from the DIO", HFILL }},
6454
15
        { &hf_icmpv6_rpl_cc_dodagid,
6455
15
           { "DODAGID", "icmpv6.rpl.cc.dodagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6456
15
             "IPv6 address integer set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6457
15
        { &hf_icmpv6_rpl_cc_destination_counter,
6458
15
           { "Destination Counter", "icmpv6.rpl.cc.destination_counter", FT_UINT32, BASE_DEC, NULL, 0x0,
6459
15
             "Indicating the sender's estimate of the destination's current security Counter value", HFILL }},
6460
15
        { &hf_icmpv6_rpl_secure_flag,
6461
15
           { "Flags", "icmpv6.rpl.secure.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6462
15
             NULL, HFILL }},
6463
15
        { &hf_icmpv6_rpl_secure_flag_t,
6464
15
           { "Counter is Time (T)", "icmpv6.rpl.secure.flag.t", FT_BOOLEAN, 8, NULL, RPL_SECURE_FLAG_T,
6465
15
             "If it is set then the Counter field is a timestamp", HFILL }},
6466
15
        { &hf_icmpv6_rpl_secure_flag_rsv,
6467
15
           { "Reserved", "icmpv6.rpl.secure.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_SECURE_FLAG_RSV,
6468
15
             "Must be zero", HFILL }},
6469
15
        { &hf_icmpv6_rpl_secure_algorithm,
6470
15
           { "Algorithm", "icmpv6.rpl.secure.algorithm", FT_UINT8, BASE_DEC, VALS(rpl_secure_algorithm_vals), 0x0,
6471
15
             "The Security Algorithm field specifies the encryption, MAC, and signature scheme the network uses", HFILL }},
6472
15
        { &hf_icmpv6_rpl_secure_kim,
6473
15
           { "Key Identifier Mode (KIM)", "icmpv6.rpl.secure.kim", FT_UINT8, BASE_DEC, NULL, RPL_SECURE_KIM,
6474
15
             "That indicates whether the key used for packet protection is determined implicitly or explicitly and indicates the particular representation of the Key Identifier field", HFILL }},
6475
15
        { &hf_icmpv6_rpl_secure_lvl,
6476
15
           { "Security Level (LVL)", "icmpv6.rpl.secure.lvl", FT_UINT8, BASE_DEC, NULL, RPL_SECURE_LVL,
6477
15
             "Indicates the provided packet protection", HFILL }},
6478
15
        { &hf_icmpv6_rpl_secure_rsv,
6479
15
           { "Reserved", "icmpv6.rpl.secure.rsv", FT_UINT8, BASE_DEC, NULL, RPL_SECURE_RSV,
6480
15
             "Must be zero", HFILL }},
6481
15
        { &hf_icmpv6_rpl_secure_counter,
6482
15
           { "Counter", "icmpv6.rpl.secure.counter", FT_UINT32, BASE_DEC, NULL, 0x0,
6483
15
             "Indicates the non-repeating 4-octet value used to construct the cryptographic mechanism that implements packet protection and allows for the provision of semantic security", HFILL }},
6484
15
        { &hf_icmpv6_rpl_secure_key_source,
6485
15
           { "Key Source", "icmpv6.rpl.secure.key.source", FT_BYTES, BASE_NONE, NULL, 0x0,
6486
15
             "Indicates the logical identifier of the originator of a group key", HFILL }},
6487
15
        { &hf_icmpv6_rpl_secure_key_index,
6488
15
           { "Key Source", "icmpv6.rpl.secure.key.index", FT_UINT8, BASE_DEC, NULL, 0x0,
6489
15
             "Allows unique identification of different keys with the same originator", HFILL }},
6490
15
        { &hf_icmpv6_rpl_opt,
6491
15
          { "ICMPv6 RPL Option", "icmpv6.opt", FT_NONE, BASE_NONE, NULL, 0x0,
6492
15
            NULL, HFILL }},
6493
15
        { &hf_icmpv6_rpl_opt_type,
6494
15
          { "Type", "icmpv6.rpl.opt.type", FT_UINT8, BASE_DEC, VALS(rpl_option_vals), 0x0,
6495
15
            "Options type", HFILL }},
6496
15
        { &hf_icmpv6_rpl_opt_length,
6497
15
          { "Length", "icmpv6.rpl.opt.length", FT_UINT8, BASE_DEC, NULL, 0x0,
6498
15
            "The length of the option in octets excluding the Type and Length fields", HFILL }},
6499
15
        { &hf_icmpv6_rpl_opt_reserved,
6500
15
          { "Reserved", "icmpv6.rpl.opt.reserved", FT_NONE, BASE_NONE, NULL, 0x0,
6501
15
            "Reserved (Must be 0)", HFILL }},
6502
15
        { &hf_icmpv6_rpl_opt_padn,
6503
15
          { "Paddn", "icmpv6.rpl.opt.padn", FT_NONE, BASE_NONE, NULL, 0x0,
6504
15
            "Padding (Must be 0)", HFILL }},
6505
15
        { &hf_icmpv6_rpl_opt_metric_type,
6506
15
          { "Routing Metric/Constraint Type", "icmpv6.rpl.opt.metric.type", FT_UINT8, BASE_DEC, VALS(rpl_metric_vals), 0x0,
6507
15
            "The Routing Metric/Constraint Type field uniquely identifies each Routing Metric/Constraint object. RFC 6551", HFILL }},
6508
15
        { &hf_icmpv6_rpl_opt_metric_flags,
6509
15
          { "Flags","icmpv6.rpl.opt.metric.flags", FT_UINT16, BASE_HEX, NULL, 0x0,
6510
15
            NULL, HFILL }},
6511
15
        { &hf_icmpv6_rpl_opt_metric_reserved,
6512
15
          { "Reserved Flags","icmpv6.rpl.opt.metric.reserved", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_RESERVED,
6513
15
            "Reserved (Must be Zero)", HFILL }},
6514
15
        { &hf_icmpv6_rpl_opt_metric_flag_p,
6515
15
          { "Flag P","icmpv6.rpl.opt.metric.flag.p", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_FLAG_P,
6516
15
            "Only used for recorded metrics.  When cleared, all nodes along the path successfully recorded the corresponding metric. When set, this indicates that one or several nodes along the path could not record the metric", HFILL }},
6517
15
        { &hf_icmpv6_rpl_opt_metric_flag_c,
6518
15
          { "Flag C","icmpv6.rpl.opt.metric.flag.c", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_FLAG_C,
6519
15
            "When set, this indicates that the object refers to a routing constraint. When cleared, the object refers to a routing metric.", HFILL }},
6520
15
        { &hf_icmpv6_rpl_opt_metric_flag_o,
6521
15
          { "Flag O","icmpv6.rpl.opt.metric.flag.o", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_FLAG_O,
6522
15
            "Used exclusively for routing constraints. When set, this indicates that the constraint is optional. When cleared, the constraint is mandatory.", HFILL }},
6523
15
        { &hf_icmpv6_rpl_opt_metric_flag_r,
6524
15
          { "Flag R","icmpv6.rpl.opt.metric.flag.r", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_FLAG_R,
6525
15
            "Only relevant for a routing metric. When set, this indicates that the routing metric is recorded along the path. When cleared, the routing metric is aggregated", HFILL }},
6526
15
        { &hf_icmpv6_rpl_opt_metric_a,
6527
15
          { "A Field","icmpv6.rpl.opt.metric.flag.a", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_A,
6528
15
            "Only relevant for metrics, it indicates whether the aggregated routing metric is additive, is multiplicative, reports a maximum, or reports a minimum", HFILL }},
6529
15
        { &hf_icmpv6_rpl_opt_metric_prec,
6530
15
          { "Precedence field","icmpv6.rpl.opt.metric.prec", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_PREC,
6531
15
            "It indicates the precedence of this Routing Metric/Constraint object relative to other objects in the container", HFILL }},
6532
15
        { &hf_icmpv6_rpl_opt_metric_len,
6533
15
          { "Metric Length", "icmpv6.rpl.opt.metric.length", FT_UINT8, BASE_DEC, NULL, 0x0,
6534
15
            "The length of the object body, expressed in bytes.", HFILL }},
6535
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object,
6536
15
          { "Node State and Attribute Object","icmpv6.rpl.opt.metric.nsa.object", FT_UINT16, BASE_HEX, NULL, 0x0,
6537
15
            NULL, HFILL }},
6538
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_reserved,
6539
15
          { "Reserved field","icmpv6.rpl.opt.metric.nsa.object.reserved", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_NSA_OBJECT_RESERVED,
6540
15
            "Reserved (Must be Zero)", HFILL }},
6541
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_flags,
6542
15
          { "Flags","icmpv6.rpl.opt.metric.nsa.object.flags", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_NSA_OBJECT_FLAGS,
6543
15
            "Unspecified flags (Must be Zero)", HFILL }},
6544
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_flag_a,
6545
15
          { "Flag A", "icmpv6.rpl.opt.metric.nsa.object.flag.a", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_NSA_OBJECT_FLAG_A,
6546
15
            "When set, this indicates that the node can act as a traffic aggregator.", HFILL }},
6547
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_flag_o,
6548
15
          { "Flag O", "icmpv6.rpl.opt.metric.nsa.object.flag.o", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_NSA_OBJECT_FLAG_O,
6549
15
            "When set, this indicates that the node is overloaded and may not be able to process traffic.", HFILL }},
6550
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object,
6551
15
          { "Node State and Attribute Optional TLV", "icmpv6.rpl.opt.metric.nsa.object.opttlv.object", FT_UINT8, BASE_DEC, NULL, 0x0,
6552
15
            "Optional TLV.", HFILL }},
6553
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_type,
6554
15
          { "Node State and Attribute Optional TLV Type", "icmpv6.rpl.opt.metric.nsa.object.opttlv.object.type", FT_UINT8, BASE_DEC, NULL, 0x0,
6555
15
            "Optional TLV type.", HFILL }},
6556
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_length,
6557
15
          { "Node State and Attribute Optional TLV Length", "icmpv6.rpl.opt.metric.nsa.object.opttlv.object.length", FT_UINT8, BASE_DEC, NULL, 0x0,
6558
15
            "The length of the option in octets excluding the Type and Length fields", HFILL }},
6559
15
        { &hf_icmpv6_rpl_opt_metric_nsa_object_opttlv_object_data,
6560
15
          { "Raw Data", "icmpv6.rpl.opt.metric.nsa.object.opttlv.object.data", FT_BYTES, BASE_NONE, NULL, 0x0,
6561
15
            "The raw data in the TLV", HFILL }},
6562
15
        { &hf_icmpv6_rpl_opt_metric_ne_object,
6563
15
          { "Node Energy Object","icmpv6.rpl.opt.metric.ne.object", FT_UINT16, BASE_HEX, NULL, 0x0,
6564
15
            NULL, HFILL }},
6565
15
        { &hf_icmpv6_rpl_opt_metric_ne_object_flags,
6566
15
          { "Flags field","icmpv6.rpl.opt.metric.ne.object.flags", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_NE_OBJECT_FLAGS,
6567
15
            "Unspecified flags (Must be Zero)", HFILL }},
6568
15
        { &hf_icmpv6_rpl_opt_metric_ne_object_flag_i,
6569
15
          { "Flag I","icmpv6.rpl.opt.metric.ne.object.flag.i", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_NE_OBJECT_FLAG_I,
6570
15
            "Only relevant when the node type is used as a constraint. When set, this indicates that nodes of the type specified in the node type field MUST be included", HFILL }},
6571
15
        { &hf_icmpv6_rpl_opt_metric_ne_object_type,
6572
15
          { "Type", "icmpv6.rpl.opt.metric.ne.object.type", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_NE_OBJECT_TYPE,
6573
15
            "T=0 designates a mains-powered node, T=1 a battery-powered node, and T=2 a node powered by an energy scavenger.", HFILL }},
6574
15
        { &hf_icmpv6_rpl_opt_metric_ne_object_flag_e,
6575
15
          { "Flag E", "icmpv6.rpl.opt.metric.ne.object.flag.e", FT_BOOLEAN, 16, TFS(&tfs_set_notset), RPL_METRIC_NE_OBJECT_FLAG_E,
6576
15
            "When the 'E' bit is set for a metric, the estimated percentage of remaining energy on the node is indicated in the Energy 8-bit field. When cleared, the estimated percentage of remaining energy is not provided. When the 'E' bit is set for a constraint, the E_E field defines a threshold for the inclusion/exclusion: if an inclusion, nodes with values higher than the threshold are to be included; if an exclusion, nodes with values lower than the threshold are to be excluded.", HFILL }},
6577
15
        { &hf_icmpv6_rpl_opt_metric_ne_object_energy,
6578
15
          { "Energy", "icmpv6.rpl.opt.metric.ne.object.energy", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_NE_OBJECT_ENERGY,
6579
15
            "8-bit unsigned integer field indicating an estimated percentage of remaining energy. The Energy field is only relevant when the 'E' flag is set, and it MUST be set to 0 when the 'E' flag is cleared.", HFILL }},
6580
15
        { &hf_icmpv6_rpl_opt_metric_hp_object,
6581
15
          { "Hop Count Object","icmpv6.rpl.opt.metric.hp.object", FT_UINT16, BASE_HEX, NULL, 0x0,
6582
15
            NULL, HFILL }},
6583
15
        { &hf_icmpv6_rpl_opt_metric_hp_object_reserved,
6584
15
          { "Reserved field","icmpv6.rpl.opt.metric.hp.object.reserved", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_HP_OBJECT_RESERVED,
6585
15
            "Reserved (Must be Zero)", HFILL }},
6586
15
        { &hf_icmpv6_rpl_opt_metric_hp_object_flags,
6587
15
          { "Flags","icmpv6.rpl.opt.metric.hp.object.flags", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_HP_OBJECT_FLAGS,
6588
15
            "Reserved (Must be Zero)", HFILL }},
6589
15
        { &hf_icmpv6_rpl_opt_metric_hp_object_hp,
6590
15
          { "Hop Count", "icmpv6.rpl.opt.metric.hp.object.hp", FT_UINT16, BASE_DEC, NULL, RPL_METRIC_HP_OBJECT_HP,
6591
15
            "When used as a constraint, the DAG root indicates the maximum number of hops that a path may traverse. When used as a metric, each visited node simply increments the Hop Count field.", HFILL }},
6592
15
        { &hf_icmpv6_rpl_opt_metric_lt_object_lt,
6593
15
          { "Link Throughput", "icmpv6.rpl.opt.metric.lt.object.lt", FT_UINT32, BASE_DEC, NULL, 0x0,
6594
15
            "The Throughput metric is the effective bit rate of a link.", HFILL }},
6595
15
        { &hf_icmpv6_rpl_opt_metric_ll_object_ll,
6596
15
          { "Link Latency", "icmpv6.rpl.opt.metric.ll.object.ll", FT_UINT32, BASE_DEC, NULL, 0x0,
6597
15
            "The Latency is encoded in 32 bits in unsigned integer format, expressed in microseconds.", HFILL }},
6598
15
        { &hf_icmpv6_rpl_opt_metric_lql_object,
6599
15
          { "Link Quality Level Object","icmpv6.rpl.opt.metric.lql.object", FT_UINT8, BASE_HEX, NULL, 0x0,
6600
15
            NULL, HFILL }},
6601
15
        { &hf_icmpv6_rpl_opt_metric_lql_object_res,
6602
15
          { "Reserved field","icmpv6.rpl.opt.metric.lql.object.res", FT_UINT8, BASE_HEX, NULL, RPL_METRIC_LQL_OBJECT_RES,
6603
15
            "Reserved (Must be Zero)", HFILL }},
6604
15
        { &hf_icmpv6_rpl_opt_metric_lql_object_val,
6605
15
          { "Val(ue)","icmpv6.rpl.opt.metric.lql.object.val", FT_UINT8, BASE_HEX, NULL, RPL_METRIC_LQL_OBJECT_VAL,
6606
15
            "LQL value from 0 to 7 where 0 means undetermined and 1 indicates the highest link quality.", HFILL }},
6607
15
        { &hf_icmpv6_rpl_opt_metric_lql_object_counter,
6608
15
          { "Counter", "icmpv6.rpl.opt.metric.lql.object.counter", FT_UINT8, BASE_DEC, NULL, RPL_METRIC_LQL_OBJECT_COUNTER,
6609
15
            "The Counter represents the number of links with that value.", HFILL }},
6610
15
        { &hf_icmpv6_rpl_opt_metric_etx_object_etx,
6611
15
          { "ETX", "icmpv6.rpl.opt.metric.etx.object.etx", FT_UINT16, BASE_DEC, NULL, 0x0,
6612
15
            "The ETX metric is the number of transmissions a node expects to make to a destination in order to successfully deliver a packet.", HFILL }},
6613
15
        { &hf_icmpv6_rpl_opt_metric_lc_object,
6614
15
          { "Link Color Object","icmpv6.rpl.opt.metric.lc.object", FT_NONE, BASE_NONE, NULL, 0x0,
6615
15
            NULL, HFILL }},
6616
15
        { &hf_icmpv6_rpl_opt_metric_lc_object_res,
6617
15
          { "Reserved field","icmpv6.rpl.opt.metric.lc.object.res", FT_UINT8, BASE_HEX, NULL, RPL_METRIC_LC_OBJECT_RES,
6618
15
            "Reserved (Must be Zero)", HFILL }},
6619
15
        { &hf_icmpv6_rpl_opt_metric_lc_object_lc,
6620
15
          { "Link Color","icmpv6.rpl.opt.metric.lc.object.lc", FT_UINT16, BASE_HEX, NULL, RPL_METRIC_LC_OBJECT_LC,
6621
15
            "The Link Color (LC) object is an administrative 10-bit link constraint used to avoid or attract specific links for specific traffic types.", HFILL }},
6622
15
        { &hf_icmpv6_rpl_opt_metric_lc_object_counter,
6623
15
          { "Counter", "icmpv6.rpl.opt.metric.lc.object.counter", FT_UINT16, BASE_DEC, NULL, RPL_METRIC_LC_OBJECT_COUNTER,
6624
15
            "The Counter is used to compress the information where the number of links for each Link Color is reported.", HFILL }},
6625
15
        { &hf_icmpv6_rpl_opt_metric_lc_object_reserved,
6626
15
          { "Reserved", "icmpv6.rpl.opt.metric.lc.object.reserved", FT_UINT16, BASE_DEC, NULL, RPL_METRIC_LC_OBJECT_RESERVED,
6627
15
            "Reserved (Must be Zero).", HFILL }},
6628
15
        { &hf_icmpv6_rpl_opt_metric_lc_object_flag_i,
6629
15
          { "Flag I", "icmpv6.rpl.opt.metric.lc.object.flag.i", FT_UINT16, BASE_DEC, NULL, RPL_METRIC_LC_OBJECT_FLAG_I,
6630
15
            "The 'I' bit is only relevant when the Link Color is used as a constraint. When set, this indicates that links with the specified color must be included.", HFILL }},
6631
15
        { &hf_icmpv6_rpl_opt_route_prefix_length,
6632
15
           { "Prefix Length", "icmpv6.rpl.opt.route.prefix_length", FT_UINT8, BASE_DEC, NULL, 0x0,
6633
15
             "The number of leading bits in the Prefix that are valid", HFILL }},
6634
15
        { &hf_icmpv6_rpl_opt_route_flag,
6635
15
           { "Flag","icmpv6.rpl.opt.route.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6636
15
             NULL, HFILL }},
6637
15
        { &hf_icmpv6_rpl_opt_route_pref,
6638
15
           { "Preference","icmpv6.rpl.opt.route.pref", FT_UINT8, BASE_DEC, VALS(nd_flag_router_pref), RPL_OPT_ROUTE_PREFERENCE,
6639
15
             "The Route Preference indicates whether to prefer the router associated with this prefix over others, when multiple identical prefixes (for different routers) have been received", HFILL }},
6640
15
        { &hf_icmpv6_rpl_opt_route_reserved,
6641
15
           { "Reserved","icmpv6.rpl.opt.route.reserved", FT_UINT8, BASE_DEC, NULL, RPL_OPT_ROUTE_RESERVED,
6642
15
             "Reserved (Must be Zero)", HFILL }},
6643
15
        { &hf_icmpv6_rpl_opt_route_lifetime,
6644
15
           { "Route Lifetime", "icmpv6.rpl.opt.route.lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x0,
6645
15
             "The length of time in seconds (relative to the time the packet is sent) that the prefix is valid for route determination", HFILL }},
6646
15
        { &hf_icmpv6_rpl_opt_route_prefix,
6647
15
           { "Prefix", "icmpv6.rpl.opt.route.prefix", FT_IPv6, BASE_NONE, NULL, 0x0,
6648
15
             "Variable-length field containing an IP address or a prefix of an IPv6 address", HFILL }},
6649
15
        { &hf_icmpv6_rpl_opt_config_flag,
6650
15
           { "Flag","icmpv6.rpl.opt.config.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6651
15
             NULL, HFILL }},
6652
15
        { &hf_icmpv6_rpl_opt_config_reserved,
6653
15
           { "Reserved","icmpv6.rpl.opt.config.reserved", FT_UINT8, BASE_DEC, NULL, RPL_OPT_CONFIG_FLAG_RESERVED,
6654
15
             "Must be Zero", HFILL }},
6655
15
        { &hf_icmpv6_rpl_opt_config_auth,
6656
15
           { "Authentication Enabled","icmpv6.rpl.opt.config.auth", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RPL_OPT_CONFIG_FLAG_AUTH,
6657
15
             "One bit flag describing the security mode of the network", HFILL }},
6658
15
        { &hf_icmpv6_rpl_opt_config_pcs,
6659
15
           { "Path Control Size", "icmpv6.rpl.opt.config.pcs", FT_UINT8, BASE_DEC, NULL, RPL_OPT_CONFIG_FLAG_PCS,
6660
15
             "Used to configure the number of bits that may be allocated to the Path Control field", HFILL }},
6661
15
        { &hf_icmpv6_rpl_opt_config_doublings,
6662
15
           { "DIOIntervalDoublings","icmpv6.rpl.opt.config.interval_double", FT_UINT8, BASE_DEC, NULL, 0x0,
6663
15
             "Used to configure Imax of the DIO trickle timer", HFILL }},
6664
15
        { &hf_icmpv6_rpl_opt_config_min_interval,
6665
15
           { "DIOIntervalMin", "icmpv6.rpl.opt.config.interval_min", FT_UINT16, BASE_DEC, NULL, 0x0,
6666
15
             "Used to configure Imin of the DIO trickle timer", HFILL }},
6667
15
        { &hf_icmpv6_rpl_opt_config_redundancy,
6668
15
           { "DIORedundancyConstant", "icmpv6.rpl.opt.config.redundancy", FT_UINT8, BASE_DEC, NULL, 0x0,
6669
15
             "Used to configure k of the DIO trickle timer", HFILL }},
6670
15
        { &hf_icmpv6_rpl_opt_config_rank_incr,
6671
15
           { "MaxRankInc", "icmpv6.rpl.opt.config.max_rank_inc", FT_UINT16, BASE_DEC, NULL, 0x0,
6672
15
             "Used to configure DAGMaxRankIncrease", HFILL }},
6673
15
        { &hf_icmpv6_rpl_opt_config_hop_rank_inc,
6674
15
           { "MinHopRankInc", "icmpv6.rpl.opt.config.min_hop_rank_inc", FT_UINT16, BASE_DEC, NULL, 0x0,
6675
15
              "Used to configure MinHopRankIncrease", HFILL }},
6676
15
        { &hf_icmpv6_rpl_opt_config_ocp,
6677
15
           { "OCP (Objective Code Point)","icmpv6.rpl.opt.config.ocp", FT_UINT16, BASE_DEC, VALS(rpl_ocp_vals), 0x0,
6678
15
              "The OCP field identifies the OF and is managed by the IANA", HFILL }},
6679
15
        { &hf_icmpv6_rpl_opt_config_rsv,
6680
15
           { "Reserved", "icmpv6.rpl.opt.config.rsv", FT_UINT8, BASE_DEC, NULL, 0x0,
6681
15
              NULL, HFILL }},
6682
15
        { &hf_icmpv6_rpl_opt_config_def_lifetime,
6683
15
           { "Default Lifetime", "icmpv6.rpl.opt.config.def_lifetime", FT_UINT8, BASE_DEC, NULL, 0x0,
6684
15
              "This is the lifetime that is used as default for all RPL routes", HFILL }},
6685
15
        { &hf_icmpv6_rpl_opt_config_lifetime_unit,
6686
15
           { "Lifetime Unit", "icmpv6.rpl.opt.config.lifetime_unit", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0,
6687
15
              "Provides the unit in seconds that is used to express route lifetimes in RPL", HFILL }},
6688
15
        { &hf_icmpv6_rpl_opt_target_flag,
6689
15
           { "Reserved", "icmpv6.rpl.opt.target.flag", FT_NONE, BASE_NONE, NULL, 0x0,
6690
15
              "Unused field reserved for flags", HFILL }},
6691
15
        { &hf_icmpv6_rpl_opt_target_prefix_length,
6692
15
           { "Target Length", "icmpv6.rpl.opt.target.prefix_length", FT_UINT8, BASE_DEC, NULL, 0x0,
6693
15
              "Number of valid leading bits in the IPv6 Prefix", HFILL }},
6694
15
        { &hf_icmpv6_rpl_opt_target_prefix,
6695
15
           { "Target", "icmpv6.rpl.opt.target.prefix", FT_IPv6, BASE_NONE, NULL, 0x0,
6696
15
              "Identifying an IPv6 destination address, prefix, or multicast group", HFILL }},
6697
15
        { &hf_icmpv6_rpl_opt_transit_flag,
6698
15
           { "Flags", "icmpv6.rpl.opt.transit.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6699
15
             NULL, HFILL }},
6700
15
         { &hf_icmpv6_rpl_opt_transit_flag_e,
6701
15
           { "External", "icmpv6.rpl.opt.transit.flag.e", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RPL_OPT_TRANSIT_FLAG_E,
6702
15
             "Indicate that the parent router redistributes external targets into the RPL network", HFILL }},
6703
15
         { &hf_icmpv6_rpl_opt_transit_flag_i,
6704
15
           { "InvalidatePreviousRoute", "icmpv6.rpl.opt.transit.flag.i", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RPL_OPT_TRANSIT_FLAG_I,
6705
15
             "Indicate to the common ancestor that it wishes to invalidate any previous route between the two paths", HFILL }},
6706
15
         { &hf_icmpv6_rpl_opt_transit_flag_rsv,
6707
15
           { "Reserved", "icmpv6.rpl.opt.transit.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_OPT_TRANSIT_FLAG_RSV,
6708
15
             "Must be Zero", HFILL }},
6709
15
        { &hf_icmpv6_rpl_opt_transit_pathctl,
6710
15
           { "Path Control", "icmpv6.rpl.opt.transit.pathctl", FT_UINT8, BASE_HEX, NULL, 0x0,
6711
15
              "Limits the number of DAO-Parents to which a DAO message advertising connectivity", HFILL }},
6712
15
        { &hf_icmpv6_rpl_opt_transit_pathctl_pc1,
6713
15
           { "PC1", "icmpv6.rpl.opt.transit.pathctl.pc1", FT_UINT8, BASE_HEX, NULL, RPL_OPT_TRANSIT_PATHCTL_PC1,
6714
15
              NULL, HFILL }},
6715
15
        { &hf_icmpv6_rpl_opt_transit_pathctl_pc2,
6716
15
           { "PC2", "icmpv6.rpl.opt.transit.pathctl.pc2", FT_UINT8, BASE_HEX, NULL, RPL_OPT_TRANSIT_PATHCTL_PC2,
6717
15
              NULL, HFILL }},
6718
15
        { &hf_icmpv6_rpl_opt_transit_pathctl_pc3,
6719
15
           { "PC3", "icmpv6.rpl.opt.transit.pathctl.pc3", FT_UINT8, BASE_HEX, NULL, RPL_OPT_TRANSIT_PATHCTL_PC3,
6720
15
              NULL, HFILL }},
6721
15
        { &hf_icmpv6_rpl_opt_transit_pathctl_pc4,
6722
15
           { "PC4", "icmpv6.rpl.opt.transit.pathctl.pc4", FT_UINT8, BASE_HEX, NULL, RPL_OPT_TRANSIT_PATHCTL_PC4,
6723
15
              NULL, HFILL }},
6724
15
        { &hf_icmpv6_rpl_opt_transit_pathseq,
6725
15
           { "Path Sequence", "icmpv6.rpl.opt.transit.pathseq", FT_UINT8, BASE_DEC, NULL, 0x0,
6726
15
              "Increments the Path Sequence each time it issues a RPL Target option with updated information", HFILL }},
6727
15
        { &hf_icmpv6_rpl_opt_transit_pathlifetime,
6728
15
           { "Path Lifetime", "icmpv6.rpl.opt.transit.pathlifetime", FT_UINT8, BASE_DEC, NULL, 0x0,
6729
15
              "The length of time in Lifetime Units that the prefix is valid for route determination", HFILL }},
6730
15
        { &hf_icmpv6_rpl_opt_transit_parent,
6731
15
           { "Parent Address", "icmpv6.rpl.opt.transit.parent", FT_IPv6, BASE_NONE, NULL, 0x0,
6732
15
              "IPv6 Address of the DODAG Parent of the node originally issuing the Transit Information Option", HFILL }},
6733
15
        { &hf_icmpv6_rpl_opt_solicited_instance,
6734
15
           { "Instance", "icmpv6.rpl.opt.solicited.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6735
15
              "Containing the RPLInstanceID that is being solicited when valid", HFILL }},
6736
15
        { &hf_icmpv6_rpl_opt_solicited_flag,
6737
15
           { "Flag", "icmpv6.rpl.opt.solicited.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6738
15
              NULL, HFILL }},
6739
15
        { &hf_icmpv6_rpl_opt_solicited_flag_v,
6740
15
           { "Version predicate", "icmpv6.rpl.opt.solicited.flag.v", FT_BOOLEAN, 8, NULL, RPL_OPT_SOLICITED_FLAG_V,
6741
15
              "The Version predicate is true if the receiver's DODAGVersionNumber matches the requested Version Number", HFILL }},
6742
15
        { &hf_icmpv6_rpl_opt_solicited_flag_i,
6743
15
           { "InstanceID predicate","icmpv6.rpl.opt.solicited.flag.i", FT_BOOLEAN, 8, NULL, RPL_OPT_SOLICITED_FLAG_I,
6744
15
              "The InstanceID predicate is true when the RPL node's current RPLInstanceID matches the requested RPLInstanceID", HFILL }},
6745
15
        { &hf_icmpv6_rpl_opt_solicited_flag_d,
6746
15
           { "DODAGID predicate", "icmpv6.rpl.opt.solicited.flag.d", FT_BOOLEAN, 8, NULL, RPL_OPT_SOLICITED_FLAG_D,
6747
15
              "The DODAGID predicate is true if the RPL node's parent set has the same DODAGID as the DODAGID field", HFILL }},
6748
15
         { &hf_icmpv6_rpl_opt_solicited_flag_rsv,
6749
15
           { "Reserved", "icmpv6.rpl.opt.solicited.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_OPT_SOLICITED_FLAG_RSV,
6750
15
             "Must be Zero", HFILL }},
6751
15
        { &hf_icmpv6_rpl_opt_solicited_dodagid,
6752
15
           { "DODAGID", "icmpv6.rpl.opt.solicited.dodagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6753
15
              "the DODAGID that is being solicited when valid", HFILL }},
6754
15
        { &hf_icmpv6_rpl_opt_solicited_version,
6755
15
           { "Version", "icmpv6.rpl.opt.solicited.version", FT_UINT8, BASE_DEC, NULL, 0x0,
6756
15
              "the value of  DODAGVersionNumber that is being solicited when valid", HFILL }},
6757
6758
15
        { &hf_icmpv6_rpl_opt_prefix_length,
6759
15
           { "Prefix Length", "icmpv6.rpl.opt.prefix.length", FT_UINT8, BASE_DEC, NULL, 0x0,
6760
15
             "The number of leading bits in the Prefix that are valid", HFILL }},
6761
15
        { &hf_icmpv6_rpl_opt_prefix_flag,
6762
15
           { "Flag", "icmpv6.rpl.opt.prefix.flag", FT_UINT8, BASE_HEX, NULL, 0x0,
6763
15
             NULL, HFILL }},
6764
15
        { &hf_icmpv6_rpl_opt_prefix_flag_l,
6765
15
           { "On Link", "icmpv6.rpl.opt.prefix.flag.l", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RPL_OPT_PREFIX_FLAG_L,
6766
15
             "When set, indicates that this prefix can be used for on-link determination", HFILL }},
6767
15
        { &hf_icmpv6_rpl_opt_prefix_flag_a,
6768
15
           { "Auto Address Config","icmpv6.rpl.opt.config.flag.a", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RPL_OPT_PREFIX_FLAG_A,
6769
15
             "When set indicates that this prefix can be used for stateless address configuration", HFILL }},
6770
15
        { &hf_icmpv6_rpl_opt_prefix_flag_r,
6771
15
           { "Router Address", "icmpv6.rpl.opt.config.flag.r", FT_BOOLEAN, 8, TFS(&tfs_set_notset), RPL_OPT_PREFIX_FLAG_R,
6772
15
             "When set, indicates that the Prefix field contains a complete IPv6 address assigned to the sending router that can be used as parent in a target option", HFILL }},
6773
15
        { &hf_icmpv6_rpl_opt_prefix_flag_rsv,
6774
15
           { "Reserved", "icmpv6.rpl.opt.config.flag.rsv", FT_UINT8, BASE_DEC, NULL, RPL_OPT_PREFIX_FLAG_RSV,
6775
15
             "Must Be Zero", HFILL }},
6776
15
        { &hf_icmpv6_rpl_opt_prefix_vlifetime,
6777
15
           { "Valid Lifetime", "icmpv6.rpl.opt.prefix.valid_lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x0,
6778
15
             "The length of time in seconds that the prefix is valid for the purpose of on-link determination", HFILL }},
6779
15
        { &hf_icmpv6_rpl_opt_prefix_plifetime,
6780
15
           { "Preferred Lifetime", "icmpv6.rpl.opt.prefix.preferred_lifetime", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_infinity), 0x0,
6781
15
             "The length of time in seconds that addresses generated from the prefix via stateless address autoconfiguration remain preferred", HFILL }},
6782
15
        { &hf_icmpv6_rpl_opt_prefix,
6783
15
           { "Destination Prefix", "icmpv6.rpl.opt.prefix", FT_IPv6, BASE_NONE, NULL, 0x0,
6784
15
             "An IPv6 address or a prefix of an IPv6 address", HFILL }},
6785
15
        { &hf_icmpv6_rpl_opt_targetdesc,
6786
15
           { "Descriptor", "icmpv6.rpl.opt.targetdesc.descriptor", FT_UINT32, BASE_HEX, NULL, 0x0,
6787
15
             "Opaque Data", HFILL }},
6788
6789
15
        { &hf_icmpv6_rpl_opt_route_discovery_flag,
6790
15
           { "Flags", "icmpv6.rpl.opt.routediscovery.flag", FT_NONE, BASE_NONE, NULL, 0x0,
6791
15
             "NULL", HFILL }},
6792
15
        { &hf_icmpv6_rpl_opt_route_discovery_reply,
6793
15
           { "Reply", "icmpv6.rpl.opt.routediscovery.flag.reply", FT_BOOLEAN, 8, TFS(&tfs_yes_no), RPL_OPT_ROUTE_DISCOVERY_R,
6794
15
             "The Origin sets this flag to one to allow the Target(s) to send P2P-DRO messages back to the Origin", HFILL }},
6795
15
        { &hf_icmpv6_rpl_opt_route_discovery_hop_by_hop,
6796
15
           { "Hop-by-Hop", "icmpv6.rpl.opt.routediscovery.flag.hopbyhop", FT_BOOLEAN, 8, TFS(&tfs_yes_no), RPL_OPT_ROUTE_DISCOVERY_H,
6797
15
             "The Origin sets this flag to one if it desires Hop-by-hop Routes and to zero if it desires Source Routes.", HFILL }},
6798
15
        { &hf_icmpv6_rpl_opt_route_discovery_num_of_routes,
6799
15
           { "Number of Routes", "icmpv6.rpl.opt.routediscovery.flag.numofroutes", FT_UINT8, BASE_DEC, NULL, RPL_OPT_ROUTE_DISCOVERY_N,
6800
15
             "This value plus one indicates the number of Source Routes that each Target should convey to the Origin", HFILL }},
6801
15
        { &hf_icmpv6_rpl_opt_route_discovery_compr,
6802
15
           { "Compr", "icmpv6.rpl.opt.routediscovery.flag.compr", FT_UINT8, BASE_DEC, NULL, RPL_OPT_ROUTE_DISCOVERY_COMPR,
6803
15
             "Number of prefix octets that are elided from the Target field and Address vector", HFILL }},
6804
15
        { &hf_icmpv6_rpl_opt_route_discovery_lifetime,
6805
15
           { "Lifetime", "icmpv6.rpl.opt.routediscovery.lifetime", FT_UINT8, BASE_DEC, NULL, RPL_OPT_ROUTE_DISCOVERY_L,
6806
15
             "Lifetime of the temporary DODAG", HFILL }},
6807
15
        { &hf_icmpv6_rpl_opt_route_discovery_maxrank,
6808
15
           { "MaxRank", "icmpv6.rpl.opt.routediscovery.maxrank", FT_UINT8, BASE_DEC, NULL, RPL_OPT_ROUTE_DISCOVERY_MR_NH,
6809
15
             "Upper limit of the integer portion of the rank when used inside a DIO", HFILL }},
6810
15
        { &hf_icmpv6_rpl_opt_route_discovery_nh,
6811
15
           { "NH", "icmpv6.rpl.opt.routediscovery.nh", FT_UINT8, BASE_DEC, NULL, RPL_OPT_ROUTE_DISCOVERY_MR_NH,
6812
15
             "Index of the next-hop (NH) address inside the Address vector", HFILL }},
6813
15
        { &hf_icmpv6_rpl_opt_route_discovery_target_addr,
6814
15
           { "Target Address", "icmpv6.rpl.opt.routediscovery.targetaddr", FT_IPv6, BASE_NONE, NULL, 0x0,
6815
15
             "An IPv6 address of the Target after eliding Compr number of prefix octets", HFILL }},
6816
15
        { &hf_icmpv6_rpl_opt_route_discovery_addr_vec,
6817
15
           { "Address Vector", "icmpv6.rpl.opt.routediscovery.addr_vec", FT_NONE, BASE_NONE, NULL, 0x0,
6818
15
             "NULL", HFILL }},
6819
15
        { &hf_icmpv6_rpl_opt_route_discovery_addr_vec_addr,
6820
15
          { "Address", "icmpv6.rpl.opt.routediscovery.addrvec.addr", FT_IPv6, BASE_NONE, NULL, 0x0,
6821
15
            NULL, HFILL }},
6822
15
        { &hf_icmpv6_rpl_p2p_dro_instance,
6823
15
           { "RPLInstanceID", "icmpv6.rpl.p2p.dro.instance", FT_UINT8, BASE_DEC, NULL, 0x0,
6824
15
             "Set by the DODAG root that indicates which RPL Instance the DODAG is part of", HFILL }},
6825
15
        { &hf_icmpv6_rpl_p2p_dro_version,
6826
15
           { "Version", "icmpv6.rpl.p2p.dro.version", FT_UINT8, BASE_DEC, NULL, 0x0,
6827
15
             "Set by the DODAG root to the DODAGVersionNumber", HFILL }},
6828
15
        { &hf_icmpv6_rpl_p2p_dro_flag,
6829
15
           { "Flags", "icmpv6.rpl.p2p.dro.flag", FT_UINT16, BASE_HEX, NULL, 0x0,
6830
15
             "NULL", HFILL }},
6831
15
        { &hf_icmpv6_rpl_p2p_dro_flag_stop,
6832
15
           { "Stop", "icmpv6.rpl.p2p.dro.flag.stop", FT_BOOLEAN, 16, TFS(&tfs_yes_no), RPL_P2P_DRO_FLAG_S,
6833
15
             "Indicates that the P2P-RPL route discovery is over", HFILL }},
6834
15
        { &hf_icmpv6_rpl_p2p_dro_flag_ack,
6835
15
           { "Ack", "icmpv6.rpl.p2p.dro.flag.ack", FT_BOOLEAN, 16, TFS(&tfs_yes_no), RPL_P2P_DRO_FLAG_A,
6836
15
             "Indicates that the Origin MUST unicast a P2P-DRO-ACK message to the Target", HFILL }},
6837
15
        { &hf_icmpv6_rpl_p2p_dro_flag_seq,
6838
15
           { "Seq", "icmpv6.rpl.p2p.dro.flag.seq", FT_UINT16, BASE_DEC, NULL, RPL_P2P_DRO_FLAG_SEQ,
6839
15
             "Indicates the sequence number for the P2P-DRO", HFILL }},
6840
15
        { &hf_icmpv6_rpl_p2p_dro_flag_reserved,
6841
15
           { "Reserved", "icmpv6.rpl.p2p.dro.flag.reserved", FT_UINT16, BASE_DEC, NULL, RPL_P2P_DRO_FLAG_RSV,
6842
15
             NULL, HFILL }},
6843
15
        { &hf_icmpv6_rpl_p2p_dro_dagid,
6844
15
           { "DODAGID", "icmpv6.rpl.p2p.dro.dagid", FT_IPv6, BASE_NONE, NULL, 0x0,
6845
15
             "IPv6 address set by a DODAG root which uniquely identifies a DODAG", HFILL }},
6846
15
        { &hf_icmpv6_rpl_p2p_droack_flag,
6847
15
           { "Flags", "icmpv6.rpl.p2p.droack.flag", FT_UINT16, BASE_HEX, NULL, 0x0,
6848
15
             "NULL", HFILL }},
6849
15
        { &hf_icmpv6_rpl_p2p_droack_flag_seq,
6850
15
           { "Seq", "icmpv6.rpl.p2p.droack.flag.seq", FT_UINT16, BASE_DEC, NULL, RPL_P2P_DROACK_FLAG_SEQ,
6851
15
             "Indicates the sequence number for the P2P-DRO", HFILL }},
6852
15
        { &hf_icmpv6_rpl_p2p_droack_flag_reserved,
6853
15
           { "Reserved", "icmpv6.rpl.p2p.droack.flag.reserved", FT_UINT16, BASE_DEC, NULL, RPL_P2P_DROACK_FLAG_RSV,
6854
15
             NULL, HFILL }},
6855
6856
        /* RFC6743 Locator Update (156) */
6857
6858
15
        { &hf_icmpv6_ilnp_nb_locs,
6859
15
          { "Num of Locs", "icmpv6.ilnp.nb_locs", FT_UINT8, BASE_DEC, NULL, 0x0,
6860
15
            "The number of 64-bit Locator values that are advertised in this message", HFILL }},
6861
15
        { &hf_icmpv6_ilnp_locator,
6862
15
          { "Locator", "icmpv6.ilnp.nb_locator", FT_UINT64, BASE_HEX, NULL, 0x0,
6863
15
            "The 64-bit Locator values currently valid for the sending ILNPv6 node", HFILL }},
6864
15
        { &hf_icmpv6_ilnp_preference,
6865
15
          { "Preference", "icmpv6.ilnp.nb_preference", FT_UINT32, BASE_DEC, NULL, 0x0,
6866
15
            "The preferability of each Locator relative to other valid Locator values", HFILL }},
6867
15
        { &hf_icmpv6_ilnp_lifetime,
6868
15
          { "Lifetime", "icmpv6.ilnp.nb_lifetime", FT_UINT32, BASE_DEC, NULL, 0x0,
6869
15
            "The maximum number of seconds that this particular Locator may be considered valid", HFILL }},
6870
6871
        /* 6lowpan-nd: Neighbour Discovery for 6LoWPAN Networks */
6872
15
        { &hf_icmpv6_da_code_prefix,
6873
15
          { "Code Prefix", "icmpv6.6lowpannd.da.code.prefix", FT_UINT8, BASE_DEC, NULL, 0x0,
6874
15
            NULL, HFILL }},
6875
15
        { &hf_icmpv6_da_code_suffix,
6876
15
          { "Code Suffix", "icmpv6.6lowpannd.da.code.suffix", FT_UINT8, BASE_DEC, NULL, 0x0,
6877
15
            NULL, HFILL }},
6878
15
        { &hf_icmpv6_dar_code_suffix,
6879
15
          { "Code Suffix", "icmpv6.6lowpannd.dar.code.suffix", FT_UINT8, BASE_DEC, VALS(nd_opt_dar_code_suffix_val), 0x0,
6880
15
            NULL, HFILL }},
6881
15
        { &hf_icmpv6_dac_code_suffix,
6882
15
          { "Code Suffix", "icmpv6.6lowpannd.dac.code.suffix", FT_UINT8, BASE_DEC, VALS(nd_opt_dac_code_suffix_val), 0x0,
6883
15
            NULL, HFILL }},
6884
15
        { &hf_icmpv6_da_status,
6885
15
          { "Status", "icmpv6.6lowpannd.da.status", FT_UINT8, BASE_DEC, VALS(nd_opt_da_status_val), 0x0,
6886
15
            "Indicates the status of a registration in the DAC", HFILL }},
6887
15
        { &hf_icmpv6_da_rsv,
6888
15
          { "Reserved", "icmpv6.6lowpannd.da.rsv", FT_UINT8, BASE_DEC, NULL, 0x0,
6889
15
            "Must be Zero", HFILL }},
6890
15
        { &hf_icmpv6_da_lifetime,
6891
15
          { "Lifetime", "icmpv6.6lowpannd.da.lifetime", FT_UINT16, BASE_DEC, NULL, 0x0,
6892
15
            "The amount of time in a unit of 60 seconds that the router should retain the Neighbor Cache entry for the sender of the NS that includes this option", HFILL }},
6893
15
        { &hf_icmpv6_da_eui64,
6894
15
          { "EUI-64", "icmpv6.6lowpannd.da.eui64", FT_EUI64, BASE_NONE, NULL, 0x0,
6895
15
            "This field is used to uniquely identify the interface of the registered address by including the EUI-64 identifier", HFILL }},
6896
15
        { &hf_icmpv6_da_rovr,
6897
15
          { "ROVR", "icmpv6.6lowpannd.da.rovr", FT_BYTES, BASE_NONE, NULL, 0x00,
6898
15
            "Registration Ownership Verifier (ROVR)", HFILL }},
6899
15
        { &hf_icmpv6_da_raddr,
6900
15
          { "Registered Address", "icmpv6.6lowpannd.da.reg_addr", FT_IPv6, BASE_NONE, NULL, 0x0,
6901
15
            "Carries the host address, which was contained in the IPv6 Source field in the NS that contained the ARO option sent by the host", HFILL }},
6902
6903
        /* Extended Echo - Probe - RFC8335 */
6904
15
        { &hf_icmpv6_ext_echo_seq_num,
6905
15
         { "Sequence number", "icmpv6.ext.echo.seq", FT_UINT8, BASE_DEC_HEX, NULL, 0x0,
6906
15
           NULL, HFILL}},
6907
15
        { &hf_icmpv6_ext_echo_req_reserved,
6908
15
         { "Reserved", "icmpv6.ext.echo.req.res", FT_UINT8, BASE_HEX, NULL, 0xFE,
6909
15
           NULL, HFILL}},
6910
15
        { &hf_icmpv6_ext_echo_req_local,
6911
15
         { "Local bit", "icmpv6.ext.echo.req.local", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
6912
15
           NULL, HFILL}},
6913
15
        { &hf_icmpv6_ext_echo_rsp_state,
6914
15
         { "State", "icmpv6.ext.echo.rsp.state", FT_UINT8, BASE_DEC, VALS(ext_echo_reply_state_str), 0xE0,
6915
15
           NULL, HFILL}},
6916
15
        { &hf_icmpv6_ext_echo_rsp_reserved,
6917
15
         { "Reserved", "icmpv6.ext.echo.rsp.res", FT_UINT8, BASE_HEX, NULL, 0x18,
6918
15
           NULL, HFILL}},
6919
15
        { &hf_icmpv6_ext_echo_rsp_active,
6920
15
         { "Active bit", "icmpv6.ext.echo.rsp.active", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
6921
15
           NULL, HFILL}},
6922
15
        { &hf_icmpv6_ext_echo_rsp_ipv4,
6923
15
         { "IPv4 bit", "icmpv6.ext.echo.rsp.ipv4", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
6924
15
           NULL, HFILL}},
6925
15
        { &hf_icmpv6_ext_echo_rsp_ipv6,
6926
15
         { "IPv6 bit", "icmpv6.ext.echo.rsp.ipv6", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
6927
15
           NULL, HFILL}},
6928
6929
        /* Conversation-related [generated] header fields */
6930
15
        { &hf_icmpv6_resp_in,
6931
15
            { "Response In", "icmpv6.resp_in", FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE), 0x0,
6932
15
              "The response to this request is in this frame", HFILL }},
6933
15
        {&hf_icmpv6_no_resp,
6934
15
            {"No response seen", "icmpv6.no_resp", FT_NONE, BASE_NONE, NULL, 0x0,
6935
15
             "No corresponding response frame was seen", HFILL}},
6936
15
        { &hf_icmpv6_resp_to,
6937
15
            { "Response To", "icmpv6.resp_to", FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_REQUEST), 0x0,
6938
15
              "This is the response to the request in this frame", HFILL }},
6939
15
        { &hf_icmpv6_resptime,
6940
15
            { "Response Time", "icmpv6.resptime", FT_DOUBLE, BASE_NONE, NULL, 0x0,
6941
15
              "The time between the request and the response, in ms.", HFILL }},
6942
6943
        /* RFC 7731: Multicast Protocol for Low-Power and Lossy Networks (MPL) */
6944
15
        { &hf_icmpv6_mpl_seed_info_min_sequence,
6945
15
            { "MinSequence", "icmpv6.mpl.seed_info.min_sequence", FT_UINT8, BASE_DEC, NULL, 0x0,
6946
15
              "The lower-bound sequence number for the MPL Seed.", HFILL }},
6947
15
        { &hf_icmpv6_mpl_seed_info_bm_len,
6948
15
            { "Buffered Messages Length", "icmpv6.mpl.seed_info.bm_len", FT_UINT8, BASE_DEC, NULL, MPL_SEED_INFO_BM_LEN,
6949
15
              "The size of buffered-mpl-messages in octets.", HFILL }},
6950
15
        { &hf_icmpv6_mpl_seed_info_s,
6951
15
            { "Seed ID Length", "icmpv6.mpl.seed_info.s", FT_UINT8, BASE_DEC, VALS(mpl_seed_id_lengths), MPL_SEED_INFO_S,
6952
15
              "The length of the seed-id.", HFILL }},
6953
15
        { &hf_icmpv6_mpl_seed_info_seed_id,
6954
15
            { "Seed ID", "icmpv6.mpl.seed_info.seed_id", FT_STRING, BASE_NONE, NULL, 0x0,
6955
15
              NULL, HFILL }},
6956
15
        { &hf_icmpv6_mpl_seed_info_sequence,
6957
15
            { "Sequence", "icmpv6.mpl.seed_info.sequence", FT_UINT8, BASE_DEC, NULL, 0x0,
6958
15
              NULL, HFILL }}
6959
6960
15
    };
6961
6962
15
    static int *ett[] = {
6963
15
        &ett_icmpv6,
6964
15
        &ett_icmpv6_opt,
6965
15
        &ett_icmpv6_mar,
6966
15
        &ett_icmpv6_flag_prefix,
6967
15
        &ett_icmpv6_flag_map,
6968
15
        &ett_icmpv6_flag_pvd_id,
6969
15
        &ett_icmpv6_flag_route_info,
6970
15
        &ett_icmpv6_flag_earo,
6971
15
        &ett_icmpv6_flag_6lowpan,
6972
15
        &ett_icmpv6_flag_efo,
6973
15
        &ett_icmpv6_rpl_opt,
6974
15
        &ett_icmpv6_rpl_metric_type,
6975
15
        &ett_icmpv6_rpl_metric_flags,
6976
15
        &ett_icmpv6_rpl_metric_nsa_object,
6977
15
        &ett_icmpv6_rpl_metric_nsa_object_tlv_type,
6978
15
        &ett_icmpv6_rpl_metric_ne_object,
6979
15
        &ett_icmpv6_rpl_metric_hp_object,
6980
15
        &ett_icmpv6_rpl_metric_lql_object,
6981
15
        &ett_icmpv6_rpl_metric_lc_object,
6982
15
        &ett_icmpv6_rpl_flag_routing,
6983
15
        &ett_icmpv6_rpl_flag_config,
6984
15
        &ett_icmpv6_rpl_flag_transit,
6985
15
        &ett_icmpv6_rpl_flag_solicited,
6986
15
        &ett_icmpv6_rpl_flag_prefix,
6987
15
        &ett_icmpv6_rpl_route_discovery_flag,
6988
15
        &ett_icmpv6_rpl_route_discovery_addr_vec,
6989
15
        &ett_icmpv6_rpl_transit_pathctl,
6990
15
        &ett_icmpv6_rpl_p2p_dro_flag,
6991
15
        &ett_icmpv6_rpl_p2p_droack_flag,
6992
15
        &ett_icmpv6_flag_ni,
6993
15
        &ett_icmpv6_flag_rr,
6994
15
        &ett_icmpv6_rr_mp,
6995
15
        &ett_icmpv6_rr_up,
6996
15
        &ett_icmpv6_rr_up_flag_mask,
6997
15
        &ett_icmpv6_rr_up_flag_ra,
6998
15
        &ett_icmpv6_rr_up_flag,
6999
15
        &ett_icmpv6_rr_rm,
7000
15
        &ett_icmpv6_rr_rm_flag,
7001
15
        &ett_icmpv6_flag_mld,
7002
15
        &ett_icmpv6_flag_ra,
7003
15
        &ett_icmpv6_flag_na,
7004
15
        &ett_icmpv6_flag_mip6,
7005
15
        &ett_icmpv6_flag_fmip6,
7006
15
        &ett_icmpv6_flag_secure,
7007
15
        &ett_icmpv6_flag_rpl_dio,
7008
15
        &ett_icmpv6_flag_rpl_dao,
7009
15
        &ett_icmpv6_flag_rpl_daoack,
7010
15
        &ett_icmpv6_flag_rpl_dco,
7011
15
        &ett_icmpv6_flag_rpl_dcoack,
7012
15
        &ett_icmpv6_flag_rpl_cc,
7013
15
        &ett_icmpv6_flag_6cio,
7014
15
        &ett_icmpv6_opt_name,
7015
15
        &ett_icmpv6_cga_param_name,
7016
15
        &ett_icmpv6_mpl_seed_info,
7017
15
        &ett_icmpv6_mpl_seed_info_bm,
7018
15
        &ett_icmpv6_opt_dnr_addrs
7019
15
    };
7020
7021
15
    static ei_register_info ei[] = {
7022
15
        { &ei_icmpv6_type_error, { "icmpv6.type.error", PI_RESPONSE_CODE, PI_NOTE, "Type indicates an error", EXPFILL }},
7023
15
        { &ei_icmpv6_invalid_option_length, { "icmpv6.invalid_option_length", PI_MALFORMED, PI_ERROR, "Invalid Option Length", EXPFILL }},
7024
15
        { &ei_icmpv6_opt_dnr_adn_only_mode, { "icmpv6.opt.dnr.adn_only_mode", PI_COMMENTS_GROUP, PI_CHAT, "This DNR option is in ADN-only mode", EXPFILL }},
7025
15
        { &ei_icmpv6_undecoded_option, { "icmpv6.undecoded.option", PI_UNDECODED, PI_NOTE, "Undecoded option", EXPFILL }},
7026
15
        { &ei_icmpv6_unknown_data, { "icmpv6.unknown_data.expert", PI_MALFORMED, PI_ERROR, "Unknown Data (not interpreted)", EXPFILL }},
7027
15
        { &ei_icmpv6_undecoded_rpl_option, { "icmpv6.undecoded.rpl_option", PI_UNDECODED, PI_NOTE, "Undecoded RPL Option", EXPFILL }},
7028
15
        { &ei_icmpv6_undecoded_type, { "icmpv6.undecoded.type", PI_UNDECODED, PI_NOTE, "Undecoded type", EXPFILL }},
7029
15
        { &ei_icmpv6_rr_pco_mp_matchlen, { "icmpv6.rr.pco.mp.matchlen.gt128", PI_PROTOCOL, PI_WARN, "MatchLen is greater than 128", EXPFILL }},
7030
15
        { &ei_icmpv6_rr_pco_mp_matchedlen, { "icmpv6.rr.pco.mp.matchedlen.gt128", PI_PROTOCOL, PI_WARN, "MatchedLen is greater than 128", EXPFILL }},
7031
15
        { &ei_icmpv6_checksum, { "icmpv6.checksum_bad.expert", PI_CHECKSUM, PI_WARN, "Bad checksum", EXPFILL }},
7032
15
        { &ei_icmpv6_resp_not_found, { "icmpv6.resp_not_found", PI_SEQUENCE, PI_WARN, "Response not found", EXPFILL }},
7033
15
        { &ei_icmpv6_rpl_unknown_metric, { "icmpv6.rpl.unknown.metric", PI_UNDECODED, PI_NOTE, "Unknown RPL metric/constraint type", EXPFILL }},
7034
15
        { &ei_icmpv6_rpl_p2p_hop_by_hop, { "icmpv6.rpl.p2p.hop_by_hop", PI_PROTOCOL, PI_WARN, "Reply MUST be set to one in order to establish a Hop-by-Hop Route", EXPFILL }},
7035
15
        { &ei_icmpv6_rpl_p2p_num_of_routes, { "icmpv6.rpl.p2p.num_of_routes", PI_PROTOCOL, PI_WARN, "This field MUST be set to zero when Hop-by-Hop Routes are being discovered", EXPFILL }},
7036
15
        { &ei_icmpv6_rpl_p2p_dro_rdo_zero, { "icmpv6.rpl.p2p.dro.rdo.zero", PI_PROTOCOL, PI_WARN, "This field MUST be set to zero when the P2P-RDO is included in a P2P-DRO", EXPFILL }},
7037
15
        { &ei_icmpv6_rpl_p2p_dro_zero, { "icmpv6.rpl.p2p.dro.zero", PI_PROTOCOL, PI_WARN, "This field MUST be set to zero", EXPFILL }},
7038
15
    };
7039
7040
15
    expert_module_t* expert_icmpv6;
7041
7042
15
    proto_icmpv6 = proto_register_protocol("Internet Control Message Protocol v6",
7043
15
                                           "ICMPv6", "icmpv6");
7044
15
    proto_register_field_array(proto_icmpv6, hf, array_length(hf));
7045
15
    proto_register_subtree_array(ett, array_length(ett));
7046
15
    expert_icmpv6 = expert_register_protocol(proto_icmpv6);
7047
15
    expert_register_field_array(expert_icmpv6, ei, array_length(ei));
7048
7049
15
    register_seq_analysis("icmpv6", "ICMPv6 Flows", proto_icmpv6, NULL, TL_REQUIRES_COLUMNS, icmpv6_seq_analysis_packet);
7050
15
    icmpv6_handle = register_dissector("icmpv6", dissect_icmpv6, proto_icmpv6);
7051
15
    icmpv6_heur_subdissector_list = register_heur_dissector_list_with_description("icmpv6", "ICMPv6 Echo payload", proto_icmpv6);
7052
15
    icmpv6_tap = register_tap("icmpv6");
7053
15
}
7054
7055
void
7056
proto_reg_handoff_icmpv6(void)
7057
15
{
7058
15
    capture_dissector_handle_t icmpv6_cap_handle;
7059
7060
15
    dissector_add_uint("ip.proto", IP_PROTO_IPV6_ICMP, icmpv6_handle);
7061
15
    icmpv6_cap_handle = create_capture_dissector_handle(capture_icmpv6, proto_icmpv6);
7062
15
    capture_dissector_add_uint("ip.proto", IP_PROTO_IPV6_ICMP, icmpv6_cap_handle);
7063
7064
    /*
7065
     * Get a handle for the IPv6 dissector.
7066
     */
7067
15
    ipv6_handle = find_dissector_add_dependency("ipv6", proto_icmpv6);
7068
15
    icmp_extension_handle = find_dissector("icmp_extension");
7069
15
    svc_params_handle = find_dissector("svc_params");
7070
7071
15
    proto_ieee802154 = proto_get_id_by_filter_name(IEEE802154_PROTOABBREV_WPAN);
7072
15
}
7073
7074
/*
7075
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
7076
 *
7077
 * Local variables:
7078
 * c-basic-offset: 4
7079
 * tab-width: 8
7080
 * indent-tabs-mode: nil
7081
 * End:
7082
 *
7083
 * vi: set shiftwidth=4 tabstop=8 expandtab:
7084
 * :indentSize=4:tabSize=8:noTabs=true:
7085
 */