]>
git.proxmox.com Git - mirror_frr.git/blob - bfdd/bfdd_nb_state.c
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"
32 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop
35 bfdd_bfd_sessions_single_hop_get_next(struct nb_cb_get_next_args
*args
)
37 return bfd_session_next(args
->list_entry
, false);
40 int bfdd_bfd_sessions_single_hop_get_keys(struct nb_cb_get_keys_args
*args
)
42 const struct bfd_session
*bs
= args
->list_entry
;
43 char dstbuf
[INET6_ADDRSTRLEN
];
45 inet_ntop(bs
->key
.family
, &bs
->key
.peer
, dstbuf
, sizeof(dstbuf
));
48 strlcpy(args
->keys
->key
[0], dstbuf
, sizeof(args
->keys
->key
[0]));
49 strlcpy(args
->keys
->key
[1], bs
->key
.ifname
, sizeof(args
->keys
->key
[1]));
50 strlcpy(args
->keys
->key
[2], bs
->key
.vrfname
,
51 sizeof(args
->keys
->key
[2]));
57 bfdd_bfd_sessions_single_hop_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
59 const char *dest_addr
= args
->keys
->key
[0];
60 const char *ifname
= args
->keys
->key
[1];
61 const char *vrf
= args
->keys
->key
[2];
62 struct sockaddr_any psa
, lsa
;
65 strtosa(dest_addr
, &psa
);
66 memset(&lsa
, 0, sizeof(lsa
));
67 gen_bfd_key(&bk
, &psa
, &lsa
, false, ifname
, vrf
);
69 return bfd_key_lookup(bk
);
73 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-discriminator
76 bfdd_bfd_sessions_single_hop_stats_local_discriminator_get_elem(
77 struct nb_cb_get_elem_args
*args
)
79 const struct bfd_session
*bs
= args
->list_entry
;
81 return yang_data_new_uint32(args
->xpath
, bs
->discrs
.my_discr
);
85 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-state
87 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_local_state_get_elem(
88 struct nb_cb_get_elem_args
*args
)
90 const struct bfd_session
*bs
= args
->list_entry
;
92 return yang_data_new_enum(args
->xpath
, bs
->ses_state
);
96 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-diagnostic
98 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_local_diagnostic_get_elem(
99 struct nb_cb_get_elem_args
*args
)
101 const struct bfd_session
*bs
= args
->list_entry
;
103 return yang_data_new_enum(args
->xpath
, bs
->local_diag
);
107 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-multiplier
109 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_local_multiplier_get_elem(
110 struct nb_cb_get_elem_args
*args
)
112 const struct bfd_session
*bs
= args
->list_entry
;
114 return yang_data_new_int8(args
->xpath
, bs
->detect_mult
);
118 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-discriminator
121 bfdd_bfd_sessions_single_hop_stats_remote_discriminator_get_elem(
122 struct nb_cb_get_elem_args
*args
)
124 const struct bfd_session
*bs
= args
->list_entry
;
126 if (bs
->discrs
.remote_discr
== 0)
129 return yang_data_new_uint32(args
->xpath
, bs
->discrs
.remote_discr
);
133 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-state
135 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_remote_state_get_elem(
136 struct nb_cb_get_elem_args
*args
)
138 const struct bfd_session
*bs
= args
->list_entry
;
140 return yang_data_new_enum(args
->xpath
, bs
->ses_state
);
144 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-diagnostic
146 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_remote_diagnostic_get_elem(
147 struct nb_cb_get_elem_args
*args
)
149 const struct bfd_session
*bs
= args
->list_entry
;
151 return yang_data_new_enum(args
->xpath
, bs
->remote_diag
);
155 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-multiplier
157 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_remote_multiplier_get_elem(
158 struct nb_cb_get_elem_args
*args
)
160 const struct bfd_session
*bs
= args
->list_entry
;
162 return yang_data_new_int8(args
->xpath
, bs
->remote_detect_mult
);
167 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-transmission-interval
170 bfdd_bfd_sessions_single_hop_stats_negotiated_transmission_interval_get_elem(
171 struct nb_cb_get_elem_args
*args
)
173 const struct bfd_session
*bs
= args
->list_entry
;
175 return yang_data_new_uint32(args
->xpath
,
176 bs
->remote_timers
.desired_min_tx
);
181 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-receive-interval
184 bfdd_bfd_sessions_single_hop_stats_negotiated_receive_interval_get_elem(
185 struct nb_cb_get_elem_args
*args
)
187 const struct bfd_session
*bs
= args
->list_entry
;
189 return yang_data_new_uint32(args
->xpath
,
190 bs
->remote_timers
.required_min_rx
);
194 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/detection-mode
196 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_detection_mode_get_elem(
197 struct nb_cb_get_elem_args
*args
)
199 const struct bfd_session
*bs
= args
->list_entry
;
205 * 2. Async without echo
206 * 3. Demand with echo
207 * 4. Demand without echo
209 * TODO: support demand mode.
211 if (CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
))
216 return yang_data_new_enum(args
->xpath
, detection_mode
);
220 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-down-time
222 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_last_down_time_get_elem(
223 struct nb_cb_get_elem_args
*args
)
226 * TODO: implement me.
228 * No yang support for time elements yet.
234 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-up-time
236 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_last_up_time_get_elem(
237 struct nb_cb_get_elem_args
*args
)
240 * TODO: implement me.
242 * No yang support for time elements yet.
248 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-down-count
251 bfdd_bfd_sessions_single_hop_stats_session_down_count_get_elem(
252 struct nb_cb_get_elem_args
*args
)
254 const struct bfd_session
*bs
= args
->list_entry
;
256 return yang_data_new_uint64(args
->xpath
, bs
->stats
.session_down
);
260 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-up-count
262 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_session_up_count_get_elem(
263 struct nb_cb_get_elem_args
*args
)
265 const struct bfd_session
*bs
= args
->list_entry
;
267 return yang_data_new_uint64(args
->xpath
, bs
->stats
.session_up
);
272 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-input-count
275 bfdd_bfd_sessions_single_hop_stats_control_packet_input_count_get_elem(
276 struct nb_cb_get_elem_args
*args
)
278 const struct bfd_session
*bs
= args
->list_entry
;
280 return yang_data_new_uint64(args
->xpath
, bs
->stats
.rx_ctrl_pkt
);
285 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-output-count
288 bfdd_bfd_sessions_single_hop_stats_control_packet_output_count_get_elem(
289 struct nb_cb_get_elem_args
*args
)
291 const struct bfd_session
*bs
= args
->list_entry
;
293 return yang_data_new_uint64(args
->xpath
, bs
->stats
.tx_ctrl_pkt
);
298 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-echo-transmission-interval
301 bfdd_bfd_sessions_single_hop_stats_negotiated_echo_transmission_interval_get_elem(
302 struct nb_cb_get_elem_args
*args
)
304 const struct bfd_session
*bs
= args
->list_entry
;
306 return yang_data_new_uint32(args
->xpath
,
307 bs
->remote_timers
.required_min_echo
);
311 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-input-count
314 bfdd_bfd_sessions_single_hop_stats_echo_packet_input_count_get_elem(
315 struct nb_cb_get_elem_args
*args
)
317 const struct bfd_session
*bs
= args
->list_entry
;
319 return yang_data_new_uint64(args
->xpath
, bs
->stats
.rx_echo_pkt
);
323 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-output-count
326 bfdd_bfd_sessions_single_hop_stats_echo_packet_output_count_get_elem(
327 struct nb_cb_get_elem_args
*args
)
329 const struct bfd_session
*bs
= args
->list_entry
;
331 return yang_data_new_uint64(args
->xpath
, bs
->stats
.tx_echo_pkt
);
335 * XPath: /frr-bfdd:bfdd/bfd/sessions/multi-hop
338 bfdd_bfd_sessions_multi_hop_get_next(struct nb_cb_get_next_args
*args
)
340 return bfd_session_next(args
->list_entry
, true);
343 int bfdd_bfd_sessions_multi_hop_get_keys(struct nb_cb_get_keys_args
*args
)
345 const struct bfd_session
*bs
= args
->list_entry
;
346 char dstbuf
[INET6_ADDRSTRLEN
], srcbuf
[INET6_ADDRSTRLEN
];
348 inet_ntop(bs
->key
.family
, &bs
->key
.peer
, dstbuf
, sizeof(dstbuf
));
349 inet_ntop(bs
->key
.family
, &bs
->key
.local
, srcbuf
, sizeof(srcbuf
));
352 strlcpy(args
->keys
->key
[0], srcbuf
, sizeof(args
->keys
->key
[0]));
353 strlcpy(args
->keys
->key
[1], dstbuf
, sizeof(args
->keys
->key
[1]));
354 strlcpy(args
->keys
->key
[2], bs
->key
.vrfname
,
355 sizeof(args
->keys
->key
[2]));
361 bfdd_bfd_sessions_multi_hop_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
363 const char *source_addr
= args
->keys
->key
[0];
364 const char *dest_addr
= args
->keys
->key
[1];
365 const char *vrf
= args
->keys
->key
[2];
366 struct sockaddr_any psa
, lsa
;
369 strtosa(dest_addr
, &psa
);
370 strtosa(source_addr
, &lsa
);
371 gen_bfd_key(&bk
, &psa
, &lsa
, true, NULL
, vrf
);
373 return bfd_key_lookup(bk
);