diff options
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_mrt.h')
-rw-r--r-- | net/openbgpd/files/patch-bgpd_mrt.h | 253 |
1 files changed, 237 insertions, 16 deletions
diff --git a/net/openbgpd/files/patch-bgpd_mrt.h b/net/openbgpd/files/patch-bgpd_mrt.h index 7bf1857d39eb..0c9d835f5b78 100644 --- a/net/openbgpd/files/patch-bgpd_mrt.h +++ b/net/openbgpd/files/patch-bgpd_mrt.h @@ -2,13 +2,13 @@ Index: bgpd/mrt.h =================================================================== RCS file: /home/cvs/private/hrs/openbgpd/bgpd/mrt.h,v retrieving revision 1.1.1.6 -retrieving revision 1.1.1.8 -diff -u -p -r1.1.1.6 -r1.1.1.8 +retrieving revision 1.1.1.9 +diff -u -p -r1.1.1.6 -r1.1.1.9 --- bgpd/mrt.h 14 Feb 2010 20:19:57 -0000 1.1.1.6 -+++ bgpd/mrt.h 12 Jun 2011 10:44:25 -0000 1.1.1.8 ++++ bgpd/mrt.h 13 Oct 2012 18:22:43 -0000 1.1.1.9 @@ -1,4 +1,4 @@ -/* $OpenBSD: mrt.h,v 1.23 2009/06/29 12:22:16 claudio Exp $ */ -+/* $OpenBSD: mrt.h,v 1.27 2010/06/04 10:13:00 claudio Exp $ */ ++/* $OpenBSD: mrt.h,v 1.30 2011/09/18 09:31:25 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> @@ -26,7 +26,34 @@ diff -u -p -r1.1.1.6 -r1.1.1.8 * http://www.quagga.net/docs/docs-multi/Packet-Binary-Dump-Format.html */ -@@ -75,8 +73,10 @@ enum MRT_BGP4MP_TYPES { +@@ -37,11 +35,18 @@ + * | length | length of packet excluding this header + * +--------+--------+--------+--------+ + * +- * ET types include an additional 32bit microsecond field comming after the +- * length field. ++ * ET types include an additional 32bit microsecond field coming after the ++ * length field. Which is accounted in the length field. + */ + #define MRT_HEADER_SIZE 12 + ++struct mrt_hdr { ++ u_int32_t timestamp; ++ u_int16_t type; ++ u_int16_t subtype; ++ u_int32_t length; ++} __packed; ++ + enum MRT_MSG_TYPES { + MSG_NULL, /* 0 empty msg (deprecated) */ + MSG_START, /* 1 sender is starting up */ +@@ -70,13 +75,15 @@ enum MRT_MSG_TYPES { + * that are normaly saved as MSG_TABLE_DUMP. + * In most cases this is the format to choose to dump updates et al. + */ +-enum MRT_BGP4MP_TYPES { ++enum MRT_BGP4MP_SUBTYPES { + BGP4MP_STATE_CHANGE, /* state change */ BGP4MP_MESSAGE, /* bgp message */ BGP4MP_ENTRY, /* table dumps (deprecated) */ BGP4MP_SNAPSHOT, /* file name for dump (deprecated) */ @@ -38,29 +65,223 @@ diff -u -p -r1.1.1.6 -r1.1.1.8 }; /* size of the BGP4MP headers without payload */ -@@ -184,6 +184,7 @@ enum MRT_BGP4MP_TYPES { +@@ -104,6 +111,7 @@ enum MRT_BGP4MP_TYPES { + * + * The source_ip and dest_ip are dependant of the afi type. For IPv6 source_ip + * and dest_ip are both 16 bytes long. ++ * For the AS4 types the source_as and dest_as numbers are both 4 bytes long. + * + * Payload of a BGP4MP_STATE_CHANGE packet: + * +@@ -155,6 +163,98 @@ enum MRT_BGP4MP_TYPES { + */ + + /* ++ * New MRT dump format MSG_TABLE_DUMP_V2, the dump is implemented with ++ * sub-tables for peers and NLRI entries just use the index into the peer ++ * table. ++ */ ++enum MRT_DUMP_V2_SUBTYPES { ++ MRT_DUMP_V2_PEER_INDEX_TABLE=1, ++ MRT_DUMP_V2_RIB_IPV4_UNICAST=2, ++ MRT_DUMP_V2_RIB_IPV4_MULTICAST=3, ++ MRT_DUMP_V2_RIB_IPV6_UNICAST=4, ++ MRT_DUMP_V2_RIB_IPV6_MULTICAST=5, ++ MRT_DUMP_V2_RIB_GENERIC=6 ++}; ++ ++/* ++ * Format of the MRT_DUMP_V2_PEER_INDEX_TABLE: ++ * If there is no view_name, view_name_len must be set to 0 ++ * ++ * +--------+--------+--------+--------+ ++ * | collector_bgp_id | ++ * +--------+--------+--------+--------+ ++ * | view_name_len | view_name ++ * +--------+--------+--------+--------+ ++ * view_name (variable) ... | ++ * +--------+--------+--------+--------+ ++ * | peer_count | peer_entries ++ * +--------+--------+--------+--------+ ++ * peer_entries (variable) ... ++ * +--------+--------+--------+--------+ ++ * ++ * The format of a peer_entry is the following: ++ * ++ * +--------+ ++ * | type | ++ * +--------+--------+--------+--------+ ++ * | peer_bgp_id | ++ * +--------+--------+--------+--------+ ++ * | peer_ip_addr (variable) | ++ * +--------+--------+--------+--------+ ++ * | peer_as (variable) | ++ * +--------+--------+--------+--------+ ++ * ++ * The message is packed a bit strangely. The type byte defines what size ++ * the peer addr and peer AS have. ++ * The position of a peer in the PEER_INDEX_TABLE is used as the index for ++ * the other messages. ++ */ ++#define MRT_DUMP_V2_PEER_BIT_I 0x1 /* set for IPv6 addrs */ ++#define MRT_DUMP_V2_PEER_BIT_A 0x2 /* set for 32 bits AS number */ ++ ++/* ++ * AFI/SAFI specific RIB Subtypes are special to save a few bytes. ++ * ++ * +--------+--------+--------+--------+ ++ * | seq_num | ++ * +--------+--------+--------+--------+ ++ * | plen | prefix (variable) ++ * +--------+--------+--------+--------+ ++ * | #entry | rib entries (variable) ++ * +--------+--------+--------+--------+ ++ * ++ * The RIB_GENERIC subtype is needed for the less common AFI/SAFI pairs ++ * ++ * +--------+--------+--------+--------+ ++ * | seq_num | ++ * +--------+--------+--------+--------+ ++ * | AFI | SAFI | NLRI ++ * +--------+--------+--------+--------+ ++ * NLRI (variable) ... ++ * +--------+--------+--------+--------+ ++ * | #entry | rib entries (variable) ++ * +--------+--------+--------+--------+ ++ */ ++ ++/* ++ * The RIB entries have the following form. ++ * ++ * +--------+--------+ ++ * | peer index | ++ * +--------+--------+--------+--------+ ++ * | originated_time | ++ * +--------+--------+--------+--------+ ++ * | attr_len | bgp_attrs ++ * +--------+--------+--------+--------+ ++ * bgp_attrs (variable) ... ++ * +--------+--------+--------+--------+ ++ * ++ * Some BGP path attributes need special encoding: ++ * - the AS_PATH attribute MUST be encoded as 4-Byte AS ++ * - the MP_REACH_NLRI only consists of the nexthop len and nexthop address ++ */ ++ ++/* + * Format for routing table dumps in "old" mrt format. + * Type MSG_TABLE_DUMP and subtype is AFI_IPv4 (1) for IPv4 and AFI_IPv6 (2) + * for IPv6. In the IPv6 case prefix and peer_ip are both 16 bytes long. +@@ -182,8 +282,14 @@ enum MRT_BGP4MP_TYPES { + * The status field is unused and should be set to 1. + */ ++enum MRT_DUMP_SUBTYPES { ++ MRT_DUMP_AFI_IP=1, ++ MRT_DUMP_AFI_IPv6=2 ++}; ++ /* size of the dump header until attr_len */ #define MRT_DUMP_HEADER_SIZE 22 +#define MRT_DUMP_HEADER_SIZE_V6 46 /* * OLD MRT message headers. These structs are here for completion but -@@ -235,7 +236,7 @@ enum MRT_BGP_TYPES { +@@ -192,7 +298,7 @@ enum MRT_BGP4MP_TYPES { + * Only for bgp messages (type 5, 9 and 10) + * Nota bene for bgp dumps MSG_PROTOCOL_BGP4MP should be used. + */ +-enum MRT_BGP_TYPES { ++enum MRT_BGP_SUBTYPES { + MSG_BGP_NULL, + MSG_BGP_UPDATE, /* raw update packet (contains both withdraws + and announcements) */ +@@ -221,10 +327,8 @@ enum MRT_BGP_TYPES { + * + * For IPv6 the type is MSG_PROTOCOL_BGP4PLUS and the subtype remains + * MSG_BGP_UPDATE. The source_ip and dest_ip are again extended to 16 bytes. +- */ +- +-/* +- * For subtype MSG_BGP_STATECHANGE (for all BGP types or just for the ++ * ++ * For subtype MSG_BGP_STATE_CHANGE (for all BGP types or just for the + * MSG_PROTOCOL_BGP4PLUS case? Unclear.) + * + * +--------+--------+--------+--------+ +@@ -235,7 +339,7 @@ enum MRT_BGP_TYPES { * | new_state | * +--------+--------+ * - * State are defined in RFC 1771. -+ * State are defined in RFC 1771/4271. ++ * States are defined in RFC 1771/4271. */ /* -@@ -303,7 +304,7 @@ void mrt_dump_state(struct mrt *, u_in - struct peer *); - void mrt_clear_seq(void); - void mrt_dump_upcall(struct rib_entry *, void *); +@@ -251,66 +355,4 @@ enum MRT_BGP_TYPES { + * terminated ... | 0 | + * +--------+--------+--------+ + */ +- +-#define MRT_FILE_LEN 512 +-enum mrt_type { +- MRT_NONE, +- MRT_TABLE_DUMP, +- MRT_TABLE_DUMP_MP, +- MRT_ALL_IN, +- MRT_ALL_OUT, +- MRT_UPDATE_IN, +- MRT_UPDATE_OUT +-}; +- +-enum mrt_state { +- MRT_STATE_RUNNING, +- MRT_STATE_OPEN, +- MRT_STATE_REOPEN, +- MRT_STATE_REMOVE +-}; +- +-struct mrt { +- char rib[PEER_DESCR_LEN]; +- struct msgbuf wbuf; +- LIST_ENTRY(mrt) entry; +- u_int32_t peer_id; +- u_int32_t group_id; +- enum mrt_type type; +- enum mrt_state state; +- u_int16_t seqnum; +-}; +- +-struct mrt_config { +- struct mrt conf; +- char name[MRT_FILE_LEN]; /* base file name */ +- char file[MRT_FILE_LEN]; /* actual file name */ +- time_t ReopenTimer; +- time_t ReopenTimerInterval; +-}; +- +-#define MRT2MC(x) ((struct mrt_config *)(x)) +-#define MRT_MAX_TIMEOUT 7200 +- +-struct peer; +-struct prefix; +-struct rib_entry; +- +-/* prototypes */ +-void mrt_dump_bgp_msg(struct mrt *, void *, u_int16_t, +- struct peer *); +-void mrt_dump_state(struct mrt *, u_int16_t, u_int16_t, +- struct peer *); +-void mrt_clear_seq(void); +-void mrt_dump_upcall(struct rib_entry *, void *); -void mrt_dump_done(void *); -+void mrt_done(void *); - void mrt_write(struct mrt *); - void mrt_clean(struct mrt *); - void mrt_init(struct imsgbuf *, struct imsgbuf *); +-void mrt_write(struct mrt *); +-void mrt_clean(struct mrt *); +-void mrt_init(struct imsgbuf *, struct imsgbuf *); +-int mrt_timeout(struct mrt_head *); +-void mrt_reconfigure(struct mrt_head *); +-void mrt_handler(struct mrt_head *); +-struct mrt *mrt_get(struct mrt_head *, struct mrt *); +-int mrt_mergeconfig(struct mrt_head *, struct mrt_head *); +- + #endif |