2 * Copyright (C) 1998 Kunihiro Ishiguro
3 * Copyright (C) 2018 NetDEF, 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
30 #include "agg_table.h"
31 #include "northbound.h"
34 #include "ripngd/ripngd.h"
35 #include "ripngd/ripng_route.h"
36 #include "ripngd/ripng_cli.h"
39 * XPath: /frr-ripngd:ripngd/instance
41 static int ripngd_instance_create(enum nb_event event
,
42 const struct lyd_node
*dnode
,
43 union nb_resource
*resource
)
51 socket
= ripng_make_socket();
53 return NB_ERR_RESOURCE
;
54 resource
->fd
= socket
;
57 socket
= resource
->fd
;
61 socket
= resource
->fd
;
69 static int ripngd_instance_delete(enum nb_event event
,
70 const struct lyd_node
*dnode
)
72 if (event
!= NB_EV_APPLY
)
81 * XPath: /frr-ripngd:ripngd/instance/allow-ecmp
83 static int ripngd_instance_allow_ecmp_modify(enum nb_event event
,
84 const struct lyd_node
*dnode
,
85 union nb_resource
*resource
)
87 if (event
!= NB_EV_APPLY
)
90 ripng
->ecmp
= yang_dnode_get_bool(dnode
, NULL
);
98 * XPath: /frr-ripngd:ripngd/instance/default-information-originate
100 static int ripngd_instance_default_information_originate_modify(
101 enum nb_event event
, const struct lyd_node
*dnode
,
102 union nb_resource
*resource
)
104 bool default_information
;
105 struct prefix_ipv6 p
;
107 if (event
!= NB_EV_APPLY
)
110 default_information
= yang_dnode_get_bool(dnode
, NULL
);
111 str2prefix_ipv6("::/0", &p
);
112 if (default_information
) {
113 ripng_redistribute_add(ZEBRA_ROUTE_RIPNG
, RIPNG_ROUTE_DEFAULT
,
116 ripng_redistribute_delete(ZEBRA_ROUTE_RIPNG
,
117 RIPNG_ROUTE_DEFAULT
, &p
, 0);
124 * XPath: /frr-ripngd:ripngd/instance/default-metric
126 static int ripngd_instance_default_metric_modify(enum nb_event event
,
127 const struct lyd_node
*dnode
,
128 union nb_resource
*resource
)
130 if (event
!= NB_EV_APPLY
)
133 ripng
->default_metric
= yang_dnode_get_uint8(dnode
, NULL
);
139 * XPath: /frr-ripngd:ripngd/instance/network
141 static int ripngd_instance_network_create(enum nb_event event
,
142 const struct lyd_node
*dnode
,
143 union nb_resource
*resource
)
147 if (event
!= NB_EV_APPLY
)
150 yang_dnode_get_ipv6p(&p
, dnode
, NULL
);
151 apply_mask_ipv6((struct prefix_ipv6
*)&p
);
153 return ripng_enable_network_add(&p
);
156 static int ripngd_instance_network_delete(enum nb_event event
,
157 const struct lyd_node
*dnode
)
161 if (event
!= NB_EV_APPLY
)
164 yang_dnode_get_ipv6p(&p
, dnode
, NULL
);
165 apply_mask_ipv6((struct prefix_ipv6
*)&p
);
167 return ripng_enable_network_delete(&p
);
171 * XPath: /frr-ripngd:ripngd/instance/interface
173 static int ripngd_instance_interface_create(enum nb_event event
,
174 const struct lyd_node
*dnode
,
175 union nb_resource
*resource
)
179 if (event
!= NB_EV_APPLY
)
182 ifname
= yang_dnode_get_string(dnode
, NULL
);
184 return ripng_enable_if_add(ifname
);
187 static int ripngd_instance_interface_delete(enum nb_event event
,
188 const struct lyd_node
*dnode
)
192 if (event
!= NB_EV_APPLY
)
195 ifname
= yang_dnode_get_string(dnode
, NULL
);
197 return ripng_enable_if_delete(ifname
);
201 * XPath: /frr-ripngd:ripngd/instance/offset-list
203 static int ripngd_instance_offset_list_create(enum nb_event event
,
204 const struct lyd_node
*dnode
,
205 union nb_resource
*resource
)
208 struct ripng_offset_list
*offset
;
210 if (event
!= NB_EV_APPLY
)
213 ifname
= yang_dnode_get_string(dnode
, "./interface");
215 offset
= ripng_offset_list_new(ifname
);
216 yang_dnode_set_entry(dnode
, offset
);
221 static int ripngd_instance_offset_list_delete(enum nb_event event
,
222 const struct lyd_node
*dnode
)
225 struct ripng_offset_list
*offset
;
227 if (event
!= NB_EV_APPLY
)
230 direct
= yang_dnode_get_enum(dnode
, "./direction");
232 offset
= yang_dnode_get_entry(dnode
, true);
233 if (offset
->direct
[direct
].alist_name
) {
234 free(offset
->direct
[direct
].alist_name
);
235 offset
->direct
[direct
].alist_name
= NULL
;
237 if (offset
->direct
[RIPNG_OFFSET_LIST_IN
].alist_name
== NULL
238 && offset
->direct
[RIPNG_OFFSET_LIST_OUT
].alist_name
== NULL
)
239 ripng_offset_list_del(offset
);
245 * XPath: /frr-ripngd:ripngd/instance/offset-list/access-list
248 ripngd_instance_offset_list_access_list_modify(enum nb_event event
,
249 const struct lyd_node
*dnode
,
250 union nb_resource
*resource
)
253 struct ripng_offset_list
*offset
;
254 const char *alist_name
;
256 if (event
!= NB_EV_APPLY
)
259 direct
= yang_dnode_get_enum(dnode
, "../direction");
260 alist_name
= yang_dnode_get_string(dnode
, NULL
);
262 offset
= yang_dnode_get_entry(dnode
, true);
263 if (offset
->direct
[direct
].alist_name
)
264 free(offset
->direct
[direct
].alist_name
);
265 offset
->direct
[direct
].alist_name
= strdup(alist_name
);
271 * XPath: /frr-ripngd:ripngd/instance/offset-list/metric
274 ripngd_instance_offset_list_metric_modify(enum nb_event event
,
275 const struct lyd_node
*dnode
,
276 union nb_resource
*resource
)
280 struct ripng_offset_list
*offset
;
282 if (event
!= NB_EV_APPLY
)
285 direct
= yang_dnode_get_enum(dnode
, "../direction");
286 metric
= yang_dnode_get_uint8(dnode
, NULL
);
288 offset
= yang_dnode_get_entry(dnode
, true);
289 offset
->direct
[direct
].metric
= metric
;
295 * XPath: /frr-ripngd:ripngd/instance/passive-interface
298 ripngd_instance_passive_interface_create(enum nb_event event
,
299 const struct lyd_node
*dnode
,
300 union nb_resource
*resource
)
304 if (event
!= NB_EV_APPLY
)
307 ifname
= yang_dnode_get_string(dnode
, NULL
);
309 return ripng_passive_interface_set(ifname
);
313 ripngd_instance_passive_interface_delete(enum nb_event event
,
314 const struct lyd_node
*dnode
)
318 if (event
!= NB_EV_APPLY
)
321 ifname
= yang_dnode_get_string(dnode
, NULL
);
323 return ripng_passive_interface_unset(ifname
);
327 * XPath: /frr-ripngd:ripngd/instance/redistribute
329 static int ripngd_instance_redistribute_create(enum nb_event event
,
330 const struct lyd_node
*dnode
,
331 union nb_resource
*resource
)
336 static int ripngd_instance_redistribute_delete(enum nb_event event
,
337 const struct lyd_node
*dnode
)
341 if (event
!= NB_EV_APPLY
)
344 type
= yang_dnode_get_enum(dnode
, "./protocol");
346 ripng_redistribute_conf_delete(type
);
352 ripngd_instance_redistribute_apply_finish(const struct lyd_node
*dnode
)
356 type
= yang_dnode_get_enum(dnode
, "./protocol");
357 ripng_redistribute_conf_update(type
);
361 * XPath: /frr-ripngd:ripngd/instance/redistribute/route-map
364 ripngd_instance_redistribute_route_map_modify(enum nb_event event
,
365 const struct lyd_node
*dnode
,
366 union nb_resource
*resource
)
369 const char *rmap_name
;
371 if (event
!= NB_EV_APPLY
)
374 type
= yang_dnode_get_enum(dnode
, "../protocol");
375 rmap_name
= yang_dnode_get_string(dnode
, NULL
);
377 if (ripng
->route_map
[type
].name
)
378 free(ripng
->route_map
[type
].name
);
379 ripng
->route_map
[type
].name
= strdup(rmap_name
);
380 ripng
->route_map
[type
].map
= route_map_lookup_by_name(rmap_name
);
386 ripngd_instance_redistribute_route_map_delete(enum nb_event event
,
387 const struct lyd_node
*dnode
)
391 if (event
!= NB_EV_APPLY
)
394 type
= yang_dnode_get_enum(dnode
, "../protocol");
396 free(ripng
->route_map
[type
].name
);
397 ripng
->route_map
[type
].name
= NULL
;
398 ripng
->route_map
[type
].map
= NULL
;
404 * XPath: /frr-ripngd:ripngd/instance/redistribute/metric
407 ripngd_instance_redistribute_metric_modify(enum nb_event event
,
408 const struct lyd_node
*dnode
,
409 union nb_resource
*resource
)
414 if (event
!= NB_EV_APPLY
)
417 type
= yang_dnode_get_enum(dnode
, "../protocol");
418 metric
= yang_dnode_get_uint8(dnode
, NULL
);
420 ripng
->route_map
[type
].metric_config
= true;
421 ripng
->route_map
[type
].metric
= metric
;
427 ripngd_instance_redistribute_metric_delete(enum nb_event event
,
428 const struct lyd_node
*dnode
)
432 if (event
!= NB_EV_APPLY
)
435 type
= yang_dnode_get_enum(dnode
, "../protocol");
437 ripng
->route_map
[type
].metric_config
= false;
438 ripng
->route_map
[type
].metric
= 0;
444 * XPath: /frr-ripngd:ripngd/instance/static-route
446 static int ripngd_instance_static_route_create(enum nb_event event
,
447 const struct lyd_node
*dnode
,
448 union nb_resource
*resource
)
450 struct prefix_ipv6 p
;
452 if (event
!= NB_EV_APPLY
)
455 yang_dnode_get_ipv6p(&p
, dnode
, NULL
);
458 ripng_redistribute_add(ZEBRA_ROUTE_RIPNG
, RIPNG_ROUTE_STATIC
, &p
, 0,
464 static int ripngd_instance_static_route_delete(enum nb_event event
,
465 const struct lyd_node
*dnode
)
467 struct prefix_ipv6 p
;
469 if (event
!= NB_EV_APPLY
)
472 yang_dnode_get_ipv6p(&p
, dnode
, NULL
);
475 ripng_redistribute_delete(ZEBRA_ROUTE_RIPNG
, RIPNG_ROUTE_STATIC
, &p
, 0);
481 * XPath: /frr-ripngd:ripngd/instance/aggregate-address
484 ripngd_instance_aggregate_address_create(enum nb_event event
,
485 const struct lyd_node
*dnode
,
486 union nb_resource
*resource
)
488 struct prefix_ipv6 p
;
490 if (event
!= NB_EV_APPLY
)
493 yang_dnode_get_ipv6p(&p
, dnode
, NULL
);
496 ripng_aggregate_add((struct prefix
*)&p
);
502 ripngd_instance_aggregate_address_delete(enum nb_event event
,
503 const struct lyd_node
*dnode
)
505 struct prefix_ipv6 p
;
507 if (event
!= NB_EV_APPLY
)
510 yang_dnode_get_ipv6p(&p
, dnode
, NULL
);
513 ripng_aggregate_delete((struct prefix
*)&p
);
519 * XPath: /frr-ripngd:ripngd/instance/timers
521 static void ripngd_instance_timers_apply_finish(const struct lyd_node
*dnode
)
523 /* Reset update timer thread. */
524 ripng_event(RIPNG_UPDATE_EVENT
, 0);
528 * XPath: /frr-ripngd:ripngd/instance/timers/flush-interval
531 ripngd_instance_timers_flush_interval_modify(enum nb_event event
,
532 const struct lyd_node
*dnode
,
533 union nb_resource
*resource
)
535 if (event
!= NB_EV_APPLY
)
538 ripng
->garbage_time
= yang_dnode_get_uint16(dnode
, NULL
);
544 * XPath: /frr-ripngd:ripngd/instance/timers/holddown-interval
547 ripngd_instance_timers_holddown_interval_modify(enum nb_event event
,
548 const struct lyd_node
*dnode
,
549 union nb_resource
*resource
)
551 if (event
!= NB_EV_APPLY
)
554 ripng
->timeout_time
= yang_dnode_get_uint16(dnode
, NULL
);
560 * XPath: /frr-ripngd:ripngd/instance/timers/update-interval
563 ripngd_instance_timers_update_interval_modify(enum nb_event event
,
564 const struct lyd_node
*dnode
,
565 union nb_resource
*resource
)
567 if (event
!= NB_EV_APPLY
)
570 ripng
->update_time
= yang_dnode_get_uint16(dnode
, NULL
);
576 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor
579 ripngd_state_neighbors_neighbor_get_next(const void *parent_list_entry
,
580 const void *list_entry
)
582 /* TODO: implement me. */
586 static int ripngd_state_neighbors_neighbor_get_keys(const void *list_entry
,
587 struct yang_list_keys
*keys
)
589 /* TODO: implement me. */
594 ripngd_state_neighbors_neighbor_lookup_entry(const void *parent_list_entry
,
595 const struct yang_list_keys
*keys
)
597 /* TODO: implement me. */
602 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/address
604 static struct yang_data
*
605 ripngd_state_neighbors_neighbor_address_get_elem(const char *xpath
,
606 const void *list_entry
)
608 /* TODO: implement me. */
613 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/last-update
615 static struct yang_data
*
616 ripngd_state_neighbors_neighbor_last_update_get_elem(const char *xpath
,
617 const void *list_entry
)
619 /* TODO: implement me. */
624 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/bad-packets-rcvd
626 static struct yang_data
*
627 ripngd_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
628 const char *xpath
, const void *list_entry
)
630 /* TODO: implement me. */
635 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/bad-routes-rcvd
637 static struct yang_data
*
638 ripngd_state_neighbors_neighbor_bad_routes_rcvd_get_elem(const char *xpath
,
639 const void *list_entry
)
641 /* TODO: implement me. */
646 * XPath: /frr-ripngd:ripngd/state/routes/route
649 ripngd_state_routes_route_get_next(const void *parent_list_entry
,
650 const void *list_entry
)
652 /* TODO: implement me. */
656 static int ripngd_state_routes_route_get_keys(const void *list_entry
,
657 struct yang_list_keys
*keys
)
659 /* TODO: implement me. */
664 ripngd_state_routes_route_lookup_entry(const void *parent_list_entry
,
665 const struct yang_list_keys
*keys
)
667 /* TODO: implement me. */
672 * XPath: /frr-ripngd:ripngd/state/routes/route/prefix
674 static struct yang_data
*
675 ripngd_state_routes_route_prefix_get_elem(const char *xpath
,
676 const void *list_entry
)
678 /* TODO: implement me. */
683 * XPath: /frr-ripngd:ripngd/state/routes/route/next-hop
685 static struct yang_data
*
686 ripngd_state_routes_route_next_hop_get_elem(const char *xpath
,
687 const void *list_entry
)
689 /* TODO: implement me. */
694 * XPath: /frr-ripngd:ripngd/state/routes/route/interface
696 static struct yang_data
*
697 ripngd_state_routes_route_interface_get_elem(const char *xpath
,
698 const void *list_entry
)
700 /* TODO: implement me. */
705 * XPath: /frr-ripngd:ripngd/state/routes/route/metric
707 static struct yang_data
*
708 ripngd_state_routes_route_metric_get_elem(const char *xpath
,
709 const void *list_entry
)
711 /* TODO: implement me. */
716 * XPath: /frr-ripngd:clear-ripng-route
718 static int clear_ripng_route_rpc(const char *xpath
, const struct list
*input
,
722 struct ripng_info
*rinfo
;
724 struct listnode
*listnode
;
726 /* Clear received RIPng routes */
727 for (rp
= agg_route_top(ripng
->table
); rp
; rp
= agg_route_next(rp
)) {
732 for (ALL_LIST_ELEMENTS_RO(list
, listnode
, rinfo
)) {
733 if (!ripng_route_rte(rinfo
))
736 if (CHECK_FLAG(rinfo
->flags
, RIPNG_RTF_FIB
))
737 ripng_zebra_ipv6_delete(rp
);
742 RIPNG_TIMER_OFF(rinfo
->t_timeout
);
743 RIPNG_TIMER_OFF(rinfo
->t_garbage_collect
);
744 listnode_delete(list
, rinfo
);
745 ripng_info_free(rinfo
);
748 if (list_isempty(list
)) {
759 * XPath: /frr-interface:lib/interface/frr-ripngd:ripng/split-horizon
762 lib_interface_ripng_split_horizon_modify(enum nb_event event
,
763 const struct lyd_node
*dnode
,
764 union nb_resource
*resource
)
766 struct interface
*ifp
;
767 struct ripng_interface
*ri
;
769 if (event
!= NB_EV_APPLY
)
772 ifp
= yang_dnode_get_entry(dnode
, true);
774 ri
->split_horizon
= yang_dnode_get_enum(dnode
, NULL
);
779 /* clang-format off */
780 const struct frr_yang_module_info frr_ripngd_info
= {
781 .name
= "frr-ripngd",
784 .xpath
= "/frr-ripngd:ripngd/instance",
785 .cbs
.create
= ripngd_instance_create
,
786 .cbs
.delete = ripngd_instance_delete
,
787 .cbs
.cli_show
= cli_show_router_ripng
,
790 .xpath
= "/frr-ripngd:ripngd/instance/allow-ecmp",
791 .cbs
.modify
= ripngd_instance_allow_ecmp_modify
,
792 .cbs
.cli_show
= cli_show_ripng_allow_ecmp
,
795 .xpath
= "/frr-ripngd:ripngd/instance/default-information-originate",
796 .cbs
.modify
= ripngd_instance_default_information_originate_modify
,
797 .cbs
.cli_show
= cli_show_ripng_default_information_originate
,
800 .xpath
= "/frr-ripngd:ripngd/instance/default-metric",
801 .cbs
.modify
= ripngd_instance_default_metric_modify
,
802 .cbs
.cli_show
= cli_show_ripng_default_metric
,
805 .xpath
= "/frr-ripngd:ripngd/instance/network",
806 .cbs
.create
= ripngd_instance_network_create
,
807 .cbs
.delete = ripngd_instance_network_delete
,
808 .cbs
.cli_show
= cli_show_ripng_network_prefix
,
811 .xpath
= "/frr-ripngd:ripngd/instance/interface",
812 .cbs
.create
= ripngd_instance_interface_create
,
813 .cbs
.delete = ripngd_instance_interface_delete
,
814 .cbs
.cli_show
= cli_show_ripng_network_interface
,
817 .xpath
= "/frr-ripngd:ripngd/instance/offset-list",
818 .cbs
.create
= ripngd_instance_offset_list_create
,
819 .cbs
.delete = ripngd_instance_offset_list_delete
,
820 .cbs
.cli_show
= cli_show_ripng_offset_list
,
823 .xpath
= "/frr-ripngd:ripngd/instance/offset-list/access-list",
824 .cbs
.modify
= ripngd_instance_offset_list_access_list_modify
,
827 .xpath
= "/frr-ripngd:ripngd/instance/offset-list/metric",
828 .cbs
.modify
= ripngd_instance_offset_list_metric_modify
,
831 .xpath
= "/frr-ripngd:ripngd/instance/passive-interface",
832 .cbs
.create
= ripngd_instance_passive_interface_create
,
833 .cbs
.delete = ripngd_instance_passive_interface_delete
,
834 .cbs
.cli_show
= cli_show_ripng_passive_interface
,
837 .xpath
= "/frr-ripngd:ripngd/instance/redistribute",
838 .cbs
.create
= ripngd_instance_redistribute_create
,
839 .cbs
.delete = ripngd_instance_redistribute_delete
,
840 .cbs
.apply_finish
= ripngd_instance_redistribute_apply_finish
,
841 .cbs
.cli_show
= cli_show_ripng_redistribute
,
844 .xpath
= "/frr-ripngd:ripngd/instance/redistribute/route-map",
845 .cbs
.modify
= ripngd_instance_redistribute_route_map_modify
,
846 .cbs
.delete = ripngd_instance_redistribute_route_map_delete
,
849 .xpath
= "/frr-ripngd:ripngd/instance/redistribute/metric",
850 .cbs
.modify
= ripngd_instance_redistribute_metric_modify
,
851 .cbs
.delete = ripngd_instance_redistribute_metric_delete
,
854 .xpath
= "/frr-ripngd:ripngd/instance/static-route",
855 .cbs
.create
= ripngd_instance_static_route_create
,
856 .cbs
.delete = ripngd_instance_static_route_delete
,
857 .cbs
.cli_show
= cli_show_ripng_route
,
860 .xpath
= "/frr-ripngd:ripngd/instance/aggregate-address",
861 .cbs
.create
= ripngd_instance_aggregate_address_create
,
862 .cbs
.delete = ripngd_instance_aggregate_address_delete
,
863 .cbs
.cli_show
= cli_show_ripng_aggregate_address
,
866 .xpath
= "/frr-ripngd:ripngd/instance/timers",
867 .cbs
.apply_finish
= ripngd_instance_timers_apply_finish
,
868 .cbs
.cli_show
= cli_show_ripng_timers
,
871 .xpath
= "/frr-ripngd:ripngd/instance/timers/flush-interval",
872 .cbs
.modify
= ripngd_instance_timers_flush_interval_modify
,
875 .xpath
= "/frr-ripngd:ripngd/instance/timers/holddown-interval",
876 .cbs
.modify
= ripngd_instance_timers_holddown_interval_modify
,
879 .xpath
= "/frr-ripngd:ripngd/instance/timers/update-interval",
880 .cbs
.modify
= ripngd_instance_timers_update_interval_modify
,
883 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor",
884 .cbs
.get_next
= ripngd_state_neighbors_neighbor_get_next
,
885 .cbs
.get_keys
= ripngd_state_neighbors_neighbor_get_keys
,
886 .cbs
.lookup_entry
= ripngd_state_neighbors_neighbor_lookup_entry
,
889 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/address",
890 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_address_get_elem
,
893 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/last-update",
894 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_last_update_get_elem
,
897 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/bad-packets-rcvd",
898 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_bad_packets_rcvd_get_elem
,
901 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/bad-routes-rcvd",
902 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_bad_routes_rcvd_get_elem
,
905 .xpath
= "/frr-ripngd:ripngd/state/routes/route",
906 .cbs
.get_next
= ripngd_state_routes_route_get_next
,
907 .cbs
.get_keys
= ripngd_state_routes_route_get_keys
,
908 .cbs
.lookup_entry
= ripngd_state_routes_route_lookup_entry
,
911 .xpath
= "/frr-ripngd:ripngd/state/routes/route/prefix",
912 .cbs
.get_elem
= ripngd_state_routes_route_prefix_get_elem
,
915 .xpath
= "/frr-ripngd:ripngd/state/routes/route/next-hop",
916 .cbs
.get_elem
= ripngd_state_routes_route_next_hop_get_elem
,
919 .xpath
= "/frr-ripngd:ripngd/state/routes/route/interface",
920 .cbs
.get_elem
= ripngd_state_routes_route_interface_get_elem
,
923 .xpath
= "/frr-ripngd:ripngd/state/routes/route/metric",
924 .cbs
.get_elem
= ripngd_state_routes_route_metric_get_elem
,
927 .xpath
= "/frr-ripngd:clear-ripng-route",
928 .cbs
.rpc
= clear_ripng_route_rpc
,
931 .xpath
= "/frr-interface:lib/interface/frr-ripngd:ripng/split-horizon",
932 .cbs
.modify
= lib_interface_ripng_split_horizon_modify
,
933 .cbs
.cli_show
= cli_show_ipv6_ripng_split_horizon
,