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