diff options
-rw-r--r-- | nest/proto.c | 6 | ||||
-rw-r--r-- | proto/bgp/bgp.c | 12 | ||||
-rw-r--r-- | proto/bgp/bgp.h | 2 |
3 files changed, 20 insertions, 0 deletions
diff --git a/nest/proto.c b/nest/proto.c index 0898dc36..e39fbdfe 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -661,6 +661,7 @@ channel_schedule_reload(struct channel *c) { ASSERT(c->in_req.hook); + rt_refresh_begin(&c->in_req); rt_request_export(c->table, &c->reload_req); } @@ -677,8 +678,13 @@ channel_reload_stopped(struct rt_export_request *req) static void channel_reload_log_state_change(struct rt_export_request *req, u8 state) { + struct channel *c = SKIP_BACK(struct channel, reload_req, req); + if (state == TES_READY) + { + rt_refresh_end(&c->in_req); rt_stop_export(req, channel_reload_stopped); + } } static void diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 1755c5e4..8bacebfc 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -1464,6 +1464,12 @@ bgp_feed_begin(struct channel *C, int initial) if (initial && p->cf->gr_mode) c->feed_state = BFS_LOADING; + if (!initial && C->out_table) + { + c->feed_out_table = 1; + return; + } + /* It is refeed and both sides support enhanced route refresh */ if (!initial && p->enhanced_refresh) { @@ -1482,6 +1488,12 @@ bgp_feed_end(struct channel *C) struct bgp_proto *p = (void *) C->proto; struct bgp_channel *c = (void *) C; + if (c->feed_out_table) + { + c->feed_out_table = 0; + return; + } + /* This should not happen */ if (!p->conn) return; diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 1bcfb915..b76ffe99 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -383,6 +383,8 @@ struct bgp_channel { u8 feed_state; /* Feed state (TX) for EoR, RR packets, see BFS_* */ u8 load_state; /* Load state (RX) for EoR, RR packets, see BFS_* */ + + u8 feed_out_table; /* Refeed into out_table */ }; struct bgp_prefix { |