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