0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-18 17:18:42 +00:00

Merge commit 'c70b3198' into thread-next [lots of conflicts]

There were more conflicts that I'd like to see, most notably in route
export. If a bisect identifies this commit with something related, it
may be simply true that this commit introduces that bug. Let's hope it
doesn't happen.
This commit is contained in:
Maria Matejka 2022-07-15 14:57:02 +02:00
commit 05673b16a8
10 changed files with 693 additions and 179 deletions

View File

@ -44,7 +44,7 @@ struct config {
int cli_debug; /* Tracing of CLI connections and commands */ int cli_debug; /* Tracing of CLI connections and commands */
int latency_debug; /* I/O loop tracks duration of each event */ int latency_debug; /* I/O loop tracks duration of each event */
int pipe_debug; /* Track route propagation through pipes */ int table_debug; /* Track route propagation through tables */
u32 latency_limit; /* Events with longer duration are logged (us) */ u32 latency_limit; /* Events with longer duration are logged (us) */
u32 watchdog_warning; /* I/O loop watchdog limit for warning (us) */ u32 watchdog_warning; /* I/O loop watchdog limit for warning (us) */
u32 watchdog_timeout; /* Watchdog timeout (in seconds, 0 = disabled) */ u32 watchdog_timeout; /* Watchdog timeout (in seconds, 0 = disabled) */

View File

@ -178,8 +178,13 @@ void debug(const char *msg, ...); /* Printf to debug output */
#if defined(LOCAL_DEBUG) || defined(GLOBAL_DEBUG) #if defined(LOCAL_DEBUG) || defined(GLOBAL_DEBUG)
#define DBG(x, y...) debug(x, ##y) #define DBG(x, y...) debug(x, ##y)
#define DBGL(x, y...) debug(x "\n", ##y)
#elif defined(DEBUG_TO_LOG)
#define DBG(...) do { } while (0)
#define DBGL(...) log(L_DEBUG __VA_ARGS__)
#else #else
#define DBG(x, y...) do { } while(0) #define DBG(...) do { } while(0)
#define DBGL(...) do { } while (0)
#endif #endif
#define ASSERT_DIE(x) do { if (!(x)) bug("Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0) #define ASSERT_DIE(x) do { if (!(x)) bug("Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)

View File

@ -115,6 +115,7 @@ void sl_free(void *);
void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size); void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size);
/* Allocator of whole pages; for use in slabs and other high-level allocators. */ /* Allocator of whole pages; for use in slabs and other high-level allocators. */
#define PAGE_HEAD(x) ((void *) (((uintptr_t) (x)) & ~(page_size-1)))
extern long page_size; extern long page_size;
void *alloc_page(void); void *alloc_page(void);
void free_page(void *); void free_page(void *);

View File

@ -197,7 +197,7 @@ static struct resclass sl_class = {
slab_memsize slab_memsize
}; };
#define SL_GET_HEAD(x) ((struct sl_head *) (((uintptr_t) (x)) & ~(page_size-1))) #define SL_GET_HEAD(x) PAGE_HEAD(x)
#define SL_HEAD_CHANGE_STATE(_s, _h, _from, _to) ({ \ #define SL_HEAD_CHANGE_STATE(_s, _h, _from, _to) ({ \
ASSERT_DIE(_h->state == slh_##_from); \ ASSERT_DIE(_h->state == slh_##_from); \

View File

@ -386,7 +386,7 @@ debug_default:
DEBUG PROTOCOLS debug_mask { new_config->proto_default_debug = $3; } DEBUG PROTOCOLS debug_mask { new_config->proto_default_debug = $3; }
| DEBUG CHANNELS debug_mask { new_config->channel_default_debug = $3; } | DEBUG CHANNELS debug_mask { new_config->channel_default_debug = $3; }
| DEBUG COMMANDS expr { new_config->cli_debug = $3; } | DEBUG COMMANDS expr { new_config->cli_debug = $3; }
| DEBUG PIPE bool { new_config->pipe_debug = $3; } | DEBUG TABLES bool { new_config->table_debug = $3; }
; ;
/* MRTDUMP PROTOCOLS is in systep/unix/config.Y */ /* MRTDUMP PROTOCOLS is in systep/unix/config.Y */

View File

@ -697,8 +697,6 @@ channel_do_stop(struct channel *c)
CALL(c->channel->shutdown, c); CALL(c->channel->shutdown, c);
/* This have to be done in here, as channel pool is freed before channel_do_down() */
c->out_table = NULL;
} }
static void static void

View File

@ -79,8 +79,8 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, int primary
if (d->verbose) if (d->verbose)
{ {
ea_show_list(c, a); ea_show_list(c, a);
cli_printf(c, -1008, "\tInternal route handling values: %uL %uG %uS", cli_printf(c, -1008, "\tInternal route handling values: %uL %uG %uS id %u",
e->src->private_id, e->src->global_id, e->stale_cycle); e->src->private_id, e->src->global_id, e->stale_cycle, e->id);
} }
else if (dest == RTD_UNICAST) else if (dest == RTD_UNICAST)
ea_show_nexthop_list(c, nhad); ea_show_nexthop_list(c, nhad);

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,8 @@
#include "lib/fib.h" #include "lib/fib.h"
#include "lib/route.h" #include "lib/route.h"
#include <stdatomic.h>
struct ea_list; struct ea_list;
struct protocol; struct protocol;
struct proto; struct proto;
@ -53,6 +55,7 @@ struct rtable_config {
byte trie_used; /* Rtable has attached trie */ byte trie_used; /* Rtable has attached trie */
btime min_settle_time; /* Minimum settle time for notifications */ btime min_settle_time; /* Minimum settle time for notifications */
btime max_settle_time; /* Maximum settle time for notifications */ btime max_settle_time; /* Maximum settle time for notifications */
btime export_settle_time; /* Delay before exports are announced */
}; };
struct rt_export_hook; struct rt_export_hook;
@ -61,9 +64,17 @@ struct rt_export_request;
struct rt_exporter { struct rt_exporter {
list hooks; /* Registered route export hooks */ list hooks; /* Registered route export hooks */
uint addr_type; /* Type of address data exported (NET_*) */ uint addr_type; /* Type of address data exported (NET_*) */
struct rt_export_hook *(*start)(struct rt_exporter *, struct rt_export_request *); struct rt_export_hook *(*start)(struct rt_exporter *, struct rt_export_request *);
void (*stop)(struct rt_export_hook *); void (*stop)(struct rt_export_hook *);
void (*done)(struct rt_export_hook *); void (*done)(struct rt_export_hook *);
void (*used)(struct rt_exporter *);
list pending; /* List of packed struct rt_pending_export */
struct timer *export_timer;
struct rt_pending_export *first; /* First export to announce */
u64 next_seq; /* The next export will have this ID */
}; };
typedef struct rtable { typedef struct rtable {
@ -98,6 +109,7 @@ typedef struct rtable {
byte prune_trie; /* Prune prefix trie during next table prune */ byte prune_trie; /* Prune prefix trie during next table prune */
byte hcu_scheduled; /* Hostcache update is scheduled */ byte hcu_scheduled; /* Hostcache update is scheduled */
byte nhu_state; /* Next Hop Update state */ byte nhu_state; /* Next Hop Update state */
byte export_used; /* Pending Export pruning is scheduled */
struct fib_iterator prune_fit; /* Rtable prune FIB iterator */ struct fib_iterator prune_fit; /* Rtable prune FIB iterator */
struct fib_iterator nhu_fit; /* Next Hop Update FIB iterator */ struct fib_iterator nhu_fit; /* Next Hop Update FIB iterator */
struct f_trie *trie_new; /* New prefix trie defined during pruning */ struct f_trie *trie_new; /* New prefix trie defined during pruning */
@ -133,6 +145,7 @@ struct rt_flowspec_link {
typedef struct network { typedef struct network {
struct rte_storage *routes; /* Available routes for this network */ struct rte_storage *routes; /* Available routes for this network */
struct rt_pending_export *first, *last;
struct fib_node n; /* FIB flags reserved for kernel syncer */ struct fib_node n; /* FIB flags reserved for kernel syncer */
} net; } net;
@ -200,6 +213,7 @@ struct rt_import_hook {
u32 withdraws_accepted; /* Number of route withdraws accepted and processed */ u32 withdraws_accepted; /* Number of route withdraws accepted and processed */
} stats; } stats;
u64 flush_seq; /* Table export seq when the channel announced flushing */
btime last_state_change; /* Time of last state transition */ btime last_state_change; /* Time of last state transition */
u8 import_state; /* IS_* */ u8 import_state; /* IS_* */
@ -212,7 +226,9 @@ struct rt_import_hook {
}; };
struct rt_pending_export { struct rt_pending_export {
struct rt_pending_export * _Atomic next; /* Next export for the same destination */
struct rte_storage *new, *new_best, *old, *old_best; struct rte_storage *new, *new_best, *old, *old_best;
u64 seq; /* Sequential ID (table-local) of the pending export */
}; };
struct rt_export_request { struct rt_export_request {
@ -241,7 +257,6 @@ struct rt_export_hook {
struct rt_exporter *table; /* The connected table */ struct rt_exporter *table; /* The connected table */
pool *pool; pool *pool;
linpool *lp;
struct rt_export_request *req; /* The requestor */ struct rt_export_request *req; /* The requestor */
@ -260,10 +275,15 @@ struct rt_export_hook {
u32 hash_iter; /* Iterator over hash */ u32 hash_iter; /* Iterator over hash */
}; };
struct bmap seq_map; /* Keep track which exports were already procesed */
struct rt_pending_export * _Atomic last_export;/* Last export processed */
struct rt_pending_export *rpe_next; /* Next pending export to process */
btime last_state_change; /* Time of last state transition */ btime last_state_change; /* Time of last state transition */
u8 refeed_pending; /* Refeeding and another refeed is scheduled */ u8 refeed_pending; /* Refeeding and another refeed is scheduled */
u8 export_state; /* Route export state (TES_*, see below) */ _Atomic u8 export_state; /* Route export state (TES_*, see below) */
u8 feed_type; /* Which feeding method is used (TFT_*, see below) */ u8 feed_type; /* Which feeding method is used (TFT_*, see below) */
struct event *event; /* Event running all the export operations */ struct event *event; /* Event running all the export operations */
@ -314,6 +334,15 @@ void rt_set_export_state(struct rt_export_hook *hook, u8 state);
void rte_import(struct rt_import_request *req, const net_addr *net, rte *new, struct rte_src *src); void rte_import(struct rt_import_request *req, const net_addr *net, rte *new, struct rte_src *src);
/* Get next rpe. If src is given, it must match. */
struct rt_pending_export *rpe_next(struct rt_pending_export *rpe, struct rte_src *src);
/* Mark the pending export processed */
void rpe_mark_seen(struct rt_export_hook *hook, struct rt_pending_export *rpe);
/* Get pending export seen status */
int rpe_get_seen(struct rt_export_hook *hook, struct rt_pending_export *rpe);
/* Types of route announcement, also used as flags */ /* Types of route announcement, also used as flags */
#define RA_UNDEF 0 /* Undefined RA type */ #define RA_UNDEF 0 /* Undefined RA type */
#define RA_OPTIMAL 1 /* Announcement of optimal route change */ #define RA_OPTIMAL 1 /* Announcement of optimal route change */

View File

@ -1901,7 +1901,6 @@ bgp_out_table_export_start(struct rt_exporter *re, struct rt_export_request *req
pool *p = rp_new(c->c.proto->pool, "Export hook"); pool *p = rp_new(c->c.proto->pool, "Export hook");
struct rt_export_hook *hook = mb_allocz(p, sizeof(struct rt_export_hook)); struct rt_export_hook *hook = mb_allocz(p, sizeof(struct rt_export_hook));
hook->pool = p; hook->pool = p;
hook->lp = lp_new_default(p);
hook->event = ev_new_init(p, bgp_out_table_feed, hook); hook->event = ev_new_init(p, bgp_out_table_feed, hook);
hook->feed_type = TFT_HASH; hook->feed_type = TFT_HASH;
@ -1919,6 +1918,7 @@ bgp_setup_out_table(struct bgp_channel *c)
}; };
init_list(&c->prefix_exporter.hooks); init_list(&c->prefix_exporter.hooks);
init_list(&c->prefix_exporter.pending);
c->c.out_table = &c->prefix_exporter; c->c.out_table = &c->prefix_exporter;
} }