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