xref: /aosp_15_r20/external/tcpdump/print-lmp.c (revision 05b00f6010a2396e3db2409989fc67270046269f)
1*05b00f60SXin Li /*
2*05b00f60SXin Li  * Redistribution and use in source and binary forms, with or without
3*05b00f60SXin Li  * modification, are permitted provided that: (1) source code
4*05b00f60SXin Li  * distributions retain the above copyright notice and this paragraph
5*05b00f60SXin Li  * in its entirety, and (2) distributions including binary code include
6*05b00f60SXin Li  * the above copyright notice and this paragraph in its entirety in
7*05b00f60SXin Li  * the documentation or other materials provided with the distribution.
8*05b00f60SXin Li  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9*05b00f60SXin Li  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10*05b00f60SXin Li  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11*05b00f60SXin Li  * FOR A PARTICULAR PURPOSE.
12*05b00f60SXin Li  *
13*05b00f60SXin Li  * Original code by Hannes Gredler ([email protected])
14*05b00f60SXin Li  * Support for LMP service discovery extensions (defined by OIF UNI 1.0)
15*05b00f60SXin Li  * added by Manu Pathak ([email protected]), May 2005
16*05b00f60SXin Li  */
17*05b00f60SXin Li 
18*05b00f60SXin Li /* \summary: Link Management Protocol (LMP) printer */
19*05b00f60SXin Li 
20*05b00f60SXin Li /* specification: RFC 4204 */
21*05b00f60SXin Li /* OIF UNI 1.0: https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf */
22*05b00f60SXin Li 
23*05b00f60SXin Li #ifdef HAVE_CONFIG_H
24*05b00f60SXin Li #include <config.h>
25*05b00f60SXin Li #endif
26*05b00f60SXin Li 
27*05b00f60SXin Li #include "netdissect-stdinc.h"
28*05b00f60SXin Li 
29*05b00f60SXin Li #define ND_LONGJMP_FROM_TCHECK
30*05b00f60SXin Li #include "netdissect.h"
31*05b00f60SXin Li #include "extract.h"
32*05b00f60SXin Li #include "addrtoname.h"
33*05b00f60SXin Li #include "gmpls.h"
34*05b00f60SXin Li 
35*05b00f60SXin Li 
36*05b00f60SXin Li /*
37*05b00f60SXin Li  * LMP common header
38*05b00f60SXin Li  *
39*05b00f60SXin Li  *  0                   1                   2                   3
40*05b00f60SXin Li  *  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
41*05b00f60SXin Li  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42*05b00f60SXin Li  * | Vers  |      (Reserved)       |    Flags      |    Msg Type   |
43*05b00f60SXin Li  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44*05b00f60SXin Li  * |          LMP Length           |          (Reserved)           |
45*05b00f60SXin Li  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46*05b00f60SXin Li  */
47*05b00f60SXin Li 
48*05b00f60SXin Li struct lmp_common_header {
49*05b00f60SXin Li     nd_uint16_t version_res;
50*05b00f60SXin Li     nd_uint8_t  flags;
51*05b00f60SXin Li     nd_uint8_t  msg_type;
52*05b00f60SXin Li     nd_uint16_t length;
53*05b00f60SXin Li     nd_byte     reserved[2];
54*05b00f60SXin Li };
55*05b00f60SXin Li 
56*05b00f60SXin Li #define LMP_VERSION            1
57*05b00f60SXin Li #define	LMP_EXTRACT_VERSION(x) (((x)&0xf000)>>12)
58*05b00f60SXin Li 
59*05b00f60SXin Li static const struct tok lmp_header_flag_values[] = {
60*05b00f60SXin Li     { 0x01, "Control Channel Down"},
61*05b00f60SXin Li     { 0x02, "LMP restart"},
62*05b00f60SXin Li     { 0, NULL}
63*05b00f60SXin Li };
64*05b00f60SXin Li 
65*05b00f60SXin Li static const struct tok lmp_obj_te_link_flag_values[] = {
66*05b00f60SXin Li     { 0x01, "Fault Management Supported"},
67*05b00f60SXin Li     { 0x02, "Link Verification Supported"},
68*05b00f60SXin Li     { 0, NULL}
69*05b00f60SXin Li };
70*05b00f60SXin Li 
71*05b00f60SXin Li static const struct tok lmp_obj_data_link_flag_values[] = {
72*05b00f60SXin Li     { 0x01, "Data Link Port"},
73*05b00f60SXin Li     { 0x02, "Allocated for user traffic"},
74*05b00f60SXin Li     { 0x04, "Failed link"},
75*05b00f60SXin Li     { 0, NULL}
76*05b00f60SXin Li };
77*05b00f60SXin Li 
78*05b00f60SXin Li static const struct tok lmp_obj_channel_status_values[] = {
79*05b00f60SXin Li     { 1, "Signal Okay"},
80*05b00f60SXin Li     { 2, "Signal Degraded"},
81*05b00f60SXin Li     { 3, "Signal Fail"},
82*05b00f60SXin Li     { 0, NULL}
83*05b00f60SXin Li };
84*05b00f60SXin Li 
85*05b00f60SXin Li static const struct tok lmp_obj_begin_verify_flag_values[] = {
86*05b00f60SXin Li     { 0x0001, "Verify all links"},
87*05b00f60SXin Li     { 0x0002, "Data link type"},
88*05b00f60SXin Li     { 0, NULL}
89*05b00f60SXin Li };
90*05b00f60SXin Li 
91*05b00f60SXin Li static const struct tok lmp_obj_begin_verify_error_values[] = {
92*05b00f60SXin Li     { 0x01, "Link Verification Procedure Not supported"},
93*05b00f60SXin Li     { 0x02, "Unwilling to verify"},
94*05b00f60SXin Li     { 0x04, "Unsupported verification transport mechanism"},
95*05b00f60SXin Li     { 0x08, "Link-Id configuration error"},
96*05b00f60SXin Li     { 0x10, "Unknown object c-type"},
97*05b00f60SXin Li     { 0, NULL}
98*05b00f60SXin Li };
99*05b00f60SXin Li 
100*05b00f60SXin Li static const struct tok lmp_obj_link_summary_error_values[] = {
101*05b00f60SXin Li     { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"},
102*05b00f60SXin Li     { 0x02, "Renegotiate LINK-SUMMARY parameters"},
103*05b00f60SXin Li     { 0x04, "Invalid TE-LINK Object"},
104*05b00f60SXin Li     { 0x08, "Invalid DATA-LINK Object"},
105*05b00f60SXin Li     { 0x10, "Unknown TE-LINK Object c-type"},
106*05b00f60SXin Li     { 0x20, "Unknown DATA-LINK Object c-type"},
107*05b00f60SXin Li     { 0, NULL}
108*05b00f60SXin Li };
109*05b00f60SXin Li 
110*05b00f60SXin Li /* Service Config Supported Protocols Flags */
111*05b00f60SXin Li static const struct tok lmp_obj_service_config_sp_flag_values[] = {
112*05b00f60SXin Li     { 0x01, "RSVP Supported"},
113*05b00f60SXin Li     { 0x02, "LDP Supported"},
114*05b00f60SXin Li     { 0, NULL}
115*05b00f60SXin Li };
116*05b00f60SXin Li 
117*05b00f60SXin Li /* Service Config Client Port Service Attribute Transparency Flags */
118*05b00f60SXin Li static const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = {
119*05b00f60SXin Li     { 0x01, "Path/VC Overhead Transparency Supported"},
120*05b00f60SXin Li     { 0x02, "Line/MS Overhead Transparency Supported"},
121*05b00f60SXin Li     { 0x04, "Section/RS Overhead Transparency Supported"},
122*05b00f60SXin Li     { 0, NULL}
123*05b00f60SXin Li };
124*05b00f60SXin Li 
125*05b00f60SXin Li /* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */
126*05b00f60SXin Li static const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = {
127*05b00f60SXin Li     { 0x01, "Contiguous Concatenation Types Supported"},
128*05b00f60SXin Li     { 0, NULL}
129*05b00f60SXin Li };
130*05b00f60SXin Li 
131*05b00f60SXin Li /* Service Config Network Service Attributes Transparency Flags */
132*05b00f60SXin Li static const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = {
133*05b00f60SXin Li     { 0x01, "Standard SOH/RSOH Transparency Supported"},
134*05b00f60SXin Li     { 0x02, "Standard LOH/MSOH Transparency Supported"},
135*05b00f60SXin Li     { 0, NULL}
136*05b00f60SXin Li };
137*05b00f60SXin Li 
138*05b00f60SXin Li /* Service Config Network Service Attributes TCM Monitoring Flags */
139*05b00f60SXin Li static const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = {
140*05b00f60SXin Li     { 0x01, "Transparent Tandem Connection Monitoring Supported"},
141*05b00f60SXin Li     { 0, NULL}
142*05b00f60SXin Li };
143*05b00f60SXin Li 
144*05b00f60SXin Li /* Network Service Attributes Network Diversity Flags */
145*05b00f60SXin Li static const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = {
146*05b00f60SXin Li     { 0x01, "Node Diversity Supported"},
147*05b00f60SXin Li     { 0x02, "Link Diversity Supported"},
148*05b00f60SXin Li     { 0x04, "SRLG Diversity Supported"},
149*05b00f60SXin Li     { 0, NULL}
150*05b00f60SXin Li };
151*05b00f60SXin Li 
152*05b00f60SXin Li #define	LMP_MSGTYPE_CONFIG                 1
153*05b00f60SXin Li #define	LMP_MSGTYPE_CONFIG_ACK             2
154*05b00f60SXin Li #define	LMP_MSGTYPE_CONFIG_NACK            3
155*05b00f60SXin Li #define	LMP_MSGTYPE_HELLO                  4
156*05b00f60SXin Li #define	LMP_MSGTYPE_VERIFY_BEGIN           5
157*05b00f60SXin Li #define	LMP_MSGTYPE_VERIFY_BEGIN_ACK       6
158*05b00f60SXin Li #define	LMP_MSGTYPE_VERIFY_BEGIN_NACK      7
159*05b00f60SXin Li #define LMP_MSGTYPE_VERIFY_END             8
160*05b00f60SXin Li #define LMP_MSGTYPE_VERIFY_END_ACK         9
161*05b00f60SXin Li #define LMP_MSGTYPE_TEST                  10
162*05b00f60SXin Li #define LMP_MSGTYPE_TEST_STATUS_SUCCESS   11
163*05b00f60SXin Li #define	LMP_MSGTYPE_TEST_STATUS_FAILURE   12
164*05b00f60SXin Li #define	LMP_MSGTYPE_TEST_STATUS_ACK       13
165*05b00f60SXin Li #define	LMP_MSGTYPE_LINK_SUMMARY          14
166*05b00f60SXin Li #define	LMP_MSGTYPE_LINK_SUMMARY_ACK      15
167*05b00f60SXin Li #define	LMP_MSGTYPE_LINK_SUMMARY_NACK     16
168*05b00f60SXin Li #define	LMP_MSGTYPE_CHANNEL_STATUS        17
169*05b00f60SXin Li #define	LMP_MSGTYPE_CHANNEL_STATUS_ACK    18
170*05b00f60SXin Li #define	LMP_MSGTYPE_CHANNEL_STATUS_REQ    19
171*05b00f60SXin Li #define	LMP_MSGTYPE_CHANNEL_STATUS_RESP   20
172*05b00f60SXin Li /* LMP Service Discovery message types defined by UNI 1.0 */
173*05b00f60SXin Li #define LMP_MSGTYPE_SERVICE_CONFIG        50
174*05b00f60SXin Li #define LMP_MSGTYPE_SERVICE_CONFIG_ACK    51
175*05b00f60SXin Li #define LMP_MSGTYPE_SERVICE_CONFIG_NACK   52
176*05b00f60SXin Li 
177*05b00f60SXin Li static const struct tok lmp_msg_type_values[] = {
178*05b00f60SXin Li     { LMP_MSGTYPE_CONFIG, "Config"},
179*05b00f60SXin Li     { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"},
180*05b00f60SXin Li     { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"},
181*05b00f60SXin Li     { LMP_MSGTYPE_HELLO, "Hello"},
182*05b00f60SXin Li     { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"},
183*05b00f60SXin Li     { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"},
184*05b00f60SXin Li     { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"},
185*05b00f60SXin Li     { LMP_MSGTYPE_VERIFY_END, "End Verify"},
186*05b00f60SXin Li     { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"},
187*05b00f60SXin Li     { LMP_MSGTYPE_TEST, "Test"},
188*05b00f60SXin Li     { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"},
189*05b00f60SXin Li     { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"},
190*05b00f60SXin Li     { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"},
191*05b00f60SXin Li     { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"},
192*05b00f60SXin Li     { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"},
193*05b00f60SXin Li     { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"},
194*05b00f60SXin Li     { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"},
195*05b00f60SXin Li     { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"},
196*05b00f60SXin Li     { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"},
197*05b00f60SXin Li     { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"},
198*05b00f60SXin Li     { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"},
199*05b00f60SXin Li     { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"},
200*05b00f60SXin Li     { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"},
201*05b00f60SXin Li     { 0, NULL}
202*05b00f60SXin Li };
203*05b00f60SXin Li 
204*05b00f60SXin Li /*
205*05b00f60SXin Li  * LMP object header
206*05b00f60SXin Li  *
207*05b00f60SXin Li  *  0                   1                   2                   3
208*05b00f60SXin Li  *  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
209*05b00f60SXin Li  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
210*05b00f60SXin Li  * |N|   C-Type    |     Class     |            Length             |
211*05b00f60SXin Li  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
212*05b00f60SXin Li  * |                                                               |
213*05b00f60SXin Li  * //                       (object contents)                     //
214*05b00f60SXin Li  * |                                                               |
215*05b00f60SXin Li  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
216*05b00f60SXin Li  */
217*05b00f60SXin Li 
218*05b00f60SXin Li struct lmp_object_header {
219*05b00f60SXin Li     nd_uint8_t  ctype;
220*05b00f60SXin Li     nd_uint8_t  class_num;
221*05b00f60SXin Li     nd_uint16_t length;
222*05b00f60SXin Li };
223*05b00f60SXin Li 
224*05b00f60SXin Li #define	LMP_OBJ_CC_ID                 1
225*05b00f60SXin Li #define	LMP_OBJ_NODE_ID               2
226*05b00f60SXin Li #define	LMP_OBJ_LINK_ID               3
227*05b00f60SXin Li #define	LMP_OBJ_INTERFACE_ID          4
228*05b00f60SXin Li #define	LMP_OBJ_MESSAGE_ID            5
229*05b00f60SXin Li #define	LMP_OBJ_CONFIG                6
230*05b00f60SXin Li #define	LMP_OBJ_HELLO                 7
231*05b00f60SXin Li #define	LMP_OBJ_VERIFY_BEGIN          8
232*05b00f60SXin Li #define LMP_OBJ_VERIFY_BEGIN_ACK      9
233*05b00f60SXin Li #define LMP_OBJ_VERIFY_ID            10
234*05b00f60SXin Li #define LMP_OBJ_TE_LINK              11
235*05b00f60SXin Li #define LMP_OBJ_DATA_LINK            12
236*05b00f60SXin Li #define LMP_OBJ_CHANNEL_STATUS       13
237*05b00f60SXin Li #define LMP_OBJ_CHANNEL_STATUS_REQ   14
238*05b00f60SXin Li #define LMP_OBJ_ERROR_CODE           20
239*05b00f60SXin Li 
240*05b00f60SXin Li #define LMP_OBJ_SERVICE_CONFIG       51 /* defined in UNI 1.0 */
241*05b00f60SXin Li 
242*05b00f60SXin Li static const struct tok lmp_obj_values[] = {
243*05b00f60SXin Li     { LMP_OBJ_CC_ID, "Control Channel ID" },
244*05b00f60SXin Li     { LMP_OBJ_NODE_ID, "Node ID" },
245*05b00f60SXin Li     { LMP_OBJ_LINK_ID, "Link ID" },
246*05b00f60SXin Li     { LMP_OBJ_INTERFACE_ID, "Interface ID" },
247*05b00f60SXin Li     { LMP_OBJ_MESSAGE_ID, "Message ID" },
248*05b00f60SXin Li     { LMP_OBJ_CONFIG, "Configuration" },
249*05b00f60SXin Li     { LMP_OBJ_HELLO, "Hello" },
250*05b00f60SXin Li     { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" },
251*05b00f60SXin Li     { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" },
252*05b00f60SXin Li     { LMP_OBJ_VERIFY_ID, "Verify ID" },
253*05b00f60SXin Li     { LMP_OBJ_TE_LINK, "TE Link" },
254*05b00f60SXin Li     { LMP_OBJ_DATA_LINK, "Data Link" },
255*05b00f60SXin Li     { LMP_OBJ_CHANNEL_STATUS, "Channel Status" },
256*05b00f60SXin Li     { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" },
257*05b00f60SXin Li     { LMP_OBJ_ERROR_CODE, "Error Code" },
258*05b00f60SXin Li     { LMP_OBJ_SERVICE_CONFIG, "Service Config" },
259*05b00f60SXin Li 
260*05b00f60SXin Li     { 0, NULL}
261*05b00f60SXin Li };
262*05b00f60SXin Li 
263*05b00f60SXin Li #define INT_SWITCHING_TYPE_SUBOBJ 1
264*05b00f60SXin Li #define WAVELENGTH_SUBOBJ         2
265*05b00f60SXin Li 
266*05b00f60SXin Li static const struct tok lmp_data_link_subobj[] = {
267*05b00f60SXin Li     { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" },
268*05b00f60SXin Li     { WAVELENGTH_SUBOBJ        , "Wavelength" },
269*05b00f60SXin Li     { 0, NULL}
270*05b00f60SXin Li };
271*05b00f60SXin Li 
272*05b00f60SXin Li #define	LMP_CTYPE_IPV4       1
273*05b00f60SXin Li #define	LMP_CTYPE_IPV6       2
274*05b00f60SXin Li 
275*05b00f60SXin Li #define	LMP_CTYPE_LOC        1
276*05b00f60SXin Li #define	LMP_CTYPE_RMT        2
277*05b00f60SXin Li #define	LMP_CTYPE_UNMD       3
278*05b00f60SXin Li 
279*05b00f60SXin Li #define	LMP_CTYPE_IPV4_LOC   1
280*05b00f60SXin Li #define	LMP_CTYPE_IPV4_RMT   2
281*05b00f60SXin Li #define	LMP_CTYPE_IPV6_LOC   3
282*05b00f60SXin Li #define	LMP_CTYPE_IPV6_RMT   4
283*05b00f60SXin Li #define	LMP_CTYPE_UNMD_LOC   5
284*05b00f60SXin Li #define	LMP_CTYPE_UNMD_RMT   6
285*05b00f60SXin Li 
286*05b00f60SXin Li #define	LMP_CTYPE_1          1
287*05b00f60SXin Li #define	LMP_CTYPE_2          2
288*05b00f60SXin Li 
289*05b00f60SXin Li #define LMP_CTYPE_HELLO_CONFIG  1
290*05b00f60SXin Li #define LMP_CTYPE_HELLO         1
291*05b00f60SXin Li 
292*05b00f60SXin Li #define LMP_CTYPE_BEGIN_VERIFY_ERROR 1
293*05b00f60SXin Li #define LMP_CTYPE_LINK_SUMMARY_ERROR 2
294*05b00f60SXin Li 
295*05b00f60SXin Li /* C-Types for Service Config Object */
296*05b00f60SXin Li #define LMP_CTYPE_SERVICE_CONFIG_SP                   1
297*05b00f60SXin Li #define LMP_CTYPE_SERVICE_CONFIG_CPSA                 2
298*05b00f60SXin Li #define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM     3
299*05b00f60SXin Li #define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY    4
300*05b00f60SXin Li 
301*05b00f60SXin Li /*
302*05b00f60SXin Li  * Different link types allowed in the Client Port Service Attributes
303*05b00f60SXin Li  * subobject defined for LMP Service Discovery in the UNI 1.0 spec
304*05b00f60SXin Li  */
305*05b00f60SXin Li #define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH     5 /* UNI 1.0 Sec 9.4.2 */
306*05b00f60SXin Li #define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET   6 /* UNI 1.0 Sec 9.4.2 */
307*05b00f60SXin Li 
308*05b00f60SXin Li /*
309*05b00f60SXin Li  * the ctypes are not globally unique so for
310*05b00f60SXin Li  * translating it to strings we build a table based
311*05b00f60SXin Li  * on objects offsetted by the ctype
312*05b00f60SXin Li  */
313*05b00f60SXin Li 
314*05b00f60SXin Li static const struct tok lmp_ctype_values[] = {
315*05b00f60SXin Li     { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" },
316*05b00f60SXin Li     { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" },
317*05b00f60SXin Li     { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" },
318*05b00f60SXin Li     { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" },
319*05b00f60SXin Li     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
320*05b00f60SXin Li     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
321*05b00f60SXin Li     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
322*05b00f60SXin Li     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
323*05b00f60SXin Li     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
324*05b00f60SXin Li     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
325*05b00f60SXin Li     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
326*05b00f60SXin Li     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
327*05b00f60SXin Li     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
328*05b00f60SXin Li     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
329*05b00f60SXin Li     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
330*05b00f60SXin Li     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
331*05b00f60SXin Li     { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" },
332*05b00f60SXin Li     { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" },
333*05b00f60SXin Li     { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" },
334*05b00f60SXin Li     { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" },
335*05b00f60SXin Li     { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" },
336*05b00f60SXin Li     { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" },
337*05b00f60SXin Li     { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" },
338*05b00f60SXin Li     { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" },
339*05b00f60SXin Li     { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" },
340*05b00f60SXin Li     { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
341*05b00f60SXin Li     { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" },
342*05b00f60SXin Li     { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" },
343*05b00f60SXin Li     { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
344*05b00f60SXin Li     { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" },
345*05b00f60SXin Li     { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" },
346*05b00f60SXin Li     { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" },
347*05b00f60SXin Li     { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" },
348*05b00f60SXin Li     { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" },
349*05b00f60SXin Li     { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" },
350*05b00f60SXin Li     { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" },
351*05b00f60SXin Li     { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" },
352*05b00f60SXin Li     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" },
353*05b00f60SXin Li     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" },
354*05b00f60SXin Li     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" },
355*05b00f60SXin Li     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" },
356*05b00f60SXin Li     { 0, NULL}
357*05b00f60SXin Li };
358*05b00f60SXin Li 
359*05b00f60SXin Li static int
lmp_print_data_link_subobjs(netdissect_options * ndo,const u_char * obj_tptr,int total_subobj_len,int offset)360*05b00f60SXin Li lmp_print_data_link_subobjs(netdissect_options *ndo, const u_char *obj_tptr,
361*05b00f60SXin Li                             int total_subobj_len, int offset)
362*05b00f60SXin Li {
363*05b00f60SXin Li     int hexdump = FALSE;
364*05b00f60SXin Li     int subobj_type, subobj_len;
365*05b00f60SXin Li 
366*05b00f60SXin Li     union { /* int to float conversion buffer */
367*05b00f60SXin Li         float f;
368*05b00f60SXin Li         uint32_t i;
369*05b00f60SXin Li     } bw;
370*05b00f60SXin Li 
371*05b00f60SXin Li     while (total_subobj_len > 0 && hexdump == FALSE ) {
372*05b00f60SXin Li 	subobj_type = GET_U_1(obj_tptr + offset);
373*05b00f60SXin Li 	subobj_len  = GET_U_1(obj_tptr + offset + 1);
374*05b00f60SXin Li 	ND_PRINT("\n\t    Subobject, Type: %s (%u), Length: %u",
375*05b00f60SXin Li 		tok2str(lmp_data_link_subobj,
376*05b00f60SXin Li 			"Unknown",
377*05b00f60SXin Li 			subobj_type),
378*05b00f60SXin Li 			subobj_type,
379*05b00f60SXin Li 			subobj_len);
380*05b00f60SXin Li 	if (subobj_len < 4) {
381*05b00f60SXin Li 	    ND_PRINT(" (too short)");
382*05b00f60SXin Li 	    break;
383*05b00f60SXin Li 	}
384*05b00f60SXin Li 	if ((subobj_len % 4) != 0) {
385*05b00f60SXin Li 	    ND_PRINT(" (not a multiple of 4)");
386*05b00f60SXin Li 	    break;
387*05b00f60SXin Li 	}
388*05b00f60SXin Li 	if (total_subobj_len < subobj_len) {
389*05b00f60SXin Li 	    ND_PRINT(" (goes past the end of the object)");
390*05b00f60SXin Li 	    break;
391*05b00f60SXin Li 	}
392*05b00f60SXin Li 	switch(subobj_type) {
393*05b00f60SXin Li 	case INT_SWITCHING_TYPE_SUBOBJ:
394*05b00f60SXin Li 	    ND_PRINT("\n\t      Switching Type: %s (%u)",
395*05b00f60SXin Li 		tok2str(gmpls_switch_cap_values,
396*05b00f60SXin Li 			"Unknown",
397*05b00f60SXin Li 			GET_U_1(obj_tptr + offset + 2)),
398*05b00f60SXin Li 		GET_U_1(obj_tptr + offset + 2));
399*05b00f60SXin Li 	    ND_PRINT("\n\t      Encoding Type: %s (%u)",
400*05b00f60SXin Li 		tok2str(gmpls_encoding_values,
401*05b00f60SXin Li 			"Unknown",
402*05b00f60SXin Li 			GET_U_1(obj_tptr + offset + 3)),
403*05b00f60SXin Li 		GET_U_1(obj_tptr + offset + 3));
404*05b00f60SXin Li 	    bw.i = GET_BE_U_4(obj_tptr + offset + 4);
405*05b00f60SXin Li 	    ND_PRINT("\n\t      Min Reservable Bandwidth: %.3f Mbps",
406*05b00f60SXin Li                 bw.f*8/1000000);
407*05b00f60SXin Li 	    bw.i = GET_BE_U_4(obj_tptr + offset + 8);
408*05b00f60SXin Li 	    ND_PRINT("\n\t      Max Reservable Bandwidth: %.3f Mbps",
409*05b00f60SXin Li                 bw.f*8/1000000);
410*05b00f60SXin Li 	    break;
411*05b00f60SXin Li 	case WAVELENGTH_SUBOBJ:
412*05b00f60SXin Li 	    ND_PRINT("\n\t      Wavelength: %u",
413*05b00f60SXin Li 		GET_BE_U_4(obj_tptr + offset + 4));
414*05b00f60SXin Li 	    break;
415*05b00f60SXin Li 	default:
416*05b00f60SXin Li 	    /* Any Unknown Subobject ==> Exit loop */
417*05b00f60SXin Li 	    hexdump=TRUE;
418*05b00f60SXin Li 	    break;
419*05b00f60SXin Li 	}
420*05b00f60SXin Li 	total_subobj_len-=subobj_len;
421*05b00f60SXin Li 	offset+=subobj_len;
422*05b00f60SXin Li     }
423*05b00f60SXin Li     return (hexdump);
424*05b00f60SXin Li }
425*05b00f60SXin Li 
426*05b00f60SXin Li void
lmp_print(netdissect_options * ndo,const u_char * pptr,u_int length)427*05b00f60SXin Li lmp_print(netdissect_options *ndo,
428*05b00f60SXin Li           const u_char *pptr, u_int length)
429*05b00f60SXin Li {
430*05b00f60SXin Li     const struct lmp_common_header *lmp_com_header;
431*05b00f60SXin Li     const u_char *tptr,*obj_tptr;
432*05b00f60SXin Li     u_int version_res, tlen, lmp_obj_len, lmp_obj_ctype, obj_tlen;
433*05b00f60SXin Li     int hexdump;
434*05b00f60SXin Li     u_int offset;
435*05b00f60SXin Li     u_int link_type;
436*05b00f60SXin Li 
437*05b00f60SXin Li     union { /* int to float conversion buffer */
438*05b00f60SXin Li         float f;
439*05b00f60SXin Li         uint32_t i;
440*05b00f60SXin Li     } bw;
441*05b00f60SXin Li 
442*05b00f60SXin Li     ndo->ndo_protocol = "lmp";
443*05b00f60SXin Li     tptr=pptr;
444*05b00f60SXin Li     lmp_com_header = (const struct lmp_common_header *)pptr;
445*05b00f60SXin Li     ND_TCHECK_SIZE(lmp_com_header);
446*05b00f60SXin Li 
447*05b00f60SXin Li     version_res = GET_BE_U_2(lmp_com_header->version_res);
448*05b00f60SXin Li 
449*05b00f60SXin Li     /*
450*05b00f60SXin Li      * Sanity checking of the header.
451*05b00f60SXin Li      */
452*05b00f60SXin Li     if (LMP_EXTRACT_VERSION(version_res) != LMP_VERSION) {
453*05b00f60SXin Li 	ND_PRINT("LMP version %u packet not supported",
454*05b00f60SXin Li                LMP_EXTRACT_VERSION(version_res));
455*05b00f60SXin Li 	return;
456*05b00f60SXin Li     }
457*05b00f60SXin Li 
458*05b00f60SXin Li     /* in non-verbose mode just lets print the basic Message Type*/
459*05b00f60SXin Li     if (ndo->ndo_vflag < 1) {
460*05b00f60SXin Li         ND_PRINT("LMPv%u %s Message, length: %u",
461*05b00f60SXin Li                LMP_EXTRACT_VERSION(version_res),
462*05b00f60SXin Li                tok2str(lmp_msg_type_values, "unknown (%u)",GET_U_1(lmp_com_header->msg_type)),
463*05b00f60SXin Li                length);
464*05b00f60SXin Li         return;
465*05b00f60SXin Li     }
466*05b00f60SXin Li 
467*05b00f60SXin Li     /* ok they seem to want to know everything - lets fully decode it */
468*05b00f60SXin Li 
469*05b00f60SXin Li     tlen=GET_BE_U_2(lmp_com_header->length);
470*05b00f60SXin Li 
471*05b00f60SXin Li     ND_PRINT("\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
472*05b00f60SXin Li            LMP_EXTRACT_VERSION(version_res),
473*05b00f60SXin Li            tok2str(lmp_msg_type_values, "unknown, type: %u",GET_U_1(lmp_com_header->msg_type)),
474*05b00f60SXin Li            bittok2str(lmp_header_flag_values,"none",GET_U_1(lmp_com_header->flags)),
475*05b00f60SXin Li            tlen);
476*05b00f60SXin Li     if (tlen < sizeof(struct lmp_common_header)) {
477*05b00f60SXin Li         ND_PRINT(" (too short)");
478*05b00f60SXin Li         return;
479*05b00f60SXin Li     }
480*05b00f60SXin Li     if (tlen > length) {
481*05b00f60SXin Li         ND_PRINT(" (too long)");
482*05b00f60SXin Li         tlen = length;
483*05b00f60SXin Li     }
484*05b00f60SXin Li 
485*05b00f60SXin Li     tptr+=sizeof(struct lmp_common_header);
486*05b00f60SXin Li     tlen-=sizeof(struct lmp_common_header);
487*05b00f60SXin Li 
488*05b00f60SXin Li     while(tlen>0) {
489*05b00f60SXin Li         const struct lmp_object_header *lmp_obj_header =
490*05b00f60SXin Li             (const struct lmp_object_header *)tptr;
491*05b00f60SXin Li         lmp_obj_len=GET_BE_U_2(lmp_obj_header->length);
492*05b00f60SXin Li         lmp_obj_ctype=GET_U_1(lmp_obj_header->ctype)&0x7f;
493*05b00f60SXin Li 
494*05b00f60SXin Li         ND_PRINT("\n\t  %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
495*05b00f60SXin Li                tok2str(lmp_obj_values,
496*05b00f60SXin Li                        "Unknown",
497*05b00f60SXin Li                        GET_U_1(lmp_obj_header->class_num)),
498*05b00f60SXin Li                GET_U_1(lmp_obj_header->class_num),
499*05b00f60SXin Li                tok2str(lmp_ctype_values,
500*05b00f60SXin Li                        "Unknown",
501*05b00f60SXin Li                        (GET_U_1(lmp_obj_header->class_num)<<8)+lmp_obj_ctype),
502*05b00f60SXin Li                lmp_obj_ctype,
503*05b00f60SXin Li                GET_U_1(lmp_obj_header->ctype)&0x80 ? "" : "non-",
504*05b00f60SXin Li                lmp_obj_len);
505*05b00f60SXin Li 
506*05b00f60SXin Li         if (lmp_obj_len < 4) {
507*05b00f60SXin Li             ND_PRINT(" (too short)");
508*05b00f60SXin Li             return;
509*05b00f60SXin Li         }
510*05b00f60SXin Li         if ((lmp_obj_len % 4) != 0) {
511*05b00f60SXin Li             ND_PRINT(" (not a multiple of 4)");
512*05b00f60SXin Li             return;
513*05b00f60SXin Li         }
514*05b00f60SXin Li 
515*05b00f60SXin Li         obj_tptr=tptr+sizeof(struct lmp_object_header);
516*05b00f60SXin Li         obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header);
517*05b00f60SXin Li 
518*05b00f60SXin Li         /* did we capture enough for fully decoding the object ? */
519*05b00f60SXin Li         ND_TCHECK_LEN(tptr, lmp_obj_len);
520*05b00f60SXin Li         hexdump=FALSE;
521*05b00f60SXin Li 
522*05b00f60SXin Li         switch(GET_U_1(lmp_obj_header->class_num)) {
523*05b00f60SXin Li 
524*05b00f60SXin Li         case LMP_OBJ_CC_ID:
525*05b00f60SXin Li             switch(lmp_obj_ctype) {
526*05b00f60SXin Li             case LMP_CTYPE_LOC:
527*05b00f60SXin Li             case LMP_CTYPE_RMT:
528*05b00f60SXin Li                 if (obj_tlen != 4) {
529*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
530*05b00f60SXin Li                     break;
531*05b00f60SXin Li                 }
532*05b00f60SXin Li                 ND_PRINT("\n\t    Control Channel ID: %u (0x%08x)",
533*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
534*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
535*05b00f60SXin Li                 break;
536*05b00f60SXin Li 
537*05b00f60SXin Li             default:
538*05b00f60SXin Li                 hexdump=TRUE;
539*05b00f60SXin Li             }
540*05b00f60SXin Li             break;
541*05b00f60SXin Li 
542*05b00f60SXin Li         case LMP_OBJ_LINK_ID:
543*05b00f60SXin Li         case LMP_OBJ_INTERFACE_ID:
544*05b00f60SXin Li             switch(lmp_obj_ctype) {
545*05b00f60SXin Li             case LMP_CTYPE_IPV4_LOC:
546*05b00f60SXin Li             case LMP_CTYPE_IPV4_RMT:
547*05b00f60SXin Li                 if (obj_tlen != 4) {
548*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
549*05b00f60SXin Li                     break;
550*05b00f60SXin Li                 }
551*05b00f60SXin Li                 ND_PRINT("\n\t    IPv4 Link ID: %s (0x%08x)",
552*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
553*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
554*05b00f60SXin Li                 break;
555*05b00f60SXin Li             case LMP_CTYPE_IPV6_LOC:
556*05b00f60SXin Li             case LMP_CTYPE_IPV6_RMT:
557*05b00f60SXin Li                 if (obj_tlen != 16) {
558*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
559*05b00f60SXin Li                     break;
560*05b00f60SXin Li                 }
561*05b00f60SXin Li                 ND_PRINT("\n\t    IPv6 Link ID: %s (0x%08x)",
562*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
563*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
564*05b00f60SXin Li                 break;
565*05b00f60SXin Li             case LMP_CTYPE_UNMD_LOC:
566*05b00f60SXin Li             case LMP_CTYPE_UNMD_RMT:
567*05b00f60SXin Li                 if (obj_tlen != 4) {
568*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
569*05b00f60SXin Li                     break;
570*05b00f60SXin Li                 }
571*05b00f60SXin Li                 ND_PRINT("\n\t    Link ID: %u (0x%08x)",
572*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
573*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
574*05b00f60SXin Li                 break;
575*05b00f60SXin Li             default:
576*05b00f60SXin Li                 hexdump=TRUE;
577*05b00f60SXin Li             }
578*05b00f60SXin Li             break;
579*05b00f60SXin Li 
580*05b00f60SXin Li         case LMP_OBJ_MESSAGE_ID:
581*05b00f60SXin Li             switch(lmp_obj_ctype) {
582*05b00f60SXin Li             case LMP_CTYPE_1:
583*05b00f60SXin Li                 if (obj_tlen != 4) {
584*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
585*05b00f60SXin Li                     break;
586*05b00f60SXin Li                 }
587*05b00f60SXin Li                 ND_PRINT("\n\t    Message ID: %u (0x%08x)",
588*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
589*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
590*05b00f60SXin Li                 break;
591*05b00f60SXin Li             case LMP_CTYPE_2:
592*05b00f60SXin Li                 if (obj_tlen != 4) {
593*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
594*05b00f60SXin Li                     break;
595*05b00f60SXin Li                 }
596*05b00f60SXin Li                 ND_PRINT("\n\t    Message ID Ack: %u (0x%08x)",
597*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
598*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
599*05b00f60SXin Li                 break;
600*05b00f60SXin Li             default:
601*05b00f60SXin Li                 hexdump=TRUE;
602*05b00f60SXin Li             }
603*05b00f60SXin Li             break;
604*05b00f60SXin Li 
605*05b00f60SXin Li         case LMP_OBJ_NODE_ID:
606*05b00f60SXin Li             switch(lmp_obj_ctype) {
607*05b00f60SXin Li             case LMP_CTYPE_LOC:
608*05b00f60SXin Li             case LMP_CTYPE_RMT:
609*05b00f60SXin Li                 if (obj_tlen != 4) {
610*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
611*05b00f60SXin Li                     break;
612*05b00f60SXin Li                 }
613*05b00f60SXin Li                 ND_PRINT("\n\t    Node ID: %s (0x%08x)",
614*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
615*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
616*05b00f60SXin Li                 break;
617*05b00f60SXin Li 
618*05b00f60SXin Li             default:
619*05b00f60SXin Li                 hexdump=TRUE;
620*05b00f60SXin Li             }
621*05b00f60SXin Li             break;
622*05b00f60SXin Li 
623*05b00f60SXin Li         case LMP_OBJ_CONFIG:
624*05b00f60SXin Li             switch(lmp_obj_ctype) {
625*05b00f60SXin Li             case LMP_CTYPE_HELLO_CONFIG:
626*05b00f60SXin Li                 if (obj_tlen != 4) {
627*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
628*05b00f60SXin Li                     break;
629*05b00f60SXin Li                 }
630*05b00f60SXin Li                 ND_PRINT("\n\t    Hello Interval: %u\n\t    Hello Dead Interval: %u",
631*05b00f60SXin Li                        GET_BE_U_2(obj_tptr),
632*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 2));
633*05b00f60SXin Li                 break;
634*05b00f60SXin Li 
635*05b00f60SXin Li             default:
636*05b00f60SXin Li                 hexdump=TRUE;
637*05b00f60SXin Li             }
638*05b00f60SXin Li             break;
639*05b00f60SXin Li 
640*05b00f60SXin Li         case LMP_OBJ_HELLO:
641*05b00f60SXin Li             switch(lmp_obj_ctype) {
642*05b00f60SXin Li 	    case LMP_CTYPE_HELLO:
643*05b00f60SXin Li                 if (obj_tlen != 8) {
644*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
645*05b00f60SXin Li                     break;
646*05b00f60SXin Li                 }
647*05b00f60SXin Li                 ND_PRINT("\n\t    Tx Seq: %u, Rx Seq: %u",
648*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
649*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4));
650*05b00f60SXin Li                 break;
651*05b00f60SXin Li 
652*05b00f60SXin Li             default:
653*05b00f60SXin Li                 hexdump=TRUE;
654*05b00f60SXin Li             }
655*05b00f60SXin Li             break;
656*05b00f60SXin Li 
657*05b00f60SXin Li         case LMP_OBJ_TE_LINK:
658*05b00f60SXin Li 	    switch(lmp_obj_ctype) {
659*05b00f60SXin Li 	    case LMP_CTYPE_IPV4:
660*05b00f60SXin Li                 if (obj_tlen != 12) {
661*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
662*05b00f60SXin Li                     break;
663*05b00f60SXin Li                 }
664*05b00f60SXin Li 		ND_PRINT("\n\t    Flags: [%s]",
665*05b00f60SXin Li 		    bittok2str(lmp_obj_te_link_flag_values,
666*05b00f60SXin Li 			"none",
667*05b00f60SXin Li 			GET_U_1(obj_tptr)));
668*05b00f60SXin Li 
669*05b00f60SXin Li 		ND_PRINT("\n\t    Local Link-ID: %s (0x%08x)"
670*05b00f60SXin Li 		       "\n\t    Remote Link-ID: %s (0x%08x)",
671*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr+4),
672*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
673*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr+8),
674*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8));
675*05b00f60SXin Li 		break;
676*05b00f60SXin Li 
677*05b00f60SXin Li 	    case LMP_CTYPE_IPV6:
678*05b00f60SXin Li                 if (obj_tlen != 36) {
679*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
680*05b00f60SXin Li                     break;
681*05b00f60SXin Li                 }
682*05b00f60SXin Li 		ND_PRINT("\n\t    Flags: [%s]",
683*05b00f60SXin Li 		    bittok2str(lmp_obj_te_link_flag_values,
684*05b00f60SXin Li 			"none",
685*05b00f60SXin Li 			GET_U_1(obj_tptr)));
686*05b00f60SXin Li 
687*05b00f60SXin Li 		ND_PRINT("\n\t    Local Link-ID: %s (0x%08x)"
688*05b00f60SXin Li 		       "\n\t    Remote Link-ID: %s (0x%08x)",
689*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr+4),
690*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
691*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr+20),
692*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 20));
693*05b00f60SXin Li                 break;
694*05b00f60SXin Li 
695*05b00f60SXin Li 	    case LMP_CTYPE_UNMD:
696*05b00f60SXin Li                 if (obj_tlen != 12) {
697*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
698*05b00f60SXin Li                     break;
699*05b00f60SXin Li                 }
700*05b00f60SXin Li 		ND_PRINT("\n\t    Flags: [%s]",
701*05b00f60SXin Li 		    bittok2str(lmp_obj_te_link_flag_values,
702*05b00f60SXin Li 			"none",
703*05b00f60SXin Li 			GET_U_1(obj_tptr)));
704*05b00f60SXin Li 
705*05b00f60SXin Li 		ND_PRINT("\n\t    Local Link-ID: %u (0x%08x)"
706*05b00f60SXin Li 		       "\n\t    Remote Link-ID: %u (0x%08x)",
707*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
708*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
709*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8),
710*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8));
711*05b00f60SXin Li 		break;
712*05b00f60SXin Li 
713*05b00f60SXin Li             default:
714*05b00f60SXin Li                 hexdump=TRUE;
715*05b00f60SXin Li             }
716*05b00f60SXin Li             break;
717*05b00f60SXin Li 
718*05b00f60SXin Li         case LMP_OBJ_DATA_LINK:
719*05b00f60SXin Li 	    switch(lmp_obj_ctype) {
720*05b00f60SXin Li 	    case LMP_CTYPE_IPV4:
721*05b00f60SXin Li                 if (obj_tlen < 12) {
722*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
723*05b00f60SXin Li                     break;
724*05b00f60SXin Li                 }
725*05b00f60SXin Li 	        ND_PRINT("\n\t    Flags: [%s]",
726*05b00f60SXin Li 		    bittok2str(lmp_obj_data_link_flag_values,
727*05b00f60SXin Li 			"none",
728*05b00f60SXin Li 			GET_U_1(obj_tptr)));
729*05b00f60SXin Li                 ND_PRINT("\n\t    Local Interface ID: %s (0x%08x)"
730*05b00f60SXin Li                        "\n\t    Remote Interface ID: %s (0x%08x)",
731*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr+4),
732*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
733*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr+8),
734*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8));
735*05b00f60SXin Li 
736*05b00f60SXin Li 		if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 12, 12))
737*05b00f60SXin Li 		    hexdump=TRUE;
738*05b00f60SXin Li 		break;
739*05b00f60SXin Li 
740*05b00f60SXin Li 	    case LMP_CTYPE_IPV6:
741*05b00f60SXin Li                 if (obj_tlen < 36) {
742*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
743*05b00f60SXin Li                     break;
744*05b00f60SXin Li                 }
745*05b00f60SXin Li 	        ND_PRINT("\n\t    Flags: [%s]",
746*05b00f60SXin Li 		    bittok2str(lmp_obj_data_link_flag_values,
747*05b00f60SXin Li 			"none",
748*05b00f60SXin Li 			GET_U_1(obj_tptr)));
749*05b00f60SXin Li                 ND_PRINT("\n\t    Local Interface ID: %s (0x%08x)"
750*05b00f60SXin Li                        "\n\t    Remote Interface ID: %s (0x%08x)",
751*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr+4),
752*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
753*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr+20),
754*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 20));
755*05b00f60SXin Li 
756*05b00f60SXin Li 		if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 36, 36))
757*05b00f60SXin Li 		    hexdump=TRUE;
758*05b00f60SXin Li 		break;
759*05b00f60SXin Li 
760*05b00f60SXin Li 	    case LMP_CTYPE_UNMD:
761*05b00f60SXin Li                 if (obj_tlen < 12) {
762*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
763*05b00f60SXin Li                     break;
764*05b00f60SXin Li                 }
765*05b00f60SXin Li 	        ND_PRINT("\n\t    Flags: [%s]",
766*05b00f60SXin Li 		    bittok2str(lmp_obj_data_link_flag_values,
767*05b00f60SXin Li 			"none",
768*05b00f60SXin Li 			GET_U_1(obj_tptr)));
769*05b00f60SXin Li                 ND_PRINT("\n\t    Local Interface ID: %u (0x%08x)"
770*05b00f60SXin Li                        "\n\t    Remote Interface ID: %u (0x%08x)",
771*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
772*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
773*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8),
774*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8));
775*05b00f60SXin Li 
776*05b00f60SXin Li 		if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 12, 12))
777*05b00f60SXin Li 		    hexdump=TRUE;
778*05b00f60SXin Li 		break;
779*05b00f60SXin Li 
780*05b00f60SXin Li             default:
781*05b00f60SXin Li                 hexdump=TRUE;
782*05b00f60SXin Li             }
783*05b00f60SXin Li             break;
784*05b00f60SXin Li 
785*05b00f60SXin Li         case LMP_OBJ_VERIFY_BEGIN:
786*05b00f60SXin Li 	    switch(lmp_obj_ctype) {
787*05b00f60SXin Li             case LMP_CTYPE_1:
788*05b00f60SXin Li                 if (obj_tlen != 20) {
789*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
790*05b00f60SXin Li                     break;
791*05b00f60SXin Li                 }
792*05b00f60SXin Li 		ND_PRINT("\n\t    Flags: %s",
793*05b00f60SXin Li 		bittok2str(lmp_obj_begin_verify_flag_values,
794*05b00f60SXin Li 			"none",
795*05b00f60SXin Li 			GET_BE_U_2(obj_tptr)));
796*05b00f60SXin Li 		ND_PRINT("\n\t    Verify Interval: %u",
797*05b00f60SXin Li 			GET_BE_U_2(obj_tptr + 2));
798*05b00f60SXin Li 		ND_PRINT("\n\t    Data links: %u",
799*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + 4));
800*05b00f60SXin Li                 ND_PRINT("\n\t    Encoding type: %s",
801*05b00f60SXin Li 			tok2str(gmpls_encoding_values, "Unknown", GET_U_1((obj_tptr + 8))));
802*05b00f60SXin Li                 ND_PRINT("\n\t    Verify Transport Mechanism: %u (0x%x)%s",
803*05b00f60SXin Li 			GET_BE_U_2(obj_tptr + 10),
804*05b00f60SXin Li 			GET_BE_U_2(obj_tptr + 10),
805*05b00f60SXin Li 			GET_BE_U_2(obj_tptr + 10)&8000 ? " (Payload test messages capable)" : "");
806*05b00f60SXin Li                 bw.i = GET_BE_U_4(obj_tptr + 12);
807*05b00f60SXin Li 		ND_PRINT("\n\t    Transmission Rate: %.3f Mbps",bw.f*8/1000000);
808*05b00f60SXin Li 		ND_PRINT("\n\t    Wavelength: %u",
809*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + 16));
810*05b00f60SXin Li 		break;
811*05b00f60SXin Li 
812*05b00f60SXin Li             default:
813*05b00f60SXin Li                 hexdump=TRUE;
814*05b00f60SXin Li             }
815*05b00f60SXin Li             break;
816*05b00f60SXin Li 
817*05b00f60SXin Li         case LMP_OBJ_VERIFY_BEGIN_ACK:
818*05b00f60SXin Li 	    switch(lmp_obj_ctype) {
819*05b00f60SXin Li             case LMP_CTYPE_1:
820*05b00f60SXin Li                 if (obj_tlen != 4) {
821*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
822*05b00f60SXin Li                     break;
823*05b00f60SXin Li                 }
824*05b00f60SXin Li                 ND_PRINT("\n\t    Verify Dead Interval: %u"
825*05b00f60SXin Li                        "\n\t    Verify Transport Response: %u",
826*05b00f60SXin Li                        GET_BE_U_2(obj_tptr),
827*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 2));
828*05b00f60SXin Li                 break;
829*05b00f60SXin Li 
830*05b00f60SXin Li             default:
831*05b00f60SXin Li                 hexdump=TRUE;
832*05b00f60SXin Li             }
833*05b00f60SXin Li             break;
834*05b00f60SXin Li 
835*05b00f60SXin Li 	case LMP_OBJ_VERIFY_ID:
836*05b00f60SXin Li 	    switch(lmp_obj_ctype) {
837*05b00f60SXin Li             case LMP_CTYPE_1:
838*05b00f60SXin Li                 if (obj_tlen != 4) {
839*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
840*05b00f60SXin Li                     break;
841*05b00f60SXin Li                 }
842*05b00f60SXin Li                 ND_PRINT("\n\t    Verify ID: %u",
843*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
844*05b00f60SXin Li                 break;
845*05b00f60SXin Li 
846*05b00f60SXin Li             default:
847*05b00f60SXin Li                 hexdump=TRUE;
848*05b00f60SXin Li             }
849*05b00f60SXin Li             break;
850*05b00f60SXin Li 
851*05b00f60SXin Li 	case LMP_OBJ_CHANNEL_STATUS:
852*05b00f60SXin Li             switch(lmp_obj_ctype) {
853*05b00f60SXin Li 	    case LMP_CTYPE_IPV4:
854*05b00f60SXin Li 		offset = 0;
855*05b00f60SXin Li 		/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
856*05b00f60SXin Li 		while (offset+8 <= obj_tlen) {
857*05b00f60SXin Li 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
858*05b00f60SXin Li 			GET_IPADDR_STRING(obj_tptr+offset),
859*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset));
860*05b00f60SXin Li 
861*05b00f60SXin Li 			ND_PRINT("\n\t\t    Active: %s (%u)",
862*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>31) ?
863*05b00f60SXin Li 				"Allocated" : "Non-allocated",
864*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>31));
865*05b00f60SXin Li 
866*05b00f60SXin Li 			ND_PRINT("\n\t\t    Direction: %s (%u)",
867*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1 ?
868*05b00f60SXin Li 				"Transmit" : "Receive",
869*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1);
870*05b00f60SXin Li 
871*05b00f60SXin Li 			ND_PRINT("\n\t\t    Channel Status: %s (%u)",
872*05b00f60SXin Li 					tok2str(lmp_obj_channel_status_values,
873*05b00f60SXin Li 					"Unknown",
874*05b00f60SXin Li 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF),
875*05b00f60SXin Li 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF);
876*05b00f60SXin Li 			offset+=8;
877*05b00f60SXin Li 		}
878*05b00f60SXin Li                 break;
879*05b00f60SXin Li 
880*05b00f60SXin Li 	    case LMP_CTYPE_IPV6:
881*05b00f60SXin Li 		offset = 0;
882*05b00f60SXin Li 		/* Decode pairs: <Interface_ID (16 bytes), Channel_status (4 bytes)> */
883*05b00f60SXin Li 		while (offset+20 <= obj_tlen) {
884*05b00f60SXin Li 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
885*05b00f60SXin Li 			GET_IP6ADDR_STRING(obj_tptr+offset),
886*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset));
887*05b00f60SXin Li 
888*05b00f60SXin Li 			ND_PRINT("\n\t\t    Active: %s (%u)",
889*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 16)>>31) ?
890*05b00f60SXin Li 				"Allocated" : "Non-allocated",
891*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 16)>>31));
892*05b00f60SXin Li 
893*05b00f60SXin Li 			ND_PRINT("\n\t\t    Direction: %s (%u)",
894*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 16)>>30)&0x1 ?
895*05b00f60SXin Li 				"Transmit" : "Receive",
896*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 16)>>30)&0x1);
897*05b00f60SXin Li 
898*05b00f60SXin Li 			ND_PRINT("\n\t\t    Channel Status: %s (%u)",
899*05b00f60SXin Li 					tok2str(lmp_obj_channel_status_values,
900*05b00f60SXin Li 					"Unknown",
901*05b00f60SXin Li 					GET_BE_U_4(obj_tptr + offset + 16)&0x3FFFFFF),
902*05b00f60SXin Li 					GET_BE_U_4(obj_tptr + offset + 16)&0x3FFFFFF);
903*05b00f60SXin Li 			offset+=20;
904*05b00f60SXin Li 		}
905*05b00f60SXin Li                 break;
906*05b00f60SXin Li 
907*05b00f60SXin Li 	    case LMP_CTYPE_UNMD:
908*05b00f60SXin Li 		offset = 0;
909*05b00f60SXin Li 		/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
910*05b00f60SXin Li 		while (offset+8 <= obj_tlen) {
911*05b00f60SXin Li 			ND_PRINT("\n\t    Interface ID: %u (0x%08x)",
912*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset),
913*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset));
914*05b00f60SXin Li 
915*05b00f60SXin Li 			ND_PRINT("\n\t\t    Active: %s (%u)",
916*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>31) ?
917*05b00f60SXin Li 				"Allocated" : "Non-allocated",
918*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>31));
919*05b00f60SXin Li 
920*05b00f60SXin Li 			ND_PRINT("\n\t\t    Direction: %s (%u)",
921*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1 ?
922*05b00f60SXin Li 				"Transmit" : "Receive",
923*05b00f60SXin Li 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1);
924*05b00f60SXin Li 
925*05b00f60SXin Li 			ND_PRINT("\n\t\t    Channel Status: %s (%u)",
926*05b00f60SXin Li 					tok2str(lmp_obj_channel_status_values,
927*05b00f60SXin Li 					"Unknown",
928*05b00f60SXin Li 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF),
929*05b00f60SXin Li 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF);
930*05b00f60SXin Li 			offset+=8;
931*05b00f60SXin Li 		}
932*05b00f60SXin Li                 break;
933*05b00f60SXin Li 
934*05b00f60SXin Li             default:
935*05b00f60SXin Li                 hexdump=TRUE;
936*05b00f60SXin Li             }
937*05b00f60SXin Li             break;
938*05b00f60SXin Li 
939*05b00f60SXin Li 	case LMP_OBJ_CHANNEL_STATUS_REQ:
940*05b00f60SXin Li             switch(lmp_obj_ctype) {
941*05b00f60SXin Li 	    case LMP_CTYPE_IPV4:
942*05b00f60SXin Li 		offset = 0;
943*05b00f60SXin Li 		while (offset+4 <= obj_tlen) {
944*05b00f60SXin Li 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
945*05b00f60SXin Li 			GET_IPADDR_STRING(obj_tptr+offset),
946*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset));
947*05b00f60SXin Li 			offset+=4;
948*05b00f60SXin Li 		}
949*05b00f60SXin Li                 break;
950*05b00f60SXin Li 
951*05b00f60SXin Li 	    case LMP_CTYPE_IPV6:
952*05b00f60SXin Li 		offset = 0;
953*05b00f60SXin Li 		while (offset+16 <= obj_tlen) {
954*05b00f60SXin Li 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
955*05b00f60SXin Li 			GET_IP6ADDR_STRING(obj_tptr+offset),
956*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset));
957*05b00f60SXin Li 			offset+=16;
958*05b00f60SXin Li 		}
959*05b00f60SXin Li                 break;
960*05b00f60SXin Li 
961*05b00f60SXin Li 	    case LMP_CTYPE_UNMD:
962*05b00f60SXin Li 		offset = 0;
963*05b00f60SXin Li 		while (offset+4 <= obj_tlen) {
964*05b00f60SXin Li 			ND_PRINT("\n\t    Interface ID: %u (0x%08x)",
965*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset),
966*05b00f60SXin Li 			GET_BE_U_4(obj_tptr + offset));
967*05b00f60SXin Li 			offset+=4;
968*05b00f60SXin Li 		}
969*05b00f60SXin Li                 break;
970*05b00f60SXin Li 
971*05b00f60SXin Li 	    default:
972*05b00f60SXin Li                 hexdump=TRUE;
973*05b00f60SXin Li             }
974*05b00f60SXin Li             break;
975*05b00f60SXin Li 
976*05b00f60SXin Li         case LMP_OBJ_ERROR_CODE:
977*05b00f60SXin Li 	    switch(lmp_obj_ctype) {
978*05b00f60SXin Li             case LMP_CTYPE_BEGIN_VERIFY_ERROR:
979*05b00f60SXin Li                 if (obj_tlen != 4) {
980*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
981*05b00f60SXin Li                     break;
982*05b00f60SXin Li                 }
983*05b00f60SXin Li 		ND_PRINT("\n\t    Error Code: %s",
984*05b00f60SXin Li 		bittok2str(lmp_obj_begin_verify_error_values,
985*05b00f60SXin Li 			"none",
986*05b00f60SXin Li 			GET_BE_U_4(obj_tptr)));
987*05b00f60SXin Li                 break;
988*05b00f60SXin Li 
989*05b00f60SXin Li             case LMP_CTYPE_LINK_SUMMARY_ERROR:
990*05b00f60SXin Li                 if (obj_tlen != 4) {
991*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
992*05b00f60SXin Li                     break;
993*05b00f60SXin Li                 }
994*05b00f60SXin Li 		ND_PRINT("\n\t    Error Code: %s",
995*05b00f60SXin Li 		bittok2str(lmp_obj_link_summary_error_values,
996*05b00f60SXin Li 			"none",
997*05b00f60SXin Li 			GET_BE_U_4(obj_tptr)));
998*05b00f60SXin Li                 break;
999*05b00f60SXin Li             default:
1000*05b00f60SXin Li                 hexdump=TRUE;
1001*05b00f60SXin Li             }
1002*05b00f60SXin Li             break;
1003*05b00f60SXin Li 
1004*05b00f60SXin Li 	case LMP_OBJ_SERVICE_CONFIG:
1005*05b00f60SXin Li 	    switch (lmp_obj_ctype) {
1006*05b00f60SXin Li 	    case LMP_CTYPE_SERVICE_CONFIG_SP:
1007*05b00f60SXin Li                 if (obj_tlen != 4) {
1008*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
1009*05b00f60SXin Li                     break;
1010*05b00f60SXin Li                 }
1011*05b00f60SXin Li 		ND_PRINT("\n\t Flags: %s",
1012*05b00f60SXin Li 		       bittok2str(lmp_obj_service_config_sp_flag_values,
1013*05b00f60SXin Li 				  "none",
1014*05b00f60SXin Li 				  GET_U_1(obj_tptr)));
1015*05b00f60SXin Li 
1016*05b00f60SXin Li 		ND_PRINT("\n\t  UNI Version: %u",
1017*05b00f60SXin Li 		       GET_U_1(obj_tptr + 1));
1018*05b00f60SXin Li 
1019*05b00f60SXin Li 		break;
1020*05b00f60SXin Li 
1021*05b00f60SXin Li             case LMP_CTYPE_SERVICE_CONFIG_CPSA:
1022*05b00f60SXin Li                 if (obj_tlen != 16) {
1023*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
1024*05b00f60SXin Li                     break;
1025*05b00f60SXin Li                 }
1026*05b00f60SXin Li 
1027*05b00f60SXin Li 		link_type = GET_U_1(obj_tptr);
1028*05b00f60SXin Li 
1029*05b00f60SXin Li 		ND_PRINT("\n\t Link Type: %s (%u)",
1030*05b00f60SXin Li 		       tok2str(lmp_sd_service_config_cpsa_link_type_values,
1031*05b00f60SXin Li 			       "Unknown", link_type),
1032*05b00f60SXin Li 		       link_type);
1033*05b00f60SXin Li 
1034*05b00f60SXin Li 		switch (link_type) {
1035*05b00f60SXin Li 		case LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH:
1036*05b00f60SXin Li 		    ND_PRINT("\n\t Signal Type: %s (%u)",
1037*05b00f60SXin Li 			   tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,
1038*05b00f60SXin Li 				   "Unknown",
1039*05b00f60SXin Li 				   GET_U_1(obj_tptr + 1)),
1040*05b00f60SXin Li 			   GET_U_1(obj_tptr + 1));
1041*05b00f60SXin Li 		    break;
1042*05b00f60SXin Li 
1043*05b00f60SXin Li 		case LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET:
1044*05b00f60SXin Li 		    ND_PRINT("\n\t Signal Type: %s (%u)",
1045*05b00f60SXin Li 			   tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,
1046*05b00f60SXin Li 				   "Unknown",
1047*05b00f60SXin Li 				   GET_U_1(obj_tptr + 1)),
1048*05b00f60SXin Li 			   GET_U_1(obj_tptr + 1));
1049*05b00f60SXin Li 		    break;
1050*05b00f60SXin Li 		}
1051*05b00f60SXin Li 
1052*05b00f60SXin Li 		ND_PRINT("\n\t Transparency: %s",
1053*05b00f60SXin Li 		       bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,
1054*05b00f60SXin Li 				  "none",
1055*05b00f60SXin Li 				  GET_U_1(obj_tptr + 2)));
1056*05b00f60SXin Li 
1057*05b00f60SXin Li 		ND_PRINT("\n\t Contiguous Concatenation Types: %s",
1058*05b00f60SXin Li 		       bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,
1059*05b00f60SXin Li 				  "none",
1060*05b00f60SXin Li 				  GET_U_1(obj_tptr + 3)));
1061*05b00f60SXin Li 
1062*05b00f60SXin Li 		ND_PRINT("\n\t Minimum NCC: %u",
1063*05b00f60SXin Li 		       GET_BE_U_2(obj_tptr + 4));
1064*05b00f60SXin Li 
1065*05b00f60SXin Li 		ND_PRINT("\n\t Maximum NCC: %u",
1066*05b00f60SXin Li 		       GET_BE_U_2(obj_tptr + 6));
1067*05b00f60SXin Li 
1068*05b00f60SXin Li 		ND_PRINT("\n\t Minimum NVC:%u",
1069*05b00f60SXin Li 		       GET_BE_U_2(obj_tptr + 8));
1070*05b00f60SXin Li 
1071*05b00f60SXin Li 		ND_PRINT("\n\t Maximum NVC:%u",
1072*05b00f60SXin Li 		       GET_BE_U_2(obj_tptr + 10));
1073*05b00f60SXin Li 
1074*05b00f60SXin Li 		ND_PRINT("\n\t    Local Interface ID: %s (0x%08x)",
1075*05b00f60SXin Li 		       GET_IPADDR_STRING(obj_tptr+12),
1076*05b00f60SXin Li 		       GET_BE_U_4(obj_tptr + 12));
1077*05b00f60SXin Li 
1078*05b00f60SXin Li 		break;
1079*05b00f60SXin Li 
1080*05b00f60SXin Li 	    case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:
1081*05b00f60SXin Li                 if (obj_tlen != 8) {
1082*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
1083*05b00f60SXin Li                     break;
1084*05b00f60SXin Li                 }
1085*05b00f60SXin Li 
1086*05b00f60SXin Li 		ND_PRINT("\n\t Transparency Flags: %s",
1087*05b00f60SXin Li 		       bittok2str(
1088*05b00f60SXin Li 			   lmp_obj_service_config_nsa_transparency_flag_values,
1089*05b00f60SXin Li 			   "none",
1090*05b00f60SXin Li 			   GET_BE_U_4(obj_tptr)));
1091*05b00f60SXin Li 
1092*05b00f60SXin Li 		ND_PRINT("\n\t TCM Monitoring Flags: %s",
1093*05b00f60SXin Li 		       bittok2str(
1094*05b00f60SXin Li 			   lmp_obj_service_config_nsa_tcm_flag_values,
1095*05b00f60SXin Li 			   "none",
1096*05b00f60SXin Li 			   GET_U_1(obj_tptr + 7)));
1097*05b00f60SXin Li 
1098*05b00f60SXin Li 		break;
1099*05b00f60SXin Li 
1100*05b00f60SXin Li 	    case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:
1101*05b00f60SXin Li                 if (obj_tlen != 4) {
1102*05b00f60SXin Li                     ND_PRINT(" (not correct for object)");
1103*05b00f60SXin Li                     break;
1104*05b00f60SXin Li                 }
1105*05b00f60SXin Li 
1106*05b00f60SXin Li 		ND_PRINT("\n\t Diversity: Flags: %s",
1107*05b00f60SXin Li 		       bittok2str(
1108*05b00f60SXin Li 			   lmp_obj_service_config_nsa_network_diversity_flag_values,
1109*05b00f60SXin Li 			   "none",
1110*05b00f60SXin Li 			   GET_U_1(obj_tptr + 3)));
1111*05b00f60SXin Li 		break;
1112*05b00f60SXin Li 
1113*05b00f60SXin Li 	    default:
1114*05b00f60SXin Li 		hexdump = TRUE;
1115*05b00f60SXin Li 	    }
1116*05b00f60SXin Li 
1117*05b00f60SXin Li 	break;
1118*05b00f60SXin Li 
1119*05b00f60SXin Li         default:
1120*05b00f60SXin Li             if (ndo->ndo_vflag <= 1)
1121*05b00f60SXin Li                 print_unknown_data(ndo,obj_tptr,"\n\t    ",obj_tlen);
1122*05b00f60SXin Li             break;
1123*05b00f60SXin Li         }
1124*05b00f60SXin Li         /* do we want to see an additionally hexdump ? */
1125*05b00f60SXin Li         if (ndo->ndo_vflag > 1 || hexdump==TRUE)
1126*05b00f60SXin Li             print_unknown_data(ndo,tptr+sizeof(struct lmp_object_header),"\n\t    ",
1127*05b00f60SXin Li                                lmp_obj_len-sizeof(struct lmp_object_header));
1128*05b00f60SXin Li 
1129*05b00f60SXin Li         if (tlen < lmp_obj_len) {
1130*05b00f60SXin Li             ND_PRINT(" [remaining objects length %u < %u]", tlen, lmp_obj_len);
1131*05b00f60SXin Li             nd_print_invalid(ndo);
1132*05b00f60SXin Li             break;
1133*05b00f60SXin Li         }
1134*05b00f60SXin Li         tptr+=lmp_obj_len;
1135*05b00f60SXin Li         tlen-=lmp_obj_len;
1136*05b00f60SXin Li     }
1137*05b00f60SXin Li }
1138