2 * VRRP northbound bindings.
3 * Copyright (C) 2019 Cumulus Networks, Inc.
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)
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
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
28 #include "northbound.h"
34 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group
36 static int lib_interface_vrrp_vrrp_group_create(enum nb_event event
,
37 const struct lyd_node
*dnode
,
38 union nb_resource
*resource
)
40 struct interface
*ifp
;
43 struct vrrp_vrouter
*vr
;
45 if (event
!= NB_EV_APPLY
)
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
);
57 static int lib_interface_vrrp_vrrp_group_destroy(enum nb_event event
,
58 const struct lyd_node
*dnode
)
60 struct vrrp_vrouter
*vr
;
62 if (event
!= NB_EV_APPLY
)
65 vr
= nb_running_unset_entry(dnode
);
66 vrrp_vrouter_destroy(vr
);
72 lib_interface_vrrp_vrrp_group_get_next(const void *parent_list_entry
,
73 const void *list_entry
)
75 struct list
*l
= hash_to_list(vrrp_vrouters_hash
);
77 const struct vrrp_vrouter
*curr
;
78 const struct interface
*ifp
= parent_list_entry
;
81 * If list_entry is null, we return the first vrrp instance with a
84 bool nextone
= list_entry
? false : true;
86 for (ALL_LIST_ELEMENTS_RO(l
, ln
, curr
)) {
87 if (curr
== list_entry
) {
92 if (nextone
&& curr
->ifp
== ifp
)
103 static int lib_interface_vrrp_vrrp_group_get_keys(const void *list_entry
,
104 struct yang_list_keys
*keys
)
106 const struct vrrp_vrouter
*vr
= list_entry
;
109 snprintf(keys
->key
[0], sizeof(keys
->key
[0]), "%" PRIu32
, vr
->vrid
);
115 lib_interface_vrrp_vrrp_group_lookup_entry(const void *parent_list_entry
,
116 const struct yang_list_keys
*keys
)
118 uint32_t vrid
= strtoul(keys
->key
[0], NULL
, 10);
119 const struct interface
*ifp
= parent_list_entry
;
121 return vrrp_lookup(ifp
, vrid
);
125 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version
128 lib_interface_vrrp_vrrp_group_version_modify(enum nb_event event
,
129 const struct lyd_node
*dnode
,
130 union nb_resource
*resource
)
132 if (event
!= NB_EV_APPLY
)
135 struct vrrp_vrouter
*vr
;
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
;
144 vrrp_check_start(vr
);
150 * Helper function for address list OP_MODIFY callbacks.
152 static void vrrp_yang_add_del_virtual_address(const struct lyd_node
*dnode
,
155 struct vrrp_vrouter
*vr
;
158 vr
= nb_running_get_entry(dnode
, NULL
, true);
159 yang_dnode_get_ip(&ip
, dnode
, NULL
);
161 vrrp_add_ip(vr
, &ip
);
163 vrrp_del_ip(vr
, &ip
);
165 vrrp_check_start(vr
);
170 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address
172 static 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
)
176 if (event
!= NB_EV_APPLY
)
179 vrrp_yang_add_del_virtual_address(dnode
, true);
184 static int lib_interface_vrrp_vrrp_group_v4_virtual_address_destroy(
185 enum nb_event event
, const struct lyd_node
*dnode
)
187 if (event
!= NB_EV_APPLY
)
190 vrrp_yang_add_del_virtual_address(dnode
, false);
197 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority
199 static struct yang_data
*
200 lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem(
201 const char *xpath
, const void *list_entry
)
203 const struct vrrp_vrouter
*vr
= list_entry
;
205 return yang_data_new_uint8(xpath
, vr
->v4
->priority
);
210 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface
212 static struct yang_data
*
213 lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem(const char *xpath
,
214 const void *list_entry
)
216 const struct vrrp_vrouter
*vr
= list_entry
;
218 struct yang_data
*val
= NULL
;
221 val
= yang_data_new_string(xpath
, vr
->v4
->mvl_ifp
->name
);
228 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address
230 static struct yang_data
*
231 lib_interface_vrrp_vrrp_group_v4_source_address_get_elem(const char *xpath
,
232 const void *list_entry
)
234 const struct vrrp_vrouter
*vr
= list_entry
;
235 struct yang_data
*val
= NULL
;
238 memset(&ip
, 0x00, sizeof(ip
));
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
);
247 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state
249 static struct yang_data
*
250 lib_interface_vrrp_vrrp_group_v4_state_get_elem(const char *xpath
,
251 const void *list_entry
)
253 const struct vrrp_vrouter
*vr
= list_entry
;
255 return yang_data_new_enum(xpath
, vr
->v4
->fsm
.state
);
260 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval
262 static struct yang_data
*
263 lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem(
264 const char *xpath
, const void *list_entry
)
266 const struct vrrp_vrouter
*vr
= list_entry
;
268 return yang_data_new_uint16(xpath
, vr
->v4
->master_adver_interval
);
272 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time
274 static struct yang_data
*
275 lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem(const char *xpath
,
276 const void *list_entry
)
278 const struct vrrp_vrouter
*vr
= list_entry
;
280 return yang_data_new_uint16(xpath
, vr
->v4
->skew_time
);
285 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition
287 static struct yang_data
*
288 lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem(
289 const char *xpath
, const void *list_entry
)
291 const struct vrrp_vrouter
*vr
= list_entry
;
293 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.trans_cnt
);
298 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement
300 static struct yang_data
*
301 lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem(
302 const char *xpath
, const void *list_entry
)
304 const struct vrrp_vrouter
*vr
= list_entry
;
306 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.adver_tx_cnt
);
311 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp
313 static struct yang_data
*
314 lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem(
315 const char *xpath
, const void *list_entry
)
317 const struct vrrp_vrouter
*vr
= list_entry
;
319 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.garp_tx_cnt
);
324 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement
326 static struct yang_data
*
327 lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem(
328 const char *xpath
, const void *list_entry
)
330 const struct vrrp_vrouter
*vr
= list_entry
;
332 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.adver_rx_cnt
);
337 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address
339 static 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
)
343 if (event
!= NB_EV_APPLY
)
346 vrrp_yang_add_del_virtual_address(dnode
, true);
351 static int lib_interface_vrrp_vrrp_group_v6_virtual_address_destroy(
352 enum nb_event event
, const struct lyd_node
*dnode
)
354 if (event
!= NB_EV_APPLY
)
357 vrrp_yang_add_del_virtual_address(dnode
, false);
364 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority
366 static struct yang_data
*
367 lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem(
368 const char *xpath
, const void *list_entry
)
370 const struct vrrp_vrouter
*vr
= list_entry
;
372 return yang_data_new_uint8(xpath
, vr
->v6
->priority
);
377 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface
379 static struct yang_data
*
380 lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem(const char *xpath
,
381 const void *list_entry
)
383 const struct vrrp_vrouter
*vr
= list_entry
;
384 struct yang_data
*val
= NULL
;
387 val
= yang_data_new_string(xpath
, vr
->v6
->mvl_ifp
->name
);
394 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address
396 static struct yang_data
*
397 lib_interface_vrrp_vrrp_group_v6_source_address_get_elem(const char *xpath
,
398 const void *list_entry
)
400 const struct vrrp_vrouter
*vr
= list_entry
;
401 struct yang_data
*val
= NULL
;
403 if (ipaddr_isset(&vr
->v6
->src
))
404 val
= yang_data_new_ip(xpath
, &vr
->v6
->src
);
410 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state
412 static struct yang_data
*
413 lib_interface_vrrp_vrrp_group_v6_state_get_elem(const char *xpath
,
414 const void *list_entry
)
416 const struct vrrp_vrouter
*vr
= list_entry
;
418 return yang_data_new_enum(xpath
, vr
->v6
->fsm
.state
);
423 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval
425 static struct yang_data
*
426 lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem(
427 const char *xpath
, const void *list_entry
)
429 const struct vrrp_vrouter
*vr
= list_entry
;
431 return yang_data_new_uint16(xpath
, vr
->v6
->master_adver_interval
);
435 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time
437 static struct yang_data
*
438 lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem(const char *xpath
,
439 const void *list_entry
)
441 const struct vrrp_vrouter
*vr
= list_entry
;
443 return yang_data_new_uint16(xpath
, vr
->v6
->skew_time
);
448 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition
450 static struct yang_data
*
451 lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem(
452 const char *xpath
, const void *list_entry
)
454 const struct vrrp_vrouter
*vr
= list_entry
;
456 return yang_data_new_uint32(xpath
, vr
->v6
->stats
.trans_cnt
);
461 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement
463 static struct yang_data
*
464 lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem(
465 const char *xpath
, const void *list_entry
)
467 const struct vrrp_vrouter
*vr
= list_entry
;
469 return yang_data_new_uint32(xpath
, vr
->v6
->stats
.adver_tx_cnt
);
474 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement
476 static struct yang_data
*
477 lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem(
478 const char *xpath
, const void *list_entry
)
480 /* TODO: implement me. */
486 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement
488 static struct yang_data
*
489 lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem(
490 const char *xpath
, const void *list_entry
)
492 /* TODO: implement me. */
497 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority
500 lib_interface_vrrp_vrrp_group_priority_modify(enum nb_event event
,
501 const struct lyd_node
*dnode
,
502 union nb_resource
*resource
)
504 if (event
!= NB_EV_APPLY
)
507 struct vrrp_vrouter
*vr
;
510 vr
= nb_running_get_entry(dnode
, NULL
, true);
511 priority
= yang_dnode_get_uint8(dnode
, NULL
);
512 vrrp_set_priority(vr
, priority
);
518 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt
521 lib_interface_vrrp_vrrp_group_preempt_modify(enum nb_event event
,
522 const struct lyd_node
*dnode
,
523 union nb_resource
*resource
)
525 if (event
!= NB_EV_APPLY
)
528 struct vrrp_vrouter
*vr
;
531 vr
= nb_running_get_entry(dnode
, NULL
, true);
532 preempt
= yang_dnode_get_bool(dnode
, NULL
);
533 vr
->preempt_mode
= preempt
;
539 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode
542 lib_interface_vrrp_vrrp_group_accept_mode_modify(enum nb_event event
,
543 const struct lyd_node
*dnode
,
544 union nb_resource
*resource
)
546 if (event
!= NB_EV_APPLY
)
549 struct vrrp_vrouter
*vr
;
552 vr
= nb_running_get_entry(dnode
, NULL
, true);
553 accept
= yang_dnode_get_bool(dnode
, NULL
);
554 vr
->accept_mode
= accept
;
561 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval
563 static int lib_interface_vrrp_vrrp_group_advertisement_interval_modify(
564 enum nb_event event
, const struct lyd_node
*dnode
,
565 union nb_resource
*resource
)
567 if (event
!= NB_EV_APPLY
)
570 struct vrrp_vrouter
*vr
;
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
);
581 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown
584 lib_interface_vrrp_vrrp_group_shutdown_modify(enum nb_event event
,
585 const struct lyd_node
*dnode
,
586 union nb_resource
*resource
)
588 if (event
!= NB_EV_APPLY
)
591 struct vrrp_vrouter
*vr
;
594 vr
= nb_running_get_entry(dnode
, NULL
, true);
595 shutdown
= yang_dnode_get_bool(dnode
, NULL
);
597 vr
->shutdown
= shutdown
;
600 vrrp_event(vr
->v4
, VRRP_EVENT_SHUTDOWN
);
601 vrrp_event(vr
->v6
, VRRP_EVENT_SHUTDOWN
);
603 vrrp_check_start(vr
);
609 /* clang-format off */
610 const struct frr_yang_module_info frr_vrrpd_info
= {
614 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group",
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
,
625 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version",
627 .modify
= lib_interface_vrrp_vrrp_group_version_modify
,
631 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority",
633 .modify
= lib_interface_vrrp_vrrp_group_priority_modify
,
634 .cli_show
= cli_show_priority
,
638 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt",
640 .modify
= lib_interface_vrrp_vrrp_group_preempt_modify
,
641 .cli_show
= cli_show_preempt
,
645 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode",
647 .modify
= lib_interface_vrrp_vrrp_group_accept_mode_modify
,
651 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval",
653 .modify
= lib_interface_vrrp_vrrp_group_advertisement_interval_modify
,
654 .cli_show
= cli_show_advertisement_interval
,
658 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown",
660 .modify
= lib_interface_vrrp_vrrp_group_shutdown_modify
,
661 .cli_show
= cli_show_shutdown
,
665 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address",
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
,
673 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority",
675 .get_elem
= lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem
,
679 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface",
681 .get_elem
= lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem
,
685 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address",
687 .get_elem
= lib_interface_vrrp_vrrp_group_v4_source_address_get_elem
,
691 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state",
693 .get_elem
= lib_interface_vrrp_vrrp_group_v4_state_get_elem
,
697 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval",
699 .get_elem
= lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem
,
703 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time",
705 .get_elem
= lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem
,
709 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition",
711 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem
,
715 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement",
717 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem
,
721 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp",
723 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem
,
727 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement",
729 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem
,
733 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address",
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
,
741 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority",
743 .get_elem
= lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem
,
747 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface",
749 .get_elem
= lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem
,
753 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address",
755 .get_elem
= lib_interface_vrrp_vrrp_group_v6_source_address_get_elem
,
759 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state",
761 .get_elem
= lib_interface_vrrp_vrrp_group_v6_state_get_elem
,
765 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval",
767 .get_elem
= lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem
,
771 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time",
773 .get_elem
= lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem
,
777 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition",
779 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem
,
783 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement",
785 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem
,
789 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement",
791 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem
,
795 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement",
797 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem
,