xref: /netbsd-src/external/bsd/tcpdump/dist/print-lmp.c (revision 26ba0b503b498a5194a71ac319838b7f5497f3fe)
10f74e101Schristos /*
20f74e101Schristos  * Redistribution and use in source and binary forms, with or without
30f74e101Schristos  * modification, are permitted provided that: (1) source code
40f74e101Schristos  * distributions retain the above copyright notice and this paragraph
50f74e101Schristos  * in its entirety, and (2) distributions including binary code include
60f74e101Schristos  * the above copyright notice and this paragraph in its entirety in
70f74e101Schristos  * the documentation or other materials provided with the distribution.
80f74e101Schristos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
90f74e101Schristos  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
100f74e101Schristos  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
110f74e101Schristos  * FOR A PARTICULAR PURPOSE.
120f74e101Schristos  *
1372c96ff3Schristos  * Original code by Hannes Gredler (hannes@gredler.at)
1472c96ff3Schristos  * Support for LMP service discovery extensions (defined by OIF UNI 1.0)
1572c96ff3Schristos  * added by Manu Pathak (mapathak@cisco.com), May 2005
160f74e101Schristos  */
170f74e101Schristos 
18dc860a36Sspz /* \summary: Link Management Protocol (LMP) printer */
19dc860a36Sspz 
20dc860a36Sspz /* specification: RFC 4204 */
21c74ad251Schristos /* OIF UNI 1.0: https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf */
22dc860a36Sspz 
2311b3aaa1Schristos #include <sys/cdefs.h>
240f74e101Schristos #ifndef lint
25*26ba0b50Schristos __RCSID("$NetBSD: print-lmp.c,v 1.13 2024/09/02 16:15:32 christos Exp $");
260f74e101Schristos #endif
270f74e101Schristos 
28c74ad251Schristos #include <config.h>
290f74e101Schristos 
30c74ad251Schristos #include "netdissect-stdinc.h"
310f74e101Schristos 
32c74ad251Schristos #define ND_LONGJMP_FROM_TCHECK
33fdccd7e4Schristos #include "netdissect.h"
340f74e101Schristos #include "extract.h"
350f74e101Schristos #include "addrtoname.h"
360f74e101Schristos #include "gmpls.h"
370f74e101Schristos 
38817e9a7eSchristos 
390f74e101Schristos /*
400f74e101Schristos  * LMP common header
410f74e101Schristos  *
420f74e101Schristos  *  0                   1                   2                   3
430f74e101Schristos  *  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
440f74e101Schristos  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
450f74e101Schristos  * | Vers  |      (Reserved)       |    Flags      |    Msg Type   |
460f74e101Schristos  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
470f74e101Schristos  * |          LMP Length           |          (Reserved)           |
480f74e101Schristos  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
490f74e101Schristos  */
500f74e101Schristos 
510f74e101Schristos struct lmp_common_header {
52c74ad251Schristos     nd_uint16_t version_res;
53c74ad251Schristos     nd_uint8_t  flags;
54c74ad251Schristos     nd_uint8_t  msg_type;
55c74ad251Schristos     nd_uint16_t length;
56c74ad251Schristos     nd_byte     reserved[2];
570f74e101Schristos };
580f74e101Schristos 
590f74e101Schristos #define LMP_VERSION            1
60c74ad251Schristos #define	LMP_EXTRACT_VERSION(x) (((x)&0xf000)>>12)
610f74e101Schristos 
620f74e101Schristos static const struct tok lmp_header_flag_values[] = {
630f74e101Schristos     { 0x01, "Control Channel Down"},
640f74e101Schristos     { 0x02, "LMP restart"},
650f74e101Schristos     { 0, NULL}
660f74e101Schristos };
670f74e101Schristos 
680f74e101Schristos static const struct tok lmp_obj_te_link_flag_values[] = {
690f74e101Schristos     { 0x01, "Fault Management Supported"},
700f74e101Schristos     { 0x02, "Link Verification Supported"},
710f74e101Schristos     { 0, NULL}
720f74e101Schristos };
730f74e101Schristos 
740f74e101Schristos static const struct tok lmp_obj_data_link_flag_values[] = {
750f74e101Schristos     { 0x01, "Data Link Port"},
760f74e101Schristos     { 0x02, "Allocated for user traffic"},
770f74e101Schristos     { 0x04, "Failed link"},
780f74e101Schristos     { 0, NULL}
790f74e101Schristos };
800f74e101Schristos 
810f74e101Schristos static const struct tok lmp_obj_channel_status_values[] = {
820f74e101Schristos     { 1, "Signal Okay"},
830f74e101Schristos     { 2, "Signal Degraded"},
840f74e101Schristos     { 3, "Signal Fail"},
850f74e101Schristos     { 0, NULL}
860f74e101Schristos };
870f74e101Schristos 
880f74e101Schristos static const struct tok lmp_obj_begin_verify_flag_values[] = {
890f74e101Schristos     { 0x0001, "Verify all links"},
900f74e101Schristos     { 0x0002, "Data link type"},
910f74e101Schristos     { 0, NULL}
920f74e101Schristos };
930f74e101Schristos 
940f74e101Schristos static const struct tok lmp_obj_begin_verify_error_values[] = {
950f74e101Schristos     { 0x01, "Link Verification Procedure Not supported"},
960f74e101Schristos     { 0x02, "Unwilling to verify"},
970f74e101Schristos     { 0x04, "Unsupported verification transport mechanism"},
980f74e101Schristos     { 0x08, "Link-Id configuration error"},
990f74e101Schristos     { 0x10, "Unknown object c-type"},
1000f74e101Schristos     { 0, NULL}
1010f74e101Schristos };
1020f74e101Schristos 
1030f74e101Schristos static const struct tok lmp_obj_link_summary_error_values[] = {
1040f74e101Schristos     { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"},
1050f74e101Schristos     { 0x02, "Renegotiate LINK-SUMMARY parameters"},
1060f74e101Schristos     { 0x04, "Invalid TE-LINK Object"},
1070f74e101Schristos     { 0x08, "Invalid DATA-LINK Object"},
1080f74e101Schristos     { 0x10, "Unknown TE-LINK Object c-type"},
1090f74e101Schristos     { 0x20, "Unknown DATA-LINK Object c-type"},
1100f74e101Schristos     { 0, NULL}
1110f74e101Schristos };
1120f74e101Schristos 
1130f74e101Schristos /* Service Config Supported Protocols Flags */
1140f74e101Schristos static const struct tok lmp_obj_service_config_sp_flag_values[] = {
1150f74e101Schristos     { 0x01, "RSVP Supported"},
1160f74e101Schristos     { 0x02, "LDP Supported"},
1170f74e101Schristos     { 0, NULL}
1180f74e101Schristos };
1190f74e101Schristos 
1200f74e101Schristos /* Service Config Client Port Service Attribute Transparency Flags */
1210f74e101Schristos static const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = {
1220f74e101Schristos     { 0x01, "Path/VC Overhead Transparency Supported"},
1230f74e101Schristos     { 0x02, "Line/MS Overhead Transparency Supported"},
1240f74e101Schristos     { 0x04, "Section/RS Overhead Transparency Supported"},
1250f74e101Schristos     { 0, NULL}
1260f74e101Schristos };
1270f74e101Schristos 
1280f74e101Schristos /* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */
1290f74e101Schristos static const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = {
1300f74e101Schristos     { 0x01, "Contiguous Concatenation Types Supported"},
1310f74e101Schristos     { 0, NULL}
1320f74e101Schristos };
1330f74e101Schristos 
1340f74e101Schristos /* Service Config Network Service Attributes Transparency Flags */
1350f74e101Schristos static const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = {
1360f74e101Schristos     { 0x01, "Standard SOH/RSOH Transparency Supported"},
1370f74e101Schristos     { 0x02, "Standard LOH/MSOH Transparency Supported"},
1380f74e101Schristos     { 0, NULL}
1390f74e101Schristos };
1400f74e101Schristos 
1410f74e101Schristos /* Service Config Network Service Attributes TCM Monitoring Flags */
1420f74e101Schristos static const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = {
1430f74e101Schristos     { 0x01, "Transparent Tandem Connection Monitoring Supported"},
1440f74e101Schristos     { 0, NULL}
1450f74e101Schristos };
1460f74e101Schristos 
1470f74e101Schristos /* Network Service Attributes Network Diversity Flags */
1480f74e101Schristos static const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = {
1490f74e101Schristos     { 0x01, "Node Diversity Supported"},
1500f74e101Schristos     { 0x02, "Link Diversity Supported"},
1510f74e101Schristos     { 0x04, "SRLG Diversity Supported"},
1520f74e101Schristos     { 0, NULL}
1530f74e101Schristos };
1540f74e101Schristos 
1550f74e101Schristos #define	LMP_MSGTYPE_CONFIG                 1
1560f74e101Schristos #define	LMP_MSGTYPE_CONFIG_ACK             2
1570f74e101Schristos #define	LMP_MSGTYPE_CONFIG_NACK            3
1580f74e101Schristos #define	LMP_MSGTYPE_HELLO                  4
1590f74e101Schristos #define	LMP_MSGTYPE_VERIFY_BEGIN           5
1600f74e101Schristos #define	LMP_MSGTYPE_VERIFY_BEGIN_ACK       6
1610f74e101Schristos #define	LMP_MSGTYPE_VERIFY_BEGIN_NACK      7
1620f74e101Schristos #define LMP_MSGTYPE_VERIFY_END             8
1630f74e101Schristos #define LMP_MSGTYPE_VERIFY_END_ACK         9
1640f74e101Schristos #define LMP_MSGTYPE_TEST                  10
1650f74e101Schristos #define LMP_MSGTYPE_TEST_STATUS_SUCCESS   11
1660f74e101Schristos #define	LMP_MSGTYPE_TEST_STATUS_FAILURE   12
1670f74e101Schristos #define	LMP_MSGTYPE_TEST_STATUS_ACK       13
1680f74e101Schristos #define	LMP_MSGTYPE_LINK_SUMMARY          14
1690f74e101Schristos #define	LMP_MSGTYPE_LINK_SUMMARY_ACK      15
1700f74e101Schristos #define	LMP_MSGTYPE_LINK_SUMMARY_NACK     16
1710f74e101Schristos #define	LMP_MSGTYPE_CHANNEL_STATUS        17
1720f74e101Schristos #define	LMP_MSGTYPE_CHANNEL_STATUS_ACK    18
1730f74e101Schristos #define	LMP_MSGTYPE_CHANNEL_STATUS_REQ    19
1740f74e101Schristos #define	LMP_MSGTYPE_CHANNEL_STATUS_RESP   20
1750f74e101Schristos /* LMP Service Discovery message types defined by UNI 1.0 */
1760f74e101Schristos #define LMP_MSGTYPE_SERVICE_CONFIG        50
1770f74e101Schristos #define LMP_MSGTYPE_SERVICE_CONFIG_ACK    51
1780f74e101Schristos #define LMP_MSGTYPE_SERVICE_CONFIG_NACK   52
1790f74e101Schristos 
1800f74e101Schristos static const struct tok lmp_msg_type_values[] = {
1810f74e101Schristos     { LMP_MSGTYPE_CONFIG, "Config"},
1820f74e101Schristos     { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"},
1830f74e101Schristos     { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"},
1840f74e101Schristos     { LMP_MSGTYPE_HELLO, "Hello"},
1850f74e101Schristos     { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"},
1860f74e101Schristos     { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"},
1870f74e101Schristos     { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"},
1880f74e101Schristos     { LMP_MSGTYPE_VERIFY_END, "End Verify"},
1890f74e101Schristos     { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"},
1900f74e101Schristos     { LMP_MSGTYPE_TEST, "Test"},
1910f74e101Schristos     { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"},
1920f74e101Schristos     { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"},
1930f74e101Schristos     { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"},
1940f74e101Schristos     { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"},
1950f74e101Schristos     { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"},
1960f74e101Schristos     { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"},
1970f74e101Schristos     { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"},
1980f74e101Schristos     { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"},
1990f74e101Schristos     { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"},
2000f74e101Schristos     { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"},
2010f74e101Schristos     { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"},
2020f74e101Schristos     { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"},
2030f74e101Schristos     { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"},
2040f74e101Schristos     { 0, NULL}
2050f74e101Schristos };
2060f74e101Schristos 
2070f74e101Schristos /*
2080f74e101Schristos  * LMP object header
2090f74e101Schristos  *
2100f74e101Schristos  *  0                   1                   2                   3
2110f74e101Schristos  *  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
2120f74e101Schristos  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2130f74e101Schristos  * |N|   C-Type    |     Class     |            Length             |
2140f74e101Schristos  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2150f74e101Schristos  * |                                                               |
2160f74e101Schristos  * //                       (object contents)                     //
2170f74e101Schristos  * |                                                               |
2180f74e101Schristos  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2190f74e101Schristos  */
2200f74e101Schristos 
2210f74e101Schristos struct lmp_object_header {
222c74ad251Schristos     nd_uint8_t  ctype;
223c74ad251Schristos     nd_uint8_t  class_num;
224c74ad251Schristos     nd_uint16_t length;
2250f74e101Schristos };
2260f74e101Schristos 
2270f74e101Schristos #define	LMP_OBJ_CC_ID                 1
2280f74e101Schristos #define	LMP_OBJ_NODE_ID               2
2290f74e101Schristos #define	LMP_OBJ_LINK_ID               3
2300f74e101Schristos #define	LMP_OBJ_INTERFACE_ID          4
2310f74e101Schristos #define	LMP_OBJ_MESSAGE_ID            5
2320f74e101Schristos #define	LMP_OBJ_CONFIG                6
2330f74e101Schristos #define	LMP_OBJ_HELLO                 7
2340f74e101Schristos #define	LMP_OBJ_VERIFY_BEGIN          8
2350f74e101Schristos #define LMP_OBJ_VERIFY_BEGIN_ACK      9
2360f74e101Schristos #define LMP_OBJ_VERIFY_ID            10
2370f74e101Schristos #define LMP_OBJ_TE_LINK              11
2380f74e101Schristos #define LMP_OBJ_DATA_LINK            12
2390f74e101Schristos #define LMP_OBJ_CHANNEL_STATUS       13
2400f74e101Schristos #define LMP_OBJ_CHANNEL_STATUS_REQ   14
2410f74e101Schristos #define LMP_OBJ_ERROR_CODE           20
2420f74e101Schristos 
2430f74e101Schristos #define LMP_OBJ_SERVICE_CONFIG       51 /* defined in UNI 1.0 */
2440f74e101Schristos 
2450f74e101Schristos static const struct tok lmp_obj_values[] = {
2460f74e101Schristos     { LMP_OBJ_CC_ID, "Control Channel ID" },
2470f74e101Schristos     { LMP_OBJ_NODE_ID, "Node ID" },
2480f74e101Schristos     { LMP_OBJ_LINK_ID, "Link ID" },
2490f74e101Schristos     { LMP_OBJ_INTERFACE_ID, "Interface ID" },
2500f74e101Schristos     { LMP_OBJ_MESSAGE_ID, "Message ID" },
2510f74e101Schristos     { LMP_OBJ_CONFIG, "Configuration" },
2520f74e101Schristos     { LMP_OBJ_HELLO, "Hello" },
2530f74e101Schristos     { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" },
2540f74e101Schristos     { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" },
2550f74e101Schristos     { LMP_OBJ_VERIFY_ID, "Verify ID" },
2560f74e101Schristos     { LMP_OBJ_TE_LINK, "TE Link" },
2570f74e101Schristos     { LMP_OBJ_DATA_LINK, "Data Link" },
2580f74e101Schristos     { LMP_OBJ_CHANNEL_STATUS, "Channel Status" },
2590f74e101Schristos     { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" },
2600f74e101Schristos     { LMP_OBJ_ERROR_CODE, "Error Code" },
2610f74e101Schristos     { LMP_OBJ_SERVICE_CONFIG, "Service Config" },
2620f74e101Schristos 
2630f74e101Schristos     { 0, NULL}
2640f74e101Schristos };
2650f74e101Schristos 
2660f74e101Schristos #define INT_SWITCHING_TYPE_SUBOBJ 1
2670f74e101Schristos #define WAVELENGTH_SUBOBJ         2
2680f74e101Schristos 
2690f74e101Schristos static const struct tok lmp_data_link_subobj[] = {
2700f74e101Schristos     { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" },
2710f74e101Schristos     { WAVELENGTH_SUBOBJ        , "Wavelength" },
2720f74e101Schristos     { 0, NULL}
2730f74e101Schristos };
2740f74e101Schristos 
2750f74e101Schristos #define	LMP_CTYPE_IPV4       1
2760f74e101Schristos #define	LMP_CTYPE_IPV6       2
2770f74e101Schristos 
2780f74e101Schristos #define	LMP_CTYPE_LOC        1
2790f74e101Schristos #define	LMP_CTYPE_RMT        2
2800f74e101Schristos #define	LMP_CTYPE_UNMD       3
2810f74e101Schristos 
2820f74e101Schristos #define	LMP_CTYPE_IPV4_LOC   1
2830f74e101Schristos #define	LMP_CTYPE_IPV4_RMT   2
2840f74e101Schristos #define	LMP_CTYPE_IPV6_LOC   3
2850f74e101Schristos #define	LMP_CTYPE_IPV6_RMT   4
2860f74e101Schristos #define	LMP_CTYPE_UNMD_LOC   5
2870f74e101Schristos #define	LMP_CTYPE_UNMD_RMT   6
2880f74e101Schristos 
2890f74e101Schristos #define	LMP_CTYPE_1          1
2900f74e101Schristos #define	LMP_CTYPE_2          2
2910f74e101Schristos 
2920f74e101Schristos #define LMP_CTYPE_HELLO_CONFIG  1
2930f74e101Schristos #define LMP_CTYPE_HELLO         1
2940f74e101Schristos 
2950f74e101Schristos #define LMP_CTYPE_BEGIN_VERIFY_ERROR 1
2960f74e101Schristos #define LMP_CTYPE_LINK_SUMMARY_ERROR 2
2970f74e101Schristos 
2980f74e101Schristos /* C-Types for Service Config Object */
2990f74e101Schristos #define LMP_CTYPE_SERVICE_CONFIG_SP                   1
3000f74e101Schristos #define LMP_CTYPE_SERVICE_CONFIG_CPSA                 2
3010f74e101Schristos #define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM     3
3020f74e101Schristos #define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY    4
3030f74e101Schristos 
3040f74e101Schristos /*
3050f74e101Schristos  * Different link types allowed in the Client Port Service Attributes
3060f74e101Schristos  * subobject defined for LMP Service Discovery in the UNI 1.0 spec
3070f74e101Schristos  */
3080f74e101Schristos #define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH     5 /* UNI 1.0 Sec 9.4.2 */
3090f74e101Schristos #define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET   6 /* UNI 1.0 Sec 9.4.2 */
3100f74e101Schristos 
3110f74e101Schristos /*
3120f74e101Schristos  * the ctypes are not globally unique so for
3130f74e101Schristos  * translating it to strings we build a table based
3140f74e101Schristos  * on objects offsetted by the ctype
3150f74e101Schristos  */
3160f74e101Schristos 
3170f74e101Schristos static const struct tok lmp_ctype_values[] = {
3180f74e101Schristos     { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" },
3190f74e101Schristos     { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" },
3200f74e101Schristos     { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" },
3210f74e101Schristos     { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" },
3220f74e101Schristos     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
3230f74e101Schristos     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
3240f74e101Schristos     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
3250f74e101Schristos     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
3260f74e101Schristos     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
3270f74e101Schristos     { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
3280f74e101Schristos     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
3290f74e101Schristos     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
3300f74e101Schristos     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
3310f74e101Schristos     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
3320f74e101Schristos     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
3330f74e101Schristos     { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
3340f74e101Schristos     { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" },
3350f74e101Schristos     { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" },
3360f74e101Schristos     { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" },
3370f74e101Schristos     { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" },
3380f74e101Schristos     { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" },
3390f74e101Schristos     { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" },
3400f74e101Schristos     { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" },
3410f74e101Schristos     { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" },
3420f74e101Schristos     { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" },
3430f74e101Schristos     { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
3440f74e101Schristos     { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" },
3450f74e101Schristos     { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" },
3460f74e101Schristos     { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
3470f74e101Schristos     { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" },
3480f74e101Schristos     { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" },
3490f74e101Schristos     { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" },
3500f74e101Schristos     { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" },
3510f74e101Schristos     { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" },
3520f74e101Schristos     { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" },
3530f74e101Schristos     { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" },
3540f74e101Schristos     { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" },
3550f74e101Schristos     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" },
3560f74e101Schristos     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" },
3570f74e101Schristos     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" },
3580f74e101Schristos     { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" },
3590f74e101Schristos     { 0, NULL}
3600f74e101Schristos };
3610f74e101Schristos 
36272c96ff3Schristos static int
36372c96ff3Schristos lmp_print_data_link_subobjs(netdissect_options *ndo, const u_char *obj_tptr,
36472c96ff3Schristos                             int total_subobj_len, int offset)
36572c96ff3Schristos {
36672c96ff3Schristos     int hexdump = FALSE;
36772c96ff3Schristos     int subobj_type, subobj_len;
36872c96ff3Schristos 
36972c96ff3Schristos     union { /* int to float conversion buffer */
37072c96ff3Schristos         float f;
37172c96ff3Schristos         uint32_t i;
37272c96ff3Schristos     } bw;
37372c96ff3Schristos 
37472c96ff3Schristos     while (total_subobj_len > 0 && hexdump == FALSE ) {
375c74ad251Schristos 	subobj_type = GET_U_1(obj_tptr + offset);
376c74ad251Schristos 	subobj_len  = GET_U_1(obj_tptr + offset + 1);
377c74ad251Schristos 	ND_PRINT("\n\t    Subobject, Type: %s (%u), Length: %u",
37872c96ff3Schristos 		tok2str(lmp_data_link_subobj,
37972c96ff3Schristos 			"Unknown",
38072c96ff3Schristos 			subobj_type),
38172c96ff3Schristos 			subobj_type,
382c74ad251Schristos 			subobj_len);
38372c96ff3Schristos 	if (subobj_len < 4) {
384c74ad251Schristos 	    ND_PRINT(" (too short)");
38572c96ff3Schristos 	    break;
38672c96ff3Schristos 	}
38772c96ff3Schristos 	if ((subobj_len % 4) != 0) {
388c74ad251Schristos 	    ND_PRINT(" (not a multiple of 4)");
38972c96ff3Schristos 	    break;
39072c96ff3Schristos 	}
39172c96ff3Schristos 	if (total_subobj_len < subobj_len) {
392c74ad251Schristos 	    ND_PRINT(" (goes past the end of the object)");
39372c96ff3Schristos 	    break;
39472c96ff3Schristos 	}
39572c96ff3Schristos 	switch(subobj_type) {
39672c96ff3Schristos 	case INT_SWITCHING_TYPE_SUBOBJ:
397c74ad251Schristos 	    ND_PRINT("\n\t      Switching Type: %s (%u)",
39872c96ff3Schristos 		tok2str(gmpls_switch_cap_values,
39972c96ff3Schristos 			"Unknown",
400c74ad251Schristos 			GET_U_1(obj_tptr + offset + 2)),
401c74ad251Schristos 		GET_U_1(obj_tptr + offset + 2));
402c74ad251Schristos 	    ND_PRINT("\n\t      Encoding Type: %s (%u)",
40372c96ff3Schristos 		tok2str(gmpls_encoding_values,
40472c96ff3Schristos 			"Unknown",
405c74ad251Schristos 			GET_U_1(obj_tptr + offset + 3)),
406c74ad251Schristos 		GET_U_1(obj_tptr + offset + 3));
407c74ad251Schristos 	    bw.i = GET_BE_U_4(obj_tptr + offset + 4);
408c74ad251Schristos 	    ND_PRINT("\n\t      Min Reservable Bandwidth: %.3f Mbps",
409c74ad251Schristos                 bw.f*8/1000000);
410c74ad251Schristos 	    bw.i = GET_BE_U_4(obj_tptr + offset + 8);
411c74ad251Schristos 	    ND_PRINT("\n\t      Max Reservable Bandwidth: %.3f Mbps",
412c74ad251Schristos                 bw.f*8/1000000);
41372c96ff3Schristos 	    break;
41472c96ff3Schristos 	case WAVELENGTH_SUBOBJ:
415c74ad251Schristos 	    ND_PRINT("\n\t      Wavelength: %u",
416c74ad251Schristos 		GET_BE_U_4(obj_tptr + offset + 4));
41772c96ff3Schristos 	    break;
41872c96ff3Schristos 	default:
41972c96ff3Schristos 	    /* Any Unknown Subobject ==> Exit loop */
42072c96ff3Schristos 	    hexdump=TRUE;
42172c96ff3Schristos 	    break;
42272c96ff3Schristos 	}
42372c96ff3Schristos 	total_subobj_len-=subobj_len;
42472c96ff3Schristos 	offset+=subobj_len;
42572c96ff3Schristos     }
42672c96ff3Schristos     return (hexdump);
42772c96ff3Schristos }
42872c96ff3Schristos 
4290f74e101Schristos void
430b3a00663Schristos lmp_print(netdissect_options *ndo,
431c74ad251Schristos           const u_char *pptr, u_int length)
432ba2ff121Schristos {
4330f74e101Schristos     const struct lmp_common_header *lmp_com_header;
4340f74e101Schristos     const u_char *tptr,*obj_tptr;
435c74ad251Schristos     u_int version_res, tlen, lmp_obj_len, lmp_obj_ctype, obj_tlen;
436c74ad251Schristos     int hexdump;
43772c96ff3Schristos     u_int offset;
43872c96ff3Schristos     u_int link_type;
4390f74e101Schristos 
4400f74e101Schristos     union { /* int to float conversion buffer */
4410f74e101Schristos         float f;
442b3a00663Schristos         uint32_t i;
4430f74e101Schristos     } bw;
4440f74e101Schristos 
445c74ad251Schristos     ndo->ndo_protocol = "lmp";
4460f74e101Schristos     tptr=pptr;
4470f74e101Schristos     lmp_com_header = (const struct lmp_common_header *)pptr;
448c74ad251Schristos     ND_TCHECK_SIZE(lmp_com_header);
449c74ad251Schristos 
450c74ad251Schristos     version_res = GET_BE_U_2(lmp_com_header->version_res);
4510f74e101Schristos 
4520f74e101Schristos     /*
4530f74e101Schristos      * Sanity checking of the header.
4540f74e101Schristos      */
455c74ad251Schristos     if (LMP_EXTRACT_VERSION(version_res) != LMP_VERSION) {
456c74ad251Schristos 	ND_PRINT("LMP version %u packet not supported",
457c74ad251Schristos                LMP_EXTRACT_VERSION(version_res));
4580f74e101Schristos 	return;
4590f74e101Schristos     }
4600f74e101Schristos 
4610f74e101Schristos     /* in non-verbose mode just lets print the basic Message Type*/
462b3a00663Schristos     if (ndo->ndo_vflag < 1) {
463c74ad251Schristos         ND_PRINT("LMPv%u %s Message, length: %u",
464c74ad251Schristos                LMP_EXTRACT_VERSION(version_res),
465c74ad251Schristos                tok2str(lmp_msg_type_values, "unknown (%u)",GET_U_1(lmp_com_header->msg_type)),
466c74ad251Schristos                length);
4670f74e101Schristos         return;
4680f74e101Schristos     }
4690f74e101Schristos 
4700f74e101Schristos     /* ok they seem to want to know everything - lets fully decode it */
4710f74e101Schristos 
472c74ad251Schristos     tlen=GET_BE_U_2(lmp_com_header->length);
4730f74e101Schristos 
474c74ad251Schristos     ND_PRINT("\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
475c74ad251Schristos            LMP_EXTRACT_VERSION(version_res),
476c74ad251Schristos            tok2str(lmp_msg_type_values, "unknown, type: %u",GET_U_1(lmp_com_header->msg_type)),
477c74ad251Schristos            bittok2str(lmp_header_flag_values,"none",GET_U_1(lmp_com_header->flags)),
478c74ad251Schristos            tlen);
479c74ad251Schristos     if (tlen < sizeof(struct lmp_common_header)) {
480c74ad251Schristos         ND_PRINT(" (too short)");
48172c96ff3Schristos         return;
48272c96ff3Schristos     }
483c74ad251Schristos     if (tlen > length) {
484c74ad251Schristos         ND_PRINT(" (too long)");
485c74ad251Schristos         tlen = length;
48672c96ff3Schristos     }
4870f74e101Schristos 
488c74ad251Schristos     tptr+=sizeof(struct lmp_common_header);
489c74ad251Schristos     tlen-=sizeof(struct lmp_common_header);
4900f74e101Schristos 
4910f74e101Schristos     while(tlen>0) {
492c74ad251Schristos         const struct lmp_object_header *lmp_obj_header =
493c74ad251Schristos             (const struct lmp_object_header *)tptr;
494c74ad251Schristos         lmp_obj_len=GET_BE_U_2(lmp_obj_header->length);
495c74ad251Schristos         lmp_obj_ctype=GET_U_1(lmp_obj_header->ctype)&0x7f;
4960f74e101Schristos 
497c74ad251Schristos         ND_PRINT("\n\t  %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
4980f74e101Schristos                tok2str(lmp_obj_values,
4990f74e101Schristos                        "Unknown",
500c74ad251Schristos                        GET_U_1(lmp_obj_header->class_num)),
501c74ad251Schristos                GET_U_1(lmp_obj_header->class_num),
5020f74e101Schristos                tok2str(lmp_ctype_values,
5030f74e101Schristos                        "Unknown",
504c74ad251Schristos                        (GET_U_1(lmp_obj_header->class_num)<<8)+lmp_obj_ctype),
5050f74e101Schristos                lmp_obj_ctype,
506c74ad251Schristos                GET_U_1(lmp_obj_header->ctype)&0x80 ? "" : "non-",
507c74ad251Schristos                lmp_obj_len);
5080f74e101Schristos 
50972c96ff3Schristos         if (lmp_obj_len < 4) {
510c74ad251Schristos             ND_PRINT(" (too short)");
51172c96ff3Schristos             return;
51272c96ff3Schristos         }
51372c96ff3Schristos         if ((lmp_obj_len % 4) != 0) {
514c74ad251Schristos             ND_PRINT(" (not a multiple of 4)");
51572c96ff3Schristos             return;
51672c96ff3Schristos         }
51772c96ff3Schristos 
5180f74e101Schristos         obj_tptr=tptr+sizeof(struct lmp_object_header);
5190f74e101Schristos         obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header);
5200f74e101Schristos 
5210f74e101Schristos         /* did we capture enough for fully decoding the object ? */
522c74ad251Schristos         ND_TCHECK_LEN(tptr, lmp_obj_len);
5230f74e101Schristos         hexdump=FALSE;
5240f74e101Schristos 
525c74ad251Schristos         switch(GET_U_1(lmp_obj_header->class_num)) {
5260f74e101Schristos 
5270f74e101Schristos         case LMP_OBJ_CC_ID:
5280f74e101Schristos             switch(lmp_obj_ctype) {
5290f74e101Schristos             case LMP_CTYPE_LOC:
5300f74e101Schristos             case LMP_CTYPE_RMT:
53172c96ff3Schristos                 if (obj_tlen != 4) {
532c74ad251Schristos                     ND_PRINT(" (not correct for object)");
53372c96ff3Schristos                     break;
53472c96ff3Schristos                 }
535c74ad251Schristos                 ND_PRINT("\n\t    Control Channel ID: %u (0x%08x)",
536c74ad251Schristos                        GET_BE_U_4(obj_tptr),
537c74ad251Schristos                        GET_BE_U_4(obj_tptr));
5380f74e101Schristos                 break;
5390f74e101Schristos 
5400f74e101Schristos             default:
5410f74e101Schristos                 hexdump=TRUE;
5420f74e101Schristos             }
5430f74e101Schristos             break;
5440f74e101Schristos 
5450f74e101Schristos         case LMP_OBJ_LINK_ID:
5460f74e101Schristos         case LMP_OBJ_INTERFACE_ID:
5470f74e101Schristos             switch(lmp_obj_ctype) {
5480f74e101Schristos             case LMP_CTYPE_IPV4_LOC:
5490f74e101Schristos             case LMP_CTYPE_IPV4_RMT:
55072c96ff3Schristos                 if (obj_tlen != 4) {
551c74ad251Schristos                     ND_PRINT(" (not correct for object)");
55272c96ff3Schristos                     break;
55372c96ff3Schristos                 }
554c74ad251Schristos                 ND_PRINT("\n\t    IPv4 Link ID: %s (0x%08x)",
555c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
556c74ad251Schristos                        GET_BE_U_4(obj_tptr));
5570f74e101Schristos                 break;
5580f74e101Schristos             case LMP_CTYPE_IPV6_LOC:
5590f74e101Schristos             case LMP_CTYPE_IPV6_RMT:
56072c96ff3Schristos                 if (obj_tlen != 16) {
561c74ad251Schristos                     ND_PRINT(" (not correct for object)");
56272c96ff3Schristos                     break;
56372c96ff3Schristos                 }
564c74ad251Schristos                 ND_PRINT("\n\t    IPv6 Link ID: %s (0x%08x)",
565c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
566c74ad251Schristos                        GET_BE_U_4(obj_tptr));
5670f74e101Schristos                 break;
5680f74e101Schristos             case LMP_CTYPE_UNMD_LOC:
5690f74e101Schristos             case LMP_CTYPE_UNMD_RMT:
57072c96ff3Schristos                 if (obj_tlen != 4) {
571c74ad251Schristos                     ND_PRINT(" (not correct for object)");
57272c96ff3Schristos                     break;
57372c96ff3Schristos                 }
574c74ad251Schristos                 ND_PRINT("\n\t    Link ID: %u (0x%08x)",
575c74ad251Schristos                        GET_BE_U_4(obj_tptr),
576c74ad251Schristos                        GET_BE_U_4(obj_tptr));
5770f74e101Schristos                 break;
5780f74e101Schristos             default:
5790f74e101Schristos                 hexdump=TRUE;
5800f74e101Schristos             }
5810f74e101Schristos             break;
5820f74e101Schristos 
5830f74e101Schristos         case LMP_OBJ_MESSAGE_ID:
5840f74e101Schristos             switch(lmp_obj_ctype) {
5850f74e101Schristos             case LMP_CTYPE_1:
58672c96ff3Schristos                 if (obj_tlen != 4) {
587c74ad251Schristos                     ND_PRINT(" (not correct for object)");
58872c96ff3Schristos                     break;
58972c96ff3Schristos                 }
590c74ad251Schristos                 ND_PRINT("\n\t    Message ID: %u (0x%08x)",
591c74ad251Schristos                        GET_BE_U_4(obj_tptr),
592c74ad251Schristos                        GET_BE_U_4(obj_tptr));
5930f74e101Schristos                 break;
5940f74e101Schristos             case LMP_CTYPE_2:
59572c96ff3Schristos                 if (obj_tlen != 4) {
596c74ad251Schristos                     ND_PRINT(" (not correct for object)");
59772c96ff3Schristos                     break;
59872c96ff3Schristos                 }
599c74ad251Schristos                 ND_PRINT("\n\t    Message ID Ack: %u (0x%08x)",
600c74ad251Schristos                        GET_BE_U_4(obj_tptr),
601c74ad251Schristos                        GET_BE_U_4(obj_tptr));
6020f74e101Schristos                 break;
6030f74e101Schristos             default:
6040f74e101Schristos                 hexdump=TRUE;
6050f74e101Schristos             }
6060f74e101Schristos             break;
6070f74e101Schristos 
6080f74e101Schristos         case LMP_OBJ_NODE_ID:
6090f74e101Schristos             switch(lmp_obj_ctype) {
6100f74e101Schristos             case LMP_CTYPE_LOC:
6110f74e101Schristos             case LMP_CTYPE_RMT:
61272c96ff3Schristos                 if (obj_tlen != 4) {
613c74ad251Schristos                     ND_PRINT(" (not correct for object)");
61472c96ff3Schristos                     break;
61572c96ff3Schristos                 }
616c74ad251Schristos                 ND_PRINT("\n\t    Node ID: %s (0x%08x)",
617c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
618c74ad251Schristos                        GET_BE_U_4(obj_tptr));
6190f74e101Schristos                 break;
6200f74e101Schristos 
6210f74e101Schristos             default:
6220f74e101Schristos                 hexdump=TRUE;
6230f74e101Schristos             }
6240f74e101Schristos             break;
6250f74e101Schristos 
6260f74e101Schristos         case LMP_OBJ_CONFIG:
6270f74e101Schristos             switch(lmp_obj_ctype) {
6280f74e101Schristos             case LMP_CTYPE_HELLO_CONFIG:
62972c96ff3Schristos                 if (obj_tlen != 4) {
630c74ad251Schristos                     ND_PRINT(" (not correct for object)");
63172c96ff3Schristos                     break;
63272c96ff3Schristos                 }
633c74ad251Schristos                 ND_PRINT("\n\t    Hello Interval: %u\n\t    Hello Dead Interval: %u",
634c74ad251Schristos                        GET_BE_U_2(obj_tptr),
635c74ad251Schristos                        GET_BE_U_2(obj_tptr + 2));
6360f74e101Schristos                 break;
6370f74e101Schristos 
6380f74e101Schristos             default:
6390f74e101Schristos                 hexdump=TRUE;
6400f74e101Schristos             }
6410f74e101Schristos             break;
6420f74e101Schristos 
6430f74e101Schristos         case LMP_OBJ_HELLO:
6440f74e101Schristos             switch(lmp_obj_ctype) {
6450f74e101Schristos 	    case LMP_CTYPE_HELLO:
64672c96ff3Schristos                 if (obj_tlen != 8) {
647c74ad251Schristos                     ND_PRINT(" (not correct for object)");
64872c96ff3Schristos                     break;
64972c96ff3Schristos                 }
650c74ad251Schristos                 ND_PRINT("\n\t    Tx Seq: %u, Rx Seq: %u",
651c74ad251Schristos                        GET_BE_U_4(obj_tptr),
652c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4));
6530f74e101Schristos                 break;
6540f74e101Schristos 
6550f74e101Schristos             default:
6560f74e101Schristos                 hexdump=TRUE;
6570f74e101Schristos             }
6580f74e101Schristos             break;
6590f74e101Schristos 
6600f74e101Schristos         case LMP_OBJ_TE_LINK:
66172c96ff3Schristos 	    switch(lmp_obj_ctype) {
66272c96ff3Schristos 	    case LMP_CTYPE_IPV4:
66372c96ff3Schristos                 if (obj_tlen != 12) {
664c74ad251Schristos                     ND_PRINT(" (not correct for object)");
66572c96ff3Schristos                     break;
66672c96ff3Schristos                 }
667c74ad251Schristos 		ND_PRINT("\n\t    Flags: [%s]",
6680f74e101Schristos 		    bittok2str(lmp_obj_te_link_flag_values,
6690f74e101Schristos 			"none",
670c74ad251Schristos 			GET_U_1(obj_tptr)));
6710f74e101Schristos 
672c74ad251Schristos 		ND_PRINT("\n\t    Local Link-ID: %s (0x%08x)"
673870189d2Schristos 		       "\n\t    Remote Link-ID: %s (0x%08x)",
674c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr+4),
675c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
676c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr+8),
677c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8));
6780f74e101Schristos 		break;
6790f74e101Schristos 
6800f74e101Schristos 	    case LMP_CTYPE_IPV6:
68172c96ff3Schristos                 if (obj_tlen != 36) {
682c74ad251Schristos                     ND_PRINT(" (not correct for object)");
68372c96ff3Schristos                     break;
68472c96ff3Schristos                 }
685c74ad251Schristos 		ND_PRINT("\n\t    Flags: [%s]",
68672c96ff3Schristos 		    bittok2str(lmp_obj_te_link_flag_values,
68772c96ff3Schristos 			"none",
688c74ad251Schristos 			GET_U_1(obj_tptr)));
68972c96ff3Schristos 
690c74ad251Schristos 		ND_PRINT("\n\t    Local Link-ID: %s (0x%08x)"
69172c96ff3Schristos 		       "\n\t    Remote Link-ID: %s (0x%08x)",
692c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr+4),
693c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
694c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr+20),
695c74ad251Schristos                        GET_BE_U_4(obj_tptr + 20));
69672c96ff3Schristos                 break;
69772c96ff3Schristos 
6980f74e101Schristos 	    case LMP_CTYPE_UNMD:
69972c96ff3Schristos                 if (obj_tlen != 12) {
700c74ad251Schristos                     ND_PRINT(" (not correct for object)");
70172c96ff3Schristos                     break;
70272c96ff3Schristos                 }
703c74ad251Schristos 		ND_PRINT("\n\t    Flags: [%s]",
70472c96ff3Schristos 		    bittok2str(lmp_obj_te_link_flag_values,
70572c96ff3Schristos 			"none",
706c74ad251Schristos 			GET_U_1(obj_tptr)));
70772c96ff3Schristos 
708c74ad251Schristos 		ND_PRINT("\n\t    Local Link-ID: %u (0x%08x)"
70972c96ff3Schristos 		       "\n\t    Remote Link-ID: %u (0x%08x)",
710c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
711c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
712c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8),
713c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8));
71472c96ff3Schristos 		break;
71572c96ff3Schristos 
7160f74e101Schristos             default:
7170f74e101Schristos                 hexdump=TRUE;
7180f74e101Schristos             }
7190f74e101Schristos             break;
7200f74e101Schristos 
7210f74e101Schristos         case LMP_OBJ_DATA_LINK:
72272c96ff3Schristos 	    switch(lmp_obj_ctype) {
72372c96ff3Schristos 	    case LMP_CTYPE_IPV4:
72472c96ff3Schristos                 if (obj_tlen < 12) {
725c74ad251Schristos                     ND_PRINT(" (not correct for object)");
72672c96ff3Schristos                     break;
72772c96ff3Schristos                 }
728c74ad251Schristos 	        ND_PRINT("\n\t    Flags: [%s]",
7290f74e101Schristos 		    bittok2str(lmp_obj_data_link_flag_values,
7300f74e101Schristos 			"none",
731c74ad251Schristos 			GET_U_1(obj_tptr)));
732c74ad251Schristos                 ND_PRINT("\n\t    Local Interface ID: %s (0x%08x)"
733870189d2Schristos                        "\n\t    Remote Interface ID: %s (0x%08x)",
734c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr+4),
735c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
736c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr+8),
737c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8));
7380f74e101Schristos 
739c74ad251Schristos 		if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 12, 12))
7400f74e101Schristos 		    hexdump=TRUE;
7410f74e101Schristos 		break;
7420f74e101Schristos 
7430f74e101Schristos 	    case LMP_CTYPE_IPV6:
74472c96ff3Schristos                 if (obj_tlen < 36) {
745c74ad251Schristos                     ND_PRINT(" (not correct for object)");
74672c96ff3Schristos                     break;
74772c96ff3Schristos                 }
748c74ad251Schristos 	        ND_PRINT("\n\t    Flags: [%s]",
74972c96ff3Schristos 		    bittok2str(lmp_obj_data_link_flag_values,
75072c96ff3Schristos 			"none",
751c74ad251Schristos 			GET_U_1(obj_tptr)));
752c74ad251Schristos                 ND_PRINT("\n\t    Local Interface ID: %s (0x%08x)"
75372c96ff3Schristos                        "\n\t    Remote Interface ID: %s (0x%08x)",
754c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr+4),
755c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
756c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr+20),
757c74ad251Schristos                        GET_BE_U_4(obj_tptr + 20));
75872c96ff3Schristos 
759c74ad251Schristos 		if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 36, 36))
76072c96ff3Schristos 		    hexdump=TRUE;
76172c96ff3Schristos 		break;
76272c96ff3Schristos 
76372c96ff3Schristos 	    case LMP_CTYPE_UNMD:
76472c96ff3Schristos                 if (obj_tlen < 12) {
765c74ad251Schristos                     ND_PRINT(" (not correct for object)");
76672c96ff3Schristos                     break;
76772c96ff3Schristos                 }
768c74ad251Schristos 	        ND_PRINT("\n\t    Flags: [%s]",
76972c96ff3Schristos 		    bittok2str(lmp_obj_data_link_flag_values,
77072c96ff3Schristos 			"none",
771c74ad251Schristos 			GET_U_1(obj_tptr)));
772c74ad251Schristos                 ND_PRINT("\n\t    Local Interface ID: %u (0x%08x)"
77372c96ff3Schristos                        "\n\t    Remote Interface ID: %u (0x%08x)",
774c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
775c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
776c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8),
777c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8));
77872c96ff3Schristos 
779c74ad251Schristos 		if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 12, 12))
78072c96ff3Schristos 		    hexdump=TRUE;
78172c96ff3Schristos 		break;
78272c96ff3Schristos 
7830f74e101Schristos             default:
7840f74e101Schristos                 hexdump=TRUE;
7850f74e101Schristos             }
7860f74e101Schristos             break;
7870f74e101Schristos 
7880f74e101Schristos         case LMP_OBJ_VERIFY_BEGIN:
7890f74e101Schristos 	    switch(lmp_obj_ctype) {
7900f74e101Schristos             case LMP_CTYPE_1:
79172c96ff3Schristos                 if (obj_tlen != 20) {
792c74ad251Schristos                     ND_PRINT(" (not correct for object)");
79372c96ff3Schristos                     break;
79472c96ff3Schristos                 }
795c74ad251Schristos 		ND_PRINT("\n\t    Flags: %s",
7960f74e101Schristos 		bittok2str(lmp_obj_begin_verify_flag_values,
7970f74e101Schristos 			"none",
798c74ad251Schristos 			GET_BE_U_2(obj_tptr)));
799c74ad251Schristos 		ND_PRINT("\n\t    Verify Interval: %u",
800c74ad251Schristos 			GET_BE_U_2(obj_tptr + 2));
801c74ad251Schristos 		ND_PRINT("\n\t    Data links: %u",
802c74ad251Schristos 			GET_BE_U_4(obj_tptr + 4));
803c74ad251Schristos                 ND_PRINT("\n\t    Encoding type: %s",
804c74ad251Schristos 			tok2str(gmpls_encoding_values, "Unknown", GET_U_1((obj_tptr + 8))));
805c74ad251Schristos                 ND_PRINT("\n\t    Verify Transport Mechanism: %u (0x%x)%s",
806c74ad251Schristos 			GET_BE_U_2(obj_tptr + 10),
807c74ad251Schristos 			GET_BE_U_2(obj_tptr + 10),
808c74ad251Schristos 			GET_BE_U_2(obj_tptr + 10)&8000 ? " (Payload test messages capable)" : "");
809c74ad251Schristos                 bw.i = GET_BE_U_4(obj_tptr + 12);
810c74ad251Schristos 		ND_PRINT("\n\t    Transmission Rate: %.3f Mbps",bw.f*8/1000000);
811c74ad251Schristos 		ND_PRINT("\n\t    Wavelength: %u",
812c74ad251Schristos 			GET_BE_U_4(obj_tptr + 16));
8130f74e101Schristos 		break;
8140f74e101Schristos 
8150f74e101Schristos             default:
8160f74e101Schristos                 hexdump=TRUE;
8170f74e101Schristos             }
8180f74e101Schristos             break;
8190f74e101Schristos 
8200f74e101Schristos         case LMP_OBJ_VERIFY_BEGIN_ACK:
8210f74e101Schristos 	    switch(lmp_obj_ctype) {
8220f74e101Schristos             case LMP_CTYPE_1:
82372c96ff3Schristos                 if (obj_tlen != 4) {
824c74ad251Schristos                     ND_PRINT(" (not correct for object)");
82572c96ff3Schristos                     break;
82672c96ff3Schristos                 }
827c74ad251Schristos                 ND_PRINT("\n\t    Verify Dead Interval: %u"
828870189d2Schristos                        "\n\t    Verify Transport Response: %u",
829c74ad251Schristos                        GET_BE_U_2(obj_tptr),
830c74ad251Schristos                        GET_BE_U_2(obj_tptr + 2));
8310f74e101Schristos                 break;
8320f74e101Schristos 
8330f74e101Schristos             default:
8340f74e101Schristos                 hexdump=TRUE;
8350f74e101Schristos             }
8360f74e101Schristos             break;
8370f74e101Schristos 
8380f74e101Schristos 	case LMP_OBJ_VERIFY_ID:
8390f74e101Schristos 	    switch(lmp_obj_ctype) {
8400f74e101Schristos             case LMP_CTYPE_1:
84172c96ff3Schristos                 if (obj_tlen != 4) {
842c74ad251Schristos                     ND_PRINT(" (not correct for object)");
84372c96ff3Schristos                     break;
84472c96ff3Schristos                 }
845c74ad251Schristos                 ND_PRINT("\n\t    Verify ID: %u",
846c74ad251Schristos                        GET_BE_U_4(obj_tptr));
8470f74e101Schristos                 break;
8480f74e101Schristos 
8490f74e101Schristos             default:
8500f74e101Schristos                 hexdump=TRUE;
8510f74e101Schristos             }
8520f74e101Schristos             break;
8530f74e101Schristos 
8540f74e101Schristos 	case LMP_OBJ_CHANNEL_STATUS:
8550f74e101Schristos             switch(lmp_obj_ctype) {
8560f74e101Schristos 	    case LMP_CTYPE_IPV4:
8570f74e101Schristos 		offset = 0;
8580f74e101Schristos 		/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
85972c96ff3Schristos 		while (offset+8 <= obj_tlen) {
860c74ad251Schristos 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
861c74ad251Schristos 			GET_IPADDR_STRING(obj_tptr+offset),
862c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset));
8630f74e101Schristos 
864c74ad251Schristos 			ND_PRINT("\n\t\t    Active: %s (%u)",
865c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>31) ?
8660f74e101Schristos 				"Allocated" : "Non-allocated",
867c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>31));
8680f74e101Schristos 
869c74ad251Schristos 			ND_PRINT("\n\t\t    Direction: %s (%u)",
870c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1 ?
8710f74e101Schristos 				"Transmit" : "Receive",
872c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1);
8730f74e101Schristos 
874c74ad251Schristos 			ND_PRINT("\n\t\t    Channel Status: %s (%u)",
8750f74e101Schristos 					tok2str(lmp_obj_channel_status_values,
8760f74e101Schristos 					"Unknown",
877c74ad251Schristos 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF),
878c74ad251Schristos 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF);
8790f74e101Schristos 			offset+=8;
8800f74e101Schristos 		}
8810f74e101Schristos                 break;
88272c96ff3Schristos 
8830f74e101Schristos 	    case LMP_CTYPE_IPV6:
88472c96ff3Schristos 		offset = 0;
88572c96ff3Schristos 		/* Decode pairs: <Interface_ID (16 bytes), Channel_status (4 bytes)> */
88672c96ff3Schristos 		while (offset+20 <= obj_tlen) {
887c74ad251Schristos 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
888c74ad251Schristos 			GET_IP6ADDR_STRING(obj_tptr+offset),
889c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset));
89072c96ff3Schristos 
891c74ad251Schristos 			ND_PRINT("\n\t\t    Active: %s (%u)",
892c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 16)>>31) ?
89372c96ff3Schristos 				"Allocated" : "Non-allocated",
894c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 16)>>31));
89572c96ff3Schristos 
896c74ad251Schristos 			ND_PRINT("\n\t\t    Direction: %s (%u)",
897c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 16)>>30)&0x1 ?
89872c96ff3Schristos 				"Transmit" : "Receive",
899c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 16)>>30)&0x1);
90072c96ff3Schristos 
901c74ad251Schristos 			ND_PRINT("\n\t\t    Channel Status: %s (%u)",
90272c96ff3Schristos 					tok2str(lmp_obj_channel_status_values,
90372c96ff3Schristos 					"Unknown",
904c74ad251Schristos 					GET_BE_U_4(obj_tptr + offset + 16)&0x3FFFFFF),
905c74ad251Schristos 					GET_BE_U_4(obj_tptr + offset + 16)&0x3FFFFFF);
90672c96ff3Schristos 			offset+=20;
90772c96ff3Schristos 		}
90872c96ff3Schristos                 break;
90972c96ff3Schristos 
91072c96ff3Schristos 	    case LMP_CTYPE_UNMD:
91172c96ff3Schristos 		offset = 0;
91272c96ff3Schristos 		/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
91372c96ff3Schristos 		while (offset+8 <= obj_tlen) {
914c74ad251Schristos 			ND_PRINT("\n\t    Interface ID: %u (0x%08x)",
915c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset),
916c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset));
91772c96ff3Schristos 
918c74ad251Schristos 			ND_PRINT("\n\t\t    Active: %s (%u)",
919c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>31) ?
92072c96ff3Schristos 				"Allocated" : "Non-allocated",
921c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>31));
92272c96ff3Schristos 
923c74ad251Schristos 			ND_PRINT("\n\t\t    Direction: %s (%u)",
924c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1 ?
92572c96ff3Schristos 				"Transmit" : "Receive",
926c74ad251Schristos 				(GET_BE_U_4(obj_tptr + offset + 4)>>30)&0x1);
92772c96ff3Schristos 
928c74ad251Schristos 			ND_PRINT("\n\t\t    Channel Status: %s (%u)",
92972c96ff3Schristos 					tok2str(lmp_obj_channel_status_values,
93072c96ff3Schristos 					"Unknown",
931c74ad251Schristos 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF),
932c74ad251Schristos 					GET_BE_U_4(obj_tptr + offset + 4)&0x3FFFFFF);
93372c96ff3Schristos 			offset+=8;
93472c96ff3Schristos 		}
93572c96ff3Schristos                 break;
93672c96ff3Schristos 
9370f74e101Schristos             default:
9380f74e101Schristos                 hexdump=TRUE;
9390f74e101Schristos             }
9400f74e101Schristos             break;
9410f74e101Schristos 
9420f74e101Schristos 	case LMP_OBJ_CHANNEL_STATUS_REQ:
9430f74e101Schristos             switch(lmp_obj_ctype) {
9440f74e101Schristos 	    case LMP_CTYPE_IPV4:
9450f74e101Schristos 		offset = 0;
94672c96ff3Schristos 		while (offset+4 <= obj_tlen) {
947c74ad251Schristos 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
948c74ad251Schristos 			GET_IPADDR_STRING(obj_tptr+offset),
949c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset));
9500f74e101Schristos 			offset+=4;
9510f74e101Schristos 		}
9520f74e101Schristos                 break;
95372c96ff3Schristos 
9540f74e101Schristos 	    case LMP_CTYPE_IPV6:
95572c96ff3Schristos 		offset = 0;
95672c96ff3Schristos 		while (offset+16 <= obj_tlen) {
957c74ad251Schristos 			ND_PRINT("\n\t    Interface ID: %s (0x%08x)",
958c74ad251Schristos 			GET_IP6ADDR_STRING(obj_tptr+offset),
959c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset));
96072c96ff3Schristos 			offset+=16;
96172c96ff3Schristos 		}
96272c96ff3Schristos                 break;
96372c96ff3Schristos 
96472c96ff3Schristos 	    case LMP_CTYPE_UNMD:
96572c96ff3Schristos 		offset = 0;
96672c96ff3Schristos 		while (offset+4 <= obj_tlen) {
967c74ad251Schristos 			ND_PRINT("\n\t    Interface ID: %u (0x%08x)",
968c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset),
969c74ad251Schristos 			GET_BE_U_4(obj_tptr + offset));
97072c96ff3Schristos 			offset+=4;
97172c96ff3Schristos 		}
97272c96ff3Schristos                 break;
97372c96ff3Schristos 
9740f74e101Schristos 	    default:
9750f74e101Schristos                 hexdump=TRUE;
9760f74e101Schristos             }
9770f74e101Schristos             break;
9780f74e101Schristos 
9790f74e101Schristos         case LMP_OBJ_ERROR_CODE:
9800f74e101Schristos 	    switch(lmp_obj_ctype) {
9810f74e101Schristos             case LMP_CTYPE_BEGIN_VERIFY_ERROR:
98272c96ff3Schristos                 if (obj_tlen != 4) {
983c74ad251Schristos                     ND_PRINT(" (not correct for object)");
98472c96ff3Schristos                     break;
98572c96ff3Schristos                 }
986c74ad251Schristos 		ND_PRINT("\n\t    Error Code: %s",
9870f74e101Schristos 		bittok2str(lmp_obj_begin_verify_error_values,
9880f74e101Schristos 			"none",
989c74ad251Schristos 			GET_BE_U_4(obj_tptr)));
9900f74e101Schristos                 break;
9910f74e101Schristos 
9920f74e101Schristos             case LMP_CTYPE_LINK_SUMMARY_ERROR:
99372c96ff3Schristos                 if (obj_tlen != 4) {
994c74ad251Schristos                     ND_PRINT(" (not correct for object)");
99572c96ff3Schristos                     break;
99672c96ff3Schristos                 }
997c74ad251Schristos 		ND_PRINT("\n\t    Error Code: %s",
9980f74e101Schristos 		bittok2str(lmp_obj_link_summary_error_values,
9990f74e101Schristos 			"none",
1000c74ad251Schristos 			GET_BE_U_4(obj_tptr)));
10010f74e101Schristos                 break;
10020f74e101Schristos             default:
10030f74e101Schristos                 hexdump=TRUE;
10040f74e101Schristos             }
10050f74e101Schristos             break;
10060f74e101Schristos 
10070f74e101Schristos 	case LMP_OBJ_SERVICE_CONFIG:
10080f74e101Schristos 	    switch (lmp_obj_ctype) {
10090f74e101Schristos 	    case LMP_CTYPE_SERVICE_CONFIG_SP:
101072c96ff3Schristos                 if (obj_tlen != 4) {
1011c74ad251Schristos                     ND_PRINT(" (not correct for object)");
101272c96ff3Schristos                     break;
101372c96ff3Schristos                 }
1014c74ad251Schristos 		ND_PRINT("\n\t Flags: %s",
10150f74e101Schristos 		       bittok2str(lmp_obj_service_config_sp_flag_values,
10160f74e101Schristos 				  "none",
1017c74ad251Schristos 				  GET_U_1(obj_tptr)));
10180f74e101Schristos 
1019c74ad251Schristos 		ND_PRINT("\n\t  UNI Version: %u",
1020c74ad251Schristos 		       GET_U_1(obj_tptr + 1));
10210f74e101Schristos 
10220f74e101Schristos 		break;
10230f74e101Schristos 
10240f74e101Schristos             case LMP_CTYPE_SERVICE_CONFIG_CPSA:
102572c96ff3Schristos                 if (obj_tlen != 16) {
1026c74ad251Schristos                     ND_PRINT(" (not correct for object)");
102772c96ff3Schristos                     break;
102872c96ff3Schristos                 }
10290f74e101Schristos 
1030c74ad251Schristos 		link_type = GET_U_1(obj_tptr);
10310f74e101Schristos 
1032c74ad251Schristos 		ND_PRINT("\n\t Link Type: %s (%u)",
10330f74e101Schristos 		       tok2str(lmp_sd_service_config_cpsa_link_type_values,
10340f74e101Schristos 			       "Unknown", link_type),
1035c74ad251Schristos 		       link_type);
10360f74e101Schristos 
103772c96ff3Schristos 		switch (link_type) {
103872c96ff3Schristos 		case LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH:
1039c74ad251Schristos 		    ND_PRINT("\n\t Signal Type: %s (%u)",
10400f74e101Schristos 			   tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,
10410f74e101Schristos 				   "Unknown",
1042c74ad251Schristos 				   GET_U_1(obj_tptr + 1)),
1043c74ad251Schristos 			   GET_U_1(obj_tptr + 1));
104472c96ff3Schristos 		    break;
10450f74e101Schristos 
104672c96ff3Schristos 		case LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET:
1047c74ad251Schristos 		    ND_PRINT("\n\t Signal Type: %s (%u)",
10480f74e101Schristos 			   tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,
10490f74e101Schristos 				   "Unknown",
1050c74ad251Schristos 				   GET_U_1(obj_tptr + 1)),
1051c74ad251Schristos 			   GET_U_1(obj_tptr + 1));
105272c96ff3Schristos 		    break;
10530f74e101Schristos 		}
10540f74e101Schristos 
1055c74ad251Schristos 		ND_PRINT("\n\t Transparency: %s",
10560f74e101Schristos 		       bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,
10570f74e101Schristos 				  "none",
1058c74ad251Schristos 				  GET_U_1(obj_tptr + 2)));
10590f74e101Schristos 
1060c74ad251Schristos 		ND_PRINT("\n\t Contiguous Concatenation Types: %s",
10610f74e101Schristos 		       bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,
10620f74e101Schristos 				  "none",
1063c74ad251Schristos 				  GET_U_1(obj_tptr + 3)));
10640f74e101Schristos 
1065c74ad251Schristos 		ND_PRINT("\n\t Minimum NCC: %u",
1066c74ad251Schristos 		       GET_BE_U_2(obj_tptr + 4));
10670f74e101Schristos 
1068c74ad251Schristos 		ND_PRINT("\n\t Maximum NCC: %u",
1069c74ad251Schristos 		       GET_BE_U_2(obj_tptr + 6));
10700f74e101Schristos 
1071c74ad251Schristos 		ND_PRINT("\n\t Minimum NVC:%u",
1072c74ad251Schristos 		       GET_BE_U_2(obj_tptr + 8));
10730f74e101Schristos 
1074c74ad251Schristos 		ND_PRINT("\n\t Maximum NVC:%u",
1075c74ad251Schristos 		       GET_BE_U_2(obj_tptr + 10));
10760f74e101Schristos 
1077c74ad251Schristos 		ND_PRINT("\n\t    Local Interface ID: %s (0x%08x)",
1078c74ad251Schristos 		       GET_IPADDR_STRING(obj_tptr+12),
1079c74ad251Schristos 		       GET_BE_U_4(obj_tptr + 12));
10800f74e101Schristos 
10810f74e101Schristos 		break;
10820f74e101Schristos 
10830f74e101Schristos 	    case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:
108472c96ff3Schristos                 if (obj_tlen != 8) {
1085c74ad251Schristos                     ND_PRINT(" (not correct for object)");
108672c96ff3Schristos                     break;
108772c96ff3Schristos                 }
10880f74e101Schristos 
1089c74ad251Schristos 		ND_PRINT("\n\t Transparency Flags: %s",
10900f74e101Schristos 		       bittok2str(
10910f74e101Schristos 			   lmp_obj_service_config_nsa_transparency_flag_values,
10920f74e101Schristos 			   "none",
1093c74ad251Schristos 			   GET_BE_U_4(obj_tptr)));
10940f74e101Schristos 
1095c74ad251Schristos 		ND_PRINT("\n\t TCM Monitoring Flags: %s",
10960f74e101Schristos 		       bittok2str(
10970f74e101Schristos 			   lmp_obj_service_config_nsa_tcm_flag_values,
10980f74e101Schristos 			   "none",
1099c74ad251Schristos 			   GET_U_1(obj_tptr + 7)));
11000f74e101Schristos 
11010f74e101Schristos 		break;
11020f74e101Schristos 
11030f74e101Schristos 	    case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:
110472c96ff3Schristos                 if (obj_tlen != 4) {
1105c74ad251Schristos                     ND_PRINT(" (not correct for object)");
110672c96ff3Schristos                     break;
110772c96ff3Schristos                 }
11080f74e101Schristos 
1109c74ad251Schristos 		ND_PRINT("\n\t Diversity: Flags: %s",
11100f74e101Schristos 		       bittok2str(
11110f74e101Schristos 			   lmp_obj_service_config_nsa_network_diversity_flag_values,
11120f74e101Schristos 			   "none",
1113c74ad251Schristos 			   GET_U_1(obj_tptr + 3)));
11140f74e101Schristos 		break;
11150f74e101Schristos 
11160f74e101Schristos 	    default:
11170f74e101Schristos 		hexdump = TRUE;
1118dc860a36Sspz 	    }
11190f74e101Schristos 
11200f74e101Schristos 	break;
11210f74e101Schristos 
11220f74e101Schristos         default:
1123b3a00663Schristos             if (ndo->ndo_vflag <= 1)
1124b3a00663Schristos                 print_unknown_data(ndo,obj_tptr,"\n\t    ",obj_tlen);
11250f74e101Schristos             break;
11260f74e101Schristos         }
11270f74e101Schristos         /* do we want to see an additionally hexdump ? */
1128b3a00663Schristos         if (ndo->ndo_vflag > 1 || hexdump==TRUE)
1129b3a00663Schristos             print_unknown_data(ndo,tptr+sizeof(struct lmp_object_header),"\n\t    ",
11300f74e101Schristos                                lmp_obj_len-sizeof(struct lmp_object_header));
11310f74e101Schristos 
1132c74ad251Schristos         if (tlen < lmp_obj_len) {
1133c74ad251Schristos             ND_PRINT(" [remaining objects length %u < %u]", tlen, lmp_obj_len);
1134c74ad251Schristos             nd_print_invalid(ndo);
1135c74ad251Schristos             break;
1136c74ad251Schristos         }
11370f74e101Schristos         tptr+=lmp_obj_len;
11380f74e101Schristos         tlen-=lmp_obj_len;
11390f74e101Schristos     }
11400f74e101Schristos }
1141