1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/* $OpenBSD: mrtparser.h,v 1.1 2011/09/21 10:37:51 claudio Exp $ */
/*
* Copyright (c) 2011 Claudio Jeker <claudio@openbsd.org>
*
* 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);
|