1 /* $OpenBSD: mrtparser.h,v 1.3 2019/02/25 11:51:58 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_int16_t peer_idx; 47 u_int16_t aspath_len; 48 u_int16_t nattrs; 49 u_int8_t origin; 50 }; 51 52 struct mrt_rib { 53 struct mrt_rib_entry *entries; 54 struct bgpd_addr prefix; 55 u_int32_t seqnum; 56 u_int16_t nentries; 57 u_int8_t prefixlen; 58 }; 59 60 /* data structures for the BGP4MP MESSAGE and STATE types */ 61 struct mrt_bgp_state { 62 struct timespec time; 63 struct bgpd_addr src; 64 struct bgpd_addr dst; 65 u_int32_t src_as; 66 u_int32_t dst_as; 67 u_int16_t old_state; 68 u_int16_t new_state; 69 }; 70 71 struct mrt_bgp_msg { 72 struct timespec time; 73 struct bgpd_addr src; 74 struct bgpd_addr dst; 75 u_int32_t src_as; 76 u_int32_t dst_as; 77 u_int16_t msg_len; 78 void *msg; 79 }; 80 81 #define MRT_ATTR_ORIGIN 1 82 #define MRT_ATTR_ASPATH 2 83 #define MRT_ATTR_NEXTHOP 3 84 #define MRT_ATTR_MED 4 85 #define MRT_ATTR_LOCALPREF 5 86 #define MRT_ATTR_MP_REACH_NLRI 14 87 #define MRT_ATTR_AS4PATH 17 88 #define MRT_ATTR_EXTLEN 0x10 89 90 #define MRT_PREFIX_LEN(x) ((((u_int)x) + 7) / 8) 91 92 struct mrt_parser { 93 void (*dump)(struct mrt_rib *, struct mrt_peer *, void *); 94 void (*state)(struct mrt_bgp_state *, void *); 95 void (*message)(struct mrt_bgp_msg *, void *); 96 void *arg; 97 }; 98 99 void mrt_parse(int, struct mrt_parser *, int); 100