1998-04-22 12:58:34 +00:00
|
|
|
/*
|
|
|
|
* BIRD Internet Routing Daemon -- Routing Table
|
|
|
|
*
|
2000-01-16 16:44:50 +00:00
|
|
|
* (c) 1998--2000 Martin Mares <mj@ucw.cz>
|
1998-04-22 12:58:34 +00:00
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
2022-03-31 17:09:38 +00:00
|
|
|
#ifndef _BIRD_NEST_RT_H_
|
|
|
|
#define _BIRD_NEST_RT_H_
|
1998-04-22 12:58:34 +00:00
|
|
|
|
1999-05-17 20:14:52 +00:00
|
|
|
#include "lib/lists.h"
|
2019-09-09 00:55:32 +00:00
|
|
|
#include "lib/bitmap.h"
|
1998-04-28 14:39:34 +00:00
|
|
|
#include "lib/resource.h"
|
2016-11-09 15:36:34 +00:00
|
|
|
#include "lib/net.h"
|
2022-03-26 10:56:02 +00:00
|
|
|
#include "lib/type.h"
|
2022-03-31 17:00:00 +00:00
|
|
|
#include "lib/fib.h"
|
2022-03-31 17:09:38 +00:00
|
|
|
#include "lib/route.h"
|
1998-04-22 12:58:34 +00:00
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
struct ea_list;
|
1998-05-20 11:54:33 +00:00
|
|
|
struct protocol;
|
1998-06-01 21:41:11 +00:00
|
|
|
struct proto;
|
2016-01-26 10:48:58 +00:00
|
|
|
struct rte_src;
|
1999-12-01 15:10:21 +00:00
|
|
|
struct symbol;
|
2021-02-10 02:09:57 +00:00
|
|
|
struct timer;
|
1999-12-01 15:10:21 +00:00
|
|
|
struct filter;
|
2021-11-29 18:23:42 +00:00
|
|
|
struct f_trie;
|
2021-12-02 02:30:39 +00:00
|
|
|
struct f_trie_walk_state;
|
1999-12-01 15:10:21 +00:00
|
|
|
struct cli;
|
1998-05-20 11:54:33 +00:00
|
|
|
|
1998-04-22 12:58:34 +00:00
|
|
|
/*
|
1999-04-12 18:01:07 +00:00
|
|
|
* Master Routing Tables. Generally speaking, each of them contains a FIB
|
|
|
|
* with each entry pointing to a list of route entries representing routes
|
|
|
|
* to given network (with the selected one at the head).
|
|
|
|
*
|
1998-04-22 12:58:34 +00:00
|
|
|
* Each of the RTE's contains variable data (the preference and protocol-dependent
|
1998-05-15 07:54:32 +00:00
|
|
|
* metrics) and a pointer to a route attribute block common for many routes).
|
1999-04-12 18:01:07 +00:00
|
|
|
*
|
|
|
|
* It's guaranteed that there is at most one RTE for every (prefix,proto) pair.
|
1998-04-22 12:58:34 +00:00
|
|
|
*/
|
|
|
|
|
1999-05-17 20:14:52 +00:00
|
|
|
struct rtable_config {
|
|
|
|
node n;
|
|
|
|
char *name;
|
|
|
|
struct rtable *table;
|
1999-08-03 19:33:22 +00:00
|
|
|
struct proto_config *krt_attached; /* Kernel syncer attached to this table */
|
2015-11-05 11:48:52 +00:00
|
|
|
uint addr_type; /* Type of address data stored in table (NET_*) */
|
2000-03-04 22:21:06 +00:00
|
|
|
int gc_max_ops; /* Maximum number of operations before GC is run */
|
|
|
|
int gc_min_time; /* Minimum time between two consecutive GC runs */
|
2012-07-04 19:31:03 +00:00
|
|
|
byte sorted; /* Routes of network are sorted according to rte_better() */
|
2021-03-30 16:51:31 +00:00
|
|
|
byte internal; /* Internal table of a protocol */
|
2021-11-29 18:23:42 +00:00
|
|
|
byte trie_used; /* Rtable has attached trie */
|
2021-02-10 02:09:57 +00:00
|
|
|
btime min_settle_time; /* Minimum settle time for notifications */
|
|
|
|
btime max_settle_time; /* Maximum settle time for notifications */
|
1999-05-17 20:14:52 +00:00
|
|
|
};
|
|
|
|
|
1998-05-15 07:54:32 +00:00
|
|
|
typedef struct rtable {
|
2021-03-30 16:51:31 +00:00
|
|
|
resource r;
|
1999-05-17 20:14:52 +00:00
|
|
|
node n; /* Node in list of all tables */
|
2021-03-30 16:51:31 +00:00
|
|
|
pool *rp; /* Resource pool to allocate everything from, including itself */
|
1998-05-15 07:54:32 +00:00
|
|
|
struct fib fib;
|
2021-11-29 18:23:42 +00:00
|
|
|
struct f_trie *trie; /* Trie of prefixes defined in fib */
|
1998-05-15 07:54:32 +00:00
|
|
|
char *name; /* Name of this table */
|
2016-01-26 10:48:58 +00:00
|
|
|
list channels; /* List of attached channels (struct channel) */
|
2015-11-05 11:48:52 +00:00
|
|
|
uint addr_type; /* Type of address data stored in table (NET_*) */
|
1999-08-03 19:34:26 +00:00
|
|
|
int pipe_busy; /* Pipe loop detection */
|
2000-01-16 16:44:50 +00:00
|
|
|
int use_count; /* Number of protocols using this table */
|
2018-12-11 12:52:30 +00:00
|
|
|
u32 rt_count; /* Number of routes in the table */
|
2021-04-19 13:13:20 +00:00
|
|
|
|
|
|
|
byte internal; /* Internal table of a protocol */
|
|
|
|
|
2019-09-09 00:55:32 +00:00
|
|
|
struct hmap id_map;
|
2010-07-05 15:50:19 +00:00
|
|
|
struct hostcache *hostcache;
|
2000-03-04 22:21:06 +00:00
|
|
|
struct rtable_config *config; /* Configuration of this table */
|
2000-01-16 16:44:50 +00:00
|
|
|
struct config *deleted; /* Table doesn't exist in current configuration,
|
|
|
|
* delete as soon as use_count becomes 0 and remove
|
|
|
|
* obstacle from this routing table.
|
|
|
|
*/
|
2010-07-05 15:50:19 +00:00
|
|
|
struct event *rt_event; /* Routing table event */
|
2021-02-10 02:09:57 +00:00
|
|
|
btime last_rt_change; /* Last time when route changed */
|
|
|
|
btime base_settle_time; /* Start time of rtable settling interval */
|
2017-06-06 14:47:30 +00:00
|
|
|
btime gc_time; /* Time of last GC */
|
2000-03-04 22:21:06 +00:00
|
|
|
int gc_counter; /* Number of operations since last GC */
|
2013-07-24 12:11:12 +00:00
|
|
|
byte prune_state; /* Table prune state, 1 -> scheduled, 2-> running */
|
2022-02-03 05:08:51 +00:00
|
|
|
byte prune_trie; /* Prune prefix trie during next table prune */
|
2010-07-05 15:50:19 +00:00
|
|
|
byte hcu_scheduled; /* Hostcache update is scheduled */
|
|
|
|
byte nhu_state; /* Next Hop Update state */
|
2012-03-28 16:40:04 +00:00
|
|
|
struct fib_iterator prune_fit; /* Rtable prune FIB iterator */
|
2010-07-05 15:50:19 +00:00
|
|
|
struct fib_iterator nhu_fit; /* Next Hop Update FIB iterator */
|
2022-02-03 05:08:51 +00:00
|
|
|
struct f_trie *trie_new; /* New prefix trie defined during pruning */
|
2022-02-04 04:34:02 +00:00
|
|
|
struct f_trie *trie_old; /* Old prefix trie waiting to be freed */
|
|
|
|
u32 trie_lock_count; /* Prefix trie locked by walks */
|
|
|
|
u32 trie_old_lock_count; /* Old prefix trie locked by walks */
|
2021-02-10 02:09:57 +00:00
|
|
|
|
|
|
|
list subscribers; /* Subscribers for notifications */
|
|
|
|
struct timer *settle_timer; /* Settle time for notifications */
|
2021-12-20 19:25:35 +00:00
|
|
|
list flowspec_links; /* List of flowspec links, src for NET_IPx and dst for NET_FLOWx */
|
|
|
|
struct f_trie *flowspec_trie; /* Trie for evaluation of flowspec notifications */
|
1998-05-15 07:54:32 +00:00
|
|
|
} rtable;
|
|
|
|
|
2021-02-10 02:09:57 +00:00
|
|
|
struct rt_subscription {
|
|
|
|
node n;
|
|
|
|
rtable *tab;
|
|
|
|
void (*hook)(struct rt_subscription *b);
|
|
|
|
void *data;
|
|
|
|
};
|
|
|
|
|
2021-12-20 19:25:35 +00:00
|
|
|
struct rt_flowspec_link {
|
|
|
|
node n;
|
|
|
|
rtable *src;
|
|
|
|
rtable *dst;
|
|
|
|
u32 uc;
|
|
|
|
};
|
|
|
|
|
2017-02-22 13:02:03 +00:00
|
|
|
#define NHU_CLEAN 0
|
|
|
|
#define NHU_SCHEDULED 1
|
|
|
|
#define NHU_RUNNING 2
|
|
|
|
#define NHU_DIRTY 3
|
|
|
|
|
1998-04-22 12:58:34 +00:00
|
|
|
typedef struct network {
|
|
|
|
struct rte *routes; /* Available routes for this network */
|
2015-11-05 11:48:52 +00:00
|
|
|
struct fib_node n; /* FIB flags reserved for kernel syncer */
|
1998-04-22 12:58:34 +00:00
|
|
|
} net;
|
|
|
|
|
2010-07-05 15:50:19 +00:00
|
|
|
struct hostcache {
|
2010-07-26 14:39:27 +00:00
|
|
|
slab *slab; /* Slab holding all hostentries */
|
|
|
|
struct hostentry **hash_table; /* Hash table for hostentries */
|
|
|
|
unsigned hash_order, hash_shift;
|
|
|
|
unsigned hash_max, hash_min;
|
|
|
|
unsigned hash_items;
|
2010-07-27 16:20:12 +00:00
|
|
|
linpool *lp; /* Linpool for trie */
|
|
|
|
struct f_trie *trie; /* Trie of prefixes that might affect hostentries */
|
|
|
|
list hostentries; /* List of all hostentries */
|
2010-07-05 15:50:19 +00:00
|
|
|
byte update_hostcache;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hostentry {
|
|
|
|
node ln;
|
2010-07-28 09:45:35 +00:00
|
|
|
ip_addr addr; /* IP address of host, part of key */
|
|
|
|
ip_addr link; /* (link-local) IP address of host, used as gw
|
|
|
|
if host is directly attached */
|
2015-10-17 12:36:53 +00:00
|
|
|
struct rtable *tab; /* Dependent table, part of key */
|
2010-07-26 14:39:27 +00:00
|
|
|
struct hostentry *next; /* Next in hash chain */
|
|
|
|
unsigned hash_key; /* Hash key */
|
2010-07-05 15:50:19 +00:00
|
|
|
unsigned uc; /* Use count */
|
2010-12-07 22:33:55 +00:00
|
|
|
struct rta *src; /* Source rta entry */
|
2010-07-05 15:50:19 +00:00
|
|
|
byte dest; /* Chosen route destination type (RTD_...) */
|
2017-02-24 13:05:11 +00:00
|
|
|
byte nexthop_linkable; /* Nexthop list is completely non-device */
|
2010-07-30 23:04:32 +00:00
|
|
|
u32 igp_metric; /* Chosen route IGP metric */
|
2010-07-05 15:50:19 +00:00
|
|
|
};
|
|
|
|
|
2009-05-31 13:24:27 +00:00
|
|
|
/* Types of route announcement, also used as flags */
|
2016-12-23 22:03:26 +00:00
|
|
|
#define RA_UNDEF 0 /* Undefined RA type */
|
2012-04-15 13:07:58 +00:00
|
|
|
#define RA_OPTIMAL 1 /* Announcement of optimal route change */
|
|
|
|
#define RA_ACCEPTED 2 /* Announcement of first accepted route */
|
|
|
|
#define RA_ANY 3 /* Announcement of any route change */
|
2015-06-08 00:20:43 +00:00
|
|
|
#define RA_MERGED 4 /* Announcement of optimal route merged with next ones */
|
2009-05-31 13:24:27 +00:00
|
|
|
|
Terminology cleanup: The import_control hook is now called preexport.
Once upon a time, far far away, there were the old Bird developers
discussing what direction of route flow shall be called import and
export. They decided to say "import to protocol" and "export to table"
when speaking about a protocol. When speaking about a table, they
spoke about "importing to table" and "exporting to protocol".
The latter terminology was adopted in configuration, then also the
bird CLI in commit ea2ae6dd0 started to use it (in year 2009). Now
it's 2018 and the terminology is the latter. Import is from protocol to
table, export is from table to protocol. Anyway, there was still an
import_control hook which executed right before route export.
One thing is funny. There are two commits in April 1999 with just two
minutes between them. The older announces the final settlement
on config terminology, the newer uses the other definition. Let's see
their commit messages as the git-log tool shows them (the newer first):
commit 9e0e485e50ea74c4f1c5cb65bdfe6ce819c2cee2
Author: Martin Mares <mj@ucw.cz>
Date: Mon Apr 5 20:17:59 1999 +0000
Added some new protocol hooks (look at the comments for better explanation):
make_tmp_attrs Convert inline attributes to ea_list
store_tmp_attrs Convert ea_list to inline attributes
import_control Pre-import decisions
commit 5056c559c4eb253a4eee10cf35b694faec5265eb
Author: Martin Mares <mj@ucw.cz>
Date: Mon Apr 5 20:15:31 1999 +0000
Changed syntax of attaching filters to protocols to hopefully the final
version:
EXPORT <filter-spec> for outbound routes (i.e., those announced
by BIRD to the rest of the world).
IMPORT <filter-spec> for inbound routes (i.e., those imported
by BIRD from the rest of the world).
where <filter-spec> is one of:
ALL pass all routes
NONE drop all routes
FILTER <name> use named filter
FILTER { <filter> } use explicitly defined filter
For all protocols, the default is IMPORT ALL, EXPORT NONE. This includes
the kernel protocol, so that you need to add EXPORT ALL to get the previous
configuration of kernel syncer (as usually, see doc/bird.conf.example for
a bird.conf example :)).
Let's say RIP to this almost 19-years-old inconsistency. For now, if you
import a route, it is always from protocol to table. If you export a
route, it is always from table to protocol.
And they lived happily ever after.
2018-02-14 12:42:53 +00:00
|
|
|
/* Return value of preexport() callback */
|
2013-02-08 22:58:27 +00:00
|
|
|
#define RIC_ACCEPT 1 /* Accepted by protocol */
|
|
|
|
#define RIC_PROCESS 0 /* Process it through import filter */
|
|
|
|
#define RIC_REJECT -1 /* Rejected by protocol */
|
|
|
|
#define RIC_DROP -2 /* Silently dropped by protocol */
|
|
|
|
|
2018-11-20 16:38:19 +00:00
|
|
|
extern list routing_tables;
|
1999-05-17 20:14:52 +00:00
|
|
|
struct config;
|
1998-05-20 11:54:33 +00:00
|
|
|
|
|
|
|
void rt_init(void);
|
1999-05-17 20:14:52 +00:00
|
|
|
void rt_preconfig(struct config *);
|
2000-01-16 16:44:50 +00:00
|
|
|
void rt_commit(struct config *new, struct config *old);
|
|
|
|
void rt_lock_table(rtable *);
|
|
|
|
void rt_unlock_table(rtable *);
|
2022-02-04 04:34:02 +00:00
|
|
|
struct f_trie * rt_lock_trie(rtable *tab);
|
|
|
|
void rt_unlock_trie(rtable *tab, struct f_trie *trie);
|
2021-02-10 02:09:57 +00:00
|
|
|
void rt_subscribe(rtable *tab, struct rt_subscription *s);
|
|
|
|
void rt_unsubscribe(struct rt_subscription *s);
|
2021-12-20 19:25:35 +00:00
|
|
|
void rt_flowspec_link(rtable *src, rtable *dst);
|
|
|
|
void rt_flowspec_unlink(rtable *src, rtable *dst);
|
2021-03-30 16:51:31 +00:00
|
|
|
rtable *rt_setup(pool *, struct rtable_config *);
|
|
|
|
static inline void rt_shutdown(rtable *r) { rfree(r->rp); }
|
|
|
|
|
2016-01-20 14:38:37 +00:00
|
|
|
static inline net *net_find(rtable *tab, const net_addr *addr) { return (net *) fib_find(&tab->fib, addr); }
|
2017-04-05 13:11:10 +00:00
|
|
|
static inline net *net_find_valid(rtable *tab, const net_addr *addr)
|
|
|
|
{ net *n = net_find(tab, addr); return (n && rte_is_valid(n->routes)) ? n : NULL; }
|
2016-01-20 14:38:37 +00:00
|
|
|
static inline net *net_get(rtable *tab, const net_addr *addr) { return (net *) fib_get(&tab->fib, addr); }
|
2021-11-29 18:23:42 +00:00
|
|
|
net *net_get(rtable *tab, const net_addr *addr);
|
|
|
|
net *net_route(rtable *tab, const net_addr *n);
|
2012-08-14 14:25:22 +00:00
|
|
|
rte *rte_find(net *net, struct rte_src *src);
|
2020-04-10 15:08:29 +00:00
|
|
|
rte *rte_get_temp(struct rta *, struct rte_src *src);
|
2015-09-17 15:15:30 +00:00
|
|
|
void rte_update2(struct channel *c, const net_addr *n, rte *new, struct rte_src *src);
|
2016-01-26 10:48:58 +00:00
|
|
|
/* rte_update() moved to protocol.h to avoid dependency conflicts */
|
2019-02-15 12:53:17 +00:00
|
|
|
int rt_examine(rtable *t, net_addr *a, struct proto *p, const struct filter *filter);
|
2018-05-29 10:08:12 +00:00
|
|
|
rte *rt_export_merged(struct channel *c, net *net, rte **rt_free, linpool *pool, int silent);
|
2016-01-26 10:48:58 +00:00
|
|
|
void rt_refresh_begin(rtable *t, struct channel *c);
|
|
|
|
void rt_refresh_end(rtable *t, struct channel *c);
|
2018-07-31 16:40:38 +00:00
|
|
|
void rt_modify_stale(rtable *t, struct channel *c);
|
2016-01-26 10:48:58 +00:00
|
|
|
void rt_schedule_prune(rtable *t);
|
1998-10-20 15:13:18 +00:00
|
|
|
void rte_dump(rte *);
|
1998-12-07 21:59:15 +00:00
|
|
|
void rte_free(rte *);
|
1999-04-05 20:25:03 +00:00
|
|
|
rte *rte_do_cow(rte *);
|
|
|
|
static inline rte * rte_cow(rte *r) { return (r->flags & REF_COW) ? rte_do_cow(r) : r; }
|
2015-06-08 00:20:43 +00:00
|
|
|
rte *rte_cow_rta(rte *r, linpool *lp);
|
1998-05-20 11:54:33 +00:00
|
|
|
void rt_dump(rtable *);
|
1998-05-24 14:40:29 +00:00
|
|
|
void rt_dump_all(void);
|
2016-01-26 10:48:58 +00:00
|
|
|
int rt_feed_channel(struct channel *c);
|
|
|
|
void rt_feed_channel_abort(struct channel *c);
|
2018-09-27 20:57:55 +00:00
|
|
|
int rte_update_in(struct channel *c, const net_addr *n, rte *new, struct rte_src *src);
|
|
|
|
int rt_reload_channel(struct channel *c);
|
|
|
|
void rt_reload_channel_abort(struct channel *c);
|
|
|
|
void rt_prune_sync(rtable *t, int all);
|
2021-03-20 20:16:12 +00:00
|
|
|
int rte_update_out(struct channel *c, const net_addr *n, rte *new, rte *old, rte **old_exported, int refeed);
|
2015-11-05 11:48:52 +00:00
|
|
|
struct rtable_config *rt_new_table(struct symbol *s, uint addr_type);
|
1998-05-20 11:54:33 +00:00
|
|
|
|
2021-12-20 19:44:36 +00:00
|
|
|
static inline int rt_is_ip(rtable *tab)
|
|
|
|
{ return (tab->addr_type == NET_IP4) || (tab->addr_type == NET_IP6); }
|
|
|
|
|
|
|
|
static inline int rt_is_vpn(rtable *tab)
|
|
|
|
{ return (tab->addr_type == NET_VPN4) || (tab->addr_type == NET_VPN6); }
|
|
|
|
|
|
|
|
static inline int rt_is_roa(rtable *tab)
|
|
|
|
{ return (tab->addr_type == NET_ROA4) || (tab->addr_type == NET_ROA6); }
|
|
|
|
|
|
|
|
static inline int rt_is_flow(rtable *tab)
|
|
|
|
{ return (tab->addr_type == NET_FLOW4) || (tab->addr_type == NET_FLOW6); }
|
|
|
|
|
2018-09-27 20:57:55 +00:00
|
|
|
|
2017-12-08 14:59:44 +00:00
|
|
|
/* Default limit for ECMP next hops, defined in sysdep code */
|
|
|
|
extern const int rt_default_ecmp;
|
2014-03-20 13:07:12 +00:00
|
|
|
|
2017-03-30 11:52:01 +00:00
|
|
|
struct rt_show_data_rtable {
|
|
|
|
node n;
|
|
|
|
rtable *table;
|
2017-04-25 17:02:31 +00:00
|
|
|
struct channel *export_channel;
|
2017-03-30 11:52:01 +00:00
|
|
|
};
|
|
|
|
|
1999-12-01 15:10:21 +00:00
|
|
|
struct rt_show_data {
|
2015-12-24 14:52:03 +00:00
|
|
|
net_addr *addr;
|
2017-04-25 17:02:31 +00:00
|
|
|
list tables;
|
|
|
|
struct rt_show_data_rtable *tab; /* Iterator over table list */
|
|
|
|
struct rt_show_data_rtable *last_table; /* Last table in output */
|
|
|
|
struct fib_iterator fit; /* Iterator over networks in table */
|
2021-12-02 02:30:39 +00:00
|
|
|
struct f_trie_walk_state *walk_state; /* Iterator over networks in trie */
|
2022-02-04 04:34:02 +00:00
|
|
|
struct f_trie *walk_lock; /* Locked trie for walking */
|
2017-03-30 11:52:01 +00:00
|
|
|
int verbose, tables_defined_by;
|
2019-02-15 12:53:17 +00:00
|
|
|
const struct filter *filter;
|
2009-05-11 00:01:11 +00:00
|
|
|
struct proto *show_protocol;
|
2009-05-22 15:12:15 +00:00
|
|
|
struct proto *export_protocol;
|
2016-01-26 10:48:58 +00:00
|
|
|
struct channel *export_channel;
|
2000-05-06 22:57:39 +00:00
|
|
|
struct config *running_on_config;
|
2019-12-19 15:34:35 +00:00
|
|
|
struct krt_proto *kernel;
|
2021-12-02 01:22:30 +00:00
|
|
|
int export_mode, addr_mode, primary_only, filtered, stats;
|
2017-04-25 17:02:31 +00:00
|
|
|
|
|
|
|
int table_open; /* Iteration (fit) is open */
|
2021-12-02 02:30:39 +00:00
|
|
|
int trie_walk; /* Current table is iterated using trie */
|
2017-03-30 11:52:01 +00:00
|
|
|
int net_counter, rt_counter, show_counter, table_counter;
|
|
|
|
int net_counter_last, rt_counter_last, show_counter_last;
|
1999-12-01 15:10:21 +00:00
|
|
|
};
|
2017-04-25 17:02:31 +00:00
|
|
|
|
1999-12-01 15:10:21 +00:00
|
|
|
void rt_show(struct rt_show_data *);
|
2017-04-25 17:02:31 +00:00
|
|
|
struct rt_show_data_rtable * rt_show_add_table(struct rt_show_data *d, rtable *t);
|
2017-03-30 11:52:01 +00:00
|
|
|
|
|
|
|
/* Value of table definition mode in struct rt_show_data */
|
|
|
|
#define RSD_TDB_DEFAULT 0 /* no table specified */
|
|
|
|
#define RSD_TDB_INDIRECT 0 /* show route ... protocol P ... */
|
|
|
|
#define RSD_TDB_ALL RSD_TDB_SET /* show route ... table all ... */
|
|
|
|
#define RSD_TDB_DIRECT RSD_TDB_SET | RSD_TDB_NMN /* show route ... table X table Y ... */
|
|
|
|
|
|
|
|
#define RSD_TDB_SET 0x1 /* internal: show empty tables */
|
|
|
|
#define RSD_TDB_NMN 0x2 /* internal: need matching net */
|
1999-12-01 15:10:21 +00:00
|
|
|
|
2021-12-02 01:22:30 +00:00
|
|
|
/* Value of addr_mode */
|
|
|
|
#define RSD_ADDR_EQUAL 1 /* Exact query - show route <addr> */
|
|
|
|
#define RSD_ADDR_FOR 2 /* Longest prefix match - show route for <addr> */
|
|
|
|
#define RSD_ADDR_IN 3 /* Interval query - show route in <addr> */
|
|
|
|
|
2014-10-02 10:46:26 +00:00
|
|
|
/* Value of export_mode in struct rt_show_data */
|
|
|
|
#define RSEM_NONE 0 /* Export mode not used */
|
|
|
|
#define RSEM_PREEXPORT 1 /* Routes ready for export, before filtering */
|
|
|
|
#define RSEM_EXPORT 2 /* Routes accepted by export filter */
|
|
|
|
#define RSEM_NOEXPORT 3 /* Routes rejected by export filter */
|
2019-09-09 00:55:32 +00:00
|
|
|
#define RSEM_EXPORTED 4 /* Routes marked in export map */
|
2014-10-02 10:46:26 +00:00
|
|
|
|
2017-03-22 14:00:07 +00:00
|
|
|
struct hostentry * rt_get_hostentry(rtable *tab, ip_addr a, ip_addr ll, rtable *dep);
|
2022-05-05 17:28:56 +00:00
|
|
|
void rta_apply_hostentry(rta *a, struct hostentry *he);
|
2017-03-22 14:00:07 +00:00
|
|
|
|
|
|
|
static inline void
|
2022-05-05 17:28:56 +00:00
|
|
|
rta_set_recursive_next_hop(rtable *dep, rta *a, rtable *tab, ip_addr gw, ip_addr ll)
|
2017-03-22 14:00:07 +00:00
|
|
|
{
|
2022-05-05 17:28:56 +00:00
|
|
|
rta_apply_hostentry(a, rt_get_hostentry(tab, gw, ll, dep));
|
2017-03-22 14:00:07 +00:00
|
|
|
}
|
2010-07-05 15:50:19 +00:00
|
|
|
|
|
|
|
/*
|
2015-10-17 12:36:53 +00:00
|
|
|
* rta_set_recursive_next_hop() acquires hostentry from hostcache and fills
|
|
|
|
* rta->hostentry field. New hostentry has zero use count. Cached rta locks its
|
|
|
|
* hostentry (increases its use count), uncached rta does not lock it. Hostentry
|
|
|
|
* with zero use count is removed asynchronously during host cache update,
|
|
|
|
* therefore it is safe to hold such hostentry temorarily. Hostentry holds a
|
|
|
|
* lock for a 'source' rta, mainly to share multipath nexthops.
|
|
|
|
*
|
|
|
|
* There is no need to hold a lock for hostentry->dep table, because that table
|
|
|
|
* contains routes responsible for that hostentry, and therefore is non-empty if
|
|
|
|
* given hostentry has non-zero use count. If the hostentry has zero use count,
|
|
|
|
* the entry is removed before dep is referenced.
|
|
|
|
*
|
|
|
|
* The protocol responsible for routes with recursive next hops should hold a
|
|
|
|
* lock for a 'source' table governing that routes (argument tab to
|
|
|
|
* rta_set_recursive_next_hop()), because its routes reference hostentries
|
|
|
|
* (through rta) related to the governing table. When all such routes are
|
|
|
|
* removed, rtas are immediately removed achieving zero uc. Then the 'source'
|
|
|
|
* table lock could be immediately released, although hostentries may still
|
|
|
|
* exist - they will be freed together with the 'source' table.
|
2010-07-05 15:50:19 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
static inline void rt_lock_hostentry(struct hostentry *he) { if (he) he->uc++; }
|
|
|
|
static inline void rt_unlock_hostentry(struct hostentry *he) { if (he) he->uc--; }
|
|
|
|
|
2021-12-20 19:25:35 +00:00
|
|
|
int rt_flowspec_check(rtable *tab_ip, rtable *tab_flow, const net_addr *n, rta *a, int interior);
|
|
|
|
|
|
|
|
|
1998-05-03 16:42:45 +00:00
|
|
|
/*
|
|
|
|
* Default protocol preferences
|
|
|
|
*/
|
|
|
|
|
2018-02-06 16:43:55 +00:00
|
|
|
#define DEF_PREF_DIRECT 240 /* Directly connected */
|
1998-05-03 16:42:45 +00:00
|
|
|
#define DEF_PREF_STATIC 200 /* Static route */
|
2000-05-08 10:40:00 +00:00
|
|
|
#define DEF_PREF_OSPF 150 /* OSPF intra-area, inter-area and type 1 external routes */
|
2016-04-28 16:01:40 +00:00
|
|
|
#define DEF_PREF_BABEL 130 /* Babel */
|
1998-05-03 16:42:45 +00:00
|
|
|
#define DEF_PREF_RIP 120 /* RIP */
|
|
|
|
#define DEF_PREF_BGP 100 /* BGP */
|
2015-09-17 15:15:30 +00:00
|
|
|
#define DEF_PREF_RPKI 100 /* RPKI */
|
2000-05-08 10:40:00 +00:00
|
|
|
#define DEF_PREF_INHERITED 10 /* Routes inherited from other routing daemons */
|
2022-04-20 10:24:26 +00:00
|
|
|
#define DEF_PREF_UNKNOWN 0 /* Routes with no preference set */
|
1998-05-03 16:42:45 +00:00
|
|
|
|
2012-03-18 16:32:30 +00:00
|
|
|
/*
|
|
|
|
* Route Origin Authorization
|
|
|
|
*/
|
|
|
|
|
2016-01-20 15:29:17 +00:00
|
|
|
#define ROA_UNKNOWN 0
|
|
|
|
#define ROA_VALID 1
|
|
|
|
#define ROA_INVALID 2
|
2012-03-18 16:32:30 +00:00
|
|
|
|
2022-03-31 17:09:38 +00:00
|
|
|
int net_roa_check(rtable *tab, const net_addr *n, u32 asn);
|
|
|
|
|
2015-12-16 14:30:44 +00:00
|
|
|
#endif
|