summaryrefslogtreecommitdiff
path: root/proto/bgp
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-10-11 19:26:31 +0200
committerMaria Matejka <mq@ucw.cz>2022-10-12 10:05:16 +0200
commitfdacb89a536b1be2fc01904a73e1bee48a49e0d3 (patch)
tree7126964e24123482a9e247dcd61892c81210c224 /proto/bgp
parentc1cb2dc31c26154fc616607b767f3f20c6efe25b (diff)
BGP refeed and reload with Adj-RIB-In/Out is done without route refresh
Diffstat (limited to 'proto/bgp')
-rw-r--r--proto/bgp/bgp.c12
-rw-r--r--proto/bgp/bgp.h2
2 files changed, 14 insertions, 0 deletions
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 {