xref: /openbsd-src/usr.sbin/bgpctl/mrtparser.h (revision 6b941460852776d7795c139bd9a6ee4d236b9d40)
1*6b941460Sclaudio /*	$OpenBSD: mrtparser.h,v 1.7 2024/02/01 11:37:10 claudio Exp $ */
2a20554fdSclaudio /*
3a20554fdSclaudio  * Copyright (c) 2011 Claudio Jeker <claudio@openbsd.org>
4a20554fdSclaudio  *
5a20554fdSclaudio  * Permission to use, copy, modify, and distribute this software for any
6a20554fdSclaudio  * purpose with or without fee is hereby granted, provided that the above
7a20554fdSclaudio  * copyright notice and this permission notice appear in all copies.
8a20554fdSclaudio  *
9a20554fdSclaudio  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10a20554fdSclaudio  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11a20554fdSclaudio  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12a20554fdSclaudio  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13a20554fdSclaudio  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14a20554fdSclaudio  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15a20554fdSclaudio  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16a20554fdSclaudio  */
17a20554fdSclaudio 
18000f4bc7Sclaudio #include "bgpd.h"
19a20554fdSclaudio 
20a20554fdSclaudio /* data structures for the MSG_TABLE_DUMP_V2 format */
21a20554fdSclaudio struct mrt_peer_entry {
22000f4bc7Sclaudio 	struct bgpd_addr	addr;
2359154960Sclaudio 	uint32_t		bgp_id;
2459154960Sclaudio 	uint32_t		asnum;
25a20554fdSclaudio };
26a20554fdSclaudio 
27a20554fdSclaudio struct mrt_peer {
28a20554fdSclaudio 	char			*view;
29a20554fdSclaudio 	struct mrt_peer_entry	*peers;
3059154960Sclaudio 	uint32_t		 bgp_id;
3159154960Sclaudio 	uint16_t		 npeers;
32a20554fdSclaudio };
33a20554fdSclaudio 
34a20554fdSclaudio struct mrt_attr {
35a20554fdSclaudio 	void	*attr;
36a20554fdSclaudio 	size_t	 attr_len;
37a20554fdSclaudio };
38a20554fdSclaudio 
39a20554fdSclaudio struct mrt_rib_entry {
40a20554fdSclaudio 	void		*aspath;
41a20554fdSclaudio 	struct mrt_attr	*attrs;
42000f4bc7Sclaudio 	struct bgpd_addr nexthop;
43a20554fdSclaudio 	time_t		 originated;
4459154960Sclaudio 	uint32_t	 local_pref;
4559154960Sclaudio 	uint32_t	 med;
4659154960Sclaudio 	uint32_t	 path_id;
4759154960Sclaudio 	uint16_t	 peer_idx;
4859154960Sclaudio 	uint16_t	 aspath_len;
4959154960Sclaudio 	uint16_t	 nattrs;
5059154960Sclaudio 	uint8_t		 origin;
51a20554fdSclaudio };
52a20554fdSclaudio 
53a20554fdSclaudio struct mrt_rib {
54a20554fdSclaudio 	struct mrt_rib_entry	*entries;
55000f4bc7Sclaudio 	struct bgpd_addr	 prefix;
5659154960Sclaudio 	uint32_t		 seqnum;
5759154960Sclaudio 	uint16_t		 nentries;
5859154960Sclaudio 	uint8_t			 prefixlen;
5959154960Sclaudio 	uint8_t			 add_path;
60a20554fdSclaudio };
61a20554fdSclaudio 
62a20554fdSclaudio /* data structures for the BGP4MP MESSAGE and STATE types */
63a20554fdSclaudio struct mrt_bgp_state {
6485411ad9Sclaudio 	struct timespec		time;
65000f4bc7Sclaudio 	struct bgpd_addr	src;
66000f4bc7Sclaudio 	struct bgpd_addr	dst;
6759154960Sclaudio 	uint32_t		src_as;
6859154960Sclaudio 	uint32_t		dst_as;
6959154960Sclaudio 	uint16_t		old_state;
7059154960Sclaudio 	uint16_t		new_state;
71a20554fdSclaudio };
72a20554fdSclaudio 
73a20554fdSclaudio struct mrt_bgp_msg {
7485411ad9Sclaudio 	struct timespec	 time;
75000f4bc7Sclaudio 	struct bgpd_addr src;
76000f4bc7Sclaudio 	struct bgpd_addr dst;
7759154960Sclaudio 	uint32_t	 src_as;
7859154960Sclaudio 	uint32_t	 dst_as;
7959154960Sclaudio 	uint8_t		 add_path;
80*6b941460Sclaudio 	struct ibuf	 msg;
81a20554fdSclaudio };
82a20554fdSclaudio 
83a20554fdSclaudio #define MRT_ATTR_ORIGIN		1
84a20554fdSclaudio #define MRT_ATTR_ASPATH		2
85a20554fdSclaudio #define MRT_ATTR_NEXTHOP	3
86a20554fdSclaudio #define MRT_ATTR_MED		4
87a20554fdSclaudio #define MRT_ATTR_LOCALPREF	5
88a20554fdSclaudio #define MRT_ATTR_MP_REACH_NLRI	14
89a20554fdSclaudio #define MRT_ATTR_AS4PATH	17
90a20554fdSclaudio #define MRT_ATTR_EXTLEN		0x10
91a20554fdSclaudio 
92a20554fdSclaudio #define MRT_PREFIX_LEN(x)	((((u_int)x) + 7) / 8)
93a20554fdSclaudio 
94a20554fdSclaudio struct mrt_parser {
95a20554fdSclaudio 	void	(*dump)(struct mrt_rib *, struct mrt_peer *, void *);
96a20554fdSclaudio 	void	(*state)(struct mrt_bgp_state *, void *);
97a20554fdSclaudio 	void	(*message)(struct mrt_bgp_msg *, void *);
98a20554fdSclaudio 	void	*arg;
99a20554fdSclaudio };
100a20554fdSclaudio 
101a20554fdSclaudio void	mrt_parse(int, struct mrt_parser *, int);
102