37 case BFD_TRANSPORT_UDP4:
38 s =
format (s,
"%=10u %-32s %20U %20U\n", bs->
bs_idx,
"IPv4 address",
42 case BFD_TRANSPORT_UDP6:
43 s =
format (s,
"%=10u %-32s %20U %20U\n", bs->
bs_idx,
"IPv6 address",
48 s =
format (s,
"%10s %-32s %20s %20s\n",
"",
"Session state",
51 s =
format (s,
"%10s %-32s %20s %20s\n",
"",
"Diagnostic code",
54 s =
format (s,
"%10s %-32s %20u %20u\n",
"",
"Detect multiplier",
56 s =
format (s,
"%10s %-32s %20u %20llu\n",
"",
57 "Required Min Rx Interval (usec)",
59 s =
format (s,
"%10s %-32s %20u %20u\n",
"",
60 "Desired Min Tx Interval (usec)",
64 format (s,
"%10s %-32s %20u\n",
"",
"Transmit interval",
72 s =
format (s,
"%10s %-32s %20v\n",
"",
"Last control frame tx", tmp);
79 s =
format (s,
"%10s %-32s %20v\n",
"",
"Last control frame rx", tmp);
83 format (s,
"%10s %-32s %20u %20llu\n",
"",
"Min Echo Rx Interval (usec)",
87 s =
format (s,
"%10s %-32s %20u\n",
"",
"Echo transmit interval",
91 s =
format (s,
"%10s %-32s %20v\n",
"",
"Last echo frame tx", tmp);
93 tmp =
format (tmp,
"%.6fs",
97 format (s,
"%10s %-32s %20v\n",
"",
"Last echo frame roundtrip time",
102 s =
format (s,
"%10s %-32s %20s %20s\n",
"",
"Demand mode",
"no",
104 s =
format (s,
"%10s %-32s %20s\n",
"",
"Poll state",
108 s =
format (s,
"%10s %-32s %20u\n",
"",
"Authentication config key ID",
110 s =
format (s,
"%10s %-32s %20u\n",
"",
"Authentication BFD key ID",
112 s =
format (s,
"%10s %-32s %20u %20u\n",
"",
"Sequence number",
128 u8 *s =
format (
NULL,
"%=10s %=25s %=10s\n",
"Configuration Key ID",
129 "Type",
"Use Count");
132 s = format (s,
"%10u %-25s %10u\n", key->conf_key_id,
133 bfd_auth_type_str (key->auth_type), key->use_count);
141 else if (
unformat (input,
"sessions"))
143 u8 *s =
format (
NULL,
"%=10s %=32s %=20s %=20s\n",
"Index",
"Property",
144 "Local value",
"Remote value");
147 s = format (s,
"%U", format_bfd_session_cli, vm, bm, bs);
155 else if (
unformat (input,
"echo-source"))
164 &have_usable_ip6, &ip6);
172 s =
format (s,
"IPv4 address usable as echo source: ");
181 s =
format (s,
"IPv6 address usable as echo source: ");
211 .short_help =
"show bfd [keys|sessions|echo-source]",
222 s = format (s, "%s", c); \ 242 static const u8 keyed_sha1[] =
"keyed-sha1";
243 static const u8 meticulous_keyed_sha1[] =
"meticulous-keyed-sha1";
247 if (
unformat (input,
"conf-key-id %u", &key_id))
254 if (
vec_len (vec_auth_type) ==
sizeof (keyed_sha1) - 1 &&
255 0 == memcmp (vec_auth_type, keyed_sha1,
256 sizeof (keyed_sha1) - 1))
258 auth_type = BFD_AUTH_TYPE_keyed_sha1;
260 else if (
vec_len (vec_auth_type) ==
261 sizeof (meticulous_keyed_sha1) - 1 &&
262 0 == memcmp (vec_auth_type, meticulous_keyed_sha1,
263 sizeof (meticulous_keyed_sha1) - 1))
265 auth_type = BFD_AUTH_TYPE_meticulous_keyed_sha1;
318 .path =
"bfd key set",
319 .short_help =
"bfd key set" 321 " type <keyed-sha1|meticulous-keyed-sha1> " 336 if (!
unformat (input,
"conf-key-id %u", &key_id))
358 .path =
"bfd key del",
359 .short_help =
"bfd key del conf-key-id <id>",
364 #define INTERFACE_STR "interface" 365 #define LOCAL_ADDR_STR "local-addr" 366 #define PEER_ADDR_STR "peer-addr" 367 #define CONF_KEY_ID_STR "conf-key-id" 368 #define BFD_KEY_ID_STR "bfd-key-id" 369 #define DESIRED_MIN_TX_STR "desired-min-tx" 370 #define REQUIRED_MIN_RX_STR "required-min-rx" 371 #define DETECT_MULT_STR "detect-mult" 372 #define ADMIN_STR "admin" 373 #define DELAYED_STR "delayed" 375 static const unsigned mandatory = 1;
376 static const unsigned optional = 0;
378 #define DECLARE(t, n, s, r, ...) \ 382 #define UNFORMAT(t, n, s, r, ...) \ 383 if (unformat (input, s " " __VA_ARGS__, &n)) \ 385 something_parsed = 1; \ 389 #define CHECK_MANDATORY(t, n, s, r, ...) \ 390 WARN_OFF(tautological-compare) \ 391 if (mandatory == r && !have_##n) \ 393 WARN_ON(tautological-compare) \ 394 ret = clib_error_return (0, "Required parameter `%s' missing.", s); \ 403 #define foreach_bfd_cli_udp_session_add_cli_param(F) \ 404 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 405 unformat_vnet_sw_interface, &vnet_main) \ 406 F (ip46_address_t, local_addr, LOCAL_ADDR_STR, mandatory, "%U", \ 407 unformat_ip46_address) \ 408 F (ip46_address_t, peer_addr, PEER_ADDR_STR, mandatory, "%U", \ 409 unformat_ip46_address) \ 410 F (u32, desired_min_tx, DESIRED_MIN_TX_STR, mandatory, "%u") \ 411 F (u32, required_min_rx, REQUIRED_MIN_RX_STR, mandatory, "%u") \ 412 F (u32, detect_mult, DETECT_MULT_STR, mandatory, "%u") \ 413 F (u32, conf_key_id, CONF_KEY_ID_STR, optional, "%u") \ 414 F (u32, bfd_key_id, BFD_KEY_ID_STR, optional, "%u") 420 int something_parsed = 0;
423 if (!something_parsed)
433 if (1 == have_conf_key_id + have_bfd_key_id)
436 "and `%s' must be either both specified or none",
441 if (detect_mult > 255)
448 if (have_bfd_key_id && bfd_key_id > 255)
458 detect_mult, have_conf_key_id, conf_key_id,
464 "`bfd_add_add_session' API call failed, rv=%d:%U",
475 .path =
"bfd udp session add",
476 .short_help =
"bfd udp session add" 477 " interface <interface>" 478 " local-addr <local-address>" 479 " peer-addr <peer-address>" 480 " desired-min-tx <desired min tx interval>" 481 " required-min-rx <required min rx interval>" 482 " detect-mult <detect multiplier> " 484 " conf-key-id <config key ID>" 485 " bfd-key-id <BFD key ID>" 496 #define foreach_bfd_cli_udp_session_mod_cli_param(F) \ 497 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 498 unformat_vnet_sw_interface, &vnet_main) \ 499 F (ip46_address_t, local_addr, LOCAL_ADDR_STR, mandatory, "%U", \ 500 unformat_ip46_address) \ 501 F (ip46_address_t, peer_addr, PEER_ADDR_STR, mandatory, "%U", \ 502 unformat_ip46_address) \ 503 F (u32, desired_min_tx, DESIRED_MIN_TX_STR, mandatory, "%u") \ 504 F (u32, required_min_rx, REQUIRED_MIN_RX_STR, mandatory, "%u") \ 505 F (u32, detect_mult, DETECT_MULT_STR, mandatory, "%u") 511 int something_parsed = 0;
514 if (!something_parsed)
524 if (detect_mult > 255)
533 desired_min_tx, required_min_rx, detect_mult);
538 "`bfd_udp_mod_session' API call failed, rv=%d:%U",
549 .path =
"bfd udp session mod",
550 .short_help =
"bfd udp session mod interface" 551 " <interface> local-addr" 552 " <local-address> peer-addr" 553 " <peer-address> desired-min-tx" 554 " <desired min tx interval> required-min-rx" 555 " <required min rx interval> detect-mult" 556 " <detect multiplier> ",
566 #define foreach_bfd_cli_udp_session_del_cli_param(F) \ 567 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 568 unformat_vnet_sw_interface, &vnet_main) \ 569 F (ip46_address_t, local_addr, LOCAL_ADDR_STR, mandatory, "%U", \ 570 unformat_ip46_address) \ 571 F (ip46_address_t, peer_addr, PEER_ADDR_STR, mandatory, "%U", \ 572 unformat_ip46_address) 578 int something_parsed = 0;
581 if (!something_parsed)
597 "`bfd_udp_del_session' API call failed, rv=%d:%U",
608 .path =
"bfd udp session del",
609 .short_help =
"bfd udp session del interface" 610 " <interface> local-addr" 611 " <local-address> peer-addr" 622 #define foreach_bfd_cli_udp_session_set_flags_cli_param(F) \ 623 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 624 unformat_vnet_sw_interface, &vnet_main) \ 625 F (ip46_address_t, local_addr, LOCAL_ADDR_STR, mandatory, "%U", \ 626 unformat_ip46_address) \ 627 F (ip46_address_t, peer_addr, PEER_ADDR_STR, mandatory, "%U", \ 628 unformat_ip46_address) \ 629 F (u8 *, admin_up_down_token, ADMIN_STR, mandatory, "%v", \ 630 &admin_up_down_token) 636 int something_parsed = 0;
639 if (!something_parsed)
650 static const char up[] =
"up";
651 static const char down[] =
"down";
652 if (!memcmp (admin_up_down_token, up,
sizeof (up) - 1))
656 else if (!memcmp (admin_up_down_token, down,
sizeof (down) - 1))
668 &peer_addr, admin_up_down);
673 "`bfd_udp_session_set_flags' API call failed, rv=%d:%U",
684 .path =
"bfd udp session set-flags",
685 .short_help =
"bfd udp session set-flags" 686 " interface <interface>" 687 " local-addr <local-address>" 688 " peer-addr <peer-address>" 699 #define foreach_bfd_cli_udp_session_auth_activate_cli_param(F) \ 700 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 701 unformat_vnet_sw_interface, &vnet_main) \ 702 F (ip46_address_t, local_addr, LOCAL_ADDR_STR, mandatory, "%U", \ 703 unformat_ip46_address) \ 704 F (ip46_address_t, peer_addr, PEER_ADDR_STR, mandatory, "%U", \ 705 unformat_ip46_address) \ 706 F (u8 *, delayed_token, DELAYED_STR, optional, "%v") \ 707 F (u32, conf_key_id, CONF_KEY_ID_STR, mandatory, "%u") \ 708 F (u32, bfd_key_id, BFD_KEY_ID_STR, mandatory, "%u") 714 int something_parsed = 0;
717 if (!something_parsed)
728 if (have_delayed_token)
730 static const char yes[] =
"yes";
731 static const char no[] =
"no";
732 if (!memcmp (delayed_token, yes,
sizeof (yes) - 1))
736 else if (!memcmp (delayed_token, no,
sizeof (no) - 1))
744 "Unrecognized value for `%s' parameter: `%v'",
750 if (have_bfd_key_id && bfd_key_id > 255)
759 bfd_key_id, is_delayed);
764 "`bfd_udp_auth_activate' API call failed, rv=%d:%U",
775 .path =
"bfd udp session auth activate",
776 .short_help =
"bfd udp session auth activate" 777 " interface <interface>" 778 " local-addr <local-address>" 779 " peer-addr <peer-address>" 780 " conf-key-id <config key ID>" 781 " bfd-key-id <BFD key ID>" 782 " [ delayed <yes|no> ]",
791 #define foreach_bfd_cli_udp_session_auth_deactivate_cli_param(F) \ 792 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 793 unformat_vnet_sw_interface, &vnet_main) \ 794 F (ip46_address_t, local_addr, LOCAL_ADDR_STR, mandatory, "%U", \ 795 unformat_ip46_address) \ 796 F (ip46_address_t, peer_addr, PEER_ADDR_STR, mandatory, "%U", \ 797 unformat_ip46_address) \ 798 F (u8 *, delayed_token, DELAYED_STR, optional, "%v") 804 int something_parsed = 0;
807 if (!something_parsed)
818 if (have_delayed_token)
820 static const char yes[] =
"yes";
821 static const char no[] =
"no";
822 if (!memcmp (delayed_token, yes,
sizeof (yes) - 1))
826 else if (!memcmp (delayed_token, no,
sizeof (no) - 1))
833 0,
"Unrecognized value for `%s' parameter: `%v'",
DELAYED_STR,
840 &peer_addr, is_delayed);
844 0,
"`bfd_udp_auth_deactivate' API call failed, rv=%d:%U", (
int)rv,
855 .path =
"bfd udp session auth deactivate",
856 .short_help =
"bfd udp session auth deactivate" 857 " interface <interface>" 858 " local-addr <local-address>" 859 " peer-addr <peer-address>" 860 "[ delayed <yes|no> ]",
870 #define foreach_bfd_cli_udp_set_echo_source_cli_param(F) \ 871 F (u32, sw_if_index, INTERFACE_STR, mandatory, "%U", \ 872 unformat_vnet_sw_interface, &vnet_main) 878 int something_parsed = 0;
881 if (!something_parsed)
896 "`bfd_udp_set_echo_source' API call failed, rv=%d:%U",
907 .path =
"bfd udp echo-source set",
908 .short_help =
"bfd udp echo-source set interface <interface>",
921 "`bfd_udp_del_echo_source' API call failed, rv=%d:%U",
930 .path =
"bfd udp echo-source del",
931 .short_help =
"bfd udp echo-source del",
static u8 * format_vnet_api_errno(u8 *s, va_list *args)
u8 curr_bfd_key_id
current key ID sent out in bfd packet
static clib_error_t * bfd_cli_udp_session_mod(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
vnet_api_error_t bfd_udp_mod_session(u32 sw_if_index, const ip46_address_t *local_addr, const ip46_address_t *peer_addr, u32 desired_min_tx_usec, u32 required_min_rx_usec, u8 detect_mult)
modify existing session
static clib_error_t * bfd_cli_key_del(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
u64 echo_last_rx_clocks
timestamp of last echo packet received
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
bfd_diag_code_e local_diag
local diagnostics
static u64 clib_cpu_time_now(void)
vnet_api_error_t bfd_udp_add_session(u32 sw_if_index, const ip46_address_t *local_addr, const ip46_address_t *peer_addr, u32 desired_min_tx_usec, u32 required_min_rx_usec, u8 detect_mult, u8 is_authenticated, u32 conf_key_id, u8 bfd_key_id)
create a new bfd session
vnet_api_error_t bfd_auth_del_key(u32 conf_key_id)
delete existing authentication key
u64 last_tx_clocks
timestamp of last packet transmitted
static clib_error_t * bfd_cli_udp_session_set_flags(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
u32 remote_seq_number
remote sequence number
vnet_api_error_t bfd_udp_del_echo_source()
unset echo-source interface
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
void bfd_udp_get_echo_source(int *is_set, u32 *sw_if_index, int *have_usable_ip4, ip4_address_t *ip4, int *have_usable_ip6, ip6_address_t *ip6)
get echo source information - used by CLI
#define foreach_bfd_cli_udp_session_auth_activate_cli_param(F)
u32 bfd_clocks_to_usec(const bfd_main_t *bm, u64 clocks)
vnet_api_error_t bfd_udp_del_session(u32 sw_if_index, const ip46_address_t *local_addr, const ip46_address_t *peer_addr)
delete existing session
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
const char * bfd_poll_state_string(bfd_poll_state_e state)
static clib_error_t * bfd_cli_udp_set_echo_source(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
u64 remote_min_rx_usec
remote min rx interval (microseconds)
#define clib_error_return(e, args...)
#define foreach_bfd_cli_udp_set_echo_source_cli_param(F)
vnet_api_error_t bfd_auth_set_key(u32 conf_key_id, u8 auth_type, u8 key_len, const u8 *key)
create or modify bfd authentication key
#define foreach_bfd_cli_udp_session_auth_deactivate_cli_param(F)
#define CHECK_MANDATORY(t, n, s, r,...)
u8 remote_demand
1 if remote system sets demand mode, 0 otherwise
bfd_session_t * sessions
pool of bfd sessions context data
bfd_auth_key_t * auth_keys
pool of authentication keys
bfd_udp_key_t key
key identifying this session
bfd_transport_e transport
transport type for this session
#define foreach_bfd_cli_udp_session_mod_cli_param(F)
u64 echo_last_tx_clocks
timestamp of last echo packet transmitted
bfd_poll_state_e poll_state
state info regarding poll sequence
static clib_error_t * show_bfd(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
static clib_error_t * bfd_cli_udp_session_auth_deactivate(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
#define foreach_bfd_cli_udp_session_set_flags_cli_param(F)
u8 local_detect_mult
configured detect multiplier
#define DECLARE(t, n, s, r,...)
u64 last_rx_clocks
timestamp of last packet received
vnet_api_error_t bfd_udp_session_set_flags(u32 sw_if_index, const ip46_address_t *local_addr, const ip46_address_t *peer_addr, u8 admin_up_down)
set session admin down/up
bfd_diag_code_e remote_diag
remote diagnostics
u64 transmit_interval_clocks
transmit interval
#define foreach_bfd_cli_udp_session_del_cli_param(F)
#define vec_free(V)
Free vector's memory (no header).
u32 config_desired_min_tx_usec
configured desired min tx interval (microseconds)
#define UNFORMAT(t, n, s, r,...)
static vnet_sw_interface_t * vnet_get_sw_interface_safe(vnet_main_t *vnm, u32 sw_if_index)
const char * bfd_diag_code_string(bfd_diag_code_e diag)
static clib_error_t * bfd_cli_udp_session_auth_activate(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
static clib_error_t * bfd_cli_udp_del_echo_source(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
#define foreach_vnet_api_error
#define VLIB_CLI_COMMAND(x,...)
u8 echo
1 is echo function is active, 0 otherwise
u64 remote_desired_min_tx_clocks
remote desired min tx interval (clocks)
vnet_api_error_t bfd_udp_auth_activate(u32 sw_if_index, const ip46_address_t *local_addr, const ip46_address_t *peer_addr, u32 conf_key_id, u8 bfd_key_id, u8 is_delayed)
activate authentication for existing session
u32 conf_key_id
global configuration key ID
bfd_state_e local_state
session state
u64 echo_transmit_interval_clocks
transmit interval for echo packets
u32 local_seq_number
sequence number incremented occasionally or always (if meticulous)
vnet_api_error_t bfd_udp_set_echo_source(u32 loopback_sw_if_index)
set echo-source interface
u32 config_required_min_rx_usec
configured required min rx interval (microseconds)
static clib_error_t * bfd_cli_udp_session_del(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u32 bs_idx
index in bfd_main.sessions pool
static u8 * format_bfd_session_cli(u8 *s, va_list *args)
u64 remote_min_echo_rx_usec
remote min echo rx interval (microseconds)
bfd_state_e remote_state
remote session state
const char * bfd_state_string(bfd_state_e state)
static clib_error_t * bfd_cli_udp_session_add(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
vnet_api_error_t bfd_udp_auth_deactivate(u32 sw_if_index, const ip46_address_t *local_addr, const ip46_address_t *peer_addr, u8 is_delayed)
deactivate authentication for existing session
struct bfd_session_s::@47 auth
authentication information
bfd_auth_key_t * curr_key
current key in use
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
#define foreach_bfd_cli_udp_session_add_cli_param(F)
static clib_error_t * bfd_cli_key_add(vlib_main_t *vm, unformat_input_t *input, CLIB_UNUSED(vlib_cli_command_t *lmd))
u8 remote_detect_mult
remote detect multiplier
static uword pool_elts(void *v)
Number of active elements in a pool.