2 * BFD daemon CLI implementation.
4 * Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF")
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 #include "lib/command.h"
27 #include "lib/northbound_cli.h"
29 #ifndef VTYSH_EXTRACT_PL
30 #include "bfdd/bfdd_cli_clippy.c"
31 #endif /* VTYSH_EXTRACT_PL */
39 #define PEER_STR "Configure peer\n"
40 #define INTERFACE_NAME_STR "Configure interface name to use\n"
41 #define PEER_IPV4_STR "IPv4 peer address\n"
42 #define PEER_IPV6_STR "IPv6 peer address\n"
43 #define MHOP_STR "Configure multihop\n"
44 #define LOCAL_STR "Configure local address\n"
45 #define LOCAL_IPV4_STR "IPv4 local address\n"
46 #define LOCAL_IPV6_STR "IPv6 local address\n"
47 #define LOCAL_INTF_STR "Configure local interface name to use\n"
48 #define VRF_STR "Configure VRF\n"
49 #define VRF_NAME_STR "Configure VRF name\n"
55 bfd_cli_is_single_hop(struct vty
*vty
)
57 return strstr(VTY_CURR_XPATH
, "/single-hop") != NULL
;
61 bfd_cli_is_profile(struct vty
*vty
)
63 return strstr(VTY_CURR_XPATH
, "/bfd/profile") != NULL
;
70 bfd_enter
, bfd_enter_cmd
,
72 "Configure BFD peers\n")
76 nb_cli_enqueue_change(vty
, "/frr-bfdd:bfdd/bfd", NB_OP_CREATE
, NULL
);
77 ret
= nb_cli_apply_changes(vty
, NULL
);
78 if (ret
== CMD_SUCCESS
)
79 VTY_PUSH_XPATH(BFD_NODE
, "/frr-bfdd:bfdd/bfd");
85 bfd_config_reset
, bfd_config_reset_cmd
,
88 "Configure BFD peers\n")
90 nb_cli_enqueue_change(vty
, "/frr-bfdd:bfdd/bfd", NB_OP_DESTROY
, NULL
);
91 return nb_cli_apply_changes(vty
, NULL
);
94 void bfd_cli_show_header(struct vty
*vty
,
95 const struct lyd_node
*dnode
96 __attribute__((__unused__
)),
97 bool show_defaults
__attribute__((__unused__
)))
99 vty_out(vty
, "!\nbfd\n");
102 void bfd_cli_show_header_end(struct vty
*vty
, const struct lyd_node
*dnode
103 __attribute__((__unused__
)))
105 vty_out(vty
, "exit\n");
110 bfd_peer_enter
, bfd_peer_enter_cmd
,
111 "peer <A.B.C.D|X:X::X:X> [{multihop$multihop|local-address <A.B.C.D|X:X::X:X>|interface IFNAME$ifname|vrf NAME}]",
125 char source_str
[INET6_ADDRSTRLEN
+ 32];
126 char xpath
[XPATH_MAXLEN
], xpath_srcaddr
[XPATH_MAXLEN
+ 32];
129 if (!local_address_str
) {
131 "%% local-address is required when using multihop\n");
132 return CMD_WARNING_CONFIG_FAILED
;
136 "%% interface is prohibited when using multihop\n");
137 return CMD_WARNING_CONFIG_FAILED
;
139 snprintf(source_str
, sizeof(source_str
), "[source-addr='%s']",
144 slen
= snprintf(xpath
, sizeof(xpath
),
145 "/frr-bfdd:bfdd/bfd/sessions/%s%s[dest-addr='%s']",
146 multihop
? "multi-hop" : "single-hop", source_str
,
149 slen
+= snprintf(xpath
+ slen
, sizeof(xpath
) - slen
,
150 "[interface='%s']", ifname
);
152 slen
+= snprintf(xpath
+ slen
, sizeof(xpath
) - slen
,
155 snprintf(xpath
+ slen
, sizeof(xpath
) - slen
, "[vrf='%s']", vrf
);
157 snprintf(xpath
+ slen
, sizeof(xpath
) - slen
, "[vrf='%s']",
160 nb_cli_enqueue_change(vty
, xpath
, NB_OP_CREATE
, NULL
);
161 if (multihop
== NULL
&& local_address_str
!= NULL
) {
162 snprintf(xpath_srcaddr
, sizeof(xpath_srcaddr
),
163 "%s/source-addr", xpath
);
164 nb_cli_enqueue_change(vty
, xpath_srcaddr
, NB_OP_MODIFY
,
168 /* Apply settings immediately. */
169 ret
= nb_cli_apply_changes(vty
, NULL
);
170 if (ret
== CMD_SUCCESS
)
171 VTY_PUSH_XPATH(BFD_PEER_NODE
, xpath
);
177 bfd_no_peer
, bfd_no_peer_cmd
,
178 "no peer <A.B.C.D|X:X::X:X> [{multihop$multihop|local-address <A.B.C.D|X:X::X:X>|interface IFNAME$ifname|vrf NAME}]",
193 char xpath
[XPATH_MAXLEN
];
194 char source_str
[INET6_ADDRSTRLEN
+ 32];
197 if (!local_address_str
) {
199 "%% local-address is required when using multihop\n");
200 return CMD_WARNING_CONFIG_FAILED
;
204 "%% interface is prohibited when using multihop\n");
205 return CMD_WARNING_CONFIG_FAILED
;
207 snprintf(source_str
, sizeof(source_str
), "[source-addr='%s']",
212 slen
= snprintf(xpath
, sizeof(xpath
),
213 "/frr-bfdd:bfdd/bfd/sessions/%s%s[dest-addr='%s']",
214 multihop
? "multi-hop" : "single-hop", source_str
,
217 slen
+= snprintf(xpath
+ slen
, sizeof(xpath
) - slen
,
218 "[interface='%s']", ifname
);
220 slen
+= snprintf(xpath
+ slen
, sizeof(xpath
) - slen
,
223 snprintf(xpath
+ slen
, sizeof(xpath
) - slen
, "[vrf='%s']", vrf
);
225 snprintf(xpath
+ slen
, sizeof(xpath
) - slen
, "[vrf='%s']",
228 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
230 /* Apply settings immediatly. */
231 return nb_cli_apply_changes(vty
, NULL
);
234 static void _bfd_cli_show_peer(struct vty
*vty
, const struct lyd_node
*dnode
,
235 bool show_defaults
__attribute__((__unused__
)),
238 const char *vrf
= yang_dnode_get_string(dnode
, "./vrf");
240 vty_out(vty
, " peer %s",
241 yang_dnode_get_string(dnode
, "./dest-addr"));
244 vty_out(vty
, " multihop");
246 if (yang_dnode_exists(dnode
, "./source-addr"))
247 vty_out(vty
, " local-address %s",
248 yang_dnode_get_string(dnode
, "./source-addr"));
250 if (strcmp(vrf
, VRF_DEFAULT_NAME
))
251 vty_out(vty
, " vrf %s", vrf
);
255 yang_dnode_get_string(dnode
, "./interface");
256 if (strcmp(ifname
, "*"))
257 vty_out(vty
, " interface %s", ifname
);
263 void bfd_cli_show_single_hop_peer(struct vty
*vty
, const struct lyd_node
*dnode
,
266 _bfd_cli_show_peer(vty
, dnode
, show_defaults
, false);
269 void bfd_cli_show_multi_hop_peer(struct vty
*vty
, const struct lyd_node
*dnode
,
272 _bfd_cli_show_peer(vty
, dnode
, show_defaults
, true);
275 void bfd_cli_show_peer_end(struct vty
*vty
, const struct lyd_node
*dnode
276 __attribute__((__unused__
)))
278 vty_out(vty
, " exit\n");
279 vty_out(vty
, " !\n");
283 bfd_peer_shutdown
, bfd_peer_shutdown_cmd
,
286 "Disable BFD peer\n")
288 nb_cli_enqueue_change(vty
, "./administrative-down", NB_OP_MODIFY
,
289 no
? "false" : "true");
290 return nb_cli_apply_changes(vty
, NULL
);
293 void bfd_cli_show_shutdown(struct vty
*vty
, const struct lyd_node
*dnode
,
296 vty_out(vty
, " %sshutdown\n",
297 yang_dnode_get_bool(dnode
, NULL
) ? "" : "no ");
301 bfd_peer_passive
, bfd_peer_passive_cmd
,
304 "Don't attempt to start sessions\n")
306 nb_cli_enqueue_change(vty
, "./passive-mode", NB_OP_MODIFY
,
307 no
? "false" : "true");
308 return nb_cli_apply_changes(vty
, NULL
);
311 void bfd_cli_show_passive(struct vty
*vty
, const struct lyd_node
*dnode
,
314 vty_out(vty
, " %spassive-mode\n",
315 yang_dnode_get_bool(dnode
, NULL
) ? "" : "no ");
319 bfd_peer_minimum_ttl
, bfd_peer_minimum_ttl_cmd
,
320 "[no] minimum-ttl (1-254)$ttl",
322 "Expect packets with at least this TTL\n"
323 "Minimum TTL expected\n")
325 if (bfd_cli_is_single_hop(vty
)) {
326 vty_out(vty
, "%% Minimum TTL is only available for multi hop sessions.\n");
327 return CMD_WARNING_CONFIG_FAILED
;
331 nb_cli_enqueue_change(vty
, "./minimum-ttl", NB_OP_DESTROY
,
334 nb_cli_enqueue_change(vty
, "./minimum-ttl", NB_OP_MODIFY
,
336 return nb_cli_apply_changes(vty
, NULL
);
340 no_bfd_peer_minimum_ttl
, no_bfd_peer_minimum_ttl_cmd
,
343 "Expect packets with at least this TTL\n")
345 nb_cli_enqueue_change(vty
, "./minimum-ttl", NB_OP_DESTROY
, NULL
);
346 return nb_cli_apply_changes(vty
, NULL
);
349 void bfd_cli_show_minimum_ttl(struct vty
*vty
, const struct lyd_node
*dnode
,
352 vty_out(vty
, " minimum-ttl %s\n", yang_dnode_get_string(dnode
, NULL
));
356 bfd_peer_mult
, bfd_peer_mult_cmd
,
357 "detect-multiplier (2-255)$multiplier",
358 "Configure peer detection multiplier\n"
359 "Configure peer detection multiplier value\n")
361 nb_cli_enqueue_change(vty
, "./detection-multiplier", NB_OP_MODIFY
,
363 return nb_cli_apply_changes(vty
, NULL
);
366 void bfd_cli_show_mult(struct vty
*vty
, const struct lyd_node
*dnode
,
369 vty_out(vty
, " detect-multiplier %s\n",
370 yang_dnode_get_string(dnode
, NULL
));
374 bfd_peer_rx
, bfd_peer_rx_cmd
,
375 "receive-interval (10-60000)$interval",
376 "Configure peer receive interval\n"
377 "Configure peer receive interval value in milliseconds\n")
381 snprintf(value
, sizeof(value
), "%ld", interval
* 1000);
382 nb_cli_enqueue_change(vty
, "./required-receive-interval", NB_OP_MODIFY
,
385 return nb_cli_apply_changes(vty
, NULL
);
388 void bfd_cli_show_rx(struct vty
*vty
, const struct lyd_node
*dnode
,
391 uint32_t value
= yang_dnode_get_uint32(dnode
, NULL
);
393 vty_out(vty
, " receive-interval %u\n", value
/ 1000);
397 bfd_peer_tx
, bfd_peer_tx_cmd
,
398 "transmit-interval (10-60000)$interval",
399 "Configure peer transmit interval\n"
400 "Configure peer transmit interval value in milliseconds\n")
404 snprintf(value
, sizeof(value
), "%ld", interval
* 1000);
405 nb_cli_enqueue_change(vty
, "./desired-transmission-interval",
406 NB_OP_MODIFY
, value
);
408 return nb_cli_apply_changes(vty
, NULL
);
411 void bfd_cli_show_tx(struct vty
*vty
, const struct lyd_node
*dnode
,
414 uint32_t value
= yang_dnode_get_uint32(dnode
, NULL
);
416 vty_out(vty
, " transmit-interval %u\n", value
/ 1000);
420 bfd_peer_echo
, bfd_peer_echo_cmd
,
423 "Configure echo mode\n")
425 if (!bfd_cli_is_profile(vty
) && !bfd_cli_is_single_hop(vty
)) {
427 "%% Echo mode is only available for single hop sessions.\n");
428 return CMD_WARNING_CONFIG_FAILED
;
431 if (!no
&& !bglobal
.bg_use_dplane
) {
434 "%% Echo mode works correctly for IPv4, but only works when the peer is also FRR for IPv6.\n");
437 "%% Current implementation of echo mode works only when the peer is also FRR.\n");
438 #endif /* BFD_LINUX */
441 nb_cli_enqueue_change(vty
, "./echo-mode", NB_OP_MODIFY
,
442 no
? "false" : "true");
443 return nb_cli_apply_changes(vty
, NULL
);
446 void bfd_cli_show_echo(struct vty
*vty
, const struct lyd_node
*dnode
,
449 vty_out(vty
, " %secho-mode\n",
450 yang_dnode_get_bool(dnode
, NULL
) ? "" : "no ");
454 bfd_peer_echo_interval
, bfd_peer_echo_interval_cmd
,
455 "echo-interval (10-60000)$interval",
456 "Configure peer echo intervals\n"
457 "Configure peer echo rx/tx intervals value in milliseconds\n")
461 if (!bfd_cli_is_profile(vty
) && !bfd_cli_is_single_hop(vty
)) {
462 vty_out(vty
, "%% Echo mode is only available for single hop sessions.\n");
463 return CMD_WARNING_CONFIG_FAILED
;
466 snprintf(value
, sizeof(value
), "%ld", interval
* 1000);
467 nb_cli_enqueue_change(vty
, "./desired-echo-transmission-interval",
468 NB_OP_MODIFY
, value
);
469 nb_cli_enqueue_change(vty
, "./required-echo-receive-interval",
470 NB_OP_MODIFY
, value
);
472 return nb_cli_apply_changes(vty
, NULL
);
476 bfd_peer_echo_transmit_interval
, bfd_peer_echo_transmit_interval_cmd
,
477 "echo transmit-interval (10-60000)$interval",
478 "Configure peer echo intervals\n"
479 "Configure desired transmit interval\n"
480 "Configure interval value in milliseconds\n")
484 if (!bfd_cli_is_profile(vty
) && !bfd_cli_is_single_hop(vty
)) {
485 vty_out(vty
, "%% Echo mode is only available for single hop sessions.\n");
486 return CMD_WARNING_CONFIG_FAILED
;
489 snprintf(value
, sizeof(value
), "%ld", interval
* 1000);
490 nb_cli_enqueue_change(vty
, "./desired-echo-transmission-interval",
491 NB_OP_MODIFY
, value
);
493 return nb_cli_apply_changes(vty
, NULL
);
496 void bfd_cli_show_desired_echo_transmission_interval(
497 struct vty
*vty
, const struct lyd_node
*dnode
, bool show_defaults
)
499 uint32_t value
= yang_dnode_get_uint32(dnode
, NULL
);
501 vty_out(vty
, " echo transmit-interval %u\n", value
/ 1000);
505 bfd_peer_echo_receive_interval
, bfd_peer_echo_receive_interval_cmd
,
506 "echo receive-interval <disabled$disabled|(10-60000)$interval>",
507 "Configure peer echo intervals\n"
508 "Configure required receive interval\n"
509 "Disable echo packets receive\n"
510 "Configure interval value in milliseconds\n")
514 if (!bfd_cli_is_profile(vty
) && !bfd_cli_is_single_hop(vty
)) {
515 vty_out(vty
, "%% Echo mode is only available for single hop sessions.\n");
516 return CMD_WARNING_CONFIG_FAILED
;
520 snprintf(value
, sizeof(value
), "0");
522 snprintf(value
, sizeof(value
), "%ld", interval
* 1000);
524 nb_cli_enqueue_change(vty
, "./required-echo-receive-interval",
525 NB_OP_MODIFY
, value
);
527 return nb_cli_apply_changes(vty
, NULL
);
530 void bfd_cli_show_required_echo_receive_interval(struct vty
*vty
,
531 const struct lyd_node
*dnode
,
534 uint32_t value
= yang_dnode_get_uint32(dnode
, NULL
);
537 vty_out(vty
, " echo receive-interval %u\n", value
/ 1000);
539 vty_out(vty
, " echo receive-interval disabled\n");
545 DEFPY_YANG_NOSH(bfd_profile
, bfd_profile_cmd
,
546 "profile BFDPROF$name",
548 BFD_PROFILE_NAME_STR
)
550 char xpath
[XPATH_MAXLEN
];
553 snprintf(xpath
, sizeof(xpath
), "/frr-bfdd:bfdd/bfd/profile[name='%s']",
556 nb_cli_enqueue_change(vty
, xpath
, NB_OP_CREATE
, NULL
);
558 /* Apply settings immediately. */
559 rv
= nb_cli_apply_changes(vty
, NULL
);
560 if (rv
== CMD_SUCCESS
)
561 VTY_PUSH_XPATH(BFD_PROFILE_NODE
, xpath
);
566 DEFPY_YANG(no_bfd_profile
, no_bfd_profile_cmd
,
567 "no profile BFDPROF$name",
570 BFD_PROFILE_NAME_STR
)
572 char xpath
[XPATH_MAXLEN
];
574 snprintf(xpath
, sizeof(xpath
), "/frr-bfdd:bfdd/bfd/profile[name='%s']",
577 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
579 /* Apply settings immediately. */
580 return nb_cli_apply_changes(vty
, NULL
);
583 void bfd_cli_show_profile(struct vty
*vty
, const struct lyd_node
*dnode
,
586 vty_out(vty
, " profile %s\n", yang_dnode_get_string(dnode
, "./name"));
589 ALIAS_YANG(bfd_peer_mult
, bfd_profile_mult_cmd
,
590 "detect-multiplier (2-255)$multiplier",
591 "Configure peer detection multiplier\n"
592 "Configure peer detection multiplier value\n")
594 ALIAS_YANG(bfd_peer_tx
, bfd_profile_tx_cmd
,
595 "transmit-interval (10-60000)$interval",
596 "Configure peer transmit interval\n"
597 "Configure peer transmit interval value in milliseconds\n")
599 ALIAS_YANG(bfd_peer_rx
, bfd_profile_rx_cmd
,
600 "receive-interval (10-60000)$interval",
601 "Configure peer receive interval\n"
602 "Configure peer receive interval value in milliseconds\n")
604 ALIAS_YANG(bfd_peer_shutdown
, bfd_profile_shutdown_cmd
,
607 "Disable BFD peer\n")
609 ALIAS_YANG(bfd_peer_passive
, bfd_profile_passive_cmd
,
612 "Don't attempt to start sessions\n")
614 ALIAS_YANG(bfd_peer_minimum_ttl
, bfd_profile_minimum_ttl_cmd
,
615 "[no] minimum-ttl (1-254)$ttl",
617 "Expect packets with at least this TTL\n"
618 "Minimum TTL expected\n")
620 ALIAS_YANG(no_bfd_peer_minimum_ttl
, no_bfd_profile_minimum_ttl_cmd
,
623 "Expect packets with at least this TTL\n")
625 ALIAS_YANG(bfd_peer_echo
, bfd_profile_echo_cmd
,
628 "Configure echo mode\n")
630 ALIAS_YANG(bfd_peer_echo_interval
, bfd_profile_echo_interval_cmd
,
631 "echo-interval (10-60000)$interval",
632 "Configure peer echo interval\n"
633 "Configure peer echo interval value in milliseconds\n")
636 bfd_peer_echo_transmit_interval
, bfd_profile_echo_transmit_interval_cmd
,
637 "echo transmit-interval (10-60000)$interval",
638 "Configure peer echo intervals\n"
639 "Configure desired transmit interval\n"
640 "Configure interval value in milliseconds\n")
643 bfd_peer_echo_receive_interval
, bfd_profile_echo_receive_interval_cmd
,
644 "echo receive-interval <disabled$disabled|(10-60000)$interval>",
645 "Configure peer echo intervals\n"
646 "Configure required receive interval\n"
647 "Disable echo packets receive\n"
648 "Configure interval value in milliseconds\n")
650 DEFPY_YANG(bfd_peer_profile
, bfd_peer_profile_cmd
,
651 "[no] profile BFDPROF$pname",
653 "Use BFD profile settings\n"
654 BFD_PROFILE_NAME_STR
)
657 nb_cli_enqueue_change(vty
, "./profile", NB_OP_DESTROY
, NULL
);
659 nb_cli_enqueue_change(vty
, "./profile", NB_OP_MODIFY
, pname
);
661 return nb_cli_apply_changes(vty
, NULL
);
664 void bfd_cli_peer_profile_show(struct vty
*vty
, const struct lyd_node
*dnode
,
667 vty_out(vty
, " profile %s\n", yang_dnode_get_string(dnode
, NULL
));
670 struct cmd_node bfd_profile_node
= {
671 .name
= "bfd profile",
672 .node
= BFD_PROFILE_NODE
,
673 .parent_node
= BFD_NODE
,
674 .prompt
= "%s(config-bfd-profile)# ",
677 static void bfd_profile_var(vector comps
, struct cmd_token
*token
)
679 extern struct bfdproflist bplist
;
680 struct bfd_profile
*bp
;
682 TAILQ_FOREACH (bp
, &bplist
, entry
) {
683 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, bp
->name
));
687 static const struct cmd_variable_handler bfd_vars
[] = {
688 {.tokenname
= "BFDPROF", .completions
= bfd_profile_var
},
689 {.completions
= NULL
}
695 install_element(CONFIG_NODE
, &bfd_enter_cmd
);
696 install_element(CONFIG_NODE
, &bfd_config_reset_cmd
);
698 install_element(BFD_NODE
, &bfd_peer_enter_cmd
);
699 install_element(BFD_NODE
, &bfd_no_peer_cmd
);
701 install_element(BFD_PEER_NODE
, &bfd_peer_shutdown_cmd
);
702 install_element(BFD_PEER_NODE
, &bfd_peer_mult_cmd
);
703 install_element(BFD_PEER_NODE
, &bfd_peer_rx_cmd
);
704 install_element(BFD_PEER_NODE
, &bfd_peer_tx_cmd
);
705 install_element(BFD_PEER_NODE
, &bfd_peer_echo_cmd
);
706 install_element(BFD_PEER_NODE
, &bfd_peer_echo_interval_cmd
);
707 install_element(BFD_PEER_NODE
, &bfd_peer_echo_transmit_interval_cmd
);
708 install_element(BFD_PEER_NODE
, &bfd_peer_echo_receive_interval_cmd
);
709 install_element(BFD_PEER_NODE
, &bfd_peer_profile_cmd
);
710 install_element(BFD_PEER_NODE
, &bfd_peer_passive_cmd
);
711 install_element(BFD_PEER_NODE
, &bfd_peer_minimum_ttl_cmd
);
712 install_element(BFD_PEER_NODE
, &no_bfd_peer_minimum_ttl_cmd
);
714 /* Profile commands. */
715 cmd_variable_handler_register(bfd_vars
);
717 install_node(&bfd_profile_node
);
718 install_default(BFD_PROFILE_NODE
);
720 install_element(BFD_NODE
, &bfd_profile_cmd
);
721 install_element(BFD_NODE
, &no_bfd_profile_cmd
);
723 install_element(BFD_PROFILE_NODE
, &bfd_profile_mult_cmd
);
724 install_element(BFD_PROFILE_NODE
, &bfd_profile_tx_cmd
);
725 install_element(BFD_PROFILE_NODE
, &bfd_profile_rx_cmd
);
726 install_element(BFD_PROFILE_NODE
, &bfd_profile_shutdown_cmd
);
727 install_element(BFD_PROFILE_NODE
, &bfd_profile_echo_cmd
);
728 install_element(BFD_PROFILE_NODE
, &bfd_profile_echo_interval_cmd
);
729 install_element(BFD_PROFILE_NODE
, &bfd_profile_echo_transmit_interval_cmd
);
730 install_element(BFD_PROFILE_NODE
, &bfd_profile_echo_receive_interval_cmd
);
731 install_element(BFD_PROFILE_NODE
, &bfd_profile_passive_cmd
);
732 install_element(BFD_PROFILE_NODE
, &bfd_profile_minimum_ttl_cmd
);
733 install_element(BFD_PROFILE_NODE
, &no_bfd_profile_minimum_ttl_cmd
);