]>
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
34 const void *bfdd_bfd_sessions_single_hop_get_next(const void *parent_list_entry
35 __attribute__((__unused__
)),
36 const void *list_entry
)
38 return bfd_session_next(list_entry
, false);
41 int bfdd_bfd_sessions_single_hop_get_keys(const void *list_entry
,
42 struct yang_list_keys
*keys
)
44 const struct bfd_session
*bs
= list_entry
;
45 char dstbuf
[INET6_ADDRSTRLEN
];
47 inet_ntop(bs
->key
.family
, &bs
->key
.peer
, dstbuf
, sizeof(dstbuf
));
50 strlcpy(keys
->key
[0], dstbuf
, sizeof(keys
->key
[0]));
51 strlcpy(keys
->key
[1], bs
->key
.ifname
, sizeof(keys
->key
[1]));
52 strlcpy(keys
->key
[2], bs
->key
.vrfname
, sizeof(keys
->key
[2]));
58 bfdd_bfd_sessions_single_hop_lookup_entry(const void *parent_list_entry
59 __attribute__((__unused__
)),
60 const struct yang_list_keys
*keys
)
62 const char *dest_addr
= keys
->key
[0];
63 const char *ifname
= keys
->key
[1];
64 const char *vrf
= keys
->key
[2];
65 struct sockaddr_any psa
, lsa
;
68 strtosa(dest_addr
, &psa
);
69 memset(&lsa
, 0, sizeof(lsa
));
70 gen_bfd_key(&bk
, &psa
, &lsa
, false, ifname
, vrf
);
72 return bfd_key_lookup(bk
);
76 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-discriminator
79 bfdd_bfd_sessions_single_hop_stats_local_discriminator_get_elem(
80 const char *xpath
, const void *list_entry
)
82 const struct bfd_session
*bs
= list_entry
;
84 return yang_data_new_uint32(xpath
, bs
->discrs
.my_discr
);
88 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-state
91 bfdd_bfd_sessions_single_hop_stats_local_state_get_elem(const char *xpath
,
92 const void *list_entry
)
94 const struct bfd_session
*bs
= list_entry
;
96 return yang_data_new_enum(xpath
, bs
->ses_state
);
100 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-diagnostic
102 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_local_diagnostic_get_elem(
103 const char *xpath
, const void *list_entry
)
105 const struct bfd_session
*bs
= list_entry
;
107 return yang_data_new_enum(xpath
, bs
->local_diag
);
111 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-multiplier
113 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_local_multiplier_get_elem(
114 const char *xpath
, const void *list_entry
)
116 const struct bfd_session
*bs
= list_entry
;
118 return yang_data_new_int8(xpath
, bs
->detect_mult
);
122 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-discriminator
125 bfdd_bfd_sessions_single_hop_stats_remote_discriminator_get_elem(
126 const char *xpath
, const void *list_entry
)
128 const struct bfd_session
*bs
= list_entry
;
130 if (bs
->discrs
.remote_discr
== 0)
133 return yang_data_new_uint32(xpath
, bs
->discrs
.remote_discr
);
137 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-state
140 bfdd_bfd_sessions_single_hop_stats_remote_state_get_elem(const char *xpath
,
141 const void *list_entry
)
143 const struct bfd_session
*bs
= list_entry
;
145 return yang_data_new_enum(xpath
, bs
->ses_state
);
149 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-diagnostic
151 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_remote_diagnostic_get_elem(
152 const char *xpath
, const void *list_entry
)
154 const struct bfd_session
*bs
= list_entry
;
156 return yang_data_new_enum(xpath
, bs
->remote_diag
);
160 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/remote-multiplier
162 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_remote_multiplier_get_elem(
163 const char *xpath
, const void *list_entry
)
165 const struct bfd_session
*bs
= list_entry
;
167 return yang_data_new_int8(xpath
, bs
->remote_detect_mult
);
172 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-transmission-interval
175 bfdd_bfd_sessions_single_hop_stats_negotiated_transmission_interval_get_elem(
176 const char *xpath
, const void *list_entry
)
178 const struct bfd_session
*bs
= list_entry
;
180 return yang_data_new_uint32(xpath
, bs
->remote_timers
.desired_min_tx
);
185 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-receive-interval
188 bfdd_bfd_sessions_single_hop_stats_negotiated_receive_interval_get_elem(
189 const char *xpath
, const void *list_entry
)
191 const struct bfd_session
*bs
= list_entry
;
193 return yang_data_new_uint32(xpath
, bs
->remote_timers
.required_min_rx
);
197 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/detection-mode
199 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_detection_mode_get_elem(
200 const char *xpath
, const void *list_entry
)
202 const struct bfd_session
*bs
= list_entry
;
208 * 2. Async without echo
209 * 3. Demand with echo
210 * 4. Demand without echo
212 * TODO: support demand mode.
214 if (CHECK_FLAG(bs
->flags
, BFD_SESS_FLAG_ECHO
))
219 return yang_data_new_enum(xpath
, detection_mode
);
223 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-down-time
225 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_last_down_time_get_elem(
226 const char *xpath
__attribute__((__unused__
)),
227 const void *list_entry
__attribute__((__unused__
)))
230 * TODO: implement me.
232 * No yang support for time elements yet.
238 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/last-up-time
240 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_last_up_time_get_elem(
241 const char *xpath
__attribute__((__unused__
)),
242 const void *list_entry
__attribute__((__unused__
)))
245 * TODO: implement me.
247 * No yang support for time elements yet.
253 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-down-count
256 bfdd_bfd_sessions_single_hop_stats_session_down_count_get_elem(
257 const char *xpath
, const void *list_entry
)
259 const struct bfd_session
*bs
= list_entry
;
261 return yang_data_new_uint64(xpath
, bs
->stats
.session_down
);
265 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/session-up-count
267 struct yang_data
*bfdd_bfd_sessions_single_hop_stats_session_up_count_get_elem(
268 const char *xpath
, const void *list_entry
)
270 const struct bfd_session
*bs
= list_entry
;
272 return yang_data_new_uint64(xpath
, bs
->stats
.session_up
);
277 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-input-count
280 bfdd_bfd_sessions_single_hop_stats_control_packet_input_count_get_elem(
281 const char *xpath
, const void *list_entry
)
283 const struct bfd_session
*bs
= list_entry
;
285 return yang_data_new_uint64(xpath
, bs
->stats
.rx_ctrl_pkt
);
290 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/control-packet-output-count
293 bfdd_bfd_sessions_single_hop_stats_control_packet_output_count_get_elem(
294 const char *xpath
, const void *list_entry
)
296 const struct bfd_session
*bs
= list_entry
;
298 return yang_data_new_uint64(xpath
, bs
->stats
.tx_ctrl_pkt
);
303 * /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/negotiated-echo-transmission-interval
306 bfdd_bfd_sessions_single_hop_stats_negotiated_echo_transmission_interval_get_elem(
307 const char *xpath
, const void *list_entry
)
309 const struct bfd_session
*bs
= list_entry
;
311 return yang_data_new_uint32(xpath
, bs
->remote_timers
.required_min_echo
);
315 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-input-count
318 bfdd_bfd_sessions_single_hop_stats_echo_packet_input_count_get_elem(
319 const char *xpath
, const void *list_entry
)
321 const struct bfd_session
*bs
= list_entry
;
323 return yang_data_new_uint64(xpath
, bs
->stats
.rx_echo_pkt
);
327 * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/stats/echo-packet-output-count
330 bfdd_bfd_sessions_single_hop_stats_echo_packet_output_count_get_elem(
331 const char *xpath
, const void *list_entry
)
333 const struct bfd_session
*bs
= list_entry
;
335 return yang_data_new_uint64(xpath
, bs
->stats
.tx_echo_pkt
);
339 * XPath: /frr-bfdd:bfdd/bfd/sessions/multi-hop
341 const void *bfdd_bfd_sessions_multi_hop_get_next(const void *parent_list_entry
342 __attribute__((__unused__
)),
343 const void *list_entry
)
345 return bfd_session_next(list_entry
, true);
348 int bfdd_bfd_sessions_multi_hop_get_keys(const void *list_entry
,
349 struct yang_list_keys
*keys
)
351 const struct bfd_session
*bs
= list_entry
;
352 char dstbuf
[INET6_ADDRSTRLEN
], srcbuf
[INET6_ADDRSTRLEN
];
354 inet_ntop(bs
->key
.family
, &bs
->key
.peer
, dstbuf
, sizeof(dstbuf
));
355 inet_ntop(bs
->key
.family
, &bs
->key
.local
, srcbuf
, sizeof(srcbuf
));
358 strlcpy(keys
->key
[0], srcbuf
, sizeof(keys
->key
[0]));
359 strlcpy(keys
->key
[1], dstbuf
, sizeof(keys
->key
[1]));
360 strlcpy(keys
->key
[2], bs
->key
.ifname
, sizeof(keys
->key
[2]));
361 strlcpy(keys
->key
[3], bs
->key
.vrfname
, sizeof(keys
->key
[3]));
367 bfdd_bfd_sessions_multi_hop_lookup_entry(const void *parent_list_entry
368 __attribute__((__unused__
)),
369 const struct yang_list_keys
*keys
)
371 const char *source_addr
= keys
->key
[0];
372 const char *dest_addr
= keys
->key
[1];
373 const char *ifname
= keys
->key
[2];
374 const char *vrf
= keys
->key
[3];
375 struct sockaddr_any psa
, lsa
;
378 strtosa(dest_addr
, &psa
);
379 strtosa(source_addr
, &lsa
);
380 gen_bfd_key(&bk
, &psa
, &lsa
, true, ifname
, vrf
);
382 return bfd_key_lookup(bk
);