print-lmp.c revision 285275
1146773Ssam/*
2146773Ssam * Redistribution and use in source and binary forms, with or without
3146773Ssam * modification, are permitted provided that: (1) source code
4146773Ssam * distributions retain the above copyright notice and this paragraph
5146773Ssam * in its entirety, and (2) distributions including binary code include
6146773Ssam * the above copyright notice and this paragraph in its entirety in
7146773Ssam * the documentation or other materials provided with the distribution.
8146773Ssam * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9146773Ssam * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10146773Ssam * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11146773Ssam * FOR A PARTICULAR PURPOSE.
12146773Ssam *
13190207Srpaulo * Support for the Link Management Protocol as per rfc 4204.
14190207Srpaulo *
15146773Ssam * Original code by Hannes Gredler (hannes@juniper.net)
16147899Ssam * Support for LMP service discovery extensions (defined by UNI 1.0) added
17147899Ssam * by Manu Pathak (mapathak@cisco.com), May 2005
18146773Ssam */
19146773Ssam
20276788Sdelphij#define NETDISSECT_REWORKED
21146773Ssam#ifdef HAVE_CONFIG_H
22146773Ssam#include "config.h"
23146773Ssam#endif
24146773Ssam
25146773Ssam#include <tcpdump-stdinc.h>
26146773Ssam
27146773Ssam#include "interface.h"
28146773Ssam#include "extract.h"
29146773Ssam#include "addrtoname.h"
30146773Ssam#include "gmpls.h"
31146773Ssam
32146773Ssam/*
33146773Ssam * LMP common header
34146773Ssam *
35146773Ssam *  0                   1                   2                   3
36146773Ssam *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
37146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38146773Ssam * | Vers  |      (Reserved)       |    Flags      |    Msg Type   |
39146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40146773Ssam * |          LMP Length           |          (Reserved)           |
41146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42146773Ssam */
43146773Ssam
44146773Ssamstruct lmp_common_header {
45276788Sdelphij    uint8_t version_res[2];
46276788Sdelphij    uint8_t flags;
47276788Sdelphij    uint8_t msg_type;
48276788Sdelphij    uint8_t length[2];
49276788Sdelphij    uint8_t reserved[2];
50146773Ssam};
51146773Ssam
52146773Ssam#define LMP_VERSION            1
53276788Sdelphij#define	LMP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
54146773Ssam
55146773Ssamstatic const struct tok lmp_header_flag_values[] = {
56172683Smlaier    { 0x01, "Control Channel Down"},
57146773Ssam    { 0x02, "LMP restart"},
58146773Ssam    { 0, NULL}
59146773Ssam};
60146773Ssam
61146773Ssamstatic const struct tok lmp_obj_te_link_flag_values[] = {
62146773Ssam    { 0x01, "Fault Management Supported"},
63146773Ssam    { 0x02, "Link Verification Supported"},
64146773Ssam    { 0, NULL}
65146773Ssam};
66146773Ssam
67146773Ssamstatic const struct tok lmp_obj_data_link_flag_values[] = {
68146773Ssam    { 0x01, "Data Link Port"},
69146773Ssam    { 0x02, "Allocated for user traffic"},
70146773Ssam    { 0x04, "Failed link"},
71146773Ssam    { 0, NULL}
72146773Ssam};
73146773Ssam
74146773Ssamstatic const struct tok lmp_obj_channel_status_values[] = {
75146773Ssam    { 1, "Signal Okay"},
76146773Ssam    { 2, "Signal Degraded"},
77146773Ssam    { 3, "Signal Fail"},
78146773Ssam    { 0, NULL}
79146773Ssam};
80146773Ssam
81146773Ssamstatic const struct tok lmp_obj_begin_verify_flag_values[] = {
82146773Ssam    { 0x0001, "Verify all links"},
83146773Ssam    { 0x0002, "Data link type"},
84146773Ssam    { 0, NULL}
85146773Ssam};
86146773Ssam
87146773Ssamstatic const struct tok lmp_obj_begin_verify_error_values[] = {
88190207Srpaulo    { 0x01, "Link Verification Procedure Not supported"},
89190207Srpaulo    { 0x02, "Unwilling to verify"},
90190207Srpaulo    { 0x04, "Unsupported verification transport mechanism"},
91190207Srpaulo    { 0x08, "Link-Id configuration error"},
92190207Srpaulo    { 0x10, "Unknown object c-type"},
93146773Ssam    { 0, NULL}
94146773Ssam};
95146773Ssam
96146773Ssamstatic const struct tok lmp_obj_link_summary_error_values[] = {
97190207Srpaulo    { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"},
98190207Srpaulo    { 0x02, "Renegotiate LINK-SUMMARY parameters"},
99190207Srpaulo    { 0x04, "Invalid TE-LINK Object"},
100190207Srpaulo    { 0x08, "Invalid DATA-LINK Object"},
101190207Srpaulo    { 0x10, "Unknown TE-LINK Object c-type"},
102190207Srpaulo    { 0x20, "Unknown DATA-LINK Object c-type"},
103146773Ssam    { 0, NULL}
104146773Ssam};
105146773Ssam
106147899Ssam/* Service Config Supported Protocols Flags */
107147899Ssamstatic const struct tok lmp_obj_service_config_sp_flag_values[] = {
108147899Ssam    { 0x01, "RSVP Supported"},
109147899Ssam    { 0x02, "LDP Supported"},
110147899Ssam    { 0, NULL}
111147899Ssam};
112147899Ssam
113147899Ssam/* Service Config Client Port Service Attribute Transparency Flags */
114147899Ssamstatic const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = {
115147899Ssam    { 0x01, "Path/VC Overhead Transparency Supported"},
116147899Ssam    { 0x02, "Line/MS Overhead Transparency Supported"},
117147899Ssam    { 0x04, "Section/RS Overhead Transparency Supported"},
118147899Ssam    { 0, NULL}
119147899Ssam};
120147899Ssam
121147899Ssam/* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */
122147899Ssamstatic const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = {
123147899Ssam    { 0x01, "Contiguous Concatenation Types Supported"},
124147899Ssam    { 0, NULL}
125147899Ssam};
126147899Ssam
127147899Ssam/* Service Config Network Service Attributes Transparency Flags */
128147899Ssamstatic const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = {
129147899Ssam    { 0x01, "Standard SOH/RSOH Transparency Supported"},
130147899Ssam    { 0x02, "Standard LOH/MSOH Transparency Supported"},
131147899Ssam    { 0, NULL}
132147899Ssam};
133147899Ssam
134147899Ssam/* Service Config Network Service Attributes TCM Monitoring Flags */
135147899Ssamstatic const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = {
136147899Ssam    { 0x01, "Transparent Tandem Connection Monitoring Supported"},
137147899Ssam    { 0, NULL}
138147899Ssam};
139147899Ssam
140147899Ssam/* Network Service Attributes Network Diversity Flags */
141147899Ssamstatic const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = {
142147899Ssam    { 0x01, "Node Diversity Supported"},
143147899Ssam    { 0x02, "Link Diversity Supported"},
144147899Ssam    { 0x04, "SRLG Diversity Supported"},
145147899Ssam    { 0, NULL}
146147899Ssam};
147147899Ssam
148146773Ssam#define	LMP_MSGTYPE_CONFIG                 1
149146773Ssam#define	LMP_MSGTYPE_CONFIG_ACK             2
150146773Ssam#define	LMP_MSGTYPE_CONFIG_NACK            3
151146773Ssam#define	LMP_MSGTYPE_HELLO                  4
152146773Ssam#define	LMP_MSGTYPE_VERIFY_BEGIN           5
153146773Ssam#define	LMP_MSGTYPE_VERIFY_BEGIN_ACK       6
154146773Ssam#define	LMP_MSGTYPE_VERIFY_BEGIN_NACK      7
155146773Ssam#define LMP_MSGTYPE_VERIFY_END             8
156146773Ssam#define LMP_MSGTYPE_VERIFY_END_ACK         9
157146773Ssam#define LMP_MSGTYPE_TEST                  10
158146773Ssam#define LMP_MSGTYPE_TEST_STATUS_SUCCESS   11
159146773Ssam#define	LMP_MSGTYPE_TEST_STATUS_FAILURE   12
160146773Ssam#define	LMP_MSGTYPE_TEST_STATUS_ACK       13
161146773Ssam#define	LMP_MSGTYPE_LINK_SUMMARY          14
162146773Ssam#define	LMP_MSGTYPE_LINK_SUMMARY_ACK      15
163146773Ssam#define	LMP_MSGTYPE_LINK_SUMMARY_NACK     16
164146773Ssam#define	LMP_MSGTYPE_CHANNEL_STATUS        17
165146773Ssam#define	LMP_MSGTYPE_CHANNEL_STATUS_ACK    18
166146773Ssam#define	LMP_MSGTYPE_CHANNEL_STATUS_REQ    19
167146773Ssam#define	LMP_MSGTYPE_CHANNEL_STATUS_RESP   20
168147899Ssam/* LMP Service Discovery message types defined by UNI 1.0 */
169147899Ssam#define LMP_MSGTYPE_SERVICE_CONFIG        50
170147899Ssam#define LMP_MSGTYPE_SERVICE_CONFIG_ACK    51
171147899Ssam#define LMP_MSGTYPE_SERVICE_CONFIG_NACK   52
172146773Ssam
173146773Ssamstatic const struct tok lmp_msg_type_values[] = {
174146773Ssam    { LMP_MSGTYPE_CONFIG, "Config"},
175146773Ssam    { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"},
176146773Ssam    { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"},
177146773Ssam    { LMP_MSGTYPE_HELLO, "Hello"},
178146773Ssam    { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"},
179146773Ssam    { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"},
180146773Ssam    { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"},
181146773Ssam    { LMP_MSGTYPE_VERIFY_END, "End Verify"},
182146773Ssam    { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"},
183146773Ssam    { LMP_MSGTYPE_TEST, "Test"},
184146773Ssam    { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"},
185146773Ssam    { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"},
186146773Ssam    { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"},
187146773Ssam    { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"},
188146773Ssam    { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"},
189146773Ssam    { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"},
190146773Ssam    { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"},
191146773Ssam    { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"},
192146773Ssam    { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"},
193146773Ssam    { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"},
194147899Ssam    { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"},
195147899Ssam    { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"},
196147899Ssam    { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"},
197146773Ssam    { 0, NULL}
198146773Ssam};
199146773Ssam
200276788Sdelphij/*
201146773Ssam * LMP object header
202146773Ssam *
203146773Ssam *  0                   1                   2                   3
204146773Ssam *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
205146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
206146773Ssam * |N|   C-Type    |     Class     |            Length             |
207146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
208146773Ssam * |                                                               |
209146773Ssam * //                       (object contents)                     //
210146773Ssam * |                                                               |
211276788Sdelphij * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
212146773Ssam */
213146773Ssam
214146773Ssamstruct lmp_object_header {
215276788Sdelphij    uint8_t ctype;
216276788Sdelphij    uint8_t class_num;
217276788Sdelphij    uint8_t length[2];
218146773Ssam};
219146773Ssam
220146773Ssam#define	LMP_OBJ_CC_ID                 1
221146773Ssam#define	LMP_OBJ_NODE_ID               2
222146773Ssam#define	LMP_OBJ_LINK_ID               3
223146773Ssam#define	LMP_OBJ_INTERFACE_ID          4
224276788Sdelphij#define	LMP_OBJ_MESSAGE_ID            5
225146773Ssam#define	LMP_OBJ_CONFIG                6
226146773Ssam#define	LMP_OBJ_HELLO                 7
227146773Ssam#define	LMP_OBJ_VERIFY_BEGIN          8
228146773Ssam#define LMP_OBJ_VERIFY_BEGIN_ACK      9
229146773Ssam#define LMP_OBJ_VERIFY_ID            10
230146773Ssam#define LMP_OBJ_TE_LINK              11
231146773Ssam#define LMP_OBJ_DATA_LINK            12
232146773Ssam#define LMP_OBJ_CHANNEL_STATUS       13
233146773Ssam#define LMP_OBJ_CHANNEL_STATUS_REQ   14
234146773Ssam#define LMP_OBJ_ERROR_CODE           20
235146773Ssam
236147899Ssam#define LMP_OBJ_SERVICE_CONFIG       51 /* defined in UNI 1.0 */
237147899Ssam
238146773Ssamstatic const struct tok lmp_obj_values[] = {
239146773Ssam    { LMP_OBJ_CC_ID, "Control Channel ID" },
240146773Ssam    { LMP_OBJ_NODE_ID, "Node ID" },
241146773Ssam    { LMP_OBJ_LINK_ID, "Link ID" },
242146773Ssam    { LMP_OBJ_INTERFACE_ID, "Interface ID" },
243146773Ssam    { LMP_OBJ_MESSAGE_ID, "Message ID" },
244146773Ssam    { LMP_OBJ_CONFIG, "Configuration" },
245146773Ssam    { LMP_OBJ_HELLO, "Hello" },
246146773Ssam    { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" },
247146773Ssam    { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" },
248146773Ssam    { LMP_OBJ_VERIFY_ID, "Verify ID" },
249146773Ssam    { LMP_OBJ_TE_LINK, "TE Link" },
250146773Ssam    { LMP_OBJ_DATA_LINK, "Data Link" },
251146773Ssam    { LMP_OBJ_CHANNEL_STATUS, "Channel Status" },
252146773Ssam    { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" },
253146773Ssam    { LMP_OBJ_ERROR_CODE, "Error Code" },
254147899Ssam    { LMP_OBJ_SERVICE_CONFIG, "Service Config" },
255147899Ssam
256146773Ssam    { 0, NULL}
257146773Ssam};
258146773Ssam
259146773Ssam#define INT_SWITCHING_TYPE_SUBOBJ 1
260146773Ssam#define WAVELENGTH_SUBOBJ         2
261146773Ssam
262146773Ssamstatic const struct tok lmp_data_link_subobj[] = {
263146773Ssam    { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" },
264146773Ssam    { WAVELENGTH_SUBOBJ        , "Wavelength" },
265146773Ssam    { 0, NULL}
266146773Ssam};
267146773Ssam
268146773Ssam#define	LMP_CTYPE_IPV4       1
269146773Ssam#define	LMP_CTYPE_IPV6       2
270146773Ssam
271146773Ssam#define	LMP_CTYPE_LOC        1
272146773Ssam#define	LMP_CTYPE_RMT        2
273146773Ssam#define	LMP_CTYPE_UNMD       3
274276788Sdelphij
275146773Ssam#define	LMP_CTYPE_IPV4_LOC   1
276146773Ssam#define	LMP_CTYPE_IPV4_RMT   2
277146773Ssam#define	LMP_CTYPE_IPV6_LOC   3
278146773Ssam#define	LMP_CTYPE_IPV6_RMT   4
279276788Sdelphij#define	LMP_CTYPE_UNMD_LOC   5
280276788Sdelphij#define	LMP_CTYPE_UNMD_RMT   6
281146773Ssam
282146773Ssam#define	LMP_CTYPE_1          1
283146773Ssam#define	LMP_CTYPE_2          2
284146773Ssam
285146773Ssam#define LMP_CTYPE_HELLO_CONFIG  1
286146773Ssam#define LMP_CTYPE_HELLO         1
287146773Ssam
288146773Ssam#define LMP_CTYPE_BEGIN_VERIFY_ERROR 1
289146773Ssam#define LMP_CTYPE_LINK_SUMMARY_ERROR 2
290146773Ssam
291147899Ssam/* C-Types for Service Config Object */
292147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_SP                   1
293147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_CPSA                 2
294147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM     3
295147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY    4
296147899Ssam
297276788Sdelphij/*
298147899Ssam * Different link types allowed in the Client Port Service Attributes
299147899Ssam * subobject defined for LMP Service Discovery in the UNI 1.0 spec
300147899Ssam */
301147899Ssam#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH     5 /* UNI 1.0 Sec 9.4.2 */
302147899Ssam#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET   6 /* UNI 1.0 Sec 9.4.2 */
303147899Ssam
304146773Ssam/*
305146773Ssam * the ctypes are not globally unique so for
306146773Ssam * translating it to strings we build a table based
307146773Ssam * on objects offsetted by the ctype
308146773Ssam */
309146773Ssam
310146773Ssamstatic const struct tok lmp_ctype_values[] = {
311146773Ssam    { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" },
312146773Ssam    { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" },
313146773Ssam    { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" },
314146773Ssam    { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" },
315146773Ssam    { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
316146773Ssam    { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
317146773Ssam    { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
318146773Ssam    { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
319146773Ssam    { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
320146773Ssam    { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
321146773Ssam    { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
322146773Ssam    { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
323146773Ssam    { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
324146773Ssam    { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
325146773Ssam    { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
326146773Ssam    { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
327146773Ssam    { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" },
328146773Ssam    { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" },
329146773Ssam    { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" },
330146773Ssam    { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" },
331146773Ssam    { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" },
332146773Ssam    { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" },
333146773Ssam    { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" },
334146773Ssam    { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" },
335146773Ssam    { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" },
336146773Ssam    { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
337146773Ssam    { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" },
338146773Ssam    { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" },
339146773Ssam    { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
340146773Ssam    { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" },
341146773Ssam    { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" },
342146773Ssam    { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" },
343146773Ssam    { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" },
344146773Ssam    { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" },
345146773Ssam    { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" },
346146773Ssam    { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" },
347146773Ssam    { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" },
348147899Ssam    { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" },
349147899Ssam    { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" },
350147899Ssam    { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" },
351147899Ssam    { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" },
352146773Ssam    { 0, NULL}
353146773Ssam};
354146773Ssam
355146773Ssamvoid
356276788Sdelphijlmp_print(netdissect_options *ndo,
357285275Spkelsey          register const u_char *pptr, register u_int len)
358285275Spkelsey{
359146773Ssam    const struct lmp_common_header *lmp_com_header;
360146773Ssam    const struct lmp_object_header *lmp_obj_header;
361146773Ssam    const u_char *tptr,*obj_tptr;
362146773Ssam    int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen;
363146773Ssam    int hexdump;
364146773Ssam    int offset,subobj_type,subobj_len,total_subobj_len;
365147899Ssam    int link_type;
366146773Ssam
367146773Ssam    union { /* int to float conversion buffer */
368276788Sdelphij        float f;
369276788Sdelphij        uint32_t i;
370146773Ssam    } bw;
371146773Ssam
372146773Ssam    tptr=pptr;
373146773Ssam    lmp_com_header = (const struct lmp_common_header *)pptr;
374276788Sdelphij    ND_TCHECK(*lmp_com_header);
375146773Ssam
376146773Ssam    /*
377146773Ssam     * Sanity checking of the header.
378146773Ssam     */
379146773Ssam    if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) {
380276788Sdelphij	ND_PRINT((ndo, "LMP version %u packet not supported",
381276788Sdelphij               LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])));
382146773Ssam	return;
383146773Ssam    }
384146773Ssam
385146773Ssam    /* in non-verbose mode just lets print the basic Message Type*/
386276788Sdelphij    if (ndo->ndo_vflag < 1) {
387276788Sdelphij        ND_PRINT((ndo, "LMPv%u %s Message, length: %u",
388146773Ssam               LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
389146773Ssam               tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type),
390276788Sdelphij               len));
391146773Ssam        return;
392146773Ssam    }
393146773Ssam
394146773Ssam    /* ok they seem to want to know everything - lets fully decode it */
395146773Ssam
396146773Ssam    tlen=EXTRACT_16BITS(lmp_com_header->length);
397146773Ssam
398276788Sdelphij    ND_PRINT((ndo, "\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
399146773Ssam           LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
400146773Ssam           tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type),
401146773Ssam           bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags),
402276788Sdelphij           tlen));
403146773Ssam
404146773Ssam    tptr+=sizeof(const struct lmp_common_header);
405146773Ssam    tlen-=sizeof(const struct lmp_common_header);
406146773Ssam
407146773Ssam    while(tlen>0) {
408146773Ssam        /* did we capture enough for fully decoding the object header ? */
409276788Sdelphij        ND_TCHECK2(*tptr, sizeof(struct lmp_object_header));
410146773Ssam
411146773Ssam        lmp_obj_header = (const struct lmp_object_header *)tptr;
412146773Ssam        lmp_obj_len=EXTRACT_16BITS(lmp_obj_header->length);
413146773Ssam        lmp_obj_ctype=(lmp_obj_header->ctype)&0x7f;
414146773Ssam
415146773Ssam        if(lmp_obj_len % 4 || lmp_obj_len < 4)
416146773Ssam            return;
417146773Ssam
418276788Sdelphij        ND_PRINT((ndo, "\n\t  %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
419146773Ssam               tok2str(lmp_obj_values,
420146773Ssam                       "Unknown",
421146773Ssam                       lmp_obj_header->class_num),
422146773Ssam               lmp_obj_header->class_num,
423146773Ssam               tok2str(lmp_ctype_values,
424146773Ssam                       "Unknown",
425146773Ssam                       ((lmp_obj_header->class_num)<<8)+lmp_obj_ctype),
426146773Ssam               lmp_obj_ctype,
427146773Ssam               (lmp_obj_header->ctype)&0x80 ? "" : "non-",
428276788Sdelphij               lmp_obj_len));
429146773Ssam
430146773Ssam        obj_tptr=tptr+sizeof(struct lmp_object_header);
431146773Ssam        obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header);
432146773Ssam
433146773Ssam        /* did we capture enough for fully decoding the object ? */
434276788Sdelphij        ND_TCHECK2(*tptr, lmp_obj_len);
435146773Ssam        hexdump=FALSE;
436146773Ssam
437146773Ssam        switch(lmp_obj_header->class_num) {
438146773Ssam
439146773Ssam        case LMP_OBJ_CC_ID:
440146773Ssam            switch(lmp_obj_ctype) {
441146773Ssam            case LMP_CTYPE_LOC:
442146773Ssam            case LMP_CTYPE_RMT:
443276788Sdelphij                ND_PRINT((ndo, "\n\t    Control Channel ID: %u (0x%08x)",
444146773Ssam                       EXTRACT_32BITS(obj_tptr),
445276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
446146773Ssam                break;
447146773Ssam
448146773Ssam            default:
449146773Ssam                hexdump=TRUE;
450146773Ssam            }
451146773Ssam            break;
452146773Ssam
453146773Ssam        case LMP_OBJ_LINK_ID:
454146773Ssam        case LMP_OBJ_INTERFACE_ID:
455146773Ssam            switch(lmp_obj_ctype) {
456146773Ssam            case LMP_CTYPE_IPV4_LOC:
457146773Ssam            case LMP_CTYPE_IPV4_RMT:
458276788Sdelphij                ND_PRINT((ndo, "\n\t    IPv4 Link ID: %s (0x%08x)",
459276788Sdelphij                       ipaddr_string(ndo, obj_tptr),
460276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
461146773Ssam                break;
462146773Ssam#ifdef INET6
463146773Ssam            case LMP_CTYPE_IPV6_LOC:
464146773Ssam            case LMP_CTYPE_IPV6_RMT:
465276788Sdelphij                ND_PRINT((ndo, "\n\t    IPv6 Link ID: %s (0x%08x)",
466276788Sdelphij                       ip6addr_string(ndo, obj_tptr),
467276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
468146773Ssam                break;
469146773Ssam#endif
470146773Ssam            case LMP_CTYPE_UNMD_LOC:
471146773Ssam            case LMP_CTYPE_UNMD_RMT:
472276788Sdelphij                ND_PRINT((ndo, "\n\t    Link ID: %u (0x%08x)",
473146773Ssam                       EXTRACT_32BITS(obj_tptr),
474276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
475146773Ssam                break;
476146773Ssam            default:
477146773Ssam                hexdump=TRUE;
478146773Ssam            }
479146773Ssam            break;
480146773Ssam
481146773Ssam        case LMP_OBJ_MESSAGE_ID:
482146773Ssam            switch(lmp_obj_ctype) {
483146773Ssam            case LMP_CTYPE_1:
484276788Sdelphij                ND_PRINT((ndo, "\n\t    Message ID: %u (0x%08x)",
485146773Ssam                       EXTRACT_32BITS(obj_tptr),
486276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
487146773Ssam                break;
488146773Ssam            case LMP_CTYPE_2:
489276788Sdelphij                ND_PRINT((ndo, "\n\t    Message ID Ack: %u (0x%08x)",
490146773Ssam                       EXTRACT_32BITS(obj_tptr),
491276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
492146773Ssam                break;
493146773Ssam            default:
494146773Ssam                hexdump=TRUE;
495146773Ssam            }
496146773Ssam            break;
497146773Ssam
498146773Ssam        case LMP_OBJ_NODE_ID:
499146773Ssam            switch(lmp_obj_ctype) {
500146773Ssam            case LMP_CTYPE_LOC:
501146773Ssam            case LMP_CTYPE_RMT:
502276788Sdelphij                ND_PRINT((ndo, "\n\t    Node ID: %s (0x%08x)",
503276788Sdelphij                       ipaddr_string(ndo, obj_tptr),
504276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
505146773Ssam                break;
506146773Ssam
507146773Ssam            default:
508146773Ssam                hexdump=TRUE;
509146773Ssam            }
510146773Ssam            break;
511146773Ssam
512146773Ssam        case LMP_OBJ_CONFIG:
513146773Ssam            switch(lmp_obj_ctype) {
514146773Ssam            case LMP_CTYPE_HELLO_CONFIG:
515276788Sdelphij                ND_PRINT((ndo, "\n\t    Hello Interval: %u\n\t    Hello Dead Interval: %u",
516146773Ssam                       EXTRACT_16BITS(obj_tptr),
517276788Sdelphij                       EXTRACT_16BITS(obj_tptr+2)));
518146773Ssam                break;
519146773Ssam
520146773Ssam            default:
521146773Ssam                hexdump=TRUE;
522146773Ssam            }
523146773Ssam            break;
524276788Sdelphij
525146773Ssam        case LMP_OBJ_HELLO:
526146773Ssam            switch(lmp_obj_ctype) {
527146773Ssam	    case LMP_CTYPE_HELLO:
528276788Sdelphij                ND_PRINT((ndo, "\n\t    Tx Seq: %u, Rx Seq: %u",
529146773Ssam                       EXTRACT_32BITS(obj_tptr),
530276788Sdelphij                       EXTRACT_32BITS(obj_tptr+4)));
531146773Ssam                break;
532146773Ssam
533146773Ssam            default:
534146773Ssam                hexdump=TRUE;
535146773Ssam            }
536276788Sdelphij            break;
537276788Sdelphij
538146773Ssam        case LMP_OBJ_TE_LINK:
539276788Sdelphij		ND_PRINT((ndo, "\n\t    Flags: [%s]",
540146773Ssam		bittok2str(lmp_obj_te_link_flag_values,
541146773Ssam			"none",
542276788Sdelphij			EXTRACT_16BITS(obj_tptr)>>8)));
543276788Sdelphij
544146773Ssam	    switch(lmp_obj_ctype) {
545146773Ssam	    case LMP_CTYPE_IPV4:
546276788Sdelphij		ND_PRINT((ndo, "\n\t    Local Link-ID: %s (0x%08x)"
547276788Sdelphij		       "\n\t    Remote Link-ID: %s (0x%08x)",
548276788Sdelphij                       ipaddr_string(ndo, obj_tptr+4),
549146773Ssam                       EXTRACT_32BITS(obj_tptr+4),
550276788Sdelphij                       ipaddr_string(ndo, obj_tptr+8),
551276788Sdelphij                       EXTRACT_32BITS(obj_tptr+8)));
552146773Ssam		break;
553276788Sdelphij
554146773Ssam#ifdef INET6
555146773Ssam	    case LMP_CTYPE_IPV6:
556146773Ssam#endif
557146773Ssam	    case LMP_CTYPE_UNMD:
558146773Ssam            default:
559146773Ssam                hexdump=TRUE;
560146773Ssam            }
561146773Ssam            break;
562276788Sdelphij
563146773Ssam        case LMP_OBJ_DATA_LINK:
564276788Sdelphij		ND_PRINT((ndo, "\n\t    Flags: [%s]",
565146773Ssam		bittok2str(lmp_obj_data_link_flag_values,
566146773Ssam			"none",
567276788Sdelphij			EXTRACT_16BITS(obj_tptr)>>8)));
568276788Sdelphij
569146773Ssam	    switch(lmp_obj_ctype) {
570146773Ssam	    case LMP_CTYPE_IPV4:
571146773Ssam	    case LMP_CTYPE_UNMD:
572276788Sdelphij                ND_PRINT((ndo, "\n\t    Local Interface ID: %s (0x%08x)"
573276788Sdelphij                       "\n\t    Remote Interface ID: %s (0x%08x)",
574276788Sdelphij                       ipaddr_string(ndo, obj_tptr+4),
575146773Ssam                       EXTRACT_32BITS(obj_tptr+4),
576276788Sdelphij                       ipaddr_string(ndo, obj_tptr+8),
577276788Sdelphij                       EXTRACT_32BITS(obj_tptr+8)));
578276788Sdelphij
579276788Sdelphij		total_subobj_len = lmp_obj_len - 16;
580146773Ssam		offset = 12;
581146773Ssam		while (total_subobj_len > 0 && hexdump == FALSE ) {
582146773Ssam			subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8;
583146773Ssam			subobj_len  = EXTRACT_16BITS(obj_tptr+offset)&0x00FF;
584276788Sdelphij			ND_PRINT((ndo, "\n\t    Subobject, Type: %s (%u), Length: %u",
585146773Ssam				tok2str(lmp_data_link_subobj,
586146773Ssam					"Unknown",
587146773Ssam					subobj_type),
588146773Ssam					subobj_type,
589276788Sdelphij					subobj_len));
590146773Ssam			switch(subobj_type) {
591146773Ssam			case INT_SWITCHING_TYPE_SUBOBJ:
592276788Sdelphij				ND_PRINT((ndo, "\n\t      Switching Type: %s (%u)",
593276788Sdelphij					tok2str(gmpls_switch_cap_values,
594276788Sdelphij						"Unknown",
595146773Ssam						EXTRACT_16BITS(obj_tptr+offset+2)>>8),
596276788Sdelphij					EXTRACT_16BITS(obj_tptr+offset+2)>>8));
597276788Sdelphij				ND_PRINT((ndo, "\n\t      Encoding Type: %s (%u)",
598276788Sdelphij					tok2str(gmpls_encoding_values,
599276788Sdelphij						"Unknown",
600146773Ssam						EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF),
601276788Sdelphij					EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF));
602146773Ssam				bw.i = EXTRACT_32BITS(obj_tptr+offset+4);
603276788Sdelphij				ND_PRINT((ndo, "\n\t      Min Reservable Bandwidth: %.3f Mbps",
604276788Sdelphij                                       bw.f*8/1000000));
605146773Ssam				bw.i = EXTRACT_32BITS(obj_tptr+offset+8);
606276788Sdelphij				ND_PRINT((ndo, "\n\t      Max Reservable Bandwidth: %.3f Mbps",
607276788Sdelphij                                       bw.f*8/1000000));
608276788Sdelphij				break;
609146773Ssam			case WAVELENGTH_SUBOBJ:
610276788Sdelphij				ND_PRINT((ndo, "\n\t      Wavelength: %u",
611276788Sdelphij					EXTRACT_32BITS(obj_tptr+offset+4)));
612146773Ssam				break;
613146773Ssam			default:
614146773Ssam				/* Any Unknown Subobject ==> Exit loop */
615146773Ssam				hexdump=TRUE;
616146773Ssam				break;
617146773Ssam			}
618146773Ssam			total_subobj_len-=subobj_len;
619146773Ssam			offset+=subobj_len;
620146773Ssam		}
621276788Sdelphij
622146773Ssam		break;
623276788Sdelphij#ifdef INET6
624146773Ssam	    case LMP_CTYPE_IPV6:
625146773Ssam#endif
626146773Ssam            default:
627146773Ssam                hexdump=TRUE;
628146773Ssam            }
629276788Sdelphij            break;
630276788Sdelphij
631146773Ssam        case LMP_OBJ_VERIFY_BEGIN:
632146773Ssam	    switch(lmp_obj_ctype) {
633146773Ssam            case LMP_CTYPE_1:
634276788Sdelphij		ND_PRINT((ndo, "\n\t    Flags: %s",
635146773Ssam		bittok2str(lmp_obj_begin_verify_flag_values,
636146773Ssam			"none",
637276788Sdelphij			EXTRACT_16BITS(obj_tptr))));
638276788Sdelphij		ND_PRINT((ndo, "\n\t    Verify Interval: %u",
639276788Sdelphij			EXTRACT_16BITS(obj_tptr+2)));
640276788Sdelphij		ND_PRINT((ndo, "\n\t    Data links: %u",
641276788Sdelphij			EXTRACT_32BITS(obj_tptr+4)));
642276788Sdelphij                ND_PRINT((ndo, "\n\t    Encoding type: %s",
643276788Sdelphij			tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))));
644276788Sdelphij                ND_PRINT((ndo, "\n\t    Verify Transport Mechanism: %u (0x%x)%s",
645146773Ssam			EXTRACT_16BITS(obj_tptr+10),
646146773Ssam			EXTRACT_16BITS(obj_tptr+10),
647276788Sdelphij			EXTRACT_16BITS(obj_tptr+10)&8000 ? " (Payload test messages capable)" : ""));
648146773Ssam                bw.i = EXTRACT_32BITS(obj_tptr+12);
649276788Sdelphij		ND_PRINT((ndo, "\n\t    Transmission Rate: %.3f Mbps",bw.f*8/1000000));
650276788Sdelphij		ND_PRINT((ndo, "\n\t    Wavelength: %u",
651276788Sdelphij			EXTRACT_32BITS(obj_tptr+16)));
652146773Ssam		break;
653276788Sdelphij
654146773Ssam            default:
655146773Ssam                hexdump=TRUE;
656146773Ssam            }
657276788Sdelphij            break;
658276788Sdelphij
659146773Ssam        case LMP_OBJ_VERIFY_BEGIN_ACK:
660146773Ssam	    switch(lmp_obj_ctype) {
661146773Ssam            case LMP_CTYPE_1:
662276788Sdelphij                ND_PRINT((ndo, "\n\t    Verify Dead Interval: %u"
663276788Sdelphij                       "\n\t    Verify Transport Response: %u",
664146773Ssam                       EXTRACT_16BITS(obj_tptr),
665276788Sdelphij                       EXTRACT_16BITS(obj_tptr+2)));
666146773Ssam                break;
667276788Sdelphij
668146773Ssam            default:
669146773Ssam                hexdump=TRUE;
670146773Ssam            }
671276788Sdelphij            break;
672276788Sdelphij
673146773Ssam	case LMP_OBJ_VERIFY_ID:
674146773Ssam	    switch(lmp_obj_ctype) {
675146773Ssam            case LMP_CTYPE_1:
676276788Sdelphij                ND_PRINT((ndo, "\n\t    Verify ID: %u",
677276788Sdelphij                       EXTRACT_32BITS(obj_tptr)));
678146773Ssam                break;
679276788Sdelphij
680146773Ssam            default:
681146773Ssam                hexdump=TRUE;
682146773Ssam            }
683276788Sdelphij            break;
684276788Sdelphij
685146773Ssam	case LMP_OBJ_CHANNEL_STATUS:
686146773Ssam            switch(lmp_obj_ctype) {
687146773Ssam	    case LMP_CTYPE_IPV4:
688146773Ssam	    case LMP_CTYPE_UNMD:
689146773Ssam		offset = 0;
690146773Ssam		/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
691146773Ssam		while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {
692276788Sdelphij			ND_PRINT((ndo, "\n\t    Interface ID: %s (0x%08x)",
693276788Sdelphij			ipaddr_string(ndo, obj_tptr+offset),
694276788Sdelphij			EXTRACT_32BITS(obj_tptr+offset)));
695276788Sdelphij
696276788Sdelphij			ND_PRINT((ndo, "\n\t\t    Active: %s (%u)", 		(EXTRACT_32BITS(obj_tptr+offset+4)>>31) ?
697146773Ssam						"Allocated" : "Non-allocated",
698276788Sdelphij				(EXTRACT_32BITS(obj_tptr+offset+4)>>31)));
699276788Sdelphij
700276788Sdelphij			ND_PRINT((ndo, "\n\t\t    Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ?
701146773Ssam						"Transmit" : "Receive",
702276788Sdelphij				(EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1));
703276788Sdelphij
704276788Sdelphij			ND_PRINT((ndo, "\n\t\t    Channel Status: %s (%u)",
705146773Ssam					tok2str(lmp_obj_channel_status_values,
706146773Ssam			 		"Unknown",
707146773Ssam					EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF),
708276788Sdelphij			EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF));
709146773Ssam			offset+=8;
710146773Ssam		}
711146773Ssam                break;
712276788Sdelphij#ifdef INET6
713146773Ssam	    case LMP_CTYPE_IPV6:
714146773Ssam#endif
715146773Ssam            default:
716146773Ssam                hexdump=TRUE;
717146773Ssam            }
718276788Sdelphij            break;
719276788Sdelphij
720146773Ssam	case LMP_OBJ_CHANNEL_STATUS_REQ:
721146773Ssam            switch(lmp_obj_ctype) {
722146773Ssam	    case LMP_CTYPE_IPV4:
723146773Ssam	    case LMP_CTYPE_UNMD:
724146773Ssam		offset = 0;
725146773Ssam		while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {
726276788Sdelphij			ND_PRINT((ndo, "\n\t    Interface ID: %s (0x%08x)",
727276788Sdelphij			ipaddr_string(ndo, obj_tptr+offset),
728276788Sdelphij			EXTRACT_32BITS(obj_tptr+offset)));
729146773Ssam			offset+=4;
730146773Ssam		}
731146773Ssam                break;
732276788Sdelphij#ifdef INET6
733146773Ssam	    case LMP_CTYPE_IPV6:
734146773Ssam#endif
735146773Ssam	    default:
736146773Ssam                hexdump=TRUE;
737146773Ssam            }
738276788Sdelphij            break;
739276788Sdelphij
740146773Ssam        case LMP_OBJ_ERROR_CODE:
741146773Ssam	    switch(lmp_obj_ctype) {
742146773Ssam            case LMP_CTYPE_BEGIN_VERIFY_ERROR:
743276788Sdelphij		ND_PRINT((ndo, "\n\t    Error Code: %s",
744146773Ssam		bittok2str(lmp_obj_begin_verify_error_values,
745146773Ssam			"none",
746276788Sdelphij			EXTRACT_32BITS(obj_tptr))));
747146773Ssam                break;
748276788Sdelphij
749146773Ssam            case LMP_CTYPE_LINK_SUMMARY_ERROR:
750276788Sdelphij		ND_PRINT((ndo, "\n\t    Error Code: %s",
751146773Ssam		bittok2str(lmp_obj_link_summary_error_values,
752146773Ssam			"none",
753276788Sdelphij			EXTRACT_32BITS(obj_tptr))));
754146773Ssam                break;
755146773Ssam            default:
756146773Ssam                hexdump=TRUE;
757146773Ssam            }
758276788Sdelphij            break;
759147899Ssam
760147899Ssam	case LMP_OBJ_SERVICE_CONFIG:
761147899Ssam	    switch (lmp_obj_ctype) {
762147899Ssam	    case LMP_CTYPE_SERVICE_CONFIG_SP:
763276788Sdelphij
764276788Sdelphij		ND_PRINT((ndo, "\n\t Flags: %s",
765147899Ssam		       bittok2str(lmp_obj_service_config_sp_flag_values,
766276788Sdelphij				  "none",
767276788Sdelphij				  EXTRACT_16BITS(obj_tptr)>>8)));
768147899Ssam
769276788Sdelphij		ND_PRINT((ndo, "\n\t  UNI Version: %u",
770276788Sdelphij		       EXTRACT_16BITS(obj_tptr) & 0x00FF));
771147899Ssam
772147899Ssam		break;
773276788Sdelphij
774147899Ssam            case LMP_CTYPE_SERVICE_CONFIG_CPSA:
775276788Sdelphij
776147899Ssam		link_type = EXTRACT_16BITS(obj_tptr)>>8;
777276788Sdelphij
778276788Sdelphij		ND_PRINT((ndo, "\n\t Link Type: %s (%u)",
779147899Ssam		       tok2str(lmp_sd_service_config_cpsa_link_type_values,
780147899Ssam			       "Unknown", link_type),
781276788Sdelphij		       link_type));
782276788Sdelphij
783147899Ssam		if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH) {
784276788Sdelphij		    ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
785147899Ssam			   tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,
786147899Ssam				   "Unknown",
787147899Ssam				   EXTRACT_16BITS(obj_tptr) & 0x00FF),
788276788Sdelphij			   EXTRACT_16BITS(obj_tptr) & 0x00FF));
789147899Ssam		}
790276788Sdelphij
791147899Ssam		if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET) {
792276788Sdelphij		    ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
793147899Ssam			   tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,
794147899Ssam				   "Unknown",
795147899Ssam				   EXTRACT_16BITS(obj_tptr) & 0x00FF),
796276788Sdelphij			   EXTRACT_16BITS(obj_tptr) & 0x00FF));
797147899Ssam		}
798276788Sdelphij
799276788Sdelphij		ND_PRINT((ndo, "\n\t Transparency: %s",
800147899Ssam		       bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,
801147899Ssam				  "none",
802276788Sdelphij				  EXTRACT_16BITS(obj_tptr+2)>>8)));
803276788Sdelphij
804276788Sdelphij		ND_PRINT((ndo, "\n\t Contiguous Concatenation Types: %s",
805147899Ssam		       bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,
806147899Ssam				  "none",
807276788Sdelphij				  EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF)));
808276788Sdelphij
809276788Sdelphij		ND_PRINT((ndo, "\n\t Minimum NCC: %u",
810276788Sdelphij		       EXTRACT_16BITS(obj_tptr+4)));
811276788Sdelphij
812276788Sdelphij		ND_PRINT((ndo, "\n\t Maximum NCC: %u",
813276788Sdelphij		       EXTRACT_16BITS(obj_tptr+6)));
814276788Sdelphij
815276788Sdelphij		ND_PRINT((ndo, "\n\t Minimum NVC:%u",
816276788Sdelphij		       EXTRACT_16BITS(obj_tptr+8)));
817276788Sdelphij
818276788Sdelphij		ND_PRINT((ndo, "\n\t Maximum NVC:%u",
819276788Sdelphij		       EXTRACT_16BITS(obj_tptr+10)));
820276788Sdelphij
821276788Sdelphij		ND_PRINT((ndo, "\n\t    Local Interface ID: %s (0x%08x)",
822276788Sdelphij		       ipaddr_string(ndo, obj_tptr+12),
823276788Sdelphij		       EXTRACT_32BITS(obj_tptr+12)));
824276788Sdelphij
825147899Ssam		break;
826276788Sdelphij
827147899Ssam	    case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:
828276788Sdelphij
829276788Sdelphij		ND_PRINT((ndo, "\n\t Transparency Flags: %s",
830147899Ssam		       bittok2str(
831147899Ssam			   lmp_obj_service_config_nsa_transparency_flag_values,
832147899Ssam			   "none",
833276788Sdelphij			   EXTRACT_32BITS(obj_tptr))));
834147899Ssam
835276788Sdelphij		ND_PRINT((ndo, "\n\t TCM Monitoring Flags: %s",
836147899Ssam		       bittok2str(
837147899Ssam			   lmp_obj_service_config_nsa_tcm_flag_values,
838147899Ssam			   "none",
839276788Sdelphij			   EXTRACT_16BITS(obj_tptr+6) & 0x00FF)));
840276788Sdelphij
841147899Ssam		break;
842276788Sdelphij
843147899Ssam	    case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:
844276788Sdelphij
845276788Sdelphij		ND_PRINT((ndo, "\n\t Diversity: Flags: %s",
846147899Ssam		       bittok2str(
847147899Ssam			   lmp_obj_service_config_nsa_network_diversity_flag_values,
848147899Ssam			   "none",
849276788Sdelphij			   EXTRACT_16BITS(obj_tptr+2) & 0x00FF)));
850147899Ssam		break;
851147899Ssam
852147899Ssam	    default:
853147899Ssam		hexdump = TRUE;
854147899Ssam	    };
855147899Ssam
856147899Ssam	break;
857147899Ssam
858146773Ssam        default:
859276788Sdelphij            if (ndo->ndo_vflag <= 1)
860276788Sdelphij                print_unknown_data(ndo,obj_tptr,"\n\t    ",obj_tlen);
861146773Ssam            break;
862146773Ssam        }
863146773Ssam        /* do we want to see an additionally hexdump ? */
864276788Sdelphij        if (ndo->ndo_vflag > 1 || hexdump==TRUE)
865276788Sdelphij            print_unknown_data(ndo,tptr+sizeof(struct lmp_object_header),"\n\t    ",
866146773Ssam                               lmp_obj_len-sizeof(struct lmp_object_header));
867146773Ssam
868146773Ssam        tptr+=lmp_obj_len;
869146773Ssam        tlen-=lmp_obj_len;
870146773Ssam    }
871146773Ssam    return;
872146773Ssamtrunc:
873276788Sdelphij    ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
874146773Ssam}
875276788Sdelphij/*
876276788Sdelphij * Local Variables:
877276788Sdelphij * c-style: whitesmith
878276788Sdelphij * c-basic-offset: 8
879276788Sdelphij * End:
880276788Sdelphij */
881