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 20146773Ssam#ifndef lint 21146773Ssamstatic const char rcsid[] _U_ = 22190207Srpaulo "@(#) $Header: /tcpdump/master/tcpdump/print-lmp.c,v 1.11 2007-08-02 17:32:49 hannes Exp $"; 23146773Ssam#endif 24146773Ssam 25146773Ssam#ifdef HAVE_CONFIG_H 26146773Ssam#include "config.h" 27146773Ssam#endif 28146773Ssam 29146773Ssam#include <tcpdump-stdinc.h> 30146773Ssam 31146773Ssam#include <stdio.h> 32146773Ssam#include <stdlib.h> 33146773Ssam#include <string.h> 34146773Ssam 35146773Ssam#include "interface.h" 36146773Ssam#include "extract.h" 37146773Ssam#include "addrtoname.h" 38146773Ssam#include "gmpls.h" 39146773Ssam 40146773Ssam/* 41146773Ssam * LMP common header 42146773Ssam * 43146773Ssam * 0 1 2 3 44146773Ssam * 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 45146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46146773Ssam * | Vers | (Reserved) | Flags | Msg Type | 47146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 48146773Ssam * | LMP Length | (Reserved) | 49146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 50146773Ssam */ 51146773Ssam 52146773Ssamstruct lmp_common_header { 53146773Ssam u_int8_t version_res[2]; 54146773Ssam u_int8_t flags; 55146773Ssam u_int8_t msg_type; 56146773Ssam u_int8_t length[2]; 57146773Ssam u_int8_t reserved[2]; 58146773Ssam}; 59146773Ssam 60146773Ssam#define LMP_VERSION 1 61146773Ssam#define LMP_EXTRACT_VERSION(x) (((x)&0xf0)>>4) 62146773Ssam 63146773Ssamstatic const struct tok lmp_header_flag_values[] = { 64172683Smlaier { 0x01, "Control Channel Down"}, 65146773Ssam { 0x02, "LMP restart"}, 66146773Ssam { 0, NULL} 67146773Ssam}; 68146773Ssam 69146773Ssamstatic const struct tok lmp_obj_te_link_flag_values[] = { 70146773Ssam { 0x01, "Fault Management Supported"}, 71146773Ssam { 0x02, "Link Verification Supported"}, 72146773Ssam { 0, NULL} 73146773Ssam}; 74146773Ssam 75146773Ssamstatic const struct tok lmp_obj_data_link_flag_values[] = { 76146773Ssam { 0x01, "Data Link Port"}, 77146773Ssam { 0x02, "Allocated for user traffic"}, 78146773Ssam { 0x04, "Failed link"}, 79146773Ssam { 0, NULL} 80146773Ssam}; 81146773Ssam 82146773Ssamstatic const struct tok lmp_obj_channel_status_values[] = { 83146773Ssam { 1, "Signal Okay"}, 84146773Ssam { 2, "Signal Degraded"}, 85146773Ssam { 3, "Signal Fail"}, 86146773Ssam { 0, NULL} 87146773Ssam}; 88146773Ssam 89146773Ssamstatic const struct tok lmp_obj_begin_verify_flag_values[] = { 90146773Ssam { 0x0001, "Verify all links"}, 91146773Ssam { 0x0002, "Data link type"}, 92146773Ssam { 0, NULL} 93146773Ssam}; 94146773Ssam 95146773Ssamstatic const struct tok lmp_obj_begin_verify_error_values[] = { 96190207Srpaulo { 0x01, "Link Verification Procedure Not supported"}, 97190207Srpaulo { 0x02, "Unwilling to verify"}, 98190207Srpaulo { 0x04, "Unsupported verification transport mechanism"}, 99190207Srpaulo { 0x08, "Link-Id configuration error"}, 100190207Srpaulo { 0x10, "Unknown object c-type"}, 101146773Ssam { 0, NULL} 102146773Ssam}; 103146773Ssam 104146773Ssamstatic const struct tok lmp_obj_link_summary_error_values[] = { 105190207Srpaulo { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"}, 106190207Srpaulo { 0x02, "Renegotiate LINK-SUMMARY parameters"}, 107190207Srpaulo { 0x04, "Invalid TE-LINK Object"}, 108190207Srpaulo { 0x08, "Invalid DATA-LINK Object"}, 109190207Srpaulo { 0x10, "Unknown TE-LINK Object c-type"}, 110190207Srpaulo { 0x20, "Unknown DATA-LINK Object c-type"}, 111146773Ssam { 0, NULL} 112146773Ssam}; 113146773Ssam 114147899Ssam/* Service Config Supported Protocols Flags */ 115147899Ssamstatic const struct tok lmp_obj_service_config_sp_flag_values[] = { 116147899Ssam { 0x01, "RSVP Supported"}, 117147899Ssam { 0x02, "LDP Supported"}, 118147899Ssam { 0, NULL} 119147899Ssam}; 120147899Ssam 121147899Ssam/* Service Config Client Port Service Attribute Transparency Flags */ 122147899Ssamstatic const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = { 123147899Ssam { 0x01, "Path/VC Overhead Transparency Supported"}, 124147899Ssam { 0x02, "Line/MS Overhead Transparency Supported"}, 125147899Ssam { 0x04, "Section/RS Overhead Transparency Supported"}, 126147899Ssam { 0, NULL} 127147899Ssam}; 128147899Ssam 129147899Ssam/* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */ 130147899Ssamstatic const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = { 131147899Ssam { 0x01, "Contiguous Concatenation Types Supported"}, 132147899Ssam { 0, NULL} 133147899Ssam}; 134147899Ssam 135147899Ssam/* Service Config Network Service Attributes Transparency Flags */ 136147899Ssamstatic const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = { 137147899Ssam { 0x01, "Standard SOH/RSOH Transparency Supported"}, 138147899Ssam { 0x02, "Standard LOH/MSOH Transparency Supported"}, 139147899Ssam { 0, NULL} 140147899Ssam}; 141147899Ssam 142147899Ssam/* Service Config Network Service Attributes TCM Monitoring Flags */ 143147899Ssamstatic const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = { 144147899Ssam { 0x01, "Transparent Tandem Connection Monitoring Supported"}, 145147899Ssam { 0, NULL} 146147899Ssam}; 147147899Ssam 148147899Ssam/* Network Service Attributes Network Diversity Flags */ 149147899Ssamstatic const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = { 150147899Ssam { 0x01, "Node Diversity Supported"}, 151147899Ssam { 0x02, "Link Diversity Supported"}, 152147899Ssam { 0x04, "SRLG Diversity Supported"}, 153147899Ssam { 0, NULL} 154147899Ssam}; 155147899Ssam 156146773Ssam#define LMP_MSGTYPE_CONFIG 1 157146773Ssam#define LMP_MSGTYPE_CONFIG_ACK 2 158146773Ssam#define LMP_MSGTYPE_CONFIG_NACK 3 159146773Ssam#define LMP_MSGTYPE_HELLO 4 160146773Ssam#define LMP_MSGTYPE_VERIFY_BEGIN 5 161146773Ssam#define LMP_MSGTYPE_VERIFY_BEGIN_ACK 6 162146773Ssam#define LMP_MSGTYPE_VERIFY_BEGIN_NACK 7 163146773Ssam#define LMP_MSGTYPE_VERIFY_END 8 164146773Ssam#define LMP_MSGTYPE_VERIFY_END_ACK 9 165146773Ssam#define LMP_MSGTYPE_TEST 10 166146773Ssam#define LMP_MSGTYPE_TEST_STATUS_SUCCESS 11 167146773Ssam#define LMP_MSGTYPE_TEST_STATUS_FAILURE 12 168146773Ssam#define LMP_MSGTYPE_TEST_STATUS_ACK 13 169146773Ssam#define LMP_MSGTYPE_LINK_SUMMARY 14 170146773Ssam#define LMP_MSGTYPE_LINK_SUMMARY_ACK 15 171146773Ssam#define LMP_MSGTYPE_LINK_SUMMARY_NACK 16 172146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS 17 173146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS_ACK 18 174146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS_REQ 19 175146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS_RESP 20 176147899Ssam/* LMP Service Discovery message types defined by UNI 1.0 */ 177147899Ssam#define LMP_MSGTYPE_SERVICE_CONFIG 50 178147899Ssam#define LMP_MSGTYPE_SERVICE_CONFIG_ACK 51 179147899Ssam#define LMP_MSGTYPE_SERVICE_CONFIG_NACK 52 180146773Ssam 181146773Ssamstatic const struct tok lmp_msg_type_values[] = { 182146773Ssam { LMP_MSGTYPE_CONFIG, "Config"}, 183146773Ssam { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"}, 184146773Ssam { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"}, 185146773Ssam { LMP_MSGTYPE_HELLO, "Hello"}, 186146773Ssam { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"}, 187146773Ssam { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"}, 188146773Ssam { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"}, 189146773Ssam { LMP_MSGTYPE_VERIFY_END, "End Verify"}, 190146773Ssam { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"}, 191146773Ssam { LMP_MSGTYPE_TEST, "Test"}, 192146773Ssam { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"}, 193146773Ssam { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"}, 194146773Ssam { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"}, 195146773Ssam { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"}, 196146773Ssam { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"}, 197146773Ssam { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"}, 198146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"}, 199146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"}, 200146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"}, 201146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"}, 202147899Ssam { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"}, 203147899Ssam { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"}, 204147899Ssam { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"}, 205146773Ssam { 0, NULL} 206146773Ssam}; 207146773Ssam 208146773Ssam/* 209146773Ssam * LMP object header 210146773Ssam * 211146773Ssam * 0 1 2 3 212146773Ssam * 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 213146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 214146773Ssam * |N| C-Type | Class | Length | 215146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 216146773Ssam * | | 217146773Ssam * // (object contents) // 218146773Ssam * | | 219146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 220146773Ssam */ 221146773Ssam 222146773Ssamstruct lmp_object_header { 223146773Ssam u_int8_t ctype; 224146773Ssam u_int8_t class_num; 225146773Ssam u_int8_t length[2]; 226146773Ssam}; 227146773Ssam 228146773Ssam#define LMP_OBJ_CC_ID 1 229146773Ssam#define LMP_OBJ_NODE_ID 2 230146773Ssam#define LMP_OBJ_LINK_ID 3 231146773Ssam#define LMP_OBJ_INTERFACE_ID 4 232146773Ssam#define LMP_OBJ_MESSAGE_ID 5 233146773Ssam#define LMP_OBJ_CONFIG 6 234146773Ssam#define LMP_OBJ_HELLO 7 235146773Ssam#define LMP_OBJ_VERIFY_BEGIN 8 236146773Ssam#define LMP_OBJ_VERIFY_BEGIN_ACK 9 237146773Ssam#define LMP_OBJ_VERIFY_ID 10 238146773Ssam#define LMP_OBJ_TE_LINK 11 239146773Ssam#define LMP_OBJ_DATA_LINK 12 240146773Ssam#define LMP_OBJ_CHANNEL_STATUS 13 241146773Ssam#define LMP_OBJ_CHANNEL_STATUS_REQ 14 242146773Ssam#define LMP_OBJ_ERROR_CODE 20 243146773Ssam 244147899Ssam#define LMP_OBJ_SERVICE_CONFIG 51 /* defined in UNI 1.0 */ 245147899Ssam 246146773Ssamstatic const struct tok lmp_obj_values[] = { 247146773Ssam { LMP_OBJ_CC_ID, "Control Channel ID" }, 248146773Ssam { LMP_OBJ_NODE_ID, "Node ID" }, 249146773Ssam { LMP_OBJ_LINK_ID, "Link ID" }, 250146773Ssam { LMP_OBJ_INTERFACE_ID, "Interface ID" }, 251146773Ssam { LMP_OBJ_MESSAGE_ID, "Message ID" }, 252146773Ssam { LMP_OBJ_CONFIG, "Configuration" }, 253146773Ssam { LMP_OBJ_HELLO, "Hello" }, 254146773Ssam { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" }, 255146773Ssam { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" }, 256146773Ssam { LMP_OBJ_VERIFY_ID, "Verify ID" }, 257146773Ssam { LMP_OBJ_TE_LINK, "TE Link" }, 258146773Ssam { LMP_OBJ_DATA_LINK, "Data Link" }, 259146773Ssam { LMP_OBJ_CHANNEL_STATUS, "Channel Status" }, 260146773Ssam { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" }, 261146773Ssam { LMP_OBJ_ERROR_CODE, "Error Code" }, 262147899Ssam { LMP_OBJ_SERVICE_CONFIG, "Service Config" }, 263147899Ssam 264146773Ssam { 0, NULL} 265146773Ssam}; 266146773Ssam 267146773Ssam#define INT_SWITCHING_TYPE_SUBOBJ 1 268146773Ssam#define WAVELENGTH_SUBOBJ 2 269146773Ssam 270146773Ssamstatic const struct tok lmp_data_link_subobj[] = { 271146773Ssam { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" }, 272146773Ssam { WAVELENGTH_SUBOBJ , "Wavelength" }, 273146773Ssam { 0, NULL} 274146773Ssam}; 275146773Ssam 276146773Ssam#define LMP_CTYPE_IPV4 1 277146773Ssam#define LMP_CTYPE_IPV6 2 278146773Ssam 279146773Ssam#define LMP_CTYPE_LOC 1 280146773Ssam#define LMP_CTYPE_RMT 2 281146773Ssam#define LMP_CTYPE_UNMD 3 282146773Ssam 283146773Ssam#define LMP_CTYPE_IPV4_LOC 1 284146773Ssam#define LMP_CTYPE_IPV4_RMT 2 285146773Ssam#define LMP_CTYPE_IPV6_LOC 3 286146773Ssam#define LMP_CTYPE_IPV6_RMT 4 287146773Ssam#define LMP_CTYPE_UNMD_LOC 5 288146773Ssam#define LMP_CTYPE_UNMD_RMT 6 289146773Ssam 290146773Ssam#define LMP_CTYPE_1 1 291146773Ssam#define LMP_CTYPE_2 2 292146773Ssam 293146773Ssam#define LMP_CTYPE_HELLO_CONFIG 1 294146773Ssam#define LMP_CTYPE_HELLO 1 295146773Ssam 296146773Ssam#define LMP_CTYPE_BEGIN_VERIFY_ERROR 1 297146773Ssam#define LMP_CTYPE_LINK_SUMMARY_ERROR 2 298146773Ssam 299147899Ssam/* C-Types for Service Config Object */ 300147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_SP 1 301147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_CPSA 2 302147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM 3 303147899Ssam#define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY 4 304147899Ssam 305147899Ssam/* 306147899Ssam * Different link types allowed in the Client Port Service Attributes 307147899Ssam * subobject defined for LMP Service Discovery in the UNI 1.0 spec 308147899Ssam */ 309147899Ssam#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH 5 /* UNI 1.0 Sec 9.4.2 */ 310147899Ssam#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET 6 /* UNI 1.0 Sec 9.4.2 */ 311147899Ssam 312146773Ssam/* 313146773Ssam * the ctypes are not globally unique so for 314146773Ssam * translating it to strings we build a table based 315146773Ssam * on objects offsetted by the ctype 316146773Ssam */ 317146773Ssam 318146773Ssamstatic const struct tok lmp_ctype_values[] = { 319146773Ssam { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" }, 320146773Ssam { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" }, 321146773Ssam { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" }, 322146773Ssam { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" }, 323146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" }, 324146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" }, 325146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" }, 326146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" }, 327146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" }, 328146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" }, 329146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" }, 330146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" }, 331146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" }, 332146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" }, 333146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" }, 334146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" }, 335146773Ssam { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" }, 336146773Ssam { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" }, 337146773Ssam { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" }, 338146773Ssam { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" }, 339146773Ssam { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" }, 340146773Ssam { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" }, 341146773Ssam { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" }, 342146773Ssam { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" }, 343146773Ssam { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" }, 344146773Ssam { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" }, 345146773Ssam { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" }, 346146773Ssam { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" }, 347146773Ssam { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" }, 348146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" }, 349146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" }, 350146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" }, 351146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" }, 352146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" }, 353146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" }, 354146773Ssam { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" }, 355146773Ssam { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" }, 356147899Ssam { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" }, 357147899Ssam { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" }, 358147899Ssam { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" }, 359147899Ssam { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" }, 360146773Ssam { 0, NULL} 361146773Ssam}; 362146773Ssam 363146773Ssamvoid 364146773Ssamlmp_print(register const u_char *pptr, register u_int len) { 365146773Ssam 366146773Ssam const struct lmp_common_header *lmp_com_header; 367146773Ssam const struct lmp_object_header *lmp_obj_header; 368146773Ssam const u_char *tptr,*obj_tptr; 369146773Ssam int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen; 370146773Ssam int hexdump; 371146773Ssam int offset,subobj_type,subobj_len,total_subobj_len; 372147899Ssam int link_type; 373146773Ssam 374146773Ssam union { /* int to float conversion buffer */ 375146773Ssam float f; 376146773Ssam u_int32_t i; 377146773Ssam } bw; 378146773Ssam 379146773Ssam tptr=pptr; 380146773Ssam lmp_com_header = (const struct lmp_common_header *)pptr; 381146773Ssam TCHECK(*lmp_com_header); 382146773Ssam 383146773Ssam /* 384146773Ssam * Sanity checking of the header. 385146773Ssam */ 386146773Ssam if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) { 387146773Ssam printf("LMP version %u packet not supported", 388146773Ssam LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])); 389146773Ssam return; 390146773Ssam } 391146773Ssam 392146773Ssam /* in non-verbose mode just lets print the basic Message Type*/ 393146773Ssam if (vflag < 1) { 394146773Ssam printf("LMPv%u %s Message, length: %u", 395146773Ssam LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]), 396146773Ssam tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type), 397146773Ssam len); 398146773Ssam return; 399146773Ssam } 400146773Ssam 401146773Ssam /* ok they seem to want to know everything - lets fully decode it */ 402146773Ssam 403146773Ssam tlen=EXTRACT_16BITS(lmp_com_header->length); 404146773Ssam 405146773Ssam printf("\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u", 406146773Ssam LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]), 407146773Ssam tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type), 408146773Ssam bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags), 409146773Ssam tlen); 410146773Ssam 411146773Ssam tptr+=sizeof(const struct lmp_common_header); 412146773Ssam tlen-=sizeof(const struct lmp_common_header); 413146773Ssam 414146773Ssam while(tlen>0) { 415146773Ssam /* did we capture enough for fully decoding the object header ? */ 416146773Ssam if (!TTEST2(*tptr, sizeof(struct lmp_object_header))) 417146773Ssam goto trunc; 418146773Ssam 419146773Ssam lmp_obj_header = (const struct lmp_object_header *)tptr; 420146773Ssam lmp_obj_len=EXTRACT_16BITS(lmp_obj_header->length); 421146773Ssam lmp_obj_ctype=(lmp_obj_header->ctype)&0x7f; 422146773Ssam 423146773Ssam if(lmp_obj_len % 4 || lmp_obj_len < 4) 424146773Ssam return; 425146773Ssam 426146773Ssam printf("\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u", 427146773Ssam tok2str(lmp_obj_values, 428146773Ssam "Unknown", 429146773Ssam lmp_obj_header->class_num), 430146773Ssam lmp_obj_header->class_num, 431146773Ssam tok2str(lmp_ctype_values, 432146773Ssam "Unknown", 433146773Ssam ((lmp_obj_header->class_num)<<8)+lmp_obj_ctype), 434146773Ssam lmp_obj_ctype, 435146773Ssam (lmp_obj_header->ctype)&0x80 ? "" : "non-", 436146773Ssam lmp_obj_len); 437146773Ssam 438146773Ssam obj_tptr=tptr+sizeof(struct lmp_object_header); 439146773Ssam obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header); 440146773Ssam 441146773Ssam /* did we capture enough for fully decoding the object ? */ 442146773Ssam if (!TTEST2(*tptr, lmp_obj_len)) 443146773Ssam goto trunc; 444146773Ssam hexdump=FALSE; 445146773Ssam 446146773Ssam switch(lmp_obj_header->class_num) { 447146773Ssam 448146773Ssam case LMP_OBJ_CC_ID: 449146773Ssam switch(lmp_obj_ctype) { 450146773Ssam case LMP_CTYPE_LOC: 451146773Ssam case LMP_CTYPE_RMT: 452146773Ssam printf("\n\t Control Channel ID: %u (0x%08x)", 453146773Ssam EXTRACT_32BITS(obj_tptr), 454146773Ssam EXTRACT_32BITS(obj_tptr)); 455146773Ssam break; 456146773Ssam 457146773Ssam default: 458146773Ssam hexdump=TRUE; 459146773Ssam } 460146773Ssam break; 461146773Ssam 462146773Ssam case LMP_OBJ_LINK_ID: 463146773Ssam case LMP_OBJ_INTERFACE_ID: 464146773Ssam switch(lmp_obj_ctype) { 465146773Ssam case LMP_CTYPE_IPV4_LOC: 466146773Ssam case LMP_CTYPE_IPV4_RMT: 467146773Ssam printf("\n\t IPv4 Link ID: %s (0x%08x)", 468146773Ssam ipaddr_string(obj_tptr), 469146773Ssam EXTRACT_32BITS(obj_tptr)); 470146773Ssam break; 471146773Ssam#ifdef INET6 472146773Ssam case LMP_CTYPE_IPV6_LOC: 473146773Ssam case LMP_CTYPE_IPV6_RMT: 474146773Ssam printf("\n\t IPv6 Link ID: %s (0x%08x)", 475146773Ssam ip6addr_string(obj_tptr), 476146773Ssam EXTRACT_32BITS(obj_tptr)); 477146773Ssam break; 478146773Ssam#endif 479146773Ssam case LMP_CTYPE_UNMD_LOC: 480146773Ssam case LMP_CTYPE_UNMD_RMT: 481146773Ssam printf("\n\t Link ID: %u (0x%08x)", 482146773Ssam EXTRACT_32BITS(obj_tptr), 483146773Ssam EXTRACT_32BITS(obj_tptr)); 484146773Ssam break; 485146773Ssam default: 486146773Ssam hexdump=TRUE; 487146773Ssam } 488146773Ssam break; 489146773Ssam 490146773Ssam case LMP_OBJ_MESSAGE_ID: 491146773Ssam switch(lmp_obj_ctype) { 492146773Ssam case LMP_CTYPE_1: 493146773Ssam printf("\n\t Message ID: %u (0x%08x)", 494146773Ssam EXTRACT_32BITS(obj_tptr), 495146773Ssam EXTRACT_32BITS(obj_tptr)); 496146773Ssam break; 497146773Ssam case LMP_CTYPE_2: 498146773Ssam printf("\n\t Message ID Ack: %u (0x%08x)", 499146773Ssam EXTRACT_32BITS(obj_tptr), 500146773Ssam EXTRACT_32BITS(obj_tptr)); 501146773Ssam break; 502146773Ssam default: 503146773Ssam hexdump=TRUE; 504146773Ssam } 505146773Ssam break; 506146773Ssam 507146773Ssam case LMP_OBJ_NODE_ID: 508146773Ssam switch(lmp_obj_ctype) { 509146773Ssam case LMP_CTYPE_LOC: 510146773Ssam case LMP_CTYPE_RMT: 511146773Ssam printf("\n\t Node ID: %s (0x%08x)", 512146773Ssam ipaddr_string(obj_tptr), 513146773Ssam EXTRACT_32BITS(obj_tptr)); 514146773Ssam break; 515146773Ssam 516146773Ssam default: 517146773Ssam hexdump=TRUE; 518146773Ssam } 519146773Ssam break; 520146773Ssam 521146773Ssam case LMP_OBJ_CONFIG: 522146773Ssam switch(lmp_obj_ctype) { 523146773Ssam case LMP_CTYPE_HELLO_CONFIG: 524146773Ssam printf("\n\t Hello Interval: %u\n\t Hello Dead Interval: %u", 525146773Ssam EXTRACT_16BITS(obj_tptr), 526146773Ssam EXTRACT_16BITS(obj_tptr+2)); 527146773Ssam break; 528146773Ssam 529146773Ssam default: 530146773Ssam hexdump=TRUE; 531146773Ssam } 532146773Ssam break; 533146773Ssam 534146773Ssam case LMP_OBJ_HELLO: 535146773Ssam switch(lmp_obj_ctype) { 536146773Ssam case LMP_CTYPE_HELLO: 537190207Srpaulo printf("\n\t Tx Seq: %u, Rx Seq: %u", 538146773Ssam EXTRACT_32BITS(obj_tptr), 539146773Ssam EXTRACT_32BITS(obj_tptr+4)); 540146773Ssam break; 541146773Ssam 542146773Ssam default: 543146773Ssam hexdump=TRUE; 544146773Ssam } 545146773Ssam break; 546146773Ssam 547146773Ssam case LMP_OBJ_TE_LINK: 548146773Ssam printf("\n\t Flags: [%s]", 549146773Ssam bittok2str(lmp_obj_te_link_flag_values, 550146773Ssam "none", 551146773Ssam EXTRACT_16BITS(obj_tptr)>>8)); 552146773Ssam 553146773Ssam switch(lmp_obj_ctype) { 554146773Ssam case LMP_CTYPE_IPV4: 555146773Ssam printf("\n\t Local Link-ID: %s (0x%08x) \ 556146773Ssam \n\t Remote Link-ID: %s (0x%08x)", 557146773Ssam ipaddr_string(obj_tptr+4), 558146773Ssam EXTRACT_32BITS(obj_tptr+4), 559146773Ssam ipaddr_string(obj_tptr+8), 560146773Ssam EXTRACT_32BITS(obj_tptr+8)); 561146773Ssam break; 562146773Ssam 563146773Ssam#ifdef INET6 564146773Ssam case LMP_CTYPE_IPV6: 565146773Ssam#endif 566146773Ssam case LMP_CTYPE_UNMD: 567146773Ssam default: 568146773Ssam hexdump=TRUE; 569146773Ssam } 570146773Ssam break; 571146773Ssam 572146773Ssam case LMP_OBJ_DATA_LINK: 573146773Ssam printf("\n\t Flags: [%s]", 574146773Ssam bittok2str(lmp_obj_data_link_flag_values, 575146773Ssam "none", 576146773Ssam EXTRACT_16BITS(obj_tptr)>>8)); 577146773Ssam 578146773Ssam switch(lmp_obj_ctype) { 579146773Ssam case LMP_CTYPE_IPV4: 580146773Ssam case LMP_CTYPE_UNMD: 581146773Ssam printf("\n\t Local Interface ID: %s (0x%08x) \ 582146773Ssam \n\t Remote Interface ID: %s (0x%08x)", 583146773Ssam ipaddr_string(obj_tptr+4), 584146773Ssam EXTRACT_32BITS(obj_tptr+4), 585146773Ssam ipaddr_string(obj_tptr+8), 586146773Ssam EXTRACT_32BITS(obj_tptr+8)); 587146773Ssam 588146773Ssam total_subobj_len = lmp_obj_len - 16; 589146773Ssam offset = 12; 590146773Ssam while (total_subobj_len > 0 && hexdump == FALSE ) { 591146773Ssam subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8; 592146773Ssam subobj_len = EXTRACT_16BITS(obj_tptr+offset)&0x00FF; 593146773Ssam printf("\n\t Subobject, Type: %s (%u), Length: %u", 594146773Ssam tok2str(lmp_data_link_subobj, 595146773Ssam "Unknown", 596146773Ssam subobj_type), 597146773Ssam subobj_type, 598146773Ssam subobj_len); 599146773Ssam switch(subobj_type) { 600146773Ssam case INT_SWITCHING_TYPE_SUBOBJ: 601172683Smlaier printf("\n\t Switching Type: %s (%u)", 602146773Ssam tok2str(gmpls_switch_cap_values, 603146773Ssam "Unknown", 604146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)>>8), 605146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)>>8); 606172683Smlaier printf("\n\t Encoding Type: %s (%u)", 607146773Ssam tok2str(gmpls_encoding_values, 608146773Ssam "Unknown", 609146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF), 610146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF); 611146773Ssam bw.i = EXTRACT_32BITS(obj_tptr+offset+4); 612172683Smlaier printf("\n\t Min Reservable Bandwidth: %.3f Mbps", 613172683Smlaier bw.f*8/1000000); 614146773Ssam bw.i = EXTRACT_32BITS(obj_tptr+offset+8); 615172683Smlaier printf("\n\t Max Reservable Bandwidth: %.3f Mbps", 616172683Smlaier bw.f*8/1000000); 617146773Ssam break; 618146773Ssam case WAVELENGTH_SUBOBJ: 619172683Smlaier printf("\n\t Wavelength: %u", 620146773Ssam EXTRACT_32BITS(obj_tptr+offset+4)); 621146773Ssam break; 622146773Ssam default: 623146773Ssam /* Any Unknown Subobject ==> Exit loop */ 624146773Ssam hexdump=TRUE; 625146773Ssam break; 626146773Ssam } 627146773Ssam total_subobj_len-=subobj_len; 628146773Ssam offset+=subobj_len; 629146773Ssam } 630146773Ssam 631146773Ssam break; 632146773Ssam#ifdef INET6 633146773Ssam case LMP_CTYPE_IPV6: 634146773Ssam#endif 635146773Ssam default: 636146773Ssam hexdump=TRUE; 637146773Ssam } 638146773Ssam break; 639146773Ssam 640146773Ssam case LMP_OBJ_VERIFY_BEGIN: 641146773Ssam switch(lmp_obj_ctype) { 642146773Ssam case LMP_CTYPE_1: 643146773Ssam printf("\n\t Flags: %s", 644146773Ssam bittok2str(lmp_obj_begin_verify_flag_values, 645146773Ssam "none", 646146773Ssam EXTRACT_16BITS(obj_tptr))); 647146773Ssam printf("\n\t Verify Interval: %u", 648146773Ssam EXTRACT_16BITS(obj_tptr+2)); 649146773Ssam printf("\n\t Data links: %u", 650146773Ssam EXTRACT_32BITS(obj_tptr+4)); 651146773Ssam printf("\n\t Encoding type: %s", 652146773Ssam tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))); 653146773Ssam printf("\n\t Verify Tranport Mechanism: %u (0x%x) %s", 654146773Ssam EXTRACT_16BITS(obj_tptr+10), 655146773Ssam EXTRACT_16BITS(obj_tptr+10), 656146773Ssam EXTRACT_16BITS(obj_tptr+10)&8000 ? "(Payload test messages capable)" : ""); 657146773Ssam bw.i = EXTRACT_32BITS(obj_tptr+12); 658172683Smlaier printf("\n\t Transmission Rate: %.3f Mbps",bw.f*8/1000000); 659146773Ssam printf("\n\t Wavelength: %u", 660146773Ssam EXTRACT_32BITS(obj_tptr+16)); 661146773Ssam break; 662146773Ssam 663146773Ssam default: 664146773Ssam hexdump=TRUE; 665146773Ssam } 666146773Ssam break; 667146773Ssam 668146773Ssam case LMP_OBJ_VERIFY_BEGIN_ACK: 669146773Ssam switch(lmp_obj_ctype) { 670146773Ssam case LMP_CTYPE_1: 671146773Ssam printf("\n\t Verify Dead Interval: %u \ 672146773Ssam \n\t Verify Transport Response: %u", 673146773Ssam EXTRACT_16BITS(obj_tptr), 674146773Ssam EXTRACT_16BITS(obj_tptr+2)); 675146773Ssam break; 676146773Ssam 677146773Ssam default: 678146773Ssam hexdump=TRUE; 679146773Ssam } 680146773Ssam break; 681146773Ssam 682146773Ssam case LMP_OBJ_VERIFY_ID: 683146773Ssam switch(lmp_obj_ctype) { 684146773Ssam case LMP_CTYPE_1: 685146773Ssam printf("\n\t Verify ID: %u", 686146773Ssam EXTRACT_32BITS(obj_tptr)); 687146773Ssam break; 688146773Ssam 689146773Ssam default: 690146773Ssam hexdump=TRUE; 691146773Ssam } 692146773Ssam break; 693146773Ssam 694146773Ssam case LMP_OBJ_CHANNEL_STATUS: 695146773Ssam switch(lmp_obj_ctype) { 696146773Ssam case LMP_CTYPE_IPV4: 697146773Ssam case LMP_CTYPE_UNMD: 698146773Ssam offset = 0; 699146773Ssam /* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */ 700146773Ssam while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) { 701146773Ssam printf("\n\t Interface ID: %s (0x%08x)", 702146773Ssam ipaddr_string(obj_tptr+offset), 703146773Ssam EXTRACT_32BITS(obj_tptr+offset)); 704146773Ssam 705146773Ssam printf("\n\t\t Active: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ? 706146773Ssam "Allocated" : "Non-allocated", 707146773Ssam (EXTRACT_32BITS(obj_tptr+offset+4)>>31)); 708146773Ssam 709146773Ssam printf("\n\t\t Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ? 710146773Ssam "Transmit" : "Receive", 711146773Ssam (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1); 712146773Ssam 713146773Ssam printf("\n\t\t Channel Status: %s (%u)", 714146773Ssam tok2str(lmp_obj_channel_status_values, 715146773Ssam "Unknown", 716146773Ssam EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF), 717146773Ssam EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF); 718146773Ssam offset+=8; 719146773Ssam } 720146773Ssam break; 721146773Ssam#ifdef INET6 722146773Ssam case LMP_CTYPE_IPV6: 723146773Ssam#endif 724146773Ssam default: 725146773Ssam hexdump=TRUE; 726146773Ssam } 727146773Ssam break; 728146773Ssam 729146773Ssam case LMP_OBJ_CHANNEL_STATUS_REQ: 730146773Ssam switch(lmp_obj_ctype) { 731146773Ssam case LMP_CTYPE_IPV4: 732146773Ssam case LMP_CTYPE_UNMD: 733146773Ssam offset = 0; 734146773Ssam while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) { 735146773Ssam printf("\n\t Interface ID: %s (0x%08x)", 736146773Ssam ipaddr_string(obj_tptr+offset), 737146773Ssam EXTRACT_32BITS(obj_tptr+offset)); 738146773Ssam offset+=4; 739146773Ssam } 740146773Ssam break; 741146773Ssam#ifdef INET6 742146773Ssam case LMP_CTYPE_IPV6: 743146773Ssam#endif 744146773Ssam default: 745146773Ssam hexdump=TRUE; 746146773Ssam } 747146773Ssam break; 748146773Ssam 749146773Ssam case LMP_OBJ_ERROR_CODE: 750146773Ssam switch(lmp_obj_ctype) { 751146773Ssam case LMP_CTYPE_BEGIN_VERIFY_ERROR: 752146773Ssam printf("\n\t Error Code: %s", 753146773Ssam bittok2str(lmp_obj_begin_verify_error_values, 754146773Ssam "none", 755146773Ssam EXTRACT_32BITS(obj_tptr))); 756146773Ssam break; 757146773Ssam 758146773Ssam case LMP_CTYPE_LINK_SUMMARY_ERROR: 759146773Ssam printf("\n\t Error Code: %s", 760146773Ssam bittok2str(lmp_obj_link_summary_error_values, 761146773Ssam "none", 762146773Ssam EXTRACT_32BITS(obj_tptr))); 763146773Ssam break; 764146773Ssam default: 765146773Ssam hexdump=TRUE; 766146773Ssam } 767146773Ssam break; 768147899Ssam 769147899Ssam case LMP_OBJ_SERVICE_CONFIG: 770147899Ssam switch (lmp_obj_ctype) { 771147899Ssam case LMP_CTYPE_SERVICE_CONFIG_SP: 772147899Ssam 773147899Ssam printf("\n\t Flags: %s", 774147899Ssam bittok2str(lmp_obj_service_config_sp_flag_values, 775147899Ssam "none", 776147899Ssam EXTRACT_16BITS(obj_tptr)>>8)); 777147899Ssam 778147899Ssam printf("\n\t UNI Version: %u", 779147899Ssam EXTRACT_16BITS(obj_tptr) & 0x00FF); 780147899Ssam 781147899Ssam break; 782147899Ssam 783147899Ssam case LMP_CTYPE_SERVICE_CONFIG_CPSA: 784147899Ssam 785147899Ssam link_type = EXTRACT_16BITS(obj_tptr)>>8; 786147899Ssam 787147899Ssam printf("\n\t Link Type: %s (%u)", 788147899Ssam tok2str(lmp_sd_service_config_cpsa_link_type_values, 789147899Ssam "Unknown", link_type), 790147899Ssam link_type); 791147899Ssam 792147899Ssam if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH) { 793147899Ssam printf("\n\t Signal Type: %s (%u)", 794147899Ssam tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values, 795147899Ssam "Unknown", 796147899Ssam EXTRACT_16BITS(obj_tptr) & 0x00FF), 797147899Ssam EXTRACT_16BITS(obj_tptr) & 0x00FF); 798147899Ssam } 799147899Ssam 800147899Ssam if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET) { 801147899Ssam printf("\n\t Signal Type: %s (%u)", 802147899Ssam tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values, 803147899Ssam "Unknown", 804147899Ssam EXTRACT_16BITS(obj_tptr) & 0x00FF), 805147899Ssam EXTRACT_16BITS(obj_tptr) & 0x00FF); 806147899Ssam } 807147899Ssam 808147899Ssam printf("\n\t Transparency: %s", 809147899Ssam bittok2str(lmp_obj_service_config_cpsa_tp_flag_values, 810147899Ssam "none", 811147899Ssam EXTRACT_16BITS(obj_tptr+2)>>8)); 812147899Ssam 813147899Ssam printf("\n\t Contiguous Concatenation Types: %s", 814147899Ssam bittok2str(lmp_obj_service_config_cpsa_cct_flag_values, 815147899Ssam "none", 816147899Ssam EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF)); 817147899Ssam 818147899Ssam printf("\n\t Minimum NCC: %u", 819147899Ssam EXTRACT_16BITS(obj_tptr+4)); 820147899Ssam 821147899Ssam printf("\n\t Maximum NCC: %u", 822147899Ssam EXTRACT_16BITS(obj_tptr+6)); 823147899Ssam 824147899Ssam printf("\n\t Minimum NVC:%u", 825147899Ssam EXTRACT_16BITS(obj_tptr+8)); 826147899Ssam 827147899Ssam printf("\n\t Maximum NVC:%u", 828147899Ssam EXTRACT_16BITS(obj_tptr+10)); 829147899Ssam 830147899Ssam printf("\n\t Local Interface ID: %s (0x%08x)", 831147899Ssam ipaddr_string(obj_tptr+12), 832147899Ssam EXTRACT_32BITS(obj_tptr+12)); 833147899Ssam 834147899Ssam break; 835147899Ssam 836147899Ssam case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM: 837147899Ssam 838147899Ssam printf("\n\t Transparency Flags: %s", 839147899Ssam bittok2str( 840147899Ssam lmp_obj_service_config_nsa_transparency_flag_values, 841147899Ssam "none", 842147899Ssam EXTRACT_32BITS(obj_tptr))); 843147899Ssam 844147899Ssam printf("\n\t TCM Monitoring Flags: %s", 845147899Ssam bittok2str( 846147899Ssam lmp_obj_service_config_nsa_tcm_flag_values, 847147899Ssam "none", 848147899Ssam EXTRACT_16BITS(obj_tptr+6) & 0x00FF)); 849147899Ssam 850147899Ssam break; 851147899Ssam 852147899Ssam case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY: 853147899Ssam 854147899Ssam printf("\n\t Diversity: Flags: %s", 855147899Ssam bittok2str( 856147899Ssam lmp_obj_service_config_nsa_network_diversity_flag_values, 857147899Ssam "none", 858147899Ssam EXTRACT_16BITS(obj_tptr+2) & 0x00FF)); 859147899Ssam break; 860147899Ssam 861147899Ssam default: 862147899Ssam hexdump = TRUE; 863147899Ssam }; 864147899Ssam 865147899Ssam break; 866147899Ssam 867146773Ssam default: 868146773Ssam if (vflag <= 1) 869146773Ssam print_unknown_data(obj_tptr,"\n\t ",obj_tlen); 870146773Ssam break; 871146773Ssam } 872146773Ssam /* do we want to see an additionally hexdump ? */ 873146773Ssam if (vflag > 1 || hexdump==TRUE) 874252283Sdelphij print_unknown_data(tptr+sizeof(struct lmp_object_header),"\n\t ", 875146773Ssam lmp_obj_len-sizeof(struct lmp_object_header)); 876146773Ssam 877146773Ssam tptr+=lmp_obj_len; 878146773Ssam tlen-=lmp_obj_len; 879146773Ssam } 880146773Ssam return; 881146773Ssamtrunc: 882146773Ssam printf("\n\t\t packet exceeded snapshot"); 883146773Ssam} 884