xref: /openbsd-src/usr.sbin/bgpctl/mrtparser.h (revision 91f110e064cd7c194e59e019b83bb7496c1c84d4)
1 /*	$OpenBSD: mrtparser.h,v 1.1 2011/09/21 10:37:51 claudio Exp $ */
2 /*
3  * Copyright (c) 2011 Claudio Jeker <claudio@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 struct sockaddr_vpn4 {
19 	u_int8_t		sv_len;
20 	sa_family_t		sv_family;
21 	u_int8_t		sv_labellen;
22 	u_int8_t		sv_pad;
23 	struct in_addr		sv_addr;
24 	u_int64_t		sv_rd;
25 	u_int8_t		sv_label[21];
26 	u_int8_t		sv_pad2[3];
27 };
28 
29 #define AF_VPNv4	250	/* XXX high enough to not cause issues */
30 
31 union mrt_addr {
32 	struct sockaddr_in6	sin6;
33 	struct sockaddr_in	sin;
34 	struct sockaddr_vpn4	svpn4;
35 	struct sockaddr		sa;
36 };
37 
38 /* data structures for the MSG_TABLE_DUMP_V2 format */
39 struct mrt_peer_entry {
40 	union mrt_addr		addr;
41 	u_int32_t		bgp_id;
42 	u_int32_t		asnum;
43 };
44 
45 struct mrt_peer {
46 	char			*view;
47 	struct mrt_peer_entry	*peers;
48 	u_int32_t		 bgp_id;
49 	u_int16_t		 npeers;
50 };
51 
52 struct mrt_attr {
53 	void	*attr;
54 	size_t	 attr_len;
55 };
56 
57 struct mrt_rib_entry {
58 	void		*aspath;
59 	struct mrt_attr	*attrs;
60 	union mrt_addr	 nexthop;
61 	time_t		 originated;
62 	u_int32_t	 local_pref;
63 	u_int32_t	 med;
64 	u_int16_t	 peer_idx;
65 	u_int16_t	 aspath_len;
66 	u_int16_t	 nattrs;
67 	u_int8_t	 origin;
68 };
69 
70 struct mrt_rib {
71 	struct mrt_rib_entry	*entries;
72 	union mrt_addr		 prefix;
73 	u_int32_t		 seqnum;
74 	u_int16_t		 nentries;
75 	u_int8_t		 prefixlen;
76 };
77 
78 /* data structures for the BGP4MP MESSAGE and STATE types */
79 struct mrt_bgp_state {
80 	union mrt_addr	src;
81 	union mrt_addr	dst;
82 	u_int32_t	src_as;
83 	u_int32_t	dst_as;
84 	u_int16_t	old_state;
85 	u_int16_t	new_state;
86 };
87 
88 struct mrt_bgp_msg {
89 	union mrt_addr	 src;
90 	union mrt_addr	 dst;
91 	u_int32_t	 src_as;
92 	u_int32_t	 dst_as;
93 	u_int16_t	 msg_len;
94 	void		*msg;
95 };
96 
97 #define MRT_ATTR_ORIGIN		1
98 #define MRT_ATTR_ASPATH		2
99 #define MRT_ATTR_NEXTHOP	3
100 #define MRT_ATTR_MED		4
101 #define MRT_ATTR_LOCALPREF	5
102 #define MRT_ATTR_MP_REACH_NLRI	14
103 #define MRT_ATTR_AS4PATH	17
104 #define MRT_ATTR_EXTLEN		0x10
105 
106 #define MRT_PREFIX_LEN(x)	((((u_int)x) + 7) / 8)
107 
108 struct mrt_parser {
109 	void	(*dump)(struct mrt_rib *, struct mrt_peer *, void *);
110 	void	(*state)(struct mrt_bgp_state *, void *);
111 	void	(*message)(struct mrt_bgp_msg *, void *);
112 	void	*arg;
113 };
114 
115 void	mrt_parse(int, struct mrt_parser *, int);
116