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