]> git.proxmox.com Git - mirror_frr.git/blame - vrrpd/vrrp_northbound.c
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / vrrpd / vrrp_northbound.c
CommitLineData
f495425b
QY
1/*
2 * VRRP northbound bindings.
3 * Copyright (C) 2019 Cumulus Networks, Inc.
4 * Quentin Young
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <zebra.h>
22
23#include "if.h"
24#include "log.h"
25#include "prefix.h"
26#include "table.h"
27#include "command.h"
28#include "northbound.h"
29#include "libfrr.h"
30#include "vrrp.h"
31#include "vrrp_vty.h"
32
33/*
34 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group
35 */
36static int lib_interface_vrrp_vrrp_group_create(enum nb_event event,
37 const struct lyd_node *dnode,
38 union nb_resource *resource)
39{
40 struct interface *ifp;
41 uint8_t vrid;
42 uint8_t version = 3;
43 struct vrrp_vrouter *vr;
44
45 if (event != NB_EV_APPLY)
46 return NB_OK;
47
48 ifp = nb_running_get_entry(dnode, NULL, true);
49 vrid = yang_dnode_get_uint8(dnode, "./virtual-router-id");
50 version = yang_dnode_get_enum(dnode, "./version");
51 vr = vrrp_vrouter_create(ifp, vrid, version);
52 nb_running_set_entry(dnode, vr);
53
54 return NB_OK;
55}
56
57static int lib_interface_vrrp_vrrp_group_destroy(enum nb_event event,
58 const struct lyd_node *dnode)
59{
60 struct vrrp_vrouter *vr;
61
62 if (event != NB_EV_APPLY)
63 return NB_OK;
64
65 vr = nb_running_unset_entry(dnode);
66 vrrp_vrouter_destroy(vr);
67
68 return NB_OK;
69}
70
71static const void *
72lib_interface_vrrp_vrrp_group_get_next(const void *parent_list_entry,
73 const void *list_entry)
74{
75 struct list *l = hash_to_list(vrrp_vrouters_hash);
76 struct listnode *ln;
6356b286 77 const struct vrrp_vrouter *curr;
f495425b
QY
78 const struct interface *ifp = parent_list_entry;
79
f495425b
QY
80 /*
81 * If list_entry is null, we return the first vrrp instance with a
82 * matching interface
83 */
84 bool nextone = list_entry ? false : true;
85
86 for (ALL_LIST_ELEMENTS_RO(l, ln, curr)) {
87 if (curr == list_entry) {
88 nextone = true;
89 continue;
90 }
91
92 if (nextone && curr->ifp == ifp)
93 goto done;
f495425b
QY
94 }
95
96 curr = NULL;
97
98done:
99 list_delete(&l);
100 return curr;
101}
102
103static int lib_interface_vrrp_vrrp_group_get_keys(const void *list_entry,
104 struct yang_list_keys *keys)
105{
106 const struct vrrp_vrouter *vr = list_entry;
107
108 keys->num = 1;
109 snprintf(keys->key[0], sizeof(keys->key[0]), "%" PRIu32, vr->vrid);
110
111 return NB_OK;
112}
113
114static const void *
115lib_interface_vrrp_vrrp_group_lookup_entry(const void *parent_list_entry,
116 const struct yang_list_keys *keys)
117{
118 uint32_t vrid = strtoul(keys->key[0], NULL, 10);
119 const struct interface *ifp = parent_list_entry;
120
534b98f9 121 return vrrp_lookup(ifp, vrid);
f495425b
QY
122}
123
124/*
125 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version
126 */
127static int
128lib_interface_vrrp_vrrp_group_version_modify(enum nb_event event,
129 const struct lyd_node *dnode,
130 union nb_resource *resource)
131{
132 if (event != NB_EV_APPLY)
133 return NB_OK;
134
135 struct vrrp_vrouter *vr;
136 uint8_t version;
137
138 vr = nb_running_get_entry(dnode, NULL, true);
139 vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN);
140 vrrp_event(vr->v6, VRRP_EVENT_SHUTDOWN);
141 version = yang_dnode_get_enum(dnode, NULL);
142 vr->version = version;
143
144 vrrp_check_start(vr);
145
146 return NB_OK;
147}
148
534b98f9
QY
149/*
150 * Helper function for address list OP_MODIFY callbacks.
151 */
f495425b
QY
152static void vrrp_yang_add_del_virtual_address(const struct lyd_node *dnode,
153 bool add)
154{
155 struct vrrp_vrouter *vr;
156 struct ipaddr ip;
157
158 vr = nb_running_get_entry(dnode, NULL, true);
159 yang_dnode_get_ip(&ip, dnode, NULL);
160 if (add)
161 vrrp_add_ip(vr, &ip);
162 else
163 vrrp_del_ip(vr, &ip);
164
165 vrrp_check_start(vr);
166}
167
f495425b
QY
168/*
169 * XPath:
170 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address
171 */
172static int lib_interface_vrrp_vrrp_group_v4_virtual_address_create(
173 enum nb_event event, const struct lyd_node *dnode,
174 union nb_resource *resource)
175{
176 if (event != NB_EV_APPLY)
177 return NB_OK;
178
179 vrrp_yang_add_del_virtual_address(dnode, true);
180
181 return NB_OK;
182}
183
184static int lib_interface_vrrp_vrrp_group_v4_virtual_address_destroy(
185 enum nb_event event, const struct lyd_node *dnode)
186{
187 if (event != NB_EV_APPLY)
188 return NB_OK;
189
190 vrrp_yang_add_del_virtual_address(dnode, false);
191
192 return NB_OK;
193}
194
195/*
196 * XPath:
197 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority
198 */
199static struct yang_data *
200lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem(
201 const char *xpath, const void *list_entry)
202{
203 const struct vrrp_vrouter *vr = list_entry;
204
205 return yang_data_new_uint8(xpath, vr->v4->priority);
206}
207
208/*
209 * XPath:
210 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface
211 */
212static struct yang_data *
213lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem(const char *xpath,
214 const void *list_entry)
215{
216 const struct vrrp_vrouter *vr = list_entry;
217
218 struct yang_data *val = NULL;
219
220 if (vr->v4->mvl_ifp)
221 val = yang_data_new_string(xpath, vr->v4->mvl_ifp->name);
222
223 return val;
224}
225
226/*
227 * XPath:
228 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address
229 */
230static struct yang_data *
231lib_interface_vrrp_vrrp_group_v4_source_address_get_elem(const char *xpath,
232 const void *list_entry)
233{
234 const struct vrrp_vrouter *vr = list_entry;
235 struct yang_data *val = NULL;
236 struct ipaddr ip;
237
238 memset(&ip, 0x00, sizeof(ip));
239
240 if (memcmp(&vr->v4->src.ipaddr_v4, &ip.ipaddr_v4, sizeof(ip.ipaddr_v4)))
241 val = yang_data_new_ip(xpath, &vr->v4->src);
242
243 return val;
244}
245
246/*
247 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state
248 */
249static struct yang_data *
250lib_interface_vrrp_vrrp_group_v4_state_get_elem(const char *xpath,
251 const void *list_entry)
252{
253 const struct vrrp_vrouter *vr = list_entry;
254
255 return yang_data_new_enum(xpath, vr->v4->fsm.state);
256}
257
258/*
259 * XPath:
260 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval
261 */
262static struct yang_data *
263lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem(
264 const char *xpath, const void *list_entry)
265{
266 const struct vrrp_vrouter *vr = list_entry;
267
268 return yang_data_new_uint16(xpath, vr->v4->master_adver_interval);
269}
270
271/*
272 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time
273 */
274static struct yang_data *
275lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem(const char *xpath,
276 const void *list_entry)
277{
278 const struct vrrp_vrouter *vr = list_entry;
279
280 return yang_data_new_uint16(xpath, vr->v4->skew_time);
281}
282
283/*
284 * XPath:
285 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition
286 */
287static struct yang_data *
288lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem(
289 const char *xpath, const void *list_entry)
290{
291 const struct vrrp_vrouter *vr = list_entry;
292
293 return yang_data_new_uint32(xpath, vr->v4->stats.trans_cnt);
294}
295
296/*
297 * XPath:
298 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement
299 */
300static struct yang_data *
301lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem(
302 const char *xpath, const void *list_entry)
303{
304 const struct vrrp_vrouter *vr = list_entry;
305
306 return yang_data_new_uint32(xpath, vr->v4->stats.adver_tx_cnt);
307}
308
309/*
310 * XPath:
311 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp
312 */
313static struct yang_data *
314lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem(
315 const char *xpath, const void *list_entry)
316{
317 const struct vrrp_vrouter *vr = list_entry;
318
319 return yang_data_new_uint32(xpath, vr->v4->stats.garp_tx_cnt);
320}
321
322/*
323 * XPath:
324 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement
325 */
326static struct yang_data *
327lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem(
328 const char *xpath, const void *list_entry)
329{
330 const struct vrrp_vrouter *vr = list_entry;
331
332 return yang_data_new_uint32(xpath, vr->v4->stats.adver_rx_cnt);
333}
334
335/*
336 * XPath:
337 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address
338 */
339static int lib_interface_vrrp_vrrp_group_v6_virtual_address_create(
340 enum nb_event event, const struct lyd_node *dnode,
341 union nb_resource *resource)
342{
343 if (event != NB_EV_APPLY)
344 return NB_OK;
345
346 vrrp_yang_add_del_virtual_address(dnode, true);
347
348 return NB_OK;
349}
350
351static int lib_interface_vrrp_vrrp_group_v6_virtual_address_destroy(
352 enum nb_event event, const struct lyd_node *dnode)
353{
354 if (event != NB_EV_APPLY)
355 return NB_OK;
356
357 vrrp_yang_add_del_virtual_address(dnode, false);
358
359 return NB_OK;
360}
361
362/*
363 * XPath:
364 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority
365 */
366static struct yang_data *
367lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem(
368 const char *xpath, const void *list_entry)
369{
370 const struct vrrp_vrouter *vr = list_entry;
371
372 return yang_data_new_uint8(xpath, vr->v6->priority);
373}
374
375/*
376 * XPath:
377 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface
378 */
379static struct yang_data *
380lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem(const char *xpath,
381 const void *list_entry)
382{
383 const struct vrrp_vrouter *vr = list_entry;
384 struct yang_data *val = NULL;
385
386 if (vr->v6->mvl_ifp)
387 val = yang_data_new_string(xpath, vr->v6->mvl_ifp->name);
388
389 return val;
390}
391
392/*
393 * XPath:
394 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address
395 */
396static struct yang_data *
397lib_interface_vrrp_vrrp_group_v6_source_address_get_elem(const char *xpath,
398 const void *list_entry)
399{
400 const struct vrrp_vrouter *vr = list_entry;
401 struct yang_data *val = NULL;
f495425b 402
534b98f9 403 if (ipaddr_isset(&vr->v6->src))
f495425b
QY
404 val = yang_data_new_ip(xpath, &vr->v6->src);
405
406 return val;
407}
408
409/*
410 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state
411 */
412static struct yang_data *
413lib_interface_vrrp_vrrp_group_v6_state_get_elem(const char *xpath,
414 const void *list_entry)
415{
416 const struct vrrp_vrouter *vr = list_entry;
417
418 return yang_data_new_enum(xpath, vr->v6->fsm.state);
419}
420
421/*
422 * XPath:
423 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval
424 */
425static struct yang_data *
426lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem(
427 const char *xpath, const void *list_entry)
428{
429 const struct vrrp_vrouter *vr = list_entry;
430
431 return yang_data_new_uint16(xpath, vr->v6->master_adver_interval);
432}
433
434/*
435 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time
436 */
437static struct yang_data *
438lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem(const char *xpath,
439 const void *list_entry)
440{
441 const struct vrrp_vrouter *vr = list_entry;
442
443 return yang_data_new_uint16(xpath, vr->v6->skew_time);
444}
445
446/*
447 * XPath:
448 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition
449 */
450static struct yang_data *
451lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem(
452 const char *xpath, const void *list_entry)
453{
454 const struct vrrp_vrouter *vr = list_entry;
455
456 return yang_data_new_uint32(xpath, vr->v6->stats.trans_cnt);
457}
458
459/*
460 * XPath:
461 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement
462 */
463static struct yang_data *
464lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem(
465 const char *xpath, const void *list_entry)
466{
467 const struct vrrp_vrouter *vr = list_entry;
468
469 return yang_data_new_uint32(xpath, vr->v6->stats.adver_tx_cnt);
470}
471
472/*
473 * XPath:
474 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement
475 */
476static struct yang_data *
477lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem(
478 const char *xpath, const void *list_entry)
479{
480 /* TODO: implement me. */
481 return NULL;
482}
483
484/*
485 * XPath:
486 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement
487 */
488static struct yang_data *
489lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem(
490 const char *xpath, const void *list_entry)
491{
492 /* TODO: implement me. */
493 return NULL;
494}
495
496/*
497 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority
498 */
499static int
500lib_interface_vrrp_vrrp_group_priority_modify(enum nb_event event,
501 const struct lyd_node *dnode,
502 union nb_resource *resource)
503{
504 if (event != NB_EV_APPLY)
505 return NB_OK;
506
507 struct vrrp_vrouter *vr;
508 uint8_t priority;
509
510 vr = nb_running_get_entry(dnode, NULL, true);
511 priority = yang_dnode_get_uint8(dnode, NULL);
512 vrrp_set_priority(vr, priority);
513
514 return NB_OK;
515}
516
517/*
518 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt
519 */
520static int
521lib_interface_vrrp_vrrp_group_preempt_modify(enum nb_event event,
522 const struct lyd_node *dnode,
523 union nb_resource *resource)
524{
525 if (event != NB_EV_APPLY)
526 return NB_OK;
527
528 struct vrrp_vrouter *vr;
529 bool preempt;
530
531 vr = nb_running_get_entry(dnode, NULL, true);
532 preempt = yang_dnode_get_bool(dnode, NULL);
533 vr->preempt_mode = preempt;
534
535 return NB_OK;
536}
537
538/*
539 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode
540 */
541static int
542lib_interface_vrrp_vrrp_group_accept_mode_modify(enum nb_event event,
543 const struct lyd_node *dnode,
544 union nb_resource *resource)
545{
546 if (event != NB_EV_APPLY)
547 return NB_OK;
548
549 struct vrrp_vrouter *vr;
550 bool accept;
551
552 vr = nb_running_get_entry(dnode, NULL, true);
553 accept = yang_dnode_get_bool(dnode, NULL);
554 vr->accept_mode = accept;
555
556 return NB_OK;
557}
558
559/*
560 * XPath:
561 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval
562 */
563static int lib_interface_vrrp_vrrp_group_advertisement_interval_modify(
564 enum nb_event event, const struct lyd_node *dnode,
565 union nb_resource *resource)
566{
567 if (event != NB_EV_APPLY)
568 return NB_OK;
569
570 struct vrrp_vrouter *vr;
571 uint16_t advert_int;
572
573 vr = nb_running_get_entry(dnode, NULL, true);
574 advert_int = yang_dnode_get_uint16(dnode, NULL);
575 vrrp_set_advertisement_interval(vr, advert_int);
576
577 return NB_OK;
578}
579
580/*
581 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown
582 */
583static int
584lib_interface_vrrp_vrrp_group_shutdown_modify(enum nb_event event,
585 const struct lyd_node *dnode,
586 union nb_resource *resource)
587{
588 if (event != NB_EV_APPLY)
589 return NB_OK;
590
591 struct vrrp_vrouter *vr;
592 bool shutdown;
593
594 vr = nb_running_get_entry(dnode, NULL, true);
595 shutdown = yang_dnode_get_bool(dnode, NULL);
596
597 vr->shutdown = shutdown;
598
599 if (shutdown) {
600 vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN);
601 vrrp_event(vr->v6, VRRP_EVENT_SHUTDOWN);
602 } else {
603 vrrp_check_start(vr);
604 }
605
606 return NB_OK;
607}
608
609/* clang-format off */
610const struct frr_yang_module_info frr_vrrpd_info = {
611 .name = "frr-vrrpd",
612 .nodes = {
613 {
614 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group",
615 .cbs = {
616 .create = lib_interface_vrrp_vrrp_group_create,
617 .destroy = lib_interface_vrrp_vrrp_group_destroy,
618 .get_next = lib_interface_vrrp_vrrp_group_get_next,
619 .get_keys = lib_interface_vrrp_vrrp_group_get_keys,
620 .lookup_entry = lib_interface_vrrp_vrrp_group_lookup_entry,
621 .cli_show = cli_show_vrrp,
622 }
623 },
624 {
625 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version",
626 .cbs = {
627 .modify = lib_interface_vrrp_vrrp_group_version_modify,
628 }
629 },
630 {
631 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority",
632 .cbs = {
633 .modify = lib_interface_vrrp_vrrp_group_priority_modify,
634 .cli_show = cli_show_priority,
635 }
636 },
637 {
638 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt",
639 .cbs = {
640 .modify = lib_interface_vrrp_vrrp_group_preempt_modify,
641 .cli_show = cli_show_preempt,
642 }
643 },
644 {
645 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode",
646 .cbs = {
647 .modify = lib_interface_vrrp_vrrp_group_accept_mode_modify,
648 }
649 },
650 {
651 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval",
652 .cbs = {
653 .modify = lib_interface_vrrp_vrrp_group_advertisement_interval_modify,
654 .cli_show = cli_show_advertisement_interval,
655 }
656 },
657 {
658 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown",
659 .cbs = {
660 .modify = lib_interface_vrrp_vrrp_group_shutdown_modify,
661 .cli_show = cli_show_shutdown,
662 }
663 },
664 {
665 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address",
666 .cbs = {
667 .create = lib_interface_vrrp_vrrp_group_v4_virtual_address_create,
668 .destroy = lib_interface_vrrp_vrrp_group_v4_virtual_address_destroy,
669 .cli_show = cli_show_ip,
670 }
671 },
672 {
673 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority",
674 .cbs = {
675 .get_elem = lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem,
676 }
677 },
678 {
679 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface",
680 .cbs = {
681 .get_elem = lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem,
682 }
683 },
684 {
685 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address",
686 .cbs = {
687 .get_elem = lib_interface_vrrp_vrrp_group_v4_source_address_get_elem,
688 }
689 },
690 {
691 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state",
692 .cbs = {
693 .get_elem = lib_interface_vrrp_vrrp_group_v4_state_get_elem,
694 }
695 },
696 {
697 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval",
698 .cbs = {
699 .get_elem = lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem,
700 }
701 },
702 {
703 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time",
704 .cbs = {
705 .get_elem = lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem,
706 }
707 },
708 {
709 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition",
710 .cbs = {
711 .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem,
712 }
713 },
714 {
715 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement",
716 .cbs = {
717 .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem,
718 }
719 },
720 {
721 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp",
722 .cbs = {
723 .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem,
724 }
725 },
726 {
727 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement",
728 .cbs = {
729 .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem,
730 }
731 },
732 {
733 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address",
734 .cbs = {
735 .create = lib_interface_vrrp_vrrp_group_v6_virtual_address_create,
736 .destroy = lib_interface_vrrp_vrrp_group_v6_virtual_address_destroy,
737 .cli_show = cli_show_ipv6,
738 }
739 },
740 {
741 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority",
742 .cbs = {
743 .get_elem = lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem,
744 }
745 },
746 {
747 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface",
748 .cbs = {
749 .get_elem = lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem,
750 }
751 },
752 {
753 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address",
754 .cbs = {
755 .get_elem = lib_interface_vrrp_vrrp_group_v6_source_address_get_elem,
756 }
757 },
758 {
759 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state",
760 .cbs = {
761 .get_elem = lib_interface_vrrp_vrrp_group_v6_state_get_elem,
762 }
763 },
764 {
765 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval",
766 .cbs = {
767 .get_elem = lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem,
768 }
769 },
770 {
771 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time",
772 .cbs = {
773 .get_elem = lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem,
774 }
775 },
776 {
777 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition",
778 .cbs = {
779 .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem,
780 }
781 },
782 {
783 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement",
784 .cbs = {
785 .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem,
786 }
787 },
788 {
789 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement",
790 .cbs = {
791 .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem,
792 }
793 },
794 {
795 .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement",
796 .cbs = {
797 .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem,
798 }
799 },
800 {
801 .xpath = NULL,
802 },
803 }
804};