xref: /openbsd/usr.sbin/bgpctl/mrtparser.h (revision 274d7c50)
1 /*	$OpenBSD: mrtparser.h,v 1.3 2019/02/25 11:51:58 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 #include "bgpd.h"
19 
20 /* data structures for the MSG_TABLE_DUMP_V2 format */
21 struct mrt_peer_entry {
22 	struct bgpd_addr	addr;
23 	u_int32_t		bgp_id;
24 	u_int32_t		asnum;
25 };
26 
27 struct mrt_peer {
28 	char			*view;
29 	struct mrt_peer_entry	*peers;
30 	u_int32_t		 bgp_id;
31 	u_int16_t		 npeers;
32 };
33 
34 struct mrt_attr {
35 	void	*attr;
36 	size_t	 attr_len;
37 };
38 
39 struct mrt_rib_entry {
40 	void		*aspath;
41 	struct mrt_attr	*attrs;
42 	struct bgpd_addr nexthop;
43 	time_t		 originated;
44 	u_int32_t	 local_pref;
45 	u_int32_t	 med;
46 	u_int16_t	 peer_idx;
47 	u_int16_t	 aspath_len;
48 	u_int16_t	 nattrs;
49 	u_int8_t	 origin;
50 };
51 
52 struct mrt_rib {
53 	struct mrt_rib_entry	*entries;
54 	struct bgpd_addr	 prefix;
55 	u_int32_t		 seqnum;
56 	u_int16_t		 nentries;
57 	u_int8_t		 prefixlen;
58 };
59 
60 /* data structures for the BGP4MP MESSAGE and STATE types */
61 struct mrt_bgp_state {
62 	struct timespec		time;
63 	struct bgpd_addr	src;
64 	struct bgpd_addr	dst;
65 	u_int32_t		src_as;
66 	u_int32_t		dst_as;
67 	u_int16_t		old_state;
68 	u_int16_t		new_state;
69 };
70 
71 struct mrt_bgp_msg {
72 	struct timespec	 time;
73 	struct bgpd_addr src;
74 	struct bgpd_addr dst;
75 	u_int32_t	 src_as;
76 	u_int32_t	 dst_as;
77 	u_int16_t	 msg_len;
78 	void		*msg;
79 };
80 
81 #define MRT_ATTR_ORIGIN		1
82 #define MRT_ATTR_ASPATH		2
83 #define MRT_ATTR_NEXTHOP	3
84 #define MRT_ATTR_MED		4
85 #define MRT_ATTR_LOCALPREF	5
86 #define MRT_ATTR_MP_REACH_NLRI	14
87 #define MRT_ATTR_AS4PATH	17
88 #define MRT_ATTR_EXTLEN		0x10
89 
90 #define MRT_PREFIX_LEN(x)	((((u_int)x) + 7) / 8)
91 
92 struct mrt_parser {
93 	void	(*dump)(struct mrt_rib *, struct mrt_peer *, void *);
94 	void	(*state)(struct mrt_bgp_state *, void *);
95 	void	(*message)(struct mrt_bgp_msg *, void *);
96 	void	*arg;
97 };
98 
99 void	mrt_parse(int, struct mrt_parser *, int);
100