1 /* packet-lmp.c
2 * Routines for LMP packet disassembly
3 *
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
5 *
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13 /*
14 * Code for dissecting the Link Management Protocol (LMP). The latest LMP
15 * specification is in draft-ieft-ccamp-lmp-10.txt. This version also includes
16 * support for dissecting LMP service discovery extensions defined in the
17 * UNI 1.0 specification.
18 *
19 * Support for LMP service discovery extensions added by Manu Pathak
20 * (mapathak@cisco.com), June 2005.
21 *
22 * Support for RFC4207 (SONET/SDH encoding for LMP test messages) added
23 * by Roberto Morro (roberto.morro [AT] tilab.com), August 2007
24 *
25 * Support for (provisional) oif-p0040.010.006 added by Roberto Morro,
26 * August 2007
27 */
28
29 #include "config.h"
30
31 #include <epan/packet.h>
32 #include <epan/exceptions.h>
33 #include <epan/prefs.h>
34 #include <epan/in_cksum.h>
35 #include <epan/etypes.h>
36 #include <epan/ipproto.h>
37 #include <epan/expert.h>
38 #include <epan/to_str.h>
39
40 #include "packet-ip.h"
41 #include "packet-rsvp.h"
42
43 void proto_register_lmp(void);
44 void proto_reg_handoff_lmp(void);
45
46 static int proto_lmp = -1;
47
48 #define UDP_PORT_LMP_DEFAULT 701
49
50 static gboolean lmp_checksum_config = FALSE;
51
52 static dissector_handle_t lmp_handle;
53
54 /*----------------------------------------------------------------------
55 * LMP message types
56 */
57 typedef enum {
58 LMP_MSG_CONFIG=1,
59 LMP_MSG_CONFIG_ACK,
60 LMP_MSG_CONFIG_NACK,
61 LMP_MSG_HELLO,
62 LMP_MSG_BEGIN_VERIFY,
63 LMP_MSG_BEGIN_VERIFY_ACK,
64 LMP_MSG_BEGIN_VERIFY_NACK,
65 LMP_MSG_END_VERIFY,
66 LMP_MSG_END_VERIFY_ACK,
67 LMP_MSG_TEST,
68 LMP_MSG_TEST_STATUS_SUCCESS,
69 LMP_MSG_TEST_STATUS_FAILURE,
70 LMP_MSG_TEST_STATUS_ACK,
71 LMP_MSG_LINK_SUMMARY,
72 LMP_MSG_LINK_SUMMARY_ACK,
73 LMP_MSG_LINK_SUMMARY_NACK,
74 LMP_MSG_CHANNEL_STATUS,
75 LMP_MSG_CHANNEL_STATUS_ACK,
76 LMP_MSG_CHANNEL_STATUS_REQ,
77 LMP_MSG_CHANNEL_STATUS_RESP,
78 LMP_MSG_TRACE_MONITOR,
79 LMP_MSG_TRACE_MONITOR_ACK,
80 LMP_MSG_TRACE_MONITOR_NACK,
81 LMP_MSG_TRACE_MISMATCH,
82 LMP_MSG_TRACE_MISMATCH_ACK,
83 LMP_MSG_TRACE_REQUEST,
84 LMP_MSG_TRACE_REPORT,
85 LMP_MSG_TRACE_REQUEST_NACK,
86 LMP_MSG_INSERT_TRACE,
87 LMP_MSG_INSERT_TRACE_ACK,
88 LMP_MSG_INSERT_TRACE_NACK,
89 LMP_MSG_SERVICE_CONFIG=50,
90 LMP_MSG_SERVICE_CONFIG_ACK,
91 LMP_MSG_SERVICE_CONFIG_NACK,
92 LMP_MSG_DISCOVERY_RESP=241,
93 LMP_MSG_DISCOVERY_RESP_ACK,
94 LMP_MSG_DISCOVERY_RESP_NACK
95 } lmp_message_types;
96
97 static const value_string message_type_vals[] = {
98 {LMP_MSG_CONFIG, "Config Message. "},
99 {LMP_MSG_CONFIG_ACK, "ConfigAck Message. "},
100 {LMP_MSG_CONFIG_NACK, "ConfigNack Message. "},
101 {LMP_MSG_HELLO, "Hello Message. "},
102 {LMP_MSG_BEGIN_VERIFY, "BeginVerify Message. "},
103 {LMP_MSG_BEGIN_VERIFY_ACK, "BeginVerifyAck Message. "},
104 {LMP_MSG_BEGIN_VERIFY_NACK, "BeginVerifyNack Message. "},
105 {LMP_MSG_END_VERIFY, "EndVerify Message. "},
106 {LMP_MSG_END_VERIFY_ACK, "EndVerifyAck Message. "},
107 {LMP_MSG_TEST, "Test Message. "},
108 {LMP_MSG_TEST_STATUS_SUCCESS, "TestStatusSuccess Message. "},
109 {LMP_MSG_TEST_STATUS_FAILURE, "TestStatusFailure Message. "},
110 {LMP_MSG_TEST_STATUS_ACK, "TestStatusAck Message. "},
111 {LMP_MSG_LINK_SUMMARY, "LinkSummary Message. "},
112 {LMP_MSG_LINK_SUMMARY_ACK, "LinkSummaryAck Message. "},
113 {LMP_MSG_LINK_SUMMARY_NACK, "LinkSummaryNack Message. "},
114 {LMP_MSG_CHANNEL_STATUS, "ChannelStatus Message. "},
115 {LMP_MSG_CHANNEL_STATUS_ACK, "ChannelStatusAck Message. "},
116 {LMP_MSG_CHANNEL_STATUS_REQ, "ChannelStatusRequest Message. "},
117 {LMP_MSG_CHANNEL_STATUS_RESP, "ChannelStatusResponse Message. "},
118 {LMP_MSG_TRACE_MONITOR, "TraceMonitor Message. "},
119 {LMP_MSG_TRACE_MONITOR_ACK, "TraceMonitorAck Message. "},
120 {LMP_MSG_TRACE_MONITOR_NACK, "TraceMonitorNack Message. "},
121 {LMP_MSG_TRACE_MISMATCH, "TraceMismatch Message. "},
122 {LMP_MSG_TRACE_MISMATCH_ACK, "TraceMismatchAck Message. "},
123 {LMP_MSG_TRACE_REQUEST, "TraceRequest Message. "},
124 {LMP_MSG_TRACE_REPORT, "TraceReport Message. "},
125 {LMP_MSG_TRACE_REQUEST_NACK, "TraceReportNack Message. "},
126 {LMP_MSG_INSERT_TRACE, "InsertTrace Message. "},
127 {LMP_MSG_INSERT_TRACE_ACK, "InsertTraceAck Message. "},
128 {LMP_MSG_INSERT_TRACE_NACK, "InsertTraceNack Message. "},
129 {LMP_MSG_SERVICE_CONFIG, "ServiceConfig Message. "},
130 {LMP_MSG_SERVICE_CONFIG_ACK, "ServiceConfigAck Message. "},
131 {LMP_MSG_SERVICE_CONFIG_NACK, "ServiceConfigNack Message. "},
132 {LMP_MSG_DISCOVERY_RESP, "DiscoveryResponse Message. "},
133 {LMP_MSG_DISCOVERY_RESP_ACK, "DiscoveryResponseAck Message. "},
134 {LMP_MSG_DISCOVERY_RESP_NACK, "DiscoveryResponseNack Message. "},
135 {0, NULL}
136 };
137
138 /*------------------------------------------------------------------------------
139 * LMP object classes
140 */
141 #define LMP_CLASS_NULL 0
142
143 #define LMP_CLASS_CCID 1
144 #define LMP_CLASS_NODE_ID 2
145 #define LMP_CLASS_LINK_ID 3
146 #define LMP_CLASS_INTERFACE_ID 4
147 #define LMP_CLASS_MESSAGE_ID 5
148 #define LMP_CLASS_CONFIG 6
149 #define LMP_CLASS_HELLO 7
150 #define LMP_CLASS_BEGIN_VERIFY 8
151 #define LMP_CLASS_BEGIN_VERIFY_ACK 9
152 #define LMP_CLASS_VERIFY_ID 10
153 #define LMP_CLASS_TE_LINK 11
154 #define LMP_CLASS_DATA_LINK 12
155 #define LMP_CLASS_CHANNEL_STATUS 13
156 #define LMP_CLASS_CHANNEL_STATUS_REQUEST 14
157 #define LMP_LAST_CONTIGUOUS_CLASS LMP_CLASS_CHANNEL_STATUS_REQUEST
158 #define LMP_CLASS_ERROR 20
159 #define LMP_CLASS_TRACE 21
160 #define LMP_CLASS_TRACE_REQ 22
161 #define LMP_CLASS_SERVICE_CONFIG 51
162 #define LMP_CLASS_DA_DCN_ADDRESS 248
163 #define LMP_CLASS_LOCAL_LAD_INFO 249
164 #define LMP_CLASS_MAX 250
165
166 static const value_string lmp_class_vals[] = {
167
168 {LMP_CLASS_CCID, "CCID"},
169 {LMP_CLASS_NODE_ID, "NODE_ID"},
170 {LMP_CLASS_LINK_ID, "LINK_ID"},
171 {LMP_CLASS_INTERFACE_ID, "INTERFACE_ID"},
172 {LMP_CLASS_MESSAGE_ID, "MESSAGE_ID"},
173 {LMP_CLASS_CONFIG, "CONFIG"},
174 {LMP_CLASS_HELLO, "HELLO"},
175 {LMP_CLASS_BEGIN_VERIFY, "BEGIN_VERIFY"},
176 {LMP_CLASS_BEGIN_VERIFY_ACK, "BEGIN_VERIFY_ACK"},
177 {LMP_CLASS_VERIFY_ID, "VERIFY_ID"},
178 {LMP_CLASS_TE_LINK, "TE_LINK"},
179 {LMP_CLASS_DATA_LINK, "DATA_LINK"},
180 {LMP_CLASS_CHANNEL_STATUS, "CHANNEL_STATUS"},
181 {LMP_CLASS_CHANNEL_STATUS_REQUEST, "CHANNEL_STATUS_REQUEST"},
182 {LMP_CLASS_ERROR, "ERROR"},
183 {LMP_CLASS_TRACE, "TRACE"},
184 {LMP_CLASS_TRACE_REQ, "TRACE_REQ"},
185 {LMP_CLASS_SERVICE_CONFIG, "SERVICE_CONFIG"},
186 {LMP_CLASS_DA_DCN_ADDRESS, "DA_DCN_ADDRESS"},
187 {LMP_CLASS_LOCAL_LAD_INFO, "LOCAL_LAD_INFO"},
188 {0, NULL}
189 };
190
191
192 /*------------------------------------------------------------------------------
193 * Other constants & stuff
194 */
195
196 /* Channel Status */
197 static const value_string channel_status_str[] = {
198 {1, "Signal Okay (OK)"},
199 {2, "Signal Degraded (SD)"},
200 {3, "Signal Failed (SF)"},
201 {0, NULL}
202 };
203 static const value_string channel_status_short_str[] = {
204 {1, "OK"},
205 {2, "SD"},
206 {3, "SF"},
207 {0, NULL}
208 };
209
210 /* Service Discovery Client ServiceConfig object (defined in UNI 1.0) */
211
212 /* Client Port-Level Service Attribute Object */
213
214 /* Link Type */
215 static const value_string service_attribute_link_type_str[] = {
216 {5, "SDH ITU-T G.707"},
217 {6, "SONET ANSI T1.105"},
218 {0, NULL}
219 };
220
221 /* Signal Types for SDH */
222 static const value_string service_attribute_signal_types_sdh_str[] = {
223 {5, "VC-3"},
224 {6, "VC-4"},
225 {7, "STM-0"},
226 {8, "STM-1"},
227 {9, "STM-4"},
228 {10, "STM-16"},
229 {11, "STM-64"},
230 {12, "STM-256"},
231 {0, NULL}
232 };
233
234 /* Signal Types for SONET */
235 static const value_string service_attribute_signal_types_sonet_str[] = {
236 {5, "STS-1 SPE"},
237 {6, "STS-3c SPE"},
238 {7, "STS-1"},
239 {8, "STS-3"},
240 {9, "STS-12"},
241 {10, "STS-48"},
242 {11, "STS-192"},
243 {12, "STS-768"},
244 {0, NULL}
245 };
246
247 /* Trace type */
248 static const value_string lmp_trace_type_str[] = {
249 { 1, "SONET Section Trace (J0 Byte)"},
250 { 2, "SONET Path Trace (J1 Byte)"},
251 { 3, "SONET Path Trace (J2 Byte)"},
252 { 4, "SDH Section Trace (J0 Byte)"},
253 { 5, "SDH Path Trace (J1 Byte)"},
254 { 6, "SDH Path Trace (J2 Byte)"},
255 { 0, NULL}
256 };
257
258 /*
259 * These values are used by the code that handles the Service Discovery
260 * Client Port-Level Service Attributes Object.
261 */
262 #define LMP_CLASS_SERVICE_CONFIG_CPSA_SIGNAL_TYPES_SDH 5
263 #define LMP_CLASS_SERVICE_CONFIG_CPSA_SIGNAL_TYPES_SONET 6
264
265 /*------------------------------------------------------------------------------
266 * LMP Filter values
267 */
268
269 enum hf_lmp_filter_keys {
270
271 /* Message types ---------------- */
272 LMPF_MSG,
273
274 LMPF_MSG_CONFIG,
275 LMPF_MSG_CONFIG_ACK,
276 LMPF_MSG_CONFIG_NACK,
277 LMPF_MSG_HELLO,
278 LMPF_MSG_BEGIN_VERIFY,
279 LMPF_MSG_BEGIN_VERIFY_ACK,
280 LMPF_MSG_BEGIN_VERIFY_NACK,
281 LMPF_MSG_END_VERIFY,
282 LMPF_MSG_END_VERIFY_ACK,
283 LMPF_MSG_TEST,
284 LMPF_MSG_TEST_STATUS_SUCCESS,
285 LMPF_MSG_TEST_STATUS_FAILURE,
286 LMPF_MSG_TEST_STATUS_ACK,
287 LMPF_MSG_LINK_SUMMARY,
288 LMPF_MSG_LINK_SUMMARY_ACK,
289 LMPF_MSG_LINK_SUMMARY_NACK,
290 LMPF_MSG_CHANNEL_STATUS,
291 LMPF_MSG_CHANNEL_STATUS_ACK,
292 LMPF_MSG_CHANNEL_STATUS_REQ,
293 LMPF_MSG_CHANNEL_STATUS_RESP,
294 LMPF_MSG_TRACE_MONITOR,
295 LMPF_MSG_TRACE_MONITOR_ACK,
296 LMPF_MSG_TRACE_MONITOR_NACK,
297 LMPF_MSG_TRACE_MISMATCH,
298 LMPF_MSG_TRACE_MISMATCH_ACK,
299 LMPF_MSG_TRACE_REQUEST,
300 LMPF_MSG_TRACE_REPORT,
301 LMPF_MSG_TRACE_REQUEST_NACK,
302 LMPF_MSG_INSERT_TRACE,
303 LMPF_MSG_INSERT_TRACE_ACK,
304 LMPF_MSG_INSERT_TRACE_NACK,
305 LMPF_MSG_SERVICE_CONFIG,
306 LMPF_MSG_SERVICE_CONFIG_ACK,
307 LMPF_MSG_SERVICE_CONFIG_NACK,
308 LMPF_MSG_DISCOVERY_RESP,
309 LMPF_MSG_DISCOVERY_RESP_ACK,
310 LMPF_MSG_DISCOVERY_RESP_NACK,
311
312 LMPF_MSG_MAX,
313
314 /* LMP Message Header Fields ------------------ */
315 LMPF_HDR_FLAGS,
316 LMPF_HDR_FLAGS_CC_DOWN,
317 LMPF_HDR_FLAGS_REBOOT,
318
319 /* LMP Object Class Filters -------------------- */
320 LMPF_OBJECT,
321
322 LMPF_CLASS_CCID,
323 LMPF_CLASS_NODE_ID,
324 LMPF_CLASS_LINK_ID,
325 LMPF_CLASS_INTERFACE_ID,
326 LMPF_CLASS_MESSAGE_ID,
327 LMPF_CLASS_CONFIG,
328 LMPF_CLASS_HELLO,
329 LMPF_CLASS_BEGIN_VERIFY,
330 LMPF_CLASS_BEGIN_VERIFY_ACK,
331 LMPF_CLASS_VERIFY_ID,
332 LMPF_CLASS_TE_LINK,
333 LMPF_CLASS_DATA_LINK,
334 LMPF_CLASS_CHANNEL_STATUS,
335 LMPF_CLASS_CHANNEL_STATUS_REQUEST,
336 LMPF_CLASS_ERROR,
337 LMPF_CLASS_TRACE,
338 LMPF_CLASS_TRACE_REQ,
339 LMPF_CLASS_SERVICE_CONFIG,
340 LMPF_CLASS_DA_DCN_ADDRESS,
341 LMPF_CLASS_LOCAL_LAD_INFO,
342
343 LMPF_VAL_CTYPE,
344 LMPF_VAL_LOCAL_CCID,
345 LMPF_VAL_REMOTE_CCID,
346 LMPF_VAL_LOCAL_NODE_ID,
347 LMPF_VAL_REMOTE_NODE_ID,
348 LMPF_VAL_LOCAL_LINK_ID_IPV4,
349 LMPF_VAL_LOCAL_LINK_ID_IPV6,
350 LMPF_VAL_LOCAL_LINK_ID_UNNUM,
351 LMPF_VAL_REMOTE_LINK_ID_IPV4,
352 LMPF_VAL_REMOTE_LINK_ID_IPV6,
353 LMPF_VAL_REMOTE_LINK_ID_UNNUM,
354 LMPF_VAL_LOCAL_INTERFACE_ID_IPV4,
355 LMPF_VAL_LOCAL_INTERFACE_ID_IPV6,
356 LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM,
357 LMPF_VAL_REMOTE_INTERFACE_ID_IPV4,
358 LMPF_VAL_REMOTE_INTERFACE_ID_IPV6,
359 LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM,
360 LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_IPV4,
361 LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_IPV6,
362 LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_UNNUM,
363 LMPF_VAL_MESSAGE_ID,
364 LMPF_VAL_MESSAGE_ID_ACK,
365 LMPF_VAL_CONFIG_HELLO,
366 LMPF_VAL_CONFIG_HELLO_DEAD,
367 LMPF_VAL_HELLO_TXSEQ,
368 LMPF_VAL_HELLO_RXSEQ,
369
370 LMPF_VAL_BEGIN_VERIFY_FLAGS,
371 LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS,
372 LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE,
373 LMPF_VAL_BEGIN_VERIFY_INTERVAL,
374 LMPF_VAL_BEGIN_VERIFY_ENCTYPE,
375 LMPF_VAL_BEGIN_VERIFY_TRANSPORT,
376 LMPF_VAL_BEGIN_VERIFY_TRANSMISSION_RATE,
377 LMPF_VAL_BEGIN_VERIFY_WAVELENGTH,
378 LMPF_VAL_VERIFY_ID,
379
380 LMPF_VAL_TE_LINK_FLAGS,
381 LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT,
382 LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY,
383 LMPF_VAL_TE_LINK_LOCAL_IPV4,
384 LMPF_VAL_TE_LINK_LOCAL_IPV6,
385 LMPF_VAL_TE_LINK_LOCAL_UNNUM,
386 LMPF_VAL_TE_LINK_REMOTE_IPV4,
387 LMPF_VAL_TE_LINK_REMOTE_IPV6,
388 LMPF_VAL_TE_LINK_REMOTE_UNNUM,
389
390 LMPF_VAL_DATA_LINK_FLAGS,
391 LMPF_VAL_DATA_LINK_FLAGS_PORT,
392 LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED,
393 LMPF_VAL_DATA_LINK_LOCAL_IPV4,
394 LMPF_VAL_DATA_LINK_LOCAL_IPV6,
395 LMPF_VAL_DATA_LINK_LOCAL_UNNUM,
396 LMPF_VAL_DATA_LINK_REMOTE_IPV4,
397 LMPF_VAL_DATA_LINK_REMOTE_IPV6,
398 LMPF_VAL_DATA_LINK_REMOTE_UNNUM,
399 LMPF_VAL_DATA_LINK_SUBOBJ,
400 LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE,
401 LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING,
402
403 LMPF_VAL_ERROR,
404 LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK,
405 LMPF_VAL_ERROR_VERIFY_UNWILLING,
406 LMPF_VAL_ERROR_VERIFY_TRANSPORT,
407 LMPF_VAL_ERROR_VERIFY_TE_LINK_ID,
408 LMPF_VAL_ERROR_VERIFY_UNKNOWN_CTYPE,
409 LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS,
410 LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE,
411 LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK,
412 LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK,
413 LMPF_VAL_ERROR_SUMMARY_UNKNOWN_TEL_CTYPE,
414 LMPF_VAL_ERROR_SUMMARY_UNKNOWN_DL_CTYPE,
415 LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID,
416 LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS,
417 LMPF_VAL_ERROR_CONFIG_RENEGOTIATE,
418 LMPF_VAL_ERROR_CONFIG_BAD_CCID,
419 LMPF_VAL_ERROR_TRACE_UNSUPPORTED_TYPE,
420 LMPF_VAL_ERROR_TRACE_INVALID_MSG,
421 LMPF_VAL_ERROR_TRACE_UNKNOWN_CTYPE,
422 LMPF_VAL_ERROR_LAD_AREA_ID_MISMATCH,
423 LMPF_VAL_ERROR_LAD_TCP_ID_MISMATCH,
424 LMPF_VAL_ERROR_LAD_DA_DCN_MISMATCH,
425 LMPF_VAL_ERROR_LAD_CAPABILITY_MISMATCH,
426 LMPF_VAL_ERROR_LAD_UNKNOWN_CTYPE,
427
428 LMPF_VAL_TRACE_LOCAL_TYPE,
429 LMPF_VAL_TRACE_LOCAL_LEN,
430 LMPF_VAL_TRACE_LOCAL_MSG,
431 LMPF_VAL_TRACE_REMOTE_TYPE,
432 LMPF_VAL_TRACE_REMOTE_LEN,
433 LMPF_VAL_TRACE_REMOTE_MSG,
434
435 LMPF_VAL_TRACE_REQ_TYPE,
436
437 LMPF_VAL_SERVICE_CONFIG_SP_FLAGS,
438 LMPF_VAL_SERVICE_CONFIG_SP_FLAGS_RSVP,
439 LMPF_VAL_SERVICE_CONFIG_SP_FLAGS_LDP,
440 LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS,
441 LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_PATH_OVERHEAD,
442 LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_LINE_OVERHEAD,
443 LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_SECTION_OVERHEAD,
444 LMPF_VAL_SERVICE_CONFIG_CPSA_CCT_FLAGS,
445 LMPF_VAL_SERVICE_CONFIG_CPSA_CCT_FLAGS_CC_SUPPORTED,
446 LMPF_VAL_SERVICE_CONFIG_CPSA_MIN_NCC,
447 LMPF_VAL_SERVICE_CONFIG_CPSA_MAX_NCC,
448 LMPF_VAL_SERVICE_CONFIG_CPSA_MIN_NVC,
449 LMPF_VAL_SERVICE_CONFIG_CPSA_MAX_NVC,
450 LMPF_VAL_SERVICE_CONFIG_CPSA_INTERFACE_ID,
451 LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS,
452 LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS_SOH,
453 LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS_LOH,
454 LMPF_VAL_SERVICE_CONFIG_NSA_TCM_FLAGS,
455 LMPF_VAL_SERVICE_CONFIG_NSA_TCM_FLAGS_TCM_SUPPORTED,
456 LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS,
457 LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_NODE,
458 LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_LINK,
459 LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_SRLG,
460
461 LMPF_VAL_LOCAL_DA_DCN_ADDR,
462 LMPF_VAL_REMOTE_DA_DCN_ADDR,
463
464 LMPF_VAL_LOCAL_LAD_INFO_NODE_ID,
465 LMPF_VAL_LOCAL_LAD_INFO_AREA_ID,
466 LMPF_VAL_LOCAL_LAD_INFO_TE_LINK_ID,
467 LMPF_VAL_LOCAL_LAD_INFO_COMPONENT_ID,
468 LMPF_VAL_LOCAL_LAD_INFO_SC_PC_ID,
469 LMPF_VAL_LOCAL_LAD_INFO_SC_PC_ADDR,
470
471 LMPF_VAL_LAD_INFO_SUBOBJ,
472 LMPF_VAL_LAD_INFO_SUBOBJ_PRI_AREA_ID,
473 LMPF_VAL_LAD_INFO_SUBOBJ_PRI_RC_PC_ID,
474 LMPF_VAL_LAD_INFO_SUBOBJ_PRI_RC_PC_ADDR,
475 LMPF_VAL_LAD_INFO_SUBOBJ_SEC_AREA_ID,
476 LMPF_VAL_LAD_INFO_SUBOBJ_SEC_RC_PC_ID,
477 LMPF_VAL_LAD_INFO_SUBOBJ_SEC_RC_PC_ADDR,
478 LMPF_VAL_LAD_INFO_SUBOBJ_SWITCHING_TYPE,
479 LMPF_VAL_LAD_INFO_SUBOBJ_LSP_ENCODING,
480
481 LMPF_CHECKSUM,
482 LMPF_CHECKSUM_STATUS,
483
484 LMPF_MAX
485 };
486
487 static int hf_lmp_filter[LMPF_MAX];
488 static int hf_lmp_data;
489
490 /* Generated from convert_proto_tree_add_text.pl */
491 static int hf_lmp_maximum_reservable_bandwidth = -1;
492 static int hf_lmp_verify_transport_mechanism = -1;
493 static int hf_lmp_interface_id_ipv6 = -1;
494 static int hf_lmp_minimum_reservable_bandwidth = -1;
495 static int hf_lmp_object_length = -1;
496 static int hf_lmp_interface_id_unnumbered = -1;
497 static int hf_lmp_signal_types_sdh = -1;
498 static int hf_lmp_link_type = -1;
499 static int hf_lmp_number_of_data_links = -1;
500 static int hf_lmp_version = -1;
501 static int hf_lmp_interface_id_ipv4 = -1;
502 static int hf_lmp_header_length = -1;
503 static int hf_lmp_uni_version = -1;
504 static int hf_lmp_subobject_type = -1;
505 static int hf_lmp_object_class = -1;
506 static int hf_lmp_negotiable = -1;
507 static int hf_lmp_signal_types_sonet = -1;
508 static int hf_lmp_header_flags = -1;
509 static int hf_lmp_verify_interval = -1;
510 static int hf_lmp_wavelength = -1;
511 static int hf_lmp_channel_status = -1;
512 static int hf_lmp_verifydeadinterval = -1;
513 static int hf_lmp_data_link_remote_id_ipv6 = -1;
514 static int hf_lmp_link = -1;
515 static int hf_lmp_subobject_length = -1;
516 static int hf_lmp_transmission_rate = -1;
517 static int hf_lmp_verify_transport_response = -1;
518 static int hf_lmp_data_link_local_id_ipv6 = -1;
519 static int hf_lmp_free_timeslots = -1;
520
521 static expert_field ei_lmp_checksum_incorrect = EI_INIT;
522 static expert_field ei_lmp_invalid_msg_type = EI_INIT;
523 static expert_field ei_lmp_invalid_class = EI_INIT;
524 static expert_field ei_lmp_trace_len = EI_INIT;
525 static expert_field ei_lmp_obj_len = EI_INIT;
526
527 static int
lmp_valid_class(int lmp_class)528 lmp_valid_class(int lmp_class)
529 {
530 /* Contiguous classes */
531 if (lmp_class > LMP_CLASS_NULL && lmp_class <= LMP_LAST_CONTIGUOUS_CLASS)
532 return 1;
533
534 /* Noncontiguous classes */
535 if (lmp_class == LMP_CLASS_ERROR ||
536 lmp_class == LMP_CLASS_TRACE ||
537 lmp_class == LMP_CLASS_TRACE_REQ ||
538 lmp_class == LMP_CLASS_SERVICE_CONFIG ||
539 lmp_class == LMP_CLASS_DA_DCN_ADDRESS ||
540 lmp_class == LMP_CLASS_LOCAL_LAD_INFO)
541 return 1;
542
543 return 0;
544 }
545
546 static int
lmp_msg_to_filter_num(int msg_type)547 lmp_msg_to_filter_num(int msg_type)
548 {
549 if (msg_type <= LMP_MSG_INSERT_TRACE_NACK)
550 return LMPF_MSG + msg_type;
551
552 switch (msg_type) {
553 case LMP_MSG_SERVICE_CONFIG:
554 return LMPF_MSG_SERVICE_CONFIG;
555
556 case LMP_MSG_SERVICE_CONFIG_ACK:
557 return LMPF_MSG_SERVICE_CONFIG_ACK;
558
559 case LMP_MSG_SERVICE_CONFIG_NACK:
560 return LMPF_MSG_SERVICE_CONFIG_NACK;
561
562 case LMP_MSG_DISCOVERY_RESP:
563 return LMPF_MSG_DISCOVERY_RESP;
564
565 case LMP_MSG_DISCOVERY_RESP_ACK:
566 return LMPF_MSG_DISCOVERY_RESP_ACK;
567
568 case LMP_MSG_DISCOVERY_RESP_NACK:
569 return LMPF_MSG_DISCOVERY_RESP_NACK;
570
571 default:
572 return -1;
573 }
574 }
575
576
577 static int
lmp_class_to_filter_num(int lmp_class)578 lmp_class_to_filter_num(int lmp_class)
579 {
580
581 /*
582 * The contiguous values can all be handled in the same way. The ERROR and
583 * Service Config objects, whose C-Type values are not contiguously assigned,
584 * must be handled separately.
585 */
586 switch (lmp_class) {
587
588 case LMP_CLASS_CCID:
589 case LMP_CLASS_NODE_ID:
590 case LMP_CLASS_LINK_ID:
591 case LMP_CLASS_INTERFACE_ID:
592 case LMP_CLASS_MESSAGE_ID:
593 case LMP_CLASS_CONFIG:
594 case LMP_CLASS_HELLO:
595 case LMP_CLASS_BEGIN_VERIFY:
596 case LMP_CLASS_BEGIN_VERIFY_ACK:
597 case LMP_CLASS_VERIFY_ID:
598 case LMP_CLASS_TE_LINK:
599 case LMP_CLASS_DATA_LINK:
600 case LMP_CLASS_CHANNEL_STATUS:
601 case LMP_CLASS_CHANNEL_STATUS_REQUEST:
602 return LMPF_OBJECT + lmp_class;
603
604 case LMP_CLASS_ERROR:
605 return LMPF_CLASS_ERROR;
606
607 case LMP_CLASS_TRACE:
608 return LMPF_CLASS_TRACE;
609
610 case LMP_CLASS_TRACE_REQ:
611 return LMPF_CLASS_TRACE_REQ;
612
613 case LMP_CLASS_SERVICE_CONFIG:
614 return LMPF_CLASS_SERVICE_CONFIG;
615
616 case LMP_CLASS_DA_DCN_ADDRESS:
617 return LMPF_CLASS_DA_DCN_ADDRESS;
618
619 case LMP_CLASS_LOCAL_LAD_INFO:
620 return LMPF_CLASS_LOCAL_LAD_INFO;
621
622 default:
623 return -1;
624 }
625 }
626
627
628 /*------------------------------------------------------------------------------
629 * LMP Subtrees
630 *
631 * We have two types of subtrees - a statically defined, constant set and
632 * a class set - one for each class. The static ones are before all the class ones
633 */
634 enum {
635 LMP_TREE_MAIN,
636 LMP_TREE_HEADER,
637 LMP_TREE_HEADER_FLAGS,
638 LMP_TREE_OBJECT_HEADER,
639 LMP_TREE_ERROR_FLAGS,
640 LMP_TREE_BEGIN_VERIFY_FLAGS,
641 LMP_TREE_BEGIN_VERIFY_TRANSPORT_FLAGS,
642 LMP_TREE_TE_LINK_FLAGS,
643 LMP_TREE_DATA_LINK_FLAGS,
644 LMP_TREE_DATA_LINK_SUBOBJ,
645 LMP_TREE_CHANNEL_STATUS_ID,
646 LMP_TREE_SERVICE_CONFIG_SP_FLAGS,
647 LMP_TREE_SERVICE_CONFIG_CPSA_TP_FLAGS,
648 LMP_TREE_SERVICE_CONFIG_CPSA_CCT_FLAGS,
649 LMP_TREE_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS,
650 LMP_TREE_SERVICE_CONFIG_NSA_TCM_FLAGS,
651 LMP_TREE_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS,
652 LMP_TREE_LAD_INFO_SUBOBJ,
653
654 LMP_TREE_CLASS_START
655 };
656
657 #define NUM_LMP_SUBTREES (LMP_TREE_CLASS_START + LMP_CLASS_MAX)
658
659 static gint lmp_subtree[NUM_LMP_SUBTREES];
660
lmp_class_to_subtree(int lmp_class)661 static int lmp_class_to_subtree(int lmp_class)
662 {
663 if (lmp_valid_class(lmp_class)) {
664 if (lmp_class == LMP_CLASS_SERVICE_CONFIG) {
665 return lmp_subtree[LMP_TREE_CLASS_START + LMP_CLASS_SERVICE_CONFIG];
666 }
667 if (lmp_class == LMP_CLASS_DA_DCN_ADDRESS) {
668 return lmp_subtree[LMP_TREE_CLASS_START + LMP_CLASS_DA_DCN_ADDRESS];
669 }
670 if (lmp_class == LMP_CLASS_LOCAL_LAD_INFO) {
671 return lmp_subtree[LMP_TREE_CLASS_START + LMP_CLASS_LOCAL_LAD_INFO];
672 }
673
674 return lmp_subtree[LMP_TREE_CLASS_START + lmp_class];
675 }
676 return -1;
677 }
678
679 static const true_false_string tfs_active_monitoring_not_allocated = { "Allocated - Active Monitoring", "Not Allocated" };
680
681 /*------------------------------------------------------------------------------
682 * Da code
683 */
684
685 static int
dissect_lmp(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)686 dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
687 {
688 int offset = 0;
689 proto_tree *lmp_tree = NULL, *ti, *ti2;
690 proto_tree *lmp_header_tree;
691 proto_tree *lmp_object_tree;
692 proto_tree *lmp_object_header_tree;
693 proto_tree *lmp_subobj_tree;
694 proto_item *hidden_item, *msg_item;
695
696 guint8 message_type;
697 vec_t cksum_vec[1];
698 int j, k, l, len;
699 int msg_length;
700 int obj_length;
701 int mylen;
702 int offset2;
703
704 col_set_str(pinfo->cinfo, COL_PROTOCOL, "LMP");
705 col_clear(pinfo->cinfo, COL_INFO);
706
707 message_type = tvb_get_guint8(tvb, offset+3);
708 col_add_str(pinfo->cinfo, COL_INFO,
709 val_to_str(message_type, message_type_vals, "Unknown (%u). "));
710
711 if (tree) {
712 static int * const header_flags[] = {
713 &hf_lmp_filter[LMPF_HDR_FLAGS_CC_DOWN],
714 &hf_lmp_filter[LMPF_HDR_FLAGS_REBOOT],
715 NULL
716 };
717
718 msg_length = tvb_get_ntohs(tvb, offset+4);
719 ti = proto_tree_add_item(tree, proto_lmp, tvb, offset, msg_length, ENC_NA);
720 lmp_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_MAIN]);
721 lmp_header_tree = proto_tree_add_subtree_format(
722 lmp_tree, tvb, offset, 12,
723 lmp_subtree[LMP_TREE_HEADER], NULL, "LMP Header. %s",
724 val_to_str(message_type, message_type_vals, "Unknown Message (%u). "));
725 proto_tree_add_item(lmp_header_tree, hf_lmp_version, tvb, offset, 1, ENC_BIG_ENDIAN);
726
727 proto_tree_add_bitmask(lmp_header_tree, tvb, offset+2, hf_lmp_header_flags, lmp_subtree[LMP_TREE_HEADER_FLAGS], header_flags, ENC_NA);
728 msg_item = proto_tree_add_uint(lmp_header_tree, hf_lmp_filter[LMPF_MSG], tvb,
729 offset+3, 1, message_type);
730 proto_tree_add_uint_format_value(lmp_header_tree, hf_lmp_header_length, tvb, offset+4, 2, msg_length, "%d bytes",
731 msg_length);
732 /* if (LMPF_MSG + message_type < LMPF_MSG_MAX && message_type > 0) {*/
733 /* this "if" is still a hack, but compared to the former one at least correct */
734 if ((message_type >= LMP_MSG_CONFIG && message_type <= LMP_MSG_CHANNEL_STATUS_RESP) ||
735 (message_type >= LMP_MSG_SERVICE_CONFIG && message_type <= LMP_MSG_SERVICE_CONFIG_NACK) ||
736 (message_type >= LMP_MSG_DISCOVERY_RESP && message_type <= LMP_MSG_DISCOVERY_RESP_NACK) ) {
737 hidden_item = proto_tree_add_boolean(lmp_header_tree,
738 hf_lmp_filter[lmp_msg_to_filter_num(message_type)],
739 tvb, offset+3, 1, 1);
740 proto_item_set_hidden(hidden_item);
741 } else {
742 expert_add_info_format(pinfo, msg_item, &ei_lmp_invalid_msg_type,
743 "Invalid message type: %u", message_type);
744 return tvb_captured_length(tvb);
745 }
746
747 if (lmp_checksum_config) {
748 if (!pinfo->fragmented && (int) tvb_captured_length(tvb) >= msg_length) {
749 /* The packet isn't part of a fragmented datagram and isn't truncated, so we can checksum it. */
750 SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, msg_length);
751 proto_tree_add_checksum(lmp_header_tree, tvb, offset+6, hf_lmp_filter[LMPF_CHECKSUM], hf_lmp_filter[LMPF_CHECKSUM_STATUS], &ei_lmp_checksum_incorrect, pinfo,
752 in_cksum(cksum_vec, 1), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM);
753 } else {
754 proto_tree_add_checksum(lmp_header_tree, tvb, offset+6, hf_lmp_filter[LMPF_CHECKSUM], hf_lmp_filter[LMPF_CHECKSUM_STATUS], &ei_lmp_checksum_incorrect, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
755 }
756 } else {
757 proto_tree_add_checksum(lmp_header_tree, tvb, offset+6, hf_lmp_filter[LMPF_CHECKSUM], hf_lmp_filter[LMPF_CHECKSUM_STATUS], &ei_lmp_checksum_incorrect, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT);
758 }
759
760 offset += 8;
761 len = 8;
762 while (len < msg_length) {
763 guint8 lmp_class;
764 guint8 type;
765 guint8 negotiable;
766 int filter_num;
767 proto_item* trace_item;
768
769 obj_length = tvb_get_ntohs(tvb, offset+2);
770 if (obj_length == 0) {
771 proto_tree_add_expert(tree, pinfo, &ei_lmp_obj_len, tvb, offset+2, 2);
772 break;
773 }
774 lmp_class = tvb_get_guint8(tvb, offset+1);
775 type = tvb_get_guint8(tvb, offset);
776 negotiable = (type >> 7); type &= 0x7f;
777 hidden_item = proto_tree_add_uint(lmp_tree, hf_lmp_filter[LMPF_OBJECT], tvb,
778 offset, 1, lmp_class);
779 proto_item_set_generated(hidden_item);
780 filter_num = lmp_class_to_filter_num(lmp_class);
781 if (filter_num != -1 && lmp_valid_class(lmp_class)) {
782 ti = proto_tree_add_item(lmp_tree,
783 hf_lmp_filter[filter_num],
784 tvb, offset, obj_length, ENC_NA); /* all possibilities are FT_NONE */
785 } else {
786 expert_add_info_format(pinfo, hidden_item, &ei_lmp_invalid_class,
787 "Invalid class: %u", lmp_class);
788 return tvb_captured_length(tvb);
789 }
790 lmp_object_tree = proto_item_add_subtree(ti, lmp_class_to_subtree(lmp_class));
791
792 lmp_object_header_tree = proto_tree_add_subtree_format(lmp_object_tree, tvb, offset, 4,
793 lmp_subtree[LMP_TREE_OBJECT_HEADER], &ti2,
794 "Header. Class %d, C-Type %d, Length %d, %s",
795 lmp_class, type, obj_length,
796 negotiable ? "Negotiable" : "Not Negotiable");
797
798 proto_tree_add_item(lmp_object_header_tree, hf_lmp_negotiable, tvb, offset, 1, ENC_NA);
799 proto_tree_add_item(lmp_object_header_tree, hf_lmp_object_length, tvb, offset+2, 2, ENC_BIG_ENDIAN);
800 proto_tree_add_item(lmp_object_header_tree, hf_lmp_object_class, tvb, offset+1, 1, ENC_BIG_ENDIAN);
801 proto_tree_add_uint(lmp_object_header_tree, hf_lmp_filter[LMPF_VAL_CTYPE],
802 tvb, offset, 1, type);
803 offset2 = offset+4;
804 mylen = obj_length - 4;
805
806 switch (lmp_class) {
807
808 case LMP_CLASS_NULL:
809 break;
810
811 case LMP_CLASS_CCID:
812 switch(type) {
813
814 case 1:
815 l = LMPF_VAL_LOCAL_CCID;
816 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
817 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
818 offset2, 4, ENC_BIG_ENDIAN);
819 break;
820
821 case 2:
822 l = LMPF_VAL_REMOTE_CCID;
823 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
824 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
825 offset2, 4, ENC_BIG_ENDIAN);
826 break;
827 default:
828 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
829 break;
830 }
831 break;
832
833 case LMP_CLASS_NODE_ID:
834 switch(type) {
835
836 case 1:
837 l = LMPF_VAL_LOCAL_NODE_ID;
838 proto_item_append_text(ti, ": %s", tvb_ip_to_str(pinfo->pool, tvb, offset2));
839 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
840 offset2, 4, ENC_BIG_ENDIAN);
841 break;
842
843 case 2:
844 l = LMPF_VAL_REMOTE_NODE_ID;
845 proto_item_append_text(ti, ": %s", tvb_ip_to_str(pinfo->pool, tvb, offset2));
846 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
847 offset2, 4, ENC_BIG_ENDIAN);
848 break;
849
850 default:
851 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
852 break;
853 }
854 break;
855
856 case LMP_CLASS_LINK_ID:
857
858 switch(type) {
859
860 case 1:
861 case 2:
862 l = (type == 1)? LMPF_VAL_LOCAL_LINK_ID_IPV4:
863 LMPF_VAL_REMOTE_LINK_ID_IPV4;
864 proto_item_append_text(ti, ": IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset2));
865 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
866 offset2, 4, ENC_BIG_ENDIAN);
867 break;
868
869 case 3:
870 case 4:
871 l = (type == 3)? LMPF_VAL_LOCAL_LINK_ID_IPV6:
872 LMPF_VAL_REMOTE_LINK_ID_IPV6;
873 proto_item_append_text(ti, ": IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset2));
874 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
875 offset2, 16, ENC_NA);
876 break;
877 case 5:
878 case 6:
879 l = (type == 5)? LMPF_VAL_LOCAL_LINK_ID_UNNUM:
880 LMPF_VAL_REMOTE_LINK_ID_UNNUM;
881 proto_item_append_text(ti, ": Unnumbered %d",
882 tvb_get_ntohl(tvb, offset2));
883 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
884 offset2, 4, ENC_BIG_ENDIAN);
885 break;
886
887 default:
888 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
889 break;
890 }
891 break;
892
893 case LMP_CLASS_INTERFACE_ID:
894
895 switch(type) {
896
897 case 1:
898 case 2:
899 l = (type == 1)? LMPF_VAL_LOCAL_INTERFACE_ID_IPV4:
900 LMPF_VAL_REMOTE_INTERFACE_ID_IPV4;
901 proto_item_append_text(ti, ": IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset2));
902 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
903 offset2, 4, ENC_BIG_ENDIAN);
904 break;
905
906 case 3:
907 case 4:
908 l = (type == 3)? LMPF_VAL_LOCAL_INTERFACE_ID_IPV6:
909 LMPF_VAL_REMOTE_INTERFACE_ID_IPV6;
910 proto_item_append_text(ti, ": IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset2));
911 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
912 offset2, 16, ENC_NA);
913 break;
914
915 case 5:
916 case 6:
917 l = (type == 5)? LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM:
918 LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM;
919 proto_item_append_text(ti, ": Unnumbered %d",
920 tvb_get_ntohl(tvb, offset2));
921 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
922 offset2, 4, ENC_BIG_ENDIAN);
923 break;
924
925 default:
926 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
927 break;
928 }
929 break;
930
931 case LMP_CLASS_MESSAGE_ID:
932
933 switch(type) {
934
935 case 1:
936
937 l = LMPF_VAL_MESSAGE_ID;
938 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
939 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
940 offset2, 4, ENC_BIG_ENDIAN);
941 break;
942
943 case 2:
944 l = LMPF_VAL_MESSAGE_ID_ACK;
945 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
946 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[l], tvb,
947 offset2, 4, ENC_BIG_ENDIAN);
948 break;
949
950 default:
951 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
952 break;
953 }
954 break;
955
956 case LMP_CLASS_CONFIG:
957
958 switch(type) {
959
960 case 1:
961 proto_item_append_text(ti, ": HelloInterval: %d, HelloDeadInterval: %d",
962 tvb_get_ntohs(tvb, offset2),
963 tvb_get_ntohs(tvb, offset2+2));
964 proto_tree_add_item(lmp_object_tree,
965 hf_lmp_filter[LMPF_VAL_CONFIG_HELLO],
966 tvb, offset2, 2, ENC_BIG_ENDIAN);
967 proto_tree_add_item(lmp_object_tree,
968 hf_lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
969 tvb, offset2+2, 2, ENC_BIG_ENDIAN);
970 break;
971
972 default:
973 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
974 break;
975 }
976 break;
977
978 case LMP_CLASS_HELLO:
979
980 switch(type) {
981
982 case 1:
983 proto_item_append_text(ti, ": TxSeq %d, RxSeq: %d",
984 tvb_get_ntohl(tvb, offset2),
985 tvb_get_ntohl(tvb, offset2+4));
986 proto_tree_add_item(lmp_object_tree,
987 hf_lmp_filter[LMPF_VAL_HELLO_TXSEQ],
988 tvb, offset2, 4, ENC_BIG_ENDIAN);
989 proto_tree_add_item(lmp_object_tree,
990 hf_lmp_filter[LMPF_VAL_HELLO_RXSEQ],
991 tvb, offset2+4, 4, ENC_BIG_ENDIAN);
992 break;
993
994 default:
995 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
996 break;
997 }
998 break;
999
1000 case LMP_CLASS_BEGIN_VERIFY:
1001
1002 switch(type) {
1003
1004 case 1:
1005 {
1006 float transmission_rate;
1007 static int * const verify_flags[] = {
1008 &hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
1009 &hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
1010 NULL
1011 };
1012
1013 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS], lmp_subtree[LMP_TREE_BEGIN_VERIFY_FLAGS], verify_flags, ENC_BIG_ENDIAN);
1014
1015 proto_tree_add_item(lmp_object_tree, hf_lmp_verify_interval, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
1016 proto_tree_add_item(lmp_object_tree, hf_lmp_number_of_data_links, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
1017 proto_tree_add_item(lmp_object_tree,
1018 hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
1019 tvb, offset2+8, 1, ENC_BIG_ENDIAN);
1020 proto_tree_add_item(lmp_object_tree, hf_lmp_verify_transport_mechanism, tvb, offset2+10, 2, ENC_BIG_ENDIAN);
1021 transmission_rate = tvb_get_ntohieee_float(tvb, offset2+12)*8/1000000;
1022 proto_tree_add_float_format_value(lmp_object_tree, hf_lmp_transmission_rate, tvb, offset2+12, 4,
1023 transmission_rate, "%.3f Mbps", transmission_rate);
1024 proto_tree_add_item(lmp_object_tree, hf_lmp_wavelength, tvb, offset2+16, 4, ENC_BIG_ENDIAN);
1025 }
1026 break;
1027
1028 default:
1029 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1030 break;
1031 }
1032 break;
1033
1034 case LMP_CLASS_BEGIN_VERIFY_ACK:
1035
1036 switch(type) {
1037
1038 case 1:
1039 proto_item_append_text(ti, ": VerifyDeadInterval: %d, TransportResponse: 0x%0x",
1040 tvb_get_ntohs(tvb, offset2),
1041 tvb_get_ntohs(tvb, offset2+2));
1042 proto_tree_add_item(lmp_object_tree, hf_lmp_verifydeadinterval, tvb, offset2, 2, ENC_BIG_ENDIAN);
1043 proto_tree_add_item(lmp_object_tree, hf_lmp_verify_transport_response, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
1044 break;
1045
1046 default:
1047 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1048 break;
1049 }
1050 break;
1051
1052 case LMP_CLASS_VERIFY_ID:
1053
1054 switch(type) {
1055
1056 case 1:
1057 proto_item_append_text(ti, ": %d",
1058 tvb_get_ntohl(tvb, offset2));
1059 proto_tree_add_item(lmp_object_tree,
1060 hf_lmp_filter[LMPF_VAL_VERIFY_ID],
1061 tvb, offset2, 4,
1062 ENC_BIG_ENDIAN);
1063 break;
1064 default:
1065 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1066 break;
1067 }
1068 break;
1069
1070 case LMP_CLASS_TE_LINK:
1071 {
1072 static int * const link_flags[] = {
1073 &hf_lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
1074 &hf_lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
1075 NULL
1076 };
1077
1078 ti2 = proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_TE_LINK_FLAGS], lmp_subtree[LMP_TREE_TE_LINK_FLAGS], link_flags, ENC_NA);
1079 l = tvb_get_guint8(tvb, offset2);
1080 proto_item_append_text(ti2, ": %s%s",
1081 (l&0x01) ? "Fault-Mgmt-Supported " : "",
1082 (l&0x02) ? "Link-Verification-Supported " : "");
1083
1084 switch(type) {
1085
1086 case 1:
1087 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1088 tvb_ip_to_str(pinfo->pool, tvb, offset2+4),
1089 tvb_ip_to_str(pinfo->pool, tvb, offset2+8));
1090 proto_tree_add_item(lmp_object_tree,
1091 hf_lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
1092 tvb, offset2+4, 4, ENC_BIG_ENDIAN);
1093 proto_tree_add_item(lmp_object_tree,
1094 hf_lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
1095 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
1096 break;
1097
1098 case 2:
1099 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1100 tvb_ip6_to_str(pinfo->pool, tvb, offset2+4),
1101 tvb_ip6_to_str(pinfo->pool, tvb, offset2+20));
1102 proto_tree_add_item(lmp_object_tree,
1103 hf_lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV6],
1104 tvb, offset2+4, 16, ENC_NA);
1105 proto_tree_add_item(lmp_object_tree,
1106 hf_lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV6],
1107 tvb, offset2+20, 16, ENC_NA);
1108 break;
1109
1110 case 3:
1111 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1112 tvb_get_ntohl(tvb, offset2+4),
1113 tvb_get_ntohl(tvb, offset2+8));
1114
1115 proto_tree_add_item(lmp_object_tree,
1116 hf_lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
1117 tvb, offset2+4, 4, ENC_BIG_ENDIAN);
1118
1119 proto_tree_add_item(lmp_object_tree,
1120 hf_lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
1121 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
1122 break;
1123 default:
1124 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1125 break;
1126 }
1127 }
1128 break;
1129
1130 case LMP_CLASS_DATA_LINK:
1131 {
1132 static int * const link_flags[] = {
1133 &hf_lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
1134 &hf_lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
1135 NULL
1136 };
1137
1138 ti2 = proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_DATA_LINK_FLAGS], lmp_subtree[LMP_TREE_DATA_LINK_FLAGS], link_flags, ENC_NA);
1139 l = tvb_get_guint8(tvb, offset2);
1140 proto_item_append_text(ti2, ": %s%s",
1141 (l&0x01) ? "Interface-Type-Port " : "Interface-Type-Component-Link ",
1142 (l&0x02) ? "Allocated " : "Unallocated ");
1143 switch(type) {
1144
1145 case 1:
1146 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1147 tvb_ip_to_str(pinfo->pool, tvb, offset2+4),
1148 tvb_ip_to_str(pinfo->pool, tvb, offset2+8));
1149
1150 proto_tree_add_item(lmp_object_tree,
1151 hf_lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
1152 tvb, offset2+4, 4, ENC_BIG_ENDIAN);
1153
1154 proto_tree_add_item(lmp_object_tree,
1155 hf_lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
1156 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
1157 l = 12;
1158 break;
1159
1160 case 2:
1161 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1162 tvb_ip6_to_str(pinfo->pool, tvb, offset2+4),
1163 tvb_ip6_to_str(pinfo->pool, tvb, offset2+8));
1164 proto_tree_add_item(lmp_object_tree, hf_lmp_data_link_local_id_ipv6, tvb, offset2+4, 16, ENC_NA);
1165 proto_tree_add_item(lmp_object_tree, hf_lmp_data_link_remote_id_ipv6, tvb, offset2+20, 16, ENC_NA);
1166 l = 36;
1167 break;
1168
1169 case 3:
1170 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1171 tvb_get_ntohl(tvb, offset2+4),
1172 tvb_get_ntohl(tvb, offset2+8));
1173 proto_tree_add_item(lmp_object_tree,
1174 hf_lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
1175 tvb, offset2+4, 4, ENC_BIG_ENDIAN);
1176 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
1177 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
1178 l = 12;
1179 break;
1180
1181 default:
1182 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1183 break;
1184 }
1185
1186 while (l < obj_length - 4) {
1187 float bandwidth;
1188
1189 mylen = tvb_get_guint8(tvb, offset2+l+1);
1190 ti2 = proto_tree_add_item(lmp_object_tree,
1191 hf_lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
1192 tvb, offset2+l, mylen, ENC_NA);
1193 lmp_subobj_tree = proto_item_add_subtree(ti2,
1194 lmp_subtree[LMP_TREE_DATA_LINK_SUBOBJ]);
1195 proto_tree_add_item(lmp_subobj_tree, hf_lmp_subobject_type, tvb, offset2+l, 1, ENC_BIG_ENDIAN);
1196
1197 proto_tree_add_item(lmp_subobj_tree, hf_lmp_subobject_length, tvb, offset2+l+1, 1, ENC_BIG_ENDIAN);
1198 switch(tvb_get_guint8(tvb, offset2+l)) {
1199
1200 case 1:
1201
1202 proto_item_set_text(ti2, "Interface Switching Capability: "
1203 "Switching Cap: %s, Encoding Type: %s, "
1204 "Min BW: %.3f Mbps, Max BW: %.3f Mbps",
1205 rval_to_str(tvb_get_guint8(tvb, offset2+l+2),
1206 gmpls_switching_type_rvals, "Unknown (%d)"),
1207 rval_to_str(tvb_get_guint8(tvb, offset2+l+3),
1208 gmpls_lsp_enc_rvals, "Unknown (%d)"),
1209 tvb_get_ntohieee_float(tvb, offset2+l+4)*8/1000000,
1210 tvb_get_ntohieee_float(tvb, offset2+l+8)*8/1000000);
1211 proto_tree_add_item(lmp_subobj_tree,
1212 hf_lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
1213 tvb, offset2+l+2, 1, ENC_BIG_ENDIAN);
1214 proto_tree_add_item(lmp_subobj_tree,
1215 hf_lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
1216 tvb, offset2+l+3, 1, ENC_BIG_ENDIAN);
1217 bandwidth = tvb_get_ntohieee_float(tvb, offset2+l+4)*8/1000000;
1218 proto_tree_add_float_format_value(lmp_subobj_tree, hf_lmp_minimum_reservable_bandwidth, tvb, offset2+l+4, 4,
1219 bandwidth, "%.3f Mbps", bandwidth);
1220 bandwidth = tvb_get_ntohieee_float(tvb, offset2+l+8)*8/1000000;
1221 proto_tree_add_float_format_value(lmp_subobj_tree, hf_lmp_maximum_reservable_bandwidth, tvb, offset2+l+8, 4,
1222 bandwidth, "%.3f Mbps", bandwidth);
1223 break;
1224
1225 case 2:
1226 proto_item_set_text(ti2, "Wavelength: %d",
1227 tvb_get_ntohl(tvb, offset2+l+2));
1228 proto_tree_add_item(lmp_subobj_tree, hf_lmp_wavelength, tvb, offset2+l+4, 4, ENC_BIG_ENDIAN);
1229 break;
1230
1231 default:
1232 proto_tree_add_item(lmp_subobj_tree, hf_lmp_data, tvb, offset2+l,
1233 tvb_get_guint8(tvb, offset2+l+1), ENC_NA);
1234 break;
1235 }
1236 if (tvb_get_guint8(tvb, offset2+l+1) == 0)
1237 break;
1238
1239 l += tvb_get_guint8(tvb, offset2+l+1);
1240 }
1241 }
1242 break;
1243
1244 case LMP_CLASS_CHANNEL_STATUS:
1245
1246 k = 0; j = 0;
1247
1248 switch(type) {
1249
1250 case 1:
1251 case 3:
1252 k = 8; break;
1253
1254 case 2:
1255 k = 20; break;
1256 }
1257
1258 if (!k)
1259 break;
1260
1261 for (l=0; l<obj_length - 4; ) {
1262
1263 lmp_subobj_tree = proto_tree_add_subtree(lmp_object_tree, tvb, offset2+l, k,
1264 lmp_subtree[LMP_TREE_CHANNEL_STATUS_ID], &ti2, "Interface-Id");
1265 switch(type) {
1266
1267 case 1:
1268 if (j < 4)
1269 proto_item_append_text(ti, ": [IPv4-%s",
1270 tvb_ip_to_str(pinfo->pool, tvb, offset2+l));
1271 proto_item_append_text(ti2, ": IPv4 %s",
1272 tvb_ip_to_str(pinfo->pool, tvb, offset2+l));
1273 proto_tree_add_item(lmp_subobj_tree, hf_lmp_interface_id_ipv4, tvb, offset2+l, 4, ENC_BIG_ENDIAN);
1274 l += 4;
1275 break;
1276
1277 case 2:
1278 if (j < 4)
1279 proto_item_append_text(ti, ": [IPv6-%s", tvb_ip6_to_str(pinfo->pool, tvb, offset2+l));
1280 proto_item_append_text(ti2, ": IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset2+l));
1281 proto_tree_add_item(lmp_subobj_tree, hf_lmp_interface_id_ipv6, tvb, offset2, 16, ENC_NA);
1282 l += 16;
1283 break;
1284
1285 case 3:
1286 if (j < 4)
1287 proto_item_append_text(ti, ": [Unnum-%d",
1288 tvb_get_ntohl(tvb, offset2+l));
1289 proto_item_append_text(ti, ": Unnumbered %d",
1290 tvb_get_ntohl(tvb, offset2+l));
1291 proto_tree_add_item(lmp_subobj_tree, hf_lmp_interface_id_unnumbered, tvb, offset2+l, 4, ENC_BIG_ENDIAN);
1292 l += 4;
1293 break;
1294
1295 default:
1296 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2+l, obj_length-4-l, ENC_NA);
1297 break;
1298 }
1299 if (l == obj_length - 4) break;
1300
1301 proto_tree_add_item(lmp_subobj_tree, hf_lmp_link, tvb, offset2+l, 4, ENC_NA);
1302 if (j < 4)
1303 proto_item_append_text(ti, "-%s,%s], ",
1304 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Act" : "NA",
1305 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1306 channel_status_short_str, "UNK (%u)."));
1307 proto_item_append_text(ti2, ": %s, ",
1308 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Active" : "Not Active");
1309 proto_tree_add_item(lmp_subobj_tree, hf_lmp_channel_status, tvb, offset2+l, 4, ENC_BIG_ENDIAN);
1310 proto_item_append_text(ti2, "%s", val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1311 channel_status_str, "Unknown (%u). "));
1312 j++;
1313 l += 4;
1314 if (j==4 && l < obj_length - 4)
1315 proto_item_append_text(ti, " ...");
1316 }
1317 break;
1318
1319 case LMP_CLASS_CHANNEL_STATUS_REQUEST:
1320 for (l=0; l<obj_length - 4; ) {
1321 switch(type) {
1322 case 1:
1323 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_IPV4],
1324 tvb, offset2+l, 4, ENC_BIG_ENDIAN);
1325 l += 4;
1326 break;
1327
1328 case 2:
1329 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_IPV6],
1330 tvb, offset2+l, 16, ENC_NA);
1331 l += 16;
1332 break;
1333
1334 case 3:
1335 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_UNNUM],
1336 tvb, offset2+l, 4, ENC_BIG_ENDIAN);
1337 l += 4;
1338 break;
1339
1340 default:
1341 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2+l, obj_length-4-l, ENC_NA);
1342 l = obj_length - 4;
1343 break;
1344 }
1345 }
1346 break;
1347
1348 case LMP_CLASS_ERROR:
1349 l = tvb_get_ntohl(tvb, offset2);
1350 ti2 = proto_tree_add_uint(lmp_object_tree, hf_lmp_filter[LMPF_VAL_ERROR],
1351 tvb, offset2, 4, l);
1352
1353 switch(type) {
1354
1355 case 1:
1356 {
1357 static int * const error_flags[] = {
1358 &hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
1359 &hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
1360 &hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
1361 &hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
1362 NULL
1363 };
1364
1365 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_ERROR], lmp_subtree[LMP_TREE_ERROR_FLAGS], error_flags, ENC_NA);
1366
1367 proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
1368 (l&0x01) ? "Unsupported-Link " : "",
1369 (l&0x02) ? "Unwilling" : "",
1370 (l&0x04) ? "Unsupported-Transport" : "",
1371 (l&0x08) ? "TE-Link-ID" : "");
1372 }
1373 break;
1374
1375 case 2:
1376 {
1377 static int * const error_flags[] = {
1378 &hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
1379 &hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
1380 &hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
1381 &hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
1382 &hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_TEL_CTYPE],
1383 &hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_DL_CTYPE],
1384 NULL
1385 };
1386
1387 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_ERROR], lmp_subtree[LMP_TREE_ERROR_FLAGS], error_flags, ENC_NA);
1388
1389 proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s%s%s%s",
1390 (l&0x01) ? "Unacceptable-Params " : "",
1391 (l&0x02) ? "Renegotiate" : "",
1392 (l&0x04) ? "Bad-TE-Link" : "",
1393 (l&0x08) ? "Bad-Data-Link" : "",
1394 (l&0x10) ? "Bad-TE-Link-CType" : "",
1395 (l&0x20) ? "Bad-Data-Link-CType" : "");
1396 }
1397 break;
1398
1399 case 3:
1400 {
1401 static int * const error_flags[] = {
1402 &hf_lmp_filter[LMPF_VAL_ERROR_TRACE_UNSUPPORTED_TYPE],
1403 &hf_lmp_filter[LMPF_VAL_ERROR_TRACE_INVALID_MSG],
1404 &hf_lmp_filter[LMPF_VAL_ERROR_TRACE_UNKNOWN_CTYPE],
1405 NULL
1406 };
1407
1408 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_ERROR], lmp_subtree[LMP_TREE_ERROR_FLAGS], error_flags, ENC_NA);
1409
1410 proto_item_append_text(ti, ": TRACE_ERROR: %s%s%s",
1411 (l&0x01) ? "Unsupported Trace Type " : "",
1412 (l&0x02) ? "Invalid Trace Message" : "",
1413 (l&0x10) ? "Unknown Object C-Type" : "");
1414 }
1415 break;
1416
1417 case 4:
1418 {
1419 static int * const error_flags[] = {
1420 &hf_lmp_filter[LMPF_VAL_ERROR_LAD_AREA_ID_MISMATCH],
1421 &hf_lmp_filter[LMPF_VAL_ERROR_LAD_TCP_ID_MISMATCH],
1422 &hf_lmp_filter[LMPF_VAL_ERROR_LAD_DA_DCN_MISMATCH],
1423 &hf_lmp_filter[LMPF_VAL_ERROR_LAD_CAPABILITY_MISMATCH],
1424 &hf_lmp_filter[LMPF_VAL_ERROR_LAD_UNKNOWN_CTYPE],
1425 NULL
1426 };
1427
1428 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_ERROR], lmp_subtree[LMP_TREE_ERROR_FLAGS], error_flags, ENC_NA);
1429
1430 proto_item_append_text(ti, ": LAD_ERROR: %s%s%s%s%s",
1431 (l&0x01) ? "Domain Routing Area ID mismatch" : "",
1432 (l&0x02) ? "TCP ID mismatch" : "",
1433 (l&0x04) ? "DA DCN mismatch" : "",
1434 (l&0x08) ? "Capability mismatch" : "",
1435 (l&0x10) ? "Unknown Object C-Type" : "");
1436 }
1437 break;
1438
1439 default:
1440 proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
1441 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1442 break;
1443 }
1444 break;
1445
1446 case LMP_CLASS_TRACE:
1447 switch (type) {
1448 case 1:
1449 l = tvb_get_ntohs(tvb, offset2);
1450 proto_tree_add_uint(lmp_object_tree,
1451 hf_lmp_filter[LMPF_VAL_TRACE_LOCAL_TYPE],
1452 tvb, offset2, 2, l);
1453 proto_item_append_text(lmp_object_tree, ": %s",
1454 val_to_str(l, lmp_trace_type_str, "Unknown (%d)"));
1455
1456 l = tvb_get_ntohs(tvb, offset2+2);
1457 trace_item = proto_tree_add_uint(lmp_object_tree,
1458 hf_lmp_filter[LMPF_VAL_TRACE_LOCAL_LEN],
1459 tvb, offset2+2, 2, l);
1460 if (l && l <= obj_length - 8) {
1461 proto_item_append_text(lmp_object_tree, " = %s",
1462 tvb_format_text(pinfo->pool, tvb, offset2+4, l));
1463 proto_tree_add_string(lmp_object_tree,
1464 hf_lmp_filter[LMPF_VAL_TRACE_LOCAL_MSG],
1465 tvb, offset2+4, l, tvb_format_text(pinfo->pool, tvb,
1466 offset2+4,l));
1467 }
1468 else
1469 expert_add_info(pinfo, trace_item, &ei_lmp_trace_len);
1470 break;
1471
1472 case 2:
1473 l = tvb_get_ntohs(tvb, offset2);
1474 proto_tree_add_uint(lmp_object_tree,
1475 hf_lmp_filter[LMPF_VAL_TRACE_REMOTE_TYPE],
1476 tvb, offset2, 2, l);
1477 proto_item_append_text(lmp_object_tree, ": %s",
1478 val_to_str(l, lmp_trace_type_str, "Unknown (%d)"));
1479
1480 l = tvb_get_ntohs(tvb, offset2+2);
1481 proto_tree_add_uint(lmp_object_tree,
1482 hf_lmp_filter[LMPF_VAL_TRACE_REMOTE_LEN],
1483 tvb, offset2+2, 2, l);
1484 proto_item_append_text(lmp_object_tree, " = %s",
1485 tvb_format_text(pinfo->pool, tvb, offset2+4, l));
1486 proto_tree_add_string(lmp_object_tree,
1487 hf_lmp_filter[LMPF_VAL_TRACE_REMOTE_MSG],
1488 tvb, offset2+4, l, tvb_format_text(pinfo->pool, tvb, offset2+4,l));
1489 break;
1490
1491 default:
1492 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1493 break;
1494
1495 }
1496 break;
1497
1498 case LMP_CLASS_TRACE_REQ:
1499 switch (type) {
1500 case 1:
1501 l = tvb_get_ntohs(tvb, offset2);
1502 proto_tree_add_uint(lmp_object_tree,
1503 hf_lmp_filter[LMPF_VAL_TRACE_REQ_TYPE],
1504 tvb, offset2, 2, l);
1505 proto_item_append_text(lmp_object_tree, ": %s",
1506 val_to_str(l, lmp_trace_type_str, "Unknown (%d)"));
1507 break;
1508
1509 default:
1510 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1511 break;
1512
1513 }
1514 break;
1515
1516 case LMP_CLASS_SERVICE_CONFIG:
1517
1518 /* Support for the ServiceConfig object defined in the UNI 1.0 spec */
1519 switch (type) {
1520
1521 case 1:
1522 {
1523
1524 static int * const sp_flags[] = {
1525 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_SP_FLAGS_RSVP],
1526 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_SP_FLAGS_LDP],
1527 NULL
1528 };
1529
1530 /* Supported Signaling Protocols Object */
1531
1532 /* Signaling Protocols */
1533 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_SP_FLAGS], lmp_subtree[LMP_TREE_SERVICE_CONFIG_SP_FLAGS], sp_flags, ENC_NA);
1534 l = tvb_get_guint8(tvb, offset2);
1535
1536 proto_item_append_text(ti2, ": %s %s",
1537 (l & 0x01) ? "RSVP-based UNI signaling supported " : "",
1538 (l & 0x02) ? "LDP-based UNI signaling supported " : "");
1539
1540 /* UNI version */
1541 proto_tree_add_item(lmp_object_tree, hf_lmp_uni_version, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
1542 }
1543 break;
1544
1545 case 2:
1546 {
1547 static int * const tp_flags[] = {
1548 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_PATH_OVERHEAD],
1549 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_LINE_OVERHEAD],
1550 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_SECTION_OVERHEAD],
1551 NULL
1552 };
1553
1554 static int * const cct_flags[] = {
1555 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_CCT_FLAGS_CC_SUPPORTED],
1556 NULL
1557 };
1558
1559 /* Client Port-Level Service Attributes Object */
1560
1561 /* Link Type */
1562 proto_tree_add_item(lmp_object_tree, hf_lmp_link_type, tvb, offset2, 1, ENC_BIG_ENDIAN);
1563
1564 proto_item_append_text(lmp_object_tree, "%s",
1565 val_to_str(tvb_get_guint8(tvb, offset2),
1566 service_attribute_link_type_str,
1567 "Unknown (%u). "));
1568
1569 l = tvb_get_guint8(tvb, offset2+1);
1570 /* Signal type for SDH */
1571 if (l == LMP_CLASS_SERVICE_CONFIG_CPSA_SIGNAL_TYPES_SDH) {
1572 /* Signal types for an SDH link */
1573 proto_tree_add_item(lmp_object_tree, hf_lmp_signal_types_sdh, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
1574
1575 proto_item_append_text(lmp_object_tree, "%s",
1576 val_to_str(tvb_get_guint8(tvb, offset2+1),
1577 service_attribute_signal_types_sdh_str,
1578 "Unknown (%u). "));
1579 }
1580
1581 if (l == LMP_CLASS_SERVICE_CONFIG_CPSA_SIGNAL_TYPES_SONET) {
1582 /* Signal types for a SONET link */
1583 proto_tree_add_item(lmp_object_tree, hf_lmp_signal_types_sonet, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
1584
1585 proto_item_append_text(lmp_object_tree, "%s",
1586 val_to_str(tvb_get_guint8(tvb, offset2+1),
1587 service_attribute_signal_types_sonet_str,
1588 "Unknown (%u). "));
1589 }
1590
1591 /* TP Transparency */
1592 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2+2, hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS], lmp_subtree[LMP_TREE_SERVICE_CONFIG_CPSA_TP_FLAGS], tp_flags, ENC_NA);
1593
1594 l = tvb_get_guint8(tvb, offset2+2);
1595 proto_item_append_text(ti2, ": %s%s%s",
1596 (l & 0x01) ? "Path/VC Overhead Transparency " : "",
1597 (l & 0x02) ? "Line/MS Overhead Transparency " : "",
1598 (l & 0x04) ? "Section/RS Overhead Transparency " : "");
1599
1600 /* Contiguous Concatenation Types */
1601 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2+3, hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_CCT_FLAGS], lmp_subtree[LMP_TREE_SERVICE_CONFIG_CPSA_CCT_FLAGS], cct_flags, ENC_NA);
1602
1603 /* Min and Max NCC */
1604 proto_item_append_text(ti, ": Minimum NCC: %d, Maximum NCC: %d",
1605 tvb_get_ntohs(tvb, offset2+4),
1606 tvb_get_ntohs(tvb, offset2+6));
1607
1608 proto_tree_add_item(lmp_object_tree,
1609 hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MIN_NCC],
1610 tvb, offset2+4, 2, ENC_BIG_ENDIAN);
1611
1612 proto_tree_add_item(lmp_object_tree,
1613 hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MAX_NCC],
1614 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
1615
1616 /* Min and Max NVC */
1617 proto_item_append_text(ti, ": Minimum NVC: %d, Maximum NVC: %d",
1618 tvb_get_ntohs(tvb, offset2+8),
1619 tvb_get_ntohs(tvb, offset2+10));
1620
1621 proto_tree_add_item(lmp_object_tree,
1622 hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MIN_NVC],
1623 tvb, offset2+8, 2, ENC_BIG_ENDIAN);
1624
1625 proto_tree_add_item(lmp_object_tree,
1626 hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MAX_NVC],
1627 tvb, offset2+10, 2, ENC_BIG_ENDIAN);
1628
1629 /* Local interface ID */
1630 proto_item_append_text(ti, ": Local Interface ID %s",
1631 tvb_ip_to_str(pinfo->pool, tvb, offset2+12));
1632
1633 proto_tree_add_item(lmp_object_tree,
1634 hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_INTERFACE_ID],
1635 tvb, offset2+12, 4, ENC_BIG_ENDIAN);
1636 }
1637 break;
1638
1639 case 3:
1640 {
1641 static int * const t_flags[] = {
1642 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS_SOH],
1643 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS_LOH],
1644 NULL
1645 };
1646
1647 static int * const tcm_flags[] = {
1648 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TCM_FLAGS_TCM_SUPPORTED],
1649 NULL
1650 };
1651
1652 /* Network Transparency Support and TCM Monitoring Object */
1653
1654 /* Transparency */
1655 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2, hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS], lmp_subtree[LMP_TREE_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS], t_flags, ENC_BIG_ENDIAN);
1656 l = tvb_get_ntohl(tvb, offset2);
1657 proto_item_append_text(ti2, ": %s %s",
1658 (l & 0x01) ? "Standard SOH/RSOH transparency supported " : "",
1659 (l & 0x02) ? "Standard LOH/MSOH transparency supported " : "");
1660
1661 /* TCM Monitoring */
1662 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2+7, hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TCM_FLAGS], lmp_subtree[LMP_TREE_SERVICE_CONFIG_NSA_TCM_FLAGS], tcm_flags, ENC_BIG_ENDIAN);
1663 l = tvb_get_guint8(tvb, offset2+7);
1664 proto_item_append_text(ti2, ": %s",
1665 (l & 0x01) ? "Transparent Support of TCM available " : "");
1666 }
1667 break;
1668
1669 case 4:
1670 {
1671 static int * const diversity_flags[] = {
1672 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_NODE],
1673 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_LINK],
1674 &hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_SRLG],
1675 NULL
1676 };
1677
1678 /* Network Diversity Object */
1679 proto_tree_add_bitmask(lmp_object_tree, tvb, offset2+3, hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS], lmp_subtree[LMP_TREE_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS], diversity_flags, ENC_BIG_ENDIAN);
1680 l = tvb_get_guint8(tvb,offset2+3);
1681 proto_item_append_text(ti2, ": %s%s%s",
1682 (l & 0x01) ? "Node Diversity is supported " : "",
1683 (l & 0x02) ? "Link Diversity is supported " : "",
1684 (l & 0x04) ? "SRLG Diversity is supported " : "");
1685
1686 }
1687 break;
1688
1689 default:
1690 /* Unknown type in Service Config object */
1691 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1692 break;
1693 }
1694 break;
1695
1696 case LMP_CLASS_DA_DCN_ADDRESS:
1697 switch(type) {
1698
1699 case 1:
1700 proto_item_append_text(ti, ": %s", tvb_ip_to_str(pinfo->pool, tvb, offset2));
1701 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[LMPF_VAL_LOCAL_DA_DCN_ADDR], tvb,
1702 offset2, 4, ENC_BIG_ENDIAN);
1703 break;
1704
1705 case 2:
1706 proto_item_append_text(ti, ": %s", tvb_ip_to_str(pinfo->pool, tvb, offset2));
1707 proto_tree_add_item(lmp_object_tree, hf_lmp_filter[LMPF_VAL_REMOTE_DA_DCN_ADDR], tvb,
1708 offset2, 4, ENC_BIG_ENDIAN);
1709 break;
1710
1711 default:
1712 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1713 break;
1714 }
1715 break;
1716
1717
1718 case LMP_CLASS_LOCAL_LAD_INFO:
1719 switch(type) {
1720 case 1:
1721 proto_item_append_text(ti, ": IPv4");
1722 proto_tree_add_item(lmp_object_tree,
1723 hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_NODE_ID],
1724 tvb, offset2, 4, ENC_BIG_ENDIAN);
1725 proto_tree_add_item(lmp_object_tree,
1726 hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_AREA_ID],
1727 tvb, offset2+4, 4, ENC_BIG_ENDIAN);
1728 proto_tree_add_item(lmp_object_tree,
1729 hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_TE_LINK_ID],
1730 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
1731 proto_tree_add_item(lmp_object_tree,
1732 hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_COMPONENT_ID],
1733 tvb, offset2+12, 4, ENC_BIG_ENDIAN);
1734 proto_tree_add_item(lmp_object_tree,
1735 hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_SC_PC_ID],
1736 tvb, offset2+16, 4, ENC_BIG_ENDIAN);
1737 proto_tree_add_item(lmp_object_tree,
1738 hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_SC_PC_ADDR],
1739 tvb, offset2+20, 4, ENC_BIG_ENDIAN);
1740 l = 24;
1741 while (l < obj_length - 4) {
1742 mylen = tvb_get_guint8(tvb, offset2+l+1);
1743 ti2 = proto_tree_add_item(lmp_object_tree,
1744 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ],
1745 tvb, offset2+l, mylen, ENC_NA);
1746 lmp_subobj_tree = proto_item_add_subtree(ti2,
1747 lmp_subtree[LMP_TREE_LAD_INFO_SUBOBJ]);
1748 proto_tree_add_item(lmp_subobj_tree, hf_lmp_subobject_type, tvb, offset2+l, 1, ENC_BIG_ENDIAN);
1749
1750 if (mylen == 0 || l + mylen > obj_length - 4) {
1751 proto_tree_add_uint_format_value(lmp_object_tree, hf_lmp_subobject_length, tvb, offset2+l+1, 1,
1752 mylen, "%d (Invalid)", mylen);
1753 break;
1754 }
1755 else
1756 proto_tree_add_item(lmp_subobj_tree, hf_lmp_subobject_length, tvb, offset2+l+1, 1, ENC_BIG_ENDIAN);
1757
1758 switch(tvb_get_guint8(tvb, offset2+l)) {
1759
1760 case 250:
1761 proto_item_set_text(ti2, "Primary Routing Controller: "
1762 "Area ID: %s, RC PC ID: %s, "
1763 "RC PC Addr: %s",
1764 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+4),
1765 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+8),
1766 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+12));
1767 proto_tree_add_item(lmp_subobj_tree,
1768 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_PRI_AREA_ID],
1769 tvb, offset2+l+4, 4, ENC_BIG_ENDIAN);
1770 proto_tree_add_item(lmp_subobj_tree,
1771 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_PRI_RC_PC_ID],
1772 tvb, offset2+l+8, 4, ENC_BIG_ENDIAN);
1773 proto_tree_add_item(lmp_subobj_tree,
1774 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_PRI_RC_PC_ADDR],
1775 tvb, offset2+l+12, 4, ENC_BIG_ENDIAN);
1776 break;
1777
1778 case 251:
1779 proto_item_set_text(ti2, "Secondary Routing Controller: "
1780 "Area ID: %s, RC PC ID: %s, "
1781 "RC PC Addr: %s",
1782 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+4),
1783 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+8),
1784 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+12));
1785 proto_tree_add_item(lmp_subobj_tree,
1786 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SEC_AREA_ID],
1787 tvb, offset2+l+4, 4, ENC_BIG_ENDIAN);
1788 proto_tree_add_item(lmp_subobj_tree,
1789 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SEC_RC_PC_ID],
1790 tvb, offset2+l+8, 4, ENC_BIG_ENDIAN);
1791 proto_tree_add_item(lmp_subobj_tree,
1792 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SEC_RC_PC_ADDR],
1793 tvb, offset2+l+12, 4, ENC_BIG_ENDIAN);
1794 break;
1795
1796 case 252:
1797 proto_item_set_text(ti2, "SONET/SDH Layer Capability: "
1798 "Switching Cap: %s, Encoding Type: %s",
1799 rval_to_str(tvb_get_guint8(tvb, offset2+l+4),
1800 gmpls_switching_type_rvals, "Unknown (%d)"),
1801 rval_to_str(tvb_get_guint8(tvb, offset2+l+5),
1802 gmpls_lsp_enc_rvals, "Unknown (%d)"));
1803 proto_tree_add_item(lmp_subobj_tree,
1804 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SWITCHING_TYPE],
1805 tvb, offset2+l+4, 1, ENC_BIG_ENDIAN);
1806 proto_tree_add_item(lmp_subobj_tree,
1807 hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_LSP_ENCODING],
1808 tvb, offset2+l+5, 1, ENC_BIG_ENDIAN);
1809
1810 for (j = 0; j < (mylen - 8) / 4; j++) {
1811 proto_tree_add_uint_format(lmp_subobj_tree, hf_lmp_free_timeslots, tvb, offset2+l+8+(j*4), 4,
1812 tvb_get_ntoh24(tvb, offset2+l+9+(j*4)), "%s: %d free timeslots",
1813 val_to_str_ext(tvb_get_guint8(tvb, offset2+l+8+(j*4)),
1814 &gmpls_sonet_signal_type_str_ext,
1815 "Unknown Signal Type (%d)"),
1816 tvb_get_ntoh24(tvb, offset2+l+9+(j*4)));
1817 }
1818 break;
1819
1820 default:
1821 proto_tree_add_item(lmp_subobj_tree, hf_lmp_data, tvb, offset2+l,
1822 tvb_get_guint8(tvb, offset2+l+1), ENC_NA);
1823 break;
1824 }
1825 if (tvb_get_guint8(tvb, offset2+l+1) == 0)
1826 break;
1827
1828 l += tvb_get_guint8(tvb, offset2+l+1);
1829 }
1830
1831 break;
1832
1833 default:
1834 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1835 break;
1836 }
1837 break;
1838
1839
1840
1841 default:
1842 proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA);
1843 break;
1844 }
1845
1846 offset += obj_length;
1847 len += obj_length;
1848
1849 } /* while */
1850 } /* tree */
1851
1852 return tvb_captured_length(tvb);
1853 }
1854
1855 static void
register_lmp_prefs(void)1856 register_lmp_prefs (void)
1857 {
1858 module_t *lmp_module;
1859
1860 lmp_module = prefs_register_protocol(proto_lmp, NULL);
1861
1862 prefs_register_bool_preference(
1863 lmp_module, "checksum", "LMP checksum field",
1864 "Whether LMP contains a checksum which can be checked", &lmp_checksum_config);
1865 prefs_register_obsolete_preference(lmp_module, "version");
1866 }
1867
1868 void
proto_register_lmp(void)1869 proto_register_lmp(void)
1870 {
1871 static gint *ett[NUM_LMP_SUBTREES];
1872 int i;
1873
1874 static hf_register_info lmpf_info[] = {
1875
1876 /* Message type number */
1877 {&hf_lmp_filter[LMPF_MSG],
1878 { "Message Type", "lmp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
1879 NULL, HFILL }},
1880
1881 /* Message type shorthands */
1882 {&hf_lmp_filter[LMPF_MSG_CONFIG],
1883 { "Config Message", "lmp.msg.config", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1884 NULL, HFILL }},
1885
1886 {&hf_lmp_filter[LMPF_MSG_CONFIG_ACK],
1887 { "ConfigAck Message", "lmp.msg.configack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1888 NULL, HFILL }},
1889
1890 {&hf_lmp_filter[LMPF_MSG_CONFIG_NACK],
1891 { "ConfigNack Message", "lmp.msg.confignack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1892 NULL, HFILL }},
1893
1894 {&hf_lmp_filter[LMPF_MSG_HELLO],
1895 { "HELLO Message", "lmp.msg.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1896 NULL, HFILL }},
1897
1898 {&hf_lmp_filter[LMPF_MSG_BEGIN_VERIFY],
1899 { "BeginVerify Message", "lmp.msg.beginverify", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1900 NULL, HFILL }},
1901
1902 {&hf_lmp_filter[LMPF_MSG_BEGIN_VERIFY_ACK],
1903 { "BeginVerifyAck Message", "lmp.msg.beginverifyack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1904 NULL, HFILL }},
1905
1906 {&hf_lmp_filter[LMPF_MSG_BEGIN_VERIFY_NACK],
1907 { "BeginVerifyNack Message", "lmp.msg.beginverifynack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1908 NULL, HFILL }},
1909
1910 {&hf_lmp_filter[LMPF_MSG_END_VERIFY],
1911 { "EndVerify Message", "lmp.msg.endverify", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1912 NULL, HFILL }},
1913
1914 {&hf_lmp_filter[LMPF_MSG_END_VERIFY_ACK],
1915 { "EndVerifyAck Message", "lmp.msg.endverifyack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1916 NULL, HFILL }},
1917
1918 {&hf_lmp_filter[LMPF_MSG_TEST],
1919 { "Test Message", "lmp.msg.test", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1920 NULL, HFILL }},
1921
1922 {&hf_lmp_filter[LMPF_MSG_TEST_STATUS_SUCCESS],
1923 { "TestStatusSuccess Message", "lmp.msg.teststatussuccess", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1924 NULL, HFILL }},
1925
1926 {&hf_lmp_filter[LMPF_MSG_TEST_STATUS_FAILURE],
1927 { "TestStatusFailure Message", "lmp.msg.teststatusfailure", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1928 NULL, HFILL }},
1929
1930 {&hf_lmp_filter[LMPF_MSG_TEST_STATUS_ACK],
1931 { "TestStatusAck Message", "lmp.msg.teststatusack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1932 NULL, HFILL }},
1933
1934 {&hf_lmp_filter[LMPF_MSG_LINK_SUMMARY],
1935 { "LinkSummary Message", "lmp.msg.linksummary", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1936 NULL, HFILL }},
1937
1938 {&hf_lmp_filter[LMPF_MSG_LINK_SUMMARY_ACK],
1939 { "LinkSummaryAck Message", "lmp.msg.linksummaryack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1940 NULL, HFILL }},
1941
1942 {&hf_lmp_filter[LMPF_MSG_LINK_SUMMARY_NACK],
1943 { "LinkSummaryNack Message", "lmp.msg.linksummarynack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1944 NULL, HFILL }},
1945
1946 {&hf_lmp_filter[LMPF_MSG_CHANNEL_STATUS],
1947 { "ChannelStatus Message", "lmp.msg.channelstatus", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1948 NULL, HFILL }},
1949
1950 {&hf_lmp_filter[LMPF_MSG_CHANNEL_STATUS_ACK],
1951 { "ChannelStatusAck Message", "lmp.msg.channelstatusack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1952 NULL, HFILL }},
1953
1954 {&hf_lmp_filter[LMPF_MSG_CHANNEL_STATUS_REQ],
1955 { "ChannelStatusRequest Message", "lmp.msg.channelstatusrequest", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1956 NULL, HFILL }},
1957
1958 {&hf_lmp_filter[LMPF_MSG_CHANNEL_STATUS_RESP],
1959 { "ChannelStatusResponse Message", "lmp.msg.channelstatusresponse", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1960 NULL, HFILL }},
1961
1962 {&hf_lmp_filter[LMPF_MSG_TRACE_MONITOR],
1963 { "TraceMonitor Message", "lmp.msg.tracemonitor", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1964 NULL, HFILL }},
1965
1966 {&hf_lmp_filter[LMPF_MSG_TRACE_MONITOR_ACK],
1967 { "TraceMonitorAck Message", "lmp.msg.tracemonitorack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1968 NULL, HFILL }},
1969
1970 {&hf_lmp_filter[LMPF_MSG_TRACE_MONITOR_NACK],
1971 { "TraceMonitorNack Message", "lmp.msg.tracemonitornack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1972 NULL, HFILL }},
1973
1974 {&hf_lmp_filter[LMPF_MSG_TRACE_MISMATCH],
1975 { "TraceMismatch Message", "lmp.msg.tracemismatch", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1976 NULL, HFILL }},
1977
1978 {&hf_lmp_filter[LMPF_MSG_TRACE_MISMATCH_ACK],
1979 { "TraceMismatchAck Message", "lmp.msg.tracemismatchack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1980 NULL, HFILL }},
1981
1982 {&hf_lmp_filter[LMPF_MSG_TRACE_REQUEST],
1983 { "TraceRequest Message", "lmp.msg.tracerequest", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1984 NULL, HFILL }},
1985
1986 {&hf_lmp_filter[LMPF_MSG_TRACE_REPORT],
1987 { "TraceReport Message", "lmp.msg.tracereport", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1988 NULL, HFILL }},
1989
1990 {&hf_lmp_filter[LMPF_MSG_TRACE_REQUEST_NACK],
1991 { "TraceRequestNack Message", "lmp.msg.tracerequestnack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1992 NULL, HFILL }},
1993
1994 {&hf_lmp_filter[LMPF_MSG_INSERT_TRACE],
1995 { "InsertTrace Message", "lmp.msg.inserttrace", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1996 NULL, HFILL }},
1997
1998 {&hf_lmp_filter[LMPF_MSG_INSERT_TRACE_ACK],
1999 { "InsertTraceAck Message", "lmp.msg.inserttraceack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2000 NULL, HFILL }},
2001
2002 {&hf_lmp_filter[LMPF_MSG_INSERT_TRACE_NACK],
2003 { "InsertTraceNack Message", "lmp.msg.inserttracenack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2004 NULL, HFILL }},
2005
2006 {&hf_lmp_filter[LMPF_MSG_SERVICE_CONFIG],
2007 { "ServiceConfig Message", "lmp.msg.serviceconfig", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2008 NULL, HFILL }},
2009
2010 {&hf_lmp_filter[LMPF_MSG_SERVICE_CONFIG_ACK],
2011 { "ServiceConfigAck Message", "lmp.msg.serviceconfigack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2012 NULL, HFILL }},
2013
2014 {&hf_lmp_filter[LMPF_MSG_SERVICE_CONFIG_NACK],
2015 { "ServiceConfigNack Message", "lmp.msg.serviceconfignack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2016 NULL, HFILL }},
2017
2018 {&hf_lmp_filter[LMPF_MSG_DISCOVERY_RESP],
2019 { "DiscoveryResponse Message", "lmp.msg.discoveryresp", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2020 NULL, HFILL }},
2021
2022 {&hf_lmp_filter[LMPF_MSG_DISCOVERY_RESP_ACK],
2023 { "DiscoveryResponseAck Message", "lmp.msg.discoveryrespack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2024 NULL, HFILL }},
2025
2026 {&hf_lmp_filter[LMPF_MSG_DISCOVERY_RESP_NACK],
2027 { "DiscoveryResponseNack Message", "lmp.msg.discoveryrespnack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2028 NULL, HFILL }},
2029
2030 /* LMP Message Header Fields ------------------- */
2031
2032 {&hf_lmp_filter[LMPF_HDR_FLAGS],
2033 { "LMP Header - Flags", "lmp.hdr.flags", FT_UINT8, BASE_DEC, NULL, 0x0,
2034 NULL, HFILL }},
2035
2036 {&hf_lmp_filter[LMPF_HDR_FLAGS_CC_DOWN],
2037 { "ControlChannelDown", "lmp.hdr.ccdown", FT_BOOLEAN, 8, NULL, 0x01,
2038 NULL, HFILL }},
2039
2040 {&hf_lmp_filter[LMPF_HDR_FLAGS_REBOOT],
2041 { "Reboot", "lmp.hdr.reboot", FT_BOOLEAN, 8, NULL, 0x02,
2042 NULL, HFILL }},
2043
2044 /* LMP object class filters ------------------------------- */
2045
2046 {&hf_lmp_filter[LMPF_OBJECT],
2047 { "LOCAL_CCID", "lmp.object", FT_UINT8, BASE_DEC, NULL, 0x0,
2048 NULL, HFILL }},
2049
2050 {&hf_lmp_filter[LMPF_CLASS_CCID],
2051 { "CCID", "lmp.obj.ccid", FT_NONE, BASE_NONE, NULL, 0x0,
2052 NULL, HFILL }},
2053 {&hf_lmp_filter[LMPF_CLASS_NODE_ID],
2054 { "NODE_ID", "lmp.obj.Nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
2055 NULL, HFILL }},
2056 {&hf_lmp_filter[LMPF_CLASS_LINK_ID],
2057 { "LINK_ID", "lmp.obj.linkid", FT_NONE, BASE_NONE, NULL, 0x0,
2058 NULL, HFILL }},
2059 {&hf_lmp_filter[LMPF_CLASS_INTERFACE_ID],
2060 { "INTERFACE_ID", "lmp.obj.interfaceid", FT_NONE, BASE_NONE, NULL, 0x0,
2061 NULL, HFILL }},
2062 {&hf_lmp_filter[LMPF_CLASS_MESSAGE_ID],
2063 { "MESSAGE_ID", "lmp.obj.messageid", FT_NONE, BASE_NONE, NULL, 0x0,
2064 NULL, HFILL }},
2065 {&hf_lmp_filter[LMPF_CLASS_CONFIG],
2066 { "CONFIG", "lmp.obj.config", FT_NONE, BASE_NONE, NULL, 0x0,
2067 NULL, HFILL }},
2068 {&hf_lmp_filter[LMPF_CLASS_HELLO],
2069 { "HELLO", "lmp.obj.hello", FT_NONE, BASE_NONE, NULL, 0x0,
2070 NULL, HFILL }},
2071 {&hf_lmp_filter[LMPF_CLASS_BEGIN_VERIFY],
2072 { "BEGIN_VERIFY", "lmp.obj.begin_verify", FT_NONE, BASE_NONE, NULL, 0x0,
2073 NULL, HFILL }},
2074 {&hf_lmp_filter[LMPF_CLASS_BEGIN_VERIFY_ACK],
2075 { "BEGIN_VERIFY_ACK", "lmp.obj.begin_verify_ack", FT_NONE, BASE_NONE, NULL, 0x0,
2076 NULL, HFILL }},
2077 {&hf_lmp_filter[LMPF_CLASS_VERIFY_ID],
2078 { "VERIFY_ID", "lmp.obj.verifyid", FT_NONE, BASE_NONE, NULL, 0x0,
2079 NULL, HFILL }},
2080
2081 {&hf_lmp_filter[LMPF_CLASS_TE_LINK],
2082 { "TE_LINK", "lmp.obj.te_link", FT_NONE, BASE_NONE, NULL, 0x0,
2083 NULL, HFILL }},
2084 {&hf_lmp_filter[LMPF_CLASS_DATA_LINK],
2085 { "DATA_LINK", "lmp.obj.data_link", FT_NONE, BASE_NONE, NULL, 0x0,
2086 NULL, HFILL }},
2087
2088 {&hf_lmp_filter[LMPF_CLASS_CHANNEL_STATUS],
2089 { "CHANNEL_STATUS", "lmp.obj.channel_status", FT_NONE, BASE_NONE, NULL, 0x0,
2090 NULL, HFILL }},
2091
2092 {&hf_lmp_filter[LMPF_CLASS_CHANNEL_STATUS_REQUEST],
2093 { "CHANNEL_STATUS_REQUEST", "lmp.obj.channel_status_request", FT_NONE, BASE_NONE, NULL, 0x0,
2094 NULL, HFILL }},
2095
2096 {&hf_lmp_filter[LMPF_CLASS_ERROR],
2097 { "ERROR", "lmp.obj.error", FT_NONE, BASE_NONE, NULL, 0x0,
2098 NULL, HFILL }},
2099
2100 {&hf_lmp_filter[LMPF_CLASS_TRACE],
2101 { "TRACE", "lmp.obj.trace", FT_NONE, BASE_NONE, NULL, 0x0,
2102 NULL, HFILL }},
2103
2104 {&hf_lmp_filter[LMPF_CLASS_TRACE_REQ],
2105 { "TRACE REQ", "lmp.obj.trace_req", FT_NONE, BASE_NONE, NULL, 0x0,
2106 NULL, HFILL }},
2107
2108 {&hf_lmp_filter[LMPF_CLASS_SERVICE_CONFIG],
2109 { "SERVICE_CONFIG", "lmp.obj.serviceconfig", FT_NONE, BASE_NONE, NULL, 0x0,
2110 NULL, HFILL }},
2111
2112 {&hf_lmp_filter[LMPF_CLASS_DA_DCN_ADDRESS],
2113 { "DA_DCN_ADDRESS", "lmp.obj.dadcnaddr", FT_NONE, BASE_NONE, NULL, 0x0,
2114 NULL, HFILL }},
2115
2116 {&hf_lmp_filter[LMPF_CLASS_LOCAL_LAD_INFO],
2117 { "LOCAL_LAD_INFO", "lmp.obj.localladinfo", FT_NONE, BASE_NONE, NULL, 0x0,
2118 NULL, HFILL }},
2119
2120 /* Other LMP Value Filters ------------------------------ */
2121
2122 {&hf_lmp_filter[LMPF_VAL_CTYPE],
2123 { "Object C-Type", "lmp.obj.ctype", FT_UINT8, BASE_DEC, NULL, 0x0,
2124 NULL, HFILL }},
2125
2126 {&hf_lmp_filter[LMPF_VAL_LOCAL_CCID],
2127 { "Local CCID Value", "lmp.local_ccid", FT_UINT32, BASE_DEC, NULL, 0x0,
2128 NULL, HFILL }},
2129 {&hf_lmp_filter[LMPF_VAL_REMOTE_CCID],
2130 { "Remote CCID Value", "lmp.remote_ccid", FT_UINT32, BASE_DEC, NULL, 0x0,
2131 NULL, HFILL }},
2132
2133 {&hf_lmp_filter[LMPF_VAL_LOCAL_NODE_ID],
2134 { "Local Node ID Value", "lmp.local_nodeid", FT_IPv4, BASE_NONE, NULL, 0x0,
2135 NULL, HFILL }},
2136 {&hf_lmp_filter[LMPF_VAL_REMOTE_NODE_ID],
2137 { "Remote Node ID Value", "lmp.remote_nodeid", FT_IPv4, BASE_NONE, NULL, 0x0,
2138 NULL, HFILL }},
2139
2140 {&hf_lmp_filter[LMPF_VAL_LOCAL_LINK_ID_IPV4],
2141 { "Local Link ID - IPv4", "lmp.local_linkid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2142 NULL, HFILL }},
2143 {&hf_lmp_filter[LMPF_VAL_LOCAL_LINK_ID_IPV6],
2144 { "Local Link ID - IPv6", "lmp.local_linkid_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2145 NULL, HFILL }},
2146 {&hf_lmp_filter[LMPF_VAL_LOCAL_LINK_ID_UNNUM],
2147 { "Local Link ID - Unnumbered", "lmp.local_linkid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2148 NULL, HFILL }},
2149 {&hf_lmp_filter[LMPF_VAL_REMOTE_LINK_ID_IPV4],
2150 { "Remote Link ID - IPv4", "lmp.remote_linkid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2151 NULL, HFILL }},
2152 {&hf_lmp_filter[LMPF_VAL_REMOTE_LINK_ID_IPV6],
2153 { "Remote Link ID - IPv6", "lmp.remote_linkid_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2154 NULL, HFILL }},
2155 {&hf_lmp_filter[LMPF_VAL_REMOTE_LINK_ID_UNNUM],
2156 { "Remote Link ID - Unnumbered", "lmp.remote_linkid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2157 NULL, HFILL }},
2158
2159 {&hf_lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_IPV4],
2160 { "Local Interface ID - IPv4", "lmp.local_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2161 NULL, HFILL }},
2162 {&hf_lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_IPV6],
2163 { "Local Interface ID - IPv6", "lmp.local_interfaceid_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2164 NULL, HFILL }},
2165 {&hf_lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM],
2166 { "Local Interface ID - Unnumbered", "lmp.local_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2167 NULL, HFILL }},
2168 {&hf_lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_IPV4],
2169 { "Remote Interface ID - IPv4", "lmp.remote_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2170 NULL, HFILL }},
2171 {&hf_lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_IPV6],
2172 { "Remote Interface ID - IPv6", "lmp.remote_interfaceid_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2173 NULL, HFILL }},
2174 {&hf_lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM],
2175 { "Remote Interface ID - Unnumbered", "lmp.remote_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2176 NULL, HFILL }},
2177 {&hf_lmp_filter[LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_IPV4],
2178 { "Interface ID: IPv4", "lmp.channel_status_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2179 NULL, HFILL }},
2180 {&hf_lmp_filter[LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_IPV6],
2181 { "Interface ID: IPv6", "lmp.channel_status_interfaceid_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2182 NULL, HFILL }},
2183 {&hf_lmp_filter[LMPF_VAL_CHANNEL_STATUS_INTERFACE_ID_UNNUM],
2184 { "Interface ID: Unnumbered", "lmp.channel_status_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2185 NULL, HFILL }},
2186 {&hf_lmp_filter[LMPF_VAL_MESSAGE_ID],
2187 { "Message-ID Value", "lmp.messageid", FT_UINT32, BASE_DEC, NULL, 0x0,
2188 NULL, HFILL }},
2189 {&hf_lmp_filter[LMPF_VAL_MESSAGE_ID_ACK],
2190 { "Message-ID Ack Value", "lmp.messageid_ack", FT_UINT32, BASE_DEC, NULL, 0x0,
2191 NULL, HFILL }},
2192
2193 {&hf_lmp_filter[LMPF_VAL_CONFIG_HELLO],
2194 { "HelloInterval", "lmp.hellointerval", FT_UINT32, BASE_DEC, NULL, 0x0,
2195 NULL, HFILL }},
2196 {&hf_lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
2197 { "HelloDeadInterval", "lmp.hellodeadinterval", FT_UINT32, BASE_DEC, NULL, 0x0,
2198 NULL, HFILL }},
2199
2200 {&hf_lmp_filter[LMPF_VAL_HELLO_TXSEQ],
2201 { "TxSeqNum", "lmp.txseqnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2202 NULL, HFILL }},
2203 {&hf_lmp_filter[LMPF_VAL_HELLO_RXSEQ],
2204 { "RxSeqNum", "lmp.rxseqnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2205 NULL, HFILL }},
2206
2207 {&hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS],
2208 { "Flags", "lmp.begin_verify.flags", FT_UINT16, BASE_HEX, NULL, 0x0,
2209 NULL, HFILL }},
2210 {&hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
2211 { "Verify All Links", "lmp.begin_verify.all_links",
2212 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2213 {&hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
2214 { "Data Link Type", "lmp.begin_verify.link_type",
2215 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2216 {&hf_lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
2217 { "Encoding Type", "lmp.begin_verify.enctype",
2218 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_lsp_enc_rvals), 0x0,
2219 NULL, HFILL }},
2220 {&hf_lmp_filter[LMPF_VAL_VERIFY_ID],
2221 { "Verify-ID", "lmp.verifyid", FT_UINT32, BASE_DEC, NULL, 0x0,
2222 NULL, HFILL }},
2223
2224 {&hf_lmp_filter[LMPF_VAL_TE_LINK_FLAGS],
2225 { "TE-Link Flags", "lmp.te_link_flags", FT_UINT8, BASE_HEX, NULL, 0x0,
2226 NULL, HFILL }},
2227 {&hf_lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
2228 { "Fault Management Supported", "lmp.te_link.fault_mgmt",
2229 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2230 {&hf_lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
2231 { "Link Verification Supported", "lmp.te_link.link_verify",
2232 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2233 {&hf_lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
2234 { "TE-Link Local ID - IPv4", "lmp.te_link.local_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2235 NULL, HFILL }},
2236 {&hf_lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV6],
2237 { "TE-Link Local ID - IPv6", "lmp.te_link.local_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2238 NULL, HFILL }},
2239 {&hf_lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
2240 { "TE-Link Local ID - Unnumbered", "lmp.te_link.local_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2241 NULL, HFILL }},
2242 {&hf_lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
2243 { "TE-Link Remote ID - IPv4", "lmp.te_link.remote_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2244 NULL, HFILL }},
2245 {&hf_lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV6],
2246 { "TE-Link Remote ID - IPv6", "lmp.te_link.remote_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0,
2247 NULL, HFILL }},
2248 {&hf_lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
2249 { "TE-Link Remote ID - Unnumbered", "lmp.te_link.remote_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2250 NULL, HFILL }},
2251
2252 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_FLAGS],
2253 { "Data-Link Flags", "lmp.data_link_flags", FT_UINT8, BASE_HEX, NULL, 0x0,
2254 NULL, HFILL }},
2255 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
2256 { "Data-Link is Individual Port", "lmp.data_link.port",
2257 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2258 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
2259 { "Data-Link is Allocated", "lmp.data_link.link_verify",
2260 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2261 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
2262 { "Data-Link Local ID - IPv4", "lmp.data_link.local_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2263 NULL, HFILL }},
2264 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
2265 { "Data-Link Local ID - Unnumbered", "lmp.data_link.local_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2266 NULL, HFILL }},
2267 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
2268 { "Data-Link Remote ID - IPv4", "lmp.data_link.remote_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
2269 NULL, HFILL }},
2270 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
2271 { "Data-Link Remote ID - Unnumbered", "lmp.data_link.remote_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
2272 NULL, HFILL }},
2273 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
2274 { "Subobject", "lmp.data_link_subobj", FT_NONE, BASE_NONE, NULL, 0x0,
2275 NULL, HFILL }},
2276 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
2277 { "Interface Switching Capability", "lmp.data_link_switching", FT_UINT8, BASE_DEC|BASE_RANGE_STRING,
2278 RVALS(gmpls_switching_type_rvals), 0x0, NULL, HFILL }},
2279 {&hf_lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
2280 { "LSP Encoding Type", "lmp.data_link_encoding", FT_UINT8, BASE_DEC|BASE_RANGE_STRING,
2281 RVALS(gmpls_lsp_enc_rvals), 0x0, NULL, HFILL }},
2282
2283 {&hf_lmp_filter[LMPF_VAL_ERROR],
2284 { "Error Code", "lmp.error", FT_UINT32, BASE_HEX, NULL, 0x0,
2285 NULL, HFILL }},
2286
2287 {&hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
2288 { "Verification - Unsupported for this TE-Link", "lmp.error.verify_unsupported_link",
2289 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2290 {&hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
2291 { "Verification - Unwilling to Verify at this time", "lmp.error.verify_unwilling",
2292 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2293 {&hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
2294 { "Verification - Transport Unsupported", "lmp.error.verify_unsupported_transport",
2295 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2296 {&hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
2297 { "Verification - TE Link ID Configuration Error", "lmp.error.verify_te_link_id",
2298 FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2299
2300 {&hf_lmp_filter[LMPF_VAL_ERROR_VERIFY_UNKNOWN_CTYPE],
2301 { "Verification - Unknown Object C-Type", "lmp.error.verify_unknown_ctype",
2302 FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2303
2304 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
2305 { "Summary - Unacceptable non-negotiable parameters", "lmp.error.summary_bad_params",
2306 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2307 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
2308 { "Summary - Renegotiate Parameter", "lmp.error.summary_renegotiate",
2309 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2310 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
2311 { "Summary - Bad TE Link Object", "lmp.error.summary_bad_te_link",
2312 FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2313 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
2314 { "Summary - Bad Data Link Object", "lmp.error.summary_bad_data_link",
2315 FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2316 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_TEL_CTYPE],
2317 { "Summary - Bad TE Link C-Type", "lmp.error.summary_unknown_tel_ctype",
2318 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2319 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_DL_CTYPE],
2320 { "Summary - Bad Data Link C-Type", "lmp.error.summary_unknown_dl_ctype",
2321 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2322 {&hf_lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
2323 { "Summary - Bad Remote Link ID", "lmp.error.summary_bad_remote_link_id",
2324 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2325 {&hf_lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
2326 { "Config - Unacceptable non-negotiable parameters", "lmp.error.config_bad_params",
2327 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2328 {&hf_lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
2329 { "Config - Renegotiate Parameter", "lmp.error.config_renegotiate",
2330 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2331 {&hf_lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
2332 { "Config - Bad CC ID", "lmp.error.config_bad_ccid",
2333 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2334 {&hf_lmp_filter[LMPF_VAL_ERROR_TRACE_UNSUPPORTED_TYPE],
2335 { "Trace - Unsupported trace type", "lmp.error.trace_unsupported_type",
2336 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2337 {&hf_lmp_filter[LMPF_VAL_ERROR_TRACE_INVALID_MSG],
2338 { "Trace - Invalid Trace Message", "lmp.error.trace_invalid_msg",
2339 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2340 {&hf_lmp_filter[LMPF_VAL_ERROR_TRACE_UNKNOWN_CTYPE],
2341 { "Trace - Unknown Object C-Type", "lmp.error.trace_unknown_ctype",
2342 FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2343 {&hf_lmp_filter[LMPF_VAL_ERROR_LAD_AREA_ID_MISMATCH],
2344 { "LAD - Domain Routing Area ID Mismatch detected", "lmp.error.lad_area_id_mismatch",
2345 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2346 {&hf_lmp_filter[LMPF_VAL_ERROR_LAD_TCP_ID_MISMATCH],
2347 { "LAD - TCP ID Mismatch detected", "lmp.error.lad_tcp_id_mismatch",
2348 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2349 {&hf_lmp_filter[LMPF_VAL_ERROR_LAD_DA_DCN_MISMATCH],
2350 { "LAD - DA DCN Mismatch detected", "lmp.error.lad_da_dcn_mismatch",
2351 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2352 {&hf_lmp_filter[LMPF_VAL_ERROR_LAD_CAPABILITY_MISMATCH],
2353 { "LAD - Capability Mismatch detected", "lmp.error.lad_capability_mismatch",
2354 FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2355 {&hf_lmp_filter[LMPF_VAL_ERROR_LAD_UNKNOWN_CTYPE],
2356 { "LAD - Unknown Object C-Type", "lmp.error.lad_unknown_ctype",
2357 FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2358
2359 {&hf_lmp_filter[LMPF_VAL_TRACE_LOCAL_TYPE],
2360 { "Local Trace Type", "lmp.trace.local_type", FT_UINT16, BASE_DEC,
2361 VALS(lmp_trace_type_str), 0x0, NULL, HFILL }},
2362 {&hf_lmp_filter[LMPF_VAL_TRACE_LOCAL_LEN],
2363 { "Local Trace Length", "lmp.trace.local_length", FT_UINT16, BASE_DEC,
2364 NULL, 0x0, NULL, HFILL }},
2365 {&hf_lmp_filter[LMPF_VAL_TRACE_LOCAL_MSG],
2366 { "Local Trace Message", "lmp.trace.local_msg", FT_STRING, BASE_NONE,
2367 NULL, 0x0, NULL, HFILL }},
2368 {&hf_lmp_filter[LMPF_VAL_TRACE_REMOTE_TYPE],
2369 { "Remote Trace Type", "lmp.trace.remote_type", FT_UINT16, BASE_DEC,
2370 VALS(lmp_trace_type_str), 0x0, NULL, HFILL }},
2371 {&hf_lmp_filter[LMPF_VAL_TRACE_REMOTE_LEN],
2372 { "Remote Trace Length", "lmp.trace.remote_length", FT_UINT16, BASE_DEC,
2373 NULL, 0x0, NULL, HFILL }},
2374 {&hf_lmp_filter[LMPF_VAL_TRACE_REMOTE_MSG],
2375 { "Remote Trace Message", "lmp.trace.remote_msg", FT_STRING, BASE_NONE,
2376 NULL, 0x0, NULL, HFILL }},
2377
2378 {&hf_lmp_filter[LMPF_VAL_TRACE_REQ_TYPE],
2379 { "Trace Type", "lmp.trace_req.type", FT_UINT16, BASE_DEC,
2380 VALS(lmp_trace_type_str), 0x0, NULL, HFILL }},
2381
2382 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_SP_FLAGS],
2383 { "Service Config - Supported Signalling Protocols",
2384 "lmp.service_config.sp", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2385
2386 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_SP_FLAGS_RSVP],
2387 { "RSVP is supported", "lmp.service_config.sp.rsvp",
2388 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2389
2390 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_SP_FLAGS_LDP],
2391 { "LDP is supported", "lmp.service_config.sp.ldp",
2392 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2393
2394 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS],
2395 { "Client Port Service Attributes", "lmp.service_config.cpsa",
2396 FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2397
2398 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_PATH_OVERHEAD],
2399 { "Path/VC Overhead Transparency Supported",
2400 "lmp.service_config.cpsa.path_overhead",
2401 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2402
2403 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_LINE_OVERHEAD],
2404 { "Line/MS Overhead Transparency Supported",
2405 "lmp.service_config.cpsa.line_overhead",
2406 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2407
2408 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_TP_FLAGS_SECTION_OVERHEAD],
2409 { "Section/RS Overhead Transparency Supported",
2410 "lmp.service_config.cpsa.section_overhead",
2411 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
2412
2413 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_CCT_FLAGS],
2414 { "Contiguous Concatenation Types", "lmp.service_config.cct",
2415 FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2416
2417 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_CCT_FLAGS_CC_SUPPORTED],
2418 { "Contiguous Concatenation Types Supported",
2419 "lmp.service_config.cpsa.line_overhead",
2420 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2421
2422 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MIN_NCC],
2423 { "Minimum Number of Contiguously Concatenated Components",
2424 "lmp.service_config.cpsa.min_ncc",
2425 FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2426
2427 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MAX_NCC],
2428 { "Maximum Number of Contiguously Concatenated Components",
2429 "lmp.service_config.cpsa.max_ncc",
2430 FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2431
2432 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MIN_NVC],
2433 { "Maximum Number of Contiguously Concatenated Components",
2434 "lmp.service_config.cpsa.min_nvc",
2435 FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2436
2437 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_MAX_NVC],
2438 { "Minimum Number of Virtually Concatenated Components",
2439 "lmp.service_config.cpsa.max_nvc",
2440 FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2441
2442 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_CPSA_INTERFACE_ID],
2443 { "Local interface id of the client interface referred to",
2444 "lmp.service_config.cpsa.local_ifid",
2445 FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2446
2447 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS],
2448 { "Network Transparency Flags",
2449 "lmp.service_config.nsa.transparency",
2450 FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2451
2452 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS_SOH],
2453 { "Standard SOH/RSOH transparency supported",
2454 "lmp.service_config.nsa.transparency.soh",
2455 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2456
2457 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TRANSPARENCY_FLAGS_LOH],
2458 { "Standard LOH/MSOH transparency supported",
2459 "lmp.service_config.nsa.transparency.loh",
2460 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2461
2462 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TCM_FLAGS],
2463 { "TCM Monitoring",
2464 "lmp.service_config.nsa.tcm",
2465 FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2466
2467 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_TCM_FLAGS_TCM_SUPPORTED],
2468 { "TCM Monitoring Supported",
2469 "lmp.service_config.nsa.transparency.tcm",
2470 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2471
2472 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS],
2473 { "Network Diversity Flags",
2474 "lmp.service_config.nsa.diversity",
2475 FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2476
2477 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_NODE],
2478 { "Node diversity supported",
2479 "lmp.service_config.nsa.diversity.node",
2480 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2481
2482 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_LINK],
2483 { "Link diversity supported",
2484 "lmp.service_config.nsa.diversity.link",
2485 FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2486
2487 {&hf_lmp_filter[LMPF_VAL_SERVICE_CONFIG_NSA_NETWORK_DIVERSITY_FLAGS_SRLG],
2488 { "SRLG diversity supported",
2489 "lmp.service_config.nsa.diversity.srlg",
2490 FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
2491
2492 {&hf_lmp_filter[LMPF_VAL_LOCAL_DA_DCN_ADDR],
2493 { "Local DA DCN Address", "lmp.local_da_dcn_addr", FT_IPv4, BASE_NONE, NULL, 0x0,
2494 NULL, HFILL }},
2495 {&hf_lmp_filter[LMPF_VAL_REMOTE_DA_DCN_ADDR],
2496 { "Remote DA DCN Address", "lmp.remote_da_dcn_addr", FT_IPv4, BASE_NONE, NULL, 0x0,
2497 NULL, HFILL }},
2498
2499 {&hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_NODE_ID],
2500 { "Node ID", "lmp.local_lad_node_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2501 NULL, HFILL }},
2502 {&hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_AREA_ID],
2503 { "Area ID", "lmp.local_lad_area_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2504 NULL, HFILL }},
2505 {&hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_TE_LINK_ID],
2506 { "TE Link ID", "lmp.local_lad_telink_id", FT_UINT32, BASE_DEC, NULL, 0x0,
2507 NULL, HFILL }},
2508 {&hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_COMPONENT_ID],
2509 { "Component Link ID", "lmp.local_lad_comp_id", FT_UINT32, BASE_DEC, NULL, 0x0,
2510 NULL, HFILL }},
2511 {&hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_SC_PC_ID],
2512 { "SC PC ID", "lmp.local_lad_sc_pc_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2513 NULL, HFILL }},
2514 {&hf_lmp_filter[LMPF_VAL_LOCAL_LAD_INFO_SC_PC_ADDR],
2515 { "SC PC Address", "lmp.local_lad_sc_pc_addr", FT_IPv4, BASE_NONE, NULL, 0x0,
2516 NULL, HFILL }},
2517 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ],
2518 { "Subobject", "lmp.lad_info_subobj", FT_NONE, BASE_NONE, NULL, 0x0,
2519 NULL, HFILL }},
2520 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_PRI_AREA_ID],
2521 { "SC PC Address", "lmp.lad_pri_area_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2522 NULL, HFILL }},
2523 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_PRI_RC_PC_ID],
2524 { "SC PC Address", "lmp.lad_pri_rc_pc_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2525 NULL, HFILL }},
2526 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_PRI_RC_PC_ADDR],
2527 { "SC PC Address", "lmp.lad_pri_rc_pc_addr", FT_IPv4, BASE_NONE, NULL, 0x0,
2528 NULL, HFILL }},
2529 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SEC_AREA_ID],
2530 { "SC PC Address", "lmp.lad_sec_area_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2531 NULL, HFILL }},
2532 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SEC_RC_PC_ID],
2533 { "SC PC Address", "lmp.lad_sec_rc_pc_id", FT_IPv4, BASE_NONE, NULL, 0x0,
2534 NULL, HFILL }},
2535 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SEC_RC_PC_ADDR],
2536 { "SC PC Address", "lmp.lad_sec_rc_pc_addr", FT_IPv4, BASE_NONE, NULL, 0x0,
2537 NULL, HFILL }},
2538 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_SWITCHING_TYPE],
2539 { "Interface Switching Capability", "lmp.lad_switching", FT_UINT8, BASE_DEC|BASE_RANGE_STRING,
2540 RVALS(gmpls_switching_type_rvals), 0x0, NULL, HFILL }},
2541 {&hf_lmp_filter[LMPF_VAL_LAD_INFO_SUBOBJ_LSP_ENCODING],
2542 { "LSP Encoding Type", "lmp.lad_encoding", FT_UINT8, BASE_DEC|BASE_RANGE_STRING,
2543 RVALS(gmpls_lsp_enc_rvals), 0x0, NULL, HFILL }},
2544 {&hf_lmp_filter[LMPF_CHECKSUM],
2545 { "Message Checksum", "lmp.checksum", FT_UINT16, BASE_HEX, NULL, 0x0,
2546 NULL, HFILL }},
2547 {&hf_lmp_filter[LMPF_CHECKSUM_STATUS],
2548 { "Checksum Status", "lmp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
2549 NULL, HFILL }},
2550 {&hf_lmp_data,
2551 { "Data", "lmp.data", FT_BYTES, BASE_NONE, NULL, 0x0,
2552 NULL, HFILL }},
2553
2554 /* Generated from convert_proto_tree_add_text.pl */
2555 { &hf_lmp_version, { "LMP Version", "lmp.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2556 { &hf_lmp_header_flags, { "Flags", "lmp.header_flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2557 { &hf_lmp_header_length, { "Length", "lmp.header_length", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_byte_bytes, 0x0, NULL, HFILL }},
2558 { &hf_lmp_negotiable, { "Negotiable", "lmp.negotiable", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80, NULL, HFILL }},
2559 { &hf_lmp_object_length, { "Length", "lmp.object_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2560 { &hf_lmp_object_class, { "Object Class", "lmp.object_class", FT_UINT8, BASE_DEC, VALS(lmp_class_vals), 0x0, NULL, HFILL }},
2561 { &hf_lmp_verify_interval, { "Verify Interval", "lmp.verify_interval", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_milliseconds, 0x0, NULL, HFILL }},
2562 { &hf_lmp_number_of_data_links, { "Number of Data Links", "lmp.number_of_data_links", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2563 { &hf_lmp_verify_transport_mechanism, { "Verify Transport Mechanism", "lmp.verify_transport_mechanism", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2564 { &hf_lmp_transmission_rate, { "Transmission Rate", "lmp.transmission_rate", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2565 { &hf_lmp_wavelength, { "Wavelength", "lmp.wavelength", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2566 { &hf_lmp_verifydeadinterval, { "VerifyDeadInterval", "lmp.verifydeadinterval", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_milliseconds, 0x0, NULL, HFILL }},
2567 { &hf_lmp_verify_transport_response, { "Verify Transport Response", "lmp.verify_transport_response", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2568 { &hf_lmp_data_link_local_id_ipv6, { "Data-Link Local ID - IPv6", "lmp.data_link.local_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2569 { &hf_lmp_data_link_remote_id_ipv6, { "Data-Link Remote ID - IPv6", "lmp.data_link.remote_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2570 { &hf_lmp_subobject_type, { "Subobject Type", "lmp.subobject_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2571 { &hf_lmp_subobject_length, { "Subobject Length", "lmp.subobject_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2572 { &hf_lmp_minimum_reservable_bandwidth, { "Minimum Reservable Bandwidth", "lmp.minimum_reservable_bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2573 { &hf_lmp_maximum_reservable_bandwidth, { "Maximum Reservable Bandwidth", "lmp.maximum_reservable_bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2574 { &hf_lmp_interface_id_ipv4, { "Interface ID - IPv4", "lmp.interface_id.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2575 { &hf_lmp_interface_id_ipv6, { "Interface ID - IPv6", "lmp.interface_id.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2576 { &hf_lmp_interface_id_unnumbered, { "Interface ID - Unnumbered", "lmp.interface_id.id_unnumbered", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2577 { &hf_lmp_link, { "Link", "lmp.link", FT_BOOLEAN, 32, TFS(&tfs_active_monitoring_not_allocated), 0x80000000, NULL, HFILL }},
2578 { &hf_lmp_channel_status, { "Channel Status", "lmp.channel_status", FT_UINT32, BASE_DEC, VALS(channel_status_str), 0x7fffffff, NULL, HFILL }},
2579 { &hf_lmp_uni_version, { "UNI Version", "lmp.uni_version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2580 { &hf_lmp_link_type, { "Link Type", "lmp.link_type", FT_UINT8, BASE_DEC, VALS(service_attribute_link_type_str), 0x0, NULL, HFILL }},
2581 { &hf_lmp_signal_types_sdh, { "Signal Types", "lmp.signal_types", FT_UINT8, BASE_DEC, VALS(service_attribute_signal_types_sdh_str), 0x0, NULL, HFILL }},
2582 { &hf_lmp_signal_types_sonet, { "Signal Types", "lmp.signal_types", FT_UINT8, BASE_DEC, VALS(service_attribute_signal_types_sonet_str), 0x0, NULL, HFILL }},
2583 { &hf_lmp_free_timeslots, { "Free timeslots", "lmp.free_timeslots", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2584 };
2585
2586 static ei_register_info ei[] = {
2587 { &ei_lmp_checksum_incorrect, { "lmp.checksum.incorrect", PI_PROTOCOL, PI_WARN, "Incorrect checksum", EXPFILL }},
2588 { &ei_lmp_invalid_msg_type, { "lmp.invalid_msg_type", PI_PROTOCOL, PI_WARN, "Invalid message type", EXPFILL }},
2589 { &ei_lmp_invalid_class, { "lmp.invalid_class", PI_PROTOCOL, PI_WARN, "Invalid class", EXPFILL }},
2590 { &ei_lmp_trace_len, { "lmp.trace.len_invalid", PI_PROTOCOL, PI_WARN, "Invalid Trace Length", EXPFILL }},
2591 { &ei_lmp_obj_len, { "lmp.obj.len_invalid", PI_PROTOCOL, PI_WARN, "Invalid Object Length", EXPFILL }}
2592 };
2593
2594 expert_module_t* expert_lmp;
2595
2596 for (i=0; i<NUM_LMP_SUBTREES; i++) {
2597 lmp_subtree[i] = -1;
2598 ett[i] = &lmp_subtree[i];
2599 }
2600
2601
2602 proto_lmp = proto_register_protocol("Link Management Protocol (LMP)", "LMP", "lmp");
2603
2604 expert_lmp = expert_register_protocol(proto_lmp);
2605 expert_register_field_array(expert_lmp, ei, array_length(ei));
2606
2607 proto_register_field_array(proto_lmp, lmpf_info, array_length(lmpf_info));
2608 proto_register_subtree_array(ett, array_length(ett));
2609
2610 register_lmp_prefs();
2611 }
2612
2613 void
proto_reg_handoff_lmp(void)2614 proto_reg_handoff_lmp(void)
2615 {
2616 lmp_handle = create_dissector_handle(dissect_lmp, proto_lmp);
2617 dissector_add_uint_with_preference("udp.port", UDP_PORT_LMP_DEFAULT, lmp_handle);
2618 }
2619
2620 /*
2621 * Editor modelines - https://www.wireshark.org/tools/modelines.html
2622 *
2623 * Local variables:
2624 * c-basic-offset: 4
2625 * tab-width: 8
2626 * indent-tabs-mode: nil
2627 * End:
2628 *
2629 * vi: set shiftwidth=4 tabstop=8 expandtab:
2630 * :indentSize=4:tabSize=8:noTabs=true:
2631 */
2632