0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-03 07:31:54 +00:00

BGP: Improve reconfiguration

Several BGP channel options (including 'next hop self') could be
reconfigured without session reset, with just route refeed/refresh.
The patch improves reconfiguration code to do it that way.
This commit is contained in:
Ondrej Zajicek (work) 2019-08-05 14:43:49 +02:00
parent 6b68390702
commit b357f25932
4 changed files with 18 additions and 12 deletions

View File

@ -616,7 +616,7 @@ channel_reconfigure(struct channel *c, struct channel_config *cf)
channel_verify_limits(c); channel_verify_limits(c);
/* Execute channel-specific reconfigure hook */ /* Execute channel-specific reconfigure hook */
if (c->channel->reconfigure && !c->channel->reconfigure(c, cf)) if (c->channel->reconfigure && !c->channel->reconfigure(c, cf, &import_changed, &export_changed))
return 0; return 0;
/* If the channel is not open, it has no routes and we cannot reload it anyways */ /* If the channel is not open, it has no routes and we cannot reload it anyways */

View File

@ -433,7 +433,7 @@ struct channel_class {
uint config_size; /* Size of channel config data structure */ uint config_size; /* Size of channel config data structure */
void (*init)(struct channel *, struct channel_config *); /* Create new instance */ void (*init)(struct channel *, struct channel_config *); /* Create new instance */
int (*reconfigure)(struct channel *, struct channel_config *); /* Try to reconfigure instance, returns success */ int (*reconfigure)(struct channel *, struct channel_config *, int *import_changed, int *export_changed); /* Try to reconfigure instance, returns success */
int (*start)(struct channel *); /* Start the instance */ int (*start)(struct channel *); /* Start the instance */
void (*shutdown)(struct channel *); /* Stop the instance */ void (*shutdown)(struct channel *); /* Stop the instance */
void (*cleanup)(struct channel *); /* Channel finished flush */ void (*cleanup)(struct channel *); /* Channel finished flush */

View File

@ -1830,23 +1830,30 @@ bgp_reconfigure(struct proto *P, struct proto_config *CF)
#define IGP_TABLE(cf, sym) ((cf)->igp_table_##sym ? (cf)->igp_table_##sym ->table : NULL ) #define IGP_TABLE(cf, sym) ((cf)->igp_table_##sym ? (cf)->igp_table_##sym ->table : NULL )
static int static int
bgp_channel_reconfigure(struct channel *C, struct channel_config *CC) bgp_channel_reconfigure(struct channel *C, struct channel_config *CC, int *import_changed, int *export_changed)
{ {
struct bgp_channel *c = (void *) C; struct bgp_channel *c = (void *) C;
struct bgp_channel_config *new = (void *) CC; struct bgp_channel_config *new = (void *) CC;
struct bgp_channel_config *old = c->cf; struct bgp_channel_config *old = c->cf;
if (memcmp(((byte *) old) + sizeof(struct channel_config), if ((new->secondary != old->secondary) ||
((byte *) new) + sizeof(struct channel_config), (new->gr_able != old->gr_able) ||
/* Remaining items must be checked separately */ (new->ext_next_hop != old->ext_next_hop) ||
OFFSETOF(struct bgp_channel_config, rest) - sizeof(struct channel_config))) (new->add_path != old->add_path) ||
return 0; (new->import_table != old->import_table) ||
(IGP_TABLE(old, ip4) != IGP_TABLE(new, ip4)) ||
/* Check change in IGP tables */
if ((IGP_TABLE(old, ip4) != IGP_TABLE(new, ip4)) ||
(IGP_TABLE(old, ip6) != IGP_TABLE(new, ip6))) (IGP_TABLE(old, ip6) != IGP_TABLE(new, ip6)))
return 0; return 0;
if (new->gw_mode != old->gw_mode)
*import_changed = 1;
if (!ipa_equal(new->next_hop_addr, old->next_hop_addr) ||
(new->next_hop_self != old->next_hop_self) ||
(new->next_hop_keep != old->next_hop_keep) ||
(new->missing_lladdr != old->missing_lladdr))
*export_changed = 1;
c->cf = new; c->cf = new;
return 1; return 1;
} }

View File

@ -144,7 +144,6 @@ struct bgp_channel_config {
u8 add_path; /* Use ADD-PATH extension [RFC 7911] */ u8 add_path; /* Use ADD-PATH extension [RFC 7911] */
u8 import_table; /* Use c.in_table as Adj-RIB-In */ u8 import_table; /* Use c.in_table as Adj-RIB-In */
uint rest[0]; /* Remaining items are reconfigured separately */
struct rtable_config *igp_table_ip4; /* Table for recursive IPv4 next hop lookups */ struct rtable_config *igp_table_ip4; /* Table for recursive IPv4 next hop lookups */
struct rtable_config *igp_table_ip6; /* Table for recursive IPv6 next hop lookups */ struct rtable_config *igp_table_ip6; /* Table for recursive IPv6 next hop lookups */
}; };