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