12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 2001 WIDE Project. All rights reserved. 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met: 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer. 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * documentation and/or other materials provided with the distribution. 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. Neither the name of the project nor the names of its contributors 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * may be used to endorse or promote products derived from this software 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * without specific prior written permission. 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE. 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.14 2005-07-05 09:38:19 hannes Exp $ (LBL)"; 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" /* must come after interface.h */ 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "mpls.h" 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *mpls_labelname[] = { 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*0*/ "IPv4 explicit NULL", "router alert", "IPv6 explicit NULL", 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "implicit NULL", "rsvd", 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*5*/ "rsvd", "rsvd", "rsvd", "rsvd", "rsvd", 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*10*/ "rsvd", "rsvd", "rsvd", "rsvd", "rsvd", 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*15*/ "rsvd", 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5753f17a9db278d33517d9888dd77848f554522a38JP Abgrallenum mpls_packet_type { 5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall PT_UNKNOWN, 5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall PT_IPV4, 6053f17a9db278d33517d9888dd77848f554522a38JP Abgrall PT_IPV6, 6153f17a9db278d33517d9888dd77848f554522a38JP Abgrall PT_OSI 6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC3032: MPLS label stack encoding 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmpls_print(const u_char *bp, u_int length) 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *p; 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t label_entry; 7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int16_t label_stack_depth = 0; 7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall enum mpls_packet_type pt = PT_UNKNOWN; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = bp; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("MPLS"); 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do { 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*p, sizeof(label_entry)); 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project label_entry = EXTRACT_32BITS(p); 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s(label %u", 8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall (label_stack_depth && vflag) ? "\n\t" : " ", 8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall MPLS_LABEL(label_entry)); 8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall label_stack_depth++; 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag && 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MPLS_LABEL(label_entry) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0])) 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s)", mpls_labelname[MPLS_LABEL(label_entry)]); 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", exp %u", MPLS_EXP(label_entry)); 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (MPLS_STACK(label_entry)) 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", [S]"); 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", ttl %u)", MPLS_TTL(label_entry)); 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += sizeof(label_entry); 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } while (!MPLS_STACK(label_entry)); 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Try to figure out the packet type. 9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (MPLS_LABEL(label_entry)) { 9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0: /* IPv4 explicit NULL label */ 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 3: /* IPv4 implicit NULL label */ 10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall pt = PT_IPV4; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: /* IPv6 explicit NULL label */ 10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall pt = PT_IPV6; 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Generally there's no indication of protocol in MPLS label 11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * encoding. 11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * However, draft-hsmit-isis-aal5mux-00.txt describes a 11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * technique for encapsulating IS-IS and IP traffic on the 11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * same ATM virtual circuit; you look at the first payload 11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * byte to determine the network layer protocol, based on 11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the fact that 11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 1) the first byte of an IP header is 0x45-0x4f 12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * for IPv4 and 0x60-0x6f for IPv6; 12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 2) the first byte of an OSI CLNP packet is 0x81, 12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the first byte of an OSI ES-IS packet is 0x82, 12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * and the first byte of an OSI IS-IS packet is 12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 0x83; 12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so the network layer protocol can be inferred from the 12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * first byte of the packet, if the protocol is one of the 13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * ones listed above. 13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Cisco sends control-plane traffic MPLS-encapsulated in 13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this fashion. 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch(*p) { 13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x45: 13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x46: 13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x47: 14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x48: 14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x49: 14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x4a: 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x4b: 14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x4c: 14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x4d: 14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x4e: 14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x4f: 14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall pt = PT_IPV4; 14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x60: 15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x61: 15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x62: 15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x63: 15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x64: 15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x65: 15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x66: 15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x67: 15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x68: 16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x69: 16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x6a: 16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x6b: 16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x6c: 16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x6d: 16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x6e: 16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x6f: 16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall pt = PT_IPV6; 16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x81: 17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x82: 17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0x83: 17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall pt = PT_OSI; 17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* ok bail out - we did not figure out what it is*/ 17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print the payload. 18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (pt == PT_UNKNOWN) { 18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!suppress_default_print) 18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall default_print(p, length - (p - bp)); 18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag) 19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t"); 19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" "); 19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (pt) { 19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case PT_IPV4: 19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall ip_print(gndo, p, length - (p - bp)); 19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case PT_IPV6: 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall ip6_print(gndo, p, length - (p - bp)); 20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else 20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("IPv6, length: %u", length); 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case PT_OSI: 20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall isoclns_print(p, length - (p - bp), length - (p - bp)); 21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|MPLS]"); 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables: 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End: 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 228