12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution. 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE. 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Hannes Gredler (hannes@juniper.net) 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and Steinar Haug (sthaug@nethelp.no) 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.20 2006-06-23 02:03:09 hannes Exp $"; 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "decode_prefix.h" 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "l2vpn.h" 3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "af.h" 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ldp common header 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 1 2 3 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 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 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Version | PDU Length | 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | LDP Identifier | 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ldp_common_header { 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t version[2]; 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pdu_length[2]; 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t lsr_id[4]; 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t label_space[2]; 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_VERSION 1 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ldp message header 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 1 2 3 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 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 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |U| Message Type | Message Length | 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Message ID | 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * + + 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Mandatory Parameters | 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * + + 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * + + 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Optional Parameters | 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * + + 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ldp_msg_header { 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t type[2]; 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t length[2]; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t id[4]; 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MASK_MSG_TYPE(x) ((x)&0x7fff) 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MASK_U_BIT(x) ((x)&0x8000) 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_NOTIF 0x0001 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_HELLO 0x0100 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_INIT 0x0200 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_KEEPALIVE 0x0201 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_ADDRESS 0x0300 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_ADDRESS_WITHDRAW 0x0301 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_LABEL_MAPPING 0x0400 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_LABEL_REQUEST 0x0401 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_LABEL_WITHDRAW 0x0402 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_LABEL_RELEASE 0x0403 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MSG_LABEL_ABORT_REQUEST 0x0404 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_VENDOR_PRIVATE_MIN 0x3e00 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_VENDOR_PRIVATE_MAX 0x3eff 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_EXPERIMENTAL_MIN 0x3f00 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_EXPERIMENTAL_MAX 0x3fff 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_msg_values[] = { 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_NOTIF, "Notification" }, 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_HELLO, "Hello" }, 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_INIT, "Initialization" }, 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_KEEPALIVE, "Keepalive" }, 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_ADDRESS, "Address" }, 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_ADDRESS_WITHDRAW, "Address Withdraw" }, 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_LABEL_MAPPING, "Label Mapping" }, 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_LABEL_REQUEST, "Label Request" }, 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_LABEL_WITHDRAW, "Label Withdraw" }, 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_LABEL_RELEASE, "Label Release" }, 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_MSG_LABEL_ABORT_REQUEST, "Label Abort Request" }, 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MASK_TLV_TYPE(x) ((x)&0x3fff) 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_MASK_F_BIT(x) ((x)&0x4000) 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_FEC 0x0100 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_ADDRESS_LIST 0x0101 13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LDP_TLV_ADDRESS_LIST_AFNUM_LEN 2 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_HOP_COUNT 0x0103 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_PATH_VECTOR 0x0104 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_GENERIC_LABEL 0x0200 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_ATM_LABEL 0x0201 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_FR_LABEL 0x0202 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_STATUS 0x0300 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_EXTD_STATUS 0x0301 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_RETURNED_PDU 0x0302 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_RETURNED_MSG 0x0303 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_COMMON_HELLO 0x0400 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_IPV4_TRANSPORT_ADDR 0x0401 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_CONFIG_SEQ_NUMBER 0x0402 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_IPV6_TRANSPORT_ADDR 0x0403 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_COMMON_SESSION 0x0500 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_ATM_SESSION_PARM 0x0501 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_FR_SESSION_PARM 0x0502 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_FT_SESSION 0x0503 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600 15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LDP_TLV_MTU 0x0601 /* rfc 3988 */ 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_tlv_values[] = { 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_FEC, "FEC" }, 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_ADDRESS_LIST, "Address List" }, 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_HOP_COUNT, "Hop Count" }, 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_PATH_VECTOR, "Path Vector" }, 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_GENERIC_LABEL, "Generic Label" }, 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_ATM_LABEL, "ATM Label" }, 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_FR_LABEL, "Frame-Relay Label" }, 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_STATUS, "Status" }, 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_EXTD_STATUS, "Extended Status" }, 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_RETURNED_PDU, "Returned PDU" }, 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_RETURNED_MSG, "Returned Message" }, 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_COMMON_HELLO, "Common Hello Parameters" }, 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_IPV4_TRANSPORT_ADDR, "IPv4 Transport Address" }, 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_CONFIG_SEQ_NUMBER, "Configuration Sequence Number" }, 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_IPV6_TRANSPORT_ADDR, "IPv6 Transport Address" }, 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_COMMON_SESSION, "Common Session Parameters" }, 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_ATM_SESSION_PARM, "ATM Session Parameters" }, 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_FR_SESSION_PARM, "Frame-Relay Session Parameters" }, 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_FT_SESSION, "Fault-Tolerant Session Parameters" }, 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_TLV_LABEL_REQUEST_MSG_ID, "Label Request Message ID" }, 17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { LDP_TLV_MTU, "MTU" }, 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_WILDCARD 0x01 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_PREFIX 0x02 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_HOSTADDRESS 0x03 18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* From RFC 4906; should probably be updated to RFC 4447 (e.g., VC -> PW) */ 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_VC 0x80 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_values[] = { 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_WILDCARD, "Wildcard" }, 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_PREFIX, "Prefix" }, 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_HOSTADDRESS, "Host address" }, 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_MARTINI_VC, "Martini VC" }, 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_IFPARM_MTU 0x01 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_IFPARM_DESC 0x03 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_IFPARM_VCCV 0x0c 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_martini_ifparm_values[] = { 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_MARTINI_IFPARM_MTU, "MTU" }, 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_MARTINI_IFPARM_DESC, "Description" }, 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LDP_FEC_MARTINI_IFPARM_VCCV, "VCCV" }, 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* draft-ietf-pwe3-vccv-04.txt */ 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_martini_ifparm_vccv_cc_values[] = { 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01, "PWE3 control word" }, 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x02, "MPLS Router Alert Label" }, 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x04, "MPLS inner label TTL = 1" }, 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* draft-ietf-pwe3-vccv-04.txt */ 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_martini_ifparm_vccv_cv_values[] = { 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01, "ICMP Ping" }, 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x02, "LSP Ping" }, 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x04, "BFD" }, 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ldp_msg_print(register const u_char *); 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ldp_tlv_print(register const u_char *); 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ldp tlv header 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 1 2 3 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 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 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |U|F| Type | Length | 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Value | 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ~ ~ 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TLV_TCHECK(minlen) \ 24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, minlen); if (tlv_tlen < minlen) goto badtlv; 24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectldp_tlv_print(register const u_char *tptr) { 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ldp_tlv_header { 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t type[2]; 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t length[2]; 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ldp_tlv_header *ldp_tlv_header; 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short tlv_type,tlv_len,tlv_tlen,af,ft_flags; 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char fec_type; 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int ui,vc_info_len, vc_info_tlv_type, vc_info_tlv_len,idx; 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[100]; 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ldp_tlv_header = (const struct ldp_tlv_header *)tptr; 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len=EXTRACT_16BITS(ldp_tlv_header->length); 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tlen=tlv_len; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type=LDP_MASK_TLV_TYPE(EXTRACT_16BITS(ldp_tlv_header->type)); 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* FIXME vendor private / experimental check */ 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]", 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ldp_tlv_values, 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown", 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type), 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type, 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len, 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "continue processing" : "ignore", 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LDP_MASK_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't"); 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=sizeof(struct ldp_tlv_header); 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(tlv_type) { 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_COMMON_HELLO: 27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(4); 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Hold Time: %us, Flags: [%s Hello%s]", 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr), 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_16BITS(tptr+2)&0x8000) ? "Targeted" : "Link", 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_16BITS(tptr+2)&0x4000) ? ", Request for targeted Hellos" : ""); 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_IPV4_TRANSPORT_ADDR: 28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(4); 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t IPv4 Transport Address: %s", ipaddr_string(tptr)); 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_IPV6_TRANSPORT_ADDR: 29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(16); 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t IPv6 Transport Address: %s", ip6addr_string(tptr)); 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_CONFIG_SEQ_NUMBER: 29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(4); 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Sequence Number: %u", EXTRACT_32BITS(tptr)); 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_ADDRESS_LIST: 30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(LDP_TLV_ADDRESS_LIST_AFNUM_LEN); 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project af = EXTRACT_16BITS(tptr); 30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN; 30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_tlen -= LDP_TLV_ADDRESS_LIST_AFNUM_LEN; 30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Address Family: %s, addresses", 30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(af_values, "Unknown (%u)", af)); 30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (af) { 30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case AFNUM_INET: 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(tlv_tlen >= sizeof(struct in_addr)) { 31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, sizeof(struct in_addr)); 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s",ipaddr_string(tptr)); 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tlen-=sizeof(struct in_addr); 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=sizeof(struct in_addr); 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case AFNUM_INET6: 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(tlv_tlen >= sizeof(struct in6_addr)) { 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, sizeof(struct in6_addr)); 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s",ip6addr_string(tptr)); 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tlen-=sizeof(struct in6_addr); 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=sizeof(struct in6_addr); 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* unknown AF */ 32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_COMMON_SESSION: 33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(8); 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]", 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr), EXTRACT_16BITS(tptr+2), 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_16BITS(tptr+6)&0x8000) ? "On Demand" : "Unsolicited", 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_16BITS(tptr+6)&0x4000) ? "Enabled" : "Disabled" 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ); 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_FEC: 34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(1); 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fec_type = *tptr; 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s FEC (0x%02x)", 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ldp_fec_values, "Unknown", fec_type), 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fec_type); 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=1; 35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_tlen-=1; 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(fec_type) { 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_WILDCARD: 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_PREFIX: 35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(2); 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project af = EXTRACT_16BITS(tptr); 35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN; 35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_tlen-=LDP_TLV_ADDRESS_LIST_AFNUM_LEN; 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (af == AFNUM_INET) { 36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall i=decode_prefix4(tptr,tlv_tlen,buf,sizeof(buf)); 36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (i == -2) 36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall goto trunc; 36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (i == -3) 36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": IPv4 prefix (goes past end of TLV)"); 36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (i == -1) 36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": IPv4 prefix (invalid length)"); 36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": IPv4 prefix %s",buf); 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (af == AFNUM_INET6) { 37353f17a9db278d33517d9888dd77848f554522a38JP Abgrall i=decode_prefix6(tptr,tlv_tlen,buf,sizeof(buf)); 37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (i == -2) 37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall goto trunc; 37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (i == -3) 37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": IPv4 prefix (goes past end of TLV)"); 37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (i == -1) 37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": IPv6 prefix (invalid length)"); 38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": IPv6 prefix %s",buf); 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 38453f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 38553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": Address family %u prefix", af); 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_HOSTADDRESS: 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_MARTINI_VC: 39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * According to RFC 4908, the VC info Length field can be zero, 39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * in which case not only are there no interface parameters, 39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * there's no VC ID. 39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(7); 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_len = *(tptr+2); 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vc_info_len == 0) { 39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": %s, %scontrol word, group-ID %u, VC-info-length: %u", 40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff), 40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ", 40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(tptr+3), 40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall vc_info_len); 40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 40653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Make sure we have the VC ID as well */ 40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(11); 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u", 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff), 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ", 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tptr+3), 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tptr+7), 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_len); 41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vc_info_len < 4) 41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall goto trunc; /* minimum 4, for the VC ID */ 41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall vc_info_len -= 4; /* subtract out the VC ID, giving the length of the interface parameters */ 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Skip past the fixed information and the VC ID */ 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=11; 42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_tlen-=11; 42253f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(vc_info_len); 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (vc_info_len > 2) { 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_tlv_type = *tptr; 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_tlv_len = *(tptr+1); 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vc_info_tlv_len < 2) 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vc_info_len < vc_info_tlv_len) 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\tInterface Parameter: %s (0x%02x), len %u", 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ldp_fec_martini_ifparm_values,"Unknown",vc_info_tlv_type), 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_tlv_type, 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_tlv_len); 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(vc_info_tlv_type) { 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_MARTINI_IFPARM_MTU: 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %u",EXTRACT_16BITS(tptr+2)); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_MARTINI_IFPARM_DESC: 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": "); 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (idx = 2; idx < vc_info_tlv_len; idx++) 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safeputchar(*(tptr+idx)); 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_FEC_MARTINI_IFPARM_VCCV: 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\t Control Channels (0x%02x) = [%s]", 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(tptr+2), 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(ldp_fec_martini_ifparm_vccv_cc_values,"none",*(tptr+2))); 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\t CV Types (0x%02x) = [%s]", 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(tptr+3), 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(ldp_fec_martini_ifparm_vccv_cv_values,"none",*(tptr+3))); 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr+2,"\n\t\t ",vc_info_tlv_len-2); 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project vc_info_len -= vc_info_tlv_len; 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += vc_info_tlv_len; 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_GENERIC_LABEL: 47153f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(4); 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Label: %u", EXTRACT_32BITS(tptr) & 0xfffff); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_STATUS: 47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(8); 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui = EXTRACT_32BITS(tptr); 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=4; 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Status: 0x%02x, Flags: [%s and %s forward]", 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui&0x3fffffff, 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui&0x80000000 ? "Fatal error" : "Advisory Notification", 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui&0x40000000 ? "do" : "don't"); 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui = EXTRACT_32BITS(tptr); 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=4; 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ui) 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", causing Message ID: 0x%08x", ui); 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_FT_SESSION: 49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(8); 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ft_flags = EXTRACT_16BITS(tptr); 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]", 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ft_flags&0x8000 ? "" : "No ", 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ft_flags&0x8 ? "" : "Don't ", 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ft_flags&0x4 ? "" : "No ", 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels", 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ft_flags&0x1 ? "" : "Don't "); 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=4; 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui = EXTRACT_32BITS(tptr); 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ui) 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Reconnect Timeout: %ums", ui); 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=4; 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ui = EXTRACT_32BITS(tptr); 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ui) 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Recovery Time: %ums", ui); 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 50853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LDP_TLV_MTU: 50953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TLV_TCHECK(2); 51053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t MTU: %u", EXTRACT_16BITS(tptr)); 51153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 51253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FIXME those are the defined TLVs that lack a decoder 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * you are welcome to contribute code ;-) 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_HOP_COUNT: 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_PATH_VECTOR: 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_ATM_LABEL: 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_FR_LABEL: 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_EXTD_STATUS: 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_RETURNED_PDU: 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_RETURNED_MSG: 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_ATM_SESSION_PARM: 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_FR_SESSION_PARM: 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_TLV_LABEL_REQUEST_MSG_ID: 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr,"\n\t ",tlv_tlen); 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(tlv_len+4); /* Type & Length fields not included */ 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\t packet exceeded snapshot"); 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54153f17a9db278d33517d9888dd77848f554522a38JP Abgrallbadtlv: 54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\t TLV contents go past end of TLV"); 54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return(tlv_len+4); /* Type & Length fields not included */ 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectldp_print(register const u_char *pptr, register u_int len) { 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int processed; 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (len > (sizeof(struct ldp_common_header) + sizeof(struct ldp_msg_header))) { 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project processed = ldp_msg_print(pptr); 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (processed == 0) 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len -= processed; 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pptr += processed; 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectldp_msg_print(register const u_char *pptr) { 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ldp_common_header *ldp_com_header; 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ldp_msg_header *ldp_msg_header; 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *tptr,*msg_tptr; 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short tlen; 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short pdu_len,msg_len,msg_type,msg_tlen; 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int hexdump,processed; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr=pptr; 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ldp_com_header = (const struct ldp_common_header *)pptr; 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ldp_com_header); 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Sanity checking of the header. 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_16BITS(&ldp_com_header->version) != LDP_VERSION) { 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%sLDP version %u packet not supported", 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (vflag < 1) ? "" : "\n\t", 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ldp_com_header->version)); 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print the LSR-ID, label-space & length */ 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pdu_len = EXTRACT_16BITS(&ldp_com_header->pdu_length); 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%sLDP, Label-Space-ID: %s:%u, pdu-length: %u", 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (vflag < 1) ? "" : "\n\t", 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ldp_com_header->lsr_id), 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ldp_com_header->label_space), 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pdu_len); 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* bail out if non-verbose */ 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag < 1) 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ok they seem to want to know everything - lets fully decode it */ 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen=pdu_len; 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += sizeof(const struct ldp_common_header); 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= sizeof(const struct ldp_common_header)-4; /* Type & Length fields not included */ 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(tlen>0) { 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* did we capture enough for fully decoding the msg header ? */ 60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, sizeof(struct ldp_msg_header)); 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ldp_msg_header = (const struct ldp_msg_header *)tptr; 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_len=EXTRACT_16BITS(ldp_msg_header->length); 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_type=LDP_MASK_MSG_TYPE(EXTRACT_16BITS(ldp_msg_header->type)); 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* FIXME vendor private / experimental check */ 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]", 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ldp_msg_values, 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown", 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_type), 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_type, 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_len, 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&ldp_msg_header->id), 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore"); 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (msg_len == 0) /* infinite loop protection */ 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tptr=tptr+sizeof(struct ldp_msg_header); 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen=msg_len-sizeof(struct ldp_msg_header)+4; /* Type & Length fields not included */ 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* did we capture enough for fully decoding the message ? */ 62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, msg_len); 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hexdump=FALSE; 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(msg_type) { 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_NOTIF: 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_HELLO: 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_INIT: 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_KEEPALIVE: 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_ADDRESS: 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_LABEL_MAPPING: 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_ADDRESS_WITHDRAW: 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_LABEL_WITHDRAW: 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(msg_tlen >= 4) { 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project processed = ldp_tlv_print(msg_tptr); 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (processed == 0) 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen-=processed; 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tptr+=processed; 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FIXME those are the defined messages that lack a decoder 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * you are welcome to contribute code ;-) 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_LABEL_REQUEST: 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_LABEL_RELEASE: 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LDP_MSG_LABEL_ABORT_REQUEST: 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(msg_tptr,"\n\t ",msg_tlen); 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* do we want to see an additionally hexdump ? */ 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1 || hexdump==TRUE) 66553f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(tptr+sizeof(struct ldp_msg_header),"\n\t ", 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_len); 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += msg_len+4; 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= msg_len+4; 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return pdu_len+4; 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\t packet exceeded snapshot"); 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 677