diff --git a/conf/confbase.Y b/conf/confbase.Y index f76dcb3c..f0343a93 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 73556f15..83f2c7ba 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 5f365fcd..ff52a1a1 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 dc295645..cc83bfc7 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; } ;