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_ = 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.13.2.1 2005/07/05 09:39:29 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 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC3032: MPLS label stack encoding 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmpls_print(const u_char *bp, u_int length) 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *p; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t label_entry; 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t label_stack_depth = 0; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = bp; 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("MPLS"); 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do { 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*p, sizeof(label_entry)); 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project label_entry = EXTRACT_32BITS(p); 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s(label %u", 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project label_stack_depth ? "\n\t" : " ", 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MPLS_LABEL(label_entry)); 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project label_stack_depth++; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag && 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MPLS_LABEL(label_entry) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0])) 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s)", mpls_labelname[MPLS_LABEL(label_entry)]); 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", exp %u", MPLS_EXP(label_entry)); 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (MPLS_STACK(label_entry)) 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", [S]"); 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", ttl %u)", MPLS_TTL(label_entry)); 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += sizeof(label_entry); 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } while (!MPLS_STACK(label_entry)); 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (MPLS_LABEL(label_entry)) { 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0: /* IPv4 explicit NULL label */ 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 3: /* IPv4 implicit NULL label */ 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag>0) { 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t"); 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip_print(gndo, p, length - (p - bp)); 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else printf(", IP, length: %u",length); 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: /* IPv6 explicit NULL label */ 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag>0) { 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t"); 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_print(p, length - (p - bp)); 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else printf(", IPv6, length: %u",length); 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Generally there's no indication of protocol in MPLS label 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * encoding, however draft-hsmit-isis-aal5mux-00.txt describes 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * a technique that looks at the first payload byte if the BOS (bottom of stack) 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * bit is set and tries to determine the network layer protocol 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0x45-0x4f is IPv4 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0x60-0x6f is IPv6 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS) 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this technique is sometimes known as NULL encapsulation 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and decoding is particularly useful for control-plane traffic [BGP] 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * which cisco by default sends MPLS encapsulated 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (MPLS_STACK(label_entry)) { /* only do this if the stack bit is set */ 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(*p) { 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x45: 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x46: 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x47: 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x48: 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x49: 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x4a: 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x4b: 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x4c: 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x4d: 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x4e: 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x4f: 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag>0) { 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t"); 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip_print(gndo, p, length - (p - bp)); 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else printf(", IP, length: %u",length); 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x60: 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x61: 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x62: 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x63: 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x64: 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x65: 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x66: 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x67: 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x68: 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x69: 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x6a: 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x6b: 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x6c: 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x6d: 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x6e: 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x6f: 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag>0) { 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t"); 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_print(p, length - (p - bp)); 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else printf(", IPv6, length: %u",length); 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x81: 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x82: 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0x83: 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag>0) { 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t"); 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isoclns_print(p, length - (p - bp), length - (p - bp)); 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else printf(", OSI, length: %u",length); 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ok bail out - we did not figure out what it is*/ 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|MPLS]"); 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables: 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End: 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 190