]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Improve reconfiguration
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 6 Aug 2019 13:29:06 +0000 (15:29 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 6 Aug 2019 13:29:06 +0000 (15:29 +0200)
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.

nest/proto.c
nest/protocol.h
proto/bgp/bgp.c
proto/bgp/bgp.h

index 2fb4e96f2ef9f8ff136cb88911c689c068f3f4d7..18cf214b8ebb34e3fca8d9032dec748f70951662 100644 (file)
@@ -619,7 +619,7 @@ channel_reconfigure(struct channel *c, struct channel_config *cf)
     c->last_tx_filter_change = current_time();
 
   /* 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;
 
   /* If the channel is not open, it has no routes and we cannot reload it anyways */
index da12c7715cd7edadfac44e0638f2c486a41eb393..297afba7a92729aa04c930ae8fef34606efc20c7 100644 (file)
@@ -451,7 +451,7 @@ struct channel_class {
   uint config_size;                    /* Size of channel config data structure */
 
   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 */
   void (*shutdown)(struct channel *);  /* Stop the instance */
   void (*cleanup)(struct channel *);   /* Channel finished flush */
index 5a403b407fd3fe997caccc59a2ff7472f56d4bbb..c08e5ee9b9880f2f3e87a7ba9e1c9602ce766989 100644 (file)
@@ -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;
 }
index 075e1bb9c3bcf6672108f8a01b8e4f23f55350f3..2651677cd8a50dc66de5aacf5b1ca470a6f024a7 100644 (file)
@@ -151,7 +151,6 @@ struct bgp_channel_config {
   u8 add_path;                         /* Use ADD-PATH extension [RFC 7911] */
   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_ip6; /* Table for recursive IPv6 next hop lookups */
 };