From: Ondrej Zajicek (work) Date: Thu, 12 Nov 2020 03:02:38 +0000 (+0100) Subject: BFD: Better handling of BFD options in BGP configs X-Git-Tag: v2.0.8~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b56bf8849283977f2f4fa7b8f3dc62fdd8d7587;p=thirdparty%2Fbird.git BFD: Better handling of BFD options in BGP configs Merge multiple BFD option blocks in BGP configs instead of using the last one. That is necessary for proper handling of templates when BFD options are used both in a BGP template and in a BGP protocol derived from that template. --- diff --git a/conf/confbase.Y b/conf/confbase.Y index f76dcb3c1..f0343a939 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -79,7 +79,6 @@ CF_DECLS struct f_trie *trie; struct f_val v; struct password_item *p; - struct bfd_options *bo; struct rt_show_data *ra; struct sym_show_data *sd; struct lsadb_show_data *ld; diff --git a/nest/config.Y b/nest/config.Y index 73556f153..83f2c7ba9 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -52,6 +52,28 @@ get_passwords(void) return rv; } +static inline void +init_bfd_opts(struct bfd_options **opts) +{ + cf_check_bfd(1); + + if (! *opts) + *opts = bfd_new_options(); +} + +static inline void +open_bfd_opts(struct bfd_options **opts) +{ + init_bfd_opts(opts); + this_bfd_opts = *opts; +} + +static inline void +close_bfd_opts(void) +{ + this_bfd_opts = NULL; +} + static void proto_postconfig(void) { @@ -99,7 +121,6 @@ CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6) %type proto_patt proto_patt2 %type channel_start proto_channel %type limit_spec -%type bfd_opts %type r_args_for_val %type r_args_for %type r_args_channel @@ -519,7 +540,7 @@ bfd_items: ; bfd_opts: - '{' { this_bfd_opts = bfd_new_options(); } bfd_items '}' { $$ = this_bfd_opts; this_bfd_opts = NULL; } + '{' bfd_items '}' ; /* Core commands */ diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 5f365fcd2..ff52a1a1f 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -130,7 +130,7 @@ struct bgp_config { const char *dynamic_name; /* Name pattern for dynamic BGP */ int dynamic_name_digits; /* Minimum number of digits for dynamic names */ int check_link; /* Use iface link state for liveness detection */ - const struct bfd_options *bfd; /* Use BFD for liveness detection */ + struct bfd_options *bfd; /* Use BFD for liveness detection */ }; struct bgp_channel_config { diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y index dc2956451..cc83bfc7b 100644 --- a/proto/bgp/config.Y +++ b/proto/bgp/config.Y @@ -190,9 +190,9 @@ bgp_proto: | bgp_proto LONG LIVED STALE TIME expr ';' { BGP_CFG->llgr_time = $6; } | bgp_proto TTL SECURITY bool ';' { BGP_CFG->ttl_security = $4; } | bgp_proto CHECK LINK bool ';' { BGP_CFG->check_link = $4; } - | bgp_proto BFD bool ';' { cf_check_bfd($3); BGP_CFG->bfd = $3 ? bfd_new_options() : NULL; } - | bgp_proto BFD GRACEFUL ';' { cf_check_bfd(1); struct bfd_options *opts = bfd_new_options(); opts->mode = BGP_BFD_GRACEFUL; BGP_CFG->bfd = opts; } - | bgp_proto BFD bfd_opts ';' { BGP_CFG->bfd = $3; cf_check_bfd(1); } + | bgp_proto BFD bool ';' { if ($3) init_bfd_opts(&BGP_CFG->bfd); else BGP_CFG->bfd = NULL; } + | bgp_proto BFD GRACEFUL ';' { init_bfd_opts(&BGP_CFG->bfd); BGP_CFG->bfd->mode = BGP_BFD_GRACEFUL; } + | bgp_proto BFD { open_bfd_opts(&BGP_CFG->bfd); } bfd_opts { close_bfd_opts(); } ';' | bgp_proto ENFORCE FIRST AS bool ';' { BGP_CFG->enforce_first_as = $5; } ;