2 * Routines for LMP packet disassembly
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
6 * $Id: packet-lmp.c,v 1.18 2003/12/21 04:31:56 jmayer Exp $
8 * Ethereal - Network traffic analyzer
9 * By Gerald Combs <gerald@ethereal.com>
10 * Copyright 1998 Gerald Combs
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 * LMP as a standard has shown a remarkable ability to get completely rewritten
29 * across minor versions of the draft. This file currently implements
30 * three versions of LMP; IP based versions described in draft-ietf-ccamp-lmp-02.txt and
31 * draft-ietf-ccamp-lmp-03.txt, and the new UDP based version in draft-ietf-ccamp-lmp-09.txt.
32 * The -09 version is the default; the version being dissected can be changed from
33 * the LMP protocol preferences
51 #include <epan/tvbuff.h>
52 #include <epan/packet.h>
58 #include "packet-ip.h"
59 #include "packet-rsvp.h"
60 #include "packet-frame.h"
62 static int proto_lmp = -1;
63 #define LMP_VER_DRAFT_CCAMP_02 2
64 #define LMP_VER_DRAFT_CCAMP_03 3
65 #define LMP_VER_DRAFT_CCAMP_09 9
66 static int lmp_draft_ver = LMP_VER_DRAFT_CCAMP_09;
68 #define IP_PROTO_LMP 140
69 #define UDP_PORT_LMP_DEFAULT 49998
70 static int lmp_udp_port = UDP_PORT_LMP_DEFAULT;
71 static int lmp_udp_port_config = UDP_PORT_LMP_DEFAULT;
73 static dissector_handle_t lmp_handle;
75 /*----------------------------------------------------------------------
84 LMP_MSG_BEGIN_VERIFY_ACK,
85 LMP_MSG_BEGIN_VERIFY_NACK,
87 LMP_MSG_END_VERIFY_ACK,
89 LMP_MSG_TEST_STATUS_SUCCESS,
90 LMP_MSG_TEST_STATUS_FAILURE,
91 LMP_MSG_TEST_STATUS_ACK,
93 LMP_MSG_LINK_SUMMARY_ACK,
94 LMP_MSG_LINK_SUMMARY_NACK,
95 LMP_MSG_CHANNEL_STATUS,
96 LMP_MSG_CHANNEL_STATUS_ACK,
97 LMP_MSG_CHANNEL_STATUS_REQ,
98 LMP_MSG_CHANNEL_STATUS_RESP
101 static value_string message_type_vals[] = {
102 {LMP_MSG_CONFIG, "Config Message. "},
103 {LMP_MSG_CONFIG_ACK, "ConfigAck Message. "},
104 {LMP_MSG_CONFIG_NACK, "ConfigNack Message. "},
105 {LMP_MSG_HELLO, "Hello Message. "},
106 {LMP_MSG_BEGIN_VERIFY, "BeginVerify Message. "},
107 {LMP_MSG_BEGIN_VERIFY_ACK, "BeginVerifyAck Message. "},
108 {LMP_MSG_BEGIN_VERIFY_NACK, "BeginVerifyNack Message. "},
109 {LMP_MSG_END_VERIFY, "EndVerify Message. "},
110 {LMP_MSG_END_VERIFY_ACK, "EndVerifyAck Message. "},
111 {LMP_MSG_TEST, "Test Message. "},
112 {LMP_MSG_TEST_STATUS_SUCCESS, "TestStatusSuccess Message. "},
113 {LMP_MSG_TEST_STATUS_FAILURE, "TestStatusFailure Message. "},
114 {LMP_MSG_TEST_STATUS_ACK, "TestStatusAck Message. "},
115 {LMP_MSG_LINK_SUMMARY, "LinkSummary Message. "},
116 {LMP_MSG_LINK_SUMMARY_ACK, "LinkSummaryAck Message. "},
117 {LMP_MSG_LINK_SUMMARY_NACK, "LinkSummaryNack Message. "},
118 {LMP_MSG_CHANNEL_STATUS, "ChannelStatus Message. "},
119 {LMP_MSG_CHANNEL_STATUS_ACK, "ChannelStatusAck Message. "},
120 {LMP_MSG_CHANNEL_STATUS_REQ, "ChannelStatusRequest Message. "},
121 {LMP_MSG_CHANNEL_STATUS_RESP, "ChannelStatusResponse Message. "},
125 /*------------------------------------------------------------------------------
128 #define LMP_CLASS_NULL 0
130 #define LMP_CLASS_LOCAL_CCID 1
131 #define LMP_CLASS_REMOTE_CCID 2
132 #define LMP_CLASS_LOCAL_NODE_ID 3
133 #define LMP_CLASS_REMOTE_NODE_ID 4
134 #define LMP_CLASS_LOCAL_LINK_ID 5
135 #define LMP_CLASS_REMOTE_LINK_ID 6
136 #define LMP_CLASS_LOCAL_INTERFACE_ID 7
137 #define LMP_CLASS_REMOTE_INTERFACE_ID 8
138 #define LMP_CLASS_MESSAGE_ID 9
139 #define LMP_CLASS_MESSAGE_ID_ACK 10
140 #define LMP_CLASS_CONFIG 11
141 #define LMP_CLASS_HELLO 12
142 #define LMP_CLASS_BEGIN_VERIFY 13
143 #define LMP_CLASS_BEGIN_VERIFY_ACK 14
144 #define LMP_CLASS_VERIFY_ID 15
145 #define LMP_CLASS_TE_LINK 16
146 #define LMP_CLASS_DATA_LINK 17
147 #define LMP_CLASS_CHANNEL_STATUS 18
148 #define LMP_CLASS_CHANNEL_STATUS_REQUEST 19
149 #define LMP_CLASS_ERROR 20
150 #define LMP_CLASS_MAX 20
152 #define LMP_09_CLASS_CCID 1
153 #define LMP_09_CLASS_NODE_ID 2
154 #define LMP_09_CLASS_LINK_ID 3
155 #define LMP_09_CLASS_INTERFACE_ID 4
156 #define LMP_09_CLASS_MESSAGE_ID 5
157 #define LMP_09_CLASS_CONFIG 6
158 #define LMP_09_CLASS_HELLO 7
159 #define LMP_09_CLASS_BEGIN_VERIFY 8
160 #define LMP_09_CLASS_BEGIN_VERIFY_ACK 9
161 #define LMP_09_CLASS_VERIFY_ID 10
162 #define LMP_09_CLASS_TE_LINK 11
163 #define LMP_09_CLASS_DATA_LINK 12
164 #define LMP_09_CLASS_CHANNEL_STATUS 13
165 #define LMP_09_CLASS_CHANNEL_STATUS_REQUEST 14
166 #define LMP_09_CLASS_ERROR 20
167 #define LMP_09_CLASS_MAX 15
169 static value_string lmp_class_vals[] = {
171 {LMP_CLASS_LOCAL_CCID, "LOCAL_CCID"},
172 {LMP_CLASS_REMOTE_CCID, "REMOTE_CCID"},
173 {LMP_CLASS_LOCAL_NODE_ID, "LOCAL_NODE_ID"},
174 {LMP_CLASS_REMOTE_NODE_ID, "REMOTE_NODE_ID"},
175 {LMP_CLASS_LOCAL_LINK_ID, "LOCAL_LINK_ID"},
176 {LMP_CLASS_REMOTE_LINK_ID, "REMOTE_LINK_ID"},
177 {LMP_CLASS_LOCAL_INTERFACE_ID, "LOCAL_INTERFACE_ID"},
178 {LMP_CLASS_REMOTE_INTERFACE_ID, "REMOTE_INTERFACE_ID"},
179 {LMP_CLASS_MESSAGE_ID, "MESSAGE_ID"},
180 {LMP_CLASS_MESSAGE_ID_ACK, "MESSAGE_ID_ACK"},
181 {LMP_CLASS_CONFIG, "CONFIG"},
182 {LMP_CLASS_HELLO, "HELLO"},
183 {LMP_CLASS_BEGIN_VERIFY, "BEGIN_VERIFY"},
184 {LMP_CLASS_BEGIN_VERIFY_ACK, "BEGIN_VERIFY_ACK"},
185 {LMP_CLASS_VERIFY_ID, "VERIFY_ID"},
186 {LMP_CLASS_TE_LINK, "TE_LINK"},
187 {LMP_CLASS_DATA_LINK, "DATA_LINK"},
188 {LMP_CLASS_CHANNEL_STATUS, "CHANNEL_STATUS"},
189 {LMP_CLASS_CHANNEL_STATUS_REQUEST, "CHANNEL_STATUS_REQUEST"},
190 {LMP_CLASS_ERROR, "ERROR"},
193 static value_string lmp_09_class_vals[] = {
195 {LMP_09_CLASS_CCID, "CCID"},
196 {LMP_09_CLASS_NODE_ID, "NODE_ID"},
197 {LMP_09_CLASS_LINK_ID, "LINK_ID"},
198 {LMP_09_CLASS_INTERFACE_ID, "INTERFACE_ID"},
199 {LMP_09_CLASS_MESSAGE_ID, "MESSAGE_ID"},
200 {LMP_09_CLASS_CONFIG, "CONFIG"},
201 {LMP_09_CLASS_HELLO, "HELLO"},
202 {LMP_09_CLASS_BEGIN_VERIFY, "BEGIN_VERIFY"},
203 {LMP_09_CLASS_BEGIN_VERIFY_ACK, "BEGIN_VERIFY_ACK"},
204 {LMP_09_CLASS_VERIFY_ID, "VERIFY_ID"},
205 {LMP_09_CLASS_TE_LINK, "TE_LINK"},
206 {LMP_09_CLASS_DATA_LINK, "DATA_LINK"},
207 {LMP_09_CLASS_CHANNEL_STATUS, "CHANNEL_STATUS"},
208 {LMP_09_CLASS_CHANNEL_STATUS_REQUEST, "CHANNEL_STATUS_REQUEST"},
209 {LMP_09_CLASS_ERROR, "ERROR"},
213 #define VALID_CLASS(class) ((class) > LMP_CLASS_NULL && (class) < LMP_CLASS_MAX)
214 #define VALID_09_CLASS(class) (((class) > LMP_CLASS_NULL && (class) < LMP_09_CLASS_CHANNEL_STATUS_REQUEST) || (class)==LMP_09_CLASS_ERROR)
216 /*------------------------------------------------------------------------------
217 * Other constants & stuff
221 static const value_string channel_status_str[] = {
222 {1, "Signal Okay (OK)"},
223 {2, "Signal Degraded (SD)"},
224 {3, "Signal Failed (SF)"},
226 static const value_string channel_status_short_str[] = {
232 /*------------------------------------------------------------------------------
236 enum lmp_filter_keys {
238 /* Message types ---------------- */
243 LMPF_MSG_CONFIG_NACK,
245 LMPF_MSG_BEGIN_VERIFY,
246 LMPF_MSG_BEGIN_VERIFY_ACK,
247 LMPF_MSG_BEGIN_VERIFY_NACK,
249 LMPF_MSG_END_VERIFY_ACK,
251 LMPF_MSG_TEST_STATUS_SUCCESS,
252 LMPF_MSG_TEST_STATUS_FAILURE,
253 LMPF_MSG_TEST_STATUS_ACK,
254 LMPF_MSG_LINK_SUMMARY,
255 LMPF_MSG_LINK_SUMMARY_ACK,
256 LMPF_MSG_LINK_SUMMARY_NACK,
257 LMPF_MSG_CHANNEL_STATUS,
258 LMPF_MSG_CHANNEL_STATUS_ACK,
259 LMPF_MSG_CHANNEL_STATUS_REQ,
260 LMPF_MSG_CHANNEL_STATUS_RESP,
262 /* LMP Message Header Fields ------------------ */
264 LMPF_HDR_FLAGS_CC_DOWN,
265 LMPF_HDR_FLAGS_REBOOT,
267 /* LMP Object Class Filters -------------------- */
270 LMPF_CLASS_LOCAL_CCID,
271 LMPF_CLASS_REMOTE_CCID,
272 LMPF_CLASS_LOCAL_NODE_ID,
273 LMPF_CLASS_REMOTE_NODE_ID,
274 LMPF_CLASS_LOCAL_LINK_ID,
275 LMPF_CLASS_REMOTE_LINK_ID,
276 LMPF_CLASS_LOCAL_INTERFACE_ID,
277 LMPF_CLASS_REMOTE_INTERFACE_ID,
278 LMPF_CLASS_MESSAGE_ID,
279 LMPF_CLASS_MESSAGE_ID_ACK,
282 LMPF_CLASS_BEGIN_VERIFY,
283 LMPF_CLASS_BEGIN_VERIFY_ACK,
284 LMPF_CLASS_VERIFY_ID,
286 LMPF_CLASS_DATA_LINK,
287 LMPF_CLASS_CHANNEL_STATUS,
288 LMPF_CLASS_CHANNEL_STATUS_REQUEST,
294 LMPF_09_CLASS_NODE_ID,
295 LMPF_09_CLASS_LINK_ID,
296 LMPF_09_CLASS_INTERFACE_ID,
297 LMPF_09_CLASS_MESSAGE_ID,
298 LMPF_09_CLASS_CONFIG,
300 LMPF_09_CLASS_BEGIN_VERIFY,
301 LMPF_09_CLASS_BEGIN_VERIFY_ACK,
302 LMPF_09_CLASS_VERIFY_ID,
303 LMPF_09_CLASS_TE_LINK,
304 LMPF_09_CLASS_DATA_LINK,
305 LMPF_09_CLASS_CHANNEL_STATUS,
306 LMPF_09_CLASS_CHANNEL_STATUS_REQUEST,
311 LMPF_VAL_REMOTE_CCID,
312 LMPF_VAL_LOCAL_NODE_ID,
313 LMPF_VAL_REMOTE_NODE_ID,
314 LMPF_VAL_LOCAL_LINK_ID_IPV4,
315 LMPF_VAL_LOCAL_LINK_ID_IPV6,
316 LMPF_VAL_LOCAL_LINK_ID_UNNUM,
317 LMPF_VAL_REMOTE_LINK_ID_IPV4,
318 LMPF_VAL_REMOTE_LINK_ID_IPV6,
319 LMPF_VAL_REMOTE_LINK_ID_UNNUM,
320 LMPF_VAL_LOCAL_INTERFACE_ID_IPV4,
321 LMPF_VAL_LOCAL_INTERFACE_ID_IPV6,
322 LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM,
323 LMPF_VAL_REMOTE_INTERFACE_ID_IPV4,
324 LMPF_VAL_REMOTE_INTERFACE_ID_IPV6,
325 LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM,
327 LMPF_VAL_MESSAGE_ID_ACK,
328 LMPF_VAL_CONFIG_HELLO,
329 LMPF_VAL_CONFIG_HELLO_DEAD,
330 LMPF_VAL_HELLO_TXSEQ,
331 LMPF_VAL_HELLO_RXSEQ,
333 LMPF_VAL_BEGIN_VERIFY_FLAGS,
334 LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS,
335 LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE,
336 LMPF_VAL_BEGIN_VERIFY_INTERVAL,
337 LMPF_VAL_BEGIN_VERIFY_ENCTYPE,
338 LMPF_VAL_BEGIN_VERIFY_TRANSPORT,
339 LMPF_VAL_BEGIN_VERIFY_TRANSMISSION_RATE,
340 LMPF_VAL_BEGIN_VERIFY_WAVELENGTH,
343 LMPF_VAL_TE_LINK_FLAGS,
344 LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT,
345 LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY,
346 LMPF_VAL_TE_LINK_LOCAL_IPV4,
347 LMPF_VAL_TE_LINK_LOCAL_UNNUM,
348 LMPF_VAL_TE_LINK_REMOTE_IPV4,
349 LMPF_VAL_TE_LINK_REMOTE_UNNUM,
351 LMPF_VAL_DATA_LINK_FLAGS,
352 LMPF_VAL_DATA_LINK_FLAGS_PORT,
353 LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED,
354 LMPF_VAL_DATA_LINK_LOCAL_IPV4,
355 LMPF_VAL_DATA_LINK_LOCAL_UNNUM,
356 LMPF_VAL_DATA_LINK_REMOTE_IPV4,
357 LMPF_VAL_DATA_LINK_REMOTE_UNNUM,
358 LMPF_VAL_DATA_LINK_SUBOBJ,
359 LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE,
360 LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING,
363 LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK,
364 LMPF_VAL_ERROR_VERIFY_UNWILLING,
365 LMPF_VAL_ERROR_VERIFY_TRANSPORT,
366 LMPF_VAL_ERROR_VERIFY_TE_LINK_ID,
367 LMPF_VAL_ERROR_VERIFY_UNKNOWN_CTYPE,
368 LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS,
369 LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE,
370 LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK,
371 LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK,
372 LMPF_VAL_ERROR_SUMMARY_UNKNOWN_TEL_CTYPE,
373 LMPF_VAL_ERROR_SUMMARY_UNKNOWN_DL_CTYPE,
374 LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID,
375 LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS,
376 LMPF_VAL_ERROR_CONFIG_RENEGOTIATE,
377 LMPF_VAL_ERROR_CONFIG_BAD_CCID,
379 LMPF_VAL_SVCCFG_SIGPROTO_PROTO,
380 LMPF_VAL_SVCCFG_SIGPROTO_UNI_VERSION,
381 LMPF_VAL_SVCCFG_PORTATTR_LINK_TYPE,
382 LMPF_VAL_SVCCFG_PORTATTR_SIGNAL_TYPE,
383 LMPF_VAL_SVCCFG_PORTATTR_TP_TRANSPARENCY,
384 LMPF_VAL_SVCCFG_PORTATTR_MAX_NCC,
385 LMPF_VAL_SVCCFG_PORTATTR_MIN_NCC,
386 LMPF_VAL_SVCCFG_PORTATTR_MAX_NVC,
387 LMPF_VAL_SVCCFG_PORTATTR_MIN_NVC,
388 LMPF_VAL_SVCCFG_PORTATTR_INTFC_ID,
389 LMPF_VAL_SVCCFG_TRANSP_TRANSPARENCY,
390 LMPF_VAL_SVCCFG_TRANSP_TCM,
391 LMPF_VAL_SVCCFG_DIVERSITY_DIVERSITY,
396 static int lmp_filter[LMPF_MAX];
398 static hf_register_info lmpf_info[] = {
400 /* Message type number */
401 {&lmp_filter[LMPF_MSG],
402 { "Message Type", "lmp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
405 /* Message type shorthands */
406 {&lmp_filter[LMPF_MSG_CONFIG],
407 { "Config Message", "lmp.msg.config", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
410 {&lmp_filter[LMPF_MSG_CONFIG_ACK],
411 { "ConfigAck Message", "lmp.msg.configack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
414 {&lmp_filter[LMPF_MSG_CONFIG_NACK],
415 { "ConfigNack Message", "lmp.msg.confignack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
418 {&lmp_filter[LMPF_MSG_HELLO],
419 { "HELLO Message", "lmp.msg.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
422 {&lmp_filter[LMPF_MSG_BEGIN_VERIFY],
423 { "BeginVerify Message", "lmp.msg.beginverify", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
426 {&lmp_filter[LMPF_MSG_BEGIN_VERIFY_ACK],
427 { "BeginVerifyAck Message", "lmp.msg.beginverifyack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
430 {&lmp_filter[LMPF_MSG_BEGIN_VERIFY_NACK],
431 { "BeginVerifyNack Message", "lmp.msg.beginverifynack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
434 {&lmp_filter[LMPF_MSG_END_VERIFY],
435 { "EndVerify Message", "lmp.msg.endverify", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
438 {&lmp_filter[LMPF_MSG_END_VERIFY_ACK],
439 { "EndVerifyAck Message", "lmp.msg.endverifyack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
442 {&lmp_filter[LMPF_MSG_TEST],
443 { "Test Message", "lmp.msg.test", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
446 {&lmp_filter[LMPF_MSG_TEST_STATUS_SUCCESS],
447 { "TestStatusSuccess Message", "lmp.msg.teststatussuccess", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
450 {&lmp_filter[LMPF_MSG_TEST_STATUS_FAILURE],
451 { "TestStatusFailure Message", "lmp.msg.teststatusfailure", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
454 {&lmp_filter[LMPF_MSG_TEST_STATUS_ACK],
455 { "TestStatusAck Message", "lmp.msg.teststatusack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
458 {&lmp_filter[LMPF_MSG_LINK_SUMMARY],
459 { "LinkSummary Message", "lmp.msg.linksummary", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
462 {&lmp_filter[LMPF_MSG_LINK_SUMMARY_ACK],
463 { "LinkSummaryAck Message", "lmp.msg.linksummaryack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
466 {&lmp_filter[LMPF_MSG_LINK_SUMMARY_NACK],
467 { "LinkSummaryNack Message", "lmp.msg.linksummarynack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
470 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS],
471 { "ChannelStatus Message", "lmp.msg.channelstatus", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
474 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS_ACK],
475 { "ChannelStatusAck Message", "lmp.msg.channelstatusack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
478 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS_REQ],
479 { "ChannelStatusRequest Message", "lmp.msg.channelstatusrequest", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
482 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS_RESP],
483 { "ChannelStatusResponse Message", "lmp.msg.channelstatusresponse", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
487 /* LMP Message Header Fields ------------------- */
489 {&lmp_filter[LMPF_HDR_FLAGS],
490 { "LMP Header - Flags", "lmp.hdr.flags", FT_UINT8, BASE_DEC, NULL, 0x0,
493 {&lmp_filter[LMPF_HDR_FLAGS_CC_DOWN],
494 { "ControlChannelDown", "lmp.hdr.ccdown", FT_BOOLEAN, 8, NULL, 0x01,
497 {&lmp_filter[LMPF_HDR_FLAGS_REBOOT],
498 { "Reboot", "lmp.hdr.reboot", FT_BOOLEAN, 8, NULL, 0x02,
501 /* LMP object class filters ------------------------------- */
503 {&lmp_filter[LMPF_OBJECT],
504 { "LOCAL_CCID", "lmp.object", FT_UINT8, BASE_DEC, NULL, 0x0,
507 {&lmp_filter[LMPF_CLASS_LOCAL_CCID],
508 { "Local CCID", "lmp.obj.ccid", FT_NONE, BASE_NONE, NULL, 0x0,
510 {&lmp_filter[LMPF_CLASS_REMOTE_CCID],
511 { "Remote CCID", "lmp.obj.ccid", FT_NONE, BASE_NONE, NULL, 0x0,
513 {&lmp_filter[LMPF_CLASS_LOCAL_NODE_ID],
514 { "Local NODE_ID", "lmp.obj.Nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
516 {&lmp_filter[LMPF_CLASS_REMOTE_NODE_ID],
517 { "Remote NODE_ID", "lmp.obj.Nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
519 {&lmp_filter[LMPF_CLASS_LOCAL_LINK_ID],
520 { "Local LINK_ID", "lmp.obj.linkid", FT_NONE, BASE_NONE, NULL, 0x0,
522 {&lmp_filter[LMPF_CLASS_REMOTE_LINK_ID],
523 { "Remote LINK_ID", "lmp.obj.linkid", FT_NONE, BASE_NONE, NULL, 0x0,
525 {&lmp_filter[LMPF_CLASS_LOCAL_INTERFACE_ID],
526 { "Local INTERFACE_ID", "lmp.obj.interfaceid", FT_NONE, BASE_NONE, NULL, 0x0,
528 {&lmp_filter[LMPF_CLASS_REMOTE_INTERFACE_ID],
529 { "Remote INTERFACE_ID", "lmp.obj.interfaceid", FT_NONE, BASE_NONE, NULL, 0x0,
531 {&lmp_filter[LMPF_CLASS_MESSAGE_ID],
532 { "MESSAGE_ID", "lmp.obj.messageid", FT_NONE, BASE_NONE, NULL, 0x0,
534 {&lmp_filter[LMPF_CLASS_MESSAGE_ID_ACK],
535 { "MESSAGE_ID Ack", "lmp.obj.messageid", FT_NONE, BASE_NONE, NULL, 0x0,
537 {&lmp_filter[LMPF_CLASS_CONFIG],
538 { "CONFIG", "lmp.obj.config", FT_NONE, BASE_NONE, NULL, 0x0,
540 {&lmp_filter[LMPF_CLASS_HELLO],
541 { "HELLO", "lmp.obj.hello", FT_NONE, BASE_NONE, NULL, 0x0,
543 {&lmp_filter[LMPF_CLASS_BEGIN_VERIFY],
544 { "BEGIN_VERIFY", "lmp.obj.begin_verify", FT_NONE, BASE_NONE, NULL, 0x0,
546 {&lmp_filter[LMPF_CLASS_BEGIN_VERIFY_ACK],
547 { "BEGIN_VERIFY_ACK", "lmp.obj.begin_verify_ack", FT_NONE, BASE_NONE, NULL, 0x0,
549 {&lmp_filter[LMPF_CLASS_VERIFY_ID],
550 { "VERIFY_ID", "lmp.obj.verifyid", FT_NONE, BASE_NONE, NULL, 0x0,
553 {&lmp_filter[LMPF_CLASS_TE_LINK],
554 { "TE_LINK", "lmp.obj.te_link", FT_NONE, BASE_NONE, NULL, 0x0,
556 {&lmp_filter[LMPF_CLASS_DATA_LINK],
557 { "DATA_LINK", "lmp.obj.data_link", FT_NONE, BASE_NONE, NULL, 0x0,
560 {&lmp_filter[LMPF_CLASS_CHANNEL_STATUS],
561 { "CHANNEL_STATUS", "lmp.obj.channel_status", FT_NONE, BASE_NONE, NULL, 0x0,
563 {&lmp_filter[LMPF_CLASS_CHANNEL_STATUS_REQUEST],
564 { "CHANNEL_STATUS_REQUEST", "lmp.obj.channel_status_request", FT_NONE, BASE_NONE, NULL, 0x0,
566 {&lmp_filter[LMPF_CLASS_ERROR],
567 { "ERROR", "lmp.obj.error", FT_NONE, BASE_NONE, NULL, 0x0,
570 {&lmp_filter[LMPF_09_OBJECT],
571 { "LOCAL_CCID", "lmp.object", FT_UINT8, BASE_DEC, NULL, 0x0,
574 {&lmp_filter[LMPF_09_CLASS_CCID],
575 { "CCID", "lmp.obj.ccid", FT_NONE, BASE_NONE, NULL, 0x0,
577 {&lmp_filter[LMPF_09_CLASS_NODE_ID],
578 { "NODE_ID", "lmp.obj.Nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
580 {&lmp_filter[LMPF_09_CLASS_LINK_ID],
581 { "LINK_ID", "lmp.obj.linkid", FT_NONE, BASE_NONE, NULL, 0x0,
583 {&lmp_filter[LMPF_09_CLASS_INTERFACE_ID],
584 { "INTERFACE_ID", "lmp.obj.interfaceid", FT_NONE, BASE_NONE, NULL, 0x0,
586 {&lmp_filter[LMPF_09_CLASS_MESSAGE_ID],
587 { "MESSAGE_ID", "lmp.obj.messageid", FT_NONE, BASE_NONE, NULL, 0x0,
589 {&lmp_filter[LMPF_09_CLASS_CONFIG],
590 { "CONFIG", "lmp.obj.config", FT_NONE, BASE_NONE, NULL, 0x0,
592 {&lmp_filter[LMPF_09_CLASS_HELLO],
593 { "HELLO", "lmp.obj.hello", FT_NONE, BASE_NONE, NULL, 0x0,
595 {&lmp_filter[LMPF_09_CLASS_BEGIN_VERIFY],
596 { "BEGIN_VERIFY", "lmp.obj.begin_verify", FT_NONE, BASE_NONE, NULL, 0x0,
598 {&lmp_filter[LMPF_09_CLASS_BEGIN_VERIFY_ACK],
599 { "BEGIN_VERIFY_ACK", "lmp.obj.begin_verify_ack", FT_NONE, BASE_NONE, NULL, 0x0,
601 {&lmp_filter[LMPF_09_CLASS_VERIFY_ID],
602 { "VERIFY_ID", "lmp.obj.verifyid", FT_NONE, BASE_NONE, NULL, 0x0,
605 {&lmp_filter[LMPF_09_CLASS_TE_LINK],
606 { "TE_LINK", "lmp.obj.te_link", FT_NONE, BASE_NONE, NULL, 0x0,
608 {&lmp_filter[LMPF_09_CLASS_DATA_LINK],
609 { "DATA_LINK", "lmp.obj.data_link", FT_NONE, BASE_NONE, NULL, 0x0,
612 {&lmp_filter[LMPF_09_CLASS_CHANNEL_STATUS],
613 { "CHANNEL_STATUS", "lmp.obj.channel_status", FT_NONE, BASE_NONE, NULL, 0x0,
615 {&lmp_filter[LMPF_09_CLASS_CHANNEL_STATUS_REQUEST],
616 { "CHANNEL_STATUS_REQUEST", "lmp.obj.channel_status_request", FT_NONE, BASE_NONE, NULL, 0x0,
618 {&lmp_filter[LMPF_09_CLASS_ERROR],
619 { "ERROR", "lmp.obj.error", FT_NONE, BASE_NONE, NULL, 0x0,
622 /* Other LMP Value Filters ------------------------------ */
624 {&lmp_filter[LMPF_VAL_CTYPE],
625 { "Object C-Type", "lmp.obj.ctype", FT_UINT8, BASE_DEC, NULL, 0x0,
628 {&lmp_filter[LMPF_VAL_LOCAL_CCID],
629 { "Local CCID Value", "lmp.local_ccid", FT_UINT32, BASE_DEC, NULL, 0x0,
631 {&lmp_filter[LMPF_VAL_REMOTE_CCID],
632 { "Remote CCID Value", "lmp.remote_ccid", FT_UINT32, BASE_DEC, NULL, 0x0,
635 {&lmp_filter[LMPF_VAL_LOCAL_NODE_ID],
636 { "Local Node ID Value", "lmp.local_nodeid", FT_IPv4, BASE_NONE, NULL, 0x0,
638 {&lmp_filter[LMPF_VAL_REMOTE_NODE_ID],
639 { "Remote Node ID Value", "lmp.remote_nodeid", FT_IPv4, BASE_NONE, NULL, 0x0,
642 {&lmp_filter[LMPF_VAL_LOCAL_LINK_ID_IPV4],
643 { "Local Link ID - IPv4", "lmp.local_linkid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
645 {&lmp_filter[LMPF_VAL_LOCAL_LINK_ID_UNNUM],
646 { "Local Link ID - Unnumbered", "lmp.local_linkid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
648 {&lmp_filter[LMPF_VAL_REMOTE_LINK_ID_IPV4],
649 { "Remote Link ID - IPv4", "lmp.remote_linkid_ipv4", FT_UINT32, BASE_DEC, NULL, 0x0,
651 {&lmp_filter[LMPF_VAL_REMOTE_LINK_ID_UNNUM],
652 { "Remote Link ID - Unnumbered", "lmp.remote_linkid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
655 {&lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_IPV4],
656 { "Local Interface ID - IPv4", "lmp.local_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
658 {&lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM],
659 { "Local Interface ID - Unnumbered", "lmp.local_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
661 {&lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_IPV4],
662 { "Remote Interface ID - IPv4", "lmp.remote_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
664 {&lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM],
665 { "Remote Interface ID - Unnumbered", "lmp.remote_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
668 {&lmp_filter[LMPF_VAL_MESSAGE_ID],
669 { "Message-ID Value", "lmp.messageid", FT_UINT32, BASE_DEC, NULL, 0x0,
671 {&lmp_filter[LMPF_VAL_MESSAGE_ID_ACK],
672 { "Message-ID Ack Value", "lmp.messageid_ack", FT_UINT32, BASE_DEC, NULL, 0x0,
675 {&lmp_filter[LMPF_VAL_CONFIG_HELLO],
676 { "HelloInterval", "lmp.hellointerval", FT_UINT32, BASE_DEC, NULL, 0x0,
678 {&lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
679 { "HelloDeadInterval", "lmp.hellodeadinterval", FT_UINT32, BASE_DEC, NULL, 0x0,
682 {&lmp_filter[LMPF_VAL_HELLO_TXSEQ],
683 { "TxSeqNum", "lmp.txseqnum", FT_UINT32, BASE_DEC, NULL, 0x0,
685 {&lmp_filter[LMPF_VAL_HELLO_RXSEQ],
686 { "RxSeqNum", "lmp.rxseqnum", FT_UINT32, BASE_DEC, NULL, 0x0,
689 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS],
690 { "Flags", "lmp.begin_verify.flags", FT_UINT16, BASE_HEX, NULL, 0x0,
692 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
693 { "Verify All Links", "lmp.begin_verify.all_links",
694 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
695 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
696 { "Data Link Type", "lmp.begin_verify.link_type",
697 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
698 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
699 { "Encoding Type", "lmp.begin_verify.enctype", FT_UINT8, BASE_DEC, VALS(gmpls_lsp_enc_str), 0x0,
701 {&lmp_filter[LMPF_VAL_VERIFY_ID],
702 { "Verify-ID", "lmp.verifyid", FT_UINT32, BASE_DEC, NULL, 0x0,
705 {&lmp_filter[LMPF_VAL_TE_LINK_FLAGS],
706 { "TE-Link Flags", "lmp.te_link_flags", FT_UINT8, BASE_HEX, NULL, 0x0,
708 {&lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
709 { "Fault Management Supported", "lmp.te_link.fault_mgmt",
710 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
711 {&lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
712 { "Link Verification Supported", "lmp.te_link.link_verify",
713 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
714 {&lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
715 { "TE-Link Local ID - IPv4", "lmp.te_link.local_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
717 {&lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
718 { "TE-Link Local ID - Unnumbered", "lmp.te_link.local_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
720 {&lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
721 { "TE-Link Remote ID - IPv4", "lmp.te_link.remote_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
723 {&lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
724 { "TE-Link Remote ID - Unnumbered", "lmp.te_link.remote_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
727 {&lmp_filter[LMPF_VAL_DATA_LINK_FLAGS],
728 { "Data-Link Flags", "lmp.data_link_flags", FT_UINT8, BASE_HEX, NULL, 0x0,
730 {&lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
731 { "Data-Link is Individual Port", "lmp.data_link.port",
732 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
733 {&lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
734 { "Data-Link is Allocated", "lmp.data_link.link_verify",
735 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
736 {&lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
737 { "Data-Link Local ID - IPv4", "lmp.data_link.local_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
739 {&lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
740 { "Data-Link Local ID - Unnumbered", "lmp.data_link.local_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
742 {&lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
743 { "Data-Link Remote ID - IPv4", "lmp.data_link.remote_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
745 {&lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
746 { "Data-Link Remote ID - Unnumbered", "lmp.data_link.remote_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
748 {&lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
749 { "Subobject", "lmp.data_link_subobj", FT_NONE, BASE_DEC, NULL, 0x0,
751 {&lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
752 { "Interface Switching Capability", "lmp.data_link_switching", FT_UINT8, BASE_DEC,
753 VALS(gmpls_switching_type_str), 0x0, "", HFILL }},
754 {&lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
755 { "LSP Encoding Type", "lmp.data_link_encoding", FT_UINT8, BASE_DEC,
756 VALS(gmpls_lsp_enc_str), 0x0, "", HFILL }},
758 {&lmp_filter[LMPF_VAL_ERROR],
759 { "Error Code", "lmp.error", FT_UINT32, BASE_HEX, NULL, 0x0,
762 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
763 { "Verification - Unsupported for this TE-Link", "lmp.error.verify_unsupported_link",
764 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
765 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
766 { "Verification - Unwilling to Verify at this time", "lmp.error.verify_unwilling",
767 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
768 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
769 { "Verification - Transport Unsupported", "lmp.error.verify_unsupported_transport",
770 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
771 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
772 { "Verification - TE Link ID Configuration Error", "lmp.error.verify_te_link_id",
773 FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
775 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_UNKNOWN_CTYPE],
776 { "Verification - Unknown Object C-Type", "lmp.error.verify_unknown_ctype",
777 FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
779 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
780 { "Summary - Unacceptable non-negotiable parameters", "lmp.error.summary_bad_params",
781 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
782 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
783 { "Summary - Renegotiate Parametere", "lmp.error.summary_renegotiate",
784 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
785 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
786 { "Summary - Bad TE Link Object", "lmp.error.summary_bad_te_link",
787 FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
788 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
789 { "Summary - Bad Data Link Object", "lmp.error.summary_bad_data_link",
790 FT_BOOLEAN, 8, NULL, 0x10, "", HFILL }},
791 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_TEL_CTYPE],
792 { "Summary - Bad TE Link C-Type", "lmp.error.summary_unknown_tel_ctype",
793 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
794 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_DL_CTYPE],
795 { "Summary - Bad Data Link C-Type", "lmp.error.summary_unknown_dl_ctype",
796 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
797 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
798 { "Summary - Bad Remote Link ID", "lmp.error.summary_bad_remote_link_id",
799 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
800 {&lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
801 { "Config - Unacceptable non-negotiable parameters", "lmp.error.config_bad_params",
802 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
803 {&lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
804 { "Config - Renegotiate Parametere", "lmp.error.config_renegotiate",
805 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
806 {&lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
807 { "Config - Bad CC ID", "lmp.error.config_bad_ccid",
808 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }}
813 lmp_class_to_filter_num(int class)
815 if (VALID_CLASS(class))
816 return class + LMPF_OBJECT;
821 lmp_09_class_to_filter_num(int class)
823 if (VALID_09_CLASS(class))
824 return class + LMPF_09_OBJECT;
829 /*------------------------------------------------------------------------------
832 * We have two types of subtrees - a statically defined, constant set and
833 * a class set - one for each class. The static ones are before all the class ones
838 LMP_TREE_HEADER_FLAGS,
839 LMP_TREE_OBJECT_HEADER,
840 LMP_TREE_ERROR_FLAGS,
841 LMP_TREE_BEGIN_VERIFY_FLAGS,
842 LMP_TREE_BEGIN_VERIFY_TRANSPORT_FLAGS,
843 LMP_TREE_TE_LINK_FLAGS,
844 LMP_TREE_DATA_LINK_FLAGS,
845 LMP_TREE_DATA_LINK_SUBOBJ,
846 LMP_TREE_CHANNEL_STATUS_ID,
850 #define NUM_LMP_SUBTREES (LMP_TREE_CLASS_START + LMP_CLASS_MAX)
851 #define NUM_LMP_09_SUBTREES (LMP_TREE_CLASS_START + LMP_CLASS_MAX)
853 static gint lmp_subtree[MAX(NUM_LMP_SUBTREES,NUM_LMP_09_SUBTREES)];
854 static gint lmp_09_subtree[NUM_LMP_09_SUBTREES];
856 static int lmp_class_to_subtree(int class)
858 if (VALID_CLASS(class))
859 return lmp_subtree[LMP_TREE_CLASS_START + class];
864 static int lmp_09_class_to_subtree(int class)
866 if (VALID_09_CLASS(class))
867 return lmp_09_subtree[LMP_TREE_CLASS_START + class];
872 /*------------------------------------------------------------------------------
877 dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
880 proto_tree *lmp_tree = NULL, *ti, *ti2;
881 proto_tree *lmp_header_tree;
882 proto_tree *lmp_header_flags_tree;
883 proto_tree *lmp_object_tree;
884 proto_tree *lmp_object_header_tree;
885 proto_tree *lmp_flags_tree;
886 proto_tree *lmp_subobj_tree;
891 guint16 cksum, computed_cksum;
900 proto = pinfo->ipproto;
901 /* If the current preference is NOT LMP09, do not process UDP packets */
902 if ((proto == IP_PROTO_UDP) && (lmp_draft_ver != LMP_VER_DRAFT_CCAMP_09)) {
905 /* If the current preference is NOT LMP09, process only UDP packets */
906 if ((proto != IP_PROTO_UDP) && (lmp_draft_ver == LMP_VER_DRAFT_CCAMP_09)) {
910 if (check_col(pinfo->cinfo, COL_PROTOCOL))
911 col_set_str(pinfo->cinfo, COL_PROTOCOL, "LMP");
912 if (check_col(pinfo->cinfo, COL_INFO))
913 col_clear(pinfo->cinfo, COL_INFO);
915 version = (tvb_get_guint8(tvb, offset+0)) >> 4;
916 flags = tvb_get_guint8(tvb, offset+2);
917 message_type = tvb_get_guint8(tvb, offset+3);
918 if (check_col(pinfo->cinfo, COL_INFO)) {
919 col_add_str(pinfo->cinfo, COL_INFO,
920 val_to_str(message_type, message_type_vals, "Unknown (%u). "));
924 msg_length = tvb_get_ntohs(tvb, offset+4);
925 ti = proto_tree_add_item(tree, proto_lmp, tvb, offset, msg_length,
927 lmp_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_MAIN]);
928 ti = proto_tree_add_text(lmp_tree, tvb, offset, 12, "LMP Header. %s",
929 val_to_str(message_type, message_type_vals,
930 "Unknown Message (%u). "));
931 lmp_header_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_HEADER]);
932 proto_tree_add_text(lmp_header_tree, tvb, offset, 1, "LMP Version: %u",
934 ti = proto_tree_add_text(lmp_header_tree, tvb, offset+2, 1, "Flags: %02x",
936 lmp_header_flags_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_HEADER_FLAGS]);
937 proto_tree_add_boolean(lmp_header_flags_tree, lmp_filter[LMPF_HDR_FLAGS_CC_DOWN],
938 tvb, offset+2, 1, flags);
939 proto_tree_add_boolean(lmp_header_flags_tree, lmp_filter[LMPF_HDR_FLAGS_REBOOT],
940 tvb, offset+2, 1, flags);
941 proto_tree_add_uint(lmp_header_tree, lmp_filter[LMPF_MSG], tvb,
942 offset+3, 1, message_type);
943 proto_tree_add_text(lmp_header_tree, tvb, offset+4, 2, "Length: %d bytes",
945 if (LMPF_MSG + message_type <= LMPF_MSG_CHANNEL_STATUS_RESP &&
947 proto_tree_add_boolean_hidden(lmp_header_tree, lmp_filter[LMPF_MSG + message_type], tvb,
950 proto_tree_add_protocol_format(lmp_header_tree, proto_malformed, tvb, offset+3, 1,
951 "Invalid message type: %u", message_type);
955 cksum = tvb_get_ntohs(tvb, offset+6);
956 if (!pinfo->fragmented && (int) tvb_length(tvb) >= msg_length) {
957 /* The packet isn't part of a fragmented datagram and isn't
958 truncated, so we can checksum it. */
959 cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, msg_length);
960 cksum_vec[0].len = msg_length;
961 computed_cksum = in_cksum(&cksum_vec[0], 1);
963 if (computed_cksum == 0) {
964 proto_tree_add_text(lmp_header_tree, tvb, offset+6, 2,
965 "Message Checksum: 0x%04x (correct)",
968 proto_tree_add_text(lmp_header_tree, tvb, offset+6, 2,
969 "Message Checksum: 0x%04x (incorrect, should be 0x%04x)",
971 in_cksum_shouldbe(cksum, computed_cksum));
974 proto_tree_add_text(lmp_header_tree, tvb, offset+6, 2,
975 "Message Checksum: 0x%04x",
979 proto_tree_add_text(lmp_header_tree, tvb, offset+8, 4,
980 "Local Control Channel ID: %d (%s)",
981 tvb_get_ntohl(tvb, offset+8),
982 ip_to_str(tvb_get_ptr(tvb, offset+8, 4)));
986 while (len < msg_length) {
992 obj_length = tvb_get_ntohs(tvb, offset+2);
993 class = tvb_get_guint8(tvb, offset+1);
994 type = tvb_get_guint8(tvb, offset);
995 negotiable = (type >> 7); type &= 0x7f;
996 if (lmp_draft_ver == LMP_VER_DRAFT_CCAMP_09) {
997 object_type = val_to_str(class, lmp_09_class_vals, "Unknown");
998 proto_tree_add_uint_hidden(lmp_tree, lmp_filter[LMPF_09_OBJECT],
1001 if (VALID_09_CLASS(class)) {
1002 ti = proto_tree_add_item(lmp_tree, lmp_filter[lmp_09_class_to_filter_num(class)],
1003 tvb, offset, obj_length, FALSE);
1005 proto_tree_add_protocol_format(lmp_tree, proto_malformed, tvb, offset+1, 1,
1006 "Invalid class: %u", class);
1009 lmp_object_tree = proto_item_add_subtree(ti, lmp_09_class_to_subtree(class));
1011 ti2 = proto_tree_add_text(lmp_object_tree, tvb, offset, 4,
1012 "Header. Class %d, C-Type %d, Length %d, %s",
1013 class, type, obj_length,
1014 negotiable ? "Negotiable" : "Not Negotiable");
1015 lmp_object_header_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_OBJECT_HEADER]);
1016 proto_tree_add_text(lmp_object_header_tree, tvb, offset, 1,
1017 negotiable ? "Negotiable" : "Not Negotiable");
1018 proto_tree_add_text(lmp_object_header_tree, tvb, offset+2, 2,
1019 "Length: %u", obj_length);
1020 proto_tree_add_text(lmp_object_header_tree, tvb, offset+1, 1,
1021 "Object Class: %u - %s",
1022 class, object_type);
1023 proto_tree_add_item(lmp_object_header_tree, lmp_filter[LMPF_VAL_CTYPE],
1024 tvb, offset, 1, type);
1026 mylen = obj_length - 4;
1027 } else /* LMP_VER_DRAFT_CCAMP_03 */ {
1028 object_type = val_to_str(class, lmp_class_vals, "Unknown");
1029 proto_tree_add_uint_hidden(lmp_tree, lmp_filter[LMPF_OBJECT],
1033 if (VALID_CLASS(class)) {
1034 ti = proto_tree_add_item(lmp_tree, lmp_filter[lmp_class_to_filter_num(class)],
1035 tvb, offset, obj_length, FALSE);
1037 proto_tree_add_protocol_format(lmp_tree, proto_malformed, tvb, offset+1, 1,
1038 "Invalid class: %u", class);
1042 lmp_object_tree = proto_item_add_subtree(ti, lmp_class_to_subtree(class));
1044 ti2 = proto_tree_add_text(lmp_object_tree, tvb, offset, 4,
1045 "Header. Class %d, C-Type %d, Length %d, %s",
1046 class, type, obj_length,
1047 negotiable ? "Negotiable" : "Not Negotiable");
1048 lmp_object_header_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_OBJECT_HEADER]);
1049 proto_tree_add_text(lmp_object_header_tree, tvb, offset, 1,
1050 negotiable ? "Negotiable" : "Not Negotiable");
1051 proto_tree_add_text(lmp_object_header_tree, tvb, offset+2, 2,
1052 "Length: %u", obj_length);
1053 proto_tree_add_text(lmp_object_header_tree, tvb, offset+1, 1,
1054 "Object Class: %u - %s",
1055 class, object_type);
1056 proto_tree_add_item(lmp_object_header_tree, lmp_filter[LMPF_VAL_CTYPE],
1057 tvb, offset, 1, type);
1059 mylen = obj_length - 4;
1062 if (lmp_draft_ver == LMP_VER_DRAFT_CCAMP_09) {
1066 case LMP_CLASS_NULL:
1069 case LMP_09_CLASS_CCID:
1072 l = LMPF_VAL_LOCAL_CCID;
1073 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1074 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1075 tvb_get_ntohl(tvb, offset2));
1078 l = LMPF_VAL_REMOTE_CCID;
1079 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1080 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1081 tvb_get_ntohl(tvb, offset2));
1083 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1084 "Data (%d bytes)", mylen);
1089 case LMP_09_CLASS_NODE_ID:
1092 l = LMPF_VAL_LOCAL_NODE_ID;
1093 proto_item_append_text(ti, ": %s",
1094 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1095 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1099 l = LMPF_VAL_REMOTE_NODE_ID;
1100 proto_item_append_text(ti, ": %s",
1101 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1102 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1106 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1107 "Data (%d bytes)", mylen);
1112 case LMP_09_CLASS_LINK_ID:
1116 l = (type == 1)? LMPF_VAL_LOCAL_LINK_ID_IPV4:
1117 LMPF_VAL_REMOTE_LINK_ID_IPV4;
1118 proto_item_append_text(ti, ": IPv4 %s",
1119 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1120 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1125 l = (type == 3)? LMPF_VAL_LOCAL_LINK_ID_IPV6:
1126 LMPF_VAL_REMOTE_LINK_ID_IPV6;
1127 proto_item_append_text(ti, ": IPv6 %s",
1128 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1129 proto_tree_add_text(lmp_object_tree, tvb, offset2, 16, "IPv6: %s",
1130 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1134 l = (type == 5)? LMPF_VAL_LOCAL_LINK_ID_UNNUM:
1135 LMPF_VAL_REMOTE_LINK_ID_UNNUM;
1136 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2));
1137 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1142 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1143 "Data (%d bytes)", mylen);
1148 case LMP_09_CLASS_INTERFACE_ID:
1152 l = (type == 1)? LMPF_VAL_LOCAL_INTERFACE_ID_IPV4:
1153 LMPF_VAL_REMOTE_INTERFACE_ID_IPV4;
1154 proto_item_append_text(ti, ": IPv4 %s",
1155 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1156 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1161 l = (type == 3)? LMPF_VAL_LOCAL_INTERFACE_ID_IPV6:
1162 LMPF_VAL_REMOTE_INTERFACE_ID_IPV6;
1163 proto_item_append_text(ti, ": IPv6 %s",
1164 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1165 proto_tree_add_text(lmp_object_tree, tvb, offset2, 16, "IPv6: %s",
1166 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1170 l = (type == 5)? LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM:
1171 LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM;
1172 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2));
1173 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1177 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1178 "Data (%d bytes)", mylen);
1183 case LMP_09_CLASS_MESSAGE_ID:
1186 l = LMPF_VAL_MESSAGE_ID;
1187 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1188 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1189 tvb_get_ntohl(tvb, offset2));
1192 l = LMPF_VAL_MESSAGE_ID_ACK;
1193 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1194 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1195 tvb_get_ntohl(tvb, offset2));
1199 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1200 "Data (%d bytes)", mylen);
1205 case LMP_09_CLASS_CONFIG:
1208 proto_item_append_text(ti, ": HelloInterval: %d, HelloDeadInterval: %d",
1209 tvb_get_ntohs(tvb, offset2), tvb_get_ntohs(tvb, offset2+2));
1210 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_CONFIG_HELLO],
1211 tvb, offset2, 2, tvb_get_ntohs(tvb, offset2));
1212 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
1213 tvb, offset2+2, 2, tvb_get_ntohs(tvb, offset2+2));
1216 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1217 "Data (%d bytes)", mylen);
1222 case LMP_09_CLASS_HELLO:
1225 proto_item_append_text(ti, ": TxSeq %d, RxSeq: %d",
1226 tvb_get_ntohl(tvb, offset2),
1227 tvb_get_ntohl(tvb, offset2+4));
1228 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_HELLO_TXSEQ],
1229 tvb, offset2, 4, tvb_get_ntohl(tvb, offset2));
1230 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_HELLO_RXSEQ],
1231 tvb, offset2+4, 4, tvb_get_ntohl(tvb, offset2+4));
1234 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1235 "Data (%d bytes)", mylen);
1240 case LMP_09_CLASS_BEGIN_VERIFY:
1243 l = tvb_get_ntohs(tvb, offset2);
1244 ti2 = proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS],
1245 tvb, offset2, 2, FALSE);
1247 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_BEGIN_VERIFY_FLAGS]);
1248 proto_tree_add_boolean(lmp_flags_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
1249 tvb, offset2, 2, l);
1250 proto_tree_add_boolean(lmp_flags_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
1251 tvb, offset2, 2, l);
1252 proto_tree_add_text(lmp_object_tree, tvb, offset2+2, 2,
1253 "Verify Interval: %d ms", tvb_get_ntohs(tvb, offset2+2));
1254 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 4,
1255 "Number of Data Links: %d", tvb_get_ntohl(tvb, offset2+4));
1256 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
1257 tvb, offset2+8, 1, FALSE);
1258 proto_tree_add_text(lmp_object_tree, tvb, offset2+10, 2,
1259 "Verify Transport Mechanism: 0x%0x", tvb_get_ntohs(tvb, offset2+10));
1260 proto_tree_add_text(lmp_object_tree, tvb, offset2+12, 4,
1261 "Transmission Rate: %.10g", tvb_get_ntohieee_float(tvb, offset2+12));
1262 proto_tree_add_text(lmp_object_tree, tvb, offset2+16, 4,
1263 "Wavelength: %d", tvb_get_ntohl(tvb, offset2+4));
1266 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1267 "Data (%d bytes)", mylen);
1272 case LMP_09_CLASS_BEGIN_VERIFY_ACK:
1275 proto_item_append_text(ti, ": VerifyDeadInterval: %d, TransportResponse: 0x%0x",
1276 tvb_get_ntohs(tvb, offset2), tvb_get_ntohs(tvb, offset2+2));
1277 proto_tree_add_text(lmp_object_tree, tvb, offset2, 2,
1278 "VerifyDeadInterval: %d ms", tvb_get_ntohs(tvb, offset2));
1279 proto_tree_add_text(lmp_object_tree, tvb, offset2+2, 2,
1280 "Verify Transport Response: 0x%0x", tvb_get_ntohs(tvb, offset2+2));
1283 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1284 "Data (%d bytes)", mylen);
1289 case LMP_09_CLASS_VERIFY_ID:
1292 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1293 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_VERIFY_ID], tvb, offset2, 4,
1294 tvb_get_ntohl(tvb, offset2));
1297 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1298 "Data (%d bytes)", mylen);
1303 case LMP_09_CLASS_TE_LINK:
1304 l = tvb_get_guint8(tvb, offset2);
1305 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_FLAGS],
1306 tvb, offset2, 1, l);
1307 proto_item_append_text(ti2, ": %s%s",
1308 (l&0x01) ? "Fault-Mgmt-Supported " : "",
1309 (l&0x02) ? "Link-Verification-Supported " : "");
1310 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_TE_LINK_FLAGS]);
1311 proto_tree_add_boolean(lmp_flags_tree,
1312 lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
1313 tvb, offset2, 1, l);
1314 proto_tree_add_boolean(lmp_flags_tree,
1315 lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
1316 tvb, offset2, 1, l);
1319 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1320 ip_to_str(tvb_get_ptr(tvb, offset2+4, 4)),
1321 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
1322 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
1323 tvb, offset2+4, 4, FALSE);
1324 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
1325 tvb, offset2+8, 4, FALSE);
1328 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1329 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)),
1330 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+8, 16)));
1331 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 16, "TE-Link Local ID - IPv6: %s",
1332 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1333 proto_tree_add_text(lmp_object_tree, tvb, offset2+20,16, "TE-Link Remote ID - IPv6: %s",
1334 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)));
1337 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1338 tvb_get_ntohl(tvb, offset2+4), tvb_get_ntohl(tvb, offset2+8));
1339 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
1340 tvb, offset2+4, 4, FALSE);
1341 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
1342 tvb, offset2+8, 4, FALSE);
1345 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1346 "Data (%d bytes)", mylen);
1351 case LMP_09_CLASS_DATA_LINK:
1352 l = tvb_get_guint8(tvb, offset2);
1353 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_FLAGS],
1354 tvb, offset2, 1, l);
1355 proto_item_append_text(ti2, ": %s%s",
1356 (l&0x01) ? "Interface-Type-Port " : "Interface-Type-Component-Link ",
1357 (l&0x02) ? "Allocated " : "Unallocated ");
1358 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_DATA_LINK_FLAGS]);
1359 proto_tree_add_boolean(lmp_flags_tree,
1360 lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
1361 tvb, offset2, 1, l);
1362 proto_tree_add_boolean(lmp_flags_tree,
1363 lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
1364 tvb, offset2, 1, l);
1367 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1368 ip_to_str(tvb_get_ptr(tvb, offset2+4, 4)),
1369 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
1370 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
1371 tvb, offset2+4, 4, FALSE);
1372 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
1373 tvb, offset2+8, 4, FALSE);
1377 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1378 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)),
1379 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+8, 16)));
1380 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 16,
1381 "Data-Link Local ID - IPv6: %s",
1382 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1383 proto_tree_add_text(lmp_object_tree, tvb, offset2+20,16,
1384 "Data-Link Remote ID - IPv6: %s",
1385 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)));
1389 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1390 tvb_get_ntohl(tvb, offset2+4), tvb_get_ntohl(tvb, offset2+8));
1391 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
1392 tvb, offset2+4, 4, FALSE);
1393 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
1394 tvb, offset2+8, 4, FALSE);
1398 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1399 "Data (%d bytes)", mylen);
1403 while (l < obj_length - 4) {
1404 mylen = tvb_get_guint8(tvb, offset2+l+1);
1405 ti2 = proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
1406 tvb, offset2+l, mylen, FALSE);
1407 lmp_subobj_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_DATA_LINK_SUBOBJ]);
1408 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 1,
1409 "Subobject Type: %d", tvb_get_guint8(tvb, offset2+l));
1410 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+1, 1,
1411 "Subobject Length: %d", mylen);
1412 switch(tvb_get_guint8(tvb, offset2+l)) {
1414 proto_item_set_text(ti2, "Interface Switching Capability: "
1415 "Switching Cap: %s, Encoding Type: %s, Min BW: %.10g, Max BW: %.10g",
1416 val_to_str(tvb_get_guint8(tvb, offset2+l+2),
1417 gmpls_switching_type_str, "Unknown (%d)"),
1418 val_to_str(tvb_get_guint8(tvb, offset2+l+3),
1419 gmpls_lsp_enc_str, "Unknown (%d)"),
1420 tvb_get_ntohieee_float(tvb, offset2+l+4),
1421 tvb_get_ntohieee_float(tvb, offset2+l+8));
1422 proto_tree_add_item(lmp_subobj_tree,
1423 lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
1424 tvb, offset2+l+2, 1, FALSE);
1425 proto_tree_add_item(lmp_subobj_tree,
1426 lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
1427 tvb, offset2+l+3, 1, FALSE);
1428 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+4, 4,
1429 "Minimum Reservable Bandwidth: %.10g bytes/s",
1430 tvb_get_ntohieee_float(tvb, offset2+l+4));
1431 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+8, 4,
1432 "Maximum Reservable Bandwidth: %.10g bytes/s",
1433 tvb_get_ntohieee_float(tvb, offset2+l+8));
1437 proto_item_set_text(ti2, "Wavelength: %d",
1438 tvb_get_ntohl(tvb, offset2+l+2));
1439 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+4, 4,
1441 tvb_get_ntohl(tvb, offset2+l+2));
1445 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l,
1446 tvb_get_guint8(tvb, offset2+l+1),
1447 "Data (%d bytes)", tvb_get_guint8(tvb, offset2+l+1));
1450 l += tvb_get_guint8(tvb, offset2+l+1);
1455 case LMP_09_CLASS_CHANNEL_STATUS:
1466 for (l=0; l<obj_length - 4; ) {
1467 ti2 = proto_tree_add_text(lmp_object_tree, tvb, offset2+l, k,
1469 lmp_subobj_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_CHANNEL_STATUS_ID]);
1473 proto_item_append_text(ti, ": [IPv4-%s",
1474 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1475 proto_item_append_text(ti2, ": IPv4 %s",
1476 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1477 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
1478 "Interface ID: IPv4: %s",
1479 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1484 proto_item_append_text(ti, ": [IPv6-%s",
1485 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
1486 proto_item_append_text(ti2, ": IPv6 %s",
1487 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
1488 proto_tree_add_text(lmp_subobj_tree, tvb, offset2, 16, "Interface ID: IPv6: %s",
1489 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
1494 proto_item_append_text(ti, ": [Unnum-%d", tvb_get_ntohl(tvb, offset2+l));
1495 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2+l));
1496 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
1497 "Interface ID: Unnumbered: %d",
1498 tvb_get_ntohl(tvb, offset2+l));
1502 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l,
1503 "Data (%d bytes)", obj_length-4-l);
1507 if (l == obj_length - 4) break;
1509 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 1,
1510 tvb_get_guint8(tvb, offset2+l) & 0x80 ?
1511 "Link Allocated - Active Monitoring" :
1512 "Link Not Allocated");
1514 proto_item_append_text(ti, "-%s,%s], ",
1515 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Act" : "NA",
1516 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1517 channel_status_short_str, "UNK (%u)."));
1518 proto_item_append_text(ti2, ": %s, ",
1519 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Active" : "Not Active");
1520 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
1521 "Channel Status: %s",
1522 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1523 channel_status_str, "Unknown (%u). "));
1524 proto_item_append_text(ti2, val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1525 channel_status_str, "Unknown (%u). "));
1528 if (j==4 && l < obj_length - 4)
1529 proto_item_append_text(ti, " ...");
1533 case LMP_09_CLASS_CHANNEL_STATUS_REQUEST:
1534 for (l=0; l<obj_length - 4; ) {
1537 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 4,
1538 "Interface ID: IPv4: %s",
1539 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1543 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 16, "Interface ID: IPv6: %s",
1544 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l,16)));
1548 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 4,
1549 "Interface ID: Unnumbered: %d",
1550 tvb_get_ntohl(tvb, offset2+l));
1554 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l,
1555 "Data (%d bytes)", obj_length-4-l);
1562 case LMP_09_CLASS_ERROR:
1563 l = tvb_get_ntohl(tvb, offset2);
1564 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_ERROR],
1565 tvb, offset2, 4, l);
1569 proto_item_append_text(ti, ": CONFIG_ERROR: %s%s%s",
1570 (l&0x01) ? "Unacceptable-Params " : "",
1571 (l&0x02) ? "Renegotiate" : "",
1572 (l&0x04) ? "Bad Received CCID" : "");
1573 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1574 proto_tree_add_boolean(lmp_flags_tree,
1575 lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
1577 proto_tree_add_boolean(lmp_flags_tree,
1578 lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
1580 proto_tree_add_boolean(lmp_flags_tree,
1581 lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
1585 proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
1586 (l&0x01) ? "Unsupported-Link " : "",
1587 (l&0x02) ? "Unwilling" : "",
1588 (l&0x04) ? "Unsupported-Transport" : "",
1589 (l&0x08) ? "TE-Link-ID" : "");
1590 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1591 proto_tree_add_boolean(lmp_flags_tree,
1592 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
1594 proto_tree_add_boolean(lmp_flags_tree,
1595 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
1597 proto_tree_add_boolean(lmp_flags_tree,
1598 lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
1600 proto_tree_add_boolean(lmp_flags_tree,
1601 lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
1605 proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s%s%s%s",
1606 (l&0x01) ? "Unacceptable-Params " : "",
1607 (l&0x02) ? "Renegotiate" : "",
1608 (l&0x04) ? "Bad-TE-Link" : "",
1609 (l&0x08) ? "Bad-Data-Link" : "",
1610 (l&0x10) ? "Bad-TE-Link-CType" : "",
1611 (l&0x20) ? "Bad-Data-Link-CType" : "");
1612 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1613 proto_tree_add_boolean(lmp_flags_tree,
1614 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
1616 proto_tree_add_boolean(lmp_flags_tree,
1617 lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
1619 proto_tree_add_boolean(lmp_flags_tree,
1620 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
1622 proto_tree_add_boolean(lmp_flags_tree,
1623 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
1625 proto_tree_add_boolean(lmp_flags_tree,
1626 lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_TEL_CTYPE],
1628 proto_tree_add_boolean(lmp_flags_tree,
1629 lmp_filter[LMPF_VAL_ERROR_SUMMARY_UNKNOWN_DL_CTYPE],
1633 proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
1634 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1635 "Data (%d bytes)", mylen);
1639 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1640 "Data (%d bytes)", mylen);
1644 /* LMP 03 or LMP 02 */
1646 case LMP_CLASS_NULL:
1649 case LMP_CLASS_LOCAL_CCID:
1650 case LMP_CLASS_REMOTE_CCID:
1653 l = (class == LMP_CLASS_LOCAL_CCID) ?
1654 LMPF_VAL_LOCAL_CCID : LMPF_VAL_REMOTE_CCID;
1655 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1656 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1657 tvb_get_ntohl(tvb, offset2));
1660 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1661 "Data (%d bytes)", mylen);
1666 case LMP_CLASS_LOCAL_NODE_ID:
1667 case LMP_CLASS_REMOTE_NODE_ID:
1670 l = (class == LMP_CLASS_LOCAL_NODE_ID) ?
1671 LMPF_VAL_LOCAL_NODE_ID : LMPF_VAL_REMOTE_NODE_ID;
1672 proto_item_append_text(ti, ": %s",
1673 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1674 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1678 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1679 "Data (%d bytes)", mylen);
1684 case LMP_CLASS_LOCAL_LINK_ID:
1685 case LMP_CLASS_REMOTE_LINK_ID:
1688 l = (class == LMP_CLASS_LOCAL_LINK_ID) ?
1689 LMPF_VAL_LOCAL_LINK_ID_IPV4 : LMPF_VAL_REMOTE_LINK_ID_IPV4;
1690 proto_item_append_text(ti, ": IPv4 %s",
1691 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1692 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1696 proto_item_append_text(ti, ": IPv6 %s",
1697 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1698 proto_tree_add_text(lmp_object_tree, tvb, offset2, 16, "IPv6: %s",
1699 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1702 l = (class == LMP_CLASS_LOCAL_LINK_ID) ?
1703 LMPF_VAL_LOCAL_LINK_ID_UNNUM : LMPF_VAL_REMOTE_LINK_ID_UNNUM;
1704 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2));
1705 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1709 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1710 "Data (%d bytes)", mylen);
1715 case LMP_CLASS_LOCAL_INTERFACE_ID:
1716 case LMP_CLASS_REMOTE_INTERFACE_ID:
1719 l = (class == LMP_CLASS_LOCAL_INTERFACE_ID) ?
1720 LMPF_VAL_LOCAL_INTERFACE_ID_IPV4 : LMPF_VAL_REMOTE_INTERFACE_ID_IPV4;
1721 proto_item_append_text(ti, ": IPv4 %s",
1722 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1723 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1727 proto_item_append_text(ti, ": IPv6 %s",
1728 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1729 proto_tree_add_text(lmp_object_tree, tvb, offset2, 16, "IPv6: %s",
1730 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1733 l = (class == LMP_CLASS_LOCAL_INTERFACE_ID) ?
1734 LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM : LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM;
1735 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2));
1736 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1740 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1741 "Data (%d bytes)", mylen);
1746 case LMP_CLASS_MESSAGE_ID:
1747 case LMP_CLASS_MESSAGE_ID_ACK:
1750 l = (class == LMP_CLASS_MESSAGE_ID) ?
1751 LMPF_VAL_MESSAGE_ID : LMPF_VAL_MESSAGE_ID_ACK;
1752 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1753 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1754 tvb_get_ntohl(tvb, offset2));
1757 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1758 "Data (%d bytes)", mylen);
1763 case LMP_CLASS_CONFIG:
1766 proto_item_append_text(ti, ": HelloInterval: %d, HelloDeadInterval: %d",
1767 tvb_get_ntohs(tvb, offset2), tvb_get_ntohs(tvb, offset2+2));
1768 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_CONFIG_HELLO],
1769 tvb, offset2, 2, tvb_get_ntohs(tvb, offset2));
1770 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
1771 tvb, offset2+2, 2, tvb_get_ntohs(tvb, offset2+2));
1774 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1775 "Data (%d bytes)", mylen);
1780 case LMP_CLASS_HELLO:
1783 proto_item_append_text(ti, ": TxSeq %d, RxSeq: %d",
1784 tvb_get_ntohl(tvb, offset2),
1785 tvb_get_ntohl(tvb, offset2+4));
1786 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_HELLO_TXSEQ],
1787 tvb, offset2, 4, tvb_get_ntohl(tvb, offset2));
1788 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_HELLO_RXSEQ],
1789 tvb, offset2+4, 4, tvb_get_ntohl(tvb, offset2+4));
1792 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1793 "Data (%d bytes)", mylen);
1797 case LMP_CLASS_BEGIN_VERIFY:
1800 l = tvb_get_ntohs(tvb, offset2);
1801 ti2 = proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS],
1802 tvb, offset2, 2, FALSE);
1804 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_BEGIN_VERIFY_FLAGS]);
1805 proto_tree_add_boolean(lmp_flags_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
1806 tvb, offset2, 2, l);
1807 proto_tree_add_boolean(lmp_flags_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
1808 tvb, offset2, 2, l);
1809 proto_tree_add_text(lmp_object_tree, tvb, offset2+2, 2,
1810 "Verify Interval: %d ms", tvb_get_ntohs(tvb, offset2+2));
1811 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 4,
1812 "Number of Data Links: %d", tvb_get_ntohl(tvb, offset2+4));
1813 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
1814 tvb, offset2+8, 1, FALSE);
1815 proto_tree_add_text(lmp_object_tree, tvb, offset2+10, 2,
1816 "Verify Transport Mechanism: 0x%0x", tvb_get_ntohs(tvb, offset2+10));
1817 proto_tree_add_text(lmp_object_tree, tvb, offset2+12, 4,
1818 "Transmission Rate: %.10g", tvb_get_ntohieee_float(tvb, offset2+12));
1819 proto_tree_add_text(lmp_object_tree, tvb, offset2+16, 4,
1820 "Wavelength: %d", tvb_get_ntohl(tvb, offset2+4));
1823 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1824 "Data (%d bytes)", mylen);
1829 case LMP_CLASS_BEGIN_VERIFY_ACK:
1832 proto_item_append_text(ti, ": VerifyDeadInterval: %d, TransportResponse: 0x%0x",
1833 tvb_get_ntohs(tvb, offset2), tvb_get_ntohs(tvb, offset2+2));
1834 proto_tree_add_text(lmp_object_tree, tvb, offset2, 2,
1835 "VerifyDeadInterval: %d ms", tvb_get_ntohs(tvb, offset2));
1836 proto_tree_add_text(lmp_object_tree, tvb, offset2+2, 2,
1837 "Verify Transport Response: 0x%0x", tvb_get_ntohs(tvb, offset2+2));
1840 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1841 "Data (%d bytes)", mylen);
1846 case LMP_CLASS_VERIFY_ID:
1849 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1850 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_VERIFY_ID], tvb, offset2, 4,
1851 tvb_get_ntohl(tvb, offset2));
1854 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1855 "Data (%d bytes)", mylen);
1860 case LMP_CLASS_TE_LINK:
1861 l = tvb_get_guint8(tvb, offset2);
1862 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_FLAGS],
1863 tvb, offset2, 1, l);
1864 proto_item_append_text(ti2, ": %s%s",
1865 (l&0x01) ? "Fault-Mgmt-Supported " : "",
1866 (l&0x02) ? "Link-Verification-Supported " : "");
1867 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_TE_LINK_FLAGS]);
1868 proto_tree_add_boolean(lmp_flags_tree,
1869 lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
1870 tvb, offset2, 1, l);
1871 proto_tree_add_boolean(lmp_flags_tree,
1872 lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
1873 tvb, offset2, 1, l);
1876 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1877 ip_to_str(tvb_get_ptr(tvb, offset2+4, 4)),
1878 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
1879 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
1880 tvb, offset2+4, 4, FALSE);
1881 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
1882 tvb, offset2+8, 4, FALSE);
1885 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1886 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)),
1887 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+8, 16)));
1888 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 16, "TE-Link Local ID - IPv6: %s",
1889 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1890 proto_tree_add_text(lmp_object_tree, tvb, offset2+20,16, "TE-Link Remote ID - IPv6: %s",
1891 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)));
1894 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1895 tvb_get_ntohl(tvb, offset2+4), tvb_get_ntohl(tvb, offset2+8));
1896 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
1897 tvb, offset2+4, 4, FALSE);
1898 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
1899 tvb, offset2+8, 4, FALSE);
1902 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1903 "Data (%d bytes)", mylen);
1908 case LMP_CLASS_DATA_LINK:
1909 l = tvb_get_guint8(tvb, offset2);
1910 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_FLAGS],
1911 tvb, offset2, 1, l);
1912 proto_item_append_text(ti2, ": %s%s",
1913 (l&0x01) ? "Interface-Type-Port " : "Interface-Type-Component-Link ",
1914 (l&0x02) ? "Allocated " : "Unallocated ");
1915 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_DATA_LINK_FLAGS]);
1916 proto_tree_add_boolean(lmp_flags_tree,
1917 lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
1918 tvb, offset2, 1, l);
1919 proto_tree_add_boolean(lmp_flags_tree,
1920 lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
1921 tvb, offset2, 1, l);
1924 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1925 ip_to_str(tvb_get_ptr(tvb, offset2+4, 4)),
1926 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
1927 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
1928 tvb, offset2+4, 4, FALSE);
1929 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
1930 tvb, offset2+8, 4, FALSE);
1934 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1935 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)),
1936 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+8, 16)));
1937 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 16,
1938 "Data-Link Local ID - IPv6: %s",
1939 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1940 proto_tree_add_text(lmp_object_tree, tvb, offset2+20,16,
1941 "Data-Link Remote ID - IPv6: %s",
1942 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)));
1946 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1947 tvb_get_ntohl(tvb, offset2+4), tvb_get_ntohl(tvb, offset2+8));
1948 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
1949 tvb, offset2+4, 4, FALSE);
1950 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
1951 tvb, offset2+8, 4, FALSE);
1955 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1956 "Data (%d bytes)", mylen);
1960 while (l < obj_length - 4) {
1961 mylen = tvb_get_guint8(tvb, offset2+l+1);
1962 ti2 = proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
1963 tvb, offset2+l, mylen, FALSE);
1964 lmp_subobj_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_DATA_LINK_SUBOBJ]);
1965 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 1,
1966 "Subobject Type: %d", tvb_get_guint8(tvb, offset2+l));
1967 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+1, 1,
1968 "Subobject Length: %d", mylen);
1969 switch(tvb_get_guint8(tvb, offset2+l)) {
1971 proto_item_set_text(ti2, "Interface Switching Capability: "
1972 "Switching Cap: %s, Encoding Type: %s, Min BW: %.10g, Max BW: %.10g",
1973 val_to_str(tvb_get_guint8(tvb, offset2+l+2),
1974 gmpls_switching_type_str, "Unknown (%d)"),
1975 val_to_str(tvb_get_guint8(tvb, offset2+l+3),
1976 gmpls_lsp_enc_str, "Unknown (%d)"),
1977 tvb_get_ntohieee_float(tvb, offset2+l+4),
1978 tvb_get_ntohieee_float(tvb, offset2+l+8));
1979 proto_tree_add_item(lmp_subobj_tree,
1980 lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
1981 tvb, offset2+l+2, 1, FALSE);
1982 proto_tree_add_item(lmp_subobj_tree,
1983 lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
1984 tvb, offset2+l+3, 1, FALSE);
1985 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+4, 4,
1986 "Minimum Reservable Bandwidth: %.10g bytes/s",
1987 tvb_get_ntohieee_float(tvb, offset2+l+4));
1988 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+8, 4,
1989 "Maximum Reservable Bandwidth: %.10g bytes/s",
1990 tvb_get_ntohieee_float(tvb, offset2+l+8));
1994 proto_item_set_text(ti2, "Wavelength: %d",
1995 tvb_get_ntohl(tvb, offset2+l+2));
1996 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+4, 4,
1998 tvb_get_ntohl(tvb, offset2+l+2));
2002 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l,
2003 tvb_get_guint8(tvb, offset2+l+1),
2004 "Data (%d bytes)", tvb_get_guint8(tvb, offset2+l+1));
2007 l += tvb_get_guint8(tvb, offset2+l+1);
2011 case LMP_CLASS_CHANNEL_STATUS:
2022 for (l=0; l<obj_length - 4; ) {
2023 ti2 = proto_tree_add_text(lmp_object_tree, tvb, offset2+l, k,
2025 lmp_subobj_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_CHANNEL_STATUS_ID]);
2029 proto_item_append_text(ti, ": [IPv4-%s",
2030 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
2031 proto_item_append_text(ti2, ": IPv4 %s",
2032 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
2033 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
2034 "Interface ID: IPv4: %s",
2035 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
2040 proto_item_append_text(ti, ": [IPv6-%s",
2041 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
2042 proto_item_append_text(ti2, ": IPv6 %s",
2043 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
2044 proto_tree_add_text(lmp_subobj_tree, tvb, offset2, 16, "Interface ID: IPv6: %s",
2045 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
2050 proto_item_append_text(ti, ": [Unnum-%d", tvb_get_ntohl(tvb, offset2+l));
2051 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2+l));
2052 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
2053 "Interface ID: Unnumbered: %d",
2054 tvb_get_ntohl(tvb, offset2+l));
2058 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l,
2059 "Data (%d bytes)", obj_length-4-l);
2063 if (l == obj_length - 4) break;
2065 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 1,
2066 tvb_get_guint8(tvb, offset2+l) & 0x80 ?
2067 "Link Allocated - Active Monitoring" :
2068 "Link Not Allocated");
2070 proto_item_append_text(ti, "-%s,%s], ",
2071 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Act" : "NA",
2072 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
2073 channel_status_short_str, "UNK (%u)."));
2074 proto_item_append_text(ti2, ": %s, ",
2075 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Active" : "Not Active");
2076 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
2077 "Channel Status: %s",
2078 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
2079 channel_status_str, "Unknown (%u). "));
2080 proto_item_append_text(ti2, val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
2081 channel_status_str, "Unknown (%u). "));
2084 if (j==4 && l < obj_length - 4)
2085 proto_item_append_text(ti, " ...");
2089 case LMP_CLASS_CHANNEL_STATUS_REQUEST:
2090 for (l=0; l<obj_length - 4; ) {
2093 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 4,
2094 "Interface ID: IPv4: %s",
2095 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
2099 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 16, "Interface ID: IPv6: %s",
2100 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l,16)));
2104 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 4,
2105 "Interface ID: Unnumbered: %d",
2106 tvb_get_ntohl(tvb, offset2+l));
2110 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l,
2111 "Data (%d bytes)", obj_length-4-l);
2118 case LMP_CLASS_ERROR:
2119 l = tvb_get_ntohl(tvb, offset2);
2120 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_ERROR],
2121 tvb, offset2, 4, l);
2123 /* Errors are different in draft-02 and draft-03 */
2124 switch(lmp_draft_ver) {
2125 case LMP_VER_DRAFT_CCAMP_02:
2128 proto_item_append_text(ti, ": CONFIG_ERROR: %s%s%s",
2129 (l&0x01) ? "Unacceptable-Params " : "",
2130 (l&0x02) ? "Renegotiate" : "",
2131 (l&0x04) ? "Bad Received CCID" : "");
2132 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
2133 proto_tree_add_boolean(lmp_flags_tree,
2134 lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
2136 proto_tree_add_boolean(lmp_flags_tree,
2137 lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
2139 proto_tree_add_boolean(lmp_flags_tree,
2140 lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
2144 proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
2145 (l&0x01) ? "Unsupported-Link " : "",
2146 (l&0x02) ? "Unwilling" : "",
2147 (l&0x04) ? "Unsupported-Transport" : "",
2148 (l&0x08) ? "TE-Link-ID" : "");
2149 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
2150 proto_tree_add_boolean(lmp_flags_tree,
2151 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
2153 proto_tree_add_boolean(lmp_flags_tree,
2154 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
2156 proto_tree_add_boolean(lmp_flags_tree,
2157 lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
2159 proto_tree_add_boolean(lmp_flags_tree,
2160 lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
2164 proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s",
2165 (l&0x01) ? "Unacceptable-Params " : "",
2166 (l&0x02) ? "Renegotiate" : "",
2167 (l&0x04) ? "Remote-Link-ID" : "");
2170 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
2171 proto_tree_add_boolean(lmp_flags_tree,
2172 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
2174 proto_tree_add_boolean(lmp_flags_tree,
2175 lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
2177 proto_tree_add_boolean(lmp_flags_tree,
2178 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
2183 proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
2184 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
2185 "Data (%d bytes)", mylen);
2190 case LMP_VER_DRAFT_CCAMP_03:
2193 proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
2194 (l&0x01) ? "Unsupported-Link " : "",
2195 (l&0x02) ? "Unwilling" : "",
2196 (l&0x04) ? "Unsupported-Transport" : "",
2197 (l&0x08) ? "TE-Link-ID" : "");
2198 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
2199 proto_tree_add_boolean(lmp_flags_tree,
2200 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
2202 proto_tree_add_boolean(lmp_flags_tree,
2203 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
2205 proto_tree_add_boolean(lmp_flags_tree,
2206 lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
2208 proto_tree_add_boolean(lmp_flags_tree,
2209 lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
2213 proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s%s%s",
2214 (l&0x01) ? "Unacceptable-Params " : "",
2215 (l&0x02) ? "Renegotiate" : "",
2216 (l&0x04) ? "Remote-Link-ID" : "",
2217 (l&0x08) ? "TE-Link" : "",
2218 (l&0x10) ? "Data-Link" : "");
2220 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
2221 proto_tree_add_boolean(lmp_flags_tree,
2222 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
2224 proto_tree_add_boolean(lmp_flags_tree,
2225 lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
2227 proto_tree_add_boolean(lmp_flags_tree,
2228 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
2230 proto_tree_add_boolean(lmp_flags_tree,
2231 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
2233 proto_tree_add_boolean(lmp_flags_tree,
2234 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
2238 proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
2239 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
2240 "Data (%d bytes)", mylen);
2244 } /* default case in ERROR object switch */
2247 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
2248 "Data (%d bytes)", mylen);
2252 } /* LMP_VER_DRAFT_CCAMP_03 */
2254 offset += obj_length;
2262 lmp_prefs_applied (void)
2264 if (lmp_udp_port != lmp_udp_port_config) {
2265 dissector_delete("udp.port", lmp_udp_port, lmp_handle);
2266 lmp_udp_port = lmp_udp_port_config;
2267 dissector_add("udp.port", lmp_udp_port, lmp_handle);
2272 register_lmp_prefs (void)
2274 module_t *lmp_module;
2275 static enum_val_t lmp_ver[] = {
2276 {"draft-ietf-ccamp-lmp-09", LMP_VER_DRAFT_CCAMP_09},
2277 {"draft-ietf-ccamp-lmp-03", LMP_VER_DRAFT_CCAMP_03},
2278 {"draft-ietf-ccamp-lmp-02", LMP_VER_DRAFT_CCAMP_02},
2282 lmp_module = prefs_register_protocol(proto_lmp, lmp_prefs_applied);
2283 prefs_register_enum_preference(
2284 lmp_module, "version",
2285 "Draft version of LMP",
2286 "Specifies the IETF CCAMP draft version of LMP to interpret",
2287 &lmp_draft_ver, lmp_ver, FALSE);
2288 prefs_register_uint_preference(
2289 lmp_module, "udp_port", "LMP UDP Port (draft-09 ONLY)",
2290 "UDP port number to use for LMP (draft-09 only)", 10, &lmp_udp_port_config);
2294 proto_register_lmp(void)
2296 static gint *ett[NUM_LMP_SUBTREES];
2299 for (i=0; i<NUM_LMP_SUBTREES; i++) {
2300 lmp_subtree[i] = -1;
2301 ett[i] = &lmp_subtree[i];
2304 proto_lmp = proto_register_protocol("Link Management Protocol (LMP)",
2306 proto_register_field_array(proto_lmp, lmpf_info, array_length(lmpf_info));
2307 proto_register_subtree_array(ett, array_length(ett));
2309 register_lmp_prefs();
2313 proto_reg_handoff_lmp(void)
2315 lmp_handle = create_dissector_handle(dissect_lmp, proto_lmp);
2316 dissector_add("udp.port", lmp_udp_port, lmp_handle);
2317 dissector_add("ip.proto", IP_PROTO_LMP, lmp_handle);