1 /* $OpenBSD: mrtparser.h,v 1.1 2011/09/21 10:37:51 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 struct sockaddr_vpn4 { 19 u_int8_t sv_len; 20 sa_family_t sv_family; 21 u_int8_t sv_labellen; 22 u_int8_t sv_pad; 23 struct in_addr sv_addr; 24 u_int64_t sv_rd; 25 u_int8_t sv_label[21]; 26 u_int8_t sv_pad2[3]; 27 }; 28 29 #define AF_VPNv4 250 /* XXX high enough to not cause issues */ 30 31 union mrt_addr { 32 struct sockaddr_in6 sin6; 33 struct sockaddr_in sin; 34 struct sockaddr_vpn4 svpn4; 35 struct sockaddr sa; 36 }; 37 38 /* data structures for the MSG_TABLE_DUMP_V2 format */ 39 struct mrt_peer_entry { 40 union mrt_addr addr; 41 u_int32_t bgp_id; 42 u_int32_t asnum; 43 }; 44 45 struct mrt_peer { 46 char *view; 47 struct mrt_peer_entry *peers; 48 u_int32_t bgp_id; 49 u_int16_t npeers; 50 }; 51 52 struct mrt_attr { 53 void *attr; 54 size_t attr_len; 55 }; 56 57 struct mrt_rib_entry { 58 void *aspath; 59 struct mrt_attr *attrs; 60 union mrt_addr nexthop; 61 time_t originated; 62 u_int32_t local_pref; 63 u_int32_t med; 64 u_int16_t peer_idx; 65 u_int16_t aspath_len; 66 u_int16_t nattrs; 67 u_int8_t origin; 68 }; 69 70 struct mrt_rib { 71 struct mrt_rib_entry *entries; 72 union mrt_addr prefix; 73 u_int32_t seqnum; 74 u_int16_t nentries; 75 u_int8_t prefixlen; 76 }; 77 78 /* data structures for the BGP4MP MESSAGE and STATE types */ 79 struct mrt_bgp_state { 80 union mrt_addr src; 81 union mrt_addr dst; 82 u_int32_t src_as; 83 u_int32_t dst_as; 84 u_int16_t old_state; 85 u_int16_t new_state; 86 }; 87 88 struct mrt_bgp_msg { 89 union mrt_addr src; 90 union mrt_addr dst; 91 u_int32_t src_as; 92 u_int32_t dst_as; 93 u_int16_t msg_len; 94 void *msg; 95 }; 96 97 #define MRT_ATTR_ORIGIN 1 98 #define MRT_ATTR_ASPATH 2 99 #define MRT_ATTR_NEXTHOP 3 100 #define MRT_ATTR_MED 4 101 #define MRT_ATTR_LOCALPREF 5 102 #define MRT_ATTR_MP_REACH_NLRI 14 103 #define MRT_ATTR_AS4PATH 17 104 #define MRT_ATTR_EXTLEN 0x10 105 106 #define MRT_PREFIX_LEN(x) ((((u_int)x) + 7) / 8) 107 108 struct mrt_parser { 109 void (*dump)(struct mrt_rib *, struct mrt_peer *, void *); 110 void (*state)(struct mrt_bgp_state *, void *); 111 void (*message)(struct mrt_bgp_msg *, void *); 112 void *arg; 113 }; 114 115 void mrt_parse(int, struct mrt_parser *, int); 116