print-lmp.c revision 190207
13229Spst/* 23229Spst * Redistribution and use in source and binary forms, with or without 33229Spst * modification, are permitted provided that: (1) source code 43229Spst * distributions retain the above copyright notice and this paragraph 53229Spst * in its entirety, and (2) distributions including binary code include 63229Spst * the above copyright notice and this paragraph in its entirety in 73229Spst * the documentation or other materials provided with the distribution. 83229Spst * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 918471Swosch * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 1050476Speter * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 113229Spst * FOR A PARTICULAR PURPOSE. 123229Spst * 133229Spst * Support for the Link Management Protocol as per rfc 4204. 143229Spst * 153229Spst * Original code by Hannes Gredler (hannes@juniper.net) 1613575Spst * Support for LMP service discovery extensions (defined by UNI 1.0) added 1713575Spst * by Manu Pathak (mapathak@cisco.com), May 2005 1813575Spst */ 1913575Spst 203229Spst#ifndef lint 2169793Sobrienstatic const char rcsid[] _U_ = 2284125Siedowse "@(#) $Header: /tcpdump/master/tcpdump/print-lmp.c,v 1.11 2007-08-02 17:32:49 hannes Exp $"; 233229Spst#endif 243229Spst 2513575Spst#ifdef HAVE_CONFIG_H 263229Spst#include "config.h" 273229Spst#endif 283229Spst 293229Spst#include <tcpdump-stdinc.h> 303229Spst 313229Spst#include <stdio.h> 323229Spst#include <stdlib.h> 333229Spst#include <string.h> 343229Spst 353229Spst#include "interface.h" 363229Spst#include "extract.h" 373229Spst#include "addrtoname.h" 383229Spst#include "gmpls.h" 393229Spst 403229Spst/* 413229Spst * LMP common header 423229Spst * 433229Spst * 0 1 2 3 443229Spst * 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 453229Spst * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 463229Spst * | Vers | (Reserved) | Flags | Msg Type | 473229Spst * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 483229Spst * | LMP Length | (Reserved) | 493229Spst * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 503229Spst */ 513229Spst 523229Spststruct lmp_common_header { 533229Spst u_int8_t version_res[2]; 543229Spst u_int8_t flags; 553229Spst u_int8_t msg_type; 563229Spst u_int8_t length[2]; 573229Spst u_int8_t reserved[2]; 583229Spst}; 593229Spst 603229Spst#define LMP_VERSION 1 613229Spst#define LMP_EXTRACT_VERSION(x) (((x)&0xf0)>>4) 623229Spst 633229Spststatic const struct tok lmp_header_flag_values[] = { 643229Spst { 0x01, "Control Channel Down"}, 653229Spst { 0x02, "LMP restart"}, 663229Spst { 0, NULL} 673229Spst}; 683229Spst 693229Spststatic const struct tok lmp_obj_te_link_flag_values[] = { 703229Spst { 0x01, "Fault Management Supported"}, 713229Spst { 0x02, "Link Verification Supported"}, 723229Spst { 0, NULL} 733229Spst}; 743229Spst 753229Spststatic const struct tok lmp_obj_data_link_flag_values[] = { 763229Spst { 0x01, "Data Link Port"}, 773229Spst { 0x02, "Allocated for user traffic"}, 783229Spst { 0x04, "Failed link"}, 793229Spst { 0, NULL} 803229Spst}; 813229Spst 823229Spststatic const struct tok lmp_obj_channel_status_values[] = { 833229Spst { 1, "Signal Okay"}, 843229Spst { 2, "Signal Degraded"}, 853229Spst { 3, "Signal Fail"}, 863229Spst { 0, NULL} 873229Spst}; 883229Spst 893229Spststatic const struct tok lmp_obj_begin_verify_flag_values[] = { 903229Spst { 0x0001, "Verify all links"}, 913229Spst { 0x0002, "Data link type"}, 923229Spst { 0, NULL} 933229Spst}; 943229Spst 953229Spststatic const struct tok lmp_obj_begin_verify_error_values[] = { 963229Spst { 0x01, "Link Verification Procedure Not supported"}, 973229Spst { 0x02, "Unwilling to verify"}, 983229Spst { 0x04, "Unsupported verification transport mechanism"}, 993229Spst { 0x08, "Link-Id configuration error"}, 1003229Spst { 0x10, "Unknown object c-type"}, 1013229Spst { 0, NULL} 1023229Spst}; 1033229Spst 1043229Spststatic const struct tok lmp_obj_link_summary_error_values[] = { 1053229Spst { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"}, 1063229Spst { 0x02, "Renegotiate LINK-SUMMARY parameters"}, 1073229Spst { 0x04, "Invalid TE-LINK Object"}, 1083229Spst { 0x08, "Invalid DATA-LINK Object"}, 1093229Spst { 0x10, "Unknown TE-LINK Object c-type"}, 1103229Spst { 0x20, "Unknown DATA-LINK Object c-type"}, 1113229Spst { 0, NULL} 1123229Spst}; 1134131Sjkh 1143229Spst/* Service Config Supported Protocols Flags */ 1153229Spststatic const struct tok lmp_obj_service_config_sp_flag_values[] = { 11620287Swollman { 0x01, "RSVP Supported"}, 1173229Spst { 0x02, "LDP Supported"}, 1183229Spst { 0, NULL} 1193229Spst}; 1203229Spst 12184125Siedowse/* Service Config Client Port Service Attribute Transparency Flags */ 1223229Spststatic const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = { 1233229Spst { 0x01, "Path/VC Overhead Transparency Supported"}, 1243229Spst { 0x02, "Line/MS Overhead Transparency Supported"}, 1253229Spst { 0x04, "Section/RS Overhead Transparency Supported"}, 1263229Spst { 0, NULL} 1273229Spst}; 12884125Siedowse 1293229Spst/* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */ 1303229Spststatic const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = { 1313229Spst { 0x01, "Contiguous Concatenation Types Supported"}, 1323229Spst { 0, NULL} 1333229Spst}; 1343229Spst 1353229Spst/* Service Config Network Service Attributes Transparency Flags */ 1363229Spststatic const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = { 1373229Spst { 0x01, "Standard SOH/RSOH Transparency Supported"}, 1383229Spst { 0x02, "Standard LOH/MSOH Transparency Supported"}, 1393229Spst { 0, NULL} 1403229Spst}; 1413229Spst 1423229Spst/* Service Config Network Service Attributes TCM Monitoring Flags */ 1433229Spststatic const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = { 1443229Spst { 0x01, "Transparent Tandem Connection Monitoring Supported"}, 1453229Spst { 0, NULL} 1463229Spst}; 1473229Spst 1483229Spst/* Network Service Attributes Network Diversity Flags */ 1493229Spststatic const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = { 1503229Spst { 0x01, "Node Diversity Supported"}, 1513229Spst { 0x02, "Link Diversity Supported"}, 1523229Spst { 0x04, "SRLG Diversity Supported"}, 1533229Spst { 0, NULL} 1543229Spst}; 1553229Spst 1563229Spst#define LMP_MSGTYPE_CONFIG 1 1573229Spst#define LMP_MSGTYPE_CONFIG_ACK 2 1583229Spst#define LMP_MSGTYPE_CONFIG_NACK 3 1593229Spst#define LMP_MSGTYPE_HELLO 4 1603229Spst#define LMP_MSGTYPE_VERIFY_BEGIN 5 1613229Spst#define LMP_MSGTYPE_VERIFY_BEGIN_ACK 6 1623229Spst#define LMP_MSGTYPE_VERIFY_BEGIN_NACK 7 1633229Spst#define LMP_MSGTYPE_VERIFY_END 8 1643229Spst#define LMP_MSGTYPE_VERIFY_END_ACK 9 1653229Spst#define LMP_MSGTYPE_TEST 10 1663229Spst#define LMP_MSGTYPE_TEST_STATUS_SUCCESS 11 1673229Spst#define LMP_MSGTYPE_TEST_STATUS_FAILURE 12 1683229Spst#define LMP_MSGTYPE_TEST_STATUS_ACK 13 1693229Spst#define LMP_MSGTYPE_LINK_SUMMARY 14 1703229Spst#define LMP_MSGTYPE_LINK_SUMMARY_ACK 15 1713229Spst#define LMP_MSGTYPE_LINK_SUMMARY_NACK 16 1723229Spst#define LMP_MSGTYPE_CHANNEL_STATUS 17 1733229Spst#define LMP_MSGTYPE_CHANNEL_STATUS_ACK 18 1743229Spst#define LMP_MSGTYPE_CHANNEL_STATUS_REQ 19 1753229Spst#define LMP_MSGTYPE_CHANNEL_STATUS_RESP 20 1763229Spst/* LMP Service Discovery message types defined by UNI 1.0 */ 1773229Spst#define LMP_MSGTYPE_SERVICE_CONFIG 50 1783229Spst#define LMP_MSGTYPE_SERVICE_CONFIG_ACK 51 1793229Spst#define LMP_MSGTYPE_SERVICE_CONFIG_NACK 52 1803229Spst 1813229Spststatic const struct tok lmp_msg_type_values[] = { 18213575Spst { LMP_MSGTYPE_CONFIG, "Config"}, 1833229Spst { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"}, 1843229Spst { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"}, 1853229Spst { LMP_MSGTYPE_HELLO, "Hello"}, 1863229Spst { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"}, 18713575Spst { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"}, 1883229Spst { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"}, 1893229Spst { LMP_MSGTYPE_VERIFY_END, "End Verify"}, 1903229Spst { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"}, 1913229Spst { LMP_MSGTYPE_TEST, "Test"}, 1923229Spst { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"}, 1933229Spst { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"}, 1943229Spst { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"}, 1953229Spst { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"}, 1963229Spst { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"}, 1973229Spst { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"}, 1983229Spst { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"}, 1993229Spst { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"}, 2003229Spst { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"}, 20169793Sobrien { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"}, 2023229Spst { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"}, 2033229Spst { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"}, 2043229Spst { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"}, 2053229Spst { 0, NULL} 2063229Spst}; 2073229Spst 2083229Spst/* 2093229Spst * LMP object header 2103229Spst * 2113229Spst * 0 1 2 3 2123229Spst * 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 2133229Spst * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2143229Spst * |N| C-Type | Class | Length | 2153229Spst * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2163229Spst * | | 2173229Spst * // (object contents) // 2183229Spst * | | 2193229Spst * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2203229Spst */ 2213229Spst 2223229Spststruct lmp_object_header { 2233229Spst u_int8_t ctype; 2243229Spst u_int8_t class_num; 2253229Spst u_int8_t length[2]; 2263229Spst}; 2273229Spst 2283229Spst#define LMP_OBJ_CC_ID 1 2293229Spst#define LMP_OBJ_NODE_ID 2 2303229Spst#define LMP_OBJ_LINK_ID 3 2313229Spst#define LMP_OBJ_INTERFACE_ID 4 2323229Spst#define LMP_OBJ_MESSAGE_ID 5 2333229Spst#define LMP_OBJ_CONFIG 6 2343229Spst#define LMP_OBJ_HELLO 7 2353229Spst#define LMP_OBJ_VERIFY_BEGIN 8 2363229Spst#define LMP_OBJ_VERIFY_BEGIN_ACK 9 2373229Spst#define LMP_OBJ_VERIFY_ID 10 2383229Spst#define LMP_OBJ_TE_LINK 11 2393229Spst#define LMP_OBJ_DATA_LINK 12 2403229Spst#define LMP_OBJ_CHANNEL_STATUS 13 2413229Spst#define LMP_OBJ_CHANNEL_STATUS_REQ 14 2423229Spst#define LMP_OBJ_ERROR_CODE 20 2433229Spst 2443229Spst#define LMP_OBJ_SERVICE_CONFIG 51 /* defined in UNI 1.0 */ 2453229Spst 2463229Spststatic const struct tok lmp_obj_values[] = { 2473229Spst { LMP_OBJ_CC_ID, "Control Channel ID" }, 2483229Spst { LMP_OBJ_NODE_ID, "Node ID" }, 2493229Spst { LMP_OBJ_LINK_ID, "Link ID" }, 2503229Spst { LMP_OBJ_INTERFACE_ID, "Interface ID" }, 2513229Spst { LMP_OBJ_MESSAGE_ID, "Message ID" }, 2523229Spst { LMP_OBJ_CONFIG, "Configuration" }, 2533229Spst { LMP_OBJ_HELLO, "Hello" }, 2543229Spst { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" }, 2553229Spst { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" }, 2563229Spst { LMP_OBJ_VERIFY_ID, "Verify ID" }, 2573229Spst { LMP_OBJ_TE_LINK, "TE Link" }, 2583229Spst { LMP_OBJ_DATA_LINK, "Data Link" }, 2593229Spst { LMP_OBJ_CHANNEL_STATUS, "Channel Status" }, 2603229Spst { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" }, 2613229Spst { LMP_OBJ_ERROR_CODE, "Error Code" }, 2623229Spst { LMP_OBJ_SERVICE_CONFIG, "Service Config" }, 2633229Spst 2643229Spst { 0, NULL} 2653229Spst}; 2663229Spst 2673229Spst#define INT_SWITCHING_TYPE_SUBOBJ 1 2683229Spst#define WAVELENGTH_SUBOBJ 2 2693229Spst 2703229Spststatic const struct tok lmp_data_link_subobj[] = { 2713229Spst { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" }, 2723229Spst { WAVELENGTH_SUBOBJ , "Wavelength" }, 2733229Spst { 0, NULL} 2743229Spst}; 2753229Spst 2763229Spst#define LMP_CTYPE_IPV4 1 2773229Spst#define LMP_CTYPE_IPV6 2 2783229Spst 2793229Spst#define LMP_CTYPE_LOC 1 2803229Spst#define LMP_CTYPE_RMT 2 2813229Spst#define LMP_CTYPE_UNMD 3 2823229Spst 2833229Spst#define LMP_CTYPE_IPV4_LOC 1 2843229Spst#define LMP_CTYPE_IPV4_RMT 2 2853229Spst#define LMP_CTYPE_IPV6_LOC 3 2863229Spst#define LMP_CTYPE_IPV6_RMT 4 2873229Spst#define LMP_CTYPE_UNMD_LOC 5 2883229Spst#define LMP_CTYPE_UNMD_RMT 6 2893229Spst 2903229Spst#define LMP_CTYPE_1 1 2913229Spst#define LMP_CTYPE_2 2 2923229Spst 2933229Spst#define LMP_CTYPE_HELLO_CONFIG 1 2943229Spst#define LMP_CTYPE_HELLO 1 2953229Spst 2963229Spst#define LMP_CTYPE_BEGIN_VERIFY_ERROR 1 2973229Spst#define LMP_CTYPE_LINK_SUMMARY_ERROR 2 2983229Spst 2993229Spst/* C-Types for Service Config Object */ 3003229Spst#define LMP_CTYPE_SERVICE_CONFIG_SP 1 3013229Spst#define LMP_CTYPE_SERVICE_CONFIG_CPSA 2 3023229Spst#define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM 3 3033229Spst#define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY 4 3043229Spst 3053229Spst/* 3063229Spst * Different link types allowed in the Client Port Service Attributes 3073229Spst * subobject defined for LMP Service Discovery in the UNI 1.0 spec 3083229Spst */ 3093229Spst#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH 5 /* UNI 1.0 Sec 9.4.2 */ 3103229Spst#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET 6 /* UNI 1.0 Sec 9.4.2 */ 3113229Spst 3123229Spst/* 3133229Spst * the ctypes are not globally unique so for 3143229Spst * translating it to strings we build a table based 3153229Spst * on objects offsetted by the ctype 3163229Spst */ 3173229Spst 3183229Spststatic const struct tok lmp_ctype_values[] = { 3193229Spst { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" }, 3203229Spst { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" }, 3213229Spst { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" }, 3223229Spst { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" }, 3233229Spst { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" }, 32413575Spst { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" }, 3253229Spst { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" }, 3263229Spst { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" }, 32713575Spst { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" }, 32813575Spst { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" }, 3293229Spst { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" }, 3303229Spst { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" }, 3313229Spst { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" }, 3323229Spst { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" }, 3333229Spst { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" }, 3343229Spst { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" }, 33513575Spst { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" }, 3363229Spst { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" }, 3373229Spst { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" }, 33813575Spst { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" }, 3393229Spst { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" }, 34013575Spst { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" }, 3413229Spst { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" }, 3423229Spst { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" }, 3433229Spst { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" }, 3443229Spst { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" }, 3453229Spst { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" }, 3463229Spst { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" }, 34713575Spst { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" }, 34813575Spst { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" }, 3493229Spst { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" }, 3503229Spst { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" }, 3513229Spst { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" }, 3523229Spst { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" }, 3533229Spst { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" }, 3543229Spst { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" }, 3553229Spst { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" }, 3563229Spst { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" }, 35713575Spst { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" }, 3583229Spst { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" }, 3593229Spst { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" }, 3603229Spst { 0, NULL} 3613229Spst}; 3623229Spst 3633229Spstvoid 3643229Spstlmp_print(register const u_char *pptr, register u_int len) { 36513575Spst 3663229Spst const struct lmp_common_header *lmp_com_header; 3673229Spst const struct lmp_object_header *lmp_obj_header; 3683229Spst const u_char *tptr,*obj_tptr; 3693229Spst int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen; 37013575Spst int hexdump; 3713229Spst int offset,subobj_type,subobj_len,total_subobj_len; 3723229Spst int link_type; 3733229Spst 3743229Spst union { /* int to float conversion buffer */ 3753229Spst float f; 3763229Spst u_int32_t i; 3773229Spst } bw; 3783229Spst 3793229Spst tptr=pptr; 3803229Spst lmp_com_header = (const struct lmp_common_header *)pptr; 3813229Spst TCHECK(*lmp_com_header); 3823229Spst 3833229Spst /* 3843229Spst * Sanity checking of the header. 3853229Spst */ 3863229Spst if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) { 3873229Spst printf("LMP version %u packet not supported", 3883229Spst LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])); 3893229Spst return; 390 } 391 392 /* in non-verbose mode just lets print the basic Message Type*/ 393 if (vflag < 1) { 394 printf("LMPv%u %s Message, length: %u", 395 LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]), 396 tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type), 397 len); 398 return; 399 } 400 401 /* ok they seem to want to know everything - lets fully decode it */ 402 403 tlen=EXTRACT_16BITS(lmp_com_header->length); 404 405 printf("\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u", 406 LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]), 407 tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type), 408 bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags), 409 tlen); 410 411 tptr+=sizeof(const struct lmp_common_header); 412 tlen-=sizeof(const struct lmp_common_header); 413 414 while(tlen>0) { 415 /* did we capture enough for fully decoding the object header ? */ 416 if (!TTEST2(*tptr, sizeof(struct lmp_object_header))) 417 goto trunc; 418 419 lmp_obj_header = (const struct lmp_object_header *)tptr; 420 lmp_obj_len=EXTRACT_16BITS(lmp_obj_header->length); 421 lmp_obj_ctype=(lmp_obj_header->ctype)&0x7f; 422 423 if(lmp_obj_len % 4 || lmp_obj_len < 4) 424 return; 425 426 printf("\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u", 427 tok2str(lmp_obj_values, 428 "Unknown", 429 lmp_obj_header->class_num), 430 lmp_obj_header->class_num, 431 tok2str(lmp_ctype_values, 432 "Unknown", 433 ((lmp_obj_header->class_num)<<8)+lmp_obj_ctype), 434 lmp_obj_ctype, 435 (lmp_obj_header->ctype)&0x80 ? "" : "non-", 436 lmp_obj_len); 437 438 obj_tptr=tptr+sizeof(struct lmp_object_header); 439 obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header); 440 441 /* did we capture enough for fully decoding the object ? */ 442 if (!TTEST2(*tptr, lmp_obj_len)) 443 goto trunc; 444 hexdump=FALSE; 445 446 switch(lmp_obj_header->class_num) { 447 448 case LMP_OBJ_CC_ID: 449 switch(lmp_obj_ctype) { 450 case LMP_CTYPE_LOC: 451 case LMP_CTYPE_RMT: 452 printf("\n\t Control Channel ID: %u (0x%08x)", 453 EXTRACT_32BITS(obj_tptr), 454 EXTRACT_32BITS(obj_tptr)); 455 break; 456 457 default: 458 hexdump=TRUE; 459 } 460 break; 461 462 case LMP_OBJ_LINK_ID: 463 case LMP_OBJ_INTERFACE_ID: 464 switch(lmp_obj_ctype) { 465 case LMP_CTYPE_IPV4_LOC: 466 case LMP_CTYPE_IPV4_RMT: 467 printf("\n\t IPv4 Link ID: %s (0x%08x)", 468 ipaddr_string(obj_tptr), 469 EXTRACT_32BITS(obj_tptr)); 470 break; 471#ifdef INET6 472 case LMP_CTYPE_IPV6_LOC: 473 case LMP_CTYPE_IPV6_RMT: 474 printf("\n\t IPv6 Link ID: %s (0x%08x)", 475 ip6addr_string(obj_tptr), 476 EXTRACT_32BITS(obj_tptr)); 477 break; 478#endif 479 case LMP_CTYPE_UNMD_LOC: 480 case LMP_CTYPE_UNMD_RMT: 481 printf("\n\t Link ID: %u (0x%08x)", 482 EXTRACT_32BITS(obj_tptr), 483 EXTRACT_32BITS(obj_tptr)); 484 break; 485 default: 486 hexdump=TRUE; 487 } 488 break; 489 490 case LMP_OBJ_MESSAGE_ID: 491 switch(lmp_obj_ctype) { 492 case LMP_CTYPE_1: 493 printf("\n\t Message ID: %u (0x%08x)", 494 EXTRACT_32BITS(obj_tptr), 495 EXTRACT_32BITS(obj_tptr)); 496 break; 497 case LMP_CTYPE_2: 498 printf("\n\t Message ID Ack: %u (0x%08x)", 499 EXTRACT_32BITS(obj_tptr), 500 EXTRACT_32BITS(obj_tptr)); 501 break; 502 default: 503 hexdump=TRUE; 504 } 505 break; 506 507 case LMP_OBJ_NODE_ID: 508 switch(lmp_obj_ctype) { 509 case LMP_CTYPE_LOC: 510 case LMP_CTYPE_RMT: 511 printf("\n\t Node ID: %s (0x%08x)", 512 ipaddr_string(obj_tptr), 513 EXTRACT_32BITS(obj_tptr)); 514 break; 515 516 default: 517 hexdump=TRUE; 518 } 519 break; 520 521 case LMP_OBJ_CONFIG: 522 switch(lmp_obj_ctype) { 523 case LMP_CTYPE_HELLO_CONFIG: 524 printf("\n\t Hello Interval: %u\n\t Hello Dead Interval: %u", 525 EXTRACT_16BITS(obj_tptr), 526 EXTRACT_16BITS(obj_tptr+2)); 527 break; 528 529 default: 530 hexdump=TRUE; 531 } 532 break; 533 534 case LMP_OBJ_HELLO: 535 switch(lmp_obj_ctype) { 536 case LMP_CTYPE_HELLO: 537 printf("\n\t Tx Seq: %u, Rx Seq: %u", 538 EXTRACT_32BITS(obj_tptr), 539 EXTRACT_32BITS(obj_tptr+4)); 540 break; 541 542 default: 543 hexdump=TRUE; 544 } 545 break; 546 547 case LMP_OBJ_TE_LINK: 548 printf("\n\t Flags: [%s]", 549 bittok2str(lmp_obj_te_link_flag_values, 550 "none", 551 EXTRACT_16BITS(obj_tptr)>>8)); 552 553 switch(lmp_obj_ctype) { 554 case LMP_CTYPE_IPV4: 555 printf("\n\t Local Link-ID: %s (0x%08x) \ 556 \n\t Remote Link-ID: %s (0x%08x)", 557 ipaddr_string(obj_tptr+4), 558 EXTRACT_32BITS(obj_tptr+4), 559 ipaddr_string(obj_tptr+8), 560 EXTRACT_32BITS(obj_tptr+8)); 561 break; 562 563#ifdef INET6 564 case LMP_CTYPE_IPV6: 565#endif 566 case LMP_CTYPE_UNMD: 567 default: 568 hexdump=TRUE; 569 } 570 break; 571 572 case LMP_OBJ_DATA_LINK: 573 printf("\n\t Flags: [%s]", 574 bittok2str(lmp_obj_data_link_flag_values, 575 "none", 576 EXTRACT_16BITS(obj_tptr)>>8)); 577 578 switch(lmp_obj_ctype) { 579 case LMP_CTYPE_IPV4: 580 case LMP_CTYPE_UNMD: 581 printf("\n\t Local Interface ID: %s (0x%08x) \ 582 \n\t Remote Interface ID: %s (0x%08x)", 583 ipaddr_string(obj_tptr+4), 584 EXTRACT_32BITS(obj_tptr+4), 585 ipaddr_string(obj_tptr+8), 586 EXTRACT_32BITS(obj_tptr+8)); 587 588 total_subobj_len = lmp_obj_len - 16; 589 offset = 12; 590 while (total_subobj_len > 0 && hexdump == FALSE ) { 591 subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8; 592 subobj_len = EXTRACT_16BITS(obj_tptr+offset)&0x00FF; 593 printf("\n\t Subobject, Type: %s (%u), Length: %u", 594 tok2str(lmp_data_link_subobj, 595 "Unknown", 596 subobj_type), 597 subobj_type, 598 subobj_len); 599 switch(subobj_type) { 600 case INT_SWITCHING_TYPE_SUBOBJ: 601 printf("\n\t Switching Type: %s (%u)", 602 tok2str(gmpls_switch_cap_values, 603 "Unknown", 604 EXTRACT_16BITS(obj_tptr+offset+2)>>8), 605 EXTRACT_16BITS(obj_tptr+offset+2)>>8); 606 printf("\n\t Encoding Type: %s (%u)", 607 tok2str(gmpls_encoding_values, 608 "Unknown", 609 EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF), 610 EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF); 611 bw.i = EXTRACT_32BITS(obj_tptr+offset+4); 612 printf("\n\t Min Reservable Bandwidth: %.3f Mbps", 613 bw.f*8/1000000); 614 bw.i = EXTRACT_32BITS(obj_tptr+offset+8); 615 printf("\n\t Max Reservable Bandwidth: %.3f Mbps", 616 bw.f*8/1000000); 617 break; 618 case WAVELENGTH_SUBOBJ: 619 printf("\n\t Wavelength: %u", 620 EXTRACT_32BITS(obj_tptr+offset+4)); 621 break; 622 default: 623 /* Any Unknown Subobject ==> Exit loop */ 624 hexdump=TRUE; 625 break; 626 } 627 total_subobj_len-=subobj_len; 628 offset+=subobj_len; 629 } 630 631 break; 632#ifdef INET6 633 case LMP_CTYPE_IPV6: 634#endif 635 default: 636 hexdump=TRUE; 637 } 638 break; 639 640 case LMP_OBJ_VERIFY_BEGIN: 641 switch(lmp_obj_ctype) { 642 case LMP_CTYPE_1: 643 printf("\n\t Flags: %s", 644 bittok2str(lmp_obj_begin_verify_flag_values, 645 "none", 646 EXTRACT_16BITS(obj_tptr))); 647 printf("\n\t Verify Interval: %u", 648 EXTRACT_16BITS(obj_tptr+2)); 649 printf("\n\t Data links: %u", 650 EXTRACT_32BITS(obj_tptr+4)); 651 printf("\n\t Encoding type: %s", 652 tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))); 653 printf("\n\t Verify Tranport Mechanism: %u (0x%x) %s", 654 EXTRACT_16BITS(obj_tptr+10), 655 EXTRACT_16BITS(obj_tptr+10), 656 EXTRACT_16BITS(obj_tptr+10)&8000 ? "(Payload test messages capable)" : ""); 657 bw.i = EXTRACT_32BITS(obj_tptr+12); 658 printf("\n\t Transmission Rate: %.3f Mbps",bw.f*8/1000000); 659 printf("\n\t Wavelength: %u", 660 EXTRACT_32BITS(obj_tptr+16)); 661 break; 662 663 default: 664 hexdump=TRUE; 665 } 666 break; 667 668 case LMP_OBJ_VERIFY_BEGIN_ACK: 669 switch(lmp_obj_ctype) { 670 case LMP_CTYPE_1: 671 printf("\n\t Verify Dead Interval: %u \ 672 \n\t Verify Transport Response: %u", 673 EXTRACT_16BITS(obj_tptr), 674 EXTRACT_16BITS(obj_tptr+2)); 675 break; 676 677 default: 678 hexdump=TRUE; 679 } 680 break; 681 682 case LMP_OBJ_VERIFY_ID: 683 switch(lmp_obj_ctype) { 684 case LMP_CTYPE_1: 685 printf("\n\t Verify ID: %u", 686 EXTRACT_32BITS(obj_tptr)); 687 break; 688 689 default: 690 hexdump=TRUE; 691 } 692 break; 693 694 case LMP_OBJ_CHANNEL_STATUS: 695 switch(lmp_obj_ctype) { 696 case LMP_CTYPE_IPV4: 697 case LMP_CTYPE_UNMD: 698 offset = 0; 699 /* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */ 700 while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) { 701 printf("\n\t Interface ID: %s (0x%08x)", 702 ipaddr_string(obj_tptr+offset), 703 EXTRACT_32BITS(obj_tptr+offset)); 704 705 printf("\n\t\t Active: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ? 706 "Allocated" : "Non-allocated", 707 (EXTRACT_32BITS(obj_tptr+offset+4)>>31)); 708 709 printf("\n\t\t Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ? 710 "Transmit" : "Receive", 711 (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1); 712 713 printf("\n\t\t Channel Status: %s (%u)", 714 tok2str(lmp_obj_channel_status_values, 715 "Unknown", 716 EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF), 717 EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF); 718 offset+=8; 719 } 720 break; 721#ifdef INET6 722 case LMP_CTYPE_IPV6: 723#endif 724 default: 725 hexdump=TRUE; 726 } 727 break; 728 729 case LMP_OBJ_CHANNEL_STATUS_REQ: 730 switch(lmp_obj_ctype) { 731 case LMP_CTYPE_IPV4: 732 case LMP_CTYPE_UNMD: 733 offset = 0; 734 while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) { 735 printf("\n\t Interface ID: %s (0x%08x)", 736 ipaddr_string(obj_tptr+offset), 737 EXTRACT_32BITS(obj_tptr+offset)); 738 offset+=4; 739 } 740 break; 741#ifdef INET6 742 case LMP_CTYPE_IPV6: 743#endif 744 default: 745 hexdump=TRUE; 746 } 747 break; 748 749 case LMP_OBJ_ERROR_CODE: 750 switch(lmp_obj_ctype) { 751 case LMP_CTYPE_BEGIN_VERIFY_ERROR: 752 printf("\n\t Error Code: %s", 753 bittok2str(lmp_obj_begin_verify_error_values, 754 "none", 755 EXTRACT_32BITS(obj_tptr))); 756 break; 757 758 case LMP_CTYPE_LINK_SUMMARY_ERROR: 759 printf("\n\t Error Code: %s", 760 bittok2str(lmp_obj_link_summary_error_values, 761 "none", 762 EXTRACT_32BITS(obj_tptr))); 763 break; 764 default: 765 hexdump=TRUE; 766 } 767 break; 768 769 case LMP_OBJ_SERVICE_CONFIG: 770 switch (lmp_obj_ctype) { 771 case LMP_CTYPE_SERVICE_CONFIG_SP: 772 773 printf("\n\t Flags: %s", 774 bittok2str(lmp_obj_service_config_sp_flag_values, 775 "none", 776 EXTRACT_16BITS(obj_tptr)>>8)); 777 778 printf("\n\t UNI Version: %u", 779 EXTRACT_16BITS(obj_tptr) & 0x00FF); 780 781 break; 782 783 case LMP_CTYPE_SERVICE_CONFIG_CPSA: 784 785 link_type = EXTRACT_16BITS(obj_tptr)>>8; 786 787 printf("\n\t Link Type: %s (%u)", 788 tok2str(lmp_sd_service_config_cpsa_link_type_values, 789 "Unknown", link_type), 790 link_type); 791 792 if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH) { 793 printf("\n\t Signal Type: %s (%u)", 794 tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values, 795 "Unknown", 796 EXTRACT_16BITS(obj_tptr) & 0x00FF), 797 EXTRACT_16BITS(obj_tptr) & 0x00FF); 798 } 799 800 if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET) { 801 printf("\n\t Signal Type: %s (%u)", 802 tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values, 803 "Unknown", 804 EXTRACT_16BITS(obj_tptr) & 0x00FF), 805 EXTRACT_16BITS(obj_tptr) & 0x00FF); 806 } 807 808 printf("\n\t Transparency: %s", 809 bittok2str(lmp_obj_service_config_cpsa_tp_flag_values, 810 "none", 811 EXTRACT_16BITS(obj_tptr+2)>>8)); 812 813 printf("\n\t Contiguous Concatenation Types: %s", 814 bittok2str(lmp_obj_service_config_cpsa_cct_flag_values, 815 "none", 816 EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF)); 817 818 printf("\n\t Minimum NCC: %u", 819 EXTRACT_16BITS(obj_tptr+4)); 820 821 printf("\n\t Maximum NCC: %u", 822 EXTRACT_16BITS(obj_tptr+6)); 823 824 printf("\n\t Minimum NVC:%u", 825 EXTRACT_16BITS(obj_tptr+8)); 826 827 printf("\n\t Maximum NVC:%u", 828 EXTRACT_16BITS(obj_tptr+10)); 829 830 printf("\n\t Local Interface ID: %s (0x%08x)", 831 ipaddr_string(obj_tptr+12), 832 EXTRACT_32BITS(obj_tptr+12)); 833 834 break; 835 836 case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM: 837 838 printf("\n\t Transparency Flags: %s", 839 bittok2str( 840 lmp_obj_service_config_nsa_transparency_flag_values, 841 "none", 842 EXTRACT_32BITS(obj_tptr))); 843 844 printf("\n\t TCM Monitoring Flags: %s", 845 bittok2str( 846 lmp_obj_service_config_nsa_tcm_flag_values, 847 "none", 848 EXTRACT_16BITS(obj_tptr+6) & 0x00FF)); 849 850 break; 851 852 case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY: 853 854 printf("\n\t Diversity: Flags: %s", 855 bittok2str( 856 lmp_obj_service_config_nsa_network_diversity_flag_values, 857 "none", 858 EXTRACT_16BITS(obj_tptr+2) & 0x00FF)); 859 break; 860 861 default: 862 hexdump = TRUE; 863 }; 864 865 break; 866 867 default: 868 if (vflag <= 1) 869 print_unknown_data(obj_tptr,"\n\t ",obj_tlen); 870 break; 871 } 872 /* do we want to see an additionally hexdump ? */ 873 if (vflag > 1 || hexdump==TRUE) 874 print_unknown_data(tptr+sizeof(sizeof(struct lmp_object_header)),"\n\t ", 875 lmp_obj_len-sizeof(struct lmp_object_header)); 876 877 tptr+=lmp_obj_len; 878 tlen-=lmp_obj_len; 879 } 880 return; 881trunc: 882 printf("\n\t\t packet exceeded snapshot"); 883} 884