12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 1999 WIDE Project. 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met: 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer. 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * documentation and/or other materials provided with the distribution. 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. Neither the name of the project nor the names of its contributors 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * may be used to endorse or promote products derived from this software 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * without specific prior written permission. 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE. 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Extensively modified by Hannes Gredler (hannes@juniper.net) for more 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * complete BGP support. 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.91.2.12 2007/07/14 22:26:35 guy Exp $"; 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "decode_prefix.h" 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "bgp.h" 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "l2vpn.h" 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "af.h" 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bgp { 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgp_marker[16]; 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t bgp_len; 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgp_type; 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_SIZE 19 /* unaligned */ 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OPEN 1 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_UPDATE 2 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFICATION 3 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_KEEPALIVE 4 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_ROUTE_REFRESH 5 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_msg_values[] = { 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OPEN, "Open"}, 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_UPDATE, "Update"}, 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFICATION, "Notification"}, 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_KEEPALIVE, "Keepalive"}, 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_ROUTE_REFRESH, "Route Refresh"}, 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bgp_open { 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpo_marker[16]; 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t bgpo_len; 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpo_type; 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpo_version; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t bgpo_myas; 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t bgpo_holdtime; 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t bgpo_id; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpo_optlen; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* options should follow */ 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OPEN_SIZE 29 /* unaligned */ 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bgp_opt { 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpopt_type; 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpopt_len; 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* variable length */ 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OPT_SIZE 2 /* some compilers may pad to 4 bytes */ 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_UPDATE_MINSIZE 23 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bgp_notification { 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpn_marker[16]; 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t bgpn_len; 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpn_type; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpn_major; 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpn_minor; 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFICATION_SIZE 21 /* unaligned */ 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bgp_route_refresh { 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgp_marker[16]; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t len; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t type; 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t afi[2]; /* the compiler messes this structure up */ 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t res; /* when doing misaligned sequences of int8 and int16 */ 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t safi; /* afi should be int16 - so we have to access it using */ 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; /* EXTRACT_16BITS(&bgp_route_refresh->afi) (sigh) */ 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_ROUTE_REFRESH_SIZE 23 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bgp_attr { 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpa_flags; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t bgpa_type; 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t len; 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t elen; 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } bgpa_len; 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define bgp_attr_len(p) \ 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (((p)->bgpa_flags & 0x10) ? \ 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&(p)->bgpa_len.elen) : (p)->bgpa_len.len) 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define bgp_attr_off(p) \ 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (((p)->bgpa_flags & 0x10) ? 4 : 3) 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_ORIGIN 1 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_AS_PATH 2 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_NEXT_HOP 3 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_MULTI_EXIT_DISC 4 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_LOCAL_PREF 5 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_ATOMIC_AGGREGATE 6 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_AGGREGATOR 7 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_COMMUNITIES 8 /* RFC1997 */ 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_ORIGINATOR_ID 9 /* RFC1998 */ 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_CLUSTER_LIST 10 /* RFC1998 */ 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_DPA 11 /* draft-ietf-idr-bgp-dpa */ 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_ADVERTISERS 12 /* RFC1863 */ 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_RCID_PATH 13 /* RFC1863 */ 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_MP_REACH_NLRI 14 /* RFC2283 */ 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_MP_UNREACH_NLRI 15 /* RFC2283 */ 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_EXTD_COMMUNITIES 16 /* draft-ietf-idr-bgp-ext-communities */ 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGPTYPE_ATTR_SET 128 /* draft-marques-ppvpn-ibgp */ 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_MP_NLRI_MINSIZE 3 /* End of RIB Marker detection */ 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_attr_values[] = { 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_ORIGIN, "Origin"}, 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_AS_PATH, "AS Path"}, 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_NEXT_HOP, "Next Hop"}, 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_MULTI_EXIT_DISC, "Multi Exit Discriminator"}, 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_LOCAL_PREF, "Local Preference"}, 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_ATOMIC_AGGREGATE, "Atomic Aggregate"}, 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_AGGREGATOR, "Aggregator"}, 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_COMMUNITIES, "Community"}, 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_ORIGINATOR_ID, "Originator ID"}, 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_CLUSTER_LIST, "Cluster List"}, 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_DPA, "DPA"}, 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_ADVERTISERS, "Advertisers"}, 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_RCID_PATH, "RCID Path / Cluster ID"}, 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_MP_REACH_NLRI, "Multi-Protocol Reach NLRI"}, 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_MP_UNREACH_NLRI, "Multi-Protocol Unreach NLRI"}, 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_EXTD_COMMUNITIES, "Extended Community"}, 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGPTYPE_ATTR_SET, "Attribute Set"}, 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 255, "Reserved for development"}, 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_AS_SET 1 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_AS_SEQUENCE 2 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CONFED_AS_SEQUENCE 3 /* draft-ietf-idr-rfc3065bis-01 */ 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CONFED_AS_SET 4 /* draft-ietf-idr-rfc3065bis-01 */ 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_as_path_segment_open_values[] = { 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_AS_SEQUENCE, ""}, 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_AS_SET, "{ "}, 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CONFED_AS_SEQUENCE, "( "}, 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CONFED_AS_SET, "({ "}, 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_as_path_segment_close_values[] = { 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_AS_SEQUENCE, ""}, 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_AS_SET, "}"}, 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CONFED_AS_SEQUENCE, ")"}, 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CONFED_AS_SET, "})"}, 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OPT_AUTH 1 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OPT_CAP 2 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_opt_values[] = { 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OPT_AUTH, "Authentication Information"}, 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OPT_CAP, "Capabilities Advertisement"}, 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_MP 1 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_RR 2 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_ORF 3 /* XXX */ 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_RESTART 64 /* draft-ietf-idr-restart-05 */ 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_AS_NEW 65 /* XXX */ 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_DYN_CAP 67 /* XXX */ 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_CAPCODE_RR_CISCO 128 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_capcode_values[] = { 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_MP, "Multiprotocol Extensions"}, 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_RR, "Route Refresh"}, 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_ORF, "Cooperative Route Filtering"}, 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_RESTART, "Graceful Restart"}, 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_AS_NEW, "32-Bit AS Number"}, 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_DYN_CAP, "Dynamic Capability"}, 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_CAPCODE_RR_CISCO, "Route Refresh (Cisco)"}, 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_MSG 1 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_OPEN 2 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_UPDATE 3 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_HOLDTIME 4 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_FSM 5 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_CEASE 6 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MAJOR_CAP 7 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_notify_major_values[] = { 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_MSG, "Message Header Error"}, 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_OPEN, "OPEN Message Error"}, 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_UPDATE, "UPDATE Message Error"}, 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_HOLDTIME,"Hold Timer Expired"}, 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_FSM, "Finite State Machine Error"}, 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_CEASE, "Cease"}, 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MAJOR_CAP, "Capability Message Error"}, 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* draft-ietf-idr-cease-subcode-02 */ 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_NOTIFY_MINOR_CEASE_MAXPRFX 1 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_notify_minor_cease_values[] = { 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_NOTIFY_MINOR_CEASE_MAXPRFX, "Maximum Number of Prefixes Reached"}, 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Administratively Shutdown"}, 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 3, "Peer Unconfigured"}, 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4, "Administratively Reset"}, 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5, "Connection Rejected"}, 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 6, "Other Configuration Change"}, 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 7, "Connection Collision Resolution"}, 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_notify_minor_msg_values[] = { 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Connection Not Synchronized"}, 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Bad Message Length"}, 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 3, "Bad Message Type"}, 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_notify_minor_open_values[] = { 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Unsupported Version Number"}, 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Bad Peer AS"}, 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 3, "Bad BGP Identifier"}, 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4, "Unsupported Optional Parameter"}, 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5, "Authentication Failure"}, 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 6, "Unacceptable Hold Time"}, 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_notify_minor_update_values[] = { 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Malformed Attribute List"}, 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Unrecognized Well-known Attribute"}, 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 3, "Missing Well-known Attribute"}, 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4, "Attribute Flags Error"}, 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5, "Attribute Length Error"}, 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 6, "Invalid ORIGIN Attribute"}, 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 7, "AS Routing Loop"}, 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 8, "Invalid NEXT_HOP Attribute"}, 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 9, "Optional Attribute Error"}, 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 10, "Invalid Network Field"}, 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 11, "Malformed AS_PATH"}, 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_notify_minor_cap_values[] = { 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Invalid Action Value" }, 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Invalid Capability Length" }, 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 3, "Malformed Capability Value" }, 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4, "Unsupported Capability Code" }, 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_origin_values[] = { 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, "IGP"}, 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "EGP"}, 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Incomplete"}, 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Subsequent address family identifier, RFC2283 section 7 */ 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_RES 0 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_UNICAST 1 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_MULTICAST 2 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_UNIMULTICAST 3 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* labeled BGP RFC3107 */ 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_LABUNICAST 4 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_TUNNEL 64 /* XXX */ 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_VPLS 65 /* XXX */ 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_MDT 66 /* XXX */ 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Section 4.3.4 of draft-rosen-rfc2547bis-03.txt */ 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_VPNUNICAST 128 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_VPNMULTICAST 129 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_VPNUNIMULTICAST 130 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* draft-marques-ppvpn-rt-constrain-01.txt */ 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SAFNUM_RT_ROUTING_INFO 132 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_VPN_RD_LEN 8 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_safi_values[] = { 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_RES, "Reserved"}, 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_UNICAST, "Unicast"}, 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_MULTICAST, "Multicast"}, 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_UNIMULTICAST, "Unicast+Multicast"}, 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_LABUNICAST, "labeled Unicast"}, 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_TUNNEL, "Tunnel"}, 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_VPLS, "VPLS"}, 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_MDT, "MDT"}, 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_VPNUNICAST, "labeled VPN Unicast"}, 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_VPNMULTICAST, "labeled VPN Multicast"}, 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_VPNUNIMULTICAST, "labeled VPN Unicast+Multicast"}, 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SAFNUM_RT_ROUTING_INFO, "Route Target Routing Information"}, /* draft-marques-ppvpn-rt-constrain-01.txt */ 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* well-known community */ 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_COMMUNITY_NO_EXPORT 0xffffff01 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_COMMUNITY_NO_ADVERT 0xffffff02 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_COMMUNITY_NO_EXPORT_SUBCONFED 0xffffff03 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Extended community type - draft-ietf-idr-bgp-ext-communities-05 */ 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_RT_0 0x0002 /* Route Target,Format AS(2bytes):AN(4bytes) */ 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_RT_1 0x0102 /* Route Target,Format IP address:AN(2bytes) */ 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_RT_2 0x0202 /* Route Target,Format AN(4bytes):local(2bytes) */ 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_RO_0 0x0003 /* Route Origin,Format AS(2bytes):AN(4bytes) */ 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_RO_1 0x0103 /* Route Origin,Format IP address:AN(2bytes) */ 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_RO_2 0x0203 /* Route Origin,Format AN(4bytes):local(2bytes) */ 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_LINKBAND 0x4004 /* Link Bandwidth,Format AS(2B):Bandwidth(4B) */ 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* rfc2547 bgp-mpls-vpns */ 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_CISCO_MCAST 0x0009 /* cisco proprietary */ 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_VPN_ORIGIN 0x0005 /* OSPF Domain ID / VPN of Origin - draft-rosen-vpns-ospf-bgp-mpls */ 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_VPN_ORIGIN2 0x0105 /* duplicate - keep for backwards compatability */ 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_VPN_ORIGIN3 0x0205 /* duplicate - keep for backwards compatability */ 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_VPN_ORIGIN4 0x8005 /* duplicate - keep for backwards compatability */ 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_OSPF_RTYPE 0x0306 /* OSPF Route Type,Format Area(4B):RouteType(1B):Options(1B) */ 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_OSPF_RTYPE2 0x8000 /* duplicate - keep for backwards compatability */ 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_OSPF_RID 0x0107 /* OSPF Router ID,Format RouterID(4B):Unused(2B) */ 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_OSPF_RID2 0x8001 /* duplicate - keep for backwards compatability */ 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_L2INFO 0x800a /* draft-kompella-ppvpn-l2vpn */ 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* http://www.cisco.com/en/US/tech/tk436/tk428/technologies_tech_note09186a00801eb09a.shtml */ 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_EIGRP_GEN 0x8800 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_EIGRP_METRIC_AS_DELAY 0x8801 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_EIGRP_METRIC_REL_NH_BW 0x8802 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_EIGRP_METRIC_LOAD_MTU 0x8803 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_EIGRP_EXT_REMAS_REMID 0x8804 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC 0x8805 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_extd_comm_flag_values[] = { 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x8000, "vendor-specific"}, 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x4000, "non-transitive"}, 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL}, 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_extd_comm_subtype_values[] = { 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_RT_0, "target"}, 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_RT_1, "target"}, 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_RT_2, "target"}, 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_RO_0, "origin"}, 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_RO_1, "origin"}, 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_RO_2, "origin"}, 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_LINKBAND, "link-BW"}, 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_CISCO_MCAST, "mdt-group"}, 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_VPN_ORIGIN, "ospf-domain"}, 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_VPN_ORIGIN2, "ospf-domain"}, 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_VPN_ORIGIN3, "ospf-domain"}, 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_VPN_ORIGIN4, "ospf-domain"}, 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_OSPF_RTYPE, "ospf-route-type"}, 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_OSPF_RTYPE2, "ospf-route-type"}, 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_OSPF_RID, "ospf-router-id"}, 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_OSPF_RID2, "ospf-router-id"}, 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_L2INFO, "layer2-info"}, 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_EIGRP_GEN , "eigrp-general-route (flag, tag)" }, 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_EIGRP_METRIC_AS_DELAY , "eigrp-route-metric (AS, delay)" }, 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_EIGRP_METRIC_REL_NH_BW , "eigrp-route-metric (reliability, nexthop, bandwidth)" }, 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_EIGRP_METRIC_LOAD_MTU , "eigrp-route-metric (load, MTU)" }, 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_EIGRP_EXT_REMAS_REMID , "eigrp-external-route (remote-AS, remote-ID)" }, 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC , "eigrp-external-route (remote-proto, remote-metric)" }, 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL}, 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* OSPF codes for BGP_EXT_COM_OSPF_RTYPE draft-rosen-vpns-ospf-bgp-mpls */ 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_RTR 1 /* OSPF Router LSA */ 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_NET 2 /* OSPF Network LSA */ 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_SUM 3 /* OSPF Summary LSA */ 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_EXT 5 /* OSPF External LSA, note that ASBR doesn't apply to MPLS-VPN */ 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_NSSA 7 /* OSPF NSSA External*/ 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_SHAM 129 /* OSPF-MPLS-VPN Sham link */ 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_OSPF_RTYPE_METRIC_TYPE 0x1 /* LSB of RTYPE Options Field */ 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok bgp_extd_comm_ospf_rtype_values[] = { 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OSPF_RTYPE_RTR, "Router" }, 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OSPF_RTYPE_NET, "Network" }, 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OSPF_RTYPE_SUM, "Summary" }, 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OSPF_RTYPE_EXT, "External" }, 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OSPF_RTYPE_NSSA,"NSSA External" }, 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { BGP_OSPF_RTYPE_SHAM,"MPLS-VPN Sham" }, 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL }, 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_prefix4(const u_char *pptr, char *buf, u_int buflen) 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr addr; 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (32 < plen) 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[1], (plen + 7) / 8); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[1], (plen + 7) / 8); 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((u_char *)&addr)[(plen + 7) / 8 - 1] &= 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "%s/%d", getname((u_char *)&addr), plen); 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1 + (plen + 7) / 8; 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_labeled_prefix4(const u_char *pptr, char *buf, u_int buflen) 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr addr; 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this is one of the weirdnesses of rfc3107 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project the label length (actually the label + COS bits) 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project is added to the prefix length; 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project we also do only read out just one label - 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project there is no real application for advertisement of 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project stacked labels in a a single BGP message 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (24 > plen) 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen-=24; /* adjust prefixlen - labellength */ 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (32 < plen) 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[4], (plen + 7) / 8); 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[4], (plen + 7) / 8); 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((u_char *)&addr)[(plen + 7) / 8 - 1] &= 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the label may get offsetted by 4 bits so lets shift it right */ 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "%s/%d, label:%u %s", 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname((u_char *)&addr), 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen, 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(pptr+1)>>4, 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" ); 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 4 + (plen + 7) / 8; 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* RDs and RTs share the same semantics 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we use bgp_vpn_rd_print for 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * printing route targets inside a NLRI */ 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar * 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_vpn_rd_print (const u_char *pptr) { 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* allocate space for the largest possible string */ 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char rd[sizeof("xxxxxxxxxx:xxxxx (xxx.xxx.xxx.xxx:xxxxx)")]; 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *pos = rd; 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ok lets load the RD format */ 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(pptr)) { 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* AS:IP-address fmt*/ 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0: 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u.%u.%u.%u", 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(pptr+2), *(pptr+4), *(pptr+5), *(pptr+6), *(pptr+7)); 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* IP-address:AS fmt*/ 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(pos, sizeof(rd) - (pos - rd), "%u.%u.%u.%u:%u", 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(pptr+2), *(pptr+3), *(pptr+4), *(pptr+5), EXTRACT_16BITS(pptr+6)); 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4-byte-AS:number fmt*/ 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u (%u.%u.%u.%u:%u)", 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(pptr+2), EXTRACT_16BITS(pptr+6), 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(pptr+2), *(pptr+3), *(pptr+4), *(pptr+5), EXTRACT_16BITS(pptr+6)); 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(pos, sizeof(rd) - (pos - rd), "unknown RD format"); 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pos += strlen(pos); 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(pos) = '\0'; 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (rd); 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_rt_routing_info(const u_char *pptr, char *buf, u_int buflen) 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t route_target[8]; 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (0 == plen) 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; /* default route target */ 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (32 > plen) 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen-=32; /* adjust prefix length */ 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (64 < plen) 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&route_target, 0, sizeof(route_target)); 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[1], (plen + 7) / 8); 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&route_target, &pptr[1], (plen + 7) / 8); 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((u_char *)&route_target)[(plen + 7) / 8 - 1] &= 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "origin AS: %u, route target %s", 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(pptr+1), 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print((u_char *)&route_target)); 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 5 + (plen + 7) / 8; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_labeled_vpn_prefix4(const u_char *pptr, char *buf, u_int buflen) 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr addr; 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((24+64) > plen) 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen-=(24+64); /* adjust prefixlen - labellength - RD len*/ 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (32 < plen) 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[12], (plen + 7) / 8); 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[12], (plen + 7) / 8); 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((u_char *)&addr)[(plen + 7) / 8 - 1] &= 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the label may get offsetted by 4 bits so lets shift it right */ 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s", 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(pptr+4), 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname((u_char *)&addr), 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen, 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(pptr+1)>>4, 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" ); 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 12 + (plen + 7) / 8; 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * As I remember, some versions of systems have an snprintf() that 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * returns -1 if the buffer would have overflowed. If the return 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * value is negative, set buflen to 0, to indicate that we've filled 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the buffer up. 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If the return value is greater than buflen, that means that 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the buffer would have overflowed; again, set buflen to 0 in 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * that case. 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define UPDATE_BUF_BUFLEN(buf, buflen, strlen) \ 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (strlen<0) \ 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buflen=0; \ 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if ((u_int)strlen>buflen) \ 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buflen=0; \ 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { \ 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buflen-=strlen; \ 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buf+=strlen; \ 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_labeled_vpn_l2(const u_char *pptr, char *buf, u_int buflen) 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int plen,tlen,strlen,tlv_type,tlv_len,ttlv_len; 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[0], 2); 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen=EXTRACT_16BITS(pptr); 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen=plen; 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pptr+=2; 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[0],15); 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buf[0]='\0'; 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u", 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(pptr), 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(pptr+8), 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(pptr+10), 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(pptr+12)>>4); /* the label is offsetted by 4 bits so lets shift it right */ 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UPDATE_BUF_BUFLEN(buf, buflen, strlen); 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pptr+=15; 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen-=15; 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ok now the variable part - lets read out TLVs*/ 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tlen>0) { 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < 3) 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[0], 3); 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type=*pptr++; 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len=EXTRACT_16BITS(pptr); 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ttlv_len=tlv_len; 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pptr+=2; 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(tlv_type) { 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (buflen!=0) { 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strlen=snprintf(buf,buflen, "\n\t\tcircuit status vector (%u) length: %u: 0x", 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type, 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len); 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UPDATE_BUF_BUFLEN(buf, buflen, strlen); 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ttlv_len=ttlv_len/8+1; /* how many bytes do we need to read ? */ 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (ttlv_len>0) { 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (buflen!=0) { 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strlen=snprintf(buf,buflen, "%02x",*pptr++); 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UPDATE_BUF_BUFLEN(buf, buflen, strlen); 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ttlv_len--; 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (buflen!=0) { 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strlen=snprintf(buf,buflen, "\n\t\tunknown TLV #%u, length: %u", 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type, 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len); 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UPDATE_BUF_BUFLEN(buf, buflen, strlen); 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it right */ 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return plen+2; 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_prefix6(const u_char *pd, char *buf, u_int buflen) 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr addr; 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pd[0]); 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pd[0]; 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (128 < plen) 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pd[1], (plen + 7) / 8); 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pd[1], (plen + 7) / 8); 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr.s6_addr[(plen + 7) / 8 - 1] &= 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "%s/%d", getname6((u_char *)&addr), plen); 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1 + (plen + 7) / 8; 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_labeled_prefix6(const u_char *pptr, char *buf, u_int buflen) 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr addr; 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (24 > plen) 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen-=24; /* adjust prefixlen - labellength */ 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (128 < plen) 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[4], (plen + 7) / 8); 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[4], (plen + 7) / 8); 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr.s6_addr[(plen + 7) / 8 - 1] &= 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the label may get offsetted by 4 bits so lets shift it right */ 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "%s/%d, label:%u %s", 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname6((u_char *)&addr), 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen, 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(pptr+1)>>4, 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" ); 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 4 + (plen + 7) / 8; 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_labeled_vpn_prefix6(const u_char *pptr, char *buf, u_int buflen) 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr addr; 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((24+64) > plen) 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen-=(24+64); /* adjust prefixlen - labellength - RD len*/ 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (128 < plen) 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[12], (plen + 7) / 8); 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[12], (plen + 7) / 8); 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr.s6_addr[(plen + 7) / 8 - 1] &= 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the label may get offsetted by 4 bits so lets shift it right */ 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s", 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(pptr+4), 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname6((u_char *)&addr), 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen, 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(pptr+1)>>4, 7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" ); 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 12 + (plen + 7) / 8; 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_clnp_prefix(const u_char *pptr, char *buf, u_int buflen) 8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t addr[19]; 8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (152 < plen) 8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[4], (plen + 7) / 8); 8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[4], (plen + 7) / 8); 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr[(plen + 7) / 8 - 1] &= 8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "%s/%d", 8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isonsap_string(addr,(plen + 7) / 8), 8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen); 8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1 + (plen + 7) / 8; 8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdecode_labeled_vpn_clnp_prefix(const u_char *pptr, char *buf, u_int buflen) 8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t addr[19]; 8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int plen; 8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(pptr[0]); 8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen = pptr[0]; /* get prefix length */ 8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((24+64) > plen) 8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen-=(24+64); /* adjust prefixlen - labellength - RD len*/ 8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (152 < plen) 8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr, 0, sizeof(addr)); 8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[12], (plen + 7) / 8); 8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, &pptr[12], (plen + 7) / 8); 8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (plen % 8) { 8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr[(plen + 7) / 8 - 1] &= 8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((0xff00 >> (plen % 8)) & 0xff); 8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the label may get offsetted by 4 bits so lets shift it right */ 8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s", 8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(pptr+4), 8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isonsap_string(addr,(plen + 7) / 8), 8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen, 8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(pptr+1)>>4, 8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" ); 8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 12 + (plen + 7) / 8; 8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -2; 8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_attr_print(const struct bgp_attr *attr, const u_char *pptr, int len) 8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t af; 8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t safi, snpa, nhlen; 8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { /* copy buffer for bandwidth values */ 8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project float f; 8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t i; 8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } bw; 8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int advance; 8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int tlen; 8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *tptr; 8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[MAXHOSTNAMELEN + 100]; 8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = pptr; 8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen=len; 8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (attr->bgpa_type) { 8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_ORIGIN: 8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len != 1) 8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*tptr); 8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", tok2strbuf(bgp_origin_values, 8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown Origin Typecode", 8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr[0], 8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf))); 8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_AS_PATH: 8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len % 2) { 9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!len) { 9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("empty"); 9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tptr < pptr + len) { 9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(tptr[0]); 9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", tok2strbuf(bgp_as_path_segment_open_values, 9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "?", tptr[0], 9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf))); 9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < tptr[1] * 2; i += 2) { 9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[2 + i], 2); 9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u ", EXTRACT_16BITS(&tptr[2 + i])); 9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(tptr[0]); 9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", tok2strbuf(bgp_as_path_segment_close_values, 9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "?", tptr[0], 9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf))); 9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(tptr[1]); 9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += 2 + tptr[1] * 2; 9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_NEXT_HOP: 9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len != 4) 9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 4); 9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", getname(tptr)); 9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_MULTI_EXIT_DISC: 9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_LOCAL_PREF: 9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len != 4) 9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 4); 9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u", EXTRACT_32BITS(tptr)); 9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_ATOMIC_AGGREGATE: 9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len != 0) 9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_AGGREGATOR: 9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len != 6) { 9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 6); 9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AS #%u, origin %s", EXTRACT_16BITS(tptr), 9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr + 2)); 9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_COMMUNITIES: 9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len % 4) { 9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tlen>0) { 9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t comm; 9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 4); 9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project comm = EXTRACT_32BITS(tptr); 9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (comm) { 9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_COMMUNITY_NO_EXPORT: 9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" NO_EXPORT"); 9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_COMMUNITY_NO_ADVERT: 9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" NO_ADVERTISE"); 9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_COMMUNITY_NO_EXPORT_SUBCONFED: 9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" NO_EXPORT_SUBCONFED"); 9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u:%u%s", 9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (comm >> 16) & 0xffff, 9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project comm & 0xffff, 9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (tlen>4) ? ", " : ""); 9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -=4; 9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr +=4; 9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_ORIGINATOR_ID: 9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len != 4) { 9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 4); 9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s",getname(tptr)); 9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_CLUSTER_LIST: 9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len % 4) { 9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tlen>0) { 9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 4); 10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s%s", 10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr), 10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (tlen>4) ? ", " : ""); 10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -=4; 10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr +=4; 10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_MP_REACH_NLRI: 10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 3); 10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project af = EXTRACT_16BITS(tptr); 10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safi = tptr[2]; 10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t AFI: %s (%u), %sSAFI: %s (%u)", 10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(af_values, "Unknown AFI", af, 10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project af, 10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */ 10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_safi_values, "Unknown SAFI", safi, 10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safi); 10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(af<<8 | safi) { 10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNICAST): 10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_MULTICAST): 10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST): 10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_LABUNICAST): 10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO): 10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST): 10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST): 10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST): 10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNICAST): 10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_MULTICAST): 10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST): 10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST): 10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_RT_ROUTING_INFO): 10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST): 10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST): 10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST): 10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNICAST): 10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST): 10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST): 10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST): 10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST): 10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST): 10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST): 10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST): 10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST): 10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_VPLS<<8 | SAFNUM_VPLS): 10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], tlen); 10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t no AFI %u / SAFI %u decoder",af,safi); 10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr,"\n\t ",tlen); 10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto done; 10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr +=3; 10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(tptr[0]); 10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nhlen = tptr[0]; 10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = nhlen; 10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr++; 10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen) { 10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t nexthop: "); 10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tlen > 0) { 10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(af<<8 | safi) { 10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNICAST): 10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_MULTICAST): 10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST): 10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_LABUNICAST): 10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO): 10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < (int)sizeof(struct in_addr)) { 10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], sizeof(struct in_addr)); 10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s",getname(tptr)); 10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= sizeof(struct in_addr); 10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += sizeof(struct in_addr); 10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST): 10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST): 10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST): 10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < (int)(sizeof(struct in_addr)+BGP_VPN_RD_LEN)) { 10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], sizeof(struct in_addr)+BGP_VPN_RD_LEN); 10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RD: %s, %s", 10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(tptr), 10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr+BGP_VPN_RD_LEN)); 10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= (sizeof(struct in_addr)+BGP_VPN_RD_LEN); 10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += (sizeof(struct in_addr)+BGP_VPN_RD_LEN); 10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNICAST): 11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_MULTICAST): 11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST): 11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST): 11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_RT_ROUTING_INFO): 11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < (int)sizeof(struct in6_addr)) { 11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], sizeof(struct in6_addr)); 11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", getname6(tptr)); 11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= sizeof(struct in6_addr); 11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += sizeof(struct in6_addr); 11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST): 11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST): 11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST): 11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < (int)(sizeof(struct in6_addr)+BGP_VPN_RD_LEN)) { 11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], sizeof(struct in6_addr)+BGP_VPN_RD_LEN); 11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RD: %s, %s", 11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(tptr), 11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname6(tptr+BGP_VPN_RD_LEN)); 11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= (sizeof(struct in6_addr)+BGP_VPN_RD_LEN); 11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += (sizeof(struct in6_addr)+BGP_VPN_RD_LEN); 11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_VPLS<<8 | SAFNUM_VPLS): 11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST): 11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST): 11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST): 11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < (int)sizeof(struct in_addr)) { 11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], sizeof(struct in_addr)); 11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", getname(tptr)); 11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -= (sizeof(struct in_addr)); 11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += (sizeof(struct in_addr)); 11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNICAST): 11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST): 11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST): 11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], tlen); 11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s",isonsap_string(tptr,tlen)); 11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += tlen; 11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST): 11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST): 11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST): 11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlen < BGP_VPN_RD_LEN+1) { 11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], tlen); 11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RD: %s, %s", 11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_vpn_rd_print(tptr), 11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isonsap_string(tptr+BGP_VPN_RD_LEN,tlen-BGP_VPN_RD_LEN)); 11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* rfc986 mapped IPv4 address ? */ 11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_32BITS(tptr+BGP_VPN_RD_LEN) == 0x47000601) 11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" = %s", getname(tptr+BGP_VPN_RD_LEN+4)); 11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* rfc1888 mapped IPv6 address ? */ 11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (EXTRACT_24BITS(tptr+BGP_VPN_RD_LEN) == 0x350000) 11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" = %s", getname6(tptr+BGP_VPN_RD_LEN+3)); 11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += tlen; 11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], tlen); 11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("no AFI %u/SAFI %u decoder",af,safi); 11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr,"\n\t ",tlen); 11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += tlen; 11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = 0; 11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto done; 11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", nh-length: %u", nhlen); 11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += tlen; 11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(tptr[0]); 11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snpa = tptr[0]; 11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr++; 11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (snpa) { 11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %u SNPA", snpa); 12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (/*nothing*/; snpa > 0; snpa--) { 12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(tptr[0]); 12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %d bytes", tptr[0]); 12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += tptr[0] + 1; 12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", no SNPA"); 12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (len - (tptr - pptr) > 0) { 12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (af<<8 | safi) { 12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNICAST): 12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_MULTICAST): 12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST): 12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_prefix4(tptr, buf, sizeof(buf)); 12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_LABUNICAST): 12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_prefix4(tptr, buf, sizeof(buf)); 12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST): 12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST): 12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST): 12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_prefix4(tptr, buf, sizeof(buf)); 12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO): 12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_rt_routing_info(tptr, buf, sizeof(buf)); 12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNICAST): 12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_MULTICAST): 12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST): 12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_prefix6(tptr, buf, sizeof(buf)); 12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST): 12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_prefix6(tptr, buf, sizeof(buf)); 12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST): 12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST): 12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST): 12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_prefix6(tptr, buf, sizeof(buf)); 12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_RT_ROUTING_INFO): 12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_rt_routing_info(tptr, buf, sizeof(buf)); 12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_VPLS<<8 | SAFNUM_VPLS): 12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST): 12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST): 12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST): 12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_l2(tptr, buf, sizeof(buf)); 12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal length)"); 13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNICAST): 13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST): 13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST): 13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_clnp_prefix(tptr, buf, sizeof(buf)); 13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST): 13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST): 13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST): 13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_clnp_prefix(tptr, buf, sizeof(buf)); 13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr,tlen); 13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t no AFI %u / SAFI %u decoder",af,safi); 13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr,"\n\t ",tlen); 13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = 0; 13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = pptr + len; 13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance < 0) 13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += advance; 13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project done: 13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_MP_UNREACH_NLRI: 13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], BGP_MP_NLRI_MINSIZE); 13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project af = EXTRACT_16BITS(tptr); 13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safi = tptr[2]; 13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t AFI: %s (%u), %sSAFI: %s (%u)", 13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(af_values, "Unknown AFI", af, 13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project af, 13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */ 13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_safi_values, "Unknown SAFI", safi, 13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safi); 13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len == BGP_MP_NLRI_MINSIZE) 13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t End-of-Rib Marker (empty NLRI)"); 13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += 3; 13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (len - (tptr - pptr) > 0) { 13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (af<<8 | safi) { 13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNICAST): 13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_MULTICAST): 13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST): 13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_prefix4(tptr, buf, sizeof(buf)); 13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_LABUNICAST): 13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_prefix4(tptr, buf, sizeof(buf)); 13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST): 13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST): 13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST): 13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_prefix4(tptr, buf, sizeof(buf)); 13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNICAST): 13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_MULTICAST): 13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST): 13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_prefix6(tptr, buf, sizeof(buf)); 14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST): 14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_prefix6(tptr, buf, sizeof(buf)); 14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST): 14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST): 14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST): 14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_prefix6(tptr, buf, sizeof(buf)); 14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_VPLS<<8 | SAFNUM_VPLS): 14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST): 14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST): 14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST): 14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_l2(tptr, buf, sizeof(buf)); 14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal length)"); 14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNICAST): 14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST): 14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST): 14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_clnp_prefix(tptr, buf, sizeof(buf)); 14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST): 14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST): 14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST): 14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = decode_labeled_vpn_clnp_prefix(tptr, buf, sizeof(buf)); 14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance == -1) 14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (advance == -2) 14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 14632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*(tptr-3),tlen); 14642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("no AFI %u / SAFI %u decoder",af,safi); 14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 14662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr-3,"\n\t ",tlen); 14672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = 0; 14682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = pptr + len; 14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (advance < 0) 14722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += advance; 14742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_EXTD_COMMUNITIES: 14772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len % 8) { 14782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("invalid len"); 14792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tlen>0) { 14822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t extd_comm; 14832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 2); 14852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project extd_comm=EXTRACT_16BITS(tptr); 14862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s (0x%04x), Flags [%s]", 14882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_extd_comm_subtype_values, 14892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unknown extd community typecode", 14902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project extd_comm, tokbuf, sizeof(tokbuf)), 14912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project extd_comm, 14922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(bgp_extd_comm_flag_values, "none", extd_comm)); 14932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*(tptr+2), 6); 14952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(extd_comm) { 14962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_RT_0: 14972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_RO_0: 14982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %u:%s", 14992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr+2), 15002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr+4)); 15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_RT_1: 15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_RO_1: 15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s:%u", 15052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr+2), 15062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr+6)); 15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_RT_2: 15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_RO_2: 15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %u:%u", 15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tptr+2), 15122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr+6)); 15132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_LINKBAND: 15152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bw.i = EXTRACT_32BITS(tptr+2); 15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": bandwidth: %.3f Mbps", 15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bw.f*8/1000000); 15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_CISCO_MCAST: 15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": AS %u, group %s", 15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr+2), 15222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr+4)); 15232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_VPN_ORIGIN: 15252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_VPN_ORIGIN2: 15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_VPN_ORIGIN3: 15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_VPN_ORIGIN4: 15282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_OSPF_RID: 15292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_OSPF_RID2: 15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", getname(tptr+2)); 15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_OSPF_RTYPE: 15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_OSPF_RTYPE2: 15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": area:%s, router-type:%s, metric-type:%s%s", 15352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getname(tptr+2), 15362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_extd_comm_ospf_rtype_values, 15372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unknown (0x%02x)", 15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(tptr+6), 15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 15402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (*(tptr+7) & BGP_OSPF_RTYPE_METRIC_TYPE) ? "E2" : "", 15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((*(tptr+6) == BGP_OSPF_RTYPE_EXT) || (*(tptr+6) == BGP_OSPF_RTYPE_NSSA)) ? "E1" : ""); 15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_EXT_COM_L2INFO: 15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s Control Flags [0x%02x]:MTU %u", 15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(l2vpn_encaps_values, 15462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unknown encaps", 15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(tptr+2), 15482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(tptr+3), 15502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr+4)); 15512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 15532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr,8); 15542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tptr,"\n\t ",8); 15552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen -=8; 15582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr +=8; 15592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 15602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGPTYPE_ATTR_SET: 15632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], 4); 15642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Origin AS: %u", EXTRACT_32BITS(tptr)); 15652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=4; 15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len -=4; 15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (len >= 2 ) { 15692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int alen; 15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp_attr bgpa; 15712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tptr[0], sizeof(bgpa)); 15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgpa, tptr, sizeof(bgpa)); 15742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project alen = bgp_attr_len(&bgpa); 15752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += bgp_attr_off(&bgpa); 15762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len -= bgp_attr_off(&bgpa); 15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s (%u), length: %u", 15792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_attr_values, 15802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown Attribute", bgpa.bgpa_type, 15812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 15822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_type, 15832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project alen); 15842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bgpa.bgpa_flags) { 15862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Flags [%s%s%s%s", 15872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x80 ? "O" : "", 15882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x40 ? "T" : "", 15892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x20 ? "P" : "", 15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x10 ? "E" : ""); 15912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bgpa.bgpa_flags & 0xf) 15922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("+%x", bgpa.bgpa_flags & 0xf); 15932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("]: "); 15942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 15952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* FIXME check for recursion */ 15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!bgp_attr_print(&bgpa, tptr, alen)) 15972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 15982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += alen; 15992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len -= alen; 16002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 16012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 16052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*pptr,len); 16062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t no Attribute %u decoder",attr->bgpa_type); /* we have no decoder for the attribute */ 16072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 16082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(pptr,"\n\t ",len); 16092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 16112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1 && len) { /* omit zero length attributes*/ 16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*pptr,len); 16132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(pptr,"\n\t ",len); 16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 16152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 16162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 16182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 16192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 16202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 16222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_open_print(const u_char *dat, int length) 16232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp_open bgpo; 16252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp_opt bgpopt; 16262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *opt; 16272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i,cap_type,cap_len,tcap_len,cap_offset; 16282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 16292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf2[TOKBUFSIZE]; 16302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(dat[0], BGP_OPEN_SIZE); 16322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgpo, dat, BGP_OPEN_SIZE); 16332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Version %d, ", bgpo.bgpo_version); 16352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("my AS %u, ", ntohs(bgpo.bgpo_myas)); 16362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Holdtime %us, ", ntohs(bgpo.bgpo_holdtime)); 16372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ID %s", getname((u_char *)&bgpo.bgpo_id)); 16382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Optional parameters, length: %u", bgpo.bgpo_optlen); 16392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* some little sanity checking */ 16412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < bgpo.bgpo_optlen+BGP_OPEN_SIZE) 16422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 16432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ugly! */ 16452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt = &((const struct bgp_open *)dat)->bgpo_optlen; 16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt++; 16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = 0; 16492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (i < bgpo.bgpo_optlen) { 16502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(opt[i], BGP_OPT_SIZE); 16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgpopt, &opt[i], BGP_OPT_SIZE); 16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i + 2 + bgpopt.bgpopt_len > bgpo.bgpo_optlen) { 16532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Option %d, length: %u", bgpopt.bgpopt_type, bgpopt.bgpopt_len); 16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Option %s (%u), length: %u", 16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_opt_values,"Unknown", 16592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpopt.bgpopt_type, 16602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpopt.bgpopt_type, 16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpopt.bgpopt_len); 16632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* now lets decode the options we know*/ 16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(bgpopt.bgpopt_type) { 16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_OPT_CAP: 16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_type=opt[i+BGP_OPT_SIZE]; 16682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_len=opt[i+BGP_OPT_SIZE+1]; 16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcap_len=cap_len; 16702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s (%u), length: %u", 16712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_capcode_values, "Unknown", 16722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_type, tokbuf, sizeof(tokbuf)), 16732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_type, 16742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_len); 16752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(cap_type) { 16762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_CAPCODE_MP: 16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\tAFI %s (%u), SAFI %s (%u)", 16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(af_values, "Unknown", 16792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2), 16802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 16812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2), 16822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_safi_values, "Unknown", 16832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt[i+BGP_OPT_SIZE+5], 16842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt[i+BGP_OPT_SIZE+5]); 16862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_CAPCODE_RESTART: 16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\tRestart Flags: [%s], Restart Time %us", 16892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((opt[i+BGP_OPT_SIZE+2])&0x80) ? "R" : "none", 16902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2)&0xfff); 16912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcap_len-=2; 16922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_offset=4; 16932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(tcap_len>=4) { 16942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\t AFI %s (%u), SAFI %s (%u), Forwarding state preserved: %s", 16952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(af_values,"Unknown", 16962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+cap_offset), 16972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 16982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+cap_offset), 16992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_safi_values,"Unknown", 17002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt[i+BGP_OPT_SIZE+cap_offset+2], 17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf2, sizeof(tokbuf2)), 17022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt[i+BGP_OPT_SIZE+cap_offset+2], 17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((opt[i+BGP_OPT_SIZE+cap_offset+3])&0x80) ? "yes" : "no" ); 17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcap_len-=4; 17052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_offset+=4; 17062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_CAPCODE_RR: 17092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_CAPCODE_RR_CISCO: 17102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(opt[i+BGP_OPT_SIZE+2],cap_len); 17132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\tno decoder for Capability %u", 17142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cap_type); 17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 17162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(&opt[i+BGP_OPT_SIZE+2],"\n\t\t",cap_len); 17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1) { 17202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(opt[i+BGP_OPT_SIZE+2],cap_len); 17212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(&opt[i+BGP_OPT_SIZE+2],"\n\t\t",cap_len); 17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_OPT_AUTH: 17252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 17262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t no decoder for option %u", 17272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpopt.bgpopt_type); 17282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i += BGP_OPT_SIZE + bgpopt.bgpopt_len; 17322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 17342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 17352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|BGP]"); 17362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 17372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 17392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_update_print(const u_char *dat, int length) 17402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 17412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp bgp; 17422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp_attr bgpa; 17432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *p; 17442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int len; 17452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 17462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 17472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(dat[0], BGP_SIZE); 17492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgp, dat, BGP_SIZE); 17502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = dat + BGP_SIZE; /*XXX*/ 17512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Unfeasible routes */ 17532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_16BITS(p); 17542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len) { 17552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 17562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Without keeping state from the original NLRI message, 17572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * it's not possible to tell if this a v4 or v6 route, 17582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * so only try to decode it if we're not v6 enabled. 17592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 17602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 17612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Withdrawn routes: %d bytes", len); 17622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 17632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[MAXHOSTNAMELEN + 100]; 17642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int wpfx; 17652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(p[2], len); 17672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = 2; 17682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Withdrawn routes:"); 17702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(i < 2 + len) { 17722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project wpfx = decode_prefix4(&p[i], buf, sizeof(buf)); 17732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (wpfx == -1) { 17742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 17752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (wpfx == -2) 17772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 17782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 17792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i += wpfx; 17802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 17812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 17842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += 2 + len; 17862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(p[0], 2); 17882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_16BITS(p); 17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len == 0 && length == BGP_UPDATE_MINSIZE) { 17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t End-of-Rib Marker (empty NLRI)"); 17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 17932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len) { 17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* do something more useful!*/ 17972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = 2; 17982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (i < 2 + len) { 17992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int alen, aoff; 18002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(p[i], sizeof(bgpa)); 18022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgpa, &p[i], sizeof(bgpa)); 18032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project alen = bgp_attr_len(&bgpa); 18042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project aoff = bgp_attr_off(&bgpa); 18052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s (%u), length: %u", 18072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_attr_values, "Unknown Attribute", 18082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_type, 18092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 18102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_type, 18112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project alen); 18122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bgpa.bgpa_flags) { 18142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Flags [%s%s%s%s", 18152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x80 ? "O" : "", 18162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x40 ? "T" : "", 18172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x20 ? "P" : "", 18182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpa.bgpa_flags & 0x10 ? "E" : ""); 18192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bgpa.bgpa_flags & 0xf) 18202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("+%x", bgpa.bgpa_flags & 0xf); 18212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("]: "); 18222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!bgp_attr_print(&bgpa, &p[i + aoff], alen)) 18242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 18252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i += aoff + alen; 18262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += 2 + len; 18292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dat + length > p) { 18312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Updated routes:"); 18322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (dat + length > p) { 18332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[MAXHOSTNAMELEN + 100]; 18342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = decode_prefix4(p, buf, sizeof(buf)); 18352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i == -1) { 18362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t (illegal prefix length)"); 18372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 18382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (i == -2) 18392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 18402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 18412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", buf); 18422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += i; 18432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 18472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 18482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|BGP]"); 18492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 18502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 18522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_notification_print(const u_char *dat, int length) 18532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 18542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp_notification bgpn; 18552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *tptr; 18562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 18572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf2[TOKBUFSIZE]; 18582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(dat[0], BGP_NOTIFICATION_SIZE); 18602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgpn, dat, BGP_NOTIFICATION_SIZE); 18612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* some little sanity checking */ 18632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length<BGP_NOTIFICATION_SIZE) 18642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 18652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", %s (%u)", 18672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_notify_major_values, "Unknown Error", 18682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_major, tokbuf, sizeof(tokbuf)), 18692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_major); 18702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bgpn.bgpn_major) { 18722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_NOTIFY_MAJOR_MSG: 18742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", subcode %s (%u)", 18752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_notify_minor_msg_values, "Unknown", 18762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)), 18772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor); 18782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 18792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_NOTIFY_MAJOR_OPEN: 18802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", subcode %s (%u)", 18812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_notify_minor_open_values, "Unknown", 18822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)), 18832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor); 18842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 18852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_NOTIFY_MAJOR_UPDATE: 18862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", subcode %s (%u)", 18872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_notify_minor_update_values, "Unknown", 18882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)), 18892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor); 18902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 18912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_NOTIFY_MAJOR_CAP: 18922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" subcode %s (%u)", 18932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_notify_minor_cap_values, "Unknown", 18942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)), 18952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor); 18962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_NOTIFY_MAJOR_CEASE: 18972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", subcode %s (%u)", 18982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_notify_minor_cease_values, "Unknown", 18992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)), 19002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgpn.bgpn_minor); 19012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* draft-ietf-idr-cease-subcode-02 mentions optionally 7 bytes 19032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * for the maxprefix subtype, which may contain AFI, SAFI and MAXPREFIXES 19042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 19052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(bgpn.bgpn_minor == BGP_NOTIFY_MINOR_CEASE_MAXPRFX && length >= BGP_NOTIFICATION_SIZE + 7) { 19062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = dat + BGP_NOTIFICATION_SIZE; 19072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr, 7); 19082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", AFI %s (%u), SAFI %s (%u), Max Prefixes: %u", 19092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(af_values, "Unknown", 19102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr), tokbuf, sizeof(tokbuf)), 19112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tptr), 19122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_safi_values, "Unknown", *(tptr+2), 19132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf2, sizeof(tokbuf)), 19142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(tptr+2), 19152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tptr+3)); 19162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 19172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 19192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 19212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 19232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 19242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|BGP]"); 19252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 19262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 19282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_route_refresh_print(const u_char *pptr, int len) { 19292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct bgp_route_refresh *bgp_route_refresh_header; 19312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 19322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf2[TOKBUFSIZE]; 19332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(pptr[0], BGP_ROUTE_REFRESH_SIZE); 19352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* some little sanity checking */ 19372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len<BGP_ROUTE_REFRESH_SIZE) 19382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 19392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_route_refresh_header = (const struct bgp_route_refresh *)pptr; 19412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t AFI %s (%u), SAFI %s (%u)", 19432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(af_values,"Unknown", 19442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this stinks but the compiler pads the structure 19452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * weird */ 19462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&bgp_route_refresh_header->afi), 19472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 19482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&bgp_route_refresh_header->afi), 19492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_safi_values,"Unknown", 19502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_route_refresh_header->safi, 19512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf2, sizeof(tokbuf2)), 19522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_route_refresh_header->safi); 19532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1) { 19552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*pptr, len); 19562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(pptr,"\n\t ", len); 19572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 19582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 19602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 19612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|BGP]"); 19622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 19632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 19652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_header_print(const u_char *dat, int length) 19662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 19672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp bgp; 19682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 19692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(dat[0], BGP_SIZE); 19712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgp, dat, BGP_SIZE); 19722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t%s Message (%u), length: %u", 19732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_msg_values, "Unknown", bgp.bgp_type, 19742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf)), 19752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp.bgp_type, 19762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 19772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bgp.bgp_type) { 19792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_OPEN: 19802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_open_print(dat, length); 19812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_UPDATE: 19832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_update_print(dat, length); 19842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_NOTIFICATION: 19862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_notification_print(dat, length); 19872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_KEEPALIVE: 19892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case BGP_ROUTE_REFRESH: 19912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_route_refresh_print(dat, length); 19922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 19942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* we have no decoder for the BGP message */ 19952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*dat, length); 19962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t no Message %u decoder",bgp.bgp_type); 19972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(dat,"\n\t ",length); 19982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 20012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 20022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|BGP]"); 20032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 20042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 20052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 20072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbgp_print(const u_char *dat, int length) 20082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 20092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *p; 20102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep; 20112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *start; 20122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char marker[] = { 20132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 20142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 20152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 20162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct bgp bgp; 20172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t hlen; 20182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tokbuf[TOKBUFSIZE]; 20192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep = dat + length; 20212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (snapend < dat + length) 20222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep = snapend; 20232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": BGP, length: %u",length); 20252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag < 1) /* lets be less chatty */ 20272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 20282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = dat; 20302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project start = p; 20312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (p < ep) { 20322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(p[0], 1)) 20332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p[0] != 0xff) { 20352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p++; 20362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 20372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(p[0], sizeof(marker))) 20402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(p, marker, sizeof(marker)) != 0) { 20422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p++; 20432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 20442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* found BGP header */ 20472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(p[0], BGP_SIZE); /*XXX*/ 20482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&bgp, p, BGP_SIZE); 20492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (start != p) 20512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|BGP]"); 20522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen = ntohs(bgp.bgp_len); 20542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hlen < BGP_SIZE) { 20552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n[|BGP Bogus header length %u < %u]", hlen, 20562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project BGP_SIZE); 20572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (TTEST2(p[0], hlen)) { 20612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!bgp_header_print(p, hlen)) 20622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 20632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += hlen; 20642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project start = p; 20652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 20662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n[|BGP %s]", 20672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2strbuf(bgp_msg_values, 20682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown Message Type", 20692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp.bgp_type, 20702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokbuf, sizeof(tokbuf))); 20712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 20762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 20782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|BGP]"); 20792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2080