2 * BFD daemon northbound 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
26 #include "lib/northbound.h"
33 static void bfd_session_get_key(bool mhop
, const struct lyd_node
*dnode
,
36 const char *ifname
= NULL
, *vrfname
= NULL
;
37 struct sockaddr_any psa
, lsa
;
39 /* Required destination parameter. */
40 strtosa(yang_dnode_get_string(dnode
, "./dest-addr"), &psa
);
42 /* Get optional source address. */
43 memset(&lsa
, 0, sizeof(lsa
));
44 if (yang_dnode_exists(dnode
, "./source-addr"))
45 strtosa(yang_dnode_get_string(dnode
, "./source-addr"), &lsa
);
47 /* Get optional interface and vrf names. */
48 if (yang_dnode_exists(dnode
, "./interface"))
49 ifname
= yang_dnode_get_string(dnode
, "./interface");
50 if (yang_dnode_exists(dnode
, "./vrf"))
51 vrfname
= yang_dnode_get_string(dnode
, "./vrf");
53 /* Generate the corresponding key. */
54 gen_bfd_key(bk
, &psa
, &lsa
, mhop
, ifname
, vrfname
);
57 static int bfd_session_create(enum nb_event event
, const struct lyd_node
*dnode
,
58 union nb_resource
*resource
, bool mhop
)
60 struct bfd_session
*bs
;
68 bfd_session_get_key(mhop
, dnode
, &bk
);
69 bs
= bfd_key_lookup(bk
);
71 /* This session was already configured by another daemon. */
73 /* Now it is configured also by CLI. */
74 BFD_SET_FLAG(bs
->flags
, BFD_SESS_FLAG_CONFIG
);
81 bs
= bfd_session_new();
83 return NB_ERR_RESOURCE
;
85 /* Fill the session key. */
86 bfd_session_get_key(mhop
, dnode
, &bs
->key
);
88 /* Set configuration flags. */
90 BFD_SET_FLAG(bs
->flags
, BFD_SESS_FLAG_CONFIG
);
92 BFD_SET_FLAG(bs
->flags
, BFD_SESS_FLAG_MH
);
93 if (bs
->key
.family
== AF_INET6
)
94 BFD_SET_FLAG(bs
->flags
, BFD_SESS_FLAG_IPV6
);
102 /* Only attempt to registrate if freshly allocated. */
103 if (bs
->discrs
.my_discr
== 0 && bs_registrate(bs
) == NULL
)
104 return NB_ERR_RESOURCE
;
106 nb_running_set_entry(dnode
, bs
);
111 if (bs
->refcount
<= 1)
112 bfd_session_free(resource
->ptr
);
119 static int bfd_session_destroy(enum nb_event event
,
120 const struct lyd_node
*dnode
, bool mhop
)
122 struct bfd_session
*bs
;
127 bfd_session_get_key(mhop
, dnode
, &bk
);
128 if (bfd_key_lookup(bk
) == NULL
)
129 return NB_ERR_INCONSISTENCY
;
137 bs
= nb_running_unset_entry(dnode
);
138 /* CLI is not using this session anymore. */
139 if (BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_CONFIG
) == 0)
142 BFD_UNSET_FLAG(bs
->flags
, BFD_SESS_FLAG_CONFIG
);
144 /* There are still daemons using it. */
145 if (bs
->refcount
> 0)
148 bfd_session_free(bs
);
160 * XPath: /frr-bfdd:bfdd/bfd
162 static int bfdd_bfd_create(enum nb_event event
,
163 const struct lyd_node
*dnode
164 __attribute__((__unused__
)),
165 union nb_resource
*resource
166 __attribute__((__unused__
)))
172 static int bfdd_bfd_destroy(enum nb_event event
, const struct lyd_node
*dnode
)
184 bfd_sessions_remove_manual();
196 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop
198 static int bfdd_bfd_sessions_single_hop_create(enum nb_event event
,
199 const struct lyd_node
*dnode
,
200 union nb_resource
*resource
)
202 return bfd_session_create(event
, dnode
, resource
, false);
205 static int bfdd_bfd_sessions_single_hop_destroy(enum nb_event event
,
206 const struct lyd_node
*dnode
)
208 return bfd_session_destroy(event
, dnode
, false);
212 bfdd_bfd_sessions_single_hop_get_next(const void *parent_list_entry
213 __attribute__((__unused__
)),
214 const void *list_entry
)
216 return bfd_session_next(list_entry
, false);
219 static int bfdd_bfd_sessions_single_hop_get_keys(const void *list_entry
,
220 struct yang_list_keys
*keys
)
222 const struct bfd_session
*bs
= list_entry
;
223 char dstbuf
[INET6_ADDRSTRLEN
];
225 inet_ntop(bs
->key
.family
, &bs
->key
.peer
, dstbuf
, sizeof(dstbuf
));
228 strlcpy(keys
->key
[0], dstbuf
, sizeof(keys
->key
[0]));
229 strlcpy(keys
->key
[1], bs
->key
.ifname
, sizeof(keys
->key
[1]));
230 strlcpy(keys
->key
[2], bs
->key
.vrfname
, sizeof(keys
->key
[2]));
236 bfdd_bfd_sessions_single_hop_lookup_entry(const void *parent_list_entry
237 __attribute__((__unused__
)),
238 const struct yang_list_keys
*keys
)
240 const char *dest_addr
= keys
->key
[0];
241 const char *ifname
= keys
->key
[1];
242 const char *vrf
= keys
->key
[2];
243 struct sockaddr_any psa
, lsa
;
246 strtosa(dest_addr
, &psa
);
247 memset(&lsa
, 0, sizeof(lsa
));
248 gen_bfd_key(&bk
, &psa
, &lsa
, false, ifname
, vrf
);
250 return bfd_key_lookup(bk
);
254 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/source-addr
256 static int bfdd_bfd_sessions_single_hop_source_addr_modify(
257 enum nb_event event
__attribute__((__unused__
)),
258 const struct lyd_node
*dnode
__attribute__((__unused__
)),
259 union nb_resource
*resource
__attribute__((__unused__
)))
264 static int bfdd_bfd_sessions_single_hop_source_addr_destroy(
265 enum nb_event event
__attribute__((__unused__
)),
266 const struct lyd_node
*dnode
__attribute__((__unused__
)))
272 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/detection-multiplier
274 static int bfdd_bfd_sessions_single_hop_detection_multiplier_modify(
275 enum nb_event event
, const struct lyd_node
*dnode
,
276 union nb_resource
*resource
__attribute__((__unused__
)))
278 uint8_t detection_multiplier
= yang_dnode_get_uint8(dnode
, NULL
);
279 struct bfd_session
*bs
;
290 bs
= nb_running_get_entry(dnode
, NULL
, true);
291 bs
->detect_mult
= detection_multiplier
;
303 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/desired-transmission-interval
305 static int bfdd_bfd_sessions_single_hop_desired_transmission_interval_modify(
306 enum nb_event event
, const struct lyd_node
*dnode
,
307 union nb_resource
*resource
__attribute__((__unused__
)))
309 uint32_t tx_interval
= yang_dnode_get_uint32(dnode
, NULL
);
310 struct bfd_session
*bs
;
314 if (tx_interval
< 10000 || tx_interval
> 60000000)
315 return NB_ERR_VALIDATION
;
323 bs
= nb_running_get_entry(dnode
, NULL
, true);
324 if (tx_interval
== bs
->timers
.desired_min_tx
)
327 bs
->timers
.desired_min_tx
= tx_interval
;
340 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/required-receive-interval
342 static int bfdd_bfd_sessions_single_hop_required_receive_interval_modify(
343 enum nb_event event
, const struct lyd_node
*dnode
,
344 union nb_resource
*resource
__attribute__((__unused__
)))
346 uint32_t rx_interval
= yang_dnode_get_uint32(dnode
, NULL
);
347 struct bfd_session
*bs
;
351 if (rx_interval
< 10000 || rx_interval
> 60000000)
352 return NB_ERR_VALIDATION
;
360 bs
= nb_running_get_entry(dnode
, NULL
, true);
361 if (rx_interval
== bs
->timers
.required_min_rx
)
364 bs
->timers
.required_min_rx
= rx_interval
;
377 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/administrative-down
379 static int bfdd_bfd_sessions_single_hop_administrative_down_modify(
380 enum nb_event event
, const struct lyd_node
*dnode
,
381 union nb_resource
*resource
__attribute__((__unused__
)))
383 bool shutdown
= yang_dnode_get_bool(dnode
, NULL
);
384 struct bfd_session
*bs
;
398 bs
= nb_running_get_entry(dnode
, NULL
, true);
400 if (shutdown
== false) {
401 if (!BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_SHUTDOWN
))
404 BFD_UNSET_FLAG(bs
->flags
, BFD_SESS_FLAG_SHUTDOWN
);
406 /* Change and notify state change. */
407 bs
->ses_state
= PTM_BFD_DOWN
;
410 /* Enable all timers. */
411 bfd_recvtimer_update(bs
);
412 bfd_xmttimer_update(bs
, bs
->xmt_TO
);
413 if (BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
)) {
414 bfd_echo_recvtimer_update(bs
);
415 bfd_echo_xmttimer_update(bs
, bs
->echo_xmt_TO
);
418 if (BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_SHUTDOWN
))
421 BFD_SET_FLAG(bs
->flags
, BFD_SESS_FLAG_SHUTDOWN
);
423 /* Disable all events. */
424 bfd_recvtimer_delete(bs
);
425 bfd_echo_recvtimer_delete(bs
);
426 bfd_xmttimer_delete(bs
);
427 bfd_echo_xmttimer_delete(bs
);
429 /* Change and notify state change. */
430 bs
->ses_state
= PTM_BFD_ADM_DOWN
;
440 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/echo-mode
442 static int bfdd_bfd_sessions_single_hop_echo_mode_modify(
443 enum nb_event event
, const struct lyd_node
*dnode
,
444 union nb_resource
*resource
__attribute__((__unused__
)))
446 bool echo
= yang_dnode_get_bool(dnode
, NULL
);
447 struct bfd_session
*bs
;
461 bs
= nb_running_get_entry(dnode
, NULL
, true);
464 if (!BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
))
467 BFD_UNSET_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
);
468 ptm_bfd_echo_stop(bs
);
470 if (BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
))
473 BFD_SET_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
);
474 /* Apply setting immediately. */
475 if (!BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_SHUTDOWN
))
476 bs_echo_timer_handler(bs
);
484 * /frr-bfdd:bfdd/bfd/sessions/single-hop/desired-echo-transmission-interval
487 bfdd_bfd_sessions_single_hop_desired_echo_transmission_interval_modify(
488 enum nb_event event
, const struct lyd_node
*dnode
,
489 union nb_resource
*resource
__attribute__((__unused__
)))
491 uint32_t echo_interval
= yang_dnode_get_uint32(dnode
, NULL
);
492 struct bfd_session
*bs
;
496 if (echo_interval
< 10000 || echo_interval
> 60000000)
497 return NB_ERR_VALIDATION
;
505 bs
= nb_running_get_entry(dnode
, NULL
, true);
506 if (echo_interval
== bs
->timers
.required_min_echo
)
509 bs
->timers
.required_min_echo
= echo_interval
;
521 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-discriminator
523 static struct yang_data
*
524 bfdd_bfd_sessions_single_hop_stats_local_discriminator_get_elem(
525 const char *xpath
, const void *list_entry
)
527 const struct bfd_session
*bs
= list_entry
;
529 return yang_data_new_uint32(xpath
, bs
->discrs
.my_discr
);
533 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-state
535 static struct yang_data
*
536 bfdd_bfd_sessions_single_hop_stats_local_state_get_elem(const char *xpath
,
537 const void *list_entry
)
539 const struct bfd_session
*bs
= list_entry
;
541 return yang_data_new_enum(xpath
, bs
->ses_state
);
545 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-diagnostic
547 static struct yang_data
*
548 bfdd_bfd_sessions_single_hop_stats_local_diagnostic_get_elem(
549 const char *xpath
, const void *list_entry
)
551 const struct bfd_session
*bs
= list_entry
;
553 return yang_data_new_enum(xpath
, bs
->local_diag
);
557 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-multiplier
559 static struct yang_data
*
560 bfdd_bfd_sessions_single_hop_stats_local_multiplier_get_elem(
561 const char *xpath
, const void *list_entry
)
563 const struct bfd_session
*bs
= list_entry
;
565 return yang_data_new_int8(xpath
, bs
->detect_mult
);
569 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-discriminator
571 static struct yang_data
*
572 bfdd_bfd_sessions_single_hop_stats_remote_discriminator_get_elem(
573 const char *xpath
, const void *list_entry
)
575 const struct bfd_session
*bs
= list_entry
;
577 if (bs
->discrs
.remote_discr
== 0)
580 return yang_data_new_uint32(xpath
, bs
->discrs
.remote_discr
);
584 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-state
586 static struct yang_data
*
587 bfdd_bfd_sessions_single_hop_stats_remote_state_get_elem(const char *xpath
,
588 const void *list_entry
)
590 const struct bfd_session
*bs
= list_entry
;
592 return yang_data_new_enum(xpath
, bs
->ses_state
);
596 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-diagnostic
598 static struct yang_data
*
599 bfdd_bfd_sessions_single_hop_stats_remote_diagnostic_get_elem(
600 const char *xpath
, const void *list_entry
)
602 const struct bfd_session
*bs
= list_entry
;
604 return yang_data_new_enum(xpath
, bs
->remote_diag
);
608 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-multiplier
610 static struct yang_data
*
611 bfdd_bfd_sessions_single_hop_stats_remote_multiplier_get_elem(
612 const char *xpath
, const void *list_entry
)
614 const struct bfd_session
*bs
= list_entry
;
616 return yang_data_new_int8(xpath
, bs
->remote_detect_mult
);
621 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-transmission-interval
623 static struct yang_data
*
624 bfdd_bfd_sessions_single_hop_stats_negotiated_transmission_interval_get_elem(
625 const char *xpath
, const void *list_entry
)
627 const struct bfd_session
*bs
= list_entry
;
629 return yang_data_new_uint32(xpath
, bs
->remote_timers
.desired_min_tx
);
634 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-receive-interval
636 static struct yang_data
*
637 bfdd_bfd_sessions_single_hop_stats_negotiated_receive_interval_get_elem(
638 const char *xpath
, const void *list_entry
)
640 const struct bfd_session
*bs
= list_entry
;
642 return yang_data_new_uint32(xpath
, bs
->remote_timers
.required_min_rx
);
646 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/detection-mode
648 static struct yang_data
*
649 bfdd_bfd_sessions_single_hop_stats_detection_mode_get_elem(
650 const char *xpath
, const void *list_entry
)
652 const struct bfd_session
*bs
= list_entry
;
658 * 2. Async without echo
659 * 3. Demand with echo
660 * 4. Demand without echo
662 * TODO: support demand mode.
664 if (BFD_CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
))
669 return yang_data_new_enum(xpath
, detection_mode
);
673 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-down-time
675 static struct yang_data
*
676 bfdd_bfd_sessions_single_hop_stats_last_down_time_get_elem(
677 const char *xpath
__attribute__((__unused__
)),
678 const void *list_entry
__attribute__((__unused__
)))
681 * TODO: implement me.
683 * No yang support for time elements yet.
689 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-up-time
691 static struct yang_data
*
692 bfdd_bfd_sessions_single_hop_stats_last_up_time_get_elem(
693 const char *xpath
__attribute__((__unused__
)),
694 const void *list_entry
__attribute__((__unused__
)))
697 * TODO: implement me.
699 * No yang support for time elements yet.
705 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-down-count
707 static struct yang_data
*
708 bfdd_bfd_sessions_single_hop_stats_session_down_count_get_elem(
709 const char *xpath
, const void *list_entry
)
711 const struct bfd_session
*bs
= list_entry
;
713 return yang_data_new_uint64(xpath
, bs
->stats
.session_down
);
717 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-up-count
719 static struct yang_data
*
720 bfdd_bfd_sessions_single_hop_stats_session_up_count_get_elem(
721 const char *xpath
, const void *list_entry
)
723 const struct bfd_session
*bs
= list_entry
;
725 return yang_data_new_uint64(xpath
, bs
->stats
.session_up
);
730 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-input-count
732 static struct yang_data
*
733 bfdd_bfd_sessions_single_hop_stats_control_packet_input_count_get_elem(
734 const char *xpath
, const void *list_entry
)
736 const struct bfd_session
*bs
= list_entry
;
738 return yang_data_new_uint64(xpath
, bs
->stats
.rx_ctrl_pkt
);
743 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-output-count
745 static struct yang_data
*
746 bfdd_bfd_sessions_single_hop_stats_control_packet_output_count_get_elem(
747 const char *xpath
, const void *list_entry
)
749 const struct bfd_session
*bs
= list_entry
;
751 return yang_data_new_uint64(xpath
, bs
->stats
.tx_ctrl_pkt
);
756 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-echo-transmission-interval
758 static struct yang_data
*
759 bfdd_bfd_sessions_single_hop_stats_negotiated_echo_transmission_interval_get_elem(
760 const char *xpath
, const void *list_entry
)
762 const struct bfd_session
*bs
= list_entry
;
764 return yang_data_new_uint32(xpath
, bs
->remote_timers
.required_min_echo
);
768 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-input-count
770 static struct yang_data
*
771 bfdd_bfd_sessions_single_hop_stats_echo_packet_input_count_get_elem(
772 const char *xpath
, const void *list_entry
)
774 const struct bfd_session
*bs
= list_entry
;
776 return yang_data_new_uint64(xpath
, bs
->stats
.rx_echo_pkt
);
780 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-output-count
782 static struct yang_data
*
783 bfdd_bfd_sessions_single_hop_stats_echo_packet_output_count_get_elem(
784 const char *xpath
, const void *list_entry
)
786 const struct bfd_session
*bs
= list_entry
;
788 return yang_data_new_uint64(xpath
, bs
->stats
.tx_echo_pkt
);
792 * XPath: /frr-bfdd:bfdd/bfd/sessions/multi-hop
794 static int bfdd_bfd_sessions_multi_hop_create(enum nb_event event
,
795 const struct lyd_node
*dnode
,
796 union nb_resource
*resource
)
798 return bfd_session_create(event
, dnode
, resource
, true);
801 static int bfdd_bfd_sessions_multi_hop_destroy(enum nb_event event
,
802 const struct lyd_node
*dnode
)
804 return bfd_session_destroy(event
, dnode
, true);
808 bfdd_bfd_sessions_multi_hop_get_next(const void *parent_list_entry
809 __attribute__((__unused__
)),
810 const void *list_entry
)
812 return bfd_session_next(list_entry
, true);
815 static int bfdd_bfd_sessions_multi_hop_get_keys(const void *list_entry
,
816 struct yang_list_keys
*keys
)
818 const struct bfd_session
*bs
= list_entry
;
819 char dstbuf
[INET6_ADDRSTRLEN
], srcbuf
[INET6_ADDRSTRLEN
];
821 inet_ntop(bs
->key
.family
, &bs
->key
.peer
, dstbuf
, sizeof(dstbuf
));
822 inet_ntop(bs
->key
.family
, &bs
->key
.local
, srcbuf
, sizeof(srcbuf
));
825 strlcpy(keys
->key
[0], srcbuf
, sizeof(keys
->key
[0]));
826 strlcpy(keys
->key
[1], dstbuf
, sizeof(keys
->key
[1]));
827 strlcpy(keys
->key
[2], bs
->key
.ifname
, sizeof(keys
->key
[2]));
828 strlcpy(keys
->key
[3], bs
->key
.vrfname
, sizeof(keys
->key
[3]));
834 bfdd_bfd_sessions_multi_hop_lookup_entry(const void *parent_list_entry
835 __attribute__((__unused__
)),
836 const struct yang_list_keys
*keys
)
838 const char *source_addr
= keys
->key
[0];
839 const char *dest_addr
= keys
->key
[1];
840 const char *ifname
= keys
->key
[2];
841 const char *vrf
= keys
->key
[3];
842 struct sockaddr_any psa
, lsa
;
845 strtosa(dest_addr
, &psa
);
846 strtosa(source_addr
, &lsa
);
847 gen_bfd_key(&bk
, &psa
, &lsa
, true, ifname
, vrf
);
849 return bfd_key_lookup(bk
);
852 /* clang-format off */
853 const struct frr_yang_module_info frr_bfdd_info
= {
857 .xpath
= "/frr-bfdd:bfdd/bfd",
859 .create
= bfdd_bfd_create
,
860 .destroy
= bfdd_bfd_destroy
,
861 .cli_show
= bfd_cli_show_header
,
862 .cli_show_end
= bfd_cli_show_header_end
,
866 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop",
868 .create
= bfdd_bfd_sessions_single_hop_create
,
869 .destroy
= bfdd_bfd_sessions_single_hop_destroy
,
870 .get_next
= bfdd_bfd_sessions_single_hop_get_next
,
871 .get_keys
= bfdd_bfd_sessions_single_hop_get_keys
,
872 .lookup_entry
= bfdd_bfd_sessions_single_hop_lookup_entry
,
873 .cli_show
= bfd_cli_show_single_hop_peer
,
874 .cli_show_end
= bfd_cli_show_peer_end
,
878 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/source-addr",
880 .modify
= bfdd_bfd_sessions_single_hop_source_addr_modify
,
881 .destroy
= bfdd_bfd_sessions_single_hop_source_addr_destroy
,
885 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/detection-multiplier",
887 .modify
= bfdd_bfd_sessions_single_hop_detection_multiplier_modify
,
888 .cli_show
= bfd_cli_show_mult
,
892 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/desired-transmission-interval",
894 .modify
= bfdd_bfd_sessions_single_hop_desired_transmission_interval_modify
,
895 .cli_show
= bfd_cli_show_tx
,
899 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/required-receive-interval",
901 .modify
= bfdd_bfd_sessions_single_hop_required_receive_interval_modify
,
902 .cli_show
= bfd_cli_show_rx
,
906 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/administrative-down",
908 .modify
= bfdd_bfd_sessions_single_hop_administrative_down_modify
,
909 .cli_show
= bfd_cli_show_shutdown
,
913 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/echo-mode",
915 .modify
= bfdd_bfd_sessions_single_hop_echo_mode_modify
,
916 .cli_show
= bfd_cli_show_echo
,
920 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/desired-echo-transmission-interval",
922 .modify
= bfdd_bfd_sessions_single_hop_desired_echo_transmission_interval_modify
,
923 .cli_show
= bfd_cli_show_echo_interval
,
927 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-discriminator",
929 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_discriminator_get_elem
,
933 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-state",
935 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_state_get_elem
,
939 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-diagnostic",
941 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_diagnostic_get_elem
,
945 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-multiplier",
947 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_multiplier_get_elem
,
951 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-discriminator",
953 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_discriminator_get_elem
,
957 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-state",
959 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_state_get_elem
,
963 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-diagnostic",
965 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_diagnostic_get_elem
,
969 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-multiplier",
971 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_multiplier_get_elem
,
975 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-transmission-interval",
977 .get_elem
= bfdd_bfd_sessions_single_hop_stats_negotiated_transmission_interval_get_elem
,
981 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-receive-interval",
983 .get_elem
= bfdd_bfd_sessions_single_hop_stats_negotiated_receive_interval_get_elem
,
987 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/detection-mode",
989 .get_elem
= bfdd_bfd_sessions_single_hop_stats_detection_mode_get_elem
,
993 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-down-time",
995 .get_elem
= bfdd_bfd_sessions_single_hop_stats_last_down_time_get_elem
,
999 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-up-time",
1001 .get_elem
= bfdd_bfd_sessions_single_hop_stats_last_up_time_get_elem
,
1005 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-down-count",
1007 .get_elem
= bfdd_bfd_sessions_single_hop_stats_session_down_count_get_elem
,
1011 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-up-count",
1013 .get_elem
= bfdd_bfd_sessions_single_hop_stats_session_up_count_get_elem
,
1017 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-input-count",
1019 .get_elem
= bfdd_bfd_sessions_single_hop_stats_control_packet_input_count_get_elem
,
1023 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-output-count",
1025 .get_elem
= bfdd_bfd_sessions_single_hop_stats_control_packet_output_count_get_elem
,
1029 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-echo-transmission-interval",
1031 .get_elem
= bfdd_bfd_sessions_single_hop_stats_negotiated_echo_transmission_interval_get_elem
,
1035 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-input-count",
1037 .get_elem
= bfdd_bfd_sessions_single_hop_stats_echo_packet_input_count_get_elem
,
1041 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-output-count",
1043 .get_elem
= bfdd_bfd_sessions_single_hop_stats_echo_packet_output_count_get_elem
,
1047 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop",
1049 .create
= bfdd_bfd_sessions_multi_hop_create
,
1050 .destroy
= bfdd_bfd_sessions_multi_hop_destroy
,
1051 .get_next
= bfdd_bfd_sessions_multi_hop_get_next
,
1052 .get_keys
= bfdd_bfd_sessions_multi_hop_get_keys
,
1053 .lookup_entry
= bfdd_bfd_sessions_multi_hop_lookup_entry
,
1054 .cli_show
= bfd_cli_show_multi_hop_peer
,
1055 .cli_show_end
= bfd_cli_show_peer_end
,
1059 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/detection-multiplier",
1061 .modify
= bfdd_bfd_sessions_single_hop_detection_multiplier_modify
,
1062 .cli_show
= bfd_cli_show_mult
,
1066 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/desired-transmission-interval",
1068 .modify
= bfdd_bfd_sessions_single_hop_desired_transmission_interval_modify
,
1069 .cli_show
= bfd_cli_show_tx
,
1073 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/required-receive-interval",
1075 .modify
= bfdd_bfd_sessions_single_hop_required_receive_interval_modify
,
1076 .cli_show
= bfd_cli_show_rx
,
1080 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/administrative-down",
1082 .modify
= bfdd_bfd_sessions_single_hop_administrative_down_modify
,
1083 .cli_show
= bfd_cli_show_shutdown
,
1087 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/local-discriminator",
1089 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_discriminator_get_elem
,
1093 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/local-state",
1095 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_state_get_elem
,
1099 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/local-diagnostic",
1101 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_diagnostic_get_elem
,
1105 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/local-multiplier",
1107 .get_elem
= bfdd_bfd_sessions_single_hop_stats_local_multiplier_get_elem
,
1111 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/remote-discriminator",
1113 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_discriminator_get_elem
,
1117 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/remote-state",
1119 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_state_get_elem
,
1123 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/remote-diagnostic",
1125 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_diagnostic_get_elem
,
1129 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/remote-multiplier",
1131 .get_elem
= bfdd_bfd_sessions_single_hop_stats_remote_multiplier_get_elem
,
1135 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/negotiated-transmission-interval",
1137 .get_elem
= bfdd_bfd_sessions_single_hop_stats_negotiated_transmission_interval_get_elem
,
1141 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/negotiated-receive-interval",
1143 .get_elem
= bfdd_bfd_sessions_single_hop_stats_negotiated_receive_interval_get_elem
,
1147 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/detection-mode",
1149 .get_elem
= bfdd_bfd_sessions_single_hop_stats_detection_mode_get_elem
,
1153 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/last-down-time",
1155 .get_elem
= bfdd_bfd_sessions_single_hop_stats_last_down_time_get_elem
,
1159 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/last-up-time",
1161 .get_elem
= bfdd_bfd_sessions_single_hop_stats_last_up_time_get_elem
,
1165 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/session-down-count",
1167 .get_elem
= bfdd_bfd_sessions_single_hop_stats_session_down_count_get_elem
,
1171 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/session-up-count",
1173 .get_elem
= bfdd_bfd_sessions_single_hop_stats_session_up_count_get_elem
,
1177 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/control-packet-input-count",
1179 .get_elem
= bfdd_bfd_sessions_single_hop_stats_control_packet_input_count_get_elem
,
1183 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/control-packet-output-count",
1185 .get_elem
= bfdd_bfd_sessions_single_hop_stats_control_packet_output_count_get_elem
,
1189 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/negotiated-echo-transmission-interval",
1191 .get_elem
= bfdd_bfd_sessions_single_hop_stats_negotiated_echo_transmission_interval_get_elem
,
1195 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/echo-packet-input-count",
1197 .get_elem
= bfdd_bfd_sessions_single_hop_stats_echo_packet_input_count_get_elem
,
1201 .xpath
= "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/echo-packet-output-count",
1203 .get_elem
= bfdd_bfd_sessions_single_hop_stats_echo_packet_output_count_get_elem
,