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