print-lmp.c revision 146773
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 * 13146773Ssam * Original code by Hannes Gredler (hannes@juniper.net) 14146773Ssam */ 15146773Ssam 16146773Ssam#ifndef lint 17146773Ssamstatic const char rcsid[] _U_ = 18146773Ssam "@(#) $Header: /tcpdump/master/tcpdump/print-lmp.c,v 1.5 2004/04/27 14:03:44 hannes Exp $"; 19146773Ssam#endif 20146773Ssam 21146773Ssam#ifdef HAVE_CONFIG_H 22146773Ssam#include "config.h" 23146773Ssam#endif 24146773Ssam 25146773Ssam#include <tcpdump-stdinc.h> 26146773Ssam 27146773Ssam#include <stdio.h> 28146773Ssam#include <stdlib.h> 29146773Ssam#include <string.h> 30146773Ssam 31146773Ssam#include "interface.h" 32146773Ssam#include "extract.h" 33146773Ssam#include "addrtoname.h" 34146773Ssam#include "gmpls.h" 35146773Ssam 36146773Ssam/* 37146773Ssam * LMP common header 38146773Ssam * 39146773Ssam * 0 1 2 3 40146773Ssam * 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 41146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 42146773Ssam * | Vers | (Reserved) | Flags | Msg Type | 43146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 44146773Ssam * | LMP Length | (Reserved) | 45146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46146773Ssam */ 47146773Ssam 48146773Ssamstruct lmp_common_header { 49146773Ssam u_int8_t version_res[2]; 50146773Ssam u_int8_t flags; 51146773Ssam u_int8_t msg_type; 52146773Ssam u_int8_t length[2]; 53146773Ssam u_int8_t reserved[2]; 54146773Ssam}; 55146773Ssam 56146773Ssam#define LMP_VERSION 1 57146773Ssam#define LMP_EXTRACT_VERSION(x) (((x)&0xf0)>>4) 58146773Ssam 59146773Ssamstatic const struct tok lmp_header_flag_values[] = { 60146773Ssam { 0x00, "Control Channel Down"}, 61146773Ssam { 0x02, "LMP restart"}, 62146773Ssam { 0, NULL} 63146773Ssam}; 64146773Ssam 65146773Ssamstatic const struct tok lmp_obj_te_link_flag_values[] = { 66146773Ssam { 0x01, "Fault Management Supported"}, 67146773Ssam { 0x02, "Link Verification Supported"}, 68146773Ssam { 0, NULL} 69146773Ssam}; 70146773Ssam 71146773Ssamstatic const struct tok lmp_obj_data_link_flag_values[] = { 72146773Ssam { 0x01, "Data Link Port"}, 73146773Ssam { 0x02, "Allocated for user traffic"}, 74146773Ssam { 0x04, "Failed link"}, 75146773Ssam { 0, NULL} 76146773Ssam}; 77146773Ssam 78146773Ssamstatic const struct tok lmp_obj_channel_status_values[] = { 79146773Ssam { 1, "Signal Okay"}, 80146773Ssam { 2, "Signal Degraded"}, 81146773Ssam { 3, "Signal Fail"}, 82146773Ssam { 0, NULL} 83146773Ssam}; 84146773Ssam 85146773Ssamstatic const struct tok lmp_obj_begin_verify_flag_values[] = { 86146773Ssam { 0x0001, "Verify all links"}, 87146773Ssam { 0x0002, "Data link type"}, 88146773Ssam { 0, NULL} 89146773Ssam}; 90146773Ssam 91146773Ssamstatic const struct tok lmp_obj_begin_verify_error_values[] = { 92146773Ssam { 0x01, "\n\t\tLink Verification Procedure Not supported"}, 93146773Ssam { 0x02, "\n\t\tUnwilling to verify"}, 94146773Ssam { 0x04, "\n\t\tUnsupported verification transport mechanism"}, 95146773Ssam { 0x08, "\n\t\tLink_Id configuration error"}, 96146773Ssam { 0x10, "\n\t\tUnknown object c-type"}, 97146773Ssam { 0, NULL} 98146773Ssam}; 99146773Ssam 100146773Ssamstatic const struct tok lmp_obj_link_summary_error_values[] = { 101146773Ssam { 0x01, "\n\t\tUnacceptable non-negotiable LINK_SUMMARY parameters"}, 102146773Ssam { 0x02, "\n\t\tRenegotiate LINK_SUMMARY parameters"}, 103146773Ssam { 0x04, "\n\t\tInvalid TE-LINK Object"}, 104146773Ssam { 0x08, "\n\t\tInvalid DATA-LINK Object"}, 105146773Ssam { 0x10, "\n\t\tUnknown TE-LINK Object c-type"}, 106146773Ssam { 0x20, "\n\t\tUnknown DATA-LINK Object c-type"}, 107146773Ssam { 0, NULL} 108146773Ssam}; 109146773Ssam 110146773Ssam#define LMP_MSGTYPE_CONFIG 1 111146773Ssam#define LMP_MSGTYPE_CONFIG_ACK 2 112146773Ssam#define LMP_MSGTYPE_CONFIG_NACK 3 113146773Ssam#define LMP_MSGTYPE_HELLO 4 114146773Ssam#define LMP_MSGTYPE_VERIFY_BEGIN 5 115146773Ssam#define LMP_MSGTYPE_VERIFY_BEGIN_ACK 6 116146773Ssam#define LMP_MSGTYPE_VERIFY_BEGIN_NACK 7 117146773Ssam#define LMP_MSGTYPE_VERIFY_END 8 118146773Ssam#define LMP_MSGTYPE_VERIFY_END_ACK 9 119146773Ssam#define LMP_MSGTYPE_TEST 10 120146773Ssam#define LMP_MSGTYPE_TEST_STATUS_SUCCESS 11 121146773Ssam#define LMP_MSGTYPE_TEST_STATUS_FAILURE 12 122146773Ssam#define LMP_MSGTYPE_TEST_STATUS_ACK 13 123146773Ssam#define LMP_MSGTYPE_LINK_SUMMARY 14 124146773Ssam#define LMP_MSGTYPE_LINK_SUMMARY_ACK 15 125146773Ssam#define LMP_MSGTYPE_LINK_SUMMARY_NACK 16 126146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS 17 127146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS_ACK 18 128146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS_REQ 19 129146773Ssam#define LMP_MSGTYPE_CHANNEL_STATUS_RESP 20 130146773Ssam 131146773Ssamstatic const struct tok lmp_msg_type_values[] = { 132146773Ssam { LMP_MSGTYPE_CONFIG, "Config"}, 133146773Ssam { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"}, 134146773Ssam { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"}, 135146773Ssam { LMP_MSGTYPE_HELLO, "Hello"}, 136146773Ssam { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"}, 137146773Ssam { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"}, 138146773Ssam { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"}, 139146773Ssam { LMP_MSGTYPE_VERIFY_END, "End Verify"}, 140146773Ssam { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"}, 141146773Ssam { LMP_MSGTYPE_TEST, "Test"}, 142146773Ssam { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"}, 143146773Ssam { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"}, 144146773Ssam { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"}, 145146773Ssam { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"}, 146146773Ssam { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"}, 147146773Ssam { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"}, 148146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"}, 149146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"}, 150146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"}, 151146773Ssam { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"}, 152146773Ssam { 0, NULL} 153146773Ssam}; 154146773Ssam 155146773Ssam/* 156146773Ssam * LMP object header 157146773Ssam * 158146773Ssam * 0 1 2 3 159146773Ssam * 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 160146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 161146773Ssam * |N| C-Type | Class | Length | 162146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 163146773Ssam * | | 164146773Ssam * // (object contents) // 165146773Ssam * | | 166146773Ssam * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 167146773Ssam */ 168146773Ssam 169146773Ssamstruct lmp_object_header { 170146773Ssam u_int8_t ctype; 171146773Ssam u_int8_t class_num; 172146773Ssam u_int8_t length[2]; 173146773Ssam}; 174146773Ssam 175146773Ssam#define LMP_OBJ_CC_ID 1 176146773Ssam#define LMP_OBJ_NODE_ID 2 177146773Ssam#define LMP_OBJ_LINK_ID 3 178146773Ssam#define LMP_OBJ_INTERFACE_ID 4 179146773Ssam#define LMP_OBJ_MESSAGE_ID 5 180146773Ssam#define LMP_OBJ_CONFIG 6 181146773Ssam#define LMP_OBJ_HELLO 7 182146773Ssam#define LMP_OBJ_VERIFY_BEGIN 8 183146773Ssam#define LMP_OBJ_VERIFY_BEGIN_ACK 9 184146773Ssam#define LMP_OBJ_VERIFY_ID 10 185146773Ssam#define LMP_OBJ_TE_LINK 11 186146773Ssam#define LMP_OBJ_DATA_LINK 12 187146773Ssam#define LMP_OBJ_CHANNEL_STATUS 13 188146773Ssam#define LMP_OBJ_CHANNEL_STATUS_REQ 14 189146773Ssam#define LMP_OBJ_ERROR_CODE 20 190146773Ssam 191146773Ssamstatic const struct tok lmp_obj_values[] = { 192146773Ssam { LMP_OBJ_CC_ID, "Control Channel ID" }, 193146773Ssam { LMP_OBJ_NODE_ID, "Node ID" }, 194146773Ssam { LMP_OBJ_LINK_ID, "Link ID" }, 195146773Ssam { LMP_OBJ_INTERFACE_ID, "Interface ID" }, 196146773Ssam { LMP_OBJ_MESSAGE_ID, "Message ID" }, 197146773Ssam { LMP_OBJ_CONFIG, "Configuration" }, 198146773Ssam { LMP_OBJ_HELLO, "Hello" }, 199146773Ssam { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" }, 200146773Ssam { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" }, 201146773Ssam { LMP_OBJ_VERIFY_ID, "Verify ID" }, 202146773Ssam { LMP_OBJ_TE_LINK, "TE Link" }, 203146773Ssam { LMP_OBJ_DATA_LINK, "Data Link" }, 204146773Ssam { LMP_OBJ_CHANNEL_STATUS, "Channel Status" }, 205146773Ssam { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" }, 206146773Ssam { LMP_OBJ_ERROR_CODE, "Error Code" }, 207146773Ssam { 0, NULL} 208146773Ssam}; 209146773Ssam 210146773Ssam#define INT_SWITCHING_TYPE_SUBOBJ 1 211146773Ssam#define WAVELENGTH_SUBOBJ 2 212146773Ssam 213146773Ssamstatic const struct tok lmp_data_link_subobj[] = { 214146773Ssam { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" }, 215146773Ssam { WAVELENGTH_SUBOBJ , "Wavelength" }, 216146773Ssam { 0, NULL} 217146773Ssam}; 218146773Ssam 219146773Ssam#define LMP_CTYPE_IPV4 1 220146773Ssam#define LMP_CTYPE_IPV6 2 221146773Ssam 222146773Ssam#define LMP_CTYPE_LOC 1 223146773Ssam#define LMP_CTYPE_RMT 2 224146773Ssam#define LMP_CTYPE_UNMD 3 225146773Ssam 226146773Ssam#define LMP_CTYPE_IPV4_LOC 1 227146773Ssam#define LMP_CTYPE_IPV4_RMT 2 228146773Ssam#define LMP_CTYPE_IPV6_LOC 3 229146773Ssam#define LMP_CTYPE_IPV6_RMT 4 230146773Ssam#define LMP_CTYPE_UNMD_LOC 5 231146773Ssam#define LMP_CTYPE_UNMD_RMT 6 232146773Ssam 233146773Ssam#define LMP_CTYPE_1 1 234146773Ssam#define LMP_CTYPE_2 2 235146773Ssam 236146773Ssam#define LMP_CTYPE_HELLO_CONFIG 1 237146773Ssam#define LMP_CTYPE_HELLO 1 238146773Ssam 239146773Ssam#define LMP_CTYPE_BEGIN_VERIFY_ERROR 1 240146773Ssam#define LMP_CTYPE_LINK_SUMMARY_ERROR 2 241146773Ssam 242146773Ssam#define FALSE 0 243146773Ssam#define TRUE 1 244146773Ssam 245146773Ssam/* 246146773Ssam * the ctypes are not globally unique so for 247146773Ssam * translating it to strings we build a table based 248146773Ssam * on objects offsetted by the ctype 249146773Ssam */ 250146773Ssam 251146773Ssamstatic const struct tok lmp_ctype_values[] = { 252146773Ssam { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" }, 253146773Ssam { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" }, 254146773Ssam { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" }, 255146773Ssam { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" }, 256146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" }, 257146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" }, 258146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" }, 259146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" }, 260146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" }, 261146773Ssam { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" }, 262146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" }, 263146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" }, 264146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" }, 265146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" }, 266146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" }, 267146773Ssam { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" }, 268146773Ssam { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" }, 269146773Ssam { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" }, 270146773Ssam { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" }, 271146773Ssam { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" }, 272146773Ssam { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" }, 273146773Ssam { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" }, 274146773Ssam { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" }, 275146773Ssam { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" }, 276146773Ssam { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" }, 277146773Ssam { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" }, 278146773Ssam { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" }, 279146773Ssam { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" }, 280146773Ssam { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" }, 281146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" }, 282146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" }, 283146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" }, 284146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" }, 285146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" }, 286146773Ssam { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" }, 287146773Ssam { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" }, 288146773Ssam { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" }, 289146773Ssam { 0, NULL} 290146773Ssam}; 291146773Ssam 292146773Ssamvoid 293146773Ssamlmp_print(register const u_char *pptr, register u_int len) { 294146773Ssam 295146773Ssam const struct lmp_common_header *lmp_com_header; 296146773Ssam const struct lmp_object_header *lmp_obj_header; 297146773Ssam const u_char *tptr,*obj_tptr; 298146773Ssam int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen; 299146773Ssam int hexdump; 300146773Ssam int offset,subobj_type,subobj_len,total_subobj_len; 301146773Ssam 302146773Ssam union { /* int to float conversion buffer */ 303146773Ssam float f; 304146773Ssam u_int32_t i; 305146773Ssam } bw; 306146773Ssam 307146773Ssam tptr=pptr; 308146773Ssam lmp_com_header = (const struct lmp_common_header *)pptr; 309146773Ssam TCHECK(*lmp_com_header); 310146773Ssam 311146773Ssam /* 312146773Ssam * Sanity checking of the header. 313146773Ssam */ 314146773Ssam if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) { 315146773Ssam printf("LMP version %u packet not supported", 316146773Ssam LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])); 317146773Ssam return; 318146773Ssam } 319146773Ssam 320146773Ssam /* in non-verbose mode just lets print the basic Message Type*/ 321146773Ssam if (vflag < 1) { 322146773Ssam printf("LMPv%u %s Message, length: %u", 323146773Ssam LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]), 324146773Ssam tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type), 325146773Ssam len); 326146773Ssam return; 327146773Ssam } 328146773Ssam 329146773Ssam /* ok they seem to want to know everything - lets fully decode it */ 330146773Ssam 331146773Ssam tlen=EXTRACT_16BITS(lmp_com_header->length); 332146773Ssam 333146773Ssam printf("\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u", 334146773Ssam LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]), 335146773Ssam tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type), 336146773Ssam bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags), 337146773Ssam tlen); 338146773Ssam 339146773Ssam tptr+=sizeof(const struct lmp_common_header); 340146773Ssam tlen-=sizeof(const struct lmp_common_header); 341146773Ssam 342146773Ssam while(tlen>0) { 343146773Ssam /* did we capture enough for fully decoding the object header ? */ 344146773Ssam if (!TTEST2(*tptr, sizeof(struct lmp_object_header))) 345146773Ssam goto trunc; 346146773Ssam 347146773Ssam lmp_obj_header = (const struct lmp_object_header *)tptr; 348146773Ssam lmp_obj_len=EXTRACT_16BITS(lmp_obj_header->length); 349146773Ssam lmp_obj_ctype=(lmp_obj_header->ctype)&0x7f; 350146773Ssam 351146773Ssam if(lmp_obj_len % 4 || lmp_obj_len < 4) 352146773Ssam return; 353146773Ssam 354146773Ssam printf("\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u", 355146773Ssam tok2str(lmp_obj_values, 356146773Ssam "Unknown", 357146773Ssam lmp_obj_header->class_num), 358146773Ssam lmp_obj_header->class_num, 359146773Ssam tok2str(lmp_ctype_values, 360146773Ssam "Unknown", 361146773Ssam ((lmp_obj_header->class_num)<<8)+lmp_obj_ctype), 362146773Ssam lmp_obj_ctype, 363146773Ssam (lmp_obj_header->ctype)&0x80 ? "" : "non-", 364146773Ssam lmp_obj_len); 365146773Ssam 366146773Ssam obj_tptr=tptr+sizeof(struct lmp_object_header); 367146773Ssam obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header); 368146773Ssam 369146773Ssam /* did we capture enough for fully decoding the object ? */ 370146773Ssam if (!TTEST2(*tptr, lmp_obj_len)) 371146773Ssam goto trunc; 372146773Ssam hexdump=FALSE; 373146773Ssam 374146773Ssam switch(lmp_obj_header->class_num) { 375146773Ssam 376146773Ssam case LMP_OBJ_CC_ID: 377146773Ssam switch(lmp_obj_ctype) { 378146773Ssam case LMP_CTYPE_LOC: 379146773Ssam case LMP_CTYPE_RMT: 380146773Ssam printf("\n\t Control Channel ID: %u (0x%08x)", 381146773Ssam EXTRACT_32BITS(obj_tptr), 382146773Ssam EXTRACT_32BITS(obj_tptr)); 383146773Ssam break; 384146773Ssam 385146773Ssam default: 386146773Ssam hexdump=TRUE; 387146773Ssam } 388146773Ssam break; 389146773Ssam 390146773Ssam case LMP_OBJ_LINK_ID: 391146773Ssam case LMP_OBJ_INTERFACE_ID: 392146773Ssam switch(lmp_obj_ctype) { 393146773Ssam case LMP_CTYPE_IPV4_LOC: 394146773Ssam case LMP_CTYPE_IPV4_RMT: 395146773Ssam printf("\n\t IPv4 Link ID: %s (0x%08x)", 396146773Ssam ipaddr_string(obj_tptr), 397146773Ssam EXTRACT_32BITS(obj_tptr)); 398146773Ssam break; 399146773Ssam#ifdef INET6 400146773Ssam case LMP_CTYPE_IPV6_LOC: 401146773Ssam case LMP_CTYPE_IPV6_RMT: 402146773Ssam printf("\n\t IPv6 Link ID: %s (0x%08x)", 403146773Ssam ip6addr_string(obj_tptr), 404146773Ssam EXTRACT_32BITS(obj_tptr)); 405146773Ssam break; 406146773Ssam#endif 407146773Ssam case LMP_CTYPE_UNMD_LOC: 408146773Ssam case LMP_CTYPE_UNMD_RMT: 409146773Ssam printf("\n\t Link ID: %u (0x%08x)", 410146773Ssam EXTRACT_32BITS(obj_tptr), 411146773Ssam EXTRACT_32BITS(obj_tptr)); 412146773Ssam break; 413146773Ssam default: 414146773Ssam hexdump=TRUE; 415146773Ssam } 416146773Ssam break; 417146773Ssam 418146773Ssam case LMP_OBJ_MESSAGE_ID: 419146773Ssam switch(lmp_obj_ctype) { 420146773Ssam case LMP_CTYPE_1: 421146773Ssam printf("\n\t Message ID: %u (0x%08x)", 422146773Ssam EXTRACT_32BITS(obj_tptr), 423146773Ssam EXTRACT_32BITS(obj_tptr)); 424146773Ssam break; 425146773Ssam case LMP_CTYPE_2: 426146773Ssam printf("\n\t Message ID Ack: %u (0x%08x)", 427146773Ssam EXTRACT_32BITS(obj_tptr), 428146773Ssam EXTRACT_32BITS(obj_tptr)); 429146773Ssam break; 430146773Ssam default: 431146773Ssam hexdump=TRUE; 432146773Ssam } 433146773Ssam break; 434146773Ssam 435146773Ssam case LMP_OBJ_NODE_ID: 436146773Ssam switch(lmp_obj_ctype) { 437146773Ssam case LMP_CTYPE_LOC: 438146773Ssam case LMP_CTYPE_RMT: 439146773Ssam printf("\n\t Node ID: %s (0x%08x)", 440146773Ssam ipaddr_string(obj_tptr), 441146773Ssam EXTRACT_32BITS(obj_tptr)); 442146773Ssam break; 443146773Ssam 444146773Ssam default: 445146773Ssam hexdump=TRUE; 446146773Ssam } 447146773Ssam break; 448146773Ssam 449146773Ssam case LMP_OBJ_CONFIG: 450146773Ssam switch(lmp_obj_ctype) { 451146773Ssam case LMP_CTYPE_HELLO_CONFIG: 452146773Ssam printf("\n\t Hello Interval: %u\n\t Hello Dead Interval: %u", 453146773Ssam EXTRACT_16BITS(obj_tptr), 454146773Ssam EXTRACT_16BITS(obj_tptr+2)); 455146773Ssam break; 456146773Ssam 457146773Ssam default: 458146773Ssam hexdump=TRUE; 459146773Ssam } 460146773Ssam break; 461146773Ssam 462146773Ssam case LMP_OBJ_HELLO: 463146773Ssam switch(lmp_obj_ctype) { 464146773Ssam case LMP_CTYPE_HELLO: 465146773Ssam printf("\n\t TxSeqNum: %u\n\t RcvSeqNum: %u", 466146773Ssam EXTRACT_32BITS(obj_tptr), 467146773Ssam EXTRACT_32BITS(obj_tptr+4)); 468146773Ssam break; 469146773Ssam 470146773Ssam default: 471146773Ssam hexdump=TRUE; 472146773Ssam } 473146773Ssam break; 474146773Ssam 475146773Ssam case LMP_OBJ_TE_LINK: 476146773Ssam printf("\n\t Flags: [%s]", 477146773Ssam bittok2str(lmp_obj_te_link_flag_values, 478146773Ssam "none", 479146773Ssam EXTRACT_16BITS(obj_tptr)>>8)); 480146773Ssam 481146773Ssam switch(lmp_obj_ctype) { 482146773Ssam case LMP_CTYPE_IPV4: 483146773Ssam printf("\n\t Local Link-ID: %s (0x%08x) \ 484146773Ssam \n\t Remote Link-ID: %s (0x%08x)", 485146773Ssam ipaddr_string(obj_tptr+4), 486146773Ssam EXTRACT_32BITS(obj_tptr+4), 487146773Ssam ipaddr_string(obj_tptr+8), 488146773Ssam EXTRACT_32BITS(obj_tptr+8)); 489146773Ssam break; 490146773Ssam 491146773Ssam#ifdef INET6 492146773Ssam case LMP_CTYPE_IPV6: 493146773Ssam#endif 494146773Ssam case LMP_CTYPE_UNMD: 495146773Ssam default: 496146773Ssam hexdump=TRUE; 497146773Ssam } 498146773Ssam break; 499146773Ssam 500146773Ssam case LMP_OBJ_DATA_LINK: 501146773Ssam printf("\n\t Flags: [%s]", 502146773Ssam bittok2str(lmp_obj_data_link_flag_values, 503146773Ssam "none", 504146773Ssam EXTRACT_16BITS(obj_tptr)>>8)); 505146773Ssam 506146773Ssam switch(lmp_obj_ctype) { 507146773Ssam case LMP_CTYPE_IPV4: 508146773Ssam case LMP_CTYPE_UNMD: 509146773Ssam printf("\n\t Local Interface ID: %s (0x%08x) \ 510146773Ssam \n\t Remote Interface ID: %s (0x%08x)", 511146773Ssam ipaddr_string(obj_tptr+4), 512146773Ssam EXTRACT_32BITS(obj_tptr+4), 513146773Ssam ipaddr_string(obj_tptr+8), 514146773Ssam EXTRACT_32BITS(obj_tptr+8)); 515146773Ssam 516146773Ssam total_subobj_len = lmp_obj_len - 16; 517146773Ssam offset = 12; 518146773Ssam while (total_subobj_len > 0 && hexdump == FALSE ) { 519146773Ssam subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8; 520146773Ssam subobj_len = EXTRACT_16BITS(obj_tptr+offset)&0x00FF; 521146773Ssam printf("\n\t Subobject, Type: %s (%u), Length: %u", 522146773Ssam tok2str(lmp_data_link_subobj, 523146773Ssam "Unknown", 524146773Ssam subobj_type), 525146773Ssam subobj_type, 526146773Ssam subobj_len); 527146773Ssam switch(subobj_type) { 528146773Ssam case INT_SWITCHING_TYPE_SUBOBJ: 529146773Ssam printf("\n\t\t Switching Type: %s (%u)", 530146773Ssam tok2str(gmpls_switch_cap_values, 531146773Ssam "Unknown", 532146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)>>8), 533146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)>>8); 534146773Ssam printf("\n\t\t Encoding Type: %s (%u)", 535146773Ssam tok2str(gmpls_encoding_values, 536146773Ssam "Unknown", 537146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF), 538146773Ssam EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF); 539146773Ssam bw.i = EXTRACT_32BITS(obj_tptr+offset+4); 540146773Ssam printf("\n\t\t Min Reservable Bandwidth: %.3f Mbps", 541146773Ssam bw.f); 542146773Ssam bw.i = EXTRACT_32BITS(obj_tptr+offset+8); 543146773Ssam printf("\n\t\t Max Reservable Bandwidth: %.3f Mbps", 544146773Ssam bw.f); 545146773Ssam break; 546146773Ssam case WAVELENGTH_SUBOBJ: 547146773Ssam printf("\n\t\t Wavelength: %u", 548146773Ssam EXTRACT_32BITS(obj_tptr+offset+4)); 549146773Ssam break; 550146773Ssam default: 551146773Ssam /* Any Unknown Subobject ==> Exit loop */ 552146773Ssam hexdump=TRUE; 553146773Ssam break; 554146773Ssam } 555146773Ssam total_subobj_len-=subobj_len; 556146773Ssam offset+=subobj_len; 557146773Ssam } 558146773Ssam 559146773Ssam break; 560146773Ssam#ifdef INET6 561146773Ssam case LMP_CTYPE_IPV6: 562146773Ssam#endif 563146773Ssam default: 564146773Ssam hexdump=TRUE; 565146773Ssam } 566146773Ssam break; 567146773Ssam 568146773Ssam case LMP_OBJ_VERIFY_BEGIN: 569146773Ssam switch(lmp_obj_ctype) { 570146773Ssam case LMP_CTYPE_1: 571146773Ssam printf("\n\t Flags: %s", 572146773Ssam bittok2str(lmp_obj_begin_verify_flag_values, 573146773Ssam "none", 574146773Ssam EXTRACT_16BITS(obj_tptr))); 575146773Ssam printf("\n\t Verify Interval: %u", 576146773Ssam EXTRACT_16BITS(obj_tptr+2)); 577146773Ssam printf("\n\t Data links: %u", 578146773Ssam EXTRACT_32BITS(obj_tptr+4)); 579146773Ssam printf("\n\t Encoding type: %s", 580146773Ssam tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))); 581146773Ssam printf("\n\t Verify Tranport Mechanism: %u (0x%x) %s", 582146773Ssam EXTRACT_16BITS(obj_tptr+10), 583146773Ssam EXTRACT_16BITS(obj_tptr+10), 584146773Ssam EXTRACT_16BITS(obj_tptr+10)&8000 ? "(Payload test messages capable)" : ""); 585146773Ssam bw.i = EXTRACT_32BITS(obj_tptr+12); 586146773Ssam printf("\n\t Transmission Rate: %.3f Mbps",bw.f); 587146773Ssam printf("\n\t Wavelength: %u", 588146773Ssam EXTRACT_32BITS(obj_tptr+16)); 589146773Ssam break; 590146773Ssam 591146773Ssam default: 592146773Ssam hexdump=TRUE; 593146773Ssam } 594146773Ssam break; 595146773Ssam 596146773Ssam case LMP_OBJ_VERIFY_BEGIN_ACK: 597146773Ssam switch(lmp_obj_ctype) { 598146773Ssam case LMP_CTYPE_1: 599146773Ssam printf("\n\t Verify Dead Interval: %u \ 600146773Ssam \n\t Verify Transport Response: %u", 601146773Ssam EXTRACT_16BITS(obj_tptr), 602146773Ssam EXTRACT_16BITS(obj_tptr+2)); 603146773Ssam break; 604146773Ssam 605146773Ssam default: 606146773Ssam hexdump=TRUE; 607146773Ssam } 608146773Ssam break; 609146773Ssam 610146773Ssam case LMP_OBJ_VERIFY_ID: 611146773Ssam switch(lmp_obj_ctype) { 612146773Ssam case LMP_CTYPE_1: 613146773Ssam printf("\n\t Verify ID: %u", 614146773Ssam EXTRACT_32BITS(obj_tptr)); 615146773Ssam break; 616146773Ssam 617146773Ssam default: 618146773Ssam hexdump=TRUE; 619146773Ssam } 620146773Ssam break; 621146773Ssam 622146773Ssam case LMP_OBJ_CHANNEL_STATUS: 623146773Ssam switch(lmp_obj_ctype) { 624146773Ssam case LMP_CTYPE_IPV4: 625146773Ssam case LMP_CTYPE_UNMD: 626146773Ssam offset = 0; 627146773Ssam /* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */ 628146773Ssam while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) { 629146773Ssam printf("\n\t Interface ID: %s (0x%08x)", 630146773Ssam ipaddr_string(obj_tptr+offset), 631146773Ssam EXTRACT_32BITS(obj_tptr+offset)); 632146773Ssam 633146773Ssam printf("\n\t\t Active: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ? 634146773Ssam "Allocated" : "Non-allocated", 635146773Ssam (EXTRACT_32BITS(obj_tptr+offset+4)>>31)); 636146773Ssam 637146773Ssam printf("\n\t\t Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ? 638146773Ssam "Transmit" : "Receive", 639146773Ssam (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1); 640146773Ssam 641146773Ssam printf("\n\t\t Channel Status: %s (%u)", 642146773Ssam tok2str(lmp_obj_channel_status_values, 643146773Ssam "Unknown", 644146773Ssam EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF), 645146773Ssam EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF); 646146773Ssam offset+=8; 647146773Ssam } 648146773Ssam break; 649146773Ssam#ifdef INET6 650146773Ssam case LMP_CTYPE_IPV6: 651146773Ssam#endif 652146773Ssam default: 653146773Ssam hexdump=TRUE; 654146773Ssam } 655146773Ssam break; 656146773Ssam 657146773Ssam case LMP_OBJ_CHANNEL_STATUS_REQ: 658146773Ssam switch(lmp_obj_ctype) { 659146773Ssam case LMP_CTYPE_IPV4: 660146773Ssam case LMP_CTYPE_UNMD: 661146773Ssam offset = 0; 662146773Ssam while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) { 663146773Ssam printf("\n\t Interface ID: %s (0x%08x)", 664146773Ssam ipaddr_string(obj_tptr+offset), 665146773Ssam EXTRACT_32BITS(obj_tptr+offset)); 666146773Ssam offset+=4; 667146773Ssam } 668146773Ssam break; 669146773Ssam#ifdef INET6 670146773Ssam case LMP_CTYPE_IPV6: 671146773Ssam#endif 672146773Ssam default: 673146773Ssam hexdump=TRUE; 674146773Ssam } 675146773Ssam break; 676146773Ssam 677146773Ssam case LMP_OBJ_ERROR_CODE: 678146773Ssam switch(lmp_obj_ctype) { 679146773Ssam case LMP_CTYPE_BEGIN_VERIFY_ERROR: 680146773Ssam printf("\n\t Error Code: %s", 681146773Ssam bittok2str(lmp_obj_begin_verify_error_values, 682146773Ssam "none", 683146773Ssam EXTRACT_32BITS(obj_tptr))); 684146773Ssam break; 685146773Ssam 686146773Ssam case LMP_CTYPE_LINK_SUMMARY_ERROR: 687146773Ssam printf("\n\t Error Code: %s", 688146773Ssam bittok2str(lmp_obj_link_summary_error_values, 689146773Ssam "none", 690146773Ssam EXTRACT_32BITS(obj_tptr))); 691146773Ssam break; 692146773Ssam default: 693146773Ssam hexdump=TRUE; 694146773Ssam } 695146773Ssam break; 696146773Ssam 697146773Ssam default: 698146773Ssam if (vflag <= 1) 699146773Ssam print_unknown_data(obj_tptr,"\n\t ",obj_tlen); 700146773Ssam break; 701146773Ssam } 702146773Ssam /* do we want to see an additionally hexdump ? */ 703146773Ssam if (vflag > 1 || hexdump==TRUE) 704146773Ssam print_unknown_data(tptr+sizeof(sizeof(struct lmp_object_header)),"\n\t ", 705146773Ssam lmp_obj_len-sizeof(struct lmp_object_header)); 706146773Ssam 707146773Ssam tptr+=lmp_obj_len; 708146773Ssam tlen-=lmp_obj_len; 709146773Ssam } 710146773Ssam return; 711146773Ssamtrunc: 712146773Ssam printf("\n\t\t packet exceeded snapshot"); 713146773Ssam} 714