blob: 1b85c81ed1fbd6b7dd188e57c6d3bcf0a60bbf83 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
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
paulec1a4282005-11-24 15:15:17 +000026#include "prefix.h"
27
paul718e3742002-12-13 20:15:29 +000028#define DISTANCE_INFINITY 255
29
30/* Routing information base. */
Paul Jakma7514fb72007-05-02 16:05:35 +000031
32union g_addr {
33 struct in_addr ipv4;
34#ifdef HAVE_IPV6
35 struct in6_addr ipv6;
36#endif /* HAVE_IPV6 */
37};
38
paul718e3742002-12-13 20:15:29 +000039struct rib
40{
Paul Jakma6d691122006-07-27 21:49:00 +000041 /* Status Flags for the *route_node*, but kept in the head RIB.. */
42 u_char rn_status;
Denis Ovsienkoe96f9202008-06-02 12:03:22 +000043#define RIB_ROUTE_QUEUED(x) (1 << (x))
Paul Jakma6d691122006-07-27 21:49:00 +000044
paul718e3742002-12-13 20:15:29 +000045 /* Link list. */
46 struct rib *next;
47 struct rib *prev;
Paul Jakmae6d7d052006-03-30 13:32:09 +000048
49 /* Nexthop structure */
50 struct nexthop *nexthop;
51
52 /* Refrence count. */
53 unsigned long refcnt;
54
55 /* Uptime. */
56 time_t uptime;
paul718e3742002-12-13 20:15:29 +000057
58 /* Type fo this route. */
59 int type;
60
61 /* Which routing table */
62 int table;
63
Paul Jakmae6d7d052006-03-30 13:32:09 +000064 /* Metric */
65 u_int32_t metric;
66
paul718e3742002-12-13 20:15:29 +000067 /* Distance. */
68 u_char distance;
69
Paul Jakma6d691122006-07-27 21:49:00 +000070 /* 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 */
paul718e3742002-12-13 20:15:29 +000074 u_char flags;
75
Paul Jakma6d691122006-07-27 21:49:00 +000076 /* RIB internal status */
77 u_char status;
78#define RIB_ENTRY_REMOVED (1 << 0)
79
paul718e3742002-12-13 20:15:29 +000080 /* Nexthop information. */
81 u_char nexthop_num;
82 u_char nexthop_active_num;
83 u_char nexthop_fib_num;
paul718e3742002-12-13 20:15:29 +000084};
85
Denis Ovsienkoe96f9202008-06-02 12:03:22 +000086/* meta-queue structure:
87 * sub-queue 0: connected, kernel
88 * sub-queue 1: static
89 * sub-queue 2: RIP, RIPng, OSPF, OSPF6, IS-IS
90 * sub-queue 3: iBGP, eBGP
91 * sub-queue 4: any other origin (if any)
92 */
93#define MQ_SIZE 5
94struct meta_queue
95{
96 struct list *subq[MQ_SIZE];
97 u_int32_t size; /* sum of lengths of all subqueues */
98};
99
paul718e3742002-12-13 20:15:29 +0000100/* Static route information. */
101struct static_ipv4
102{
103 /* For linked list. */
104 struct static_ipv4 *prev;
105 struct static_ipv4 *next;
106
107 /* Administrative distance. */
108 u_char distance;
109
110 /* Flag for this static route's type. */
111 u_char type;
112#define STATIC_IPV4_GATEWAY 1
113#define STATIC_IPV4_IFNAME 2
paul595db7f2003-05-25 21:35:06 +0000114#define STATIC_IPV4_BLACKHOLE 3
paul718e3742002-12-13 20:15:29 +0000115
116 /* Nexthop value. */
117 union
118 {
119 struct in_addr ipv4;
120 char *ifname;
121 } gate;
hasso81dfcaa2003-05-25 19:21:25 +0000122
123 /* bit flags */
124 u_char flags;
125/*
126 see ZEBRA_FLAG_REJECT
127 ZEBRA_FLAG_BLACKHOLE
128 */
paul718e3742002-12-13 20:15:29 +0000129};
130
131#ifdef HAVE_IPV6
132/* Static route information. */
133struct static_ipv6
134{
135 /* For linked list. */
136 struct static_ipv6 *prev;
137 struct static_ipv6 *next;
138
139 /* Administrative distance. */
140 u_char distance;
141
142 /* Flag for this static route's type. */
143 u_char type;
144#define STATIC_IPV6_GATEWAY 1
145#define STATIC_IPV6_GATEWAY_IFNAME 2
146#define STATIC_IPV6_IFNAME 3
147
148 /* Nexthop value. */
149 struct in6_addr ipv6;
150 char *ifname;
hasso81dfcaa2003-05-25 19:21:25 +0000151
152 /* bit flags */
153 u_char flags;
154/*
155 see ZEBRA_FLAG_REJECT
156 ZEBRA_FLAG_BLACKHOLE
157 */
paul718e3742002-12-13 20:15:29 +0000158};
159#endif /* HAVE_IPV6 */
160
paul7021c422003-07-15 12:52:22 +0000161enum nexthop_types_t
162{
163 NEXTHOP_TYPE_IFINDEX = 1, /* Directly connected. */
164 NEXTHOP_TYPE_IFNAME, /* Interface route. */
165 NEXTHOP_TYPE_IPV4, /* IPv4 nexthop. */
166 NEXTHOP_TYPE_IPV4_IFINDEX, /* IPv4 nexthop with ifindex. */
167 NEXTHOP_TYPE_IPV4_IFNAME, /* IPv4 nexthop with ifname. */
168 NEXTHOP_TYPE_IPV6, /* IPv6 nexthop. */
169 NEXTHOP_TYPE_IPV6_IFINDEX, /* IPv6 nexthop with ifindex. */
170 NEXTHOP_TYPE_IPV6_IFNAME, /* IPv6 nexthop with ifname. */
171 NEXTHOP_TYPE_BLACKHOLE, /* Null0 nexthop. */
172};
173
paul718e3742002-12-13 20:15:29 +0000174/* Nexthop structure. */
175struct nexthop
176{
177 struct nexthop *next;
178 struct nexthop *prev;
179
Paul Jakmae6d7d052006-03-30 13:32:09 +0000180 /* Interface index. */
181 char *ifname;
182 unsigned int ifindex;
183
paul7021c422003-07-15 12:52:22 +0000184 enum nexthop_types_t type;
paul718e3742002-12-13 20:15:29 +0000185
186 u_char flags;
187#define NEXTHOP_FLAG_ACTIVE (1 << 0) /* This nexthop is alive. */
188#define NEXTHOP_FLAG_FIB (1 << 1) /* FIB nexthop. */
189#define NEXTHOP_FLAG_RECURSIVE (1 << 2) /* Recursive nexthop. */
190
paul718e3742002-12-13 20:15:29 +0000191 /* Nexthop address or interface name. */
Paul Jakma7514fb72007-05-02 16:05:35 +0000192 union g_addr gate;
paul718e3742002-12-13 20:15:29 +0000193
194 /* Recursive lookup nexthop. */
195 u_char rtype;
196 unsigned int rifindex;
Paul Jakma7514fb72007-05-02 16:05:35 +0000197 union g_addr rgate;
198 union g_addr src;
paul718e3742002-12-13 20:15:29 +0000199};
200
201/* Routing table instance. */
202struct vrf
203{
204 /* Identifier. This is same as routing table vector index. */
205 u_int32_t id;
206
207 /* Routing table name. */
208 char *name;
209
210 /* Description. */
211 char *desc;
212
213 /* FIB identifier. */
214 u_char fib_id;
215
216 /* Routing table. */
217 struct route_table *table[AFI_MAX][SAFI_MAX];
218
219 /* Static route configuration. */
220 struct route_table *stable[AFI_MAX][SAFI_MAX];
221};
222
paula1ac18c2005-06-28 17:17:12 +0000223extern struct nexthop *nexthop_ifindex_add (struct rib *, unsigned int);
224extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
225extern struct nexthop *nexthop_blackhole_add (struct rib *);
Paul Jakma7514fb72007-05-02 16:05:35 +0000226extern struct nexthop *nexthop_ipv4_add (struct rib *, struct in_addr *,
227 struct in_addr *);
Josh Bailey26e2ae32012-03-22 01:09:21 -0700228extern struct nexthop *nexthop_ipv4_ifindex_add (struct rib *,
229 struct in_addr *,
230 struct in_addr *,
231 unsigned int);
Denis Ovsienkodc958242007-08-13 16:03:06 +0000232extern void rib_lookup_and_dump (struct prefix_ipv4 *);
Denis Ovsienko20e5ff02008-02-26 14:02:24 +0000233extern void rib_lookup_and_pushup (struct prefix_ipv4 *);
Denis Ovsienkodc958242007-08-13 16:03:06 +0000234extern void rib_dump (const char *, const struct prefix_ipv4 *, const struct rib *);
235extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *);
236#define ZEBRA_RIB_LOOKUP_ERROR -1
237#define ZEBRA_RIB_FOUND_EXACT 0
238#define ZEBRA_RIB_FOUND_NOGATE 1
239#define ZEBRA_RIB_FOUND_CONNECTED 2
240#define ZEBRA_RIB_NOTFOUND 3
241
paul718e3742002-12-13 20:15:29 +0000242#ifdef HAVE_IPV6
paula1ac18c2005-06-28 17:17:12 +0000243extern struct nexthop *nexthop_ipv6_add (struct rib *, struct in6_addr *);
paul718e3742002-12-13 20:15:29 +0000244#endif /* HAVE_IPV6 */
245
paula1ac18c2005-06-28 17:17:12 +0000246extern struct vrf *vrf_lookup (u_int32_t);
247extern struct route_table *vrf_table (afi_t afi, safi_t safi, u_int32_t id);
248extern struct route_table *vrf_static_table (afi_t afi, safi_t safi, u_int32_t id);
paul718e3742002-12-13 20:15:29 +0000249
hassod24af182005-09-24 14:00:26 +0000250/* NOTE:
251 * All rib_add_ipv[46]* functions will not just add prefix into RIB, but
252 * also implicitly withdraw equal prefix of same type. */
paula1ac18c2005-06-28 17:17:12 +0000253extern int rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p,
Paul Jakma7514fb72007-05-02 16:05:35 +0000254 struct in_addr *gate, struct in_addr *src,
255 unsigned int ifindex, u_int32_t vrf_id,
G.Balajicddf3912011-11-26 21:59:32 +0400256 u_int32_t, u_char, safi_t);
paul718e3742002-12-13 20:15:29 +0000257
G.Balajicddf3912011-11-26 21:59:32 +0400258extern int rib_add_ipv4_multipath (struct prefix_ipv4 *, struct rib *, safi_t);
paul718e3742002-12-13 20:15:29 +0000259
paula1ac18c2005-06-28 17:17:12 +0000260extern int rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
261 struct in_addr *gate, unsigned int ifindex,
G.Balajicddf3912011-11-26 21:59:32 +0400262 u_int32_t, safi_t safi);
paul718e3742002-12-13 20:15:29 +0000263
paula1ac18c2005-06-28 17:17:12 +0000264extern struct rib *rib_match_ipv4 (struct in_addr);
paul718e3742002-12-13 20:15:29 +0000265
paula1ac18c2005-06-28 17:17:12 +0000266extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *);
paul718e3742002-12-13 20:15:29 +0000267
paula1ac18c2005-06-28 17:17:12 +0000268extern void rib_update (void);
269extern void rib_weed_tables (void);
270extern void rib_sweep_route (void);
271extern void rib_close (void);
272extern void rib_init (void);
Vyacheslav Trushkin2ea1ab12011-12-11 18:48:47 +0400273extern unsigned long rib_score_proto (u_char proto);
paul718e3742002-12-13 20:15:29 +0000274
paula1ac18c2005-06-28 17:17:12 +0000275extern int
hasso39db97e2004-10-12 20:50:58 +0000276static_add_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
hasso81dfcaa2003-05-25 19:21:25 +0000277 u_char flags, u_char distance, u_int32_t vrf_id);
paul718e3742002-12-13 20:15:29 +0000278
paula1ac18c2005-06-28 17:17:12 +0000279extern int
hasso39db97e2004-10-12 20:50:58 +0000280static_delete_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
paul718e3742002-12-13 20:15:29 +0000281 u_char distance, u_int32_t vrf_id);
282
283#ifdef HAVE_IPV6
paula1ac18c2005-06-28 17:17:12 +0000284extern int
paul718e3742002-12-13 20:15:29 +0000285rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
hassobe61c4e2005-08-27 06:05:47 +0000286 struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id,
G.Balajif768f362011-11-26 22:10:39 +0400287 u_int32_t metric, u_char distance, safi_t safi);
paul718e3742002-12-13 20:15:29 +0000288
paula1ac18c2005-06-28 17:17:12 +0000289extern int
paul718e3742002-12-13 20:15:29 +0000290rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
G.Balajif768f362011-11-26 22:10:39 +0400291 struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id, safi_t safi);
paul718e3742002-12-13 20:15:29 +0000292
paula1ac18c2005-06-28 17:17:12 +0000293extern struct rib *rib_lookup_ipv6 (struct in6_addr *);
paul718e3742002-12-13 20:15:29 +0000294
paula1ac18c2005-06-28 17:17:12 +0000295extern struct rib *rib_match_ipv6 (struct in6_addr *);
paul718e3742002-12-13 20:15:29 +0000296
297extern struct route_table *rib_table_ipv6;
298
paula1ac18c2005-06-28 17:17:12 +0000299extern int
paul718e3742002-12-13 20:15:29 +0000300static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
hasso39db97e2004-10-12 20:50:58 +0000301 const char *ifname, u_char flags, u_char distance,
302 u_int32_t vrf_id);
paul718e3742002-12-13 20:15:29 +0000303
paula1ac18c2005-06-28 17:17:12 +0000304extern int
paul718e3742002-12-13 20:15:29 +0000305static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
hasso39db97e2004-10-12 20:50:58 +0000306 const char *ifname, u_char distance, u_int32_t vrf_id);
paul718e3742002-12-13 20:15:29 +0000307
308#endif /* HAVE_IPV6 */
309
310#endif /*_ZEBRA_RIB_H */