]> git.proxmox.com Git - mirror_frr.git/blame - zebra/rib.h
[bgpd] bug #419: partial aspath-limit incorrectly causes session reset
[mirror_frr.git] / zebra / rib.h
CommitLineData
718e3744 1/*
2 * Routing Information Base header
3 * Copyright (C) 1997 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 */
22
23#ifndef _ZEBRA_RIB_H
24#define _ZEBRA_RIB_H
25
ec1a4283 26#include "prefix.h"
27
718e3744 28#define DISTANCE_INFINITY 255
29
30/* Routing information base. */
7514fb77
PJ
31
32union g_addr {
33 struct in_addr ipv4;
34#ifdef HAVE_IPV6
35 struct in6_addr ipv6;
36#endif /* HAVE_IPV6 */
37};
38
718e3744 39struct rib
40{
6d691129
PJ
41 /* Status Flags for the *route_node*, but kept in the head RIB.. */
42 u_char rn_status;
43#define RIB_ROUTE_QUEUED (1 << 0)
44
718e3744 45 /* Link list. */
46 struct rib *next;
47 struct rib *prev;
e6d7d054
PJ
48
49 /* Nexthop structure */
50 struct nexthop *nexthop;
51
52 /* Refrence count. */
53 unsigned long refcnt;
54
55 /* Uptime. */
56 time_t uptime;
718e3744 57
58 /* Type fo this route. */
59 int type;
60
61 /* Which routing table */
62 int table;
63
e6d7d054
PJ
64 /* Metric */
65 u_int32_t metric;
66
718e3744 67 /* Distance. */
68 u_char distance;
69
6d691129
PJ
70 /* Flags of this route.
71 * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed
72 * to clients via Zserv
73 */
718e3744 74 u_char flags;
75
6d691129
PJ
76 /* RIB internal status */
77 u_char status;
78#define RIB_ENTRY_REMOVED (1 << 0)
79
718e3744 80 /* Nexthop information. */
81 u_char nexthop_num;
82 u_char nexthop_active_num;
83 u_char nexthop_fib_num;
718e3744 84};
85
86/* Static route information. */
87struct static_ipv4
88{
89 /* For linked list. */
90 struct static_ipv4 *prev;
91 struct static_ipv4 *next;
92
93 /* Administrative distance. */
94 u_char distance;
95
96 /* Flag for this static route's type. */
97 u_char type;
98#define STATIC_IPV4_GATEWAY 1
99#define STATIC_IPV4_IFNAME 2
595db7f1 100#define STATIC_IPV4_BLACKHOLE 3
718e3744 101
102 /* Nexthop value. */
103 union
104 {
105 struct in_addr ipv4;
106 char *ifname;
107 } gate;
81dfcaa2 108
109 /* bit flags */
110 u_char flags;
111/*
112 see ZEBRA_FLAG_REJECT
113 ZEBRA_FLAG_BLACKHOLE
114 */
718e3744 115};
116
117#ifdef HAVE_IPV6
118/* Static route information. */
119struct static_ipv6
120{
121 /* For linked list. */
122 struct static_ipv6 *prev;
123 struct static_ipv6 *next;
124
125 /* Administrative distance. */
126 u_char distance;
127
128 /* Flag for this static route's type. */
129 u_char type;
130#define STATIC_IPV6_GATEWAY 1
131#define STATIC_IPV6_GATEWAY_IFNAME 2
132#define STATIC_IPV6_IFNAME 3
133
134 /* Nexthop value. */
135 struct in6_addr ipv6;
136 char *ifname;
81dfcaa2 137
138 /* bit flags */
139 u_char flags;
140/*
141 see ZEBRA_FLAG_REJECT
142 ZEBRA_FLAG_BLACKHOLE
143 */
718e3744 144};
145#endif /* HAVE_IPV6 */
146
7021c425 147enum nexthop_types_t
148{
149 NEXTHOP_TYPE_IFINDEX = 1, /* Directly connected. */
150 NEXTHOP_TYPE_IFNAME, /* Interface route. */
151 NEXTHOP_TYPE_IPV4, /* IPv4 nexthop. */
152 NEXTHOP_TYPE_IPV4_IFINDEX, /* IPv4 nexthop with ifindex. */
153 NEXTHOP_TYPE_IPV4_IFNAME, /* IPv4 nexthop with ifname. */
154 NEXTHOP_TYPE_IPV6, /* IPv6 nexthop. */
155 NEXTHOP_TYPE_IPV6_IFINDEX, /* IPv6 nexthop with ifindex. */
156 NEXTHOP_TYPE_IPV6_IFNAME, /* IPv6 nexthop with ifname. */
157 NEXTHOP_TYPE_BLACKHOLE, /* Null0 nexthop. */
158};
159
718e3744 160/* Nexthop structure. */
161struct nexthop
162{
163 struct nexthop *next;
164 struct nexthop *prev;
165
e6d7d054
PJ
166 /* Interface index. */
167 char *ifname;
168 unsigned int ifindex;
169
7021c425 170 enum nexthop_types_t type;
718e3744 171
172 u_char flags;
173#define NEXTHOP_FLAG_ACTIVE (1 << 0) /* This nexthop is alive. */
174#define NEXTHOP_FLAG_FIB (1 << 1) /* FIB nexthop. */
175#define NEXTHOP_FLAG_RECURSIVE (1 << 2) /* Recursive nexthop. */
176
718e3744 177 /* Nexthop address or interface name. */
7514fb77 178 union g_addr gate;
718e3744 179
180 /* Recursive lookup nexthop. */
181 u_char rtype;
182 unsigned int rifindex;
7514fb77
PJ
183 union g_addr rgate;
184 union g_addr src;
718e3744 185};
186
187/* Routing table instance. */
188struct vrf
189{
190 /* Identifier. This is same as routing table vector index. */
191 u_int32_t id;
192
193 /* Routing table name. */
194 char *name;
195
196 /* Description. */
197 char *desc;
198
199 /* FIB identifier. */
200 u_char fib_id;
201
202 /* Routing table. */
203 struct route_table *table[AFI_MAX][SAFI_MAX];
204
205 /* Static route configuration. */
206 struct route_table *stable[AFI_MAX][SAFI_MAX];
207};
208
a1ac18c4 209extern struct nexthop *nexthop_ifindex_add (struct rib *, unsigned int);
210extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
211extern struct nexthop *nexthop_blackhole_add (struct rib *);
7514fb77
PJ
212extern struct nexthop *nexthop_ipv4_add (struct rib *, struct in_addr *,
213 struct in_addr *);
dc95824a 214extern void rib_lookup_and_dump (struct prefix_ipv4 *);
20e5ff0a 215extern void rib_lookup_and_pushup (struct prefix_ipv4 *);
dc95824a
DO
216extern void rib_dump (const char *, const struct prefix_ipv4 *, const struct rib *);
217extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *);
218#define ZEBRA_RIB_LOOKUP_ERROR -1
219#define ZEBRA_RIB_FOUND_EXACT 0
220#define ZEBRA_RIB_FOUND_NOGATE 1
221#define ZEBRA_RIB_FOUND_CONNECTED 2
222#define ZEBRA_RIB_NOTFOUND 3
223
718e3744 224#ifdef HAVE_IPV6
a1ac18c4 225extern struct nexthop *nexthop_ipv6_add (struct rib *, struct in6_addr *);
718e3744 226#endif /* HAVE_IPV6 */
227
a1ac18c4 228extern struct vrf *vrf_lookup (u_int32_t);
229extern struct route_table *vrf_table (afi_t afi, safi_t safi, u_int32_t id);
230extern struct route_table *vrf_static_table (afi_t afi, safi_t safi, u_int32_t id);
718e3744 231
d24af186 232/* NOTE:
233 * All rib_add_ipv[46]* functions will not just add prefix into RIB, but
234 * also implicitly withdraw equal prefix of same type. */
a1ac18c4 235extern int rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p,
7514fb77
PJ
236 struct in_addr *gate, struct in_addr *src,
237 unsigned int ifindex, u_int32_t vrf_id,
238 u_int32_t, u_char);
718e3744 239
a1ac18c4 240extern int rib_add_ipv4_multipath (struct prefix_ipv4 *, struct rib *);
718e3744 241
a1ac18c4 242extern int rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
243 struct in_addr *gate, unsigned int ifindex,
244 u_int32_t);
718e3744 245
a1ac18c4 246extern struct rib *rib_match_ipv4 (struct in_addr);
718e3744 247
a1ac18c4 248extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *);
718e3744 249
a1ac18c4 250extern void rib_update (void);
251extern void rib_weed_tables (void);
252extern void rib_sweep_route (void);
253extern void rib_close (void);
254extern void rib_init (void);
718e3744 255
a1ac18c4 256extern int
39db97e4 257static_add_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
81dfcaa2 258 u_char flags, u_char distance, u_int32_t vrf_id);
718e3744 259
a1ac18c4 260extern int
39db97e4 261static_delete_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
718e3744 262 u_char distance, u_int32_t vrf_id);
263
264#ifdef HAVE_IPV6
a1ac18c4 265extern int
718e3744 266rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
be61c4eb 267 struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id,
268 u_int32_t metric, u_char distance);
718e3744 269
a1ac18c4 270extern int
718e3744 271rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
272 struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id);
273
a1ac18c4 274extern struct rib *rib_lookup_ipv6 (struct in6_addr *);
718e3744 275
a1ac18c4 276extern struct rib *rib_match_ipv6 (struct in6_addr *);
718e3744 277
278extern struct route_table *rib_table_ipv6;
279
a1ac18c4 280extern int
718e3744 281static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
39db97e4 282 const char *ifname, u_char flags, u_char distance,
283 u_int32_t vrf_id);
718e3744 284
a1ac18c4 285extern int
718e3744 286static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
39db97e4 287 const char *ifname, u_char distance, u_int32_t vrf_id);
718e3744 288
289#endif /* HAVE_IPV6 */
290
291#endif /*_ZEBRA_RIB_H */