Coverage Report

Created: 2025-02-15 06:25

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