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 struct listnode
*node
;
584 if (list_entry
== NULL
)
585 node
= listhead(peer_list
);
587 node
= listnextnode((struct listnode
*)list_entry
);
592 static int ripngd_state_neighbors_neighbor_get_keys(const void *list_entry
,
593 struct yang_list_keys
*keys
)
595 const struct listnode
*node
= list_entry
;
596 const struct ripng_peer
*peer
= listgetdata(node
);
599 (void)inet_ntop(AF_INET6
, &peer
->addr
, keys
->key
[0],
600 sizeof(keys
->key
[0]));
606 ripngd_state_neighbors_neighbor_lookup_entry(const void *parent_list_entry
,
607 const struct yang_list_keys
*keys
)
609 struct in6_addr address
;
610 struct ripng_peer
*peer
;
611 struct listnode
*node
;
613 yang_str2ipv6(keys
->key
[0], &address
);
615 for (ALL_LIST_ELEMENTS_RO(peer_list
, node
, peer
)) {
616 if (IPV6_ADDR_SAME(&peer
->addr
, &address
))
624 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/address
626 static struct yang_data
*
627 ripngd_state_neighbors_neighbor_address_get_elem(const char *xpath
,
628 const void *list_entry
)
630 const struct listnode
*node
= list_entry
;
631 const struct ripng_peer
*peer
= listgetdata(node
);
633 return yang_data_new_ipv6(xpath
, &peer
->addr
);
637 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/last-update
639 static struct yang_data
*
640 ripngd_state_neighbors_neighbor_last_update_get_elem(const char *xpath
,
641 const void *list_entry
)
643 /* TODO: yang:date-and-time is tricky */
648 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/bad-packets-rcvd
650 static struct yang_data
*
651 ripngd_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
652 const char *xpath
, const void *list_entry
)
654 const struct listnode
*node
= list_entry
;
655 const struct ripng_peer
*peer
= listgetdata(node
);
657 return yang_data_new_uint32(xpath
, peer
->recv_badpackets
);
661 * XPath: /frr-ripngd:ripngd/state/neighbors/neighbor/bad-routes-rcvd
663 static struct yang_data
*
664 ripngd_state_neighbors_neighbor_bad_routes_rcvd_get_elem(const char *xpath
,
665 const void *list_entry
)
667 const struct listnode
*node
= list_entry
;
668 const struct ripng_peer
*peer
= listgetdata(node
);
670 return yang_data_new_uint32(xpath
, peer
->recv_badroutes
);
674 * XPath: /frr-ripngd:ripngd/state/routes/route
677 ripngd_state_routes_route_get_next(const void *parent_list_entry
,
678 const void *list_entry
)
685 if (list_entry
== NULL
)
686 rn
= agg_route_top(ripng
->table
);
688 rn
= agg_route_next((struct agg_node
*)list_entry
);
689 while (rn
&& rn
->info
== NULL
)
690 rn
= agg_route_next(rn
);
695 static int ripngd_state_routes_route_get_keys(const void *list_entry
,
696 struct yang_list_keys
*keys
)
698 const struct agg_node
*rn
= list_entry
;
701 (void)prefix2str(&rn
->p
, keys
->key
[0], sizeof(keys
->key
[0]));
707 ripngd_state_routes_route_lookup_entry(const void *parent_list_entry
,
708 const struct yang_list_keys
*keys
)
710 struct prefix prefix
;
713 yang_str2ipv6p(keys
->key
[0], &prefix
);
715 rn
= agg_node_lookup(ripng
->table
, &prefix
);
716 if (!rn
|| !rn
->info
)
725 * XPath: /frr-ripngd:ripngd/state/routes/route/prefix
727 static struct yang_data
*
728 ripngd_state_routes_route_prefix_get_elem(const char *xpath
,
729 const void *list_entry
)
731 const struct agg_node
*rn
= list_entry
;
732 const struct ripng_info
*rinfo
= listnode_head(rn
->info
);
734 return yang_data_new_ipv6p(xpath
, &rinfo
->rp
->p
);
738 * XPath: /frr-ripngd:ripngd/state/routes/route/next-hop
740 static struct yang_data
*
741 ripngd_state_routes_route_next_hop_get_elem(const char *xpath
,
742 const void *list_entry
)
744 const struct agg_node
*rn
= list_entry
;
745 const struct ripng_info
*rinfo
= listnode_head(rn
->info
);
747 return yang_data_new_ipv6(xpath
, &rinfo
->nexthop
);
751 * XPath: /frr-ripngd:ripngd/state/routes/route/interface
753 static struct yang_data
*
754 ripngd_state_routes_route_interface_get_elem(const char *xpath
,
755 const void *list_entry
)
757 const struct agg_node
*rn
= list_entry
;
758 const struct ripng_info
*rinfo
= listnode_head(rn
->info
);
760 return yang_data_new_string(
761 xpath
, ifindex2ifname(rinfo
->ifindex
, VRF_DEFAULT
));
765 * XPath: /frr-ripngd:ripngd/state/routes/route/metric
767 static struct yang_data
*
768 ripngd_state_routes_route_metric_get_elem(const char *xpath
,
769 const void *list_entry
)
771 const struct agg_node
*rn
= list_entry
;
772 const struct ripng_info
*rinfo
= listnode_head(rn
->info
);
774 return yang_data_new_uint8(xpath
, rinfo
->metric
);
778 * XPath: /frr-ripngd:clear-ripng-route
780 static int clear_ripng_route_rpc(const char *xpath
, const struct list
*input
,
784 struct ripng_info
*rinfo
;
786 struct listnode
*listnode
;
788 /* Clear received RIPng routes */
789 for (rp
= agg_route_top(ripng
->table
); rp
; rp
= agg_route_next(rp
)) {
794 for (ALL_LIST_ELEMENTS_RO(list
, listnode
, rinfo
)) {
795 if (!ripng_route_rte(rinfo
))
798 if (CHECK_FLAG(rinfo
->flags
, RIPNG_RTF_FIB
))
799 ripng_zebra_ipv6_delete(rp
);
804 RIPNG_TIMER_OFF(rinfo
->t_timeout
);
805 RIPNG_TIMER_OFF(rinfo
->t_garbage_collect
);
806 listnode_delete(list
, rinfo
);
807 ripng_info_free(rinfo
);
810 if (list_isempty(list
)) {
821 * XPath: /frr-interface:lib/interface/frr-ripngd:ripng/split-horizon
824 lib_interface_ripng_split_horizon_modify(enum nb_event event
,
825 const struct lyd_node
*dnode
,
826 union nb_resource
*resource
)
828 struct interface
*ifp
;
829 struct ripng_interface
*ri
;
831 if (event
!= NB_EV_APPLY
)
834 ifp
= yang_dnode_get_entry(dnode
, true);
836 ri
->split_horizon
= yang_dnode_get_enum(dnode
, NULL
);
841 /* clang-format off */
842 const struct frr_yang_module_info frr_ripngd_info
= {
843 .name
= "frr-ripngd",
846 .xpath
= "/frr-ripngd:ripngd/instance",
847 .cbs
.create
= ripngd_instance_create
,
848 .cbs
.delete = ripngd_instance_delete
,
849 .cbs
.cli_show
= cli_show_router_ripng
,
852 .xpath
= "/frr-ripngd:ripngd/instance/allow-ecmp",
853 .cbs
.modify
= ripngd_instance_allow_ecmp_modify
,
854 .cbs
.cli_show
= cli_show_ripng_allow_ecmp
,
857 .xpath
= "/frr-ripngd:ripngd/instance/default-information-originate",
858 .cbs
.modify
= ripngd_instance_default_information_originate_modify
,
859 .cbs
.cli_show
= cli_show_ripng_default_information_originate
,
862 .xpath
= "/frr-ripngd:ripngd/instance/default-metric",
863 .cbs
.modify
= ripngd_instance_default_metric_modify
,
864 .cbs
.cli_show
= cli_show_ripng_default_metric
,
867 .xpath
= "/frr-ripngd:ripngd/instance/network",
868 .cbs
.create
= ripngd_instance_network_create
,
869 .cbs
.delete = ripngd_instance_network_delete
,
870 .cbs
.cli_show
= cli_show_ripng_network_prefix
,
873 .xpath
= "/frr-ripngd:ripngd/instance/interface",
874 .cbs
.create
= ripngd_instance_interface_create
,
875 .cbs
.delete = ripngd_instance_interface_delete
,
876 .cbs
.cli_show
= cli_show_ripng_network_interface
,
879 .xpath
= "/frr-ripngd:ripngd/instance/offset-list",
880 .cbs
.create
= ripngd_instance_offset_list_create
,
881 .cbs
.delete = ripngd_instance_offset_list_delete
,
882 .cbs
.cli_show
= cli_show_ripng_offset_list
,
885 .xpath
= "/frr-ripngd:ripngd/instance/offset-list/access-list",
886 .cbs
.modify
= ripngd_instance_offset_list_access_list_modify
,
889 .xpath
= "/frr-ripngd:ripngd/instance/offset-list/metric",
890 .cbs
.modify
= ripngd_instance_offset_list_metric_modify
,
893 .xpath
= "/frr-ripngd:ripngd/instance/passive-interface",
894 .cbs
.create
= ripngd_instance_passive_interface_create
,
895 .cbs
.delete = ripngd_instance_passive_interface_delete
,
896 .cbs
.cli_show
= cli_show_ripng_passive_interface
,
899 .xpath
= "/frr-ripngd:ripngd/instance/redistribute",
900 .cbs
.create
= ripngd_instance_redistribute_create
,
901 .cbs
.delete = ripngd_instance_redistribute_delete
,
902 .cbs
.apply_finish
= ripngd_instance_redistribute_apply_finish
,
903 .cbs
.cli_show
= cli_show_ripng_redistribute
,
906 .xpath
= "/frr-ripngd:ripngd/instance/redistribute/route-map",
907 .cbs
.modify
= ripngd_instance_redistribute_route_map_modify
,
908 .cbs
.delete = ripngd_instance_redistribute_route_map_delete
,
911 .xpath
= "/frr-ripngd:ripngd/instance/redistribute/metric",
912 .cbs
.modify
= ripngd_instance_redistribute_metric_modify
,
913 .cbs
.delete = ripngd_instance_redistribute_metric_delete
,
916 .xpath
= "/frr-ripngd:ripngd/instance/static-route",
917 .cbs
.create
= ripngd_instance_static_route_create
,
918 .cbs
.delete = ripngd_instance_static_route_delete
,
919 .cbs
.cli_show
= cli_show_ripng_route
,
922 .xpath
= "/frr-ripngd:ripngd/instance/aggregate-address",
923 .cbs
.create
= ripngd_instance_aggregate_address_create
,
924 .cbs
.delete = ripngd_instance_aggregate_address_delete
,
925 .cbs
.cli_show
= cli_show_ripng_aggregate_address
,
928 .xpath
= "/frr-ripngd:ripngd/instance/timers",
929 .cbs
.apply_finish
= ripngd_instance_timers_apply_finish
,
930 .cbs
.cli_show
= cli_show_ripng_timers
,
933 .xpath
= "/frr-ripngd:ripngd/instance/timers/flush-interval",
934 .cbs
.modify
= ripngd_instance_timers_flush_interval_modify
,
937 .xpath
= "/frr-ripngd:ripngd/instance/timers/holddown-interval",
938 .cbs
.modify
= ripngd_instance_timers_holddown_interval_modify
,
941 .xpath
= "/frr-ripngd:ripngd/instance/timers/update-interval",
942 .cbs
.modify
= ripngd_instance_timers_update_interval_modify
,
945 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor",
946 .cbs
.get_next
= ripngd_state_neighbors_neighbor_get_next
,
947 .cbs
.get_keys
= ripngd_state_neighbors_neighbor_get_keys
,
948 .cbs
.lookup_entry
= ripngd_state_neighbors_neighbor_lookup_entry
,
951 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/address",
952 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_address_get_elem
,
955 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/last-update",
956 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_last_update_get_elem
,
959 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/bad-packets-rcvd",
960 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_bad_packets_rcvd_get_elem
,
963 .xpath
= "/frr-ripngd:ripngd/state/neighbors/neighbor/bad-routes-rcvd",
964 .cbs
.get_elem
= ripngd_state_neighbors_neighbor_bad_routes_rcvd_get_elem
,
967 .xpath
= "/frr-ripngd:ripngd/state/routes/route",
968 .cbs
.get_next
= ripngd_state_routes_route_get_next
,
969 .cbs
.get_keys
= ripngd_state_routes_route_get_keys
,
970 .cbs
.lookup_entry
= ripngd_state_routes_route_lookup_entry
,
973 .xpath
= "/frr-ripngd:ripngd/state/routes/route/prefix",
974 .cbs
.get_elem
= ripngd_state_routes_route_prefix_get_elem
,
977 .xpath
= "/frr-ripngd:ripngd/state/routes/route/next-hop",
978 .cbs
.get_elem
= ripngd_state_routes_route_next_hop_get_elem
,
981 .xpath
= "/frr-ripngd:ripngd/state/routes/route/interface",
982 .cbs
.get_elem
= ripngd_state_routes_route_interface_get_elem
,
985 .xpath
= "/frr-ripngd:ripngd/state/routes/route/metric",
986 .cbs
.get_elem
= ripngd_state_routes_route_metric_get_elem
,
989 .xpath
= "/frr-ripngd:clear-ripng-route",
990 .cbs
.rpc
= clear_ripng_route_rpc
,
993 .xpath
= "/frr-interface:lib/interface/frr-ripngd:ripng/split-horizon",
994 .cbs
.modify
= lib_interface_ripng_split_horizon_modify
,
995 .cbs
.cli_show
= cli_show_ipv6_ripng_split_horizon
,