1999-11-01 14:22:36 +00:00
|
|
|
/* packet-bgp.c
|
|
|
|
* Definitions for BGP packet disassembly structures and routine
|
|
|
|
*
|
2002-08-15 18:52:04 +00:00
|
|
|
* $Id: packet-bgp.h,v 1.18 2002/08/15 18:52:04 guy Exp $
|
1999-11-01 14:22:36 +00:00
|
|
|
*
|
|
|
|
* Ethereal - Network traffic analyzer
|
There is really no need to have the BGP dissector and the LDP dissector
have two independent "value_string" tables mapping RFC 1700 address
family numbers to names, nor is there any need to have the BGP dissector
and the PIM dissector have two independent sets of #defines for RFC 1700
address family numbers; put a single "value_string" table in "afn.c" and
put a declaration of it, and #defines for the address family numbers,
into "afn.h", and have the dissectors use that.
Move the #define for PGM into "ipproto.h", and add an entry for it in
the "value_string" table in "ipproto.c".
Have the PGM dissector use the standard Ethereal mechanisms for
resolving addresses, and have it use "value_string" tables for mapping
option types, the OPX bits, and packet types to strings. Use
"bytes_to_str()" to turn byte arrays into strings of hex digits. Pass
the packet type string to "dissect_pgmopts()" as an argument, rather
than making it a global. Don't use "proto_tree_add_XXX_format" routines
if you can possibly just use "proto_tree_add_XXX"; give various fields
the correct radix and type, and VALS() strings if necessary, to make
that happen (and to make filtering on them more pleasant). Put the
type, length, and total length of the options into the protocol tree as
separate fields. Don't have separate type, length, and OPX fields for
every type of option; one field will suffice. Don't format a string
with "sprintf()" and then pass that string to "col_add_fstr()" with a
format of "%s" and the string as an argument - "col_add_fstr()" can
format strings itself (that's what the "f" stands for). Don't byte-swap
and then un-byte-swap IPv4 address fields in the header, just leave them
network byte order to start with. Use the correct fields for
"proto_tree_add_XXX", rather than using the same field multiple times.
Quit early if an address family identifier isn't AFNUM_INET, as that
means the structure we use to dissect the header doesn't match the
actual header.
svn path=/trunk/; revision=3761
2001-07-21 10:27:13 +00:00
|
|
|
* By Gerald Combs <gerald@ethereal.com>
|
1999-11-01 14:22:36 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __PACKET_BGP_H__
|
|
|
|
#define __PACKET_BGP_H__
|
|
|
|
|
|
|
|
/* some handy things to know */
|
|
|
|
#define BGP_MAX_PACKET_SIZE 4096
|
|
|
|
#define BGP_MARKER_SIZE 16
|
|
|
|
#define BGP_HEADER_SIZE 19
|
|
|
|
#define BGP_MIN_OPEN_MSG_SIZE 29
|
|
|
|
#define BGP_MIN_UPDATE_MSG_SIZE 23
|
|
|
|
#define BGP_MIN_NOTIFICATION_MSG_SIZE 21
|
|
|
|
#define BGP_MIN_KEEPALVE_MSG_SIZE BGP_HEADER_SIZE
|
2000-12-25 05:28:40 +00:00
|
|
|
#define BGP_TCP_PORT 179
|
1999-11-01 14:22:36 +00:00
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* BGP message types */
|
1999-11-01 14:22:36 +00:00
|
|
|
#define BGP_OPEN 1
|
|
|
|
#define BGP_UPDATE 2
|
|
|
|
#define BGP_NOTIFICATION 3
|
|
|
|
#define BGP_KEEPALIVE 4
|
2000-12-25 05:28:40 +00:00
|
|
|
#define BGP_ROUTE_REFRESH 5
|
2001-05-16 18:52:37 +00:00
|
|
|
#define BGP_ROUTE_REFRESH_CISCO 0x80
|
1999-11-01 14:22:36 +00:00
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* BGP header */
|
1999-11-02 00:11:58 +00:00
|
|
|
struct bgp {
|
|
|
|
guint8 bgp_marker[BGP_MARKER_SIZE];
|
|
|
|
guint16 bgp_len;
|
|
|
|
guint8 bgp_type;
|
|
|
|
};
|
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* BGP OPEN message */
|
1999-11-01 14:22:36 +00:00
|
|
|
struct bgp_open {
|
|
|
|
guint8 bgpo_marker[BGP_MARKER_SIZE];
|
|
|
|
guint16 bgpo_len;
|
|
|
|
guint8 bgpo_type;
|
|
|
|
guint8 bgpo_version;
|
|
|
|
guint16 bgpo_myas;
|
|
|
|
guint16 bgpo_holdtime;
|
|
|
|
guint32 bgpo_id;
|
|
|
|
guint8 bgpo_optlen;
|
|
|
|
/* options should follow */
|
|
|
|
};
|
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* BGP NOTIFICATION message */
|
1999-11-01 14:22:36 +00:00
|
|
|
struct bgp_notification {
|
1999-11-02 00:11:58 +00:00
|
|
|
guint8 bgpn_marker[BGP_MARKER_SIZE];
|
1999-11-01 14:22:36 +00:00
|
|
|
guint16 bgpn_len;
|
|
|
|
guint8 bgpn_type;
|
|
|
|
guint8 bgpn_major;
|
|
|
|
guint8 bgpn_minor;
|
|
|
|
/* data should follow */
|
|
|
|
};
|
|
|
|
|
2000-12-25 05:28:40 +00:00
|
|
|
/* BGP ROUTE-REFRESH message */
|
|
|
|
struct bgp_route_refresh {
|
|
|
|
guint8 bgpr_marker[BGP_MARKER_SIZE];
|
|
|
|
guint16 bgpr_len;
|
|
|
|
guint8 bgpr_type;
|
|
|
|
guint16 bgpr_afi;
|
|
|
|
guint8 bgpr_reserved;
|
|
|
|
guint8 bgpr_safi;
|
|
|
|
};
|
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* path attribute */
|
1999-11-01 14:22:36 +00:00
|
|
|
struct bgp_attr {
|
|
|
|
guint8 bgpa_flags;
|
|
|
|
guint8 bgpa_type;
|
|
|
|
};
|
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* attribute flags, from RFC1771 */
|
1999-11-11 21:08:52 +00:00
|
|
|
#define BGP_ATTR_FLAG_OPTIONAL 0x80
|
|
|
|
#define BGP_ATTR_FLAG_TRANSITIVE 0x40
|
|
|
|
#define BGP_ATTR_FLAG_PARTIAL 0x20
|
|
|
|
#define BGP_ATTR_FLAG_EXTENDED_LENGTH 0x10
|
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* AS_PATH segment types */
|
|
|
|
#define AS_SET 1 /* RFC1771 */
|
|
|
|
#define AS_SEQUENCE 2 /* RFC1771 */
|
2000-12-25 05:28:40 +00:00
|
|
|
#define AS_CONFED_SET 4 /* RFC1965 has the wrong values, corrected in */
|
|
|
|
#define AS_CONFED_SEQUENCE 3 /* draft-ietf-idr-bgp-confed-rfc1965bis-01.txt */
|
|
|
|
|
|
|
|
/* OPEN message Optional Parameter types */
|
|
|
|
#define BGP_OPTION_AUTHENTICATION 1 /* RFC1771 */
|
|
|
|
#define BGP_OPTION_CAPABILITY 2 /* RFC2842 */
|
|
|
|
|
|
|
|
/* BGP capability code */
|
|
|
|
#define BGP_CAPABILITY_RESERVED 0 /* RFC2434 */
|
|
|
|
#define BGP_CAPABILITY_MULTIPROTOCOL 1 /* RFC2858 */
|
|
|
|
#define BGP_CAPABILITY_ROUTE_REFRESH 2 /* RFC2918 */
|
2001-11-03 21:25:12 +00:00
|
|
|
#define BGP_CAPABILITY_COOPERATIVE_ROUTE_FILTERING 3 /* draft-ietf-idr-route-filter-04.txt */
|
2002-08-15 18:52:04 +00:00
|
|
|
#define BGP_CAPABILITY_ORF_CISCO 0x82 /* Cisco */
|
2001-05-16 18:52:37 +00:00
|
|
|
#define BGP_CAPABILITY_ROUTE_REFRESH_CISCO 0x80 /* Cisco */
|
|
|
|
|
2002-08-15 18:52:04 +00:00
|
|
|
#define BGP_ORF_PREFIX_CISCO 0x80 /* Cisco */
|
|
|
|
#define BGP_ORF_COMM_CISCO 0x81 /* Cisco */
|
|
|
|
#define BGP_ORF_EXTCOMM_CISCO 0x82 /* Cisco */
|
|
|
|
#define BGP_ORF_ASPATH_CISCO 0x83 /* Cisco */
|
|
|
|
#define BGP_ORF_COMM 0x02 /* draft-ietf-idr-route-filter-06.txt */
|
|
|
|
#define BGP_ORF_EXTCOMM 0x03 /* draft-ietf-idr-route-filter-06.txt */
|
|
|
|
#define BGP_ORF_ASPATH 0x04 /* draft-ietf-idr-aspath-orf-02.txt */
|
|
|
|
/* draft-ietf-idr-route-filter-06.txt */
|
|
|
|
#define BGP_ORF_ACTION 0xc0
|
|
|
|
#define BGP_ORF_ADD 0x00
|
|
|
|
#define BGP_ORF_REMOVE 0x40
|
|
|
|
#define BGP_ORF_REMOVEALL 0x80
|
|
|
|
#define BGP_ORF_MATCH 0x10
|
|
|
|
#define BGP_ORF_PERMIT 0x00
|
|
|
|
#define BGP_ORF_DENY 0x10
|
1999-11-11 21:08:52 +00:00
|
|
|
|
1999-11-22 07:05:21 +00:00
|
|
|
/* well-known communities, from RFC1997 */
|
|
|
|
#define BGP_COMM_NO_EXPORT 0xFFFFFF01
|
|
|
|
#define BGP_COMM_NO_ADVERTISE 0xFFFFFF02
|
|
|
|
#define BGP_COMM_NO_EXPORT_SUBCONFED 0xFFFFFF03
|
2002-01-30 23:04:02 +00:00
|
|
|
#define FOURHEX0 0x00000000
|
|
|
|
#define FOURHEXF 0xFFFF0000
|
1999-11-22 07:05:21 +00:00
|
|
|
|
|
|
|
/* attribute types */
|
1999-11-06 01:28:50 +00:00
|
|
|
#define BGPTYPE_ORIGIN 1 /* RFC1771 */
|
|
|
|
#define BGPTYPE_AS_PATH 2 /* RFC1771 */
|
|
|
|
#define BGPTYPE_NEXT_HOP 3 /* RFC1771 */
|
|
|
|
#define BGPTYPE_MULTI_EXIT_DISC 4 /* RFC1771 */
|
|
|
|
#define BGPTYPE_LOCAL_PREF 5 /* RFC1771 */
|
|
|
|
#define BGPTYPE_ATOMIC_AGGREGATE 6 /* RFC1771 */
|
|
|
|
#define BGPTYPE_AGGREGATOR 7 /* RFC1771 */
|
|
|
|
#define BGPTYPE_COMMUNITIES 8 /* RFC1997 */
|
2000-12-25 05:28:40 +00:00
|
|
|
#define BGPTYPE_ORIGINATOR_ID 9 /* RFC2796 */
|
|
|
|
#define BGPTYPE_CLUSTER_LIST 10 /* RFC2796 */
|
1999-11-06 01:28:50 +00:00
|
|
|
#define BGPTYPE_DPA 11 /* work in progress */
|
1999-11-22 07:05:21 +00:00
|
|
|
#define BGPTYPE_ADVERTISER 12 /* RFC1863 */
|
1999-11-06 01:28:50 +00:00
|
|
|
#define BGPTYPE_RCID_PATH 13 /* RFC1863 */
|
2000-12-25 05:28:40 +00:00
|
|
|
#define BGPTYPE_MP_REACH_NLRI 14 /* RFC2858 */
|
|
|
|
#define BGPTYPE_MP_UNREACH_NLRI 15 /* RFC2858 */
|
2001-06-10 02:08:11 +00:00
|
|
|
#define BGPTYPE_EXTENDED_COMMUNITY 16 /* Draft Ramachandra */
|
|
|
|
|
|
|
|
/* Extended community type */
|
2001-07-08 22:59:51 +00:00
|
|
|
/* draft-ramachandra-bgp-ext-communities */
|
2001-06-10 02:08:11 +00:00
|
|
|
#define BGP_EXT_COM_RT_0 0x0002 /* Route Target,Format AS(2bytes):AN(4bytes) */
|
|
|
|
#define BGP_EXT_COM_RT_1 0x0102 /* Route Target,Format IP address:AN(2bytes) */
|
|
|
|
#define BGP_EXT_COM_RO_0 0x0003 /* Route Origin,Format AS(2bytes):AN(4bytes) */
|
|
|
|
#define BGP_EXT_COM_RO_1 0x0103 /* Route Origin,Format IP address:AN(2bytes) */
|
2001-07-08 22:59:51 +00:00
|
|
|
#define BGP_EXT_COM_LINKBAND 0x4004 /* Link Bandwidth,Format AS(2B):Bandwidth(4B) */
|
|
|
|
/* rfc2547 bgp-mpls-vpns */
|
|
|
|
#define BGP_EXT_COM_VPN_ORIGIN 0x0005 /* OSPF Domin ID / VPN of Origin */
|
|
|
|
/* draft-rosen-vpns-ospf-bgp-mpls */
|
|
|
|
#define BGP_EXT_COM_OSPF_RTYPE 0X8000 /* OSPF Route Type,Format Area(4B):RouteType(1B):Options(1B) */
|
|
|
|
#define BGP_EXT_COM_OSPF_RID 0x8001 /* OSPF Router ID,Format RouterID(4B):Unused(2B) */
|
|
|
|
|
|
|
|
|
|
|
|
/* OSPF codes for BGP_EXT_COM_OSPF_RTYPE draft-rosen-vpns-ospf-bgp-mpls */
|
|
|
|
#define BGP_OSPF_RTYPE_RTR 1 /* OSPF Router LSA */
|
|
|
|
#define BGP_OSPF_RTYPE_NET 2 /* OSPF Network LSA */
|
|
|
|
#define BGP_OSPF_RTYPE_SUM 3 /* OSPF Summary LSA */
|
|
|
|
#define BGP_OSPF_RTYPE_EXT 5 /* OSPF External LSA, note that ASBR doesn't apply to MPLS-VPN */
|
|
|
|
#define BGP_OSPF_RTYPE_NSSA 7 /* OSPF NSSA External*/
|
|
|
|
#define BGP_OSPF_RTYPE_SHAM 129 /* OSPF-MPLS-VPN Sham link */
|
|
|
|
#define BGP_OSPF_RTYPE_METRIC_TYPE 0x1 /* LSB of RTYPE Options Field */
|
2001-06-10 02:08:11 +00:00
|
|
|
|
|
|
|
/* Extended community & Route dinstinguisher formats */
|
|
|
|
#define FORMAT_AS2_LOC 0x00 /* Format AS(2bytes):AN(4bytes) */
|
|
|
|
#define FORMAT_IP_LOC 0x01 /* Format IP address:AN(2bytes) */
|
|
|
|
#define FORMAT_AS4_LOC 0x02 /* FOrmat AS(4bytes):AN(2bytes) */
|
1999-11-01 14:22:36 +00:00
|
|
|
|
2001-06-10 02:08:11 +00:00
|
|
|
/* RFC 2858 subsequent address family numbers */
|
|
|
|
#define SAFNUM_UNICAST 1
|
|
|
|
#define SAFNUM_MULCAST 2
|
|
|
|
#define SAFNUM_UNIMULC 3
|
2001-07-08 22:59:51 +00:00
|
|
|
#define SAFNUM_MPLS_LABEL 4 /* rfc3107 */
|
2001-06-10 02:08:11 +00:00
|
|
|
#define SAFNUM_LBVPNIP 128 /* Draft-rosen-rfc2547bis-03 */
|
|
|
|
|
1999-11-02 00:11:58 +00:00
|
|
|
#ifndef offsetof
|
|
|
|
#define offsetof(type, member) ((size_t)(&((type *)0)->member))
|
|
|
|
#endif
|
|
|
|
|
1999-11-01 14:22:36 +00:00
|
|
|
#endif
|