diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-11-08 15:33:22 +0100 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-11-08 15:33:22 +0100 |
commit | 9d3fc3062b236f51b2c72a4c2c7b068f1946261d (patch) | |
tree | 0a24e42caff1ba4eb004fc1831b1c0b00407216f /nest | |
parent | fc1e3211b109400c0e96f889829c9f5145ac7226 (diff) |
BFD: Allow per-request session options
BFD session options are configured per interface in BFD protocol. This
patch allows to specify them also per-request in protocols requesting
sessions (currently limited to BGP).
Diffstat (limited to 'nest')
-rw-r--r-- | nest/bfd.h | 22 | ||||
-rw-r--r-- | nest/config.Y | 25 |
2 files changed, 45 insertions, 2 deletions
@@ -9,9 +9,20 @@ #include "lib/lists.h" #include "lib/resource.h" +#include "conf/conf.h" struct bfd_session; +struct bfd_options { + u32 min_rx_int; + u32 min_tx_int; + u32 idle_tx_int; + u8 multiplier; + u8 passive; + u8 passive_set; + u8 mode; +}; + struct bfd_request { resource r; node n; @@ -20,6 +31,7 @@ struct bfd_request { ip_addr local; struct iface *iface; struct iface *vrf; + struct bfd_options opts; void (*hook)(struct bfd_request *); void *data; @@ -32,6 +44,7 @@ struct bfd_request { u8 down; }; +#define BGP_BFD_GRACEFUL 2 /* BFD down triggers graceful restart */ #define BFD_STATE_ADMIN_DOWN 0 #define BFD_STATE_DOWN 1 @@ -39,15 +52,20 @@ struct bfd_request { #define BFD_STATE_UP 3 +static inline struct bfd_options * bfd_new_options(void) +{ return cfg_allocz(sizeof(struct bfd_options)); } + #ifdef CONFIG_BFD -struct bfd_request * bfd_request_session(pool *p, ip_addr addr, ip_addr local, struct iface *iface, struct iface *vrf, void (*hook)(struct bfd_request *), void *data); +struct bfd_request * bfd_request_session(pool *p, ip_addr addr, ip_addr local, struct iface *iface, struct iface *vrf, void (*hook)(struct bfd_request *), void *data, const struct bfd_options *opts); +void bfd_update_request(struct bfd_request *req, const struct bfd_options *opts); static inline void cf_check_bfd(int use UNUSED) { } #else -static inline struct bfd_request * bfd_request_session(pool *p UNUSED, ip_addr addr UNUSED, ip_addr local UNUSED, struct iface *iface UNUSED, struct iface *vrf UNUSED, void (*hook)(struct bfd_request *) UNUSED, void *data UNUSED) { return NULL; } +static inline struct bfd_request * bfd_request_session(pool *p UNUSED, ip_addr addr UNUSED, ip_addr local UNUSED, struct iface *iface UNUSED, struct iface *vrf UNUSED, void (*hook)(struct bfd_request *) UNUSED, void *data UNUSED, const struct bfd_options *opts UNUSED) { return NULL; } +static inline void bfd_update_request(struct bfd_request *req UNUSED, const struct bfd_options *opts UNUSED) { }; static inline void cf_check_bfd(int use) { if (use) cf_error("BFD not available"); } diff --git a/nest/config.Y b/nest/config.Y index f2f1df34..73556f15 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -25,6 +25,7 @@ static struct iface_patt_node *this_ipn; static list *this_p_list; static struct password_item *this_p_item; static int password_id; +static struct bfd_options *this_bfd_opts; static void iface_patt_check(void) @@ -75,6 +76,7 @@ CF_KEYWORDS(BGP, PASSWORDS, DESCRIPTION, SORTED) CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC, CLASS, DSCP) CF_KEYWORDS(TIMEFORMAT, ISO, SHORT, LONG, ROUTE, PROTOCOL, BASE, LOG, S, MS, US) CF_KEYWORDS(GRACEFUL, RESTART, WAIT, MAX, FLUSH, AS) +CF_KEYWORDS(MIN, IDLE, RX, TX, INTERVAL, MULTIPLIER, PASSIVE) CF_KEYWORDS(CHECK, LINK) /* For r_args_channel */ @@ -97,6 +99,7 @@ CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6) %type <ps> proto_patt proto_patt2 %type <cc> channel_start proto_channel %type <cl> limit_spec +%type <bo> bfd_opts %type <net> r_args_for_val %type <net_ptr> r_args_for %type <t> r_args_channel @@ -497,6 +500,28 @@ password_algorithm: | HMAC SHA512 { $$ = ALG_HMAC_SHA512; } ; + +/* BFD options */ + +bfd_item: + INTERVAL expr_us { this_bfd_opts->min_rx_int = this_bfd_opts->min_tx_int = $2; } + | MIN RX INTERVAL expr_us { this_bfd_opts->min_rx_int = $4; } + | MIN TX INTERVAL expr_us { this_bfd_opts->min_tx_int = $4; } + | IDLE TX INTERVAL expr_us { this_bfd_opts->idle_tx_int = $4; } + | MULTIPLIER expr { this_bfd_opts->multiplier = $2; } + | PASSIVE bool { this_bfd_opts->passive = $2; this_bfd_opts->passive_set = 1; } + | GRACEFUL { this_bfd_opts->mode = BGP_BFD_GRACEFUL; } + ; + +bfd_items: + /* empty */ + | bfd_items bfd_item ';' + ; + +bfd_opts: + '{' { this_bfd_opts = bfd_new_options(); } bfd_items '}' { $$ = this_bfd_opts; this_bfd_opts = NULL; } + ; + /* Core commands */ CF_CLI_HELP(SHOW, ..., [[Show status information]]) |