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