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
*vr
, *prev
, *curr
;
78 const struct interface
*ifp
= parent_list_entry
;
84 * If list_entry is null, we return the first vrrp instance with a
87 bool nextone
= list_entry
? false : true;
89 for (ALL_LIST_ELEMENTS_RO(l
, ln
, curr
)) {
90 if (curr
== list_entry
) {
95 if (nextone
&& curr
->ifp
== ifp
)
108 static int lib_interface_vrrp_vrrp_group_get_keys(const void *list_entry
,
109 struct yang_list_keys
*keys
)
111 const struct vrrp_vrouter
*vr
= list_entry
;
114 snprintf(keys
->key
[0], sizeof(keys
->key
[0]), "%" PRIu32
, vr
->vrid
);
120 lib_interface_vrrp_vrrp_group_lookup_entry(const void *parent_list_entry
,
121 const struct yang_list_keys
*keys
)
123 uint32_t vrid
= strtoul(keys
->key
[0], NULL
, 10);
124 const struct interface
*ifp
= parent_list_entry
;
126 vrrp_lookup(ifp
, vrid
);
132 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version
135 lib_interface_vrrp_vrrp_group_version_modify(enum nb_event event
,
136 const struct lyd_node
*dnode
,
137 union nb_resource
*resource
)
139 if (event
!= NB_EV_APPLY
)
142 struct vrrp_vrouter
*vr
;
145 vr
= nb_running_get_entry(dnode
, NULL
, true);
146 vrrp_event(vr
->v4
, VRRP_EVENT_SHUTDOWN
);
147 vrrp_event(vr
->v6
, VRRP_EVENT_SHUTDOWN
);
148 version
= yang_dnode_get_enum(dnode
, NULL
);
149 vr
->version
= version
;
151 vrrp_check_start(vr
);
156 static void vrrp_yang_add_del_virtual_address(const struct lyd_node
*dnode
,
159 struct vrrp_vrouter
*vr
;
162 vr
= nb_running_get_entry(dnode
, NULL
, true);
163 yang_dnode_get_ip(&ip
, dnode
, NULL
);
165 vrrp_add_ip(vr
, &ip
);
167 vrrp_del_ip(vr
, &ip
);
169 vrrp_check_start(vr
);
177 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address
179 static int lib_interface_vrrp_vrrp_group_v4_virtual_address_create(
180 enum nb_event event
, const struct lyd_node
*dnode
,
181 union nb_resource
*resource
)
183 if (event
!= NB_EV_APPLY
)
186 vrrp_yang_add_del_virtual_address(dnode
, true);
191 static int lib_interface_vrrp_vrrp_group_v4_virtual_address_destroy(
192 enum nb_event event
, const struct lyd_node
*dnode
)
194 if (event
!= NB_EV_APPLY
)
197 vrrp_yang_add_del_virtual_address(dnode
, false);
204 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority
206 static struct yang_data
*
207 lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem(
208 const char *xpath
, const void *list_entry
)
210 const struct vrrp_vrouter
*vr
= list_entry
;
212 return yang_data_new_uint8(xpath
, vr
->v4
->priority
);
217 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface
219 static struct yang_data
*
220 lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem(const char *xpath
,
221 const void *list_entry
)
223 const struct vrrp_vrouter
*vr
= list_entry
;
225 struct yang_data
*val
= NULL
;
228 val
= yang_data_new_string(xpath
, vr
->v4
->mvl_ifp
->name
);
235 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address
237 static struct yang_data
*
238 lib_interface_vrrp_vrrp_group_v4_source_address_get_elem(const char *xpath
,
239 const void *list_entry
)
241 const struct vrrp_vrouter
*vr
= list_entry
;
242 struct yang_data
*val
= NULL
;
245 memset(&ip
, 0x00, sizeof(ip
));
247 if (memcmp(&vr
->v4
->src
.ipaddr_v4
, &ip
.ipaddr_v4
, sizeof(ip
.ipaddr_v4
)))
248 val
= yang_data_new_ip(xpath
, &vr
->v4
->src
);
254 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state
256 static struct yang_data
*
257 lib_interface_vrrp_vrrp_group_v4_state_get_elem(const char *xpath
,
258 const void *list_entry
)
260 const struct vrrp_vrouter
*vr
= list_entry
;
262 return yang_data_new_enum(xpath
, vr
->v4
->fsm
.state
);
267 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval
269 static struct yang_data
*
270 lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem(
271 const char *xpath
, const void *list_entry
)
273 const struct vrrp_vrouter
*vr
= list_entry
;
275 return yang_data_new_uint16(xpath
, vr
->v4
->master_adver_interval
);
279 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time
281 static struct yang_data
*
282 lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem(const char *xpath
,
283 const void *list_entry
)
285 const struct vrrp_vrouter
*vr
= list_entry
;
287 return yang_data_new_uint16(xpath
, vr
->v4
->skew_time
);
292 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition
294 static struct yang_data
*
295 lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem(
296 const char *xpath
, const void *list_entry
)
298 const struct vrrp_vrouter
*vr
= list_entry
;
300 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.trans_cnt
);
305 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement
307 static struct yang_data
*
308 lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem(
309 const char *xpath
, const void *list_entry
)
311 const struct vrrp_vrouter
*vr
= list_entry
;
313 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.adver_tx_cnt
);
318 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp
320 static struct yang_data
*
321 lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem(
322 const char *xpath
, const void *list_entry
)
324 const struct vrrp_vrouter
*vr
= list_entry
;
326 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.garp_tx_cnt
);
331 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement
333 static struct yang_data
*
334 lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem(
335 const char *xpath
, const void *list_entry
)
337 const struct vrrp_vrouter
*vr
= list_entry
;
339 return yang_data_new_uint32(xpath
, vr
->v4
->stats
.adver_rx_cnt
);
344 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address
346 static int lib_interface_vrrp_vrrp_group_v6_virtual_address_create(
347 enum nb_event event
, const struct lyd_node
*dnode
,
348 union nb_resource
*resource
)
350 if (event
!= NB_EV_APPLY
)
353 vrrp_yang_add_del_virtual_address(dnode
, true);
358 static int lib_interface_vrrp_vrrp_group_v6_virtual_address_destroy(
359 enum nb_event event
, const struct lyd_node
*dnode
)
361 if (event
!= NB_EV_APPLY
)
364 vrrp_yang_add_del_virtual_address(dnode
, false);
371 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority
373 static struct yang_data
*
374 lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem(
375 const char *xpath
, const void *list_entry
)
377 const struct vrrp_vrouter
*vr
= list_entry
;
379 return yang_data_new_uint8(xpath
, vr
->v6
->priority
);
384 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface
386 static struct yang_data
*
387 lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem(const char *xpath
,
388 const void *list_entry
)
390 const struct vrrp_vrouter
*vr
= list_entry
;
391 struct yang_data
*val
= NULL
;
394 val
= yang_data_new_string(xpath
, vr
->v6
->mvl_ifp
->name
);
401 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address
403 static struct yang_data
*
404 lib_interface_vrrp_vrrp_group_v6_source_address_get_elem(const char *xpath
,
405 const void *list_entry
)
407 const struct vrrp_vrouter
*vr
= list_entry
;
408 struct yang_data
*val
= NULL
;
411 memset(&ip
, 0x00, sizeof(ip
));
413 if (memcmp(&vr
->v6
->src
.ipaddr_v6
, &ip
.ipaddr_v6
, sizeof(ip
.ipaddr_v6
)))
414 val
= yang_data_new_ip(xpath
, &vr
->v6
->src
);
420 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state
422 static struct yang_data
*
423 lib_interface_vrrp_vrrp_group_v6_state_get_elem(const char *xpath
,
424 const void *list_entry
)
426 const struct vrrp_vrouter
*vr
= list_entry
;
428 return yang_data_new_enum(xpath
, vr
->v6
->fsm
.state
);
433 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval
435 static struct yang_data
*
436 lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem(
437 const char *xpath
, const void *list_entry
)
439 const struct vrrp_vrouter
*vr
= list_entry
;
441 return yang_data_new_uint16(xpath
, vr
->v6
->master_adver_interval
);
445 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time
447 static struct yang_data
*
448 lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem(const char *xpath
,
449 const void *list_entry
)
451 const struct vrrp_vrouter
*vr
= list_entry
;
453 return yang_data_new_uint16(xpath
, vr
->v6
->skew_time
);
458 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition
460 static struct yang_data
*
461 lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem(
462 const char *xpath
, const void *list_entry
)
464 const struct vrrp_vrouter
*vr
= list_entry
;
466 return yang_data_new_uint32(xpath
, vr
->v6
->stats
.trans_cnt
);
471 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement
473 static struct yang_data
*
474 lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem(
475 const char *xpath
, const void *list_entry
)
477 const struct vrrp_vrouter
*vr
= list_entry
;
479 return yang_data_new_uint32(xpath
, vr
->v6
->stats
.adver_tx_cnt
);
484 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement
486 static struct yang_data
*
487 lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem(
488 const char *xpath
, const void *list_entry
)
490 /* TODO: implement me. */
496 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement
498 static struct yang_data
*
499 lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem(
500 const char *xpath
, const void *list_entry
)
502 /* TODO: implement me. */
507 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority
510 lib_interface_vrrp_vrrp_group_priority_modify(enum nb_event event
,
511 const struct lyd_node
*dnode
,
512 union nb_resource
*resource
)
514 if (event
!= NB_EV_APPLY
)
517 struct vrrp_vrouter
*vr
;
520 vr
= nb_running_get_entry(dnode
, NULL
, true);
521 priority
= yang_dnode_get_uint8(dnode
, NULL
);
522 vrrp_set_priority(vr
, priority
);
528 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt
531 lib_interface_vrrp_vrrp_group_preempt_modify(enum nb_event event
,
532 const struct lyd_node
*dnode
,
533 union nb_resource
*resource
)
535 if (event
!= NB_EV_APPLY
)
538 struct vrrp_vrouter
*vr
;
541 vr
= nb_running_get_entry(dnode
, NULL
, true);
542 preempt
= yang_dnode_get_bool(dnode
, NULL
);
543 vr
->preempt_mode
= preempt
;
549 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode
552 lib_interface_vrrp_vrrp_group_accept_mode_modify(enum nb_event event
,
553 const struct lyd_node
*dnode
,
554 union nb_resource
*resource
)
556 if (event
!= NB_EV_APPLY
)
559 struct vrrp_vrouter
*vr
;
562 vr
= nb_running_get_entry(dnode
, NULL
, true);
563 accept
= yang_dnode_get_bool(dnode
, NULL
);
564 vr
->accept_mode
= accept
;
571 * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval
573 static int lib_interface_vrrp_vrrp_group_advertisement_interval_modify(
574 enum nb_event event
, const struct lyd_node
*dnode
,
575 union nb_resource
*resource
)
577 if (event
!= NB_EV_APPLY
)
580 struct vrrp_vrouter
*vr
;
583 vr
= nb_running_get_entry(dnode
, NULL
, true);
584 advert_int
= yang_dnode_get_uint16(dnode
, NULL
);
585 vrrp_set_advertisement_interval(vr
, advert_int
);
591 * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown
594 lib_interface_vrrp_vrrp_group_shutdown_modify(enum nb_event event
,
595 const struct lyd_node
*dnode
,
596 union nb_resource
*resource
)
598 if (event
!= NB_EV_APPLY
)
601 struct vrrp_vrouter
*vr
;
604 vr
= nb_running_get_entry(dnode
, NULL
, true);
605 shutdown
= yang_dnode_get_bool(dnode
, NULL
);
607 vr
->shutdown
= shutdown
;
610 vrrp_event(vr
->v4
, VRRP_EVENT_SHUTDOWN
);
611 vrrp_event(vr
->v6
, VRRP_EVENT_SHUTDOWN
);
613 vrrp_check_start(vr
);
619 /* clang-format off */
620 const struct frr_yang_module_info frr_vrrpd_info
= {
624 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group",
626 .create
= lib_interface_vrrp_vrrp_group_create
,
627 .destroy
= lib_interface_vrrp_vrrp_group_destroy
,
628 .get_next
= lib_interface_vrrp_vrrp_group_get_next
,
629 .get_keys
= lib_interface_vrrp_vrrp_group_get_keys
,
630 .lookup_entry
= lib_interface_vrrp_vrrp_group_lookup_entry
,
631 .cli_show
= cli_show_vrrp
,
635 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version",
637 .modify
= lib_interface_vrrp_vrrp_group_version_modify
,
641 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority",
643 .modify
= lib_interface_vrrp_vrrp_group_priority_modify
,
644 .cli_show
= cli_show_priority
,
648 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt",
650 .modify
= lib_interface_vrrp_vrrp_group_preempt_modify
,
651 .cli_show
= cli_show_preempt
,
655 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode",
657 .modify
= lib_interface_vrrp_vrrp_group_accept_mode_modify
,
661 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval",
663 .modify
= lib_interface_vrrp_vrrp_group_advertisement_interval_modify
,
664 .cli_show
= cli_show_advertisement_interval
,
668 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown",
670 .modify
= lib_interface_vrrp_vrrp_group_shutdown_modify
,
671 .cli_show
= cli_show_shutdown
,
675 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address",
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
,
683 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority",
685 .get_elem
= lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem
,
689 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface",
691 .get_elem
= lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem
,
695 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address",
697 .get_elem
= lib_interface_vrrp_vrrp_group_v4_source_address_get_elem
,
701 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state",
703 .get_elem
= lib_interface_vrrp_vrrp_group_v4_state_get_elem
,
707 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval",
709 .get_elem
= lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem
,
713 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time",
715 .get_elem
= lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem
,
719 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition",
721 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem
,
725 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement",
727 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem
,
731 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp",
733 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem
,
737 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement",
739 .get_elem
= lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem
,
743 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address",
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
,
751 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority",
753 .get_elem
= lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem
,
757 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface",
759 .get_elem
= lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem
,
763 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address",
765 .get_elem
= lib_interface_vrrp_vrrp_group_v6_source_address_get_elem
,
769 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state",
771 .get_elem
= lib_interface_vrrp_vrrp_group_v6_state_get_elem
,
775 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval",
777 .get_elem
= lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem
,
781 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time",
783 .get_elem
= lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem
,
787 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition",
789 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem
,
793 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement",
795 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem
,
799 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement",
801 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem
,
805 .xpath
= "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement",
807 .get_elem
= lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem
,