xref: /openbsd-src/usr.sbin/bgpctl/mrtparser.h (revision 4e1ee0786f11cc571bd0be17d38e46f635c719fc)
1 /*	$OpenBSD: mrtparser.h,v 1.4 2021/07/27 07:42:37 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_int32_t	 path_id;
47 	u_int16_t	 peer_idx;
48 	u_int16_t	 aspath_len;
49 	u_int16_t	 nattrs;
50 	u_int8_t	 origin;
51 };
52 
53 struct mrt_rib {
54 	struct mrt_rib_entry	*entries;
55 	struct bgpd_addr	 prefix;
56 	u_int32_t		 seqnum;
57 	u_int16_t		 nentries;
58 	u_int8_t		 prefixlen;
59 	u_int8_t	 	 add_path;
60 };
61 
62 /* data structures for the BGP4MP MESSAGE and STATE types */
63 struct mrt_bgp_state {
64 	struct timespec		time;
65 	struct bgpd_addr	src;
66 	struct bgpd_addr	dst;
67 	u_int32_t		src_as;
68 	u_int32_t		dst_as;
69 	u_int16_t		old_state;
70 	u_int16_t		new_state;
71 };
72 
73 struct mrt_bgp_msg {
74 	struct timespec	 time;
75 	struct bgpd_addr src;
76 	struct bgpd_addr dst;
77 	u_int32_t	 src_as;
78 	u_int32_t	 dst_as;
79 	u_int16_t	 msg_len;
80 	u_int8_t	 add_path;
81 	void		*msg;
82 };
83 
84 #define MRT_ATTR_ORIGIN		1
85 #define MRT_ATTR_ASPATH		2
86 #define MRT_ATTR_NEXTHOP	3
87 #define MRT_ATTR_MED		4
88 #define MRT_ATTR_LOCALPREF	5
89 #define MRT_ATTR_MP_REACH_NLRI	14
90 #define MRT_ATTR_AS4PATH	17
91 #define MRT_ATTR_EXTLEN		0x10
92 
93 #define MRT_PREFIX_LEN(x)	((((u_int)x) + 7) / 8)
94 
95 struct mrt_parser {
96 	void	(*dump)(struct mrt_rib *, struct mrt_peer *, void *);
97 	void	(*state)(struct mrt_bgp_state *, void *);
98 	void	(*message)(struct mrt_bgp_msg *, void *);
99 	void	*arg;
100 };
101 
102 void	mrt_parse(int, struct mrt_parser *, int);
103