Index: bgpctl/mrtparser.h
===================================================================
RCS file: bgpctl/mrtparser.h
diff -N bgpctl/mrtparser.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ bgpctl/mrtparser.h	13 Oct 2012 18:22:53 -0000	1.1.1.1
@@ -0,0 +1,115 @@
+/*	$OpenBSD$ */
+/*
+ * Copyright (c) 2011 Claudio Jeker <claudio@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+struct sockaddr_vpn4 {
+	u_int8_t		sv_len;
+	sa_family_t		sv_family;
+	u_int8_t		sv_labellen;
+	u_int8_t		sv_pad;
+	struct in_addr		sv_addr;
+	u_int64_t		sv_rd;
+	u_int8_t		sv_label[21];
+	u_int8_t		sv_pad2[3];
+};
+
+#define AF_VPNv4	250	/* XXX high enough to not cause issues */
+
+union mrt_addr {
+	struct sockaddr_in6	sin6;
+	struct sockaddr_in	sin;
+	struct sockaddr_vpn4	svpn4;
+	struct sockaddr		sa;
+};
+
+/* data structures for the MSG_TABLE_DUMP_V2 format */
+struct mrt_peer_entry {
+	union mrt_addr		addr;
+	u_int32_t		bgp_id;
+	u_int32_t		asnum;
+};
+
+struct mrt_peer {
+	char			*view;
+	struct mrt_peer_entry	*peers;
+	u_int32_t		 bgp_id;
+	u_int16_t		 npeers;
+};
+
+struct mrt_attr {
+	void	*attr;
+	size_t	 attr_len;
+};
+
+struct mrt_rib_entry {
+	void		*aspath;
+	struct mrt_attr	*attrs;
+	union mrt_addr	 nexthop;
+	time_t		 originated;
+	u_int32_t	 local_pref;
+	u_int32_t	 med;
+	u_int16_t	 peer_idx;
+	u_int16_t	 aspath_len;
+	u_int16_t	 nattrs;
+	u_int8_t	 origin;
+};
+
+struct mrt_rib {
+	struct mrt_rib_entry	*entries;
+	union mrt_addr		 prefix;
+	u_int32_t		 seqnum;
+	u_int16_t		 nentries;
+	u_int8_t		 prefixlen;
+};
+
+/* data structures for the BGP4MP MESSAGE and STATE types */
+struct mrt_bgp_state {
+	union mrt_addr	src;
+	union mrt_addr	dst;
+	u_int32_t	src_as;
+	u_int32_t	dst_as;
+	u_int16_t	old_state;
+	u_int16_t	new_state;
+};
+
+struct mrt_bgp_msg {
+	union mrt_addr	 src;
+	union mrt_addr	 dst;
+	u_int32_t	 src_as;
+	u_int32_t	 dst_as;
+	u_int16_t	 msg_len;
+	void		*msg;
+};
+
+#define MRT_ATTR_ORIGIN		1
+#define MRT_ATTR_ASPATH		2
+#define MRT_ATTR_NEXTHOP	3
+#define MRT_ATTR_MED		4
+#define MRT_ATTR_LOCALPREF	5
+#define MRT_ATTR_MP_REACH_NLRI	14
+#define MRT_ATTR_AS4PATH	17
+#define MRT_ATTR_EXTLEN		0x10
+
+#define MRT_PREFIX_LEN(x)	((((u_int)x) + 7) / 8)
+
+struct mrt_parser {
+	void	(*dump)(struct mrt_rib *, struct mrt_peer *, void *);
+	void	(*state)(struct mrt_bgp_state *, void *);
+	void	(*message)(struct mrt_bgp_msg *, void *);
+	void	*arg;
+};
+
+void	mrt_parse(int, struct mrt_parser *, int);
