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