xref: /openbsd/usr.sbin/bgpctl/mrtparser.h (revision 6b941460)
1 /*	$OpenBSD: mrtparser.h,v 1.7 2024/02/01 11:37:10 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 	uint32_t		bgp_id;
24 	uint32_t		asnum;
25 };
26 
27 struct mrt_peer {
28 	char			*view;
29 	struct mrt_peer_entry	*peers;
30 	uint32_t		 bgp_id;
31 	uint16_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 	uint32_t	 local_pref;
45 	uint32_t	 med;
46 	uint32_t	 path_id;
47 	uint16_t	 peer_idx;
48 	uint16_t	 aspath_len;
49 	uint16_t	 nattrs;
50 	uint8_t		 origin;
51 };
52 
53 struct mrt_rib {
54 	struct mrt_rib_entry	*entries;
55 	struct bgpd_addr	 prefix;
56 	uint32_t		 seqnum;
57 	uint16_t		 nentries;
58 	uint8_t			 prefixlen;
59 	uint8_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 	uint32_t		src_as;
68 	uint32_t		dst_as;
69 	uint16_t		old_state;
70 	uint16_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 	uint32_t	 src_as;
78 	uint32_t	 dst_as;
79 	uint8_t		 add_path;
80 	struct ibuf	 msg;
81 };
82 
83 #define MRT_ATTR_ORIGIN		1
84 #define MRT_ATTR_ASPATH		2
85 #define MRT_ATTR_NEXTHOP	3
86 #define MRT_ATTR_MED		4
87 #define MRT_ATTR_LOCALPREF	5
88 #define MRT_ATTR_MP_REACH_NLRI	14
89 #define MRT_ATTR_AS4PATH	17
90 #define MRT_ATTR_EXTLEN		0x10
91 
92 #define MRT_PREFIX_LEN(x)	((((u_int)x) + 7) / 8)
93 
94 struct mrt_parser {
95 	void	(*dump)(struct mrt_rib *, struct mrt_peer *, void *);
96 	void	(*state)(struct mrt_bgp_state *, void *);
97 	void	(*message)(struct mrt_bgp_msg *, void *);
98 	void	*arg;
99 };
100 
101 void	mrt_parse(int, struct mrt_parser *, int);
102