Coverage Report

Created: 2026-11-12 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-mpls-echo.c
Line
Count
Source
1
/* packet-mpls-echo.c
2
 * Routines for Multiprotocol Label Switching Echo dissection
3
 * Copyright 2004, Carlos Pignataro <cpignata@cisco.com>
4
 *
5
 * Wireshark - Network traffic analyzer
6
 * By Gerald Combs <gerald@wireshark.org>
7
 * Copyright 1998 Gerald Combs
8
 *
9
 * (c) Copyright 2011, Jaihari Kalijanakiraman <jaiharik@ipinfusion.com>
10
 *                     Krishnamurthy Mayya <krishnamurthy.mayya@ipinfusion.com>
11
 *                     Nikitha Malgi       <malgi.nikitha@ipinfusion.com>
12
 *                     - Support for LSP Ping extensions as per RFC 6426
13
 *                     Mayuresh Raut    <msraut@ncsu.edu>
14
 *                     - Support for LSP ping over MPLS as per RFC 6424
15
 * (c) Copyright 2012, Subramanian Ramachandran <sramach6@ncsu.edu>
16
 *                     - Support for BFD for MPLS as per RFC 5884
17
 *
18
 * SPDX-License-Identifier: GPL-2.0-or-later
19
 */
20
21
#include "config.h"
22
23
#include <epan/packet.h>
24
#include <epan/addr_resolv.h>
25
#include <epan/expert.h>
26
#include <epan/to_str.h>
27
28
#include <wsutil/ws_padding_to.h>
29
30
#include "packet-ldp.h"
31
#include "packet-mpls.h"
32
33
void proto_register_mpls_echo(void);
34
void proto_reg_handoff_mpls_echo(void);
35
36
static dissector_handle_t mpls_echo_handle;
37
38
16
#define UDP_PORT_MPLS_ECHO 3503
39
40
static int proto_mpls_echo;
41
static int hf_mpls_echo_version;
42
static int hf_mpls_echo_mbz;
43
static int hf_mpls_echo_gflags;
44
static int hf_mpls_echo_flag_sbz;
45
static int hf_mpls_echo_flag_v;
46
static int hf_mpls_echo_flag_t;
47
static int hf_mpls_echo_flag_r;
48
static int hf_mpls_echo_msgtype;
49
static int hf_mpls_echo_replymode;
50
static int hf_mpls_echo_returncode;
51
static int hf_mpls_echo_returnsubcode;
52
static int hf_mpls_echo_handle;
53
static int hf_mpls_echo_sequence;
54
static int hf_mpls_echo_ts_sent;
55
static int hf_mpls_echo_ts_rec;
56
static int hf_mpls_echo_tlv_type;
57
static int hf_mpls_echo_tlv_len;
58
static int hf_mpls_echo_tlv_value;
59
static int hf_mpls_echo_tlv_fec_type;
60
static int hf_mpls_echo_tlv_fec_len;
61
static int hf_mpls_echo_tlv_fec_value;
62
static int hf_mpls_echo_tlv_fec_ldp_ipv4;
63
static int hf_mpls_echo_tlv_fec_ldp_ipv4_mask;
64
static int hf_mpls_echo_tlv_fec_ldp_ipv6;
65
static int hf_mpls_echo_tlv_fec_ldp_ipv6_mask;
66
static int hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint;
67
static int hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint;
68
static int hf_mpls_echo_tlv_fec_rsvp_ip_mbz1;
69
static int hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id;
70
static int hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id;
71
static int hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender;
72
static int hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id;
73
static int hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender;
74
static int hf_mpls_echo_tlv_fec_rsvp_ip_mbz2;
75
static int hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id;
76
static int hf_mpls_echo_tlv_fec_vpn_route_dist;
77
static int hf_mpls_echo_tlv_fec_vpn_ipv4;
78
static int hf_mpls_echo_tlv_fec_vpn_len;
79
static int hf_mpls_echo_tlv_fec_vpn_ipv6;
80
static int hf_mpls_echo_tlv_fec_l2_vpn_route_dist;
81
static int hf_mpls_echo_tlv_fec_l2_vpn_send_ve_id;
82
static int hf_mpls_echo_tlv_fec_l2_vpn_recv_ve_id;
83
static int hf_mpls_echo_tlv_fec_l2_vpn_encap_type;
84
static int hf_mpls_echo_tlv_fec_l2cid_sender;
85
static int hf_mpls_echo_tlv_fec_l2cid_remote;
86
static int hf_mpls_echo_tlv_fec_l2cid_vcid;
87
static int hf_mpls_echo_tlv_fec_l2cid_encap;
88
static int hf_mpls_echo_tlv_fec_l2cid_mbz;
89
static int hf_mpls_echo_tlv_fec_bgp_ipv4;
90
static int hf_mpls_echo_tlv_fec_bgp_ipv6;
91
static int hf_mpls_echo_tlv_fec_bgp_len;
92
static int hf_mpls_echo_tlv_fec_gen_ipv4;
93
static int hf_mpls_echo_tlv_fec_gen_ipv4_mask;
94
static int hf_mpls_echo_tlv_fec_gen_ipv6;
95
static int hf_mpls_echo_tlv_fec_gen_ipv6_mask;
96
static int hf_mpls_echo_tlv_fec_nil_label;
97
static int hf_mpls_echo_tlv_fec_pw_ipv6_128_sender;
98
static int hf_mpls_echo_tlv_fec_pw_ipv6_128_remote;
99
static int hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_id;
100
static int hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_type;
101
static int hf_mpls_echo_tlv_fec_pw_ipv6_128_mbz;
102
static int hf_mpls_echo_tlv_fec_igp_ipv4;
103
static int hf_mpls_echo_tlv_fec_igp_ipv6;
104
static int hf_mpls_echo_tlv_fec_igp_mask;
105
static int hf_mpls_echo_tlv_fec_igp_protocol;
106
static int hf_mpls_echo_tlv_fec_igp_reserved;
107
static int hf_mpls_echo_tlv_fec_igp_adj_type;
108
static int hf_mpls_echo_tlv_fec_igp_adj_local_ipv4;
109
static int hf_mpls_echo_tlv_fec_igp_adj_local_ipv6;
110
static int hf_mpls_echo_tlv_fec_igp_adj_local_ident;
111
static int hf_mpls_echo_tlv_fec_igp_adj_remote_ipv4;
112
static int hf_mpls_echo_tlv_fec_igp_adj_remote_ipv6;
113
static int hf_mpls_echo_tlv_fec_igp_adj_remote_ident;
114
static int hf_mpls_echo_tlv_fec_igp_adj_adv_ident_ospf;
115
static int hf_mpls_echo_tlv_fec_igp_adj_adv_ident_isis;
116
static int hf_mpls_echo_tlv_fec_igp_adj_adv_ident;
117
static int hf_mpls_echo_tlv_fec_igp_adj_rec_ident_ospf;
118
static int hf_mpls_echo_tlv_fec_igp_adj_rec_ident_isis;
119
static int hf_mpls_echo_tlv_fec_igp_adj_rec_ident;
120
static int hf_mpls_echo_tlv_ds_map_mtu;
121
static int hf_mpls_echo_tlv_ds_map_addr_type;
122
static int hf_mpls_echo_tlv_ds_map_res;
123
static int hf_mpls_echo_tlv_ds_map_flag_res;
124
static int hf_mpls_echo_tlv_ds_map_flag_i;
125
static int hf_mpls_echo_tlv_ds_map_flag_n;
126
static int hf_mpls_echo_tlv_ds_map_ds_ip;
127
static int hf_mpls_echo_tlv_ds_map_int_ip;
128
static int hf_mpls_echo_tlv_ds_map_if_index;
129
static int hf_mpls_echo_tlv_ds_map_ds_ipv6;
130
static int hf_mpls_echo_tlv_ds_map_int_ipv6;
131
static int hf_mpls_echo_tlv_ds_map_hash_type;
132
static int hf_mpls_echo_tlv_ds_map_depth;
133
static int hf_mpls_echo_tlv_ds_map_muti_len;
134
static int hf_mpls_echo_tlv_ds_map_mp_ip;
135
static int hf_mpls_echo_tlv_ds_map_mp_mask;
136
static int hf_mpls_echo_tlv_ds_map_mp_ip_low;
137
static int hf_mpls_echo_tlv_ds_map_mp_ip_high;
138
static int hf_mpls_echo_tlv_ds_map_mp_no_multipath_info;
139
static int hf_mpls_echo_tlv_ds_map_mp_value;
140
static int hf_mpls_echo_tlv_ds_map_mp_label;
141
static int hf_mpls_echo_tlv_ds_map_mp_exp;
142
static int hf_mpls_echo_tlv_ds_map_mp_bos;
143
static int hf_mpls_echo_tlv_ds_map_mp_proto;
144
static int hf_mpls_echo_tlv_dd_map_mtu;
145
static int hf_mpls_echo_tlv_dd_map_addr_type;
146
static int hf_mpls_echo_tlv_dd_map_res;
147
static int hf_mpls_echo_tlv_dd_map_flag_res;
148
static int hf_mpls_echo_tlv_dd_map_flag_i;
149
static int hf_mpls_echo_tlv_dd_map_flag_n;
150
static int hf_mpls_echo_tlv_dd_map_ds_ip;
151
static int hf_mpls_echo_tlv_dd_map_int_ip;
152
static int hf_mpls_echo_tlv_dd_map_ds_ipv6;
153
static int hf_mpls_echo_tlv_dd_map_int_ipv6;
154
static int hf_mpls_echo_tlv_dd_map_return_code;
155
static int hf_mpls_echo_tlv_dd_map_return_subcode;
156
static int hf_mpls_echo_tlv_dd_map_subtlv_len;
157
static int hf_mpls_echo_tlv_dd_map_ingress_if_num;
158
static int hf_mpls_echo_tlv_dd_map_egress_if_num;
159
static int hf_mpls_echo_sub_tlv_multipath_type;
160
static int hf_mpls_echo_sub_tlv_multipath_length;
161
static int hf_mpls_echo_sub_tlv_multipath_value;
162
static int hf_mpls_echo_sub_tlv_resv;
163
static int hf_mpls_echo_sub_tlv_multipath_info;
164
/* static int hf_mpls_echo_tlv_ddstlv_map_mp_label; */
165
static int hf_mpls_echo_tlv_ddstlv_map_mp_proto;
166
/* static int hf_mpls_echo_tlv_ddstlv_map_mp_exp; */
167
/* static int hf_mpls_echo_tlv_ddstlv_map_mp_bos; */
168
static int hf_mpls_echo_sub_tlv_multipath_ip;
169
static int hf_mpls_echo_sub_tlv_mp_ip_low;
170
static int hf_mpls_echo_sub_tlv_mp_ip_high;
171
static int hf_mpls_echo_sub_tlv_mp_mask;
172
static int hf_mpls_echo_sub_tlv_op_type;
173
static int hf_mpls_echo_sub_tlv_addr_type;
174
static int hf_mpls_echo_sub_tlv_fec_tlv_value;
175
static int hf_mpls_echo_sub_tlv_label;
176
static int hf_mpls_echo_sub_tlv_traffic_class;
177
static int hf_mpls_echo_sub_tlv_s_bit;
178
static int hf_mpls_echo_sub_tlv_res;
179
static int hf_mpls_echo_sub_tlv_remote_peer_unspecified;
180
static int hf_mpls_echo_sub_tlv_remote_peer_ip;
181
static int hf_mpls_echo_sub_tlv_remore_peer_ipv6;
182
static int hf_mpls_echo_tlv_dd_map_type;
183
static int hf_mpls_echo_tlv_dd_map_length;
184
static int hf_mpls_echo_tlv_dd_map_value;
185
static int hf_mpls_echo_tlv_padaction;
186
static int hf_mpls_echo_tlv_padding;
187
static int hf_mpls_echo_tlv_vendor;
188
static int hf_mpls_echo_tlv_ilso_addr_type;
189
static int hf_mpls_echo_tlv_ilso_mbz;
190
static int hf_mpls_echo_tlv_ilso_ipv4_addr;
191
static int hf_mpls_echo_tlv_ilso_ipv4_int_addr;
192
static int hf_mpls_echo_tlv_ilso_ipv6_addr;
193
static int hf_mpls_echo_tlv_ilso_ipv6_int_addr;
194
static int hf_mpls_echo_tlv_ilso_int_index;
195
static int hf_mpls_echo_tlv_ilso_label;
196
static int hf_mpls_echo_tlv_ilso_exp;
197
static int hf_mpls_echo_tlv_ilso_bos;
198
static int hf_mpls_echo_tlv_ilso_ttl;
199
#if 0
200
static int hf_mpls_echo_tlv_rto_ipv4;
201
static int hf_mpls_echo_tlv_rto_ipv6;
202
#endif
203
static int hf_mpls_echo_tlv_reply_tos;
204
static int hf_mpls_echo_tlv_reply_tos_mbz;
205
static int hf_mpls_echo_tlv_errored_type;
206
static int hf_mpls_echo_tlv_ds_map_ingress_if_num;
207
static int hf_mpls_echo_tlv_ds_map_egress_if_num;
208
static int hf_mpls_echo_lspping_tlv_src_gid;
209
static int hf_mpls_echo_lspping_tlv_src_nid;
210
static int hf_mpls_echo_lspping_tlv_src_tunnel_no;
211
static int hf_mpls_echo_lspping_tlv_lsp_no;
212
static int hf_mpls_echo_lspping_tlv_dst_gid;
213
static int hf_mpls_echo_lspping_tlv_dst_nid;
214
static int hf_mpls_echo_lspping_tlv_dst_tunnel_no;
215
static int hf_mpls_echo_lspping_tlv_resv;
216
static int hf_mpls_echo_lspping_tlv_src_addr_gid;
217
static int hf_mpls_echo_lspping_tlv_src_addr_nid;
218
static int hf_mpls_echo_lspping_tlv_pw_serv_identifier;
219
static int hf_mpls_echo_lspping_tlv_pw_src_ac_id;
220
static int hf_mpls_echo_lspping_tlv_pw_dst_ac_id;
221
static int hf_mpls_echo_padding;
222
/* static int hf_mpls_echo_lspping_tlv_pw_agi_type; */
223
/* static int hf_mpls_echo_lspping_tlv_pw_agi_len; */
224
/* static int hf_mpls_echo_lspping_tlv_pw_agi_val; */
225
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_p2mp_id;
226
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz1;
227
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_tunnel_id;
228
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ext_tunnel_id;
229
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ipv4_sender;
230
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz2;
231
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_lsp_id;
232
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_p2mp_id;
233
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ext_tunnel_id;
234
static int hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ipv6_sender;
235
static int hf_mpls_echo_tlv_echo_jitter;
236
static int hf_mpls_echo_tlv_responder_indent_type;
237
static int hf_mpls_echo_tlv_responder_indent_len;
238
static int hf_mpls_echo_tlv_responder_indent_ipv4;
239
static int hf_mpls_echo_tlv_responder_indent_ipv6;
240
static int hf_mpls_echo_tlv_bfd;
241
242
static int ett_mpls_echo;
243
static int ett_mpls_echo_gflags;
244
static int ett_mpls_echo_tlv;
245
static int ett_mpls_echo_tlv_fec;
246
static int ett_mpls_echo_tlv_ds_map;
247
static int ett_mpls_echo_tlv_ilso;
248
static int ett_mpls_echo_tlv_dd_map;
249
static int ett_mpls_echo_tlv_ddstlv_map;
250
251
static expert_field ei_mpls_echo_tlv_fec_len;
252
static expert_field ei_mpls_echo_tlv_dd_map_subtlv_len;
253
static expert_field ei_mpls_echo_tlv_len;
254
static expert_field ei_mpls_echo_tlv_ds_map_muti_len;
255
static expert_field ei_mpls_echo_unknown_address_type;
256
static expert_field ei_mpls_echo_incorrect_address_type;
257
static expert_field ei_mpls_echo_malformed;
258
259
static const value_string mpls_echo_msgtype[] = {
260
    {1, "MPLS Echo Request"},
261
    {2, "MPLS Echo Reply"},
262
    {3, "MPLS Data Plane Verification Request"},
263
    {4, "MPLS Data Plane Verification Reply"},
264
    {0, NULL}
265
};
266
267
static const value_string mpls_echo_replymode[] = {
268
    {1, "Do not reply"},
269
    {2, "Reply via an IPv4/IPv6 UDP packet"},
270
    {3, "Reply via an IPv4/IPv6 UDP packet with Router Alert"},
271
    {4, "Reply via application level control channel"},
272
    {0, NULL}
273
};
274
275
/* http://www.iana.org/assignments/mpls-lsp-ping-parameters/mpls-lsp-ping-parameters.xml */
276
static const value_string mpls_echo_returncode[] = {
277
    { 0, "No return code"},
278
    { 1, "Malformed echo request received"},
279
    { 2, "One or more of the TLVs was not understood"},
280
    { 3, "Replying router is an egress for the FEC at stack depth RSC"},
281
    { 4, "Replying router has no mapping for the FEC at stack depth RSC"},
282
    { 5, "Downstream Mapping Mismatch"}, /*[RFC4379] */
283
    { 6, "Upstream Interface Index Unknown"}, /*[RFC4379]*/
284
    { 7, "Reserved"},
285
    { 8, "Label switched at stack-depth RSC"},
286
    { 9, "Label switched but no MPLS forwarding at stack-depth RSC"},
287
    {10, "Mapping for this FEC is not the given label at stack depth RSC"},
288
    {11, "No label entry at stack-depth RSC"},
289
    {12, "Protocol not associated with interface at FEC stack depth RSC"},
290
    {13, "Premature termination, label stack shrinking to a single label"},
291
    {14, "See DDM TLV for meaning of Return Code and Return SubCode"}, /* [RFC6424] */
292
    {15, "Label switched with FEC change"}, /* [RFC6424] */
293
    /* 16-251 Unassigned */
294
    /* 252-255 Reserved for Vendor private use [RFC4379 */
295
    {0, NULL}
296
};
297
static value_string_ext mpls_echo_returncode_ext = VALUE_STRING_EXT_INIT(mpls_echo_returncode);
298
299
0
#define TLV_TARGET_FEC_STACK       0x0001
300
1
#define TLV_DOWNSTREAM_MAPPING     0x0002
301
0
#define TLV_PAD                    0x0003
302
0
#define TLV_ERROR_CODE             0x0004
303
0
#define TLV_VENDOR_CODE            0x0005
304
#define TLV_TBD                    0x0006
305
0
#define TLV_ILSO_IPv4              0x0007
306
0
#define TLV_ILSO_IPv6              0x0008
307
0
#define TLV_ERRORED_TLV            0x0009
308
0
#define TLV_REPLY_TOS              0x000A
309
#if 0
310
#define TLV_RTO_IPv4               0x000B
311
#define TLV_RTO_IPv6               0x000C
312
#endif
313
0
#define TLV_P2MP_RESPONDER_IDENT   0x000B
314
0
#define TLV_P2MP_ECHO_JITTER       0x000C
315
/* As per RFC 6426 https://tools.ietf.org/html/rfc6426 Section: 2.2.1 */
316
0
#define TLV_SRC_IDENTIFIER         0x000D
317
0
#define TLV_DST_IDENTIFIER         0x000E
318
/* As per RFC 5884 https://tools.ietf.org/html/rfc5884 Section: 6.1 */
319
0
#define TLV_BFD_DISCRIMINATOR      0x000F
320
/* As per RFC 6426 https://tools.ietf.org/html/rfc6426 Section: 7.3 */
321
0
#define TLV_REVERSE_PATH_FEC_STACK 0x0010
322
0
#define TLV_DETAILED_DOWNSTREAM    0x0014 /* [RFC6424] */
323
1
#define TLV_VENDOR_PRIVATE_START   0xFC00
324
#define TLV_VENDOR_PRIVATE_END     0xFFFF
325
326
/* MPLS Echo TLV Type names */
327
static const value_string mpls_echo_tlv_type_names[] = {
328
    { TLV_TARGET_FEC_STACK,          "Target FEC Stack" },
329
    { TLV_DOWNSTREAM_MAPPING,        "Downstream Mapping" },
330
    { TLV_PAD,                       "Pad" },
331
    { TLV_ERROR_CODE,                "Error Code" },
332
    { TLV_VENDOR_CODE,               "Vendor Enterprise Code" },
333
    { TLV_TBD,                       "TDB" },
334
    { TLV_ILSO_IPv4,                 "IPv4 Interface and Label Stack Object" },
335
    { TLV_ILSO_IPv6,                 "IPv6 Interface and Label Stack Object" },
336
    { TLV_ERRORED_TLV,               "Errored TLVs" },
337
    { TLV_REPLY_TOS,                 "Reply TOS Byte" },
338
#if 0
339
    { TLV_RTO_IPv4,                  "IPv4 Reply-to Object" },
340
    { TLV_RTO_IPv6,                  "IPv6 Reply-to Object" },
341
#endif
342
    { TLV_P2MP_RESPONDER_IDENT,      "P2MP Responder Identifier" },
343
    { TLV_P2MP_ECHO_JITTER,          "P2MP Echo Jitter" },
344
    { TLV_SRC_IDENTIFIER,            "Source Identifier TLV" },
345
    { TLV_DST_IDENTIFIER,            "Destination Identifier TLV" },
346
    { TLV_BFD_DISCRIMINATOR,         "BFD Discriminator TLV" },
347
    { TLV_REVERSE_PATH_FEC_STACK,    "Reverse-path Target FEC Stack" },
348
    { TLV_DETAILED_DOWNSTREAM,       "Detailed Downstream Mapping"},
349
    { TLV_VENDOR_PRIVATE_START,      "Vendor Private" },
350
    { 0, NULL}
351
};
352
static value_string_ext mpls_echo_tlv_type_names_ext = VALUE_STRING_EXT_INIT(mpls_echo_tlv_type_names);
353
354
/*As per RFC 4379, https://tools.ietf.org/html/rfc4379 Section: 3.2 */
355
0
#define TLV_FEC_STACK_LDP_IPv4              1
356
0
#define TLV_FEC_STACK_LDP_IPv6              2
357
0
#define TLV_FEC_STACK_RSVP_IPv4             3
358
0
#define TLV_FEC_STACK_RSVP_IPv6             4
359
0
#define TLV_FEC_STACK_RES                   5
360
0
#define TLV_FEC_STACK_VPN_IPv4              6
361
0
#define TLV_FEC_STACK_VPN_IPv6              7
362
0
#define TLV_FEC_STACK_L2_VPN                8
363
0
#define TLV_FEC_STACK_L2_CID_OLD            9
364
0
#define TLV_FEC_STACK_L2_CID_NEW           10
365
#define TLV_FEC_STACK_L2_FEC_129           11
366
0
#define TLV_FEC_STACK_BGP_LAB_v4           12
367
0
#define TLV_FEC_STACK_BGP_LAB_v6           13
368
0
#define TLV_FEC_STACK_GEN_IPv4             14
369
0
#define TLV_FEC_STACK_GEN_IPv6             15
370
0
#define TLV_FEC_STACK_NIL                  16
371
/*As per RFC 6425, https://tools.ietf.org/html/rfc6425 Section: 3.1 */
372
0
#define TLV_FEC_STACK_P2MP_IPv4            17
373
0
#define TLV_FEC_STACK_P2MP_IPv6            18
374
/*As per RFC 6426, https://tools.ietf.org/html/rfc6426 Section: 2.3 */
375
0
#define TLV_FEC_STACK_STATIC_LSP           22
376
0
#define TLV_FEC_STACK_STATIC_PW            23
377
/*As per RFC 8029, https://tools.ietf.org/html/rfc8029 Section 3.2 */
378
0
#define TLV_FEC_STACK_PW_IPv6_FEC_128      24
379
#define TLV_FEC_STACK_PW_IPv6_FEC_129      25
380
0
#define TLV_FEC_VENDOR_PRIVATE_START   0xFC00
381
#define TLV_FEC_VENDOR_PRIVATE_END     0xFFFF
382
/*As per RFC 8287, https://tools.ietf.org/html/rfc8287 Section: 9.1 */
383
0
#define TLV_FEC_STACK_SR_IGP_IPv4          34
384
0
#define TLV_FEC_STACK_SR_IGP_IPv6          35
385
0
#define TLV_FEC_STACK_SR_IGP_ADJ           36
386
387
/* FEC sub-TLV Type names */
388
static const value_string mpls_echo_tlv_fec_names[] = {
389
    { TLV_FEC_STACK_LDP_IPv4,       "LDP IPv4 prefix"},
390
    { TLV_FEC_STACK_LDP_IPv6,       "LDP IPv6 prefix"},
391
    { TLV_FEC_STACK_RSVP_IPv4,      "RSVP IPv4 Session Query"},
392
    { TLV_FEC_STACK_RSVP_IPv6,      "RSVP IPv6 Session Query"},
393
    { TLV_FEC_STACK_RES,            "Reserved"},
394
    { TLV_FEC_STACK_VPN_IPv4,       "VPN IPv4 prefix"},
395
    { TLV_FEC_STACK_VPN_IPv6,       "VPN IPv6 prefix"},
396
    { TLV_FEC_STACK_L2_VPN,         "L2 VPN endpoint"},
397
    { TLV_FEC_STACK_L2_CID_OLD,     "FEC 128 Pseudowire - IPv4 (Deprecated)"},
398
    { TLV_FEC_STACK_L2_CID_NEW,     "FEC 128 Pseudowire - IPv4"},
399
    { TLV_FEC_STACK_L2_FEC_129,     "FEC 129 Pseudowire - IPv4"},
400
    { TLV_FEC_STACK_BGP_LAB_v4,     "BGP labeled IPv4 prefix"},
401
    { TLV_FEC_STACK_BGP_LAB_v6,     "BGP labeled IPv6 prefix"},
402
    { TLV_FEC_STACK_GEN_IPv4,       "Generic IPv4 prefix"},
403
    { TLV_FEC_STACK_GEN_IPv6,       "Generic IPv6 prefix"},
404
    { TLV_FEC_STACK_NIL,            "Nil FEC"},
405
    { TLV_FEC_STACK_P2MP_IPv4,      "RSVP P2MP IPv4 Session Query"},
406
    { TLV_FEC_STACK_P2MP_IPv6,      "RSVP P2MP IPv6 Session Query"},
407
    { TLV_FEC_STACK_STATIC_LSP,     "Static LSP"},
408
    { TLV_FEC_STACK_STATIC_PW,      "Static Pseudowire"},
409
    { TLV_FEC_STACK_PW_IPv6_FEC_128,"FEC 128 Pseudowire - IPv6"},
410
    { TLV_FEC_STACK_PW_IPv6_FEC_129,"FEC 129 Pseudowire - IPv6"},
411
    { TLV_FEC_STACK_SR_IGP_IPv4,    "IPv4 IGP-Prefix Segment ID"},
412
    { TLV_FEC_STACK_SR_IGP_IPv6,    "IPv6 IGP-Prefix Segment ID"},
413
    { TLV_FEC_STACK_SR_IGP_ADJ,     "IGP-Adjacency Segment ID"},
414
    { TLV_FEC_VENDOR_PRIVATE_START, "Vendor Private"},
415
    { 0, NULL}
416
};
417
static value_string_ext mpls_echo_tlv_fec_names_ext = VALUE_STRING_EXT_INIT(mpls_echo_tlv_fec_names);
418
419
/* [RFC 6424] */
420
0
#define TLV_FEC_MULTIPATH_DATA     1
421
0
#define TLV_FEC_LABEL_STACK        2
422
0
#define TLV_FEC_STACK_CHANGE       3
423
424
#if 0
425
static const value_string mpls_echo_subtlv_names[] = {
426
    { TLV_FEC_MULTIPATH_DATA,    "Multipath data"},
427
    { TLV_FEC_LABEL_STACK,       "Label stack"},
428
    { TLV_FEC_STACK_CHANGE,      "FEC stack change"},
429
    { 0, NULL}
430
};
431
#endif
432
433
/* [RFC 6424] */
434
0
#define TLV_MULTIPATH_NO_MULTIPATH          0
435
0
#define TLV_MULTIPATH_IP_ADDRESS            2
436
0
#define TLV_MULTIPATH_IP_ADDRESS_RANGE      4
437
0
#define TLV_MULTIPATH_BIT_MASKED_IP         8
438
0
#define TLV_MULTIPATH_BIT_MASKED_LABEL_SET  9
439
440
#if 0
441
static const value_string mpls_echo_multipathtlv_type[] = {
442
    { TLV_MULTIPATH_NO_MULTIPATH,         "Empty (Multipath Length = 0)"},
443
    { TLV_MULTIPATH_IP_ADDRESS,           "IP addresses"},
444
    { TLV_MULTIPATH_IP_ADDRESS_RANGE,     "low/high address pairs"},
445
    { TLV_MULTIPATH_BIT_MASKED_IP,        "IP address prefix and bit mask"},
446
    { TLV_MULTIPATH_BIT_MASKED_LABEL_SET, "Label prefix and bit mask"},
447
    { 0, NULL}
448
};
449
#endif
450
451
/* [RFC 6424] */
452
#define SUB_TLV_FEC_PUSH     1
453
#define SUB_TLV_FEC_POP      2
454
455
static const value_string mpls_echo_subtlv_op_types[] = {
456
    { SUB_TLV_FEC_PUSH,    "Push"},
457
    { SUB_TLV_FEC_POP,     "Pop"},
458
    { 0, NULL}
459
};
460
461
/* [RFC 6424] */
462
0
#define SUB_TLV_FEC_UNSPECIFIED     0
463
0
#define SUB_TLV_FEC_IPV4            1
464
0
#define SUB_TLV_FEC_IPV6            2
465
466
static const value_string mpls_echo_subtlv_addr_types[] = {
467
    { SUB_TLV_FEC_UNSPECIFIED,    "Unspecified"},
468
    { SUB_TLV_FEC_IPV4,           "IPv4"},
469
    { SUB_TLV_FEC_IPV6,           "IPv6"},
470
    { 0, NULL}
471
};
472
473
/* [RFC 8287] */
474
0
#define SUB_TLV_FEC_SR_PROTO_ANY     0
475
0
#define SUB_TLV_FEC_SR_PROTO_OSPF    1
476
0
#define SUB_TLV_FEC_SR_PROTO_ISIS    2
477
478
static const value_string mpls_echo_subtlv_sr_protocol_types[] = {
479
    { SUB_TLV_FEC_SR_PROTO_ANY,  "Any IGP protocol"},
480
    { SUB_TLV_FEC_SR_PROTO_OSPF, "OSPF"},
481
    { SUB_TLV_FEC_SR_PROTO_ISIS, "IS-IS"},
482
    { 0, NULL}
483
};
484
485
/* [RFC 8287] */
486
0
#define SUB_TLV_FEC_SR_IGP_ADJ_UNNUMBERED    0
487
0
#define SUB_TLV_FEC_SR_IGP_ADJ_PARALLEL      1
488
0
#define SUB_TLV_FEC_SR_IGP_ADJ_IPv4          4
489
0
#define SUB_TLV_FEC_SR_IGP_ADJ_IPv6          6
490
491
static const value_string mpls_echo_subtlv_igp_adjacency_types[] = {
492
    { SUB_TLV_FEC_SR_IGP_ADJ_UNNUMBERED, "Unnumbered Interface Adjacency"},
493
    { SUB_TLV_FEC_SR_IGP_ADJ_PARALLEL,   "Parallel Adjacency"},
494
    { SUB_TLV_FEC_SR_IGP_ADJ_IPv4,       "IPv4, Non-parallel Adjacency"},
495
    { SUB_TLV_FEC_SR_IGP_ADJ_IPv6,       "IPv6, Non-parallel Adjacency"},
496
    { 0, NULL}
497
};
498
499
static const value_string mpls_echo_tlv_pad[] = {
500
    { 1, "Drop Pad TLV from reply" },
501
    { 2, "Copy Pad TLV to reply" },
502
    { 0, NULL}
503
};
504
505
/* [RFC 6425] */
506
0
#define TLV_P2MP_RESPONDER_IDENT_IPV4_EGRESS_ADDR 1
507
0
#define TLV_P2MP_RESPONDER_IDENT_IPV6_EGRESS_ADDR 2
508
0
#define TLV_P2MP_RESPONDER_IDENT_IPV4_NODE_ADDR 3
509
0
#define TLV_P2MP_RESPONDER_IDENT_IPV6_NODE_ADDR 4
510
static const value_string mpls_echo_tlv_responder_ident_sub_tlv_type[] = {
511
    { TLV_P2MP_RESPONDER_IDENT_IPV4_EGRESS_ADDR, "IPv4 Egress Address P2MP Responder Identifier"},
512
    { TLV_P2MP_RESPONDER_IDENT_IPV6_EGRESS_ADDR, "IPv6 Egress Address P2MP Responder Identifier"},
513
    { TLV_P2MP_RESPONDER_IDENT_IPV4_NODE_ADDR,   "IPv4 Node Address P2MP Responder Identifier"},
514
    { TLV_P2MP_RESPONDER_IDENT_IPV6_NODE_ADDR,   "IPv6 Node Address P2MP Responder Identifier"},
515
    {0, NULL}
516
};
517
518
0
#define TLV_ADDR_IPv4           1
519
0
#define TLV_ADDR_UNNUM_IPv4     2
520
0
#define TLV_ADDR_IPv6           3
521
0
#define TLV_ADDR_UNNUM_IPv6     4
522
/* As per RFC 6426, https://tools.ietf.org/html/rfc6426 Section: 2.1 */
523
0
#define TLV_ADDR_NONIP          5
524
525
static const value_string mpls_echo_tlv_addr_type[] = {
526
    {TLV_ADDR_IPv4,       "IPv4 Numbered"},
527
    {TLV_ADDR_UNNUM_IPv4, "IPv4 Unnumbered"},
528
    {TLV_ADDR_IPv6,       "IPv6 Numbered"},
529
    {TLV_ADDR_UNNUM_IPv6, "IPv6 Unnumbered"},
530
    {TLV_ADDR_NONIP,      "Non IP"},
531
    {0, NULL}
532
};
533
534
0
#define TLV_DS_MAP_HASH_NO_MP           0
535
#define TLV_DS_MAP_HASH_LABEL           1
536
0
#define TLV_DS_MAP_HASH_IP              2
537
#define TLV_DS_MAP_HASH_LABEL_RANGE     3
538
0
#define TLV_DS_MAP_HASH_IP_RANGE        4
539
0
#define TLV_DS_MAP_HASH_NO_LABEL        5
540
0
#define TLV_DS_MAP_HASH_ALL_IP          6
541
0
#define TLV_DS_MAP_HASH_NO_MATCH        7
542
0
#define TLV_DS_MAP_HASH_BITMASK_IP      8
543
#define TLV_DS_MAP_HASH_BITMASK_LABEL   9
544
545
static const value_string mpls_echo_tlv_ds_map_hash_type[] = {
546
    {TLV_DS_MAP_HASH_NO_MP,         "no multipath"},
547
    {TLV_DS_MAP_HASH_LABEL,         "label"},
548
    {TLV_DS_MAP_HASH_IP,            "IP address"},
549
    {TLV_DS_MAP_HASH_LABEL_RANGE,   "label range"},
550
    {TLV_DS_MAP_HASH_IP_RANGE,      "IP address range"},
551
    {TLV_DS_MAP_HASH_NO_LABEL,      "no more labels"},
552
    {TLV_DS_MAP_HASH_ALL_IP,        "All IP addresses"},
553
    {TLV_DS_MAP_HASH_NO_MATCH,      "no match"},
554
    {TLV_DS_MAP_HASH_BITMASK_IP,    "Bit-masked IPv4 address set"},
555
    {TLV_DS_MAP_HASH_BITMASK_LABEL, "Bit-masked label set"},
556
    {0, NULL}
557
};
558
static value_string_ext mpls_echo_tlv_ds_map_hash_type_ext = VALUE_STRING_EXT_INIT(mpls_echo_tlv_ds_map_hash_type);
559
560
static const value_string mpls_echo_tlv_ds_map_mp_proto[] = {
561
    {0, "Unknown"},
562
    {1, "Static"},
563
    {2, "BGP"},
564
    {3, "LDP"},
565
    {4, "RSVP-TE"},
566
    {5, "OSPF"},
567
    {6, "IS-IS"},
568
    {0, NULL}
569
};
570
571
/*
572
 * Dissector for FEC sub-TLVs
573
 */
574
static void
575
dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, unsigned rem)
576
0
{
577
0
    proto_tree *ti, *tlv_fec_tree;
578
0
    uint16_t    idx = 1, nil_idx = 1, type, saved_type;
579
0
    unsigned    length, nil_length, pad;
580
0
    uint32_t    label, adj_offset, adj_type, adj_proto;
581
0
    uint8_t     exp, bos, ttl;
582
583
0
    while (rem >= 4) { /* Type, Length */
584
0
        type = tvb_get_ntohs(tvb, offset);
585
0
        saved_type = type;
586
        /* Check for Vendor Private sub-TLVs */
587
0
        if (type >= TLV_FEC_VENDOR_PRIVATE_START) /* && <= TLV_FEC_VENDOR_PRIVATE_END always true */
588
0
            type = TLV_FEC_VENDOR_PRIVATE_START;
589
590
0
        length = tvb_get_ntohs(tvb, offset + 2);
591
592
0
        ti = NULL;
593
0
        tlv_fec_tree = NULL;
594
595
        /*
596
         * FEC sub-TLVs are zero-padded to align to four-octet boundary.
597
         * Compute the padding.
598
         */
599
0
        pad = WS_PADDING_TO_4(length);
600
601
0
        if (tree) {
602
0
            tlv_fec_tree = proto_tree_add_subtree_format(tree, tvb, offset, length + pad,
603
0
                                     ett_mpls_echo_tlv_fec, NULL, "FEC Element %u: %s",
604
0
                                     idx, val_to_str_ext(pinfo->pool, type, &mpls_echo_tlv_fec_names_ext,
605
0
                                                         "Unknown FEC type (0x%04X)"));
606
607
            /* FEC sub-TLV Type and Length */
608
0
            proto_tree_add_uint_format_value(tlv_fec_tree, hf_mpls_echo_tlv_fec_type, tvb,
609
0
                                       offset, 2, saved_type, "%s (%u)",
610
0
                                       val_to_str_ext_const(type, &mpls_echo_tlv_fec_names_ext,
611
0
                                                            "Unknown sub-TLV type"), saved_type);
612
613
0
            ti = proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_len, tvb, offset + 2,
614
0
                                     2, ENC_BIG_ENDIAN);
615
0
        }
616
617
0
        if (length + 4 > rem) {
618
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
619
0
                                   "Invalid FEC Sub-TLV Length (claimed %u, found %u)",
620
0
                                   length, rem - 4);
621
0
            return;
622
0
        }
623
624
        /* FEC sub-TLV Value */
625
0
        switch (type) {
626
0
        case TLV_FEC_STACK_LDP_IPv4:
627
0
            if (tree) {
628
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv4,
629
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
630
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv4_mask,
631
0
                                    tvb, offset + 8, 1, ENC_BIG_ENDIAN);
632
0
            }
633
0
            break;
634
0
        case TLV_FEC_STACK_LDP_IPv6:
635
0
            if (tree) {
636
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv6,
637
0
                                    tvb, offset + 4, 16, ENC_NA);
638
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv6_mask,
639
0
                                    tvb, offset + 20, 1, ENC_BIG_ENDIAN);
640
0
            }
641
0
            break;
642
0
        case TLV_FEC_STACK_RSVP_IPv4:
643
0
            if (length != 20) {
644
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
645
0
                                       "Invalid FEC Sub-TLV Length "
646
0
                                       "(claimed %u, should be %u)",
647
0
                                       length, 20);
648
0
                return;
649
0
            }
650
0
            if (tree) {
651
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint,
652
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
653
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz1,
654
0
                                    tvb, offset + 8, 2, ENC_BIG_ENDIAN);
655
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id,
656
0
                                    tvb, offset + 10, 2, ENC_BIG_ENDIAN);
657
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id,
658
0
                                                  tvb, offset + 12, 4, ENC_BIG_ENDIAN);
659
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender,
660
0
                                    tvb, offset + 16, 4, ENC_BIG_ENDIAN);
661
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz2,
662
0
                                    tvb, offset + 20, 2, ENC_BIG_ENDIAN);
663
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id,
664
0
                                    tvb, offset + 22, 2, ENC_BIG_ENDIAN);
665
0
            }
666
0
            break;
667
0
        case TLV_FEC_STACK_RSVP_IPv6:
668
0
            if (length != 56) {
669
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
670
0
                                       "Invalid FEC Sub-TLV Length "
671
0
                                       "(claimed %u, should be %u)",
672
0
                                       length, 56);
673
0
                return;
674
0
            }
675
0
            if (tree) {
676
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint,
677
0
                                    tvb, offset + 4, 16, ENC_NA);
678
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz1,
679
0
                                    tvb, offset + 20, 2, ENC_BIG_ENDIAN);
680
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id,
681
0
                                    tvb, offset + 22, 2, ENC_BIG_ENDIAN);
682
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id,
683
0
                                                  tvb, offset + 24, 16, ENC_NA);
684
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender,
685
0
                                    tvb, offset + 40, 16, ENC_NA);
686
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz2,
687
0
                                    tvb, offset + 56, 2, ENC_BIG_ENDIAN);
688
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id,
689
0
                                    tvb, offset + 58, 2, ENC_BIG_ENDIAN);
690
0
            }
691
0
            break;
692
0
        case TLV_FEC_STACK_VPN_IPv4:
693
0
            if (tree) {
694
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_vpn_route_dist,
695
0
                                    tvb, offset + 4, 8, ENC_NA);
696
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_vpn_ipv4,
697
0
                                    tvb, offset + 12, 4, ENC_BIG_ENDIAN);
698
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_vpn_len,
699
0
                                    tvb, offset + 16, 1, ENC_BIG_ENDIAN);
700
0
            }
701
0
            break;
702
0
        case TLV_FEC_STACK_VPN_IPv6:
703
0
            if (tree) {
704
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_vpn_route_dist,
705
0
                                    tvb, offset + 4, 8, ENC_NA);
706
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_vpn_ipv6,
707
0
                                    tvb, offset + 12, 16, ENC_NA);
708
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_vpn_len,
709
0
                                    tvb, offset + 28, 1, ENC_BIG_ENDIAN);
710
0
            }
711
0
            break;
712
0
        case TLV_FEC_STACK_L2_VPN:
713
0
            if (tree) {
714
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2_vpn_route_dist,
715
0
                                    tvb, offset + 4, 8, ENC_NA);
716
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2_vpn_send_ve_id,
717
0
                                    tvb, offset + 12, 2, ENC_BIG_ENDIAN);
718
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2_vpn_recv_ve_id,
719
0
                                    tvb, offset + 14, 2, ENC_BIG_ENDIAN);
720
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2_vpn_encap_type,
721
0
                                    tvb, offset + 16, 2, ENC_BIG_ENDIAN);
722
0
            }
723
0
            break;
724
0
        case TLV_FEC_STACK_L2_CID_OLD:
725
0
            if (tree) {
726
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_remote,
727
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
728
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_vcid,
729
0
                                    tvb, offset + 8, 4, ENC_BIG_ENDIAN);
730
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_encap,
731
0
                                    tvb, offset + 12, 2, ENC_BIG_ENDIAN);
732
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_mbz,
733
0
                                    tvb, offset + 14, 2, ENC_BIG_ENDIAN);
734
0
            }
735
0
            break;
736
0
        case TLV_FEC_STACK_L2_CID_NEW:
737
0
            if (length < 14) {
738
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
739
0
                                       "Invalid FEC Sub-TLV Length "
740
0
                                       "(claimed %u, should be %u)",
741
0
                                       length, 14);
742
0
                return;
743
0
            }
744
0
            if (tree) {
745
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_sender,
746
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
747
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_remote,
748
0
                                    tvb, offset + 8, 4, ENC_BIG_ENDIAN);
749
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_vcid,
750
0
                                    tvb, offset + 12, 4, ENC_BIG_ENDIAN);
751
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_encap,
752
0
                                    tvb, offset + 16, 2, ENC_BIG_ENDIAN);
753
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_mbz,
754
0
                                    tvb, offset + 18, 2, ENC_BIG_ENDIAN);
755
0
            }
756
0
            break;
757
0
        case TLV_FEC_VENDOR_PRIVATE_START:
758
0
            if (length < 4) { /* SMI Enterprise code */
759
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
760
0
                                       "Invalid FEC Sub-TLV Length "
761
0
                                       "(claimed %u, should be >= %u)",
762
0
                                       length, 4);
763
0
            } else {
764
0
                if (tree) {
765
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_vendor, tvb,
766
0
                                        offset + 4, 4, ENC_BIG_ENDIAN);
767
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_value, tvb,
768
0
                                        offset + 8, length - 4, ENC_NA);
769
0
                }
770
0
            }
771
0
            break;
772
0
        case TLV_FEC_STACK_BGP_LAB_v4:
773
0
            if (tree) {
774
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_ipv4,
775
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
776
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_len,
777
0
                                    tvb, offset + 8, 1, ENC_BIG_ENDIAN);
778
0
            }
779
0
            break;
780
0
        case TLV_FEC_STACK_BGP_LAB_v6:
781
0
            if (tree) {
782
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_ipv6,
783
0
                                    tvb, offset + 4, 16, ENC_NA);
784
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_len,
785
0
                                    tvb, offset + 20, 1, ENC_BIG_ENDIAN);
786
0
            }
787
0
            break;
788
0
        case TLV_FEC_STACK_GEN_IPv4:
789
0
            if (tree) {
790
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv4,
791
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
792
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv4_mask,
793
0
                                    tvb, offset + 8, 1, ENC_BIG_ENDIAN);
794
0
            }
795
0
            break;
796
0
        case TLV_FEC_STACK_GEN_IPv6:
797
0
            if (tree) {
798
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv6,
799
0
                                    tvb, offset + 4, 16, ENC_NA);
800
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv6_mask,
801
0
                                    tvb, offset + 20, 1, ENC_BIG_ENDIAN);
802
0
            }
803
0
            break;
804
0
        case TLV_FEC_STACK_PW_IPv6_FEC_128:
805
0
            if (length != 38) {
806
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
807
0
                                       "Invalid FEC Sub-TLV Length "
808
0
                                       "(claimed %u, should be %u)",
809
0
                                       length, 38);
810
0
                return;
811
0
            }
812
0
            if (tree) {
813
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_pw_ipv6_128_sender,
814
0
                                    tvb, offset + 4, 16, ENC_NA);
815
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_pw_ipv6_128_remote,
816
0
                                    tvb, offset + 20, 16, ENC_NA);
817
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_id,
818
0
                                    tvb, offset + 36, 2, ENC_BIG_ENDIAN);
819
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_type,
820
0
                                    tvb, offset + 38, 2, ENC_BIG_ENDIAN);
821
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_pw_ipv6_128_mbz,
822
0
                                    tvb, offset + 40, 2, ENC_BIG_ENDIAN);
823
0
            }
824
0
            break;
825
0
        case TLV_FEC_STACK_NIL:
826
0
                nil_length = length;
827
0
                while (nil_length >= 4) {
828
0
                    decode_mpls_label(tvb, offset + 4, &label, &exp, &bos, &ttl);
829
0
                    if (label <= MPLS_LABEL_MAX_RESERVED) {
830
0
                        proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_nil_label,
831
0
                                                   tvb, offset + 4, 3, label, "Label %u: %u (%s)", nil_idx, label,
832
0
                                                   val_to_str_const(label, special_labels, "Reserved - Unknown"));
833
0
                    } else {
834
0
                        proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_nil_label,
835
0
                                                   tvb, offset + 4, 3, label, "Label %u: %u", nil_idx, label);
836
0
                    }
837
0
                    nil_length -= 4;
838
0
                    offset     += 4;
839
0
                    nil_idx++;
840
0
                }
841
0
            break;
842
0
        case TLV_FEC_STACK_P2MP_IPv4:
843
0
            if (length != 20) {
844
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
845
0
                                       "Invalid FEC Sub-TLV Length "
846
0
                                       "(claimed %u, should be %u)",
847
0
                                       length, 20);
848
0
                return;
849
0
            }
850
0
            if (tree) {
851
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_p2mp_id,
852
0
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
853
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz1,
854
0
                                    tvb, offset + 8, 2, ENC_BIG_ENDIAN);
855
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_tunnel_id,
856
0
                                    tvb, offset + 10, 2, ENC_BIG_ENDIAN);
857
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ext_tunnel_id,
858
0
                                                  tvb, offset + 12, 4, ENC_BIG_ENDIAN);
859
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ipv4_sender,
860
0
                                    tvb, offset + 16, 4, ENC_BIG_ENDIAN);
861
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz2,
862
0
                                    tvb, offset + 20, 2, ENC_BIG_ENDIAN);
863
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_lsp_id,
864
0
                                    tvb, offset + 22, 2, ENC_BIG_ENDIAN);
865
0
            }
866
0
            break;
867
868
0
        case TLV_FEC_STACK_P2MP_IPv6:
869
0
            if (length != 56) {
870
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
871
0
                                       "Invalid FEC Sub-TLV Length "
872
0
                                       "(claimed %u, should be %u)",
873
0
                                       length, 56);
874
0
                return;
875
0
            }
876
0
            if (tree) {
877
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_p2mp_id,
878
0
                                    tvb, offset + 4, 16, ENC_NA);
879
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz1,
880
0
                                    tvb, offset + 20, 2, ENC_BIG_ENDIAN);
881
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_tunnel_id,
882
0
                                    tvb, offset + 22, 2, ENC_BIG_ENDIAN);
883
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ext_tunnel_id,
884
0
                                                  tvb, offset + 24, 16, ENC_NA);
885
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ipv6_sender,
886
0
                                    tvb, offset + 40, 16, ENC_NA);
887
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz2,
888
0
                                    tvb, offset + 56, 2, ENC_BIG_ENDIAN);
889
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_lsp_id,
890
0
                                    tvb, offset + 58, 2, ENC_BIG_ENDIAN);
891
0
            }
892
0
            break;
893
0
        case TLV_FEC_STACK_STATIC_LSP:
894
0
            if (tree) {
895
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_gid,
896
0
                                    tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
897
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_nid,
898
0
                                    tvb, (offset + 8), 4, ENC_BIG_ENDIAN);
899
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_tunnel_no,
900
0
                                    tvb, (offset + 12), 2, ENC_BIG_ENDIAN);
901
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_lsp_no,
902
0
                                    tvb, (offset + 14), 2, ENC_BIG_ENDIAN);
903
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_gid,
904
0
                                    tvb, (offset + 16), 4, ENC_BIG_ENDIAN);
905
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_nid,
906
0
                                    tvb, (offset + 20), 4, ENC_BIG_ENDIAN);
907
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_tunnel_no,
908
0
                                    tvb, (offset + 24), 2, ENC_BIG_ENDIAN);
909
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_resv,
910
0
                                    tvb, (offset + 26), 2, ENC_BIG_ENDIAN);
911
0
            }
912
0
            break;
913
0
        case TLV_FEC_STACK_STATIC_PW:
914
0
            if (tree) {
915
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_serv_identifier,
916
0
                                    tvb, (offset + 4), 8, ENC_BIG_ENDIAN);
917
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_gid,
918
0
                                    tvb, (offset + 12), 4, ENC_BIG_ENDIAN);
919
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_nid,
920
0
                                    tvb, (offset + 16), 4, ENC_BIG_ENDIAN);
921
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_src_ac_id,
922
0
                                    tvb, (offset + 20), 4, ENC_BIG_ENDIAN);
923
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_gid,
924
0
                                    tvb, (offset + 24), 4, ENC_BIG_ENDIAN);
925
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_nid,
926
0
                                    tvb, (offset + 28), 4, ENC_BIG_ENDIAN);
927
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_dst_ac_id,
928
0
                                    tvb, (offset + 32), 4, ENC_BIG_ENDIAN);
929
0
            }
930
0
            break;
931
0
        case TLV_FEC_STACK_SR_IGP_IPv4:
932
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_ipv4,
933
0
                                tvb, offset + 4, 4, ENC_BIG_ENDIAN);
934
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_mask,
935
0
                                tvb, offset + 8, 1, ENC_BIG_ENDIAN);
936
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_protocol,
937
0
                                tvb, offset + 9, 1, ENC_BIG_ENDIAN);
938
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_reserved,
939
0
                                tvb, offset + 10, 2, ENC_NA);
940
0
            break;
941
0
        case TLV_FEC_STACK_SR_IGP_IPv6:
942
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_ipv6,
943
0
                                tvb, offset + 4, 16, ENC_NA);
944
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_mask,
945
0
                                tvb, offset + 20, 1, ENC_BIG_ENDIAN);
946
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_protocol,
947
0
                                tvb, offset + 21, 1, ENC_BIG_ENDIAN);
948
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_reserved,
949
0
                                tvb, offset + 22, 2, ENC_NA);
950
0
            break;
951
0
        case TLV_FEC_STACK_SR_IGP_ADJ:
952
0
            adj_offset = offset +4;
953
0
            proto_tree_add_item_ret_uint(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_type,
954
0
                                tvb, adj_offset, 1, ENC_BIG_ENDIAN, &adj_type);
955
0
            adj_offset += 1;
956
0
            proto_tree_add_item_ret_uint(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_protocol,
957
0
                                tvb, adj_offset, 1, ENC_BIG_ENDIAN, &adj_proto);
958
0
            adj_offset += 1;
959
0
            proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_reserved,
960
0
                                tvb, adj_offset, 2, ENC_NA);
961
0
            adj_offset += 2;
962
0
            switch(adj_type) {
963
0
                case SUB_TLV_FEC_SR_IGP_ADJ_IPv4:
964
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_local_ipv4,
965
0
                                        tvb, adj_offset, 4, ENC_BIG_ENDIAN);
966
0
                    adj_offset += 4;
967
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_remote_ipv4,
968
0
                                        tvb, adj_offset, 4, ENC_BIG_ENDIAN);
969
0
                    adj_offset += 4;
970
0
                    break;
971
0
                case SUB_TLV_FEC_SR_IGP_ADJ_IPv6:
972
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_local_ipv6,
973
0
                                        tvb, adj_offset, 16, ENC_NA);
974
0
                    adj_offset += 16;
975
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_remote_ipv6,
976
0
                                        tvb, adj_offset, 16, ENC_NA);
977
0
                    adj_offset += 16;
978
0
                    break;
979
0
                case SUB_TLV_FEC_SR_IGP_ADJ_UNNUMBERED:
980
0
                case SUB_TLV_FEC_SR_IGP_ADJ_PARALLEL:
981
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_local_ident,
982
0
                                        tvb, adj_offset, 4, ENC_NA);
983
0
                    adj_offset += 4;
984
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_remote_ident,
985
0
                                        tvb, adj_offset, 4, ENC_NA);
986
0
                    adj_offset += 4;
987
0
                    break;
988
0
            }
989
0
            switch(adj_proto) {
990
0
                case SUB_TLV_FEC_SR_PROTO_OSPF:
991
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_adv_ident_ospf,
992
0
                                        tvb, adj_offset, 4, ENC_NA);
993
0
                    adj_offset += 4;
994
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_rec_ident_ospf,
995
0
                                        tvb, adj_offset, 4, ENC_NA);
996
0
                    break;
997
0
                case SUB_TLV_FEC_SR_PROTO_ISIS:
998
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_adv_ident_isis,
999
0
                                        tvb, adj_offset, 6, ENC_NA);
1000
0
                    adj_offset += 6;
1001
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_rec_ident_isis,
1002
0
                                        tvb, adj_offset, 6, ENC_NA);
1003
0
                    break;
1004
0
                case SUB_TLV_FEC_SR_PROTO_ANY:
1005
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_adv_ident,
1006
0
                                        tvb, adj_offset, 4, ENC_NA);
1007
0
                    adj_offset += 4;
1008
0
                    proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_igp_adj_rec_ident,
1009
0
                                        tvb, adj_offset, 4, ENC_NA);
1010
0
                    break;
1011
0
            }
1012
0
            break;
1013
0
        case TLV_FEC_STACK_RES:
1014
0
        default:
1015
0
            if (length)
1016
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_value,
1017
0
                                        tvb, offset + 4, length, ENC_NA);
1018
0
            break;
1019
0
        }
1020
1021
        /*
1022
         * Check for padding based on sub-TLV length alignment;
1023
         */
1024
0
        if (pad != 0) {
1025
0
            if (length + 4 + pad > rem) {
1026
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
1027
0
                                       "Invalid FEC Sub-TLV Padded Length (claimed %u, found %u)",
1028
0
                                       length + pad, rem - 4);
1029
0
                return;
1030
0
            } else {
1031
0
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_padding, tvb, offset + 4 + length, pad, ENC_NA);
1032
0
            }
1033
0
            length += pad;
1034
0
        }
1035
1036
0
        rem    -= 4 + length;
1037
0
        offset += 4 + length;
1038
0
        idx++;
1039
0
    }
1040
0
}
1041
1042
1043
/*
1044
 * Dissector for Downstream Mapping TLV
1045
 */
1046
static void
1047
dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem)
1048
1
{
1049
1
    proto_tree *ti, *tlv_ds_map_tree;
1050
1
    proto_tree *addr_ti;
1051
1
    uint16_t    mplen, idx = 1;
1052
1
    uint32_t    label;
1053
1
    uint8_t     exp, bos, proto;
1054
1
    uint8_t     hash_type, addr_type;
1055
1056
1
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mtu, tvb,
1057
1
                        offset, 2, ENC_BIG_ENDIAN);
1058
1
    addr_ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_addr_type, tvb,
1059
1
                        offset + 2, 1, ENC_BIG_ENDIAN);
1060
1
    ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_res, tvb,
1061
1
                             offset + 3, 1, ENC_BIG_ENDIAN);
1062
1
    tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map);
1063
1064
1
    proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_res, tvb,
1065
1
                        offset + 3, 1, ENC_BIG_ENDIAN);
1066
1
    proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_i, tvb,
1067
1
                        offset + 3, 1, ENC_BIG_ENDIAN);
1068
1
    proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_n, tvb,
1069
1
                        offset + 3, 1, ENC_BIG_ENDIAN);
1070
1071
1
    addr_type = tvb_get_uint8(tvb, offset + 2);
1072
1
    switch (addr_type) {
1073
0
    case TLV_ADDR_IPv4:
1074
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb,
1075
0
                            offset + 4, 4, ENC_BIG_ENDIAN);
1076
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ip, tvb,
1077
0
                            offset + 8, 4, ENC_BIG_ENDIAN);
1078
0
        break;
1079
0
    case TLV_ADDR_UNNUM_IPv4:
1080
0
    case TLV_ADDR_UNNUM_IPv6:
1081
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb,
1082
0
                            offset + 4, 4, ENC_BIG_ENDIAN);
1083
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_if_index, tvb,
1084
0
                            offset + 8, 4, ENC_BIG_ENDIAN);
1085
0
        break;
1086
0
    case TLV_ADDR_IPv6:
1087
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ipv6, tvb,
1088
0
                            offset + 4, 16, ENC_NA);
1089
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ipv6, tvb,
1090
0
                            offset + 20, 16, ENC_NA);
1091
0
        rem    -= 24;
1092
0
        offset += 24;
1093
0
        break;
1094
0
    case TLV_ADDR_NONIP :
1095
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ingress_if_num, tvb,
1096
0
                             (offset + 4), 4, ENC_BIG_ENDIAN);
1097
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_egress_if_num, tvb,
1098
0
                             (offset + 8), 4, ENC_BIG_ENDIAN);
1099
0
        break;
1100
1
    default:
1101
1
        expert_add_info_format(pinfo, addr_ti, &ei_mpls_echo_unknown_address_type,
1102
1
                               "Unknown Address Type (%u)", addr_type);
1103
1
        break;
1104
1
    }
1105
1
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_hash_type, tvb,
1106
1
                        offset + 12, 1, ENC_BIG_ENDIAN);
1107
1
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_depth, tvb,
1108
1
                        offset + 13, 1, ENC_BIG_ENDIAN);
1109
1
    ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_muti_len, tvb,
1110
1
                        offset + 14, 2, ENC_BIG_ENDIAN);
1111
1112
    /* Get the Multipath Length and Hash Type */
1113
1
    mplen     = tvb_get_ntohs(tvb, offset + 14);
1114
1
    hash_type = tvb_get_uint8(tvb, offset + 12);
1115
1116
1
    rem    -= 16;
1117
1
    offset += 16;
1118
1
    if (rem < mplen) {
1119
0
        expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
1120
0
                               "Invalid FEC Multipath (claimed %u, found %u)",
1121
0
                                mplen, rem);
1122
0
        return;
1123
0
    }
1124
1
    rem -= mplen;
1125
1
    if (mplen) {
1126
0
        switch (hash_type) {
1127
0
        case TLV_DS_MAP_HASH_IP:
1128
0
            if (mplen != 4) {
1129
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
1130
0
                                       "Invalid FEC Multipath (claimed %u, should be 4)",
1131
0
                                       mplen);
1132
0
                break;
1133
0
            }
1134
0
            tlv_ds_map_tree = proto_tree_add_subtree(tree, tvb, offset, 4,
1135
0
                                     ett_mpls_echo_tlv_ds_map, NULL, "Multipath Information");
1136
0
            proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip, tvb,
1137
0
                                offset, 4, ENC_BIG_ENDIAN);
1138
0
            break;
1139
0
        case TLV_DS_MAP_HASH_IP_RANGE:
1140
0
            if (mplen != 8) {
1141
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
1142
0
                                       "Invalid FEC Multipath (claimed %u, should be 8)",
1143
0
                                       mplen);
1144
0
                break;
1145
0
            }
1146
0
            tlv_ds_map_tree = proto_tree_add_subtree(tree, tvb, offset, 8,
1147
0
                                     ett_mpls_echo_tlv_ds_map, NULL, "Multipath Information");
1148
0
            proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip_low, tvb,
1149
0
                                offset, 4, ENC_BIG_ENDIAN);
1150
0
            proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip_high, tvb,
1151
0
                                offset + 4, 4, ENC_BIG_ENDIAN);
1152
0
            break;
1153
0
        case TLV_DS_MAP_HASH_NO_MP:
1154
0
        case TLV_DS_MAP_HASH_NO_LABEL:
1155
0
        case TLV_DS_MAP_HASH_ALL_IP:
1156
0
        case TLV_DS_MAP_HASH_NO_MATCH:
1157
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mp_no_multipath_info, tvb, offset, mplen, ENC_NA);
1158
0
            break;
1159
0
        case TLV_DS_MAP_HASH_BITMASK_IP:
1160
0
            if (mplen < 4) {
1161
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
1162
0
                                       "Invalid FEC Multipath (claimed %u, should be 4)",
1163
0
                                       mplen);
1164
0
                break;
1165
0
            }
1166
0
            tlv_ds_map_tree = proto_tree_add_subtree(tree, tvb, offset, mplen,
1167
0
                                     ett_mpls_echo_tlv_ds_map, NULL, "Multipath Information");
1168
0
            proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip, tvb,
1169
0
                                offset, 4, ENC_BIG_ENDIAN);
1170
0
            if (mplen > 4)
1171
0
                proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_mask, tvb,
1172
0
                                    offset + 4, mplen - 4, ENC_NA);
1173
0
            break;
1174
0
        default:
1175
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mp_value, tvb,
1176
0
                                offset, mplen, ENC_NA);
1177
0
            break;
1178
0
        }
1179
0
    }
1180
1181
1
    offset += mplen;
1182
1183
1
    if (tree) {
1184
216
        while (rem >= 4) {
1185
215
            decode_mpls_label(tvb, offset, &label, &exp, &bos, &proto);
1186
215
            tlv_ds_map_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
1187
215
                    ett_mpls_echo_tlv_ds_map, &ti, "Downstream Label Element %u", idx);
1188
215
            proto_item_append_text(ti, ", Label: %u", label);
1189
215
            if (label <= MPLS_LABEL_MAX_RESERVED) {
1190
19
                proto_tree_add_uint(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label,
1191
19
                                           tvb, offset, 3, label);
1192
19
                proto_item_append_text(ti, " (%s)", val_to_str_const(label, special_labels,
1193
19
                                                                     "Reserved - Unknown"));
1194
196
            } else {
1195
196
                proto_tree_add_uint_format_value(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label,
1196
196
                                           tvb, offset, 3, label, "%u", label);
1197
196
            }
1198
215
            proto_item_append_text(ti, ", Exp: %u, BOS: %u", exp, bos);
1199
215
            proto_tree_add_uint(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_exp,
1200
215
                                       tvb, offset + 2, 1, exp);
1201
215
            proto_tree_add_uint(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_bos,
1202
215
                                       tvb, offset + 2, 1, bos);
1203
215
            proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_proto,
1204
215
                                tvb, offset + 3, 1, ENC_BIG_ENDIAN);
1205
215
            proto_item_append_text(ti, ", Protocol: %u (%s)", proto,
1206
215
                                   val_to_str_const(proto, mpls_echo_tlv_ds_map_mp_proto, "Unknown"));
1207
215
            rem    -= 4;
1208
215
            offset += 4;
1209
215
            idx++;
1210
215
        }
1211
1
    }
1212
1
}
1213
1214
/* Dissector for Detailed Downstream Mapping TLV - RFC [6424] */
1215
static void
1216
dissect_mpls_echo_tlv_dd_map(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem)
1217
0
{
1218
0
    proto_tree *ddti = NULL, *tlv_dd_map_tree, *tlv_ddstlv_map_tree;
1219
0
    proto_tree *ddsti, *ddsti2;
1220
0
    uint16_t    subtlv_length, subtlv_type, multipath_length;
1221
0
    uint8_t     addr_type, multipath_type, fec_tlv_length;
1222
0
    uint16_t    idx = 1;
1223
0
    uint32_t    label;
1224
0
    uint8_t     tc, s_bit, proto;
1225
1226
0
    if (tree) {
1227
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_mtu, tvb,
1228
0
                            offset, 2, ENC_BIG_ENDIAN);
1229
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_addr_type, tvb,
1230
0
                            offset + 2, 1, ENC_BIG_ENDIAN);
1231
0
        ddti = proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_res, tvb,
1232
0
                                   offset + 3, 1, ENC_BIG_ENDIAN);
1233
0
        tlv_dd_map_tree = proto_item_add_subtree(ddti, ett_mpls_echo_tlv_dd_map);
1234
1235
0
        proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_flag_res, tvb,
1236
0
                            offset + 3, 1, ENC_BIG_ENDIAN);
1237
0
        proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_flag_i, tvb,
1238
0
                            offset + 3, 1, ENC_BIG_ENDIAN);
1239
0
        ddti = proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_flag_n, tvb,
1240
0
                                   offset + 3, 1, ENC_BIG_ENDIAN);
1241
0
    }
1242
0
    addr_type = tvb_get_uint8(tvb, offset + 2);
1243
0
    switch (addr_type) {
1244
0
    case TLV_ADDR_IPv4:
1245
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_ds_ip, tvb,
1246
0
                            offset + 4, 4, ENC_BIG_ENDIAN);
1247
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_int_ip, tvb,
1248
0
                            offset + 8, 4, ENC_BIG_ENDIAN);
1249
0
        break;
1250
0
    case TLV_ADDR_IPv6:
1251
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_ds_ipv6, tvb,
1252
0
                            offset + 4, 16, ENC_NA);
1253
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_int_ipv6, tvb,
1254
0
                            offset + 20, 16, ENC_NA);
1255
0
        rem    -= 24;
1256
0
        offset += 24;
1257
0
        break;
1258
0
    case TLV_ADDR_NONIP :
1259
0
        proto_tree_add_item (tree, hf_mpls_echo_tlv_dd_map_ingress_if_num, tvb,
1260
0
                             (offset + 4), 4, ENC_BIG_ENDIAN);
1261
0
        proto_tree_add_item (tree, hf_mpls_echo_tlv_dd_map_egress_if_num, tvb,
1262
0
                             (offset + 8), 4, ENC_BIG_ENDIAN);
1263
0
        break;
1264
0
    default:
1265
0
        expert_add_info_format(pinfo, ddti, &ei_mpls_echo_unknown_address_type,
1266
0
                               "Unknown Address Type (%u)", addr_type);
1267
0
        break;
1268
0
    }
1269
1270
0
    if (tree) {
1271
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_return_code, tvb,
1272
0
                            offset + 12, 1, ENC_BIG_ENDIAN);
1273
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_return_subcode, tvb,
1274
0
                            offset + 13, 1, ENC_BIG_ENDIAN);
1275
0
        ddti = proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_subtlv_len, tvb,
1276
0
                                   offset + 14, 2, ENC_BIG_ENDIAN);
1277
0
    }
1278
1279
0
    rem    -= 16;
1280
0
    offset += 16;
1281
1282
0
    while (rem > 4) {
1283
       /* Get the Sub-tlv Type and Length */
1284
0
       subtlv_type   = tvb_get_ntohs(tvb, offset);
1285
0
       subtlv_length = tvb_get_ntohs(tvb, offset+2);
1286
0
       rem -= 4;
1287
0
       offset += 4;
1288
1289
0
       if (rem<subtlv_length){
1290
0
          expert_add_info_format(pinfo, ddti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
1291
0
                "Invalid Sub-tlv Length (claimed %u, found %u)",
1292
0
                subtlv_length, rem);
1293
0
          return;
1294
0
       }
1295
1296
0
        switch (subtlv_type) {
1297
0
        case TLV_FEC_MULTIPATH_DATA:
1298
0
            multipath_type   = tvb_get_uint8(tvb, offset);
1299
0
            multipath_length = tvb_get_ntohs(tvb, offset + 1);
1300
0
            tlv_dd_map_tree = proto_tree_add_subtree(tree, tvb, offset - 4, multipath_length + 8,
1301
0
                                        ett_mpls_echo_tlv_dd_map, &ddsti, "Multipath sub-TLV");
1302
1303
0
            switch (multipath_type) {
1304
0
            case TLV_MULTIPATH_NO_MULTIPATH:
1305
0
                if (!tree)
1306
0
                    break;
1307
0
                proto_tree_add_item(tlv_dd_map_tree,
1308
0
                                    hf_mpls_echo_sub_tlv_multipath_type, tvb, offset, 1, ENC_BIG_ENDIAN);
1309
0
                proto_tree_add_item(tlv_dd_map_tree,
1310
0
                                    hf_mpls_echo_sub_tlv_multipath_length, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
1311
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_resv, tvb,
1312
0
                                    offset + 3, 1, ENC_BIG_ENDIAN);
1313
0
                tlv_ddstlv_map_tree = proto_tree_add_subtree(tlv_dd_map_tree, tvb, offset + 4, multipath_length,
1314
0
                                             ett_mpls_echo_tlv_ddstlv_map, NULL, "Empty (Multipath Length = 0)");
1315
0
                proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_multipath_info,
1316
0
                                    tvb, offset + 4, multipath_length, ENC_NA);
1317
0
                break;
1318
1319
0
            case TLV_MULTIPATH_IP_ADDRESS:
1320
0
                if (multipath_length != 4) {
1321
0
                    expert_add_info_format(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
1322
0
                               "Invalid Sub-tlv Length (claimed %u, should be 4)",
1323
0
                               multipath_length);
1324
0
                    break;
1325
0
                }
1326
0
                if (!tree)
1327
0
                    break;
1328
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_type, tvb,
1329
0
                                    offset, 1, ENC_BIG_ENDIAN);
1330
0
                proto_tree_add_item(tlv_dd_map_tree,
1331
0
                                    hf_mpls_echo_sub_tlv_multipath_length, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
1332
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_resv, tvb,
1333
0
                                    offset + 3, 1, ENC_BIG_ENDIAN);
1334
1335
0
                tlv_ddstlv_map_tree = proto_tree_add_subtree(tlv_dd_map_tree, tvb, offset + 4, multipath_length,
1336
0
                                             ett_mpls_echo_tlv_ddstlv_map, NULL, "Multipath Information (IP addresses)");
1337
1338
0
                proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_multipath_ip, tvb,
1339
0
                                    offset + 4, 4, ENC_BIG_ENDIAN);
1340
0
                break;
1341
1342
0
            case TLV_MULTIPATH_IP_ADDRESS_RANGE:
1343
0
                if (multipath_length != 8) {
1344
0
                    expert_add_info_format(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
1345
0
                               "Invalid Sub-tlv Length (claimed %u, should be 8)",
1346
0
                               multipath_length);
1347
0
                    break;
1348
0
                }
1349
0
                if (!tree)
1350
0
                    break;
1351
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_type, tvb,
1352
0
                                    offset, 1, ENC_BIG_ENDIAN);
1353
0
                proto_tree_add_item(tlv_dd_map_tree,
1354
0
                                    hf_mpls_echo_sub_tlv_multipath_length, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
1355
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_resv, tvb,
1356
0
                                    offset + 3, 1, ENC_BIG_ENDIAN);
1357
1358
0
                tlv_ddstlv_map_tree = proto_tree_add_subtree(tlv_dd_map_tree, tvb, offset + 4, multipath_length,
1359
0
                                             ett_mpls_echo_tlv_ddstlv_map, NULL, "Multipath Information (low/high address pairs)");
1360
1361
0
                proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_mp_ip_low, tvb,
1362
0
                                    offset + 4, 4, ENC_BIG_ENDIAN);
1363
0
                proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_mp_ip_high, tvb,
1364
0
                                    offset + 8, 4, ENC_BIG_ENDIAN);
1365
0
                break;
1366
1367
0
            case TLV_MULTIPATH_BIT_MASKED_IP:
1368
0
                if (multipath_length < 4) {
1369
0
                    expert_add_info_format(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
1370
0
                               "Invalid Sub-tlv Length (claimed %u, should be >= 4)",
1371
0
                               multipath_length);
1372
0
                    break;
1373
0
                }
1374
0
                if (!tree)
1375
0
                    break;
1376
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_type, tvb,
1377
0
                                    offset, 1, ENC_BIG_ENDIAN);
1378
0
                proto_tree_add_item(tlv_dd_map_tree,
1379
0
                                    hf_mpls_echo_sub_tlv_multipath_length, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
1380
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_resv, tvb,
1381
0
                                    offset + 3, 1, ENC_BIG_ENDIAN);
1382
1383
0
                tlv_ddstlv_map_tree = proto_tree_add_subtree(tlv_dd_map_tree, tvb, offset + 4, multipath_length,
1384
0
                                             ett_mpls_echo_tlv_ddstlv_map, NULL, "Multipath Information (IP address prefix and bit mask)");
1385
1386
0
                proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_multipath_ip, tvb,
1387
0
                                    offset + 4, 4, ENC_BIG_ENDIAN);
1388
0
                if (multipath_length > 4)
1389
0
                    proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_mp_mask,
1390
0
                                        tvb, offset + 8, multipath_length - 4, ENC_NA);
1391
0
                break;
1392
1393
0
            case TLV_MULTIPATH_BIT_MASKED_LABEL_SET:
1394
0
                proto_tree_add_uint_format(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_type, tvb, offset, 1, multipath_type,
1395
0
                                            "Multipath Information (Label prefix and bit mask)");
1396
0
                break;
1397
1398
0
            default:
1399
0
                if (!tree)
1400
0
                    break;
1401
0
                proto_tree_add_uint_format(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_type, tvb, offset, 1, multipath_type,
1402
0
                                            "Multipath Type not identified (%u)", multipath_type);
1403
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_type, tvb,
1404
0
                                    offset, 1, ENC_BIG_ENDIAN);
1405
0
                proto_tree_add_item(tlv_dd_map_tree,
1406
0
                                    hf_mpls_echo_sub_tlv_multipath_length, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
1407
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_multipath_value, tvb,
1408
0
                                    offset + 3, rem, ENC_NA);
1409
0
                break;
1410
0
            }
1411
1412
0
            rem -= (multipath_length + 4);
1413
0
            break;
1414
1415
0
        case TLV_FEC_LABEL_STACK:
1416
0
            tlv_dd_map_tree = proto_tree_add_subtree(tree, tvb, offset - 4, subtlv_length + 4,
1417
0
                                ett_mpls_echo_tlv_dd_map, NULL, "Label stack sub-TLV");
1418
1419
0
            while (subtlv_length >= 4) {
1420
0
                if (tree) {
1421
0
                    decode_mpls_label(tvb, offset, &label, &tc, &s_bit, &proto);
1422
1423
0
                    tlv_ddstlv_map_tree = proto_tree_add_subtree_format(tlv_dd_map_tree, tvb, offset, 4,
1424
0
                                                 ett_mpls_echo_tlv_ddstlv_map, &ddsti2, "Downstream Label Element %u", idx);
1425
0
                    proto_item_append_text(ddsti2, ", Label: %u , Protocol: %u", label, proto);
1426
0
                    proto_tree_add_uint(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_label, tvb, offset, 3, label);
1427
0
                    proto_tree_add_uint(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_traffic_class, tvb, offset + 2, 1, tc);
1428
0
                    proto_tree_add_uint(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_s_bit, tvb, offset + 2, 1, s_bit);
1429
0
                    proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_tlv_ddstlv_map_mp_proto,
1430
0
                                        tvb, offset + 3, 1, ENC_BIG_ENDIAN);
1431
0
                }
1432
0
                subtlv_length -= 4;
1433
0
                rem           -= 4;
1434
0
                offset        += 4;
1435
0
                idx++;
1436
0
            }
1437
0
            break;
1438
1439
0
        case TLV_FEC_STACK_CHANGE: {
1440
0
            addr_type       = tvb_get_uint8(tvb, offset + 1);
1441
0
            fec_tlv_length  = tvb_get_uint8(tvb, offset + 2);
1442
0
            tlv_dd_map_tree = proto_tree_add_subtree(tree, tvb, offset - 4, fec_tlv_length + 12,
1443
0
                                            ett_mpls_echo_tlv_dd_map, NULL, "Stack change sub-TLV");
1444
1445
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_op_type,       tvb, offset,     1, ENC_BIG_ENDIAN);
1446
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_addr_type,     tvb, offset + 1, 1, ENC_BIG_ENDIAN);
1447
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_fec_tlv_value, tvb, offset + 2, 1, ENC_BIG_ENDIAN);
1448
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_res,           tvb, offset + 3, 1, ENC_BIG_ENDIAN);
1449
0
            switch (addr_type) {
1450
0
            case SUB_TLV_FEC_UNSPECIFIED:
1451
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_remote_peer_unspecified, tvb, offset + 4, 0, ENC_NA);
1452
0
                break;
1453
0
            case SUB_TLV_FEC_IPV4:
1454
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_remote_peer_ip, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
1455
0
                rem    -= 4;
1456
0
                offset += 4;
1457
0
                break;
1458
0
            case SUB_TLV_FEC_IPV6:
1459
0
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_remore_peer_ipv6, tvb, offset + 4, 16, ENC_NA);
1460
0
                rem    -= 16;
1461
0
                offset += 16;
1462
0
                break;
1463
0
            }
1464
1465
0
            offset += 4;
1466
0
            dissect_mpls_echo_tlv_fec(tvb, pinfo, offset, tlv_dd_map_tree, fec_tlv_length);
1467
1468
0
            rem -= (fec_tlv_length + 4);
1469
0
            break;
1470
0
        }
1471
1472
0
        default:
1473
0
            tlv_dd_map_tree = proto_tree_add_subtree(tree, tvb, offset, subtlv_length, ett_mpls_echo_tlv_dd_map, NULL, "Error processing sub-TLV");
1474
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_type,   tvb, offset - 4, 2, ENC_BIG_ENDIAN);
1475
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_length, tvb, offset - 2, 2, ENC_BIG_ENDIAN);
1476
0
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_value,  tvb, offset, subtlv_length, ENC_NA);
1477
0
            rem -= subtlv_length;
1478
0
            break;
1479
0
        }
1480
0
    }
1481
0
}
1482
1483
/*
1484
 * Dissector for IPv4 and IPv6 Interface and Label Stack Object
1485
 */
1486
static void
1487
dissect_mpls_echo_tlv_ilso(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem, bool is_ipv6)
1488
0
{
1489
0
    proto_tree *ti;
1490
0
    uint8_t     type;
1491
0
    uint16_t    idx = 1;
1492
0
    uint32_t    label;
1493
0
    uint8_t     exp, bos, ttl;
1494
1495
0
    ti      = proto_tree_add_item_ret_uint8(tree, hf_mpls_echo_tlv_ilso_addr_type, tvb, offset, 1, ENC_BIG_ENDIAN, &type);
1496
0
    offset += 1;
1497
0
    rem    -= 1;
1498
1499
0
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_mbz, tvb, offset, 3, ENC_BIG_ENDIAN);
1500
0
    offset += 3;
1501
0
    rem    -= 3;
1502
1503
0
    if ((type == TLV_ADDR_IPv4) || (type == TLV_ADDR_UNNUM_IPv4)) {
1504
0
        if (is_ipv6) {
1505
0
            expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
1506
0
        }
1507
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_addr, tvb,
1508
0
                            offset, 4, ENC_BIG_ENDIAN);
1509
0
        if (type == TLV_ADDR_IPv4) {
1510
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_int_addr, tvb,
1511
0
                                offset + 4, 4, ENC_BIG_ENDIAN);
1512
0
        } else {
1513
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb,
1514
0
                                offset + 4, 4, ENC_BIG_ENDIAN);
1515
0
        }
1516
0
        offset += 8;
1517
0
        rem    -= 8;
1518
0
    } else if ((type == TLV_ADDR_IPv6) || (type == TLV_ADDR_UNNUM_IPv6)) {
1519
0
        if (!is_ipv6) {
1520
0
            expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
1521
0
        }
1522
1523
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_addr, tvb,
1524
0
                            offset, 16, ENC_NA);
1525
0
        if (type == TLV_ADDR_IPv6) {
1526
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_int_addr, tvb,
1527
0
                                offset + 16, 16, ENC_NA);
1528
0
            offset += 32;
1529
0
            rem    -= 32;
1530
0
        } else {
1531
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb,
1532
0
                                offset + 16, 4, ENC_BIG_ENDIAN);
1533
0
            offset += 20;
1534
0
            rem    -= 20;
1535
0
        }
1536
0
    } else {
1537
0
        expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
1538
0
        return;
1539
0
    }
1540
1541
0
    if (tree) {
1542
0
        while (rem >= 4) {
1543
0
            proto_tree *tlv_ilso;
1544
1545
0
            decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl);
1546
0
            tlv_ilso = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_mpls_echo_tlv_ilso, &ti, "Label Stack Element %u", idx);
1547
0
            proto_item_append_text(ti, ", Label: %u", label);
1548
0
            if (label <= MPLS_LABEL_MAX_RESERVED) {
1549
0
                proto_tree_add_uint_format_value(tlv_ilso, hf_mpls_echo_tlv_ilso_label,
1550
0
                                           tvb, offset, 3, label, "%u (%s)", label,
1551
0
                                           val_to_str_const(label, special_labels, "Reserved - Unknown"));
1552
0
                proto_item_append_text(ti, " (%s)", val_to_str_const(label, special_labels,
1553
0
                                                                     "Reserved - Unknown"));
1554
0
            } else {
1555
0
                proto_tree_add_uint_format_value(tlv_ilso, hf_mpls_echo_tlv_ilso_label,
1556
0
                                           tvb, offset, 3, label, "%u", label);
1557
0
            }
1558
0
            proto_item_append_text(ti, ", Exp: %u, BOS: %u, TTL: %u",
1559
0
                                   exp, bos, ttl);
1560
0
            proto_tree_add_uint(tlv_ilso, hf_mpls_echo_tlv_ilso_exp,
1561
0
                                       tvb, offset + 2, 1, exp);
1562
0
            proto_tree_add_uint(tlv_ilso, hf_mpls_echo_tlv_ilso_bos,
1563
0
                                       tvb, offset + 2, 1, bos);
1564
0
            proto_tree_add_item(tlv_ilso, hf_mpls_echo_tlv_ilso_ttl,
1565
0
                                tvb, offset + 3, 1, ENC_BIG_ENDIAN);
1566
0
            rem    -= 4;
1567
0
            offset += 4;
1568
0
            idx++;
1569
0
        }
1570
0
    }
1571
0
}
1572
1573
static int
1574
dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem, bool in_errored);
1575
1576
/*
1577
 * Dissector for Errored TLVs
1578
 */
1579
static void
1580
// NOLINTNEXTLINE(misc-no-recursion)
1581
dissect_mpls_echo_tlv_errored(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem)
1582
0
{
1583
0
    int errored_tlv_length;
1584
1585
0
    increment_dissection_depth(pinfo);
1586
0
    while (rem >= 4) {
1587
0
        errored_tlv_length = dissect_mpls_echo_tlv(tvb, pinfo, offset, tree, rem, true);
1588
0
        rem    -= errored_tlv_length;
1589
0
        offset += errored_tlv_length;
1590
0
    }
1591
0
    increment_dissection_depth(pinfo);
1592
0
}
1593
1594
/*
1595
 * Dissector for MPLS Echo TLVs and return bytes consumed
1596
 */
1597
static int
1598
// NOLINTNEXTLINE(misc-no-recursion)
1599
dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem, bool in_errored)
1600
1
{
1601
1
    proto_tree *ti = NULL, *mpls_echo_tlv_tree = NULL;
1602
1
    uint16_t    type, saved_type;
1603
1
    int         length;
1604
1605
1
    length = tvb_reported_length_remaining(tvb, offset);
1606
1
    rem    = MIN(rem, length);
1607
1608
1
    if ( rem < 4 ) { /* Type Length */
1609
0
        proto_tree_add_expert_format(tree, pinfo, &ei_mpls_echo_tlv_len, tvb, offset, rem,
1610
0
                                    "Error processing TLV: length is %d, should be >= 4", rem);
1611
0
        return rem;
1612
0
    }
1613
1614
1
    type    = tvb_get_ntohs(tvb, offset);
1615
1
    length  = tvb_get_ntohs(tvb, offset + 2);
1616
1
    rem    -= 4;                /* do not count Type Length */
1617
1
    length  = MIN(length, rem);
1618
1619
    /* Check for Vendor Private TLVs */
1620
1
    saved_type = type;
1621
1
    if (type >= TLV_VENDOR_PRIVATE_START) /* && <= TLV_VENDOR_PRIVATE_END always true */
1622
0
        type = TLV_VENDOR_PRIVATE_START;
1623
1624
1
    if (tree) {
1625
1
        mpls_echo_tlv_tree = proto_tree_add_subtree_format(tree, tvb, offset, length + 4, ett_mpls_echo_tlv, NULL,
1626
1
                                  "%s%s", in_errored ? "Errored TLV Type: " : "",
1627
1
                                 val_to_str_ext(pinfo->pool, type, &mpls_echo_tlv_type_names_ext, "Unknown TLV type (0x%04X)"));
1628
1629
        /* MPLS Echo TLV Type and Length */
1630
1
        if (in_errored) {
1631
0
            proto_tree_add_uint_format_value(mpls_echo_tlv_tree, hf_mpls_echo_tlv_errored_type, tvb,
1632
0
                                       offset, 2, saved_type, "%s (%u)",
1633
0
                                       val_to_str_ext_const(type, &mpls_echo_tlv_type_names_ext,
1634
0
                                                            "Unknown TLV type"), saved_type);
1635
1
        } else {
1636
1
            proto_tree_add_uint_format_value(mpls_echo_tlv_tree, hf_mpls_echo_tlv_type, tvb,
1637
1
                                       offset, 2, saved_type, "%s (%u)",
1638
1
                                       val_to_str_ext_const(type, &mpls_echo_tlv_type_names_ext,
1639
1
                                                            "Unknown TLV type"), saved_type);
1640
1
        }
1641
1
        ti = proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1642
1
    }
1643
1644
    /* MPLS Echo TLV Value */
1645
1
    if (length == 0)
1646
0
        return 4; /* Empty TLV, return Type and Length consumed. */
1647
1648
1
    switch (type) {
1649
0
    case TLV_TARGET_FEC_STACK:
1650
0
        dissect_mpls_echo_tlv_fec(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1651
0
        break;
1652
0
    case TLV_PAD:
1653
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padaction, tvb,
1654
0
                            offset + 4, 1, ENC_BIG_ENDIAN);
1655
0
        if (length > 1)
1656
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padding, tvb,
1657
0
                                offset + 5, length - 1, ENC_NA);
1658
0
        break;
1659
0
    case TLV_VENDOR_CODE:
1660
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb,
1661
0
                            offset + 4, 4, ENC_BIG_ENDIAN);
1662
0
        break;
1663
0
    case TLV_ILSO_IPv4:
1664
0
        if (length < 12) {
1665
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1666
0
                                   "Invalid TLV Length (claimed %u, should be >= 12)",
1667
0
                                   length);
1668
0
            break;
1669
0
        }
1670
0
        dissect_mpls_echo_tlv_ilso(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length, false);
1671
0
        break;
1672
0
    case TLV_ILSO_IPv6:
1673
0
        if (length < 24) {
1674
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1675
0
                                   "Invalid TLV Length (claimed %u, should be >= 24)",
1676
0
                                   length);
1677
0
            break;
1678
0
        }
1679
0
        dissect_mpls_echo_tlv_ilso(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length, true);
1680
0
        break;
1681
#if 0
1682
    case TLV_RTO_IPv4:
1683
        if (length != 4) {
1684
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1685
                                   "Invalid TLV Length (claimed %u, should be 4)",
1686
                                   length);
1687
            break;
1688
        }
1689
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv4,
1690
                            tvb, offset + 4, 4, ENC_BIG_ENDIAN);
1691
        break;
1692
    case TLV_RTO_IPv6:
1693
        if (length != 16) {
1694
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1695
                                   "Invalid TLV Length (claimed %u, should be 16)",
1696
                                   length);
1697
            break;
1698
        }
1699
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv6,
1700
                            tvb, offset + 4, 16, ENC_NA);
1701
        break;
1702
#endif
1703
0
    case TLV_P2MP_ECHO_JITTER:
1704
0
        if (length != 4) {
1705
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1706
0
                                   "Invalid TLV Length (claimed %u, should be 4)",
1707
0
                                   length);
1708
0
            break;
1709
0
        }
1710
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_echo_jitter,
1711
0
                            tvb, offset + 4, 4, ENC_BIG_ENDIAN);
1712
0
        break;
1713
0
    case TLV_P2MP_RESPONDER_IDENT: {
1714
0
        uint16_t    resp_ident_type, resp_ident_len;
1715
0
        proto_item *hidden_item;
1716
1717
0
        resp_ident_type = tvb_get_ntohs(tvb, offset + 4);
1718
0
        resp_ident_len  = tvb_get_ntohs(tvb, offset + 6);
1719
        /* Check addr length */
1720
0
        switch (resp_ident_type) {
1721
0
        case TLV_P2MP_RESPONDER_IDENT_IPV4_EGRESS_ADDR:
1722
0
        case TLV_P2MP_RESPONDER_IDENT_IPV4_NODE_ADDR:
1723
0
            if (resp_ident_len != 4) {
1724
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1725
0
                                       "Invalid TLV Length (claimed %u, should be 4)",
1726
0
                                       length);
1727
0
                break;
1728
0
            }
1729
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_type,
1730
0
                                tvb, offset + 4, 2, ENC_BIG_ENDIAN);
1731
0
            hidden_item = proto_tree_add_item(mpls_echo_tlv_tree,
1732
0
                                              hf_mpls_echo_tlv_responder_indent_len, tvb,
1733
0
                                              offset + 6, 2, ENC_BIG_ENDIAN);
1734
0
            proto_item_set_hidden(hidden_item);
1735
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_ipv4,
1736
0
                                tvb, offset + 8, 4, ENC_BIG_ENDIAN);
1737
0
            break;
1738
0
        case TLV_P2MP_RESPONDER_IDENT_IPV6_EGRESS_ADDR:
1739
0
        case TLV_P2MP_RESPONDER_IDENT_IPV6_NODE_ADDR:
1740
0
            if (resp_ident_len != 16) {
1741
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1742
0
                                       "Invalid TLV Length (claimed %u, should be 16)",
1743
0
                                       length);
1744
0
                break;
1745
0
            }
1746
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_type,
1747
0
                                tvb, offset + 4, 2, ENC_BIG_ENDIAN);
1748
0
            hidden_item = proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_len,
1749
0
                                              tvb, offset + 6, 2, ENC_BIG_ENDIAN);
1750
0
            proto_item_set_hidden(hidden_item);
1751
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_ipv6,
1752
0
                                tvb, offset + 8, 16, ENC_NA);
1753
0
            break;
1754
0
        }
1755
0
        break;
1756
0
    }
1757
0
    case TLV_VENDOR_PRIVATE_START:
1758
0
        if (length < 4) { /* SMI Enterprise code */
1759
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1760
0
                                   "Invalid TLV Length (claimed %u, should be >= 4)",
1761
0
                                   length);
1762
0
        } else {
1763
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb,
1764
0
                                offset + 4, 4, ENC_BIG_ENDIAN);
1765
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb,
1766
0
                                offset + 8, length - 4, ENC_NA);
1767
0
        }
1768
0
        break;
1769
1
    case TLV_DOWNSTREAM_MAPPING:
1770
1
        if (length < 16) {
1771
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1772
0
                                   "Invalid TLV Length (claimed %u, should be >= 16)",
1773
0
                                   length);
1774
0
            break;
1775
0
        }
1776
1
        dissect_mpls_echo_tlv_ds_map(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1777
1
        break;
1778
0
    case TLV_DETAILED_DOWNSTREAM:   /* [RFC 6424] */
1779
0
        if (length < 16) {
1780
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1781
0
                                   "Invalid TLV Length (claimed %u, should be >= 16)",
1782
0
                                   length);
1783
0
            break;
1784
0
        }
1785
0
        dissect_mpls_echo_tlv_dd_map(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1786
0
        break;
1787
0
    case TLV_ERRORED_TLV:
1788
0
        if (in_errored)
1789
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb,
1790
0
                                offset + 4, length, ENC_NA);
1791
0
        else
1792
0
            dissect_mpls_echo_tlv_errored(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1793
0
        break;
1794
0
    case TLV_REPLY_TOS:
1795
0
        if (length != 4) {
1796
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1797
0
                                   "Invalid TLV Length (claimed %u, should be 4)",
1798
0
                                   length);
1799
0
            break;
1800
0
        }
1801
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos, tvb,
1802
0
                            offset + 4, 1, ENC_BIG_ENDIAN);
1803
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos_mbz, tvb,
1804
0
                            offset + 5, 3, ENC_BIG_ENDIAN);
1805
0
        break;
1806
0
    case TLV_SRC_IDENTIFIER:
1807
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid,
1808
0
                            tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
1809
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid,
1810
0
                            tvb, (offset + 8), 4, ENC_BIG_ENDIAN);
1811
0
        break;
1812
0
    case TLV_DST_IDENTIFIER:
1813
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid,
1814
0
                            tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
1815
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid,
1816
0
                            tvb, (offset + 8), 4, ENC_BIG_ENDIAN);
1817
0
        break;
1818
0
    case TLV_BFD_DISCRIMINATOR:
1819
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_bfd,
1820
0
                            tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
1821
0
        break;
1822
0
    case TLV_REVERSE_PATH_FEC_STACK:
1823
0
        dissect_mpls_echo_tlv_fec (tvb, pinfo, (offset + 4), mpls_echo_tlv_tree, length);
1824
0
        break ;
1825
0
    case TLV_ERROR_CODE:
1826
0
    default:
1827
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb,
1828
0
                            offset + 4, length, ENC_NA);
1829
0
        break;
1830
1
    }
1831
1
    return length + 4;  /* Length of the Value field + Type Length */
1832
1
}
1833
1834
5
#define MSGTYPE_MPLS_ECHO(msgtype)      ((msgtype == 1) || (msgtype == 2))
1835
#define MSGTYPE_DATAPLANE(msgtype)      ((msgtype == 3) || (msgtype == 4))
1836
1837
/*
1838
 * Dissector for MPLS Echo (LSP PING) packets
1839
 */
1840
static int
1841
dissect_mpls_echo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1842
1
{
1843
1
    int         offset = 0, rem = 0, len;
1844
1
    proto_item *ti = NULL;
1845
1
    proto_tree *mpls_echo_tree = NULL;
1846
1
    uint8_t     msgtype;
1847
1848
    /* If version != 1 we assume it's not an mpls ping packet */
1849
1
    if (tvb_captured_length(tvb) < 5) {
1850
0
        return 0; /* Not enough information to tell version and message type. */
1851
0
    }
1852
1
    if (tvb_get_ntohs(tvb, 0) != 1) {
1853
0
        return 0; /* Not version 1. */
1854
0
    }
1855
1856
    /* Make entries in Protocol column and Info column on summary display */
1857
1
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPLS ECHO");
1858
1859
    /* Clear the info column so it's sane if we crash. We fill it in later when
1860
     * we've dissected more of the packet. */
1861
1
    col_clear(pinfo->cinfo, COL_INFO);
1862
1863
1
    rem = tvb_reported_length_remaining(tvb, offset);
1864
1865
    /* Get the message type and fill in the Column info */
1866
1
    msgtype = tvb_get_uint8(tvb, offset + 4);
1867
1868
    /* The minimum fixed part of the packet is 16 Bytes or 32 Bytes depending on Msg Type */
1869
1
    if ( ((!MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 16)) ||
1870
1
        ((MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 32)) ) {
1871
0
        col_set_str(pinfo->cinfo, COL_INFO, "Malformed Message");
1872
0
        ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA);
1873
0
        expert_add_info_format(pinfo, ti, &ei_mpls_echo_malformed, "Error processing Message: length is %d, should be >= %u",
1874
0
                            rem, (MSGTYPE_MPLS_ECHO(msgtype)) ? 32 : 16);
1875
0
        return 0;
1876
0
    }
1877
1878
1
    col_add_str(pinfo->cinfo, COL_INFO,
1879
1
                val_to_str(pinfo->pool, msgtype, mpls_echo_msgtype, "Unknown Message Type (0x%02X)"));
1880
1881
1882
1
    if (tree) {
1883
        /* Add subtree and dissect the fixed part of the message */
1884
1
        ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA);
1885
1
        mpls_echo_tree = proto_item_add_subtree(ti, ett_mpls_echo);
1886
1887
1
        proto_tree_add_item(mpls_echo_tree,
1888
1
                            hf_mpls_echo_version, tvb, offset, 2, ENC_BIG_ENDIAN);
1889
1890
1
        if (MSGTYPE_MPLS_ECHO(msgtype)) {
1891
0
            proto_tree *mpls_echo_gflags;
1892
0
            ti = proto_tree_add_item(mpls_echo_tree,
1893
0
                                     hf_mpls_echo_gflags, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1894
0
            mpls_echo_gflags = proto_item_add_subtree(ti, ett_mpls_echo_gflags);
1895
0
            proto_tree_add_item(mpls_echo_gflags,
1896
0
                                hf_mpls_echo_flag_sbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1897
0
            proto_tree_add_item(mpls_echo_gflags,
1898
0
                                hf_mpls_echo_flag_v, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1899
0
            proto_tree_add_item(mpls_echo_gflags,
1900
0
                                 hf_mpls_echo_flag_t, tvb, (offset + 2), 2, ENC_BIG_ENDIAN);
1901
0
            proto_tree_add_item(mpls_echo_gflags,
1902
0
                                 hf_mpls_echo_flag_r, tvb, (offset + 2), 2, ENC_BIG_ENDIAN);
1903
1
        } else {
1904
1
            proto_tree_add_item(mpls_echo_tree,
1905
1
                                hf_mpls_echo_mbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1906
1
        }
1907
1908
1
        proto_tree_add_item(mpls_echo_tree,
1909
1
                            hf_mpls_echo_msgtype, tvb, offset + 4, 1, ENC_BIG_ENDIAN);
1910
1
        proto_tree_add_item(mpls_echo_tree,
1911
1
                            hf_mpls_echo_replymode, tvb, offset + 5, 1, ENC_BIG_ENDIAN);
1912
1
        proto_tree_add_item(mpls_echo_tree,
1913
1
                            hf_mpls_echo_returncode, tvb, offset + 6, 1, ENC_BIG_ENDIAN);
1914
1
        proto_tree_add_item(mpls_echo_tree,
1915
1
                            hf_mpls_echo_returnsubcode, tvb, offset + 7, 1, ENC_BIG_ENDIAN);
1916
1
        proto_tree_add_item(mpls_echo_tree,
1917
1
                            hf_mpls_echo_handle, tvb, offset + 8, 4, ENC_BIG_ENDIAN);
1918
1
        proto_tree_add_item(mpls_echo_tree,
1919
1
                            hf_mpls_echo_sequence, tvb, offset + 12, 4, ENC_BIG_ENDIAN);
1920
1921
1
        if (MSGTYPE_MPLS_ECHO(msgtype)) {
1922
0
            proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_sent, tvb,
1923
0
                                offset + 16, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
1924
0
            proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_rec, tvb,
1925
0
                                offset + 24, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
1926
0
        }
1927
1
    }
1928
1929
1
    if (MSGTYPE_MPLS_ECHO(msgtype)) {
1930
0
        offset += 32;
1931
0
        rem    -= 32;
1932
1
    } else {
1933
1
        offset += 16;
1934
1
        rem    -= 16;
1935
1
    }
1936
1937
    /* Dissect all TLVs */
1938
2
    while (tvb_reported_length_remaining(tvb, offset) > 0 ) {
1939
1
        len = dissect_mpls_echo_tlv(tvb, pinfo, offset, mpls_echo_tree, rem, false);
1940
1
        offset += len;
1941
1
        rem    -= len;
1942
1
    }
1943
1944
1945
1
    return tvb_captured_length(tvb);
1946
1
}
1947
1948
/* Register the protocol with Wireshark */
1949
1950
void
1951
proto_register_mpls_echo(void)
1952
16
{
1953
1954
16
    static hf_register_info hf[] = {
1955
16
        { &hf_mpls_echo_version,
1956
16
          { "Version", "mpls_echo.version",
1957
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO Version Number", HFILL}
1958
16
        },
1959
16
        { &hf_mpls_echo_mbz,
1960
16
          { "MBZ", "mpls_echo.mbz",
1961
16
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Must be Zero", HFILL}
1962
16
        },
1963
16
        { &hf_mpls_echo_gflags,
1964
16
          { "Global Flags", "mpls_echo.flags",
1965
16
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Global Flags", HFILL}
1966
16
        },
1967
16
        { &hf_mpls_echo_flag_sbz,
1968
16
          { "Reserved", "mpls_echo.flag_sbz",
1969
16
            FT_UINT16, BASE_HEX, NULL, 0xFFF8, "MPLS ECHO Reserved Flags", HFILL}
1970
16
        },
1971
16
        { &hf_mpls_echo_flag_v,
1972
16
          { "Validate FEC Stack", "mpls_echo.flag_v",
1973
16
            FT_BOOLEAN, 16, NULL, 0x0001, "MPLS ECHO Validate FEC Stack Flag", HFILL}
1974
16
        },
1975
16
        { &hf_mpls_echo_flag_t,
1976
16
          { "Respond only if TTL expired", "mpls_echo.flag_t",
1977
16
            FT_BOOLEAN, 16, NULL, 0x0002, "MPLS ECHO Respond only if TTL expired Flag", HFILL}
1978
16
        },
1979
16
        { &hf_mpls_echo_flag_r,
1980
16
          { "Validate Reverse Path", "mpls_echo.flag_r",
1981
16
            FT_BOOLEAN, 16, NULL, 0x0004, "MPLS ECHO Validate Reverse Path Flag", HFILL}
1982
16
        },
1983
16
        { &hf_mpls_echo_msgtype,
1984
16
          { "Message Type", "mpls_echo.msg_type",
1985
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_msgtype), 0x0, "MPLS ECHO Message Type", HFILL}
1986
16
        },
1987
16
        { &hf_mpls_echo_replymode,
1988
16
          { "Reply Mode", "mpls_echo.reply_mode",
1989
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_replymode), 0x0, "MPLS ECHO Reply Mode", HFILL}
1990
16
        },
1991
16
        { &hf_mpls_echo_returncode,
1992
16
          { "Return Code", "mpls_echo.return_code",
1993
16
            FT_UINT8, BASE_DEC | BASE_EXT_STRING, &mpls_echo_returncode_ext, 0x0, "MPLS ECHO Return Code", HFILL}
1994
16
        },
1995
16
        { &hf_mpls_echo_returnsubcode,
1996
16
          { "Return Subcode", "mpls_echo.return_subcode",
1997
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO Return Subcode", HFILL}
1998
16
        },
1999
16
        { &hf_mpls_echo_handle,
2000
16
          { "Sender's Handle", "mpls_echo.sender_handle",
2001
16
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO Sender's Handle", HFILL}
2002
16
        },
2003
16
        { &hf_mpls_echo_sequence,
2004
16
          { "Sequence Number", "mpls_echo.sequence",
2005
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO Sequence Number", HFILL}
2006
16
        },
2007
16
        { &hf_mpls_echo_ts_sent,
2008
16
          { "Timestamp Sent", "mpls_echo.timestamp_sent",
2009
16
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Sent", HFILL}
2010
16
        },
2011
16
        { &hf_mpls_echo_ts_rec,
2012
16
          { "Timestamp Received", "mpls_echo.timestamp_rec",
2013
16
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Received", HFILL}
2014
16
        },
2015
16
        { &hf_mpls_echo_tlv_type,
2016
16
          { "Type", "mpls_echo.tlv.type",
2017
16
            FT_UINT16, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_type_names_ext, 0x0,
2018
16
            "MPLS ECHO TLV Type", HFILL}
2019
16
        },
2020
16
        { &hf_mpls_echo_tlv_len,
2021
16
          { "Length", "mpls_echo.tlv.len",
2022
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Length", HFILL}
2023
16
        },
2024
16
        { &hf_mpls_echo_tlv_value,
2025
16
          { "Value", "mpls_echo.tlv.value",
2026
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Value", HFILL}
2027
16
        },
2028
16
        { &hf_mpls_echo_tlv_fec_type,
2029
16
          { "Type", "mpls_echo.tlv.fec.type",
2030
16
            FT_UINT16, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_fec_names_ext, 0x0,
2031
16
            "MPLS ECHO TLV FEC Stack Type", HFILL}
2032
16
        },
2033
16
        { &hf_mpls_echo_tlv_fec_len,
2034
16
          { "Length", "mpls_echo.tlv.fec.len",
2035
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Length", HFILL}
2036
16
        },
2037
16
        { &hf_mpls_echo_tlv_fec_value,
2038
16
          { "Value", "mpls_echo.tlv.fec.value",
2039
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Value", HFILL}
2040
16
        },
2041
16
        { &hf_mpls_echo_tlv_fec_ldp_ipv4,
2042
16
          { "IPv4 Prefix", "mpls_echo.tlv.fec.ldp_ipv4",
2043
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4", HFILL}
2044
16
        },
2045
16
        { &hf_mpls_echo_tlv_fec_ldp_ipv4_mask,
2046
16
          { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv4_mask",
2047
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4 Prefix Length", HFILL}
2048
16
        },
2049
16
        { &hf_mpls_echo_tlv_fec_ldp_ipv6,
2050
16
          { "IPv6 Prefix", "mpls_echo.tlv.fec.ldp_ipv6",
2051
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6", HFILL}
2052
16
        },
2053
16
        { &hf_mpls_echo_tlv_fec_ldp_ipv6_mask,
2054
16
          { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv6_mask",
2055
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6 Prefix Length", HFILL}
2056
16
        },
2057
16
        { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint,
2058
16
          { "IPv4 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv4_ep",
2059
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Tunnel Endpoint Address", HFILL}
2060
16
        },
2061
16
        { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint,
2062
16
          { "IPv6 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv6_ep",
2063
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Tunnel Endpoint Address", HFILL}
2064
16
        },
2065
16
        { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz1,
2066
16
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz1",
2067
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL}
2068
16
        },
2069
16
        { &hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id,
2070
16
          { "Tunnel ID", "mpls_echo.tlv.fec.rsvp_ip_tun_id",
2071
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP Tunnel ID", HFILL}
2072
16
        },
2073
16
        { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id,
2074
16
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv4_ext_tun_id",
2075
16
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Extended Tunnel ID", HFILL}
2076
16
        },
2077
16
        { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender,
2078
16
          { "IPv4 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv4_sender",
2079
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL}
2080
16
        },
2081
16
        { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id,
2082
16
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv6_ext_tun_id",
2083
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Extended Tunnel ID", HFILL}
2084
16
        },
2085
16
        { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender,
2086
16
          { "IPv6 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv6_sender",
2087
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL}
2088
16
        },
2089
16
        { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz2,
2090
16
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz2",
2091
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL}
2092
16
        },
2093
16
        { &hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id,
2094
16
          { "LSP ID", "mpls_echo.tlv.fec.rsvp_ip_lsp_id",
2095
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP LSP ID", HFILL}
2096
16
        },
2097
16
        { &hf_mpls_echo_tlv_fec_vpn_route_dist,
2098
16
          { "Route Distinguisher", "mpls_echo.tlv.fec.vpn_route_dist",
2099
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN Route Distinguisher", HFILL}
2100
16
        },
2101
16
        { &hf_mpls_echo_tlv_fec_vpn_ipv4,
2102
16
          { "IPv4 Prefix", "mpls_echo.tlv.fec.vpn_ipv4",
2103
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN IPv4", HFILL}
2104
16
        },
2105
16
        { &hf_mpls_echo_tlv_fec_vpn_ipv6,
2106
16
          { "IPv6 Prefix", "mpls_echo.tlv.fec.vpn_ipv6",
2107
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN IPv6", HFILL}
2108
16
        },
2109
16
        { &hf_mpls_echo_tlv_fec_vpn_len,
2110
16
          { "Prefix Length", "mpls_echo.tlv.fec.vpn_len",
2111
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN Prefix Length", HFILL}
2112
16
        },
2113
16
        { &hf_mpls_echo_tlv_fec_l2_vpn_route_dist,
2114
16
          { "Route Distinguisher", "mpls_echo.tlv.fec.l2vpn_route_dist",
2115
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2VPN Route Distinguisher", HFILL}
2116
16
        },
2117
16
        { &hf_mpls_echo_tlv_fec_l2_vpn_send_ve_id,
2118
16
          { "Sender's VE ID", "mpls_echo.tlv.fec.l2vpn_send_ve_id",
2119
16
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2VPN Sender's VE ID", HFILL}
2120
16
        },
2121
16
        { &hf_mpls_echo_tlv_fec_l2_vpn_recv_ve_id,
2122
16
          { "Receiver's VE ID", "mpls_echo.tlv.fec.l2vpn_recv_ve_id",
2123
16
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2VPN Receiver's VE ID", HFILL}
2124
16
        },
2125
16
        { &hf_mpls_echo_tlv_fec_l2_vpn_encap_type,
2126
16
          { "Encapsulation", "mpls_echo.tlv.fec.l2vpn_encap_type",
2127
16
            FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC Stack L2VPN Encapsulation", HFILL}
2128
16
        },
2129
16
        { &hf_mpls_echo_tlv_fec_l2cid_sender,
2130
16
          { "Sender's PE Address", "mpls_echo.tlv.fec.l2cid_sender",
2131
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Sender", HFILL}
2132
16
        },
2133
16
        { &hf_mpls_echo_tlv_fec_l2cid_remote,
2134
16
          { "Remote PE Address", "mpls_echo.tlv.fec.l2cid_remote",
2135
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Remote", HFILL}
2136
16
        },
2137
16
        { &hf_mpls_echo_tlv_fec_l2cid_vcid,
2138
16
          { "VC ID", "mpls_echo.tlv.fec.l2cid_vcid",
2139
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID VCID", HFILL}
2140
16
        },
2141
16
        { &hf_mpls_echo_tlv_fec_l2cid_encap,
2142
16
          { "Encapsulation", "mpls_echo.tlv.fec.l2cid_encap",
2143
16
            FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC Stack L2CID Encapsulation", HFILL}
2144
16
        },
2145
16
        { &hf_mpls_echo_tlv_fec_l2cid_mbz,
2146
16
          { "MBZ", "mpls_echo.tlv.fec.l2cid_mbz",
2147
16
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID MBZ", HFILL}
2148
16
        },
2149
16
        { &hf_mpls_echo_tlv_fec_bgp_ipv4,
2150
16
          { "IPv4 Prefix", "mpls_echo.tlv.fec.bgp_ipv4",
2151
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP IPv4", HFILL}
2152
16
        },
2153
16
        { &hf_mpls_echo_tlv_fec_bgp_ipv6,
2154
16
          { "IPv6 Prefix", "mpls_echo.tlv.fec.bgp_ipv6",
2155
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP IPv6", HFILL}
2156
16
        },
2157
16
        { &hf_mpls_echo_tlv_fec_bgp_len,
2158
16
          { "Prefix Length", "mpls_echo.tlv.fec.bgp_len",
2159
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP Prefix Length", HFILL}
2160
16
        },
2161
16
        { &hf_mpls_echo_tlv_fec_gen_ipv4,
2162
16
          { "IPv4 Prefix", "mpls_echo.tlv.fec.gen_ipv4",
2163
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4", HFILL}
2164
16
        },
2165
16
        { &hf_mpls_echo_tlv_fec_gen_ipv4_mask,
2166
16
          { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv4_mask",
2167
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4 Prefix Length", HFILL}
2168
16
        },
2169
16
        { &hf_mpls_echo_tlv_fec_gen_ipv6,
2170
16
          { "IPv6 Prefix", "mpls_echo.tlv.fec.gen_ipv6",
2171
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6", HFILL}
2172
16
        },
2173
16
        { &hf_mpls_echo_tlv_fec_gen_ipv6_mask,
2174
16
          { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv6_mask",
2175
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6 Prefix Length", HFILL}
2176
16
        },
2177
16
        { &hf_mpls_echo_tlv_fec_nil_label,
2178
16
          { "Label", "mpls_echo.tlv.fec.nil_label",
2179
16
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV FEC Stack NIL Label", HFILL}
2180
16
        },
2181
16
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_sender,
2182
16
          { "Sender's PE Address", "mpls_echo.tlv.fec.pw_ipv6_128_sender",
2183
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 SENDER", HFILL }
2184
16
        },
2185
16
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_remote,
2186
16
          { "Remote's PE Address", "mpls_echo.tlv.fec.pw_ipv6_128_remote",
2187
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 REMOTE", HFILL }
2188
16
        },
2189
16
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_id,
2190
16
          { "PW ID", "mpls_echo.tlv.fec.fec.pw_ipv6_128_pwid",
2191
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 PW ID", HFILL}
2192
16
        },
2193
16
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_type,
2194
16
          { "PW TYPE", "mpls_echo.tlv.fec.fec.pw_ipv6_128_pw_type",
2195
16
            FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 PW TYPE", HFILL}
2196
16
        },
2197
16
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_mbz,
2198
16
          { "MBZ", "mpls_echo.tlv.fec.fec.pw_ipv6_128_mbz",
2199
16
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 MBZ", HFILL}
2200
16
        },
2201
16
        { &hf_mpls_echo_tlv_fec_igp_ipv4,
2202
16
          { "IPv4 Prefix", "mpls_echo.tlv.fec.igp_ipv4",
2203
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP IPv4", HFILL}
2204
16
        },
2205
16
        { &hf_mpls_echo_tlv_fec_igp_ipv6,
2206
16
          { "IPv6 Prefix", "mpls_echo.tlv.fec.igp_ipv6",
2207
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP IPv6", HFILL}
2208
16
        },
2209
16
        { &hf_mpls_echo_tlv_fec_igp_mask,
2210
16
          { "Prefix Length", "mpls_echo.tlv.fec.igp_mask",
2211
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Prefix Length", HFILL}
2212
16
        },
2213
16
        { &hf_mpls_echo_tlv_fec_igp_protocol,
2214
16
          { "Protocol", "mpls_echo.tlv.fec.igp_protocol",
2215
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_sr_protocol_types), 0x0, "MPLS ECHO TLV FEC Stack IGP Protocol", HFILL}
2216
16
        },
2217
16
        { &hf_mpls_echo_tlv_fec_igp_reserved,
2218
16
          { "Reserved", "mpls_echo.tlv.fec.igp_reserved",
2219
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Reserved", HFILL}
2220
16
        },
2221
16
        { &hf_mpls_echo_tlv_fec_igp_adj_type,
2222
16
          { "Adjacency Type", "mpls_echo.tlv.fec.igp_adj_type",
2223
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_igp_adjacency_types), 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Type", HFILL}
2224
16
        },
2225
16
        { &hf_mpls_echo_tlv_fec_igp_adj_local_ipv4,
2226
16
          { "Local Interface ID", "mpls_echo.tlv.fec.igp_adj_local_id.ipv4",
2227
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Local Interface ID", HFILL}
2228
16
        },
2229
16
        { &hf_mpls_echo_tlv_fec_igp_adj_local_ipv6,
2230
16
          { "Local Interface ID", "mpls_echo.tlv.fec.igp_adj_local_id.ipv6",
2231
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Local Interface ID", HFILL}
2232
16
        },
2233
16
        { &hf_mpls_echo_tlv_fec_igp_adj_local_ident,
2234
16
          { "Local Interface ID", "mpls_echo.tlv.fec.igp_adj_local_id.ident",
2235
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Local Interface ID", HFILL}
2236
16
        },
2237
16
        { &hf_mpls_echo_tlv_fec_igp_adj_remote_ipv4,
2238
16
          { "Remote Interface ID", "mpls_echo.tlv.fec.igp_adj_remote_id.ipv4",
2239
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Remote Interface ID", HFILL}
2240
16
        },
2241
16
        { &hf_mpls_echo_tlv_fec_igp_adj_remote_ipv6,
2242
16
          { "Remote Interface ID", "mpls_echo.tlv.fec.igp_adj_remote_id.ipv6",
2243
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Remote Interface ID", HFILL}
2244
16
        },
2245
16
        { &hf_mpls_echo_tlv_fec_igp_adj_remote_ident,
2246
16
          { "Remote Interface ID", "mpls_echo.tlv.fec.igp_adj_remote_id.ident",
2247
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Remote Interface ID", HFILL}
2248
16
        },
2249
16
        { &hf_mpls_echo_tlv_fec_igp_adj_adv_ident_ospf,
2250
16
          { "Advertising Node Identifier Router ID", "mpls_echo.tlv.fec.igp_adj_adv_node_id.ospf",
2251
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Advertising Node Identifier OSPF Router ID", HFILL}
2252
16
        },
2253
16
        { &hf_mpls_echo_tlv_fec_igp_adj_adv_ident_isis,
2254
16
          { "Advertising Node Identifier System ID", "mpls_echo.tlv.fec.igp_adj_adv_node_id.isis",
2255
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Advertising Node Identifier IS-IS System ID", HFILL}
2256
16
        },
2257
16
        { &hf_mpls_echo_tlv_fec_igp_adj_adv_ident,
2258
16
          { "Advertising Node Identifier", "mpls_echo.tlv.fec.igp_adj_adv_node_id.ident",
2259
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Advertising Node Identifier", HFILL}
2260
16
        },
2261
16
        { &hf_mpls_echo_tlv_fec_igp_adj_rec_ident_ospf,
2262
16
          { "Receiving Node Identifier Router ID", "mpls_echo.tlv.fec.igp_adj_rec_node_id.ospf",
2263
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Receiving Node Identifier OSPF Router ID", HFILL}
2264
16
        },
2265
16
        { &hf_mpls_echo_tlv_fec_igp_adj_rec_ident_isis,
2266
16
          { "Receiving Node Identifier System ID", "mpls_echo.tlv.fec.igp_adj_rec_node_id.isis",
2267
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Receiving Node Identifier IS-IS System ID", HFILL}
2268
16
        },
2269
16
        { &hf_mpls_echo_tlv_fec_igp_adj_rec_ident,
2270
16
          { "Receiving Node Identifier", "mpls_echo.tlv.fec.igp_adj_rec_node_id.ident",
2271
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Receiving Node Identifier", HFILL}
2272
16
        },
2273
16
        { &hf_mpls_echo_tlv_ds_map_mtu,
2274
16
          { "MTU", "mpls_echo.tlv.ds_map.mtu",
2275
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map MTU", HFILL}
2276
16
        },
2277
16
        { &hf_mpls_echo_tlv_ds_map_addr_type,
2278
16
          { "Address Type", "mpls_echo.tlv.ds_map.addr_type",
2279
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0,
2280
16
            "MPLS ECHO TLV Downstream Map Address Type", HFILL}
2281
16
        },
2282
16
        { &hf_mpls_echo_tlv_ds_map_res,
2283
16
          { "DS Flags", "mpls_echo.tlv.ds_map.res",
2284
16
            FT_UINT8, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Downstream Map DS Flags", HFILL}
2285
16
        },
2286
16
        { &hf_mpls_echo_tlv_ds_map_flag_res,
2287
16
          { "MBZ", "mpls_echo.tlv.ds_map.flag_res",
2288
16
            FT_UINT8, BASE_HEX, NULL, 0xFC, "MPLS ECHO TLV Downstream Map Reserved Flags", HFILL}
2289
16
        },
2290
16
        { &hf_mpls_echo_tlv_ds_map_flag_i,
2291
16
          { "Interface and Label Stack Request", "mpls_echo.tlv.ds_map.flag_i",
2292
16
            FT_BOOLEAN, 8, NULL, 0x02, "MPLS ECHO TLV Downstream Map I-Flag", HFILL}
2293
16
        },
2294
16
        { &hf_mpls_echo_tlv_ds_map_flag_n,
2295
16
          { "Treat as Non-IP Packet", "mpls_echo.tlv.ds_map.flag_n",
2296
16
            FT_BOOLEAN, 8, NULL, 0x01, "MPLS ECHO TLV Downstream Map N-Flag", HFILL}
2297
16
        },
2298
16
        { &hf_mpls_echo_tlv_ds_map_ds_ip,
2299
16
          { "Downstream IP Address", "mpls_echo.tlv.ds_map.ds_ip",
2300
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IP Address", HFILL}
2301
16
        },
2302
16
        { &hf_mpls_echo_tlv_ds_map_int_ip,
2303
16
          { "Downstream Interface Address", "mpls_echo.tlv.ds_map.int_ip",
2304
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Address", HFILL}
2305
16
        },
2306
16
        { &hf_mpls_echo_tlv_ds_map_if_index,
2307
16
          { "Upstream Interface Index", "mpls_echo.tlv.ds_map.if_index",
2308
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Index", HFILL}
2309
16
        },
2310
16
        { &hf_mpls_echo_tlv_ds_map_ds_ipv6,
2311
16
          { "Downstream IPv6 Address", "mpls_echo.tlv.ds_map.ds_ipv6",
2312
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IPv6 Address", HFILL}
2313
16
        },
2314
16
        { &hf_mpls_echo_tlv_ds_map_int_ipv6,
2315
16
          { "Downstream Interface IPv6 Address", "mpls_echo.tlv.ds_map.int_ipv6",
2316
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface IPv6 Address", HFILL}
2317
16
        },
2318
16
        { &hf_mpls_echo_tlv_ds_map_hash_type,
2319
16
          { "Multipath Type", "mpls_echo.tlv.ds_map.hash_type",
2320
16
            FT_UINT8, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_ds_map_hash_type_ext, 0x0,
2321
16
            "MPLS ECHO TLV Downstream Map Multipath Type", HFILL}
2322
16
        },
2323
16
        { &hf_mpls_echo_tlv_ds_map_depth,
2324
16
          { "Depth Limit", "mpls_echo.tlv.ds_map.depth",
2325
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Depth Limit", HFILL}
2326
16
        },
2327
16
        { &hf_mpls_echo_tlv_ds_map_muti_len,
2328
16
          { "Multipath Length", "mpls_echo.tlv.ds_map.multi_len",
2329
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Length", HFILL}
2330
16
        },
2331
16
        { &hf_mpls_echo_tlv_ds_map_mp_ip,
2332
16
          { "IP Address", "mpls_echo.tlv.ds_map_mp.ip",
2333
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath IP Address", HFILL}
2334
16
        },
2335
16
        { &hf_mpls_echo_tlv_ds_map_mp_mask,
2336
16
          { "Mask", "mpls_echo.tlv.ds_map_mp.mask",
2337
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Mask", HFILL}
2338
16
        },
2339
16
        { &hf_mpls_echo_tlv_ds_map_mp_ip_low,
2340
16
          { "IP Address Low", "mpls_echo.tlv.ds_map_mp.ip_low",
2341
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Low IP Address", HFILL}
2342
16
        },
2343
16
        { &hf_mpls_echo_tlv_ds_map_mp_ip_high,
2344
16
          { "IP Address High", "mpls_echo.tlv.ds_map_mp.ip_high",
2345
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath High IP Address", HFILL}
2346
16
        },
2347
16
        { &hf_mpls_echo_tlv_ds_map_mp_no_multipath_info,
2348
16
          { "No Multipath Information", "mpls_echo.tlv.ds_map_mp.no_multipath_info",
2349
16
            FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
2350
16
        },
2351
16
        { &hf_mpls_echo_tlv_ds_map_mp_value,
2352
16
          { "Multipath Value", "mpls_echo.tlv.ds_map_mp.value",
2353
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Multipath Value", HFILL}
2354
16
        },
2355
16
        { &hf_mpls_echo_tlv_ds_map_mp_label,
2356
16
          { "Downstream Label", "mpls_echo.tlv.ds_map.mp_label",
2357
16
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Downstream Map Downstream Label", HFILL}
2358
16
        },
2359
16
        { &hf_mpls_echo_tlv_ds_map_mp_exp,
2360
16
          { "Downstream Exp", "mpls_echo.tlv.ds_map.mp_exp",
2361
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream Experimental", HFILL}
2362
16
        },
2363
16
        { &hf_mpls_echo_tlv_ds_map_mp_bos,
2364
16
          { "Downstream BOS", "mpls_echo.tlv.ds_map.mp_bos",
2365
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream BOS", HFILL}
2366
16
        },
2367
16
        { &hf_mpls_echo_tlv_ds_map_mp_proto,
2368
16
          { "Downstream Protocol", "mpls_echo.tlv.ds_map.mp_proto",
2369
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_mp_proto), 0x0,
2370
16
            "MPLS ECHO TLV Downstream Map Downstream Protocol", HFILL}
2371
16
        },
2372
16
        { &hf_mpls_echo_tlv_padaction,
2373
16
          { "Pad Action", "mpls_echo.tlv.pad_action",
2374
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_pad), 0x0, "MPLS ECHO Pad TLV Action", HFILL}
2375
16
        },
2376
16
        { &hf_mpls_echo_tlv_padding,
2377
16
          { "Padding", "mpls_echo.tlv.pad_padding",
2378
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO Pad TLV Padding", HFILL}
2379
16
        },
2380
16
        { &hf_mpls_echo_tlv_vendor,
2381
16
          { "Vendor Id", "mpls_echo.tlv.vendor_id",
2382
16
            FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0, "MPLS ECHO Vendor Id", HFILL}
2383
16
        },
2384
16
        { &hf_mpls_echo_tlv_ilso_addr_type,
2385
16
          { "Address Type", "mpls_echo.tlv.ilso.addr_type",
2386
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0,
2387
16
            "MPLS ECHO TLV Interface and Label Stack Address Type", HFILL}
2388
16
        },
2389
16
        { &hf_mpls_echo_tlv_ilso_mbz,
2390
16
          { "Must Be Zero", "mpls_echo.tlv.ilso.mbz",
2391
16
            FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack MBZ", HFILL}
2392
16
        },
2393
16
        { &hf_mpls_echo_tlv_ilso_ipv4_addr,
2394
16
          { "Downstream IPv4 Address", "mpls_echo.tlv.ilso_ipv4.addr",
2395
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL}
2396
16
        },
2397
16
        { &hf_mpls_echo_tlv_ilso_ipv4_int_addr,
2398
16
          { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv4.int_addr",
2399
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL}
2400
16
        },
2401
16
        { &hf_mpls_echo_tlv_ilso_ipv6_addr,
2402
16
          { "Downstream IPv6 Address", "mpls_echo.tlv.ilso_ipv6.addr",
2403
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL}
2404
16
        },
2405
16
        { &hf_mpls_echo_tlv_ilso_ipv6_int_addr,
2406
16
          { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv6.int_addr",
2407
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL}
2408
16
        },
2409
16
        { &hf_mpls_echo_tlv_ilso_int_index,
2410
16
          { "Downstream Interface Index", "mpls_echo.tlv.ilso.int_index",
2411
16
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Index", HFILL}
2412
16
        },
2413
16
        { &hf_mpls_echo_tlv_ilso_label,
2414
16
          { "Label", "mpls_echo.tlv.ilso_ipv4.label",
2415
16
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Interface and Label Stack Label", HFILL}
2416
16
        },
2417
16
        { &hf_mpls_echo_tlv_ilso_exp,
2418
16
          { "Exp", "mpls_echo.tlv.ilso_ipv4.exp",
2419
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Exp", HFILL}
2420
16
        },
2421
16
        { &hf_mpls_echo_tlv_ilso_bos,
2422
16
          { "BOS", "mpls_echo.tlv.ilso_ipv4.bos",
2423
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack BOS", HFILL}
2424
16
        },
2425
16
        { &hf_mpls_echo_tlv_ilso_ttl,
2426
16
          { "TTL", "mpls_echo.tlv.ilso_ipv4.ttl",
2427
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack TTL", HFILL}
2428
16
        },
2429
#if 0
2430
        { &hf_mpls_echo_tlv_rto_ipv4,
2431
          { "Reply-to IPv4 Address", "mpls_echo.tlv.rto.ipv4",
2432
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv4 Reply-To Object", HFILL}
2433
        },
2434
        { &hf_mpls_echo_tlv_rto_ipv6,
2435
          { "Reply-to IPv6 Address", "mpls_echo.tlv.rto.ipv6",
2436
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv6 Reply-To Object", HFILL}
2437
        },
2438
#endif
2439
16
        { &hf_mpls_echo_tlv_reply_tos,
2440
16
          { "Reply-TOS Byte", "mpls_echo.tlv.reply.tos",
2441
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Reply-TOS Byte", HFILL}
2442
16
        },
2443
16
        { &hf_mpls_echo_tlv_reply_tos_mbz,
2444
16
          { "MBZ", "mpls_echo.tlv.reply.tos.mbz",
2445
16
            FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Reply-TOS MBZ", HFILL}
2446
16
        },
2447
16
        { &hf_mpls_echo_tlv_errored_type,
2448
16
          { "Errored TLV Type", "mpls_echo.tlv.errored.type",
2449
16
            FT_UINT16, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_type_names_ext, 0x0,
2450
16
            "MPLS ECHO TLV Errored TLV Type", HFILL}
2451
16
        },
2452
16
        { &hf_mpls_echo_tlv_ds_map_ingress_if_num,
2453
16
          { "Ingress Interface Number", "mpls_echo.tlv.ds_map.ingress.if.num",
2454
16
            FT_UINT32, BASE_DEC, NULL, 0x0,
2455
16
            "MPLS ECHO TLV DownStream Map Ingress Interface Number", HFILL}
2456
16
        },
2457
16
        { &hf_mpls_echo_tlv_ds_map_egress_if_num,
2458
16
          { "Egress Interface Number", "mpls_echo.tlv.ds_map.egress.if.num",
2459
16
            FT_UINT32, BASE_DEC, NULL, 0x0,
2460
16
            "MPLS ECHO TLV DownStream Map Egress Interface Number", HFILL}
2461
16
        },
2462
16
        { &hf_mpls_echo_lspping_tlv_src_gid,
2463
16
          { "SRC GLOBAL ID", "mpls_echo.lspping.tlv.src.gid",
2464
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "LSP SRC  GID", HFILL}
2465
16
        },
2466
16
        { &hf_mpls_echo_lspping_tlv_src_nid,
2467
16
          { "SRC NODE ID", "mpls_echo.lspping.tlv.src.nid",
2468
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "LSP SRC NID", HFILL}
2469
16
        },
2470
16
        { &hf_mpls_echo_lspping_tlv_src_tunnel_no,
2471
16
          { "SRC Tunnel Number", "mpls_echo.lspping.tlv.tunnel.no",
2472
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC Tunnel Number", HFILL}
2473
16
        },
2474
16
        { &hf_mpls_echo_lspping_tlv_lsp_no,
2475
16
          { "SRC LSP Number", "mpls_echo.lspping.tlv.lsp.no",
2476
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC LSP  Number", HFILL}
2477
16
        },
2478
16
        { &hf_mpls_echo_lspping_tlv_dst_gid,
2479
16
          { "DST GLOBAL ID", "mpls_echo.lspping.tlv.dst.gid",
2480
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "LSP FEC DST  GID", HFILL}
2481
16
        },
2482
16
        { &hf_mpls_echo_lspping_tlv_dst_nid,
2483
16
          { "DST NODE ID", "mpls_echo.lspping.tlv.dst.nid",
2484
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "LSP FEC DST NID", HFILL}
2485
16
        },
2486
16
        { &hf_mpls_echo_lspping_tlv_dst_tunnel_no,
2487
16
          { "DST Tunnel Number", "mpls_echo.lspping.tlv.dst.tunnel.no",
2488
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC DST Tunnel Number", HFILL}
2489
16
        },
2490
16
        { &hf_mpls_echo_lspping_tlv_resv,
2491
16
          { "RESERVED", "mpls_echo.lspping.tlv.resv",
2492
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "RESERVED BITS", HFILL}
2493
16
        },
2494
16
        { &hf_mpls_echo_lspping_tlv_src_addr_gid,
2495
16
          { "Global ID", "mpls_echo.lspping.tlv.src.addr.gid",
2496
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "SRC ADDR TLV GID", HFILL}
2497
16
        },
2498
16
        { &hf_mpls_echo_lspping_tlv_src_addr_nid,
2499
16
          { "Node ID", "mpls_echo.lspping.tlv.src.addr.nid",
2500
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "SRC ADDR TLV NID", HFILL}
2501
16
        },
2502
16
        { &hf_mpls_echo_lspping_tlv_pw_serv_identifier,
2503
16
          { "Service identifier", "mpls_echo.lspping.tlv.pw.serv.identifier",
2504
16
            FT_UINT64, BASE_DEC, NULL, 0x0, "PW FEC Service identifier", HFILL}
2505
16
        },
2506
16
        { &hf_mpls_echo_lspping_tlv_pw_src_ac_id,
2507
16
          { "SRC AC ID", "mpls_echo.lspping.tlv.pw.src.ac.id",
2508
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC SRC AC ID", HFILL}
2509
16
        },
2510
16
        { &hf_mpls_echo_lspping_tlv_pw_dst_ac_id,
2511
16
          { "DST AC ID", "mpls_echo.lspping.tlv.pw.dst.ac.id",
2512
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC DST AC ID", HFILL}
2513
16
        },
2514
16
        { &hf_mpls_echo_padding,
2515
16
          { "Padding", "mpls_echo.padding",
2516
16
            FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
2517
16
        },
2518
#if 0
2519
        { &hf_mpls_echo_lspping_tlv_pw_agi_type,
2520
          { "AGI TYPE", "mpls_echo.lspping.tlv.pw.agi.type",
2521
            FT_UINT8, BASE_DEC, NULL, 0x0, "PW AGI TYPE", HFILL}
2522
        },
2523
#endif
2524
#if 0
2525
        { &hf_mpls_echo_lspping_tlv_pw_agi_len,
2526
          { "AGI Length", "mpls_echo.lspping.tlv.pw.agi.len",
2527
            FT_UINT8, BASE_DEC, NULL, 0x0, "PW AGI LENGTH", HFILL}
2528
        },
2529
#endif
2530
#if 0
2531
        { &hf_mpls_echo_lspping_tlv_pw_agi_val,
2532
          { "AGI VALUE", "mpls_echo.lspping.tlv.pw.agi.val",
2533
            FT_STRING, BASE_NONE, NULL, 0x0, "PW AGI VALUE", HFILL}
2534
        },
2535
#endif
2536
16
        { &hf_mpls_echo_tlv_dd_map_mtu,
2537
16
          { "MTU", "mpls_echo.lspping.tlv.dd_map.mtu",
2538
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map MTU", HFILL}
2539
16
        },
2540
16
        { &hf_mpls_echo_tlv_dd_map_addr_type,
2541
16
          { "Address Type", "mpls_echo.tlv.dd_map.addr_type",
2542
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0, "MPLS ECHO TLV Detailed Downstream Map Address Type", HFILL}
2543
16
        },
2544
16
        { &hf_mpls_echo_tlv_dd_map_res,
2545
16
          { "DS Flags", "mpls_echo.tlv.dd_map.res",
2546
16
            FT_UINT8, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map DS Flags", HFILL}
2547
16
        },
2548
16
        { &hf_mpls_echo_tlv_dd_map_flag_res,
2549
16
          { "MBZ", "mpls_echo.tlv.dd_map.flag_res",
2550
16
            FT_UINT8, BASE_HEX, NULL, 0xFC, "MPLS ECHO TLV Detailed Downstream Map Reserved Flags", HFILL}
2551
16
        },
2552
16
        { &hf_mpls_echo_tlv_dd_map_flag_i,
2553
16
          { "Interface and Label Stack Request", "mpls_echo.tlv.dd_map.flag_i",
2554
16
            FT_BOOLEAN, 8, NULL, 0x02, "MPLS ECHO TLV Detailed Downstream Map I-Flag", HFILL}
2555
16
        },
2556
16
        { &hf_mpls_echo_tlv_dd_map_flag_n,
2557
16
          { "Treat as Non-IP Packet", "mpls_echo.tlv.dd_map.flag_n",
2558
16
            FT_BOOLEAN, 8, NULL, 0x01, "MPLS ECHO TLV Detailed Downstream Map N-Flag", HFILL}
2559
16
        },
2560
16
        { &hf_mpls_echo_tlv_dd_map_ds_ip,
2561
16
          { "Downstream IP Address", "mpls_echo.tlv.dd_map.ds_ip",
2562
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map IP Address", HFILL}
2563
16
        },
2564
16
        { &hf_mpls_echo_tlv_dd_map_int_ip,
2565
16
          { "Downstream Interface Address", "mpls_echo.tlv.dd_map.int_ip",
2566
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Interface Address", HFILL}
2567
16
        },
2568
16
        { &hf_mpls_echo_tlv_dd_map_ds_ipv6,
2569
16
          { "Downstream IPv6 Address", "mpls_echo.tlv.dd_map.ds_ipv6",
2570
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map IPv6 Address", HFILL}
2571
16
        },
2572
16
        { &hf_mpls_echo_tlv_dd_map_int_ipv6,
2573
16
          { "Downstream Interface IPv6 Address", "mpls_echo.tlv.dd_map.int_ipv6",
2574
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Interface IPv6 Address", HFILL}
2575
16
        },
2576
16
        { &hf_mpls_echo_tlv_dd_map_return_code,
2577
16
          { "Return Code", "mpls_echo.tlv.dd_map.return_code",
2578
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Return Code", HFILL}
2579
16
        },
2580
16
        { &hf_mpls_echo_tlv_dd_map_return_subcode,
2581
16
          { "Return Subcode", "mpls_echo.tlv.dd_map.return_subcode",
2582
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Return Subcode", HFILL}
2583
16
        },
2584
16
        { &hf_mpls_echo_tlv_dd_map_ingress_if_num,
2585
16
          { "Ingress Interface Number", "mpls_echo.tlv.dd_map.ingress.if.num",
2586
16
            FT_UINT32, BASE_DEC, NULL, 0x0,
2587
16
            "MPLS ECHO TLV Detailed DownStream Map Ingress Interface Number", HFILL}
2588
16
        },
2589
16
        { &hf_mpls_echo_tlv_dd_map_egress_if_num,
2590
16
          { "Egress Interface Number", "mpls_echo.tlv.dd_map.egress.if.num",
2591
16
            FT_UINT32, BASE_DEC, NULL, 0x0,
2592
16
            "MPLS ECHO TLV Detailed DownStream Map Egress Interface Number", HFILL}
2593
16
        },
2594
16
        { &hf_mpls_echo_tlv_dd_map_subtlv_len,
2595
16
          { "Subtlv Length", "mpls_echo.tlv.dd_map.subtlv_len",
2596
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Subtlv Length", HFILL}
2597
16
        },
2598
16
        { &hf_mpls_echo_sub_tlv_multipath_type,
2599
16
          { "Multipath Type",  "mpls_echo.subtlv.dd_map.multipath_type",
2600
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Multipath Type", HFILL}
2601
16
        },
2602
16
        { &hf_mpls_echo_sub_tlv_multipath_length,
2603
16
          { "Multipath Length", "mpls_echo.subtlv.dd_map.multipath_length",
2604
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Multipath Length", HFILL}
2605
16
        },
2606
16
        { &hf_mpls_echo_sub_tlv_multipath_value,
2607
16
          { "Multipath Value", "mpls_echo.subtlv.dd_map.multipath_value",
2608
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Multipath Value", HFILL}
2609
16
        },
2610
16
        { &hf_mpls_echo_sub_tlv_resv,
2611
16
          { "Reserved", "mpls_echo.subtlv.dd_map.reserved",
2612
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Reserved Bits", HFILL}
2613
16
        },
2614
16
        { &hf_mpls_echo_sub_tlv_multipath_info,
2615
16
          { "Multipath Information", "mpls_echo.subtlv.dd_map.multipath_info",
2616
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Value", HFILL}
2617
16
        },
2618
#if 0
2619
        { &hf_mpls_echo_tlv_ddstlv_map_mp_label,
2620
          { "Downstream Label", "mpls_echo.tlv.ddstlv_map.mp_label",
2621
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Detailed Downstream Map Downstream Label", HFILL}
2622
        },
2623
#endif
2624
16
        { &hf_mpls_echo_tlv_ddstlv_map_mp_proto,
2625
16
          { "Downstream Protocol", "mpls_echo.tlv.ddstlv_map.mp_proto",
2626
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_mp_proto), 0x0,
2627
16
            "MPLS ECHO TLV Detailed Downstream Map Downstream Protocol", HFILL}
2628
16
        },
2629
#if 0
2630
        { &hf_mpls_echo_tlv_ddstlv_map_mp_exp,
2631
          { "Downstream Experimental", "mpls_echo.tlv.ddstlv_map.mp_exp",
2632
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Downstream Experimental", HFILL}
2633
        },
2634
#endif
2635
#if 0
2636
        { &hf_mpls_echo_tlv_ddstlv_map_mp_bos,
2637
          { "Downstream BOS", "mpls_echo.tlv.ddstlv_map.mp_bos",
2638
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Downstream BOS", HFILL}
2639
        },
2640
#endif
2641
16
        { &hf_mpls_echo_sub_tlv_multipath_ip,
2642
16
          { "IP Address", "mpls_echo.tlv.ddstlv_map_mp.ip",
2643
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath IP Address", HFILL}
2644
16
        },
2645
16
        { &hf_mpls_echo_sub_tlv_mp_ip_low,
2646
16
          { "IP Address Low", "mpls_echo.tlv.ddstlv_map_mp.ip_low",
2647
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath Low IP Address", HFILL}
2648
16
        },
2649
16
        { &hf_mpls_echo_sub_tlv_mp_ip_high,
2650
16
          { "IP Address High", "mpls_echo.tlv.ddstlv_map_mp.ip_high",
2651
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath High IP Address", HFILL}
2652
16
        },
2653
16
        { &hf_mpls_echo_sub_tlv_mp_mask,
2654
16
          { "Mask", "mpls_echo.tlv.ddstlv_map_mp.mask",
2655
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath Mask", HFILL}
2656
16
        },
2657
16
        { &hf_mpls_echo_sub_tlv_op_type,
2658
16
          { "Operation Type", "mpls_echo.tlv.ddstlv_map.op_type",
2659
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_op_types), 0x0,
2660
16
            "MPLS ECHO TLV Detailed Downstream Map Stack Change Operation Type", HFILL}
2661
16
        },
2662
16
        { &hf_mpls_echo_sub_tlv_addr_type,
2663
16
          { "Address Type", "mpls_echo.tlv.ddstlv_map.address_type",
2664
16
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_addr_types), 0x0,
2665
16
            "MPLS ECHO TLV Detailed Downstream Map Stack Change Address Type", HFILL}
2666
16
        },
2667
16
        { &hf_mpls_echo_sub_tlv_fec_tlv_value,
2668
16
          { "FEC tlv Length", "mpls_echo.subtlv.dd_map.fec_tlv_type",
2669
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Map FEC TLV Length", HFILL}
2670
16
        },
2671
16
        { &hf_mpls_echo_sub_tlv_label,
2672
16
          { "Label", "mpls_echo.subtlv.label",
2673
16
            FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
2674
16
        },
2675
16
        { &hf_mpls_echo_sub_tlv_traffic_class,
2676
16
          { "Traffic Class", "mpls_echo.subtlv.traffic_class",
2677
16
            FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
2678
16
        },
2679
16
        { &hf_mpls_echo_sub_tlv_s_bit,
2680
16
          { "S bit", "mpls_echo.subtlv.s_bit",
2681
16
            FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
2682
16
        },
2683
16
        { &hf_mpls_echo_sub_tlv_res,
2684
16
          { "Reserved", "mpls_echo.subtlv.dd_map.reserved",
2685
16
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Map FEC Stack Change Reserved Bits", HFILL}
2686
16
        },
2687
16
        { &hf_mpls_echo_sub_tlv_remote_peer_unspecified,
2688
16
          { "Unspecified (Address Length = 0)", "mpls_echo.tlv.dd_map.unspecified",
2689
16
            FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
2690
16
        },
2691
16
        { &hf_mpls_echo_sub_tlv_remote_peer_ip,
2692
16
          { "Remote Peer IP Address", "mpls_echo.tlv.dd_map.remote_ip",
2693
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "Detailed Downstream Map FEC Stack Change Remote Peer IP Address", HFILL}
2694
16
        },
2695
16
        { &hf_mpls_echo_sub_tlv_remore_peer_ipv6,
2696
16
          { "Remote Peer IPv6 Address", "mpls_echo.tlv.dd_map.remote_ipv6",
2697
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "Detailed Downstream Map FEC Stack Change Remote Peer IPv6 Address", HFILL}
2698
16
        },
2699
16
        { &hf_mpls_echo_tlv_dd_map_type,
2700
16
          { "Sub-TLV Type",  "mpls_echo.subtlv.dd_map.type",
2701
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Type", HFILL}
2702
16
        },
2703
16
        { &hf_mpls_echo_tlv_dd_map_length,
2704
16
          { "Sub-TLV Length", "mpls_echo.subtlv.dd_map.length",
2705
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Length", HFILL}
2706
16
        },
2707
16
        { &hf_mpls_echo_tlv_dd_map_value,
2708
16
          { "Sub-TLV Value", "mpls_echo.subtlv.dd_map.value",
2709
16
            FT_BYTES, BASE_NONE, NULL, 0x0, "Detailed Downstream Mapping TLV Value", HFILL}
2710
16
        },
2711
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_p2mp_id,
2712
16
          { "P2MP ID", "mpls_echo.tlv.fec.rsvp_p2mp_ipv4_id",
2713
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP ID", HFILL}
2714
16
        },
2715
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz1,
2716
16
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_p2mp_ip_mbz1",
2717
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP MBZ", HFILL}
2718
16
        },
2719
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_tunnel_id,
2720
16
          { "Tunnel ID", "mpls_echo.tlv.fec.rsvp_p2mp_ip_tun_id",
2721
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP Tunnel ID", HFILL}
2722
16
        },
2723
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ext_tunnel_id,
2724
16
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_p2mp_ipv4_ext_tun_id",
2725
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv4 Extended Tunnel ID", HFILL}
2726
16
        },
2727
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ipv4_sender,
2728
16
          { "IPv4 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_p2mp_ipv4_sender",
2729
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv4 Sender", HFILL}
2730
16
        },
2731
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz2,
2732
16
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_p2mp_ip_mbz2",
2733
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP MBZ", HFILL}
2734
16
        },
2735
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_lsp_id,
2736
16
          { "LSP ID", "mpls_echo.tlv.fec.rsvp_p2mp_ip_lsp_id",
2737
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP LSP ID", HFILL}
2738
16
        },
2739
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_p2mp_id,
2740
16
          { "P2MP IPv6 Tunnel ID address", "mpls_echo.tlv.fec.rsvp_p2mp_ipv6_id",
2741
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv6 ID", HFILL}
2742
16
        },
2743
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ext_tunnel_id,
2744
16
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_p2mp_ipv6_ext_tun_id",
2745
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv6 Extended Tunnel ID", HFILL}
2746
16
        },
2747
16
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ipv6_sender,
2748
16
          { "P2MP IPv6 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_p2mp_ipv6_sender",
2749
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv6 Sender", HFILL}
2750
16
        },
2751
16
        { &hf_mpls_echo_tlv_responder_indent_type,
2752
16
          { "Target Type", "mpls_echo.tlv.resp_id.type",
2753
16
            FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_responder_ident_sub_tlv_type), 0x0, "P2MP Responder ID TLV", HFILL}
2754
16
        },
2755
16
        { &hf_mpls_echo_tlv_responder_indent_len,
2756
16
          { "Length", "mpls_echo.tlv.resp_id.length",
2757
16
            FT_UINT16, BASE_DEC, NULL, 0x0, "P2MP Responder ID TLV LENGTH", HFILL}
2758
16
        },
2759
16
        { &hf_mpls_echo_tlv_responder_indent_ipv4,
2760
16
          { "Target IPv4 Address", "mpls_echo.tlv.resp_id.ipv4",
2761
16
            FT_IPv4, BASE_NONE, NULL, 0x0, "P2MP Responder ID TLV IPv4 Address", HFILL}
2762
16
        },
2763
16
        { &hf_mpls_echo_tlv_responder_indent_ipv6,
2764
16
          { "Target IPv6 Address", "mpls_echo.tlv.resp_id.ipv6",
2765
16
            FT_IPv6, BASE_NONE, NULL, 0x0, "P2MP Responder ID TLV IPv6 Address", HFILL}
2766
16
        },
2767
16
        { &hf_mpls_echo_tlv_echo_jitter,
2768
16
          { "Echo Jitter time", "mpls_echo.tlv.echo_jitter",
2769
16
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO Jitter time", HFILL}
2770
16
        },
2771
16
        { &hf_mpls_echo_tlv_bfd,
2772
16
          { "BFD Discriminator", "mpls_echo.bfd_discriminator",
2773
16
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO BFD Discriminator", HFILL}
2774
16
        },
2775
16
    };
2776
2777
16
    static int *ett[] = {
2778
16
        &ett_mpls_echo,
2779
16
        &ett_mpls_echo_gflags,
2780
16
        &ett_mpls_echo_tlv,
2781
16
        &ett_mpls_echo_tlv_fec,
2782
16
        &ett_mpls_echo_tlv_ds_map,
2783
16
        &ett_mpls_echo_tlv_ilso,
2784
16
        &ett_mpls_echo_tlv_dd_map,
2785
16
        &ett_mpls_echo_tlv_ddstlv_map
2786
16
    };
2787
2788
16
    static ei_register_info ei[] = {
2789
16
        { &ei_mpls_echo_tlv_fec_len, { "mpls_echo.tlv.fec.len.invalid", PI_MALFORMED, PI_ERROR, "Invalid FEC TLV length", EXPFILL }},
2790
16
        { &ei_mpls_echo_tlv_dd_map_subtlv_len, { "mpls_echo.tlv.dd_map.subtlv_len.invalid", PI_MALFORMED, PI_ERROR, "Invalid Sub-TLV length", EXPFILL }},
2791
16
        { &ei_mpls_echo_tlv_len, { "mpls_echo.tlv.len.invalid", PI_MALFORMED, PI_ERROR, "Invalid TLV length", EXPFILL }},
2792
16
        { &ei_mpls_echo_tlv_ds_map_muti_len, { "mpls_echo.tlv.ds_map.multi_len.invalid", PI_MALFORMED, PI_ERROR, "Invalid Multipath TLV length", EXPFILL }},
2793
16
        { &ei_mpls_echo_unknown_address_type, { "mpls_echo.address_type.unknown", PI_UNDECODED, PI_WARN, "Unknown Address Type", EXPFILL }},
2794
16
        { &ei_mpls_echo_incorrect_address_type, { "mpls_echo.address_type.incorrect", PI_PROTOCOL, PI_WARN, "Incorrect address type for TLV?", EXPFILL }},
2795
16
        { &ei_mpls_echo_malformed, { "mpls_echo.malformed", PI_MALFORMED, PI_ERROR, "Malformed MPLS message", EXPFILL }},
2796
16
    };
2797
2798
16
    expert_module_t* expert_mpls_echo;
2799
2800
16
    proto_mpls_echo = proto_register_protocol("Multiprotocol Label Switching Echo", "MPLS Echo", "mpls-echo");
2801
2802
16
    proto_register_field_array(proto_mpls_echo, hf, array_length(hf));
2803
16
    proto_register_subtree_array(ett, array_length(ett));
2804
16
    expert_mpls_echo = expert_register_protocol(proto_mpls_echo);
2805
16
    expert_register_field_array(expert_mpls_echo, ei, array_length(ei));
2806
2807
16
    mpls_echo_handle = register_dissector("mpls-echo", dissect_mpls_echo, proto_mpls_echo);
2808
16
}
2809
2810
2811
void
2812
proto_reg_handoff_mpls_echo(void)
2813
16
{
2814
16
    dissector_add_uint_with_preference("udp.port", UDP_PORT_MPLS_ECHO, mpls_echo_handle);
2815
2816
16
    dissector_add_uint("pwach.channel_type", PW_ACH_TYPE_ONDEMAND_CV, mpls_echo_handle);
2817
16
}
2818
2819
/*
2820
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
2821
 *
2822
 * Local variables:
2823
 * c-basic-offset: 4
2824
 * tab-width: 8
2825
 * indent-tabs-mode: nil
2826
 * End:
2827
 *
2828
 * vi: set shiftwidth=4 tabstop=8 expandtab:
2829
 * :indentSize=4:tabSize=8:noTabs=true:
2830
 */