From e2b530aa729f9c5973e498b45dd6f55ab669d1ac Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Tue, 6 Aug 2019 15:29:06 +0200 Subject: 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. --- proto/bgp/bgp.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'proto/bgp/bgp.c') diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 5a403b40..c08e5ee9 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -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 ) 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_config *new = (void *) CC; struct bgp_channel_config *old = c->cf; - if (memcmp(((byte *) old) + sizeof(struct channel_config), - ((byte *) new) + sizeof(struct channel_config), - /* Remaining items must be checked separately */ - OFFSETOF(struct bgp_channel_config, rest) - sizeof(struct channel_config))) + if ((new->secondary != old->secondary) || + (new->gr_able != old->gr_able) || + (new->llgr_able != old->llgr_able) || + (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; - /* Check change in IGP tables */ - if ((IGP_TABLE(old, ip4) != IGP_TABLE(new, ip4)) || - (IGP_TABLE(old, ip6) != IGP_TABLE(new, ip6))) + if (new->mandatory && !old->mandatory && (C->channel_state != CS_UP)) 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; return 1; } -- cgit v1.2.3