Coverage Report

Created: 2025-12-27 06:52

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
14
#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
5
#define TLV_TARGET_FEC_STACK       0x0001
300
13
#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
1
#define TLV_ILSO_IPv4              0x0007
306
10
#define TLV_ILSO_IPv6              0x0008
307
0
#define TLV_ERRORED_TLV            0x0009
308
1
#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
1
#define TLV_REVERSE_PATH_FEC_STACK 0x0010
322
3
#define TLV_DETAILED_DOWNSTREAM    0x0014 /* [RFC6424] */
323
182
#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
1
#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
66
#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
1
#define TLV_FEC_MULTIPATH_DATA     1
421
1
#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
1
#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
25
#define TLV_ADDR_IPv4           1
519
11
#define TLV_ADDR_UNNUM_IPv4     2
520
1
#define TLV_ADDR_IPv6           3
521
1
#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
2
#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
2
#define TLV_DS_MAP_HASH_NO_LABEL        5
540
2
#define TLV_DS_MAP_HASH_ALL_IP          6
541
2
#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
6
{
577
6
    proto_tree *ti, *tlv_fec_tree;
578
6
    uint16_t    idx = 1, nil_idx = 1, type, saved_type;
579
6
    unsigned    length, nil_length, pad;
580
6
    uint32_t    label, adj_offset, adj_type, adj_proto;
581
6
    uint8_t     exp, bos, ttl;
582
583
67
    while (rem >= 4) { /* Type, Length */
584
66
        type = tvb_get_ntohs(tvb, offset);
585
66
        saved_type = type;
586
        /* Check for Vendor Private sub-TLVs */
587
66
        if (type >= TLV_FEC_VENDOR_PRIVATE_START) /* && <= TLV_FEC_VENDOR_PRIVATE_END always true */
588
0
            type = TLV_FEC_VENDOR_PRIVATE_START;
589
590
66
        length = tvb_get_ntohs(tvb, offset + 2);
591
592
66
        ti = NULL;
593
66
        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
66
        pad = WS_PADDING_TO_4(length);
600
601
66
        if (tree) {
602
66
            tlv_fec_tree = proto_tree_add_subtree_format(tree, tvb, offset, length + pad,
603
66
                                     ett_mpls_echo_tlv_fec, NULL, "FEC Element %u: %s",
604
66
                                     idx, val_to_str_ext(pinfo->pool, type, &mpls_echo_tlv_fec_names_ext,
605
66
                                                         "Unknown FEC type (0x%04X)"));
606
607
            /* FEC sub-TLV Type and Length */
608
66
            proto_tree_add_uint_format_value(tlv_fec_tree, hf_mpls_echo_tlv_fec_type, tvb,
609
66
                                       offset, 2, saved_type, "%s (%u)",
610
66
                                       val_to_str_ext_const(type, &mpls_echo_tlv_fec_names_ext,
611
66
                                                            "Unknown sub-TLV type"), saved_type);
612
613
66
            ti = proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_len, tvb, offset + 2,
614
66
                                     2, ENC_BIG_ENDIAN);
615
66
        }
616
617
66
        if (length + 4 > rem) {
618
5
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
619
5
                                   "Invalid FEC Sub-TLV Length (claimed %u, found %u)",
620
5
                                   length, rem - 4);
621
5
            return;
622
5
        }
623
624
        /* FEC sub-TLV Value */
625
61
        switch (type) {
626
1
        case TLV_FEC_STACK_LDP_IPv4:
627
1
            if (tree) {
628
1
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv4,
629
1
                                    tvb, offset + 4, 4, ENC_BIG_ENDIAN);
630
1
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv4_mask,
631
1
                                    tvb, offset + 8, 1, ENC_BIG_ENDIAN);
632
1
            }
633
1
            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
60
        default:
1015
60
            if (length)
1016
1
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_value,
1017
1
                                        tvb, offset + 4, length, ENC_NA);
1018
60
            break;
1019
61
        }
1020
1021
        /*
1022
         * Check for padding based on sub-TLV length alignment;
1023
         */
1024
61
        if (pad != 0) {
1025
1
            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
1
            } else {
1031
1
                proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_padding, tvb, offset + 4 + length, pad, ENC_NA);
1032
1
            }
1033
1
            length += pad;
1034
1
        }
1035
1036
61
        rem    -= 4 + length;
1037
61
        offset += 4 + length;
1038
61
        idx++;
1039
61
    }
1040
6
}
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
12
{
1049
12
    proto_tree *ti, *tlv_ds_map_tree;
1050
12
    proto_tree *addr_ti;
1051
12
    uint16_t    mplen, idx = 1;
1052
12
    uint32_t    label;
1053
12
    uint8_t     exp, bos, proto;
1054
12
    uint8_t     hash_type, addr_type;
1055
1056
12
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mtu, tvb,
1057
12
                        offset, 2, ENC_BIG_ENDIAN);
1058
12
    addr_ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_addr_type, tvb,
1059
12
                        offset + 2, 1, ENC_BIG_ENDIAN);
1060
12
    ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_res, tvb,
1061
12
                             offset + 3, 1, ENC_BIG_ENDIAN);
1062
12
    tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map);
1063
1064
12
    proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_res, tvb,
1065
12
                        offset + 3, 1, ENC_BIG_ENDIAN);
1066
12
    proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_i, tvb,
1067
12
                        offset + 3, 1, ENC_BIG_ENDIAN);
1068
12
    proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_n, tvb,
1069
12
                        offset + 3, 1, ENC_BIG_ENDIAN);
1070
1071
12
    addr_type = tvb_get_uint8(tvb, offset + 2);
1072
12
    switch (addr_type) {
1073
4
    case TLV_ADDR_IPv4:
1074
4
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb,
1075
4
                            offset + 4, 4, ENC_BIG_ENDIAN);
1076
4
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ip, tvb,
1077
4
                            offset + 8, 4, ENC_BIG_ENDIAN);
1078
4
        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
8
    default:
1101
8
        expert_add_info_format(pinfo, addr_ti, &ei_mpls_echo_unknown_address_type,
1102
8
                               "Unknown Address Type (%u)", addr_type);
1103
8
        break;
1104
12
    }
1105
12
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_hash_type, tvb,
1106
12
                        offset + 12, 1, ENC_BIG_ENDIAN);
1107
12
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_depth, tvb,
1108
12
                        offset + 13, 1, ENC_BIG_ENDIAN);
1109
12
    ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_muti_len, tvb,
1110
12
                        offset + 14, 2, ENC_BIG_ENDIAN);
1111
1112
    /* Get the Multipath Length and Hash Type */
1113
12
    mplen     = tvb_get_ntohs(tvb, offset + 14);
1114
12
    hash_type = tvb_get_uint8(tvb, offset + 12);
1115
1116
12
    rem    -= 16;
1117
12
    offset += 16;
1118
12
    if (rem < mplen) {
1119
1
        expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
1120
1
                               "Invalid FEC Multipath (claimed %u, found %u)",
1121
1
                                mplen, rem);
1122
1
        return;
1123
1
    }
1124
11
    rem -= mplen;
1125
11
    if (mplen) {
1126
3
        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
2
        case TLV_DS_MAP_HASH_NO_MP:
1154
2
        case TLV_DS_MAP_HASH_NO_LABEL:
1155
2
        case TLV_DS_MAP_HASH_ALL_IP:
1156
2
        case TLV_DS_MAP_HASH_NO_MATCH:
1157
2
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mp_no_multipath_info, tvb, offset, mplen, ENC_NA);
1158
2
            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
1
        default:
1175
1
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mp_value, tvb,
1176
1
                                offset, mplen, ENC_NA);
1177
1
            break;
1178
3
        }
1179
3
    }
1180
1181
11
    offset += mplen;
1182
1183
11
    if (tree) {
1184
508
        while (rem >= 4) {
1185
497
            decode_mpls_label(tvb, offset, &label, &exp, &bos, &proto);
1186
497
            tlv_ds_map_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
1187
497
                    ett_mpls_echo_tlv_ds_map, &ti, "Downstream Label Element %u", idx);
1188
497
            proto_item_append_text(ti, ", Label: %u", label);
1189
497
            if (label <= MPLS_LABEL_MAX_RESERVED) {
1190
155
                proto_tree_add_uint(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label,
1191
155
                                           tvb, offset, 3, label);
1192
155
                proto_item_append_text(ti, " (%s)", val_to_str_const(label, special_labels,
1193
155
                                                                     "Reserved - Unknown"));
1194
342
            } else {
1195
342
                proto_tree_add_uint_format_value(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label,
1196
342
                                           tvb, offset, 3, label, "%u", label);
1197
342
            }
1198
497
            proto_item_append_text(ti, ", Exp: %u, BOS: %u", exp, bos);
1199
497
            proto_tree_add_uint(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_exp,
1200
497
                                       tvb, offset + 2, 1, exp);
1201
497
            proto_tree_add_uint(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_bos,
1202
497
                                       tvb, offset + 2, 1, bos);
1203
497
            proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_proto,
1204
497
                                tvb, offset + 3, 1, ENC_BIG_ENDIAN);
1205
497
            proto_item_append_text(ti, ", Protocol: %u (%s)", proto,
1206
497
                                   val_to_str_const(proto, mpls_echo_tlv_ds_map_mp_proto, "Unknown"));
1207
497
            rem    -= 4;
1208
497
            offset += 4;
1209
497
            idx++;
1210
497
        }
1211
11
    }
1212
11
}
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
3
{
1218
3
    proto_tree *ddti = NULL, *tlv_dd_map_tree, *tlv_ddstlv_map_tree;
1219
3
    proto_tree *ddsti, *ddsti2;
1220
3
    uint16_t    subtlv_length, subtlv_type, multipath_length;
1221
3
    uint8_t     addr_type, multipath_type, fec_tlv_length;
1222
3
    uint16_t    idx = 1;
1223
3
    uint32_t    label;
1224
3
    uint8_t     tc, s_bit, proto;
1225
1226
3
    if (tree) {
1227
3
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_mtu, tvb,
1228
3
                            offset, 2, ENC_BIG_ENDIAN);
1229
3
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_addr_type, tvb,
1230
3
                            offset + 2, 1, ENC_BIG_ENDIAN);
1231
3
        ddti = proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_res, tvb,
1232
3
                                   offset + 3, 1, ENC_BIG_ENDIAN);
1233
3
        tlv_dd_map_tree = proto_item_add_subtree(ddti, ett_mpls_echo_tlv_dd_map);
1234
1235
3
        proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_flag_res, tvb,
1236
3
                            offset + 3, 1, ENC_BIG_ENDIAN);
1237
3
        proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_flag_i, tvb,
1238
3
                            offset + 3, 1, ENC_BIG_ENDIAN);
1239
3
        ddti = proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_flag_n, tvb,
1240
3
                                   offset + 3, 1, ENC_BIG_ENDIAN);
1241
3
    }
1242
3
    addr_type = tvb_get_uint8(tvb, offset + 2);
1243
3
    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
3
    default:
1265
3
        expert_add_info_format(pinfo, ddti, &ei_mpls_echo_unknown_address_type,
1266
3
                               "Unknown Address Type (%u)", addr_type);
1267
3
        break;
1268
3
    }
1269
1270
3
    if (tree) {
1271
3
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_return_code, tvb,
1272
3
                            offset + 12, 1, ENC_BIG_ENDIAN);
1273
3
        proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_return_subcode, tvb,
1274
3
                            offset + 13, 1, ENC_BIG_ENDIAN);
1275
3
        ddti = proto_tree_add_item(tree, hf_mpls_echo_tlv_dd_map_subtlv_len, tvb,
1276
3
                                   offset + 14, 2, ENC_BIG_ENDIAN);
1277
3
    }
1278
1279
3
    rem    -= 16;
1280
3
    offset += 16;
1281
1282
24
    while (rem > 4) {
1283
       /* Get the Sub-tlv Type and Length */
1284
24
       subtlv_type   = tvb_get_ntohs(tvb, offset);
1285
24
       subtlv_length = tvb_get_ntohs(tvb, offset+2);
1286
24
       rem -= 4;
1287
24
       offset += 4;
1288
1289
24
       if (rem<subtlv_length){
1290
3
          expert_add_info_format(pinfo, ddti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
1291
3
                "Invalid Sub-tlv Length (claimed %u, found %u)",
1292
3
                subtlv_length, rem);
1293
3
          return;
1294
3
       }
1295
1296
21
        switch (subtlv_type) {
1297
1
        case TLV_FEC_MULTIPATH_DATA:
1298
1
            multipath_type   = tvb_get_uint8(tvb, offset);
1299
1
            multipath_length = tvb_get_ntohs(tvb, offset + 1);
1300
1
            tlv_dd_map_tree = proto_tree_add_subtree(tree, tvb, offset - 4, multipath_length + 8,
1301
1
                                        ett_mpls_echo_tlv_dd_map, &ddsti, "Multipath sub-TLV");
1302
1303
1
            switch (multipath_type) {
1304
1
            case TLV_MULTIPATH_NO_MULTIPATH:
1305
1
                if (!tree)
1306
0
                    break;
1307
1
                proto_tree_add_item(tlv_dd_map_tree,
1308
1
                                    hf_mpls_echo_sub_tlv_multipath_type, tvb, offset, 1, ENC_BIG_ENDIAN);
1309
1
                proto_tree_add_item(tlv_dd_map_tree,
1310
1
                                    hf_mpls_echo_sub_tlv_multipath_length, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
1311
1
                proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_sub_tlv_resv, tvb,
1312
1
                                    offset + 3, 1, ENC_BIG_ENDIAN);
1313
1
                tlv_ddstlv_map_tree = proto_tree_add_subtree(tlv_dd_map_tree, tvb, offset + 4, multipath_length,
1314
1
                                             ett_mpls_echo_tlv_ddstlv_map, NULL, "Empty (Multipath Length = 0)");
1315
1
                proto_tree_add_item(tlv_ddstlv_map_tree, hf_mpls_echo_sub_tlv_multipath_info,
1316
1
                                    tvb, offset + 4, multipath_length, ENC_NA);
1317
1
                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
1
            }
1411
1412
1
            rem -= (multipath_length + 4);
1413
1
            break;
1414
1415
1
        case TLV_FEC_LABEL_STACK:
1416
1
            tlv_dd_map_tree = proto_tree_add_subtree(tree, tvb, offset - 4, subtlv_length + 4,
1417
1
                                ett_mpls_echo_tlv_dd_map, NULL, "Label stack sub-TLV");
1418
1419
1
            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
1
            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
19
        default:
1473
19
            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
19
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_type,   tvb, offset - 4, 2, ENC_BIG_ENDIAN);
1475
19
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_length, tvb, offset - 2, 2, ENC_BIG_ENDIAN);
1476
19
            proto_tree_add_item(tlv_dd_map_tree, hf_mpls_echo_tlv_dd_map_value,  tvb, offset, subtlv_length, ENC_NA);
1477
19
            rem -= subtlv_length;
1478
19
            break;
1479
21
        }
1480
21
    }
1481
3
}
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
11
{
1489
11
    proto_tree *ti;
1490
11
    uint8_t     type;
1491
11
    uint16_t    idx = 1;
1492
11
    uint32_t    label;
1493
11
    uint8_t     exp, bos, ttl;
1494
1495
11
    ti      = proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_addr_type, tvb, offset, 1, ENC_BIG_ENDIAN);
1496
11
    type    = tvb_get_uint8(tvb, offset);
1497
11
    offset += 1;
1498
11
    rem    -= 1;
1499
1500
11
    proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_mbz, tvb, offset, 3, ENC_BIG_ENDIAN);
1501
11
    offset += 3;
1502
11
    rem    -= 3;
1503
1504
11
    if ((type == TLV_ADDR_IPv4) || (type == TLV_ADDR_UNNUM_IPv4)) {
1505
10
        if (is_ipv6) {
1506
10
            expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
1507
10
        }
1508
10
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_addr, tvb,
1509
10
                            offset, 4, ENC_BIG_ENDIAN);
1510
10
        if (type == TLV_ADDR_IPv4) {
1511
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_int_addr, tvb,
1512
0
                                offset + 4, 4, ENC_BIG_ENDIAN);
1513
10
        } else {
1514
10
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb,
1515
10
                                offset + 4, 4, ENC_BIG_ENDIAN);
1516
10
        }
1517
10
        offset += 8;
1518
10
        rem    -= 8;
1519
10
    } else if ((type == TLV_ADDR_IPv6) || (type == TLV_ADDR_UNNUM_IPv6)) {
1520
0
        if (!is_ipv6) {
1521
0
            expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
1522
0
        }
1523
1524
0
        proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_addr, tvb,
1525
0
                            offset, 16, ENC_NA);
1526
0
        if (type == TLV_ADDR_IPv6) {
1527
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_int_addr, tvb,
1528
0
                                offset + 16, 16, ENC_NA);
1529
0
            offset += 32;
1530
0
            rem    -= 32;
1531
0
        } else {
1532
0
            proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb,
1533
0
                                offset + 16, 4, ENC_BIG_ENDIAN);
1534
0
            offset += 20;
1535
0
            rem    -= 20;
1536
0
        }
1537
1
    } else {
1538
1
        expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
1539
1
        return;
1540
1
    }
1541
1542
10
    if (tree) {
1543
585
        while (rem >= 4) {
1544
575
            proto_tree *tlv_ilso;
1545
1546
575
            decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl);
1547
575
            tlv_ilso = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_mpls_echo_tlv_ilso, &ti, "Label Stack Element %u", idx);
1548
575
            proto_item_append_text(ti, ", Label: %u", label);
1549
575
            if (label <= MPLS_LABEL_MAX_RESERVED) {
1550
120
                proto_tree_add_uint_format_value(tlv_ilso, hf_mpls_echo_tlv_ilso_label,
1551
120
                                           tvb, offset, 3, label, "%u (%s)", label,
1552
120
                                           val_to_str_const(label, special_labels, "Reserved - Unknown"));
1553
120
                proto_item_append_text(ti, " (%s)", val_to_str_const(label, special_labels,
1554
120
                                                                     "Reserved - Unknown"));
1555
455
            } else {
1556
455
                proto_tree_add_uint_format_value(tlv_ilso, hf_mpls_echo_tlv_ilso_label,
1557
455
                                           tvb, offset, 3, label, "%u", label);
1558
455
            }
1559
575
            proto_item_append_text(ti, ", Exp: %u, BOS: %u, TTL: %u",
1560
575
                                   exp, bos, ttl);
1561
575
            proto_tree_add_uint(tlv_ilso, hf_mpls_echo_tlv_ilso_exp,
1562
575
                                       tvb, offset + 2, 1, exp);
1563
575
            proto_tree_add_uint(tlv_ilso, hf_mpls_echo_tlv_ilso_bos,
1564
575
                                       tvb, offset + 2, 1, bos);
1565
575
            proto_tree_add_item(tlv_ilso, hf_mpls_echo_tlv_ilso_ttl,
1566
575
                                tvb, offset + 3, 1, ENC_BIG_ENDIAN);
1567
575
            rem    -= 4;
1568
575
            offset += 4;
1569
575
            idx++;
1570
575
        }
1571
10
    }
1572
10
}
1573
1574
static int
1575
dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem, bool in_errored);
1576
1577
/*
1578
 * Dissector for Errored TLVs
1579
 */
1580
static void
1581
// NOLINTNEXTLINE(misc-no-recursion)
1582
dissect_mpls_echo_tlv_errored(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem)
1583
0
{
1584
0
    int errored_tlv_length;
1585
1586
0
    increment_dissection_depth(pinfo);
1587
0
    while (rem >= 4) {
1588
0
        errored_tlv_length = dissect_mpls_echo_tlv(tvb, pinfo, offset, tree, rem, true);
1589
0
        rem    -= errored_tlv_length;
1590
0
        offset += errored_tlv_length;
1591
0
    }
1592
0
    increment_dissection_depth(pinfo);
1593
0
}
1594
1595
/*
1596
 * Dissector for MPLS Echo TLVs and return bytes consumed
1597
 */
1598
static int
1599
// NOLINTNEXTLINE(misc-no-recursion)
1600
dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, int rem, bool in_errored)
1601
170
{
1602
170
    proto_tree *ti = NULL, *mpls_echo_tlv_tree = NULL;
1603
170
    uint16_t    type, saved_type;
1604
170
    int         length;
1605
1606
170
    length = tvb_reported_length_remaining(tvb, offset);
1607
170
    rem    = MIN(rem, length);
1608
1609
170
    if ( rem < 4 ) { /* Type Length */
1610
1
        proto_tree_add_expert_format(tree, pinfo, &ei_mpls_echo_tlv_len, tvb, offset, rem,
1611
1
                                    "Error processing TLV: length is %d, should be >= 4", rem);
1612
1
        return rem;
1613
1
    }
1614
1615
169
    type    = tvb_get_ntohs(tvb, offset);
1616
169
    length  = tvb_get_ntohs(tvb, offset + 2);
1617
169
    rem    -= 4;                /* do not count Type Length */
1618
169
    length  = MIN(length, rem);
1619
1620
    /* Check for Vendor Private TLVs */
1621
169
    saved_type = type;
1622
169
    if (type >= TLV_VENDOR_PRIVATE_START) /* && <= TLV_VENDOR_PRIVATE_END always true */
1623
8
        type = TLV_VENDOR_PRIVATE_START;
1624
1625
169
    if (tree) {
1626
169
        mpls_echo_tlv_tree = proto_tree_add_subtree_format(tree, tvb, offset, length + 4, ett_mpls_echo_tlv, NULL,
1627
169
                                  "%s%s", in_errored ? "Errored TLV Type: " : "",
1628
169
                                 val_to_str_ext(pinfo->pool, type, &mpls_echo_tlv_type_names_ext, "Unknown TLV type (0x%04X)"));
1629
1630
        /* MPLS Echo TLV Type and Length */
1631
169
        if (in_errored) {
1632
0
            proto_tree_add_uint_format_value(mpls_echo_tlv_tree, hf_mpls_echo_tlv_errored_type, tvb,
1633
0
                                       offset, 2, saved_type, "%s (%u)",
1634
0
                                       val_to_str_ext_const(type, &mpls_echo_tlv_type_names_ext,
1635
0
                                                            "Unknown TLV type"), saved_type);
1636
169
        } else {
1637
169
            proto_tree_add_uint_format_value(mpls_echo_tlv_tree, hf_mpls_echo_tlv_type, tvb,
1638
169
                                       offset, 2, saved_type, "%s (%u)",
1639
169
                                       val_to_str_ext_const(type, &mpls_echo_tlv_type_names_ext,
1640
169
                                                            "Unknown TLV type"), saved_type);
1641
169
        }
1642
169
        ti = proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1643
169
    }
1644
1645
    /* MPLS Echo TLV Value */
1646
169
    if (length == 0)
1647
115
        return 4; /* Empty TLV, return Type and Length consumed. */
1648
1649
54
    switch (type) {
1650
5
    case TLV_TARGET_FEC_STACK:
1651
5
        dissect_mpls_echo_tlv_fec(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1652
5
        break;
1653
0
    case TLV_PAD:
1654
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padaction, tvb,
1655
0
                            offset + 4, 1, ENC_BIG_ENDIAN);
1656
0
        if (length > 1)
1657
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padding, tvb,
1658
0
                                offset + 5, length - 1, ENC_NA);
1659
0
        break;
1660
0
    case TLV_VENDOR_CODE:
1661
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb,
1662
0
                            offset + 4, 4, ENC_BIG_ENDIAN);
1663
0
        break;
1664
1
    case TLV_ILSO_IPv4:
1665
1
        if (length < 12) {
1666
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1667
0
                                   "Invalid TLV Length (claimed %u, should be >= 12)",
1668
0
                                   length);
1669
0
            break;
1670
0
        }
1671
1
        dissect_mpls_echo_tlv_ilso(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length, false);
1672
1
        break;
1673
10
    case TLV_ILSO_IPv6:
1674
10
        if (length < 24) {
1675
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1676
0
                                   "Invalid TLV Length (claimed %u, should be >= 24)",
1677
0
                                   length);
1678
0
            break;
1679
0
        }
1680
10
        dissect_mpls_echo_tlv_ilso(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length, true);
1681
10
        break;
1682
#if 0
1683
    case TLV_RTO_IPv4:
1684
        if (length != 4) {
1685
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1686
                                   "Invalid TLV Length (claimed %u, should be 4)",
1687
                                   length);
1688
            break;
1689
        }
1690
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv4,
1691
                            tvb, offset + 4, 4, ENC_BIG_ENDIAN);
1692
        break;
1693
    case TLV_RTO_IPv6:
1694
        if (length != 16) {
1695
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1696
                                   "Invalid TLV Length (claimed %u, should be 16)",
1697
                                   length);
1698
            break;
1699
        }
1700
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv6,
1701
                            tvb, offset + 4, 16, ENC_NA);
1702
        break;
1703
#endif
1704
0
    case TLV_P2MP_ECHO_JITTER:
1705
0
        if (length != 4) {
1706
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1707
0
                                   "Invalid TLV Length (claimed %u, should be 4)",
1708
0
                                   length);
1709
0
            break;
1710
0
        }
1711
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_echo_jitter,
1712
0
                            tvb, offset + 4, 4, ENC_BIG_ENDIAN);
1713
0
        break;
1714
0
    case TLV_P2MP_RESPONDER_IDENT: {
1715
0
        uint16_t    resp_ident_type, resp_ident_len;
1716
0
        proto_item *hidden_item;
1717
1718
0
        resp_ident_type = tvb_get_ntohs(tvb, offset + 4);
1719
0
        resp_ident_len  = tvb_get_ntohs(tvb, offset + 6);
1720
        /* Check addr length */
1721
0
        switch (resp_ident_type) {
1722
0
        case TLV_P2MP_RESPONDER_IDENT_IPV4_EGRESS_ADDR:
1723
0
        case TLV_P2MP_RESPONDER_IDENT_IPV4_NODE_ADDR:
1724
0
            if (resp_ident_len != 4) {
1725
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1726
0
                                       "Invalid TLV Length (claimed %u, should be 4)",
1727
0
                                       length);
1728
0
                break;
1729
0
            }
1730
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_type,
1731
0
                                tvb, offset + 4, 2, ENC_BIG_ENDIAN);
1732
0
            hidden_item = proto_tree_add_item(mpls_echo_tlv_tree,
1733
0
                                              hf_mpls_echo_tlv_responder_indent_len, tvb,
1734
0
                                              offset + 6, 2, ENC_BIG_ENDIAN);
1735
0
            proto_item_set_hidden(hidden_item);
1736
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_ipv4,
1737
0
                                tvb, offset + 8, 4, ENC_BIG_ENDIAN);
1738
0
            break;
1739
0
        case TLV_P2MP_RESPONDER_IDENT_IPV6_EGRESS_ADDR:
1740
0
        case TLV_P2MP_RESPONDER_IDENT_IPV6_NODE_ADDR:
1741
0
            if (resp_ident_len != 16) {
1742
0
                expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1743
0
                                       "Invalid TLV Length (claimed %u, should be 16)",
1744
0
                                       length);
1745
0
                break;
1746
0
            }
1747
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_type,
1748
0
                                tvb, offset + 4, 2, ENC_BIG_ENDIAN);
1749
0
            hidden_item = proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_len,
1750
0
                                              tvb, offset + 6, 2, ENC_BIG_ENDIAN);
1751
0
            proto_item_set_hidden(hidden_item);
1752
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_responder_indent_ipv6,
1753
0
                                tvb, offset + 8, 16, ENC_NA);
1754
0
            break;
1755
0
        }
1756
0
        break;
1757
0
    }
1758
5
    case TLV_VENDOR_PRIVATE_START:
1759
5
        if (length < 4) { /* SMI Enterprise code */
1760
1
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1761
1
                                   "Invalid TLV Length (claimed %u, should be >= 4)",
1762
1
                                   length);
1763
4
        } else {
1764
4
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb,
1765
4
                                offset + 4, 4, ENC_BIG_ENDIAN);
1766
4
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb,
1767
4
                                offset + 8, length - 4, ENC_NA);
1768
4
        }
1769
5
        break;
1770
13
    case TLV_DOWNSTREAM_MAPPING:
1771
13
        if (length < 16) {
1772
1
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1773
1
                                   "Invalid TLV Length (claimed %u, should be >= 16)",
1774
1
                                   length);
1775
1
            break;
1776
1
        }
1777
12
        dissect_mpls_echo_tlv_ds_map(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1778
12
        break;
1779
3
    case TLV_DETAILED_DOWNSTREAM:   /* [RFC 6424] */
1780
3
        if (length < 16) {
1781
0
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1782
0
                                   "Invalid TLV Length (claimed %u, should be >= 16)",
1783
0
                                   length);
1784
0
            break;
1785
0
        }
1786
3
        dissect_mpls_echo_tlv_dd_map(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1787
3
        break;
1788
0
    case TLV_ERRORED_TLV:
1789
0
        if (in_errored)
1790
0
            proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb,
1791
0
                                offset + 4, length, ENC_NA);
1792
0
        else
1793
0
            dissect_mpls_echo_tlv_errored(tvb, pinfo, offset + 4, mpls_echo_tlv_tree, length);
1794
0
        break;
1795
1
    case TLV_REPLY_TOS:
1796
1
        if (length != 4) {
1797
1
            expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len,
1798
1
                                   "Invalid TLV Length (claimed %u, should be 4)",
1799
1
                                   length);
1800
1
            break;
1801
1
        }
1802
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos, tvb,
1803
0
                            offset + 4, 1, ENC_BIG_ENDIAN);
1804
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos_mbz, tvb,
1805
0
                            offset + 5, 3, ENC_BIG_ENDIAN);
1806
0
        break;
1807
0
    case TLV_SRC_IDENTIFIER:
1808
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid,
1809
0
                            tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
1810
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid,
1811
0
                            tvb, (offset + 8), 4, ENC_BIG_ENDIAN);
1812
0
        break;
1813
0
    case TLV_DST_IDENTIFIER:
1814
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid,
1815
0
                            tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
1816
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid,
1817
0
                            tvb, (offset + 8), 4, ENC_BIG_ENDIAN);
1818
0
        break;
1819
0
    case TLV_BFD_DISCRIMINATOR:
1820
0
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_bfd,
1821
0
                            tvb, (offset + 4), 4, ENC_BIG_ENDIAN);
1822
0
        break;
1823
1
    case TLV_REVERSE_PATH_FEC_STACK:
1824
1
        dissect_mpls_echo_tlv_fec (tvb, pinfo, (offset + 4), mpls_echo_tlv_tree, length);
1825
1
        break ;
1826
0
    case TLV_ERROR_CODE:
1827
15
    default:
1828
15
        proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb,
1829
15
                            offset + 4, length, ENC_NA);
1830
15
        break;
1831
54
    }
1832
54
    return length + 4;  /* Length of the Value field + Type Length */
1833
54
}
1834
1835
200
#define MSGTYPE_MPLS_ECHO(msgtype)      ((msgtype == 1) || (msgtype == 2))
1836
#define MSGTYPE_DATAPLANE(msgtype)      ((msgtype == 3) || (msgtype == 4))
1837
1838
/*
1839
 * Dissector for MPLS Echo (LSP PING) packets
1840
 */
1841
static int
1842
dissect_mpls_echo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1843
42
{
1844
42
    int         offset = 0, rem = 0, len;
1845
42
    proto_item *ti = NULL;
1846
42
    proto_tree *mpls_echo_tree = NULL;
1847
42
    uint8_t     msgtype;
1848
1849
    /* If version != 1 we assume it's not an mpls ping packet */
1850
42
    if (tvb_captured_length(tvb) < 5) {
1851
1
        return 0; /* Not enough information to tell version and message type. */
1852
1
    }
1853
41
    if (tvb_get_ntohs(tvb, 0) != 1) {
1854
1
        return 0; /* Not version 1. */
1855
1
    }
1856
1857
    /* Make entries in Protocol column and Info column on summary display */
1858
40
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPLS ECHO");
1859
1860
    /* Clear the info column so it's sane if we crash. We fill it in later when
1861
     * we've dissected more of the packet. */
1862
40
    col_clear(pinfo->cinfo, COL_INFO);
1863
1864
40
    rem = tvb_reported_length_remaining(tvb, offset);
1865
1866
    /* Get the message type and fill in the Column info */
1867
40
    msgtype = tvb_get_uint8(tvb, offset + 4);
1868
1869
    /* The minimum fixed part of the packet is 16 Bytes or 32 Bytes depending on Msg Type */
1870
40
    if ( ((!MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 16)) ||
1871
40
        ((MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 32)) ) {
1872
0
        col_set_str(pinfo->cinfo, COL_INFO, "Malformed Message");
1873
0
        ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA);
1874
0
        expert_add_info_format(pinfo, ti, &ei_mpls_echo_malformed, "Error processing Message: length is %d, should be >= %u",
1875
0
                            rem, (MSGTYPE_MPLS_ECHO(msgtype)) ? 32 : 16);
1876
0
        return 0;
1877
0
    }
1878
1879
40
    col_add_str(pinfo->cinfo, COL_INFO,
1880
40
                val_to_str(pinfo->pool, msgtype, mpls_echo_msgtype, "Unknown Message Type (0x%02X)"));
1881
1882
1883
40
    if (tree) {
1884
        /* Add subtree and dissect the fixed part of the message */
1885
40
        ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA);
1886
40
        mpls_echo_tree = proto_item_add_subtree(ti, ett_mpls_echo);
1887
1888
40
        proto_tree_add_item(mpls_echo_tree,
1889
40
                            hf_mpls_echo_version, tvb, offset, 2, ENC_BIG_ENDIAN);
1890
1891
40
        if (MSGTYPE_MPLS_ECHO(msgtype)) {
1892
3
            proto_tree *mpls_echo_gflags;
1893
3
            ti = proto_tree_add_item(mpls_echo_tree,
1894
3
                                     hf_mpls_echo_gflags, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1895
3
            mpls_echo_gflags = proto_item_add_subtree(ti, ett_mpls_echo_gflags);
1896
3
            proto_tree_add_item(mpls_echo_gflags,
1897
3
                                hf_mpls_echo_flag_sbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1898
3
            proto_tree_add_item(mpls_echo_gflags,
1899
3
                                hf_mpls_echo_flag_v, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1900
3
            proto_tree_add_item(mpls_echo_gflags,
1901
3
                                 hf_mpls_echo_flag_t, tvb, (offset + 2), 2, ENC_BIG_ENDIAN);
1902
3
            proto_tree_add_item(mpls_echo_gflags,
1903
3
                                 hf_mpls_echo_flag_r, tvb, (offset + 2), 2, ENC_BIG_ENDIAN);
1904
37
        } else {
1905
37
            proto_tree_add_item(mpls_echo_tree,
1906
37
                                hf_mpls_echo_mbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
1907
37
        }
1908
1909
40
        proto_tree_add_item(mpls_echo_tree,
1910
40
                            hf_mpls_echo_msgtype, tvb, offset + 4, 1, ENC_BIG_ENDIAN);
1911
40
        proto_tree_add_item(mpls_echo_tree,
1912
40
                            hf_mpls_echo_replymode, tvb, offset + 5, 1, ENC_BIG_ENDIAN);
1913
40
        proto_tree_add_item(mpls_echo_tree,
1914
40
                            hf_mpls_echo_returncode, tvb, offset + 6, 1, ENC_BIG_ENDIAN);
1915
40
        proto_tree_add_item(mpls_echo_tree,
1916
40
                            hf_mpls_echo_returnsubcode, tvb, offset + 7, 1, ENC_BIG_ENDIAN);
1917
40
        proto_tree_add_item(mpls_echo_tree,
1918
40
                            hf_mpls_echo_handle, tvb, offset + 8, 4, ENC_BIG_ENDIAN);
1919
40
        proto_tree_add_item(mpls_echo_tree,
1920
40
                            hf_mpls_echo_sequence, tvb, offset + 12, 4, ENC_BIG_ENDIAN);
1921
1922
40
        if (MSGTYPE_MPLS_ECHO(msgtype)) {
1923
3
            proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_sent, tvb,
1924
3
                                offset + 16, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
1925
3
            proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_rec, tvb,
1926
3
                                offset + 24, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
1927
3
        }
1928
40
    }
1929
1930
40
    if (MSGTYPE_MPLS_ECHO(msgtype)) {
1931
3
        offset += 32;
1932
3
        rem    -= 32;
1933
37
    } else {
1934
37
        offset += 16;
1935
37
        rem    -= 16;
1936
37
    }
1937
1938
    /* Dissect all TLVs */
1939
210
    while (tvb_reported_length_remaining(tvb, offset) > 0 ) {
1940
170
        len = dissect_mpls_echo_tlv(tvb, pinfo, offset, mpls_echo_tree, rem, false);
1941
170
        offset += len;
1942
170
        rem    -= len;
1943
170
    }
1944
1945
1946
40
    return tvb_captured_length(tvb);
1947
40
}
1948
1949
/* Register the protocol with Wireshark */
1950
1951
void
1952
proto_register_mpls_echo(void)
1953
14
{
1954
1955
14
    static hf_register_info hf[] = {
1956
14
        { &hf_mpls_echo_version,
1957
14
          { "Version", "mpls_echo.version",
1958
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO Version Number", HFILL}
1959
14
        },
1960
14
        { &hf_mpls_echo_mbz,
1961
14
          { "MBZ", "mpls_echo.mbz",
1962
14
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Must be Zero", HFILL}
1963
14
        },
1964
14
        { &hf_mpls_echo_gflags,
1965
14
          { "Global Flags", "mpls_echo.flags",
1966
14
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Global Flags", HFILL}
1967
14
        },
1968
14
        { &hf_mpls_echo_flag_sbz,
1969
14
          { "Reserved", "mpls_echo.flag_sbz",
1970
14
            FT_UINT16, BASE_HEX, NULL, 0xFFF8, "MPLS ECHO Reserved Flags", HFILL}
1971
14
        },
1972
14
        { &hf_mpls_echo_flag_v,
1973
14
          { "Validate FEC Stack", "mpls_echo.flag_v",
1974
14
            FT_BOOLEAN, 16, NULL, 0x0001, "MPLS ECHO Validate FEC Stack Flag", HFILL}
1975
14
        },
1976
14
        { &hf_mpls_echo_flag_t,
1977
14
          { "Respond only if TTL expired", "mpls_echo.flag_t",
1978
14
            FT_BOOLEAN, 16, NULL, 0x0002, "MPLS ECHO Respond only if TTL expired Flag", HFILL}
1979
14
        },
1980
14
        { &hf_mpls_echo_flag_r,
1981
14
          { "Validate Reverse Path", "mpls_echo.flag_r",
1982
14
            FT_BOOLEAN, 16, NULL, 0x0004, "MPLS ECHO Validate Reverse Path Flag", HFILL}
1983
14
        },
1984
14
        { &hf_mpls_echo_msgtype,
1985
14
          { "Message Type", "mpls_echo.msg_type",
1986
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_msgtype), 0x0, "MPLS ECHO Message Type", HFILL}
1987
14
        },
1988
14
        { &hf_mpls_echo_replymode,
1989
14
          { "Reply Mode", "mpls_echo.reply_mode",
1990
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_replymode), 0x0, "MPLS ECHO Reply Mode", HFILL}
1991
14
        },
1992
14
        { &hf_mpls_echo_returncode,
1993
14
          { "Return Code", "mpls_echo.return_code",
1994
14
            FT_UINT8, BASE_DEC | BASE_EXT_STRING, &mpls_echo_returncode_ext, 0x0, "MPLS ECHO Return Code", HFILL}
1995
14
        },
1996
14
        { &hf_mpls_echo_returnsubcode,
1997
14
          { "Return Subcode", "mpls_echo.return_subcode",
1998
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO Return Subcode", HFILL}
1999
14
        },
2000
14
        { &hf_mpls_echo_handle,
2001
14
          { "Sender's Handle", "mpls_echo.sender_handle",
2002
14
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO Sender's Handle", HFILL}
2003
14
        },
2004
14
        { &hf_mpls_echo_sequence,
2005
14
          { "Sequence Number", "mpls_echo.sequence",
2006
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO Sequence Number", HFILL}
2007
14
        },
2008
14
        { &hf_mpls_echo_ts_sent,
2009
14
          { "Timestamp Sent", "mpls_echo.timestamp_sent",
2010
14
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Sent", HFILL}
2011
14
        },
2012
14
        { &hf_mpls_echo_ts_rec,
2013
14
          { "Timestamp Received", "mpls_echo.timestamp_rec",
2014
14
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Received", HFILL}
2015
14
        },
2016
14
        { &hf_mpls_echo_tlv_type,
2017
14
          { "Type", "mpls_echo.tlv.type",
2018
14
            FT_UINT16, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_type_names_ext, 0x0,
2019
14
            "MPLS ECHO TLV Type", HFILL}
2020
14
        },
2021
14
        { &hf_mpls_echo_tlv_len,
2022
14
          { "Length", "mpls_echo.tlv.len",
2023
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Length", HFILL}
2024
14
        },
2025
14
        { &hf_mpls_echo_tlv_value,
2026
14
          { "Value", "mpls_echo.tlv.value",
2027
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Value", HFILL}
2028
14
        },
2029
14
        { &hf_mpls_echo_tlv_fec_type,
2030
14
          { "Type", "mpls_echo.tlv.fec.type",
2031
14
            FT_UINT16, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_fec_names_ext, 0x0,
2032
14
            "MPLS ECHO TLV FEC Stack Type", HFILL}
2033
14
        },
2034
14
        { &hf_mpls_echo_tlv_fec_len,
2035
14
          { "Length", "mpls_echo.tlv.fec.len",
2036
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Length", HFILL}
2037
14
        },
2038
14
        { &hf_mpls_echo_tlv_fec_value,
2039
14
          { "Value", "mpls_echo.tlv.fec.value",
2040
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Value", HFILL}
2041
14
        },
2042
14
        { &hf_mpls_echo_tlv_fec_ldp_ipv4,
2043
14
          { "IPv4 Prefix", "mpls_echo.tlv.fec.ldp_ipv4",
2044
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4", HFILL}
2045
14
        },
2046
14
        { &hf_mpls_echo_tlv_fec_ldp_ipv4_mask,
2047
14
          { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv4_mask",
2048
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4 Prefix Length", HFILL}
2049
14
        },
2050
14
        { &hf_mpls_echo_tlv_fec_ldp_ipv6,
2051
14
          { "IPv6 Prefix", "mpls_echo.tlv.fec.ldp_ipv6",
2052
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6", HFILL}
2053
14
        },
2054
14
        { &hf_mpls_echo_tlv_fec_ldp_ipv6_mask,
2055
14
          { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv6_mask",
2056
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6 Prefix Length", HFILL}
2057
14
        },
2058
14
        { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint,
2059
14
          { "IPv4 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv4_ep",
2060
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Tunnel Endpoint Address", HFILL}
2061
14
        },
2062
14
        { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint,
2063
14
          { "IPv6 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv6_ep",
2064
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Tunnel Endpoint Address", HFILL}
2065
14
        },
2066
14
        { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz1,
2067
14
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz1",
2068
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL}
2069
14
        },
2070
14
        { &hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id,
2071
14
          { "Tunnel ID", "mpls_echo.tlv.fec.rsvp_ip_tun_id",
2072
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP Tunnel ID", HFILL}
2073
14
        },
2074
14
        { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id,
2075
14
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv4_ext_tun_id",
2076
14
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Extended Tunnel ID", HFILL}
2077
14
        },
2078
14
        { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender,
2079
14
          { "IPv4 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv4_sender",
2080
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL}
2081
14
        },
2082
14
        { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id,
2083
14
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv6_ext_tun_id",
2084
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Extended Tunnel ID", HFILL}
2085
14
        },
2086
14
        { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender,
2087
14
          { "IPv6 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv6_sender",
2088
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL}
2089
14
        },
2090
14
        { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz2,
2091
14
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz2",
2092
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL}
2093
14
        },
2094
14
        { &hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id,
2095
14
          { "LSP ID", "mpls_echo.tlv.fec.rsvp_ip_lsp_id",
2096
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP LSP ID", HFILL}
2097
14
        },
2098
14
        { &hf_mpls_echo_tlv_fec_vpn_route_dist,
2099
14
          { "Route Distinguisher", "mpls_echo.tlv.fec.vpn_route_dist",
2100
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN Route Distinguisher", HFILL}
2101
14
        },
2102
14
        { &hf_mpls_echo_tlv_fec_vpn_ipv4,
2103
14
          { "IPv4 Prefix", "mpls_echo.tlv.fec.vpn_ipv4",
2104
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN IPv4", HFILL}
2105
14
        },
2106
14
        { &hf_mpls_echo_tlv_fec_vpn_ipv6,
2107
14
          { "IPv6 Prefix", "mpls_echo.tlv.fec.vpn_ipv6",
2108
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN IPv6", HFILL}
2109
14
        },
2110
14
        { &hf_mpls_echo_tlv_fec_vpn_len,
2111
14
          { "Prefix Length", "mpls_echo.tlv.fec.vpn_len",
2112
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack VPN Prefix Length", HFILL}
2113
14
        },
2114
14
        { &hf_mpls_echo_tlv_fec_l2_vpn_route_dist,
2115
14
          { "Route Distinguisher", "mpls_echo.tlv.fec.l2vpn_route_dist",
2116
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2VPN Route Distinguisher", HFILL}
2117
14
        },
2118
14
        { &hf_mpls_echo_tlv_fec_l2_vpn_send_ve_id,
2119
14
          { "Sender's VE ID", "mpls_echo.tlv.fec.l2vpn_send_ve_id",
2120
14
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2VPN Sender's VE ID", HFILL}
2121
14
        },
2122
14
        { &hf_mpls_echo_tlv_fec_l2_vpn_recv_ve_id,
2123
14
          { "Receiver's VE ID", "mpls_echo.tlv.fec.l2vpn_recv_ve_id",
2124
14
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2VPN Receiver's VE ID", HFILL}
2125
14
        },
2126
14
        { &hf_mpls_echo_tlv_fec_l2_vpn_encap_type,
2127
14
          { "Encapsulation", "mpls_echo.tlv.fec.l2vpn_encap_type",
2128
14
            FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC Stack L2VPN Encapsulation", HFILL}
2129
14
        },
2130
14
        { &hf_mpls_echo_tlv_fec_l2cid_sender,
2131
14
          { "Sender's PE Address", "mpls_echo.tlv.fec.l2cid_sender",
2132
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Sender", HFILL}
2133
14
        },
2134
14
        { &hf_mpls_echo_tlv_fec_l2cid_remote,
2135
14
          { "Remote PE Address", "mpls_echo.tlv.fec.l2cid_remote",
2136
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Remote", HFILL}
2137
14
        },
2138
14
        { &hf_mpls_echo_tlv_fec_l2cid_vcid,
2139
14
          { "VC ID", "mpls_echo.tlv.fec.l2cid_vcid",
2140
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID VCID", HFILL}
2141
14
        },
2142
14
        { &hf_mpls_echo_tlv_fec_l2cid_encap,
2143
14
          { "Encapsulation", "mpls_echo.tlv.fec.l2cid_encap",
2144
14
            FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC Stack L2CID Encapsulation", HFILL}
2145
14
        },
2146
14
        { &hf_mpls_echo_tlv_fec_l2cid_mbz,
2147
14
          { "MBZ", "mpls_echo.tlv.fec.l2cid_mbz",
2148
14
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID MBZ", HFILL}
2149
14
        },
2150
14
        { &hf_mpls_echo_tlv_fec_bgp_ipv4,
2151
14
          { "IPv4 Prefix", "mpls_echo.tlv.fec.bgp_ipv4",
2152
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP IPv4", HFILL}
2153
14
        },
2154
14
        { &hf_mpls_echo_tlv_fec_bgp_ipv6,
2155
14
          { "IPv6 Prefix", "mpls_echo.tlv.fec.bgp_ipv6",
2156
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP IPv6", HFILL}
2157
14
        },
2158
14
        { &hf_mpls_echo_tlv_fec_bgp_len,
2159
14
          { "Prefix Length", "mpls_echo.tlv.fec.bgp_len",
2160
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP Prefix Length", HFILL}
2161
14
        },
2162
14
        { &hf_mpls_echo_tlv_fec_gen_ipv4,
2163
14
          { "IPv4 Prefix", "mpls_echo.tlv.fec.gen_ipv4",
2164
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4", HFILL}
2165
14
        },
2166
14
        { &hf_mpls_echo_tlv_fec_gen_ipv4_mask,
2167
14
          { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv4_mask",
2168
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4 Prefix Length", HFILL}
2169
14
        },
2170
14
        { &hf_mpls_echo_tlv_fec_gen_ipv6,
2171
14
          { "IPv6 Prefix", "mpls_echo.tlv.fec.gen_ipv6",
2172
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6", HFILL}
2173
14
        },
2174
14
        { &hf_mpls_echo_tlv_fec_gen_ipv6_mask,
2175
14
          { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv6_mask",
2176
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6 Prefix Length", HFILL}
2177
14
        },
2178
14
        { &hf_mpls_echo_tlv_fec_nil_label,
2179
14
          { "Label", "mpls_echo.tlv.fec.nil_label",
2180
14
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV FEC Stack NIL Label", HFILL}
2181
14
        },
2182
14
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_sender,
2183
14
          { "Sender's PE Address", "mpls_echo.tlv.fec.pw_ipv6_128_sender",
2184
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 SENDER", HFILL }
2185
14
        },
2186
14
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_remote,
2187
14
          { "Remote's PE Address", "mpls_echo.tlv.fec.pw_ipv6_128_remote",
2188
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 REMOTE", HFILL }
2189
14
        },
2190
14
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_id,
2191
14
          { "PW ID", "mpls_echo.tlv.fec.fec.pw_ipv6_128_pwid",
2192
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 PW ID", HFILL}
2193
14
        },
2194
14
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_pw_type,
2195
14
          { "PW TYPE", "mpls_echo.tlv.fec.fec.pw_ipv6_128_pw_type",
2196
14
            FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 PW TYPE", HFILL}
2197
14
        },
2198
14
        { &hf_mpls_echo_tlv_fec_pw_ipv6_128_mbz,
2199
14
          { "MBZ", "mpls_echo.tlv.fec.fec.pw_ipv6_128_mbz",
2200
14
            FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC PW IPV6 FEC 128 MBZ", HFILL}
2201
14
        },
2202
14
        { &hf_mpls_echo_tlv_fec_igp_ipv4,
2203
14
          { "IPv4 Prefix", "mpls_echo.tlv.fec.igp_ipv4",
2204
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP IPv4", HFILL}
2205
14
        },
2206
14
        { &hf_mpls_echo_tlv_fec_igp_ipv6,
2207
14
          { "IPv6 Prefix", "mpls_echo.tlv.fec.igp_ipv6",
2208
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP IPv6", HFILL}
2209
14
        },
2210
14
        { &hf_mpls_echo_tlv_fec_igp_mask,
2211
14
          { "Prefix Length", "mpls_echo.tlv.fec.igp_mask",
2212
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Prefix Length", HFILL}
2213
14
        },
2214
14
        { &hf_mpls_echo_tlv_fec_igp_protocol,
2215
14
          { "Protocol", "mpls_echo.tlv.fec.igp_protocol",
2216
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_sr_protocol_types), 0x0, "MPLS ECHO TLV FEC Stack IGP Protocol", HFILL}
2217
14
        },
2218
14
        { &hf_mpls_echo_tlv_fec_igp_reserved,
2219
14
          { "Reserved", "mpls_echo.tlv.fec.igp_reserved",
2220
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Reserved", HFILL}
2221
14
        },
2222
14
        { &hf_mpls_echo_tlv_fec_igp_adj_type,
2223
14
          { "Adjacency Type", "mpls_echo.tlv.fec.igp_adj_type",
2224
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_igp_adjacency_types), 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Type", HFILL}
2225
14
        },
2226
14
        { &hf_mpls_echo_tlv_fec_igp_adj_local_ipv4,
2227
14
          { "Local Interface ID", "mpls_echo.tlv.fec.igp_adj_local_id.ipv4",
2228
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Local Interface ID", HFILL}
2229
14
        },
2230
14
        { &hf_mpls_echo_tlv_fec_igp_adj_local_ipv6,
2231
14
          { "Local Interface ID", "mpls_echo.tlv.fec.igp_adj_local_id.ipv6",
2232
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Local Interface ID", HFILL}
2233
14
        },
2234
14
        { &hf_mpls_echo_tlv_fec_igp_adj_local_ident,
2235
14
          { "Local Interface ID", "mpls_echo.tlv.fec.igp_adj_local_id.ident",
2236
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Local Interface ID", HFILL}
2237
14
        },
2238
14
        { &hf_mpls_echo_tlv_fec_igp_adj_remote_ipv4,
2239
14
          { "Remote Interface ID", "mpls_echo.tlv.fec.igp_adj_remote_id.ipv4",
2240
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Remote Interface ID", HFILL}
2241
14
        },
2242
14
        { &hf_mpls_echo_tlv_fec_igp_adj_remote_ipv6,
2243
14
          { "Remote Interface ID", "mpls_echo.tlv.fec.igp_adj_remote_id.ipv6",
2244
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Remote Interface ID", HFILL}
2245
14
        },
2246
14
        { &hf_mpls_echo_tlv_fec_igp_adj_remote_ident,
2247
14
          { "Remote Interface ID", "mpls_echo.tlv.fec.igp_adj_remote_id.ident",
2248
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Remote Interface ID", HFILL}
2249
14
        },
2250
14
        { &hf_mpls_echo_tlv_fec_igp_adj_adv_ident_ospf,
2251
14
          { "Advertising Node Identifier Router ID", "mpls_echo.tlv.fec.igp_adj_adv_node_id.ospf",
2252
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Advertising Node Identifier OSPF Router ID", HFILL}
2253
14
        },
2254
14
        { &hf_mpls_echo_tlv_fec_igp_adj_adv_ident_isis,
2255
14
          { "Advertising Node Identifier System ID", "mpls_echo.tlv.fec.igp_adj_adv_node_id.isis",
2256
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Advertising Node Identifier IS-IS System ID", HFILL}
2257
14
        },
2258
14
        { &hf_mpls_echo_tlv_fec_igp_adj_adv_ident,
2259
14
          { "Advertising Node Identifier", "mpls_echo.tlv.fec.igp_adj_adv_node_id.ident",
2260
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Advertising Node Identifier", HFILL}
2261
14
        },
2262
14
        { &hf_mpls_echo_tlv_fec_igp_adj_rec_ident_ospf,
2263
14
          { "Receiving Node Identifier Router ID", "mpls_echo.tlv.fec.igp_adj_rec_node_id.ospf",
2264
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Receiving Node Identifier OSPF Router ID", HFILL}
2265
14
        },
2266
14
        { &hf_mpls_echo_tlv_fec_igp_adj_rec_ident_isis,
2267
14
          { "Receiving Node Identifier System ID", "mpls_echo.tlv.fec.igp_adj_rec_node_id.isis",
2268
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Receiving Node Identifier IS-IS System ID", HFILL}
2269
14
        },
2270
14
        { &hf_mpls_echo_tlv_fec_igp_adj_rec_ident,
2271
14
          { "Receiving Node Identifier", "mpls_echo.tlv.fec.igp_adj_rec_node_id.ident",
2272
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack IGP Adjacency Receiving Node Identifier", HFILL}
2273
14
        },
2274
14
        { &hf_mpls_echo_tlv_ds_map_mtu,
2275
14
          { "MTU", "mpls_echo.tlv.ds_map.mtu",
2276
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map MTU", HFILL}
2277
14
        },
2278
14
        { &hf_mpls_echo_tlv_ds_map_addr_type,
2279
14
          { "Address Type", "mpls_echo.tlv.ds_map.addr_type",
2280
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0,
2281
14
            "MPLS ECHO TLV Downstream Map Address Type", HFILL}
2282
14
        },
2283
14
        { &hf_mpls_echo_tlv_ds_map_res,
2284
14
          { "DS Flags", "mpls_echo.tlv.ds_map.res",
2285
14
            FT_UINT8, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Downstream Map DS Flags", HFILL}
2286
14
        },
2287
14
        { &hf_mpls_echo_tlv_ds_map_flag_res,
2288
14
          { "MBZ", "mpls_echo.tlv.ds_map.flag_res",
2289
14
            FT_UINT8, BASE_HEX, NULL, 0xFC, "MPLS ECHO TLV Downstream Map Reserved Flags", HFILL}
2290
14
        },
2291
14
        { &hf_mpls_echo_tlv_ds_map_flag_i,
2292
14
          { "Interface and Label Stack Request", "mpls_echo.tlv.ds_map.flag_i",
2293
14
            FT_BOOLEAN, 8, NULL, 0x02, "MPLS ECHO TLV Downstream Map I-Flag", HFILL}
2294
14
        },
2295
14
        { &hf_mpls_echo_tlv_ds_map_flag_n,
2296
14
          { "Treat as Non-IP Packet", "mpls_echo.tlv.ds_map.flag_n",
2297
14
            FT_BOOLEAN, 8, NULL, 0x01, "MPLS ECHO TLV Downstream Map N-Flag", HFILL}
2298
14
        },
2299
14
        { &hf_mpls_echo_tlv_ds_map_ds_ip,
2300
14
          { "Downstream IP Address", "mpls_echo.tlv.ds_map.ds_ip",
2301
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IP Address", HFILL}
2302
14
        },
2303
14
        { &hf_mpls_echo_tlv_ds_map_int_ip,
2304
14
          { "Downstream Interface Address", "mpls_echo.tlv.ds_map.int_ip",
2305
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Address", HFILL}
2306
14
        },
2307
14
        { &hf_mpls_echo_tlv_ds_map_if_index,
2308
14
          { "Upstream Interface Index", "mpls_echo.tlv.ds_map.if_index",
2309
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Index", HFILL}
2310
14
        },
2311
14
        { &hf_mpls_echo_tlv_ds_map_ds_ipv6,
2312
14
          { "Downstream IPv6 Address", "mpls_echo.tlv.ds_map.ds_ipv6",
2313
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IPv6 Address", HFILL}
2314
14
        },
2315
14
        { &hf_mpls_echo_tlv_ds_map_int_ipv6,
2316
14
          { "Downstream Interface IPv6 Address", "mpls_echo.tlv.ds_map.int_ipv6",
2317
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface IPv6 Address", HFILL}
2318
14
        },
2319
14
        { &hf_mpls_echo_tlv_ds_map_hash_type,
2320
14
          { "Multipath Type", "mpls_echo.tlv.ds_map.hash_type",
2321
14
            FT_UINT8, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_ds_map_hash_type_ext, 0x0,
2322
14
            "MPLS ECHO TLV Downstream Map Multipath Type", HFILL}
2323
14
        },
2324
14
        { &hf_mpls_echo_tlv_ds_map_depth,
2325
14
          { "Depth Limit", "mpls_echo.tlv.ds_map.depth",
2326
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Depth Limit", HFILL}
2327
14
        },
2328
14
        { &hf_mpls_echo_tlv_ds_map_muti_len,
2329
14
          { "Multipath Length", "mpls_echo.tlv.ds_map.multi_len",
2330
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Length", HFILL}
2331
14
        },
2332
14
        { &hf_mpls_echo_tlv_ds_map_mp_ip,
2333
14
          { "IP Address", "mpls_echo.tlv.ds_map_mp.ip",
2334
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath IP Address", HFILL}
2335
14
        },
2336
14
        { &hf_mpls_echo_tlv_ds_map_mp_mask,
2337
14
          { "Mask", "mpls_echo.tlv.ds_map_mp.mask",
2338
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Mask", HFILL}
2339
14
        },
2340
14
        { &hf_mpls_echo_tlv_ds_map_mp_ip_low,
2341
14
          { "IP Address Low", "mpls_echo.tlv.ds_map_mp.ip_low",
2342
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Low IP Address", HFILL}
2343
14
        },
2344
14
        { &hf_mpls_echo_tlv_ds_map_mp_ip_high,
2345
14
          { "IP Address High", "mpls_echo.tlv.ds_map_mp.ip_high",
2346
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath High IP Address", HFILL}
2347
14
        },
2348
14
        { &hf_mpls_echo_tlv_ds_map_mp_no_multipath_info,
2349
14
          { "No Multipath Information", "mpls_echo.tlv.ds_map_mp.no_multipath_info",
2350
14
            FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
2351
14
        },
2352
14
        { &hf_mpls_echo_tlv_ds_map_mp_value,
2353
14
          { "Multipath Value", "mpls_echo.tlv.ds_map_mp.value",
2354
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Multipath Value", HFILL}
2355
14
        },
2356
14
        { &hf_mpls_echo_tlv_ds_map_mp_label,
2357
14
          { "Downstream Label", "mpls_echo.tlv.ds_map.mp_label",
2358
14
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Downstream Map Downstream Label", HFILL}
2359
14
        },
2360
14
        { &hf_mpls_echo_tlv_ds_map_mp_exp,
2361
14
          { "Downstream Exp", "mpls_echo.tlv.ds_map.mp_exp",
2362
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream Experimental", HFILL}
2363
14
        },
2364
14
        { &hf_mpls_echo_tlv_ds_map_mp_bos,
2365
14
          { "Downstream BOS", "mpls_echo.tlv.ds_map.mp_bos",
2366
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream BOS", HFILL}
2367
14
        },
2368
14
        { &hf_mpls_echo_tlv_ds_map_mp_proto,
2369
14
          { "Downstream Protocol", "mpls_echo.tlv.ds_map.mp_proto",
2370
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_mp_proto), 0x0,
2371
14
            "MPLS ECHO TLV Downstream Map Downstream Protocol", HFILL}
2372
14
        },
2373
14
        { &hf_mpls_echo_tlv_padaction,
2374
14
          { "Pad Action", "mpls_echo.tlv.pad_action",
2375
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_pad), 0x0, "MPLS ECHO Pad TLV Action", HFILL}
2376
14
        },
2377
14
        { &hf_mpls_echo_tlv_padding,
2378
14
          { "Padding", "mpls_echo.tlv.pad_padding",
2379
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO Pad TLV Padding", HFILL}
2380
14
        },
2381
14
        { &hf_mpls_echo_tlv_vendor,
2382
14
          { "Vendor Id", "mpls_echo.tlv.vendor_id",
2383
14
            FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0, "MPLS ECHO Vendor Id", HFILL}
2384
14
        },
2385
14
        { &hf_mpls_echo_tlv_ilso_addr_type,
2386
14
          { "Address Type", "mpls_echo.tlv.ilso.addr_type",
2387
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0,
2388
14
            "MPLS ECHO TLV Interface and Label Stack Address Type", HFILL}
2389
14
        },
2390
14
        { &hf_mpls_echo_tlv_ilso_mbz,
2391
14
          { "Must Be Zero", "mpls_echo.tlv.ilso.mbz",
2392
14
            FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack MBZ", HFILL}
2393
14
        },
2394
14
        { &hf_mpls_echo_tlv_ilso_ipv4_addr,
2395
14
          { "Downstream IPv4 Address", "mpls_echo.tlv.ilso_ipv4.addr",
2396
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL}
2397
14
        },
2398
14
        { &hf_mpls_echo_tlv_ilso_ipv4_int_addr,
2399
14
          { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv4.int_addr",
2400
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL}
2401
14
        },
2402
14
        { &hf_mpls_echo_tlv_ilso_ipv6_addr,
2403
14
          { "Downstream IPv6 Address", "mpls_echo.tlv.ilso_ipv6.addr",
2404
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL}
2405
14
        },
2406
14
        { &hf_mpls_echo_tlv_ilso_ipv6_int_addr,
2407
14
          { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv6.int_addr",
2408
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL}
2409
14
        },
2410
14
        { &hf_mpls_echo_tlv_ilso_int_index,
2411
14
          { "Downstream Interface Index", "mpls_echo.tlv.ilso.int_index",
2412
14
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Index", HFILL}
2413
14
        },
2414
14
        { &hf_mpls_echo_tlv_ilso_label,
2415
14
          { "Label", "mpls_echo.tlv.ilso_ipv4.label",
2416
14
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Interface and Label Stack Label", HFILL}
2417
14
        },
2418
14
        { &hf_mpls_echo_tlv_ilso_exp,
2419
14
          { "Exp", "mpls_echo.tlv.ilso_ipv4.exp",
2420
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Exp", HFILL}
2421
14
        },
2422
14
        { &hf_mpls_echo_tlv_ilso_bos,
2423
14
          { "BOS", "mpls_echo.tlv.ilso_ipv4.bos",
2424
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack BOS", HFILL}
2425
14
        },
2426
14
        { &hf_mpls_echo_tlv_ilso_ttl,
2427
14
          { "TTL", "mpls_echo.tlv.ilso_ipv4.ttl",
2428
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack TTL", HFILL}
2429
14
        },
2430
#if 0
2431
        { &hf_mpls_echo_tlv_rto_ipv4,
2432
          { "Reply-to IPv4 Address", "mpls_echo.tlv.rto.ipv4",
2433
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv4 Reply-To Object", HFILL}
2434
        },
2435
        { &hf_mpls_echo_tlv_rto_ipv6,
2436
          { "Reply-to IPv6 Address", "mpls_echo.tlv.rto.ipv6",
2437
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv6 Reply-To Object", HFILL}
2438
        },
2439
#endif
2440
14
        { &hf_mpls_echo_tlv_reply_tos,
2441
14
          { "Reply-TOS Byte", "mpls_echo.tlv.reply.tos",
2442
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Reply-TOS Byte", HFILL}
2443
14
        },
2444
14
        { &hf_mpls_echo_tlv_reply_tos_mbz,
2445
14
          { "MBZ", "mpls_echo.tlv.reply.tos.mbz",
2446
14
            FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Reply-TOS MBZ", HFILL}
2447
14
        },
2448
14
        { &hf_mpls_echo_tlv_errored_type,
2449
14
          { "Errored TLV Type", "mpls_echo.tlv.errored.type",
2450
14
            FT_UINT16, BASE_DEC | BASE_EXT_STRING, &mpls_echo_tlv_type_names_ext, 0x0,
2451
14
            "MPLS ECHO TLV Errored TLV Type", HFILL}
2452
14
        },
2453
14
        { &hf_mpls_echo_tlv_ds_map_ingress_if_num,
2454
14
          { "Ingress Interface Number", "mpls_echo.tlv.ds_map.ingress.if.num",
2455
14
            FT_UINT32, BASE_DEC, NULL, 0x0,
2456
14
            "MPLS ECHO TLV DownStream Map Ingress Interface Number", HFILL}
2457
14
        },
2458
14
        { &hf_mpls_echo_tlv_ds_map_egress_if_num,
2459
14
          { "Egress Interface Number", "mpls_echo.tlv.ds_map.egress.if.num",
2460
14
            FT_UINT32, BASE_DEC, NULL, 0x0,
2461
14
            "MPLS ECHO TLV DownStream Map Egress Interface Number", HFILL}
2462
14
        },
2463
14
        { &hf_mpls_echo_lspping_tlv_src_gid,
2464
14
          { "SRC GLOBAL ID", "mpls_echo.lspping.tlv.src.gid",
2465
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "LSP SRC  GID", HFILL}
2466
14
        },
2467
14
        { &hf_mpls_echo_lspping_tlv_src_nid,
2468
14
          { "SRC NODE ID", "mpls_echo.lspping.tlv.src.nid",
2469
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "LSP SRC NID", HFILL}
2470
14
        },
2471
14
        { &hf_mpls_echo_lspping_tlv_src_tunnel_no,
2472
14
          { "SRC Tunnel Number", "mpls_echo.lspping.tlv.tunnel.no",
2473
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC Tunnel Number", HFILL}
2474
14
        },
2475
14
        { &hf_mpls_echo_lspping_tlv_lsp_no,
2476
14
          { "SRC LSP Number", "mpls_echo.lspping.tlv.lsp.no",
2477
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC LSP  Number", HFILL}
2478
14
        },
2479
14
        { &hf_mpls_echo_lspping_tlv_dst_gid,
2480
14
          { "DST GLOBAL ID", "mpls_echo.lspping.tlv.dst.gid",
2481
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "LSP FEC DST  GID", HFILL}
2482
14
        },
2483
14
        { &hf_mpls_echo_lspping_tlv_dst_nid,
2484
14
          { "DST NODE ID", "mpls_echo.lspping.tlv.dst.nid",
2485
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "LSP FEC DST NID", HFILL}
2486
14
        },
2487
14
        { &hf_mpls_echo_lspping_tlv_dst_tunnel_no,
2488
14
          { "DST Tunnel Number", "mpls_echo.lspping.tlv.dst.tunnel.no",
2489
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC DST Tunnel Number", HFILL}
2490
14
        },
2491
14
        { &hf_mpls_echo_lspping_tlv_resv,
2492
14
          { "RESERVED", "mpls_echo.lspping.tlv.resv",
2493
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "RESERVED BITS", HFILL}
2494
14
        },
2495
14
        { &hf_mpls_echo_lspping_tlv_src_addr_gid,
2496
14
          { "Global ID", "mpls_echo.lspping.tlv.src.addr.gid",
2497
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "SRC ADDR TLV GID", HFILL}
2498
14
        },
2499
14
        { &hf_mpls_echo_lspping_tlv_src_addr_nid,
2500
14
          { "Node ID", "mpls_echo.lspping.tlv.src.addr.nid",
2501
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "SRC ADDR TLV NID", HFILL}
2502
14
        },
2503
14
        { &hf_mpls_echo_lspping_tlv_pw_serv_identifier,
2504
14
          { "Service identifier", "mpls_echo.lspping.tlv.pw.serv.identifier",
2505
14
            FT_UINT64, BASE_DEC, NULL, 0x0, "PW FEC Service identifier", HFILL}
2506
14
        },
2507
14
        { &hf_mpls_echo_lspping_tlv_pw_src_ac_id,
2508
14
          { "SRC AC ID", "mpls_echo.lspping.tlv.pw.src.ac.id",
2509
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC SRC AC ID", HFILL}
2510
14
        },
2511
14
        { &hf_mpls_echo_lspping_tlv_pw_dst_ac_id,
2512
14
          { "DST AC ID", "mpls_echo.lspping.tlv.pw.dst.ac.id",
2513
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC DST AC ID", HFILL}
2514
14
        },
2515
14
        { &hf_mpls_echo_padding,
2516
14
          { "Padding", "mpls_echo.padding",
2517
14
            FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
2518
14
        },
2519
#if 0
2520
        { &hf_mpls_echo_lspping_tlv_pw_agi_type,
2521
          { "AGI TYPE", "mpls_echo.lspping.tlv.pw.agi.type",
2522
            FT_UINT8, BASE_DEC, NULL, 0x0, "PW AGI TYPE", HFILL}
2523
        },
2524
#endif
2525
#if 0
2526
        { &hf_mpls_echo_lspping_tlv_pw_agi_len,
2527
          { "AGI Length", "mpls_echo.lspping.tlv.pw.agi.len",
2528
            FT_UINT8, BASE_DEC, NULL, 0x0, "PW AGI LENGTH", HFILL}
2529
        },
2530
#endif
2531
#if 0
2532
        { &hf_mpls_echo_lspping_tlv_pw_agi_val,
2533
          { "AGI VALUE", "mpls_echo.lspping.tlv.pw.agi.val",
2534
            FT_STRING, BASE_NONE, NULL, 0x0, "PW AGI VALUE", HFILL}
2535
        },
2536
#endif
2537
14
        { &hf_mpls_echo_tlv_dd_map_mtu,
2538
14
          { "MTU", "mpls_echo.lspping.tlv.dd_map.mtu",
2539
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map MTU", HFILL}
2540
14
        },
2541
14
        { &hf_mpls_echo_tlv_dd_map_addr_type,
2542
14
          { "Address Type", "mpls_echo.tlv.dd_map.addr_type",
2543
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0, "MPLS ECHO TLV Detailed Downstream Map Address Type", HFILL}
2544
14
        },
2545
14
        { &hf_mpls_echo_tlv_dd_map_res,
2546
14
          { "DS Flags", "mpls_echo.tlv.dd_map.res",
2547
14
            FT_UINT8, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map DS Flags", HFILL}
2548
14
        },
2549
14
        { &hf_mpls_echo_tlv_dd_map_flag_res,
2550
14
          { "MBZ", "mpls_echo.tlv.dd_map.flag_res",
2551
14
            FT_UINT8, BASE_HEX, NULL, 0xFC, "MPLS ECHO TLV Detailed Downstream Map Reserved Flags", HFILL}
2552
14
        },
2553
14
        { &hf_mpls_echo_tlv_dd_map_flag_i,
2554
14
          { "Interface and Label Stack Request", "mpls_echo.tlv.dd_map.flag_i",
2555
14
            FT_BOOLEAN, 8, NULL, 0x02, "MPLS ECHO TLV Detailed Downstream Map I-Flag", HFILL}
2556
14
        },
2557
14
        { &hf_mpls_echo_tlv_dd_map_flag_n,
2558
14
          { "Treat as Non-IP Packet", "mpls_echo.tlv.dd_map.flag_n",
2559
14
            FT_BOOLEAN, 8, NULL, 0x01, "MPLS ECHO TLV Detailed Downstream Map N-Flag", HFILL}
2560
14
        },
2561
14
        { &hf_mpls_echo_tlv_dd_map_ds_ip,
2562
14
          { "Downstream IP Address", "mpls_echo.tlv.dd_map.ds_ip",
2563
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map IP Address", HFILL}
2564
14
        },
2565
14
        { &hf_mpls_echo_tlv_dd_map_int_ip,
2566
14
          { "Downstream Interface Address", "mpls_echo.tlv.dd_map.int_ip",
2567
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Interface Address", HFILL}
2568
14
        },
2569
14
        { &hf_mpls_echo_tlv_dd_map_ds_ipv6,
2570
14
          { "Downstream IPv6 Address", "mpls_echo.tlv.dd_map.ds_ipv6",
2571
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map IPv6 Address", HFILL}
2572
14
        },
2573
14
        { &hf_mpls_echo_tlv_dd_map_int_ipv6,
2574
14
          { "Downstream Interface IPv6 Address", "mpls_echo.tlv.dd_map.int_ipv6",
2575
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Interface IPv6 Address", HFILL}
2576
14
        },
2577
14
        { &hf_mpls_echo_tlv_dd_map_return_code,
2578
14
          { "Return Code", "mpls_echo.tlv.dd_map.return_code",
2579
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Return Code", HFILL}
2580
14
        },
2581
14
        { &hf_mpls_echo_tlv_dd_map_return_subcode,
2582
14
          { "Return Subcode", "mpls_echo.tlv.dd_map.return_subcode",
2583
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Return Subcode", HFILL}
2584
14
        },
2585
14
        { &hf_mpls_echo_tlv_dd_map_ingress_if_num,
2586
14
          { "Ingress Interface Number", "mpls_echo.tlv.dd_map.ingress.if.num",
2587
14
            FT_UINT32, BASE_DEC, NULL, 0x0,
2588
14
            "MPLS ECHO TLV Detailed DownStream Map Ingress Interface Number", HFILL}
2589
14
        },
2590
14
        { &hf_mpls_echo_tlv_dd_map_egress_if_num,
2591
14
          { "Egress Interface Number", "mpls_echo.tlv.dd_map.egress.if.num",
2592
14
            FT_UINT32, BASE_DEC, NULL, 0x0,
2593
14
            "MPLS ECHO TLV Detailed DownStream Map Egress Interface Number", HFILL}
2594
14
        },
2595
14
        { &hf_mpls_echo_tlv_dd_map_subtlv_len,
2596
14
          { "Subtlv Length", "mpls_echo.tlv.dd_map.subtlv_len",
2597
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Subtlv Length", HFILL}
2598
14
        },
2599
14
        { &hf_mpls_echo_sub_tlv_multipath_type,
2600
14
          { "Multipath Type",  "mpls_echo.subtlv.dd_map.multipath_type",
2601
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Multipath Type", HFILL}
2602
14
        },
2603
14
        { &hf_mpls_echo_sub_tlv_multipath_length,
2604
14
          { "Multipath Length", "mpls_echo.subtlv.dd_map.multipath_length",
2605
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Multipath Length", HFILL}
2606
14
        },
2607
14
        { &hf_mpls_echo_sub_tlv_multipath_value,
2608
14
          { "Multipath Value", "mpls_echo.subtlv.dd_map.multipath_value",
2609
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Multipath Value", HFILL}
2610
14
        },
2611
14
        { &hf_mpls_echo_sub_tlv_resv,
2612
14
          { "Reserved", "mpls_echo.subtlv.dd_map.reserved",
2613
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Reserved Bits", HFILL}
2614
14
        },
2615
14
        { &hf_mpls_echo_sub_tlv_multipath_info,
2616
14
          { "Multipath Information", "mpls_echo.subtlv.dd_map.multipath_info",
2617
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "Detailed Downstream Mapping TLV Multipath Data Sub-TLV Value", HFILL}
2618
14
        },
2619
#if 0
2620
        { &hf_mpls_echo_tlv_ddstlv_map_mp_label,
2621
          { "Downstream Label", "mpls_echo.tlv.ddstlv_map.mp_label",
2622
            FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Detailed Downstream Map Downstream Label", HFILL}
2623
        },
2624
#endif
2625
14
        { &hf_mpls_echo_tlv_ddstlv_map_mp_proto,
2626
14
          { "Downstream Protocol", "mpls_echo.tlv.ddstlv_map.mp_proto",
2627
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_mp_proto), 0x0,
2628
14
            "MPLS ECHO TLV Detailed Downstream Map Downstream Protocol", HFILL}
2629
14
        },
2630
#if 0
2631
        { &hf_mpls_echo_tlv_ddstlv_map_mp_exp,
2632
          { "Downstream Experimental", "mpls_echo.tlv.ddstlv_map.mp_exp",
2633
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Downstream Experimental", HFILL}
2634
        },
2635
#endif
2636
#if 0
2637
        { &hf_mpls_echo_tlv_ddstlv_map_mp_bos,
2638
          { "Downstream BOS", "mpls_echo.tlv.ddstlv_map.mp_bos",
2639
            FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Downstream BOS", HFILL}
2640
        },
2641
#endif
2642
14
        { &hf_mpls_echo_sub_tlv_multipath_ip,
2643
14
          { "IP Address", "mpls_echo.tlv.ddstlv_map_mp.ip",
2644
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath IP Address", HFILL}
2645
14
        },
2646
14
        { &hf_mpls_echo_sub_tlv_mp_ip_low,
2647
14
          { "IP Address Low", "mpls_echo.tlv.ddstlv_map_mp.ip_low",
2648
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath Low IP Address", HFILL}
2649
14
        },
2650
14
        { &hf_mpls_echo_sub_tlv_mp_ip_high,
2651
14
          { "IP Address High", "mpls_echo.tlv.ddstlv_map_mp.ip_high",
2652
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath High IP Address", HFILL}
2653
14
        },
2654
14
        { &hf_mpls_echo_sub_tlv_mp_mask,
2655
14
          { "Mask", "mpls_echo.tlv.ddstlv_map_mp.mask",
2656
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Detailed Downstream Map Multipath Mask", HFILL}
2657
14
        },
2658
14
        { &hf_mpls_echo_sub_tlv_op_type,
2659
14
          { "Operation Type", "mpls_echo.tlv.ddstlv_map.op_type",
2660
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_op_types), 0x0,
2661
14
            "MPLS ECHO TLV Detailed Downstream Map Stack Change Operation Type", HFILL}
2662
14
        },
2663
14
        { &hf_mpls_echo_sub_tlv_addr_type,
2664
14
          { "Address Type", "mpls_echo.tlv.ddstlv_map.address_type",
2665
14
            FT_UINT8, BASE_DEC, VALS(mpls_echo_subtlv_addr_types), 0x0,
2666
14
            "MPLS ECHO TLV Detailed Downstream Map Stack Change Address Type", HFILL}
2667
14
        },
2668
14
        { &hf_mpls_echo_sub_tlv_fec_tlv_value,
2669
14
          { "FEC tlv Length", "mpls_echo.subtlv.dd_map.fec_tlv_type",
2670
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Map FEC TLV Length", HFILL}
2671
14
        },
2672
14
        { &hf_mpls_echo_sub_tlv_label,
2673
14
          { "Label", "mpls_echo.subtlv.label",
2674
14
            FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
2675
14
        },
2676
14
        { &hf_mpls_echo_sub_tlv_traffic_class,
2677
14
          { "Traffic Class", "mpls_echo.subtlv.traffic_class",
2678
14
            FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
2679
14
        },
2680
14
        { &hf_mpls_echo_sub_tlv_s_bit,
2681
14
          { "S bit", "mpls_echo.subtlv.s_bit",
2682
14
            FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
2683
14
        },
2684
14
        { &hf_mpls_echo_sub_tlv_res,
2685
14
          { "Reserved", "mpls_echo.subtlv.dd_map.reserved",
2686
14
            FT_UINT8, BASE_DEC, NULL, 0x0, "Detailed Downstream Map FEC Stack Change Reserved Bits", HFILL}
2687
14
        },
2688
14
        { &hf_mpls_echo_sub_tlv_remote_peer_unspecified,
2689
14
          { "Unspecified (Address Length = 0)", "mpls_echo.tlv.dd_map.unspecified",
2690
14
            FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
2691
14
        },
2692
14
        { &hf_mpls_echo_sub_tlv_remote_peer_ip,
2693
14
          { "Remote Peer IP Address", "mpls_echo.tlv.dd_map.remote_ip",
2694
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "Detailed Downstream Map FEC Stack Change Remote Peer IP Address", HFILL}
2695
14
        },
2696
14
        { &hf_mpls_echo_sub_tlv_remore_peer_ipv6,
2697
14
          { "Remote Peer IPv6 Address", "mpls_echo.tlv.dd_map.remote_ipv6",
2698
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "Detailed Downstream Map FEC Stack Change Remote Peer IPv6 Address", HFILL}
2699
14
        },
2700
14
        { &hf_mpls_echo_tlv_dd_map_type,
2701
14
          { "Sub-TLV Type",  "mpls_echo.subtlv.dd_map.type",
2702
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Type", HFILL}
2703
14
        },
2704
14
        { &hf_mpls_echo_tlv_dd_map_length,
2705
14
          { "Sub-TLV Length", "mpls_echo.subtlv.dd_map.length",
2706
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "Detailed Downstream Mapping TLV Length", HFILL}
2707
14
        },
2708
14
        { &hf_mpls_echo_tlv_dd_map_value,
2709
14
          { "Sub-TLV Value", "mpls_echo.subtlv.dd_map.value",
2710
14
            FT_BYTES, BASE_NONE, NULL, 0x0, "Detailed Downstream Mapping TLV Value", HFILL}
2711
14
        },
2712
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_p2mp_id,
2713
14
          { "P2MP ID", "mpls_echo.tlv.fec.rsvp_p2mp_ipv4_id",
2714
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP ID", HFILL}
2715
14
        },
2716
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz1,
2717
14
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_p2mp_ip_mbz1",
2718
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP MBZ", HFILL}
2719
14
        },
2720
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_tunnel_id,
2721
14
          { "Tunnel ID", "mpls_echo.tlv.fec.rsvp_p2mp_ip_tun_id",
2722
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP Tunnel ID", HFILL}
2723
14
        },
2724
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ext_tunnel_id,
2725
14
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_p2mp_ipv4_ext_tun_id",
2726
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv4 Extended Tunnel ID", HFILL}
2727
14
        },
2728
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv4_ipv4_sender,
2729
14
          { "IPv4 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_p2mp_ipv4_sender",
2730
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv4 Sender", HFILL}
2731
14
        },
2732
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_mbz2,
2733
14
          { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_p2mp_ip_mbz2",
2734
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP MBZ", HFILL}
2735
14
        },
2736
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ip_lsp_id,
2737
14
          { "LSP ID", "mpls_echo.tlv.fec.rsvp_p2mp_ip_lsp_id",
2738
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP LSP ID", HFILL}
2739
14
        },
2740
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_p2mp_id,
2741
14
          { "P2MP IPv6 Tunnel ID address", "mpls_echo.tlv.fec.rsvp_p2mp_ipv6_id",
2742
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv6 ID", HFILL}
2743
14
        },
2744
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ext_tunnel_id,
2745
14
          { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_p2mp_ipv6_ext_tun_id",
2746
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv6 Extended Tunnel ID", HFILL}
2747
14
        },
2748
14
        { &hf_mpls_echo_tlv_fec_rsvp_p2mp_ipv6_ipv6_sender,
2749
14
          { "P2MP IPv6 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_p2mp_ipv6_sender",
2750
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP P2MP IPv6 Sender", HFILL}
2751
14
        },
2752
14
        { &hf_mpls_echo_tlv_responder_indent_type,
2753
14
          { "Target Type", "mpls_echo.tlv.resp_id.type",
2754
14
            FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_responder_ident_sub_tlv_type), 0x0, "P2MP Responder ID TLV", HFILL}
2755
14
        },
2756
14
        { &hf_mpls_echo_tlv_responder_indent_len,
2757
14
          { "Length", "mpls_echo.tlv.resp_id.length",
2758
14
            FT_UINT16, BASE_DEC, NULL, 0x0, "P2MP Responder ID TLV LENGTH", HFILL}
2759
14
        },
2760
14
        { &hf_mpls_echo_tlv_responder_indent_ipv4,
2761
14
          { "Target IPv4 Address", "mpls_echo.tlv.resp_id.ipv4",
2762
14
            FT_IPv4, BASE_NONE, NULL, 0x0, "P2MP Responder ID TLV IPv4 Address", HFILL}
2763
14
        },
2764
14
        { &hf_mpls_echo_tlv_responder_indent_ipv6,
2765
14
          { "Target IPv6 Address", "mpls_echo.tlv.resp_id.ipv6",
2766
14
            FT_IPv6, BASE_NONE, NULL, 0x0, "P2MP Responder ID TLV IPv6 Address", HFILL}
2767
14
        },
2768
14
        { &hf_mpls_echo_tlv_echo_jitter,
2769
14
          { "Echo Jitter time", "mpls_echo.tlv.echo_jitter",
2770
14
            FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO Jitter time", HFILL}
2771
14
        },
2772
14
        { &hf_mpls_echo_tlv_bfd,
2773
14
          { "BFD Discriminator", "mpls_echo.bfd_discriminator",
2774
14
            FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO BFD Discriminator", HFILL}
2775
14
        },
2776
14
    };
2777
2778
14
    static int *ett[] = {
2779
14
        &ett_mpls_echo,
2780
14
        &ett_mpls_echo_gflags,
2781
14
        &ett_mpls_echo_tlv,
2782
14
        &ett_mpls_echo_tlv_fec,
2783
14
        &ett_mpls_echo_tlv_ds_map,
2784
14
        &ett_mpls_echo_tlv_ilso,
2785
14
        &ett_mpls_echo_tlv_dd_map,
2786
14
        &ett_mpls_echo_tlv_ddstlv_map
2787
14
    };
2788
2789
14
    static ei_register_info ei[] = {
2790
14
        { &ei_mpls_echo_tlv_fec_len, { "mpls_echo.tlv.fec.len.invalid", PI_MALFORMED, PI_ERROR, "Invalid FEC TLV length", EXPFILL }},
2791
14
        { &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 }},
2792
14
        { &ei_mpls_echo_tlv_len, { "mpls_echo.tlv.len.invalid", PI_MALFORMED, PI_ERROR, "Invalid TLV length", EXPFILL }},
2793
14
        { &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 }},
2794
14
        { &ei_mpls_echo_unknown_address_type, { "mpls_echo.address_type.unknown", PI_UNDECODED, PI_WARN, "Unknown Address Type", EXPFILL }},
2795
14
        { &ei_mpls_echo_incorrect_address_type, { "mpls_echo.address_type.incorrect", PI_PROTOCOL, PI_WARN, "Incorrect address type for TLV?", EXPFILL }},
2796
14
        { &ei_mpls_echo_malformed, { "mpls_echo.malformed", PI_MALFORMED, PI_ERROR, "Malformed MPLS message", EXPFILL }},
2797
14
    };
2798
2799
14
    expert_module_t* expert_mpls_echo;
2800
2801
14
    proto_mpls_echo = proto_register_protocol("Multiprotocol Label Switching Echo", "MPLS Echo", "mpls-echo");
2802
2803
14
    proto_register_field_array(proto_mpls_echo, hf, array_length(hf));
2804
14
    proto_register_subtree_array(ett, array_length(ett));
2805
14
    expert_mpls_echo = expert_register_protocol(proto_mpls_echo);
2806
14
    expert_register_field_array(expert_mpls_echo, ei, array_length(ei));
2807
2808
14
    mpls_echo_handle = register_dissector("mpls-echo", dissect_mpls_echo, proto_mpls_echo);
2809
14
}
2810
2811
2812
void
2813
proto_reg_handoff_mpls_echo(void)
2814
14
{
2815
14
    dissector_add_uint_with_preference("udp.port", UDP_PORT_MPLS_ECHO, mpls_echo_handle);
2816
2817
14
    dissector_add_uint("pwach.channel_type", PW_ACH_TYPE_ONDEMAND_CV, mpls_echo_handle);
2818
14
}
2819
2820
/*
2821
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
2822
 *
2823
 * Local variables:
2824
 * c-basic-offset: 4
2825
 * tab-width: 8
2826
 * indent-tabs-mode: nil
2827
 * End:
2828
 *
2829
 * vi: set shiftwidth=4 tabstop=8 expandtab:
2830
 * :indentSize=4:tabSize=8:noTabs=true:
2831
 */