Index: bgpctl/mrtparser.h =================================================================== RCS file: bgpctl/mrtparser.h diff -N bgpctl/mrtparser.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ bgpctl/mrtparser.h 13 Oct 2012 18:22:53 -0000 1.1.1.1 @@ -0,0 +1,115 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2011 Claudio Jeker + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +struct sockaddr_vpn4 { + u_int8_t sv_len; + sa_family_t sv_family; + u_int8_t sv_labellen; + u_int8_t sv_pad; + struct in_addr sv_addr; + u_int64_t sv_rd; + u_int8_t sv_label[21]; + u_int8_t sv_pad2[3]; +}; + +#define AF_VPNv4 250 /* XXX high enough to not cause issues */ + +union mrt_addr { + struct sockaddr_in6 sin6; + struct sockaddr_in sin; + struct sockaddr_vpn4 svpn4; + struct sockaddr sa; +}; + +/* data structures for the MSG_TABLE_DUMP_V2 format */ +struct mrt_peer_entry { + union mrt_addr addr; + u_int32_t bgp_id; + u_int32_t asnum; +}; + +struct mrt_peer { + char *view; + struct mrt_peer_entry *peers; + u_int32_t bgp_id; + u_int16_t npeers; +}; + +struct mrt_attr { + void *attr; + size_t attr_len; +}; + +struct mrt_rib_entry { + void *aspath; + struct mrt_attr *attrs; + union mrt_addr nexthop; + time_t originated; + u_int32_t local_pref; + u_int32_t med; + u_int16_t peer_idx; + u_int16_t aspath_len; + u_int16_t nattrs; + u_int8_t origin; +}; + +struct mrt_rib { + struct mrt_rib_entry *entries; + union mrt_addr prefix; + u_int32_t seqnum; + u_int16_t nentries; + u_int8_t prefixlen; +}; + +/* data structures for the BGP4MP MESSAGE and STATE types */ +struct mrt_bgp_state { + union mrt_addr src; + union mrt_addr dst; + u_int32_t src_as; + u_int32_t dst_as; + u_int16_t old_state; + u_int16_t new_state; +}; + +struct mrt_bgp_msg { + union mrt_addr src; + union mrt_addr dst; + u_int32_t src_as; + u_int32_t dst_as; + u_int16_t msg_len; + void *msg; +}; + +#define MRT_ATTR_ORIGIN 1 +#define MRT_ATTR_ASPATH 2 +#define MRT_ATTR_NEXTHOP 3 +#define MRT_ATTR_MED 4 +#define MRT_ATTR_LOCALPREF 5 +#define MRT_ATTR_MP_REACH_NLRI 14 +#define MRT_ATTR_AS4PATH 17 +#define MRT_ATTR_EXTLEN 0x10 + +#define MRT_PREFIX_LEN(x) ((((u_int)x) + 7) / 8) + +struct mrt_parser { + void (*dump)(struct mrt_rib *, struct mrt_peer *, void *); + void (*state)(struct mrt_bgp_state *, void *); + void (*message)(struct mrt_bgp_msg *, void *); + void *arg; +}; + +void mrt_parse(int, struct mrt_parser *, int);