summaryrefslogtreecommitdiff
path: root/net/openbgpd/files/patch-bgpd_mrt.h
blob: 08240024971eea20dd0b8449fe759734035946c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
Index: bgpd/mrt.h
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/mrt.h,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.2
diff -u -p -r1.1.1.1 -r1.1.1.2
--- bgpd/mrt.h	30 Jun 2009 05:46:15 -0000	1.1.1.1
+++ bgpd/mrt.h	9 Jul 2009 16:49:54 -0000	1.1.1.2
@@ -1,4 +1,4 @@
-/*	$OpenBSD: mrt.h,v 1.16 2007/05/30 04:28:27 msf Exp $ */
+/*	$OpenBSD: mrt.h,v 1.23 2009/06/29 12:22:16 claudio Exp $ */
 
 /*
  * Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
@@ -20,12 +20,10 @@
 
 #include "bgpd.h"
 
-/* In cases of failure wait at least MRT_MIN_RETRY. */
-#define MRT_MIN_RETRY	300
-
 /*
- * MRT binary packet format as used by zebra.
+ * MRT binary packet format
  * For more info see:
+ * draft-ietf-grow-mrt-04.txt, "MRT routing information export format"
  * http://www.quagga.net/docs/docs-multi/Packet-Binary-Dump-Format.html
  */
 
@@ -38,24 +36,33 @@
  * +--------+--------+--------+--------+
  * |               length              | length of packet excluding this header
  * +--------+--------+--------+--------+
+ *
+ * ET types include an additional 32bit microsecond field comming after the
+ * length field.
  */
 #define MRT_HEADER_SIZE		12
 
 enum MRT_MSG_TYPES {
-	MSG_NULL,
+	MSG_NULL,		/*  0 empty msg (deprecated) */
 	MSG_START,		/*  1 sender is starting up */
-	MSG_DIE,		/*  2 receiver should shut down */
+	MSG_DIE,		/*  2 receiver should shut down (deprecated) */
 	MSG_I_AM_DEAD,		/*  3 sender is shutting down */
-	MSG_PEER_DOWN,		/*  4 sender's peer is down */
-	MSG_PROTOCOL_BGP,	/*  5 msg is a BGP packet */
+	MSG_PEER_DOWN,		/*  4 sender's peer is down (deprecated) */
+	MSG_PROTOCOL_BGP,	/*  5 msg is a BGP packet (deprecated) */
 	MSG_PROTOCOL_RIP,	/*  6 msg is a RIP packet */
-	MSG_PROTOCOL_IDRP,	/*  7 msg is an IDRP packet */
+	MSG_PROTOCOL_IDRP,	/*  7 msg is an IDRP packet (deprecated) */
 	MSG_PROTOCOL_RIPNG,	/*  8 msg is a RIPNG packet */
-	MSG_PROTOCOL_BGP4PLUS,	/*  9 msg is a BGP4+ packet */
-	MSG_PROTOCOL_BGP4PLUS1,	/* 10 msg is a BGP4+ (draft 01) packet */
+	MSG_PROTOCOL_BGP4PLUS,	/*  9 msg is a BGP4+ packet (deprecated) */
+	MSG_PROTOCOL_BGP4PLUS1,	/* 10 msg is a BGP4+ (draft 01) (deprecated) */
 	MSG_PROTOCOL_OSPF,	/* 11 msg is an OSPF packet */
 	MSG_TABLE_DUMP,		/* 12 routing table dump */
-	MSG_PROTOCOL_BGP4MP=16	/* 16 zebras own packet format */
+	MSG_TABLE_DUMP_V2,	/* 13 routing table dump */
+	MSG_PROTOCOL_BGP4MP=16,	/* 16 zebras own packet format */
+	MSG_PROTOCOL_BGP4MP_ET=17,
+	MSG_PROTOCOL_ISIS=32,	/* 32 msg is a ISIS package */
+	MSG_PROTOCOL_ISIS_ET=33,
+	MSG_PROTOCOL_OSPFV3=48,	/* 48 msg is a OSPFv3 package */
+	MSG_PROTOCOL_OSPFV3_ET=49
 };
 
 /*
@@ -64,15 +71,20 @@ enum MRT_MSG_TYPES {
  * In most cases this is the format to choose to dump updates et al.
  */
 enum MRT_BGP4MP_TYPES {
-	BGP4MP_STATE_CHANGE=0,	/* state change */
-	BGP4MP_MESSAGE=1,	/* bgp message */
-	BGP4MP_ENTRY=2,		/* table dumps */
-	BGP4MP_SNAPSHOT=3
+	BGP4MP_STATE_CHANGE,	/* state change */
+	BGP4MP_MESSAGE,		/* bgp message */
+	BGP4MP_ENTRY,		/* table dumps (deprecated) */
+	BGP4MP_SNAPSHOT,	/* file name for dump (deprecated) */
+	BGP4MP_STATE_CHANGE_AS4,
+	BGP4MP_MESSAGE_AS4	/* same as BGP4MP_MESSAGE with 4byte AS */
 };
 
 /* size of the BGP4MP headers without payload */
 #define MRT_BGP4MP_IPv4_HEADER_SIZE	16
 #define MRT_BGP4MP_IPv6_HEADER_SIZE	40
+/* 4-byte AS variants of the previous */
+#define MRT_BGP4MP_AS4_IPv4_HEADER_SIZE	20
+#define MRT_BGP4MP_AS4_IPv6_HEADER_SIZE	44
 
 /* If the type is PROTOCOL_BGP4MP and the subtype is either BGP4MP_STATE_CHANGE
  * or BGP4MP_MESSAGE the message consists of a common header plus the payload.
@@ -110,6 +122,7 @@ enum MRT_BGP4MP_TYPES {
  */
 #define MRT_BGP4MP_IPv4_ENTRY_SIZE	18
 #define MRT_BGP4MP_IPv6_ENTRY_SIZE	30
+#define MRT_BGP4MP_MAX_PREFIXLEN	17
 /*
  * The "new" table dump format consists of messages of type PROTOCOL_BGP4MP
  * and subtype BGP4MP_ENTRY.
@@ -151,9 +164,9 @@ enum MRT_BGP4MP_TYPES {
  * +--------+--------+--------+--------+
  * |               prefix              |
  * +--------+--------+--------+--------+
- * |  plen  | status |    originated
+ * |  plen  | status | originated time
  * +--------+--------+--------+--------+
- *      originated   |     peer_ip
+ *   originated time |     peer_ip
  * +--------+--------+--------+--------+
  *       peer_ip     |     peer_as     |
  * +--------+--------+--------+--------+
@@ -166,8 +179,7 @@ enum MRT_BGP4MP_TYPES {
  *
  *
  * View is normaly 0 and seqnum just a simple counter for this dump.
- * The status seems to be 1 by default but probably something to indicate
- * the status of a prefix would be more useful.
+ * The status field is unused and should be set to 1.
  */
 
 /* size of the dump header until attr_len */
@@ -186,10 +198,14 @@ enum MRT_BGP_TYPES {
 				   and announcements) */
 	MSG_BGP_PREF_UPDATE,	/* tlv preferences followed by raw update */
 	MSG_BGP_STATE_CHANGE,	/* state change */
-	MSG_BGP_SYNC
+	MSG_BGP_SYNC,		/* file name for a table dump */
+	MSG_BGP_OPEN,		/* BGP open messages */
+	MSG_BGP_NOTIFY,		/* BGP notify messages */
+	MSG_BGP_KEEPALIVE	/* BGP keepalives */
 };
 
-/* if type MSG_PROTOCOL_BGP and subtype MSG_BGP_UPDATE
+/* if type MSG_PROTOCOL_BGP and subtype MSG_BGP_UPDATE, MSG_BGP_OPEN,
+ * MSG_BGP_NOTIFY or MSG_BGP_KEEPALIVE
  *
  * +--------+--------+--------+--------+
  * |    source_as    |    source_ip
@@ -225,7 +241,7 @@ enum MRT_BGP_TYPES {
 /*
  * if type MSG_PROTOCOL_BGP and subtype MSG_BGP_SYNC OR
  * if type MSG_PROTOCOL_BGP4MP and subtype BGP4MP_SNAPSHOT
- * What is this for?
+ * *DEPRECATED*
  *
  * +--------+--------+--------+--------+
  * |      view       |    filename
@@ -255,22 +271,22 @@ enum mrt_state {
 };
 
 struct mrt {
-	enum mrt_type		type;
+	char			rib[PEER_DESCR_LEN];
+	struct msgbuf		wbuf;
+	LIST_ENTRY(mrt)		entry;
 	u_int32_t		peer_id;
 	u_int32_t		group_id;
-	u_int32_t		queued;
-	int			fd;
-	TAILQ_HEAD(, buf)	bufs;
-	LIST_ENTRY(mrt)		entry;
+	enum mrt_type		type;
+	enum mrt_state		state;
+	u_int16_t		seqnum;
 };
 
 struct mrt_config {
 	struct mrt		conf;
-	time_t			ReopenTimer;
-	time_t			ReopenTimerInterval;
-	enum mrt_state		state;
 	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))
@@ -278,16 +294,17 @@ struct mrt_config {
 
 struct peer;
 struct prefix;
-struct pt_entry;
+struct rib_entry;
 
 /* prototypes */
-int		 mrt_dump_bgp_msg(struct mrt *, void *, u_int16_t,
-		     struct peer *, struct bgpd_config *);
-int		 mrt_dump_state(struct mrt *, u_int16_t, u_int16_t,
-		     struct peer *, struct bgpd_config *);
+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 pt_entry *, void *);
-int		 mrt_write(struct mrt *);
+void		 mrt_dump_upcall(struct rib_entry *, void *);
+void		 mrt_dump_done(void *);
+void		 mrt_write(struct mrt *);
 void		 mrt_clean(struct mrt *);
 void		 mrt_init(struct imsgbuf *, struct imsgbuf *);
 int		 mrt_timeout(struct mrt_head *);