2 * Routines for LMP packet disassembly
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
6 * $Id: packet-lmp.c,v 1.15 2003/01/28 23:56:39 guy 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 * two versions of LMP; described in draft-ietf-ccamp-lmp-02.txt and
31 * draft-ietf-ccamp-lmp-03.txt. The -03 version is the default; the
32 * version being dissected can be changed from the LMP protocol preferences
50 #include <epan/tvbuff.h>
51 #include <epan/packet.h>
57 #include "packet-ip.h"
58 #include "packet-rsvp.h"
59 #include "packet-frame.h"
61 static int proto_lmp = -1;
62 #define LMP_VER_DRAFT_CCAMP_02 2
63 #define LMP_VER_DRAFT_CCAMP_03 3
64 static int lmp_draft_ver = LMP_VER_DRAFT_CCAMP_03;
66 #define IP_PROTO_LMP 140
68 /*----------------------------------------------------------------------
77 LMP_MSG_BEGIN_VERIFY_ACK,
78 LMP_MSG_BEGIN_VERIFY_NACK,
80 LMP_MSG_END_VERIFY_ACK,
82 LMP_MSG_TEST_STATUS_SUCCESS,
83 LMP_MSG_TEST_STATUS_FAILURE,
84 LMP_MSG_TEST_STATUS_ACK,
86 LMP_MSG_LINK_SUMMARY_ACK,
87 LMP_MSG_LINK_SUMMARY_NACK,
89 LMP_MSG_CHANNEL_FAIL_ACK,
90 LMP_MSG_CHANNEL_FAIL_NACK,
91 LMP_MSG_CHANNEL_STATUS,
92 LMP_MSG_CHANNEL_STATUS_ACK,
93 LMP_MSG_CHANNEL_STATUS_REQ,
94 LMP_MSG_CHANNEL_STATUS_RESP,
97 static 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, "EndVerifyNack Message. "},
106 {LMP_MSG_TEST, "Test Message. "},
107 {LMP_MSG_TEST_STATUS_SUCCESS, "TestStatusSuccess Message. "},
108 {LMP_MSG_TEST_STATUS_FAILURE, "TestStatusFailure Message. "},
109 {LMP_MSG_TEST_STATUS_ACK, "TestStatusAck Message. "},
110 {LMP_MSG_LINK_SUMMARY, "LinkSummary Message. "},
111 {LMP_MSG_LINK_SUMMARY_ACK, "LinkSummaryAck Message. "},
112 {LMP_MSG_LINK_SUMMARY_NACK, "LinkSummaryNack Message. "},
113 {LMP_MSG_CHANNEL_FAIL, "ChannelFail Message. "},
114 {LMP_MSG_CHANNEL_FAIL_ACK, "ChannelFailAck Message. "},
115 {LMP_MSG_CHANNEL_FAIL_NACK, "ChannelFailNack Message. "},
116 {LMP_MSG_CHANNEL_STATUS, "ChannelStatus Message. "},
117 {LMP_MSG_CHANNEL_STATUS_ACK, "ChannelStatusAck Message. "},
118 {LMP_MSG_CHANNEL_STATUS_REQ, "ChannelStatusRequest Message. "},
119 {LMP_MSG_CHANNEL_STATUS_RESP, "ChannelStatusResponse Message. "},
123 /*------------------------------------------------------------------------------
129 LMP_CLASS_LOCAL_CCID,
130 LMP_CLASS_REMOTE_CCID,
131 LMP_CLASS_LOCAL_NODE_ID,
132 LMP_CLASS_REMOTE_NODE_ID,
133 LMP_CLASS_LOCAL_LINK_ID,
134 LMP_CLASS_REMOTE_LINK_ID,
135 LMP_CLASS_LOCAL_INTERFACE_ID,
136 LMP_CLASS_REMOTE_INTERFACE_ID,
137 LMP_CLASS_MESSAGE_ID,
138 LMP_CLASS_MESSAGE_ID_ACK,
141 LMP_CLASS_BEGIN_VERIFY,
142 LMP_CLASS_BEGIN_VERIFY_ACK,
146 LMP_CLASS_CHANNEL_STATUS,
147 LMP_CLASS_CHANNEL_STATUS_REQUEST,
153 static value_string lmp_class_vals[] = {
155 {LMP_CLASS_LOCAL_CCID, "LOCAL_CCID"},
156 {LMP_CLASS_REMOTE_CCID, "REMOTE_CCID"},
157 {LMP_CLASS_LOCAL_NODE_ID, "LOCAL_NODE_ID"},
158 {LMP_CLASS_REMOTE_NODE_ID, "REMOTE_NODE_ID"},
159 {LMP_CLASS_LOCAL_LINK_ID, "LOCAL_LINK_ID"},
160 {LMP_CLASS_REMOTE_LINK_ID, "REMOTE_LINK_ID"},
161 {LMP_CLASS_LOCAL_INTERFACE_ID, "LOCAL_INTERFACE_ID"},
162 {LMP_CLASS_REMOTE_INTERFACE_ID, "REMOTE_INTERFACE_ID"},
163 {LMP_CLASS_MESSAGE_ID, "MESSAGE_ID"},
164 {LMP_CLASS_MESSAGE_ID_ACK, "MESSAGE_ID_ACK"},
165 {LMP_CLASS_CONFIG, "CONFIG"},
166 {LMP_CLASS_HELLO, "HELLO"},
167 {LMP_CLASS_BEGIN_VERIFY, "BEGIN_VERIFY"},
168 {LMP_CLASS_BEGIN_VERIFY_ACK, "BEGIN_VERIFY_ACK"},
169 {LMP_CLASS_VERIFY_ID, "VERIFY_ID"},
170 {LMP_CLASS_TE_LINK, "TE_LINK"},
171 {LMP_CLASS_DATA_LINK, "DATA_LINK"},
172 {LMP_CLASS_CHANNEL_STATUS, "CHANNEL_STATUS"},
173 {LMP_CLASS_CHANNEL_STATUS_REQUEST, "CHANNEL_STATUS_REQUEST"},
174 {LMP_CLASS_ERROR, "ERROR"},
177 #define VALID_CLASS(class) ((class) > LMP_CLASS_NULL && (class) < LMP_CLASS_MAX)
179 /*------------------------------------------------------------------------------
180 * Other constants & stuff
184 static const value_string channel_status_str[] = {
185 {1, "Signal Okay (OK)"},
186 {2, "Signal Degraded (SD)"},
187 {3, "Signal Failed (SF)"},
189 static const value_string channel_status_short_str[] = {
195 /*------------------------------------------------------------------------------
199 enum lmp_filter_keys {
201 /* Message types ---------------- */
206 LMPF_MSG_CONFIG_NACK,
208 LMPF_MSG_BEGIN_VERIFY,
209 LMPF_MSG_BEGIN_VERIFY_ACK,
210 LMPF_MSG_BEGIN_VERIFY_NACK,
212 LMPF_MSG_END_VERIFY_ACK,
214 LMPF_MSG_TEST_STATUS_SUCCESS,
215 LMPF_MSG_TEST_STATUS_FAILURE,
216 LMPF_MSG_TEST_STATUS_ACK,
217 LMPF_MSG_LINK_SUMMARY,
218 LMPF_MSG_LINK_SUMMARY_ACK,
219 LMPF_MSG_LINK_SUMMARY_NACK,
220 LMPF_MSG_CHANNEL_FAIL,
221 LMPF_MSG_CHANNEL_FAIL_ACK,
222 LMPF_MSG_CHANNEL_FAIL_NACK,
223 LMPF_MSG_CHANNEL_STATUS,
224 LMPF_MSG_CHANNEL_STATUS_ACK,
225 LMPF_MSG_CHANNEL_STATUS_REQ,
226 LMPF_MSG_CHANNEL_STATUS_RESP,
228 /* LMP Message Header Fields ------------------ */
230 LMPF_HDR_FLAGS_CC_DOWN,
231 LMPF_HDR_FLAGS_REBOOT,
233 LMPF_HDR_FLAGS_AUTHENTICATION,
235 /* LMP Object Class Filters -------------------- */
238 LMPF_CLASS_LOCAL_CCID,
239 LMPF_CLASS_REMOTE_CCID,
240 LMPF_CLASS_LOCAL_NODE_ID,
241 LMPF_CLASS_REMOTE_NODE_ID,
242 LMPF_CLASS_LOCAL_LINK_ID,
243 LMPF_CLASS_REMOTE_LINK_ID,
244 LMPF_CLASS_LOCAL_INTERFACE_ID,
245 LMPF_CLASS_REMOTE_INTERFACE_ID,
246 LMPF_CLASS_MESSAGE_ID,
247 LMPF_CLASS_MESSAGE_ID_ACK,
250 LMPF_CLASS_BEGIN_VERIFY,
251 LMPF_CLASS_BEGIN_VERIFY_ACK,
252 LMPF_CLASS_VERIFY_ID,
254 LMPF_CLASS_DATA_LINK,
255 LMPF_CLASS_CHANNEL_STATUS,
256 LMPF_CLASS_CHANNEL_STATUS_REQUEST,
261 LMPF_VAL_REMOTE_CCID,
262 LMPF_VAL_LOCAL_NODE_ID,
263 LMPF_VAL_REMOTE_NODE_ID,
264 LMPF_VAL_LOCAL_LINK_ID_IPV4,
265 LMPF_VAL_LOCAL_LINK_ID_UNNUM,
266 LMPF_VAL_REMOTE_LINK_ID_IPV4,
267 LMPF_VAL_REMOTE_LINK_ID_UNNUM,
268 LMPF_VAL_LOCAL_INTERFACE_ID_IPV4,
269 LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM,
270 LMPF_VAL_REMOTE_INTERFACE_ID_IPV4,
271 LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM,
273 LMPF_VAL_MESSAGE_ID_ACK,
274 LMPF_VAL_CONFIG_HELLO,
275 LMPF_VAL_CONFIG_HELLO_DEAD,
276 LMPF_VAL_HELLO_TXSEQ,
277 LMPF_VAL_HELLO_RXSEQ,
279 LMPF_VAL_BEGIN_VERIFY_FLAGS,
280 LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS,
281 LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE,
282 LMPF_VAL_BEGIN_VERIFY_INTERVAL,
283 LMPF_VAL_BEGIN_VERIFY_ENCTYPE,
284 LMPF_VAL_BEGIN_VERIFY_TRANSPORT,
285 LMPF_VAL_BEGIN_VERIFY_TRANSMISSION_RATE,
286 LMPF_VAL_BEGIN_VERIFY_WAVELENGTH,
289 LMPF_VAL_TE_LINK_FLAGS,
290 LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT,
291 LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY,
292 LMPF_VAL_TE_LINK_LOCAL_IPV4,
293 LMPF_VAL_TE_LINK_LOCAL_UNNUM,
294 LMPF_VAL_TE_LINK_REMOTE_IPV4,
295 LMPF_VAL_TE_LINK_REMOTE_UNNUM,
297 LMPF_VAL_DATA_LINK_FLAGS,
298 LMPF_VAL_DATA_LINK_FLAGS_PORT,
299 LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED,
300 LMPF_VAL_DATA_LINK_LOCAL_IPV4,
301 LMPF_VAL_DATA_LINK_LOCAL_UNNUM,
302 LMPF_VAL_DATA_LINK_REMOTE_IPV4,
303 LMPF_VAL_DATA_LINK_REMOTE_UNNUM,
304 LMPF_VAL_DATA_LINK_SUBOBJ,
305 LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE,
306 LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING,
309 LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK,
310 LMPF_VAL_ERROR_VERIFY_UNWILLING,
311 LMPF_VAL_ERROR_VERIFY_TRANSPORT,
312 LMPF_VAL_ERROR_VERIFY_TE_LINK_ID,
313 LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS,
314 LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE,
315 LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID,
316 LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK,
317 LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK,
318 LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS,
319 LMPF_VAL_ERROR_CONFIG_RENEGOTIATE,
320 LMPF_VAL_ERROR_CONFIG_BAD_CCID,
325 static int lmp_filter[LMPF_MAX];
327 static hf_register_info lmpf_info[] = {
329 /* Message type number */
330 {&lmp_filter[LMPF_MSG],
331 { "Message Type", "lmp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
334 /* Message type shorthands */
335 {&lmp_filter[LMPF_MSG_CONFIG],
336 { "Config Message", "lmp.msg.config", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
339 {&lmp_filter[LMPF_MSG_CONFIG_ACK],
340 { "ConfigAck Message", "lmp.msg.configack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
343 {&lmp_filter[LMPF_MSG_CONFIG_NACK],
344 { "ConfigNack Message", "lmp.msg.confignack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
347 {&lmp_filter[LMPF_MSG_HELLO],
348 { "HELLO Message", "lmp.msg.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
351 {&lmp_filter[LMPF_MSG_BEGIN_VERIFY],
352 { "BeginVerify Message", "lmp.msg.beginverify", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
355 {&lmp_filter[LMPF_MSG_BEGIN_VERIFY_ACK],
356 { "BeginVerifyAck Message", "lmp.msg.beginverifyack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
359 {&lmp_filter[LMPF_MSG_BEGIN_VERIFY_NACK],
360 { "BeginVerifyNack Message", "lmp.msg.beginverifynack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
363 {&lmp_filter[LMPF_MSG_END_VERIFY],
364 { "EndVerify Message", "lmp.msg.endverify", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
367 {&lmp_filter[LMPF_MSG_END_VERIFY_ACK],
368 { "EndVerifyAck Message", "lmp.msg.endverifyack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
371 {&lmp_filter[LMPF_MSG_TEST],
372 { "Test Message", "lmp.msg.test", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
375 {&lmp_filter[LMPF_MSG_TEST_STATUS_SUCCESS],
376 { "TestStatusSuccess Message", "lmp.msg.teststatussuccess", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
379 {&lmp_filter[LMPF_MSG_TEST_STATUS_FAILURE],
380 { "TestStatusFailure Message", "lmp.msg.teststatusfailure", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
383 {&lmp_filter[LMPF_MSG_TEST_STATUS_ACK],
384 { "TestStatusAck Message", "lmp.msg.teststatusack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
387 {&lmp_filter[LMPF_MSG_LINK_SUMMARY],
388 { "LinkSummary Message", "lmp.msg.linksummary", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
391 {&lmp_filter[LMPF_MSG_LINK_SUMMARY_ACK],
392 { "LinkSummaryAck Message", "lmp.msg.linksummaryack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
395 {&lmp_filter[LMPF_MSG_LINK_SUMMARY_NACK],
396 { "LinkSummaryNack Message", "lmp.msg.linksummarynack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
399 {&lmp_filter[LMPF_MSG_CHANNEL_FAIL],
400 { "ChannelFail Message", "lmp.msg.channelfail", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
403 {&lmp_filter[LMPF_MSG_CHANNEL_FAIL_ACK],
404 { "ChannelFailAck Message", "lmp.msg.channelfailack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
407 {&lmp_filter[LMPF_MSG_CHANNEL_FAIL_NACK],
408 { "ChannelFailNack Message", "lmp.msg.channelfailnack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
411 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS],
412 { "ChannelStatus Message", "lmp.msg.channelstatus", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
415 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS_ACK],
416 { "ChannelStatusAck Message", "lmp.msg.channelstatusack", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
419 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS_REQ],
420 { "ChannelStatusRequest Message", "lmp.msg.channelstatusrequest", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
423 {&lmp_filter[LMPF_MSG_CHANNEL_STATUS_RESP],
424 { "ChannelStatusResponse Message", "lmp.msg.channelstatusresponse", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
428 /* LMP Message Header Fields ------------------- */
430 {&lmp_filter[LMPF_HDR_FLAGS],
431 { "LMP Header - Flags", "lmp.hdr.flags", FT_UINT8, BASE_DEC, NULL, 0x0,
434 {&lmp_filter[LMPF_HDR_FLAGS_CC_DOWN],
435 { "ControlChannelDown", "lmp.hdr.ccdown", FT_BOOLEAN, 8, NULL, 0x01,
438 {&lmp_filter[LMPF_HDR_FLAGS_REBOOT],
439 { "Reboot", "lmp.hdr.reboot", FT_BOOLEAN, 8, NULL, 0x02,
442 {&lmp_filter[LMPF_HDR_FLAGS_DWDM],
443 { "DWDM Node", "lmp.hdr.dwdm", FT_BOOLEAN, 8, NULL, 0x04,
446 {&lmp_filter[LMPF_HDR_FLAGS_AUTHENTICATION],
447 { "Authentication", "lmp.hdr.auth", FT_BOOLEAN, 8, NULL, 0x08,
450 /* LMP object class filters ------------------------------- */
452 {&lmp_filter[LMPF_OBJECT],
453 { "LOCAL_CCID", "lmp.object", FT_UINT8, BASE_DEC, NULL, 0x0,
456 {&lmp_filter[LMPF_CLASS_LOCAL_CCID],
457 { "LOCAL_CCID", "lmp.obj.local_ccid", FT_NONE, BASE_NONE, NULL, 0x0,
459 {&lmp_filter[LMPF_CLASS_REMOTE_CCID],
460 { "REMOTE_CCID", "lmp.obj.remote_ccid", FT_NONE, BASE_NONE, NULL, 0x0,
463 {&lmp_filter[LMPF_CLASS_LOCAL_NODE_ID],
464 { "LOCAL_NODE_ID", "lmp.obj.local_nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
466 {&lmp_filter[LMPF_CLASS_REMOTE_NODE_ID],
467 { "REMOTE_NODE_ID", "lmp.obj.remote_nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
470 {&lmp_filter[LMPF_CLASS_LOCAL_NODE_ID],
471 { "LOCAL_NODE_ID", "lmp.obj.local_nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
473 {&lmp_filter[LMPF_CLASS_REMOTE_NODE_ID],
474 { "REMOTE_NODE_ID", "lmp.obj.remote_nodeid", FT_NONE, BASE_NONE, NULL, 0x0,
477 {&lmp_filter[LMPF_CLASS_LOCAL_LINK_ID],
478 { "LOCAL_LINK_ID", "lmp.obj.local_linkid", FT_NONE, BASE_NONE, NULL, 0x0,
480 {&lmp_filter[LMPF_CLASS_REMOTE_LINK_ID],
481 { "REMOTE_LINK_ID", "lmp.obj.remote_linkid", FT_NONE, BASE_NONE, NULL, 0x0,
484 {&lmp_filter[LMPF_CLASS_LOCAL_INTERFACE_ID],
485 { "LOCAL_INTERFACE_ID", "lmp.obj.local_interfaceid", FT_NONE, BASE_NONE, NULL, 0x0,
487 {&lmp_filter[LMPF_CLASS_REMOTE_INTERFACE_ID],
488 { "REMOTE_INTERFACE_ID", "lmp.obj.remote_interfaceid", FT_NONE, BASE_NONE, NULL, 0x0,
491 {&lmp_filter[LMPF_CLASS_MESSAGE_ID],
492 { "MESSAGE_ID", "lmp.obj.messageid", FT_NONE, BASE_NONE, NULL, 0x0,
494 {&lmp_filter[LMPF_CLASS_MESSAGE_ID_ACK],
495 { "MESSAGE_ID_ACK", "lmp.obj.messageid_ack", FT_NONE, BASE_NONE, NULL, 0x0,
498 {&lmp_filter[LMPF_CLASS_CONFIG],
499 { "CONFIG", "lmp.obj.config", FT_NONE, BASE_NONE, NULL, 0x0,
502 {&lmp_filter[LMPF_CLASS_HELLO],
503 { "HELLO", "lmp.obj.hello", FT_NONE, BASE_NONE, NULL, 0x0,
506 {&lmp_filter[LMPF_CLASS_BEGIN_VERIFY],
507 { "BEGIN_VERIFY", "lmp.obj.begin_verify", FT_NONE, BASE_NONE, NULL, 0x0,
509 {&lmp_filter[LMPF_CLASS_BEGIN_VERIFY_ACK],
510 { "BEGIN_VERIFY_ACK", "lmp.obj.begin_verify_ack", FT_NONE, BASE_NONE, NULL, 0x0,
512 {&lmp_filter[LMPF_CLASS_VERIFY_ID],
513 { "VERIFY_ID", "lmp.obj.verifyid", FT_NONE, BASE_NONE, NULL, 0x0,
516 {&lmp_filter[LMPF_CLASS_TE_LINK],
517 { "TE_LINK", "lmp.obj.te_link", FT_NONE, BASE_NONE, NULL, 0x0,
519 {&lmp_filter[LMPF_CLASS_DATA_LINK],
520 { "DATA_LINK", "lmp.obj.data_link", FT_NONE, BASE_NONE, NULL, 0x0,
523 {&lmp_filter[LMPF_CLASS_CHANNEL_STATUS],
524 { "CHANNEL_STATUS", "lmp.obj.channel_status", FT_NONE, BASE_NONE, NULL, 0x0,
526 {&lmp_filter[LMPF_CLASS_CHANNEL_STATUS_REQUEST],
527 { "CHANNEL_STATUS_REQUEST", "lmp.obj.channel_status_request", FT_NONE, BASE_NONE, NULL, 0x0,
530 {&lmp_filter[LMPF_CLASS_ERROR],
531 { "ERROR", "lmp.obj.error", FT_NONE, BASE_NONE, NULL, 0x0,
534 /* Other LMP Value Filters ------------------------------ */
536 {&lmp_filter[LMPF_VAL_CTYPE],
537 { "Object C-Type", "lmp.obj.ctype", FT_UINT8, BASE_DEC, NULL, 0x0,
540 {&lmp_filter[LMPF_VAL_LOCAL_CCID],
541 { "Local CCID Value", "lmp.local_ccid", FT_UINT32, BASE_DEC, NULL, 0x0,
543 {&lmp_filter[LMPF_VAL_REMOTE_CCID],
544 { "Remote CCID Value", "lmp.remote_ccid", FT_UINT32, BASE_DEC, NULL, 0x0,
547 {&lmp_filter[LMPF_VAL_LOCAL_NODE_ID],
548 { "Local Node ID Value", "lmp.local_nodeid", FT_IPv4, BASE_NONE, NULL, 0x0,
550 {&lmp_filter[LMPF_VAL_REMOTE_NODE_ID],
551 { "Remote Node ID Value", "lmp.remote_nodeid", FT_IPv4, BASE_NONE, NULL, 0x0,
554 {&lmp_filter[LMPF_VAL_LOCAL_LINK_ID_IPV4],
555 { "Local Link ID - IPv4", "lmp.local_linkid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
557 {&lmp_filter[LMPF_VAL_LOCAL_LINK_ID_UNNUM],
558 { "Local Link ID - Unnumbered", "lmp.local_linkid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
560 {&lmp_filter[LMPF_VAL_REMOTE_LINK_ID_IPV4],
561 { "Remote Link ID - IPv4", "lmp.remote_linkid_ipv4", FT_UINT32, BASE_DEC, NULL, 0x0,
563 {&lmp_filter[LMPF_VAL_REMOTE_LINK_ID_UNNUM],
564 { "Remote Link ID - Unnumbered", "lmp.remote_linkid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
567 {&lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_IPV4],
568 { "Local Interface ID - IPv4", "lmp.local_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
570 {&lmp_filter[LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM],
571 { "Local Interface ID - Unnumbered", "lmp.local_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
573 {&lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_IPV4],
574 { "Remote Interface ID - IPv4", "lmp.remote_interfaceid_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
576 {&lmp_filter[LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM],
577 { "Remote Interface ID - Unnumbered", "lmp.remote_interfaceid_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
580 {&lmp_filter[LMPF_VAL_MESSAGE_ID],
581 { "Message-ID Value", "lmp.messageid", FT_UINT32, BASE_DEC, NULL, 0x0,
583 {&lmp_filter[LMPF_VAL_MESSAGE_ID_ACK],
584 { "Message-ID Ack Value", "lmp.messageid_ack", FT_UINT32, BASE_DEC, NULL, 0x0,
587 {&lmp_filter[LMPF_VAL_CONFIG_HELLO],
588 { "HelloInterval", "lmp.hellointerval", FT_UINT32, BASE_DEC, NULL, 0x0,
590 {&lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
591 { "HelloDeadInterval", "lmp.hellodeadinterval", FT_UINT32, BASE_DEC, NULL, 0x0,
594 {&lmp_filter[LMPF_VAL_HELLO_TXSEQ],
595 { "TxSeqNum", "lmp.txseqnum", FT_UINT32, BASE_DEC, NULL, 0x0,
597 {&lmp_filter[LMPF_VAL_HELLO_RXSEQ],
598 { "RxSeqNum", "lmp.rxseqnum", FT_UINT32, BASE_DEC, NULL, 0x0,
601 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS],
602 { "Flags", "lmp.begin_verify.flags", FT_UINT16, BASE_HEX, NULL, 0x0,
604 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
605 { "Verify All Links", "lmp.begin_verify.all_links",
606 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
607 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
608 { "Data Link Type", "lmp.begin_verify.link_type",
609 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
610 {&lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
611 { "Encoding Type", "lmp.begin_verify.enctype", FT_UINT8, BASE_DEC, VALS(gmpls_lsp_enc_str), 0x0,
613 {&lmp_filter[LMPF_VAL_VERIFY_ID],
614 { "Verify-ID", "lmp.verifyid", FT_UINT32, BASE_DEC, NULL, 0x0,
617 {&lmp_filter[LMPF_VAL_TE_LINK_FLAGS],
618 { "TE-Link Flags", "lmp.te_link_flags", FT_UINT8, BASE_HEX, NULL, 0x0,
620 {&lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
621 { "Fault Management Supported", "lmp.te_link.fault_mgmt",
622 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
623 {&lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
624 { "Link Verification Supported", "lmp.te_link.link_verify",
625 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
626 {&lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
627 { "TE-Link Local ID - IPv4", "lmp.te_link.local_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
629 {&lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
630 { "TE-Link Local ID - Unnumbered", "lmp.te_link.local_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
632 {&lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
633 { "TE-Link Remote ID - IPv4", "lmp.te_link.remote_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
635 {&lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
636 { "TE-Link Remote ID - Unnumbered", "lmp.te_link.remote_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
639 {&lmp_filter[LMPF_VAL_DATA_LINK_FLAGS],
640 { "Data-Link Flags", "lmp.data_link_flags", FT_UINT8, BASE_HEX, NULL, 0x0,
642 {&lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
643 { "Data-Link is Individual Port", "lmp.data_link.port",
644 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
645 {&lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
646 { "Data-Link is Allocated", "lmp.data_link.link_verify",
647 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
648 {&lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
649 { "Data-Link Local ID - IPv4", "lmp.data_link.local_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
651 {&lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
652 { "Data-Link Local ID - Unnumbered", "lmp.data_link.local_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
654 {&lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
655 { "Data-Link Remote ID - IPv4", "lmp.data_link.remote_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0,
657 {&lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
658 { "Data-Link Remote ID - Unnumbered", "lmp.data_link.remote_unnum", FT_UINT32, BASE_DEC, NULL, 0x0,
660 {&lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
661 { "Subobject", "lmp.data_link_subobj", FT_NONE, BASE_DEC, NULL, 0x0,
663 {&lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
664 { "Interface Switching Capability", "lmp.data_link_switching", FT_UINT8, BASE_DEC,
665 VALS(gmpls_switching_type_str), 0x0, "", HFILL }},
666 {&lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
667 { "LSP Encoding Type", "lmp.data_link_encoding", FT_UINT8, BASE_DEC,
668 VALS(gmpls_lsp_enc_str), 0x0, "", HFILL }},
670 {&lmp_filter[LMPF_VAL_ERROR],
671 { "Error Code", "lmp.error", FT_UINT32, BASE_HEX, NULL, 0x0,
674 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
675 { "Verification - Unsupported for this TE-Link", "lmp.error.verify_unsupported_link",
676 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
677 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
678 { "Verification - Unwilling to Verify at this time", "lmp.error.verify_unwilling",
679 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
680 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
681 { "Verification - Transport Unsupported", "lmp.error.verify_unsupported_transport",
682 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
683 {&lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
684 { "Verification - TE Link ID Configuration Error", "lmp.error.verify_te_link_id",
685 FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
687 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
688 { "Summary - Unacceptable non-negotiable parameters", "lmp.error.summary_bad_params",
689 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
690 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
691 { "Summary - Renegotiate Parametere", "lmp.error.summary_renegotiate",
692 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
693 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
694 { "Summary - Bad Remote Link ID", "lmp.error.summary_bad_remote_linkid",
695 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
696 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
697 { "Summary - Bad TE Link Object", "lmp.error.summary_bad_te_link",
698 FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
699 {&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
700 { "Summary - Bad Data Link Object", "lmp.error.summary_bad_data_link",
701 FT_BOOLEAN, 8, NULL, 0x10, "", HFILL }},
703 {&lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
704 { "Config - Unacceptable non-negotiable parameters", "lmp.error.config_bad_params",
705 FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
706 {&lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
707 { "Config - Renegotiate Parametere", "lmp.error.config_renegotiate",
708 FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
709 {&lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
710 { "Config - Bad CC ID", "lmp.error.config_bad_ccid",
711 FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
715 lmp_class_to_filter_num(int class)
717 if (VALID_CLASS(class))
718 return class + LMPF_OBJECT;
722 /*------------------------------------------------------------------------------
725 * We have two types of subtrees - a statically defined, constant set and
726 * a class set - one for each class. The static ones are before all the class ones
731 LMP_TREE_HEADER_FLAGS,
732 LMP_TREE_OBJECT_HEADER,
733 LMP_TREE_ERROR_FLAGS,
734 LMP_TREE_BEGIN_VERIFY_FLAGS,
735 LMP_TREE_BEGIN_VERIFY_TRANSPORT_FLAGS,
736 LMP_TREE_TE_LINK_FLAGS,
737 LMP_TREE_DATA_LINK_FLAGS,
738 LMP_TREE_DATA_LINK_SUBOBJ,
739 LMP_TREE_CHANNEL_STATUS_ID,
743 #define NUM_LMP_SUBTREES (LMP_TREE_CLASS_START + LMP_CLASS_MAX)
745 static gint lmp_subtree[NUM_LMP_SUBTREES];
747 static int lmp_class_to_subtree(int class)
749 if (VALID_CLASS(class))
750 return lmp_subtree[LMP_TREE_CLASS_START + class];
755 /*------------------------------------------------------------------------------
760 dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
763 proto_tree *lmp_tree = NULL, *ti, *ti2;
764 proto_tree *lmp_header_tree;
765 proto_tree *lmp_header_flags_tree;
766 proto_tree *lmp_object_tree;
767 proto_tree *lmp_object_header_tree;
768 proto_tree *lmp_flags_tree;
769 proto_tree *lmp_subobj_tree;
774 guint16 cksum, computed_cksum;
782 if (check_col(pinfo->cinfo, COL_PROTOCOL))
783 col_set_str(pinfo->cinfo, COL_PROTOCOL, "LMP");
784 if (check_col(pinfo->cinfo, COL_INFO))
785 col_clear(pinfo->cinfo, COL_INFO);
787 version = (tvb_get_guint8(tvb, offset+0)) >> 4;
788 flags = tvb_get_guint8(tvb, offset+2);
789 message_type = tvb_get_guint8(tvb, offset+3);
790 if (check_col(pinfo->cinfo, COL_INFO)) {
791 col_add_str(pinfo->cinfo, COL_INFO,
792 val_to_str(message_type, message_type_vals, "Unknown (%u). "));
796 msg_length = tvb_get_ntohs(tvb, offset+4);
797 ti = proto_tree_add_item(tree, proto_lmp, tvb, offset, msg_length,
799 lmp_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_MAIN]);
801 ti = proto_tree_add_text(lmp_tree, tvb, offset, 12, "LMP Header. %s",
802 val_to_str(message_type, message_type_vals,
803 "Unknown Message (%u). "));
804 lmp_header_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_HEADER]);
806 proto_tree_add_text(lmp_header_tree, tvb, offset, 1, "LMP Version: %u",
808 ti = proto_tree_add_text(lmp_header_tree, tvb, offset+2, 1, "Flags: %02x",
810 lmp_header_flags_tree = proto_item_add_subtree(ti, lmp_subtree[LMP_TREE_HEADER_FLAGS]);
811 proto_tree_add_boolean(lmp_header_flags_tree, lmp_filter[LMPF_HDR_FLAGS_CC_DOWN],
812 tvb, offset+2, 1, flags);
813 proto_tree_add_boolean(lmp_header_flags_tree, lmp_filter[LMPF_HDR_FLAGS_REBOOT],
814 tvb, offset+2, 1, flags);
815 proto_tree_add_boolean(lmp_header_flags_tree, lmp_filter[LMPF_HDR_FLAGS_DWDM],
816 tvb, offset+2, 1, flags);
817 proto_tree_add_boolean(lmp_header_flags_tree, lmp_filter[LMPF_HDR_FLAGS_AUTHENTICATION],
818 tvb, offset+2, 1, flags);
819 proto_tree_add_uint(lmp_header_tree, lmp_filter[LMPF_MSG], tvb,
820 offset+3, 1, message_type);
821 proto_tree_add_text(lmp_header_tree, tvb, offset+4, 2, "Length: %d bytes",
823 if (LMPF_MSG + message_type <= LMPF_MSG_CHANNEL_STATUS_RESP &&
825 proto_tree_add_boolean_hidden(lmp_header_tree, lmp_filter[LMPF_MSG + message_type], tvb,
828 proto_tree_add_protocol_format(lmp_header_tree, proto_malformed, tvb, offset+3, 1,
829 "Invalid message type: %u", message_type);
833 cksum = tvb_get_ntohs(tvb, offset+6);
834 if (!pinfo->fragmented && (int) tvb_length(tvb) >= msg_length) {
835 /* The packet isn't part of a fragmented datagram and isn't
836 truncated, so we can checksum it. */
837 cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, msg_length);
838 cksum_vec[0].len = msg_length;
839 computed_cksum = in_cksum(&cksum_vec[0], 1);
840 if (computed_cksum == 0) {
841 proto_tree_add_text(lmp_header_tree, tvb, offset+6, 2,
842 "Message Checksum: 0x%04x (correct)",
845 proto_tree_add_text(lmp_header_tree, tvb, offset+6, 2,
846 "Message Checksum: 0x%04x (incorrect, should be 0x%04x)",
848 in_cksum_shouldbe(cksum, computed_cksum));
851 proto_tree_add_text(lmp_header_tree, tvb, offset+6, 2,
852 "Message Checksum: 0x%04x",
855 proto_tree_add_text(lmp_header_tree, tvb, offset+8, 4,
856 "Local Control Channel ID: %d (%s)",
857 tvb_get_ntohl(tvb, offset+8),
858 ip_to_str(tvb_get_ptr(tvb, offset+8, 4)));
862 while (len < msg_length) {
868 obj_length = tvb_get_ntohs(tvb, offset+2);
869 class = tvb_get_guint8(tvb, offset+1);
870 type = tvb_get_guint8(tvb, offset);
871 negotiable = (type >> 7); type &= 0x7f;
872 object_type = val_to_str(class, lmp_class_vals, "Unknown");
873 proto_tree_add_uint_hidden(lmp_tree, lmp_filter[LMPF_OBJECT], tvb,
875 if (VALID_CLASS(class)) {
876 ti = proto_tree_add_item(lmp_tree, lmp_filter[lmp_class_to_filter_num(class)],
877 tvb, offset, obj_length, FALSE);
879 proto_tree_add_protocol_format(lmp_tree, proto_malformed, tvb, offset+1, 1,
880 "Invalid class: %u", class);
884 lmp_object_tree = proto_item_add_subtree(ti, lmp_class_to_subtree(class));
886 ti2 = proto_tree_add_text(lmp_object_tree, tvb, offset, 4,
887 "Header. Class %d, C-Type %d, Length %d, %s",
888 class, type, obj_length,
889 negotiable ? "Negotiable" : "Not Negotiable");
890 lmp_object_header_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_OBJECT_HEADER]);
891 proto_tree_add_text(lmp_object_header_tree, tvb, offset, 1,
892 negotiable ? "Negotiable" : "Not Negotiable");
893 proto_tree_add_text(lmp_object_header_tree, tvb, offset+2, 2,
894 "Length: %u", obj_length);
895 proto_tree_add_text(lmp_object_header_tree, tvb, offset+1, 1,
896 "Object Class: %u - %s",
898 proto_tree_add_item(lmp_object_header_tree, lmp_filter[LMPF_VAL_CTYPE],
899 tvb, offset, 1, type);
901 mylen = obj_length - 4;
908 case LMP_CLASS_LOCAL_CCID:
909 case LMP_CLASS_REMOTE_CCID:
912 l = (class == LMP_CLASS_LOCAL_CCID) ?
913 LMPF_VAL_LOCAL_CCID : LMPF_VAL_REMOTE_CCID;
914 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
915 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
916 tvb_get_ntohl(tvb, offset2));
919 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
920 "Data (%d bytes)", mylen);
925 case LMP_CLASS_LOCAL_NODE_ID:
926 case LMP_CLASS_REMOTE_NODE_ID:
929 l = (class == LMP_CLASS_LOCAL_NODE_ID) ?
930 LMPF_VAL_LOCAL_NODE_ID : LMPF_VAL_REMOTE_NODE_ID;
931 proto_item_append_text(ti, ": %s",
932 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
933 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
937 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
938 "Data (%d bytes)", mylen);
943 case LMP_CLASS_LOCAL_LINK_ID:
944 case LMP_CLASS_REMOTE_LINK_ID:
947 l = (class == LMP_CLASS_LOCAL_LINK_ID) ?
948 LMPF_VAL_LOCAL_LINK_ID_IPV4 : LMPF_VAL_REMOTE_LINK_ID_IPV4;
949 proto_item_append_text(ti, ": IPv4 %s",
950 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
951 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
955 proto_item_append_text(ti, ": IPv6 %s",
956 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
957 proto_tree_add_text(lmp_object_tree, tvb, offset2, 16, "IPv6: %s",
958 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
961 l = (class == LMP_CLASS_LOCAL_LINK_ID) ?
962 LMPF_VAL_LOCAL_LINK_ID_UNNUM : LMPF_VAL_REMOTE_LINK_ID_UNNUM;
963 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2));
964 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
968 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
969 "Data (%d bytes)", mylen);
974 case LMP_CLASS_LOCAL_INTERFACE_ID:
975 case LMP_CLASS_REMOTE_INTERFACE_ID:
978 l = (class == LMP_CLASS_LOCAL_INTERFACE_ID) ?
979 LMPF_VAL_LOCAL_INTERFACE_ID_IPV4 : LMPF_VAL_REMOTE_INTERFACE_ID_IPV4;
980 proto_item_append_text(ti, ": IPv4 %s",
981 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
982 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
986 proto_item_append_text(ti, ": IPv6 %s",
987 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
988 proto_tree_add_text(lmp_object_tree, tvb, offset2, 16, "IPv6: %s",
989 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
992 l = (class == LMP_CLASS_LOCAL_INTERFACE_ID) ?
993 LMPF_VAL_LOCAL_INTERFACE_ID_UNNUM : LMPF_VAL_REMOTE_INTERFACE_ID_UNNUM;
994 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2));
995 proto_tree_add_item(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
999 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1000 "Data (%d bytes)", mylen);
1005 case LMP_CLASS_MESSAGE_ID:
1006 case LMP_CLASS_MESSAGE_ID_ACK:
1009 l = (class == LMP_CLASS_MESSAGE_ID) ?
1010 LMPF_VAL_MESSAGE_ID : LMPF_VAL_MESSAGE_ID_ACK;
1011 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1012 proto_tree_add_uint(lmp_object_tree, lmp_filter[l], tvb, offset2, 4,
1013 tvb_get_ntohl(tvb, offset2));
1016 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1017 "Data (%d bytes)", mylen);
1022 case LMP_CLASS_CONFIG:
1025 proto_item_append_text(ti, ": HelloInterval: %d, HelloDeadInterval: %d",
1026 tvb_get_ntohs(tvb, offset2), tvb_get_ntohs(tvb, offset2+2));
1027 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_CONFIG_HELLO],
1028 tvb, offset2, 2, tvb_get_ntohs(tvb, offset2));
1029 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_CONFIG_HELLO_DEAD],
1030 tvb, offset2+2, 2, tvb_get_ntohs(tvb, offset2+2));
1033 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1034 "Data (%d bytes)", mylen);
1039 case LMP_CLASS_HELLO:
1042 proto_item_append_text(ti, ": TxSeq %d, RxSeq: %d",
1043 tvb_get_ntohl(tvb, offset2),
1044 tvb_get_ntohl(tvb, offset2+4));
1045 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_HELLO_TXSEQ],
1046 tvb, offset2, 4, tvb_get_ntohl(tvb, offset2));
1047 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_HELLO_RXSEQ],
1048 tvb, offset2+4, 4, tvb_get_ntohl(tvb, offset2+4));
1051 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1052 "Data (%d bytes)", mylen);
1057 case LMP_CLASS_BEGIN_VERIFY:
1060 l = tvb_get_ntohs(tvb, offset2);
1061 ti2 = proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS],
1062 tvb, offset2, 2, FALSE);
1064 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_BEGIN_VERIFY_FLAGS]);
1065 proto_tree_add_boolean(lmp_flags_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_ALL_LINKS],
1066 tvb, offset2, 2, l);
1067 proto_tree_add_boolean(lmp_flags_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_FLAGS_LINK_TYPE],
1068 tvb, offset2, 2, l);
1069 proto_tree_add_text(lmp_object_tree, tvb, offset2+2, 2,
1070 "Verify Interval: %d ms", tvb_get_ntohs(tvb, offset2+2));
1071 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 4,
1072 "Number of Data Links: %d", tvb_get_ntohl(tvb, offset2+4));
1073 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_BEGIN_VERIFY_ENCTYPE],
1074 tvb, offset2+8, 1, FALSE);
1075 proto_tree_add_text(lmp_object_tree, tvb, offset2+10, 2,
1076 "Verify Transport Mechanism: 0x%0x", tvb_get_ntohs(tvb, offset2+10));
1077 proto_tree_add_text(lmp_object_tree, tvb, offset2+12, 4,
1078 "Transmission Rate: %.10g", tvb_get_ntohieee_float(tvb, offset2+12));
1079 proto_tree_add_text(lmp_object_tree, tvb, offset2+16, 4,
1080 "Wavelength: %d", tvb_get_ntohl(tvb, offset2+4));
1083 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1084 "Data (%d bytes)", mylen);
1089 case LMP_CLASS_BEGIN_VERIFY_ACK:
1092 proto_item_append_text(ti, ": VerifyDeadInterval: %d, TransportResponse: 0x%0x",
1093 tvb_get_ntohs(tvb, offset2), tvb_get_ntohs(tvb, offset2+2));
1094 proto_tree_add_text(lmp_object_tree, tvb, offset2, 2,
1095 "VerifyDeadInterval: %d ms", tvb_get_ntohs(tvb, offset2));
1096 proto_tree_add_text(lmp_object_tree, tvb, offset2+2, 2,
1097 "Verify Transport Response: 0x%0x", tvb_get_ntohs(tvb, offset2+2));
1100 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1101 "Data (%d bytes)", mylen);
1106 case LMP_CLASS_VERIFY_ID:
1109 proto_item_append_text(ti, ": %d", tvb_get_ntohl(tvb, offset2));
1110 proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_VERIFY_ID], tvb, offset2, 4,
1111 tvb_get_ntohl(tvb, offset2));
1114 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1115 "Data (%d bytes)", mylen);
1120 case LMP_CLASS_TE_LINK:
1121 l = tvb_get_guint8(tvb, offset2);
1122 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_FLAGS],
1123 tvb, offset2, 1, l);
1124 proto_item_append_text(ti2, ": %s%s",
1125 (l&0x01) ? "Fault-Mgmt-Supported " : "",
1126 (l&0x02) ? "Link-Verification-Supported " : "");
1127 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_TE_LINK_FLAGS]);
1128 proto_tree_add_boolean(lmp_flags_tree,
1129 lmp_filter[LMPF_VAL_TE_LINK_FLAGS_FAULT_MGMT],
1130 tvb, offset2, 1, l);
1131 proto_tree_add_boolean(lmp_flags_tree,
1132 lmp_filter[LMPF_VAL_TE_LINK_FLAGS_LINK_VERIFY],
1133 tvb, offset2, 1, l);
1136 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1137 ip_to_str(tvb_get_ptr(tvb, offset2+4, 4)),
1138 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
1139 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_LOCAL_IPV4],
1140 tvb, offset2+4, 4, FALSE);
1141 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_REMOTE_IPV4],
1142 tvb, offset2+8, 4, FALSE);
1145 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1146 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)),
1147 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+8, 16)));
1148 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 16, "TE-Link Local ID - IPv6: %s",
1149 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1150 proto_tree_add_text(lmp_object_tree, tvb, offset2+20,16, "TE-Link Remote ID - IPv6: %s",
1151 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)));
1154 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1155 tvb_get_ntohl(tvb, offset2+4), tvb_get_ntohl(tvb, offset2+8));
1156 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_LOCAL_UNNUM],
1157 tvb, offset2+4, 4, FALSE);
1158 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_TE_LINK_REMOTE_UNNUM],
1159 tvb, offset2+8, 4, FALSE);
1162 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1163 "Data (%d bytes)", mylen);
1168 case LMP_CLASS_DATA_LINK:
1169 l = tvb_get_guint8(tvb, offset2);
1170 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_FLAGS],
1171 tvb, offset2, 1, l);
1172 proto_item_append_text(ti2, ": %s%s",
1173 (l&0x01) ? "Interface-Type-Port " : "Interface-Type-Component-Link ",
1174 (l&0x02) ? "Allocated " : "Unallocated ");
1175 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_DATA_LINK_FLAGS]);
1176 proto_tree_add_boolean(lmp_flags_tree,
1177 lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_PORT],
1178 tvb, offset2, 1, l);
1179 proto_tree_add_boolean(lmp_flags_tree,
1180 lmp_filter[LMPF_VAL_DATA_LINK_FLAGS_ALLOCATED],
1181 tvb, offset2, 1, l);
1184 proto_item_append_text(ti, ": IPv4: Local %s, Remote %s",
1185 ip_to_str(tvb_get_ptr(tvb, offset2+4, 4)),
1186 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
1187 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_IPV4],
1188 tvb, offset2+4, 4, FALSE);
1189 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_IPV4],
1190 tvb, offset2+8, 4, FALSE);
1194 proto_item_append_text(ti, ": IPv6: Local %s, Remote %s",
1195 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)),
1196 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+8, 16)));
1197 proto_tree_add_text(lmp_object_tree, tvb, offset2+4, 16,
1198 "Data-Link Local ID - IPv6: %s",
1199 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1200 proto_tree_add_text(lmp_object_tree, tvb, offset2+20,16,
1201 "Data-Link Remote ID - IPv6: %s",
1202 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+4, 16)));
1206 proto_item_append_text(ti, ": Unnumbered: Local %d, Remote %d",
1207 tvb_get_ntohl(tvb, offset2+4), tvb_get_ntohl(tvb, offset2+8));
1208 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_LOCAL_UNNUM],
1209 tvb, offset2+4, 4, FALSE);
1210 proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_REMOTE_UNNUM],
1211 tvb, offset2+8, 4, FALSE);
1215 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1216 "Data (%d bytes)", mylen);
1220 while (l < obj_length - 4) {
1221 mylen = tvb_get_guint8(tvb, offset2+l+1);
1222 ti2 = proto_tree_add_item(lmp_object_tree, lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ],
1223 tvb, offset2+l, mylen, FALSE);
1224 lmp_subobj_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_DATA_LINK_SUBOBJ]);
1225 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 1,
1226 "Subobject Type: %d", tvb_get_guint8(tvb, offset2+l));
1227 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+1, 1,
1228 "Subobject Length: %d", mylen);
1229 switch(tvb_get_guint8(tvb, offset2+l)) {
1231 proto_item_set_text(ti2, "Interface Switching Capability: "
1232 "Switching Cap: %s, Encoding Type: %s, Min BW: %.10g, Max BW: %.10g",
1233 val_to_str(tvb_get_guint8(tvb, offset2+l+2),
1234 gmpls_switching_type_str, "Unknown (%d)"),
1235 val_to_str(tvb_get_guint8(tvb, offset2+l+3),
1236 gmpls_lsp_enc_str, "Unknown (%d)"),
1237 tvb_get_ntohieee_float(tvb, offset2+l+4),
1238 tvb_get_ntohieee_float(tvb, offset2+l+8));
1239 proto_tree_add_item(lmp_subobj_tree,
1240 lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_SWITCHING_TYPE],
1241 tvb, offset2+l+2, 1, FALSE);
1242 proto_tree_add_item(lmp_subobj_tree,
1243 lmp_filter[LMPF_VAL_DATA_LINK_SUBOBJ_LSP_ENCODING],
1244 tvb, offset2+l+3, 1, FALSE);
1245 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+4, 4,
1246 "Minimum Reservable Bandwidth: %.10g bytes/s",
1247 tvb_get_ntohieee_float(tvb, offset2+l+4));
1248 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+8, 4,
1249 "Maximum Reservable Bandwidth: %.10g bytes/s",
1250 tvb_get_ntohieee_float(tvb, offset2+l+8));
1254 proto_item_set_text(ti2, "Wavelength: %d",
1255 tvb_get_ntohl(tvb, offset2+l+2));
1256 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l+4, 4,
1258 tvb_get_ntohl(tvb, offset2+l+2));
1262 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l,
1263 tvb_get_guint8(tvb, offset2+l+1),
1264 "Data (%d bytes)", tvb_get_guint8(tvb, offset2+l+1));
1267 l += tvb_get_guint8(tvb, offset2+l+1);
1272 case LMP_CLASS_CHANNEL_STATUS:
1283 for (l=0; l<obj_length - 4; ) {
1284 ti2 = proto_tree_add_text(lmp_object_tree, tvb, offset2+l, k,
1286 lmp_subobj_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_CHANNEL_STATUS_ID]);
1290 proto_item_append_text(ti, ": [IPv4-%s",
1291 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1292 proto_item_append_text(ti2, ": IPv4 %s",
1293 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1294 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
1295 "Interface ID: IPv4: %s",
1296 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1301 proto_item_append_text(ti, ": [IPv6-%s",
1302 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
1303 proto_item_append_text(ti2, ": IPv6 %s",
1304 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
1305 proto_tree_add_text(lmp_subobj_tree, tvb, offset2, 16, "Interface ID: IPv6: %s",
1306 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l, 16)));
1311 proto_item_append_text(ti, ": [Unnum-%d", tvb_get_ntohl(tvb, offset2+l));
1312 proto_item_append_text(ti, ": Unnumbered %d", tvb_get_ntohl(tvb, offset2+l));
1313 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
1314 "Interface ID: Unnumbered: %d",
1315 tvb_get_ntohl(tvb, offset2+l));
1319 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l,
1320 "Data (%d bytes)", obj_length-4-l);
1324 if (l == obj_length - 4) break;
1326 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 1,
1327 tvb_get_guint8(tvb, offset2+l) & 0x80 ?
1328 "Link Allocated - Active Monitoring" :
1329 "Link Not Allocated");
1331 proto_item_append_text(ti, "-%s,%s], ",
1332 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Act" : "NA",
1333 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1334 channel_status_short_str, "UNK (%u)."));
1335 proto_item_append_text(ti2, ": %s, ",
1336 tvb_get_guint8(tvb, offset2+l) & 0x80 ? "Active" : "Not Active");
1337 proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, 4,
1338 "Channel Status: %s",
1339 val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1340 channel_status_str, "Unknown (%u). "));
1341 proto_item_append_text(ti2, val_to_str(tvb_get_ntohl(tvb, offset2+l) & 0x7fffffff,
1342 channel_status_str, "Unknown (%u). "));
1345 if (j==4 && l < obj_length - 4)
1346 proto_item_append_text(ti, " ...");
1350 case LMP_CLASS_CHANNEL_STATUS_REQUEST:
1351 for (l=0; l<obj_length - 4; ) {
1354 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 4,
1355 "Interface ID: IPv4: %s",
1356 ip_to_str(tvb_get_ptr(tvb, offset2+l, 4)));
1360 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 16, "Interface ID: IPv6: %s",
1361 ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l,16)));
1365 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, 4,
1366 "Interface ID: Unnumbered: %d",
1367 tvb_get_ntohl(tvb, offset2+l));
1371 proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l,
1372 "Data (%d bytes)", obj_length-4-l);
1379 case LMP_CLASS_ERROR:
1380 l = tvb_get_ntohl(tvb, offset2);
1381 ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_ERROR],
1382 tvb, offset2, 4, l);
1384 /* Errors are different in draft-02 and draft-03 */
1385 switch(lmp_draft_ver) {
1386 case LMP_VER_DRAFT_CCAMP_02:
1389 proto_item_append_text(ti, ": CONFIG_ERROR: %s%s%s",
1390 (l&0x01) ? "Unacceptable-Params " : "",
1391 (l&0x02) ? "Renegotiate" : "",
1392 (l&0x04) ? "Bad Received CCID" : "");
1393 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1394 proto_tree_add_boolean(lmp_flags_tree,
1395 lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
1397 proto_tree_add_boolean(lmp_flags_tree,
1398 lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
1400 proto_tree_add_boolean(lmp_flags_tree,
1401 lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
1405 proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
1406 (l&0x01) ? "Unsupported-Link " : "",
1407 (l&0x02) ? "Unwilling" : "",
1408 (l&0x04) ? "Unsupported-Transport" : "",
1409 (l&0x08) ? "TE-Link-ID" : "");
1410 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1411 proto_tree_add_boolean(lmp_flags_tree,
1412 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
1414 proto_tree_add_boolean(lmp_flags_tree,
1415 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
1417 proto_tree_add_boolean(lmp_flags_tree,
1418 lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
1420 proto_tree_add_boolean(lmp_flags_tree,
1421 lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
1425 proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s",
1426 (l&0x01) ? "Unacceptable-Params " : "",
1427 (l&0x02) ? "Renegotiate" : "",
1428 (l&0x04) ? "Remote-Link-ID" : "");
1429 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1430 proto_tree_add_boolean(lmp_flags_tree,
1431 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
1433 proto_tree_add_boolean(lmp_flags_tree,
1434 lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
1436 proto_tree_add_boolean(lmp_flags_tree,
1437 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
1441 proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
1442 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1443 "Data (%d bytes)", mylen);
1449 case LMP_VER_DRAFT_CCAMP_03:
1452 proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
1453 (l&0x01) ? "Unsupported-Link " : "",
1454 (l&0x02) ? "Unwilling" : "",
1455 (l&0x04) ? "Unsupported-Transport" : "",
1456 (l&0x08) ? "TE-Link-ID" : "");
1457 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1458 proto_tree_add_boolean(lmp_flags_tree,
1459 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
1461 proto_tree_add_boolean(lmp_flags_tree,
1462 lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
1464 proto_tree_add_boolean(lmp_flags_tree,
1465 lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
1467 proto_tree_add_boolean(lmp_flags_tree,
1468 lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
1472 proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s%s%s",
1473 (l&0x01) ? "Unacceptable-Params " : "",
1474 (l&0x02) ? "Renegotiate" : "",
1475 (l&0x04) ? "Remote-Link-ID" : "",
1476 (l&0x08) ? "TE-Link" : "",
1477 (l&0x10) ? "Data-Link" : "");
1478 lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
1479 proto_tree_add_boolean(lmp_flags_tree,
1480 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
1482 proto_tree_add_boolean(lmp_flags_tree,
1483 lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
1485 proto_tree_add_boolean(lmp_flags_tree,
1486 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
1488 proto_tree_add_boolean(lmp_flags_tree,
1489 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
1491 proto_tree_add_boolean(lmp_flags_tree,
1492 lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
1496 proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
1497 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1498 "Data (%d bytes)", mylen);
1506 proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
1507 "Data (%d bytes)", mylen);
1512 offset += obj_length;
1519 register_lmp_prefs (void)
1521 module_t *lmp_module;
1522 static enum_val_t lmp_ver[] = {
1523 {"draft-ietf-ccamp-lmp-03", LMP_VER_DRAFT_CCAMP_03},
1524 {"draft-ietf-ccamp-lmp-02", LMP_VER_DRAFT_CCAMP_02},
1528 lmp_module = prefs_register_protocol(proto_lmp, NULL);
1529 prefs_register_enum_preference(
1530 lmp_module, "version",
1531 "Draft version of LMP",
1532 "Specifies the IETF CCAMP draft version of LMP to interpret",
1533 &lmp_draft_ver, lmp_ver, FALSE);
1537 proto_register_lmp(void)
1539 static gint *ett[NUM_LMP_SUBTREES];
1542 for (i=0; i<NUM_LMP_SUBTREES; i++) {
1543 lmp_subtree[i] = -1;
1544 ett[i] = &lmp_subtree[i];
1547 proto_lmp = proto_register_protocol("Link Management Protocol (LMP)",
1549 proto_register_field_array(proto_lmp, lmpf_info, array_length(lmpf_info));
1550 proto_register_subtree_array(ett, array_length(ett));
1552 register_lmp_prefs();
1556 proto_reg_handoff_lmp(void)
1558 dissector_handle_t lmp_handle;
1560 lmp_handle = create_dissector_handle(dissect_lmp, proto_lmp);
1561 dissector_add("ip.proto", IP_PROTO_LMP, lmp_handle);