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:
parent
f6a6a77640
commit
e2b530aa72
4 changed files with 22 additions and 11 deletions
|
@ -619,7 +619,7 @@ channel_reconfigure(struct channel *c, struct channel_config *cf)
|
||||||
c->last_tx_filter_change = current_time();
|
c->last_tx_filter_change = current_time();
|
||||||
|
|
||||||
/* 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 */
|
||||||
|
|
|
@ -451,7 +451,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 */
|
||||||
|
|
|
@ -2054,23 +2054,35 @@ 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->llgr_able != old->llgr_able) ||
|
||||||
OFFSETOF(struct bgp_channel_config, rest) - sizeof(struct channel_config)))
|
(new->llgr_time != old->llgr_time) ||
|
||||||
|
(new->ext_next_hop != old->ext_next_hop) ||
|
||||||
|
(new->add_path != old->add_path) ||
|
||||||
|
(new->import_table != old->import_table) ||
|
||||||
|
(IGP_TABLE(new, ip4) != IGP_TABLE(old, ip4)) ||
|
||||||
|
(IGP_TABLE(new, ip6) != IGP_TABLE(old, ip6)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Check change in IGP tables */
|
if (new->mandatory && !old->mandatory && (C->channel_state != CS_UP))
|
||||||
if ((IGP_TABLE(old, ip4) != IGP_TABLE(new, ip4)) ||
|
|
||||||
(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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,7 +151,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 */
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue