2 * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
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 "northbound.h"
33 #include "ripd/ripd.h"
34 #include "ripd/rip_nb.h"
35 #include "ripd/rip_debug.h"
36 #include "ripd/rip_interface.h"
39 * XPath: /frr-ripd:ripd/instance
41 int ripd_instance_create(enum nb_event event
, const struct lyd_node
*dnode
,
42 union nb_resource
*resource
)
49 vrf_name
= yang_dnode_get_string(dnode
, "./vrf");
50 vrf
= vrf_lookup_by_name(vrf_name
);
53 * Try to create a RIP socket only if the VRF is enabled, otherwise
54 * create a disabled RIP instance and wait for the VRF to be enabled.
60 if (!vrf
|| !vrf_is_enabled(vrf
))
63 socket
= rip_create_socket(vrf
);
65 return NB_ERR_RESOURCE
;
66 resource
->fd
= socket
;
69 if (!vrf
|| !vrf_is_enabled(vrf
))
72 socket
= resource
->fd
;
76 if (vrf
&& vrf_is_enabled(vrf
))
77 socket
= resource
->fd
;
81 rip
= rip_create(vrf_name
, vrf
, socket
);
82 nb_running_set_entry(dnode
, rip
);
89 int ripd_instance_destroy(enum nb_event event
, const struct lyd_node
*dnode
)
93 if (event
!= NB_EV_APPLY
)
96 rip
= nb_running_unset_entry(dnode
);
103 * XPath: /frr-ripd:ripd/instance/allow-ecmp
105 int ripd_instance_allow_ecmp_modify(enum nb_event event
,
106 const struct lyd_node
*dnode
,
107 union nb_resource
*resource
)
111 if (event
!= NB_EV_APPLY
)
114 rip
= nb_running_get_entry(dnode
, NULL
, true);
115 rip
->ecmp
= yang_dnode_get_bool(dnode
, NULL
);
117 rip_ecmp_disable(rip
);
123 * XPath: /frr-ripd:ripd/instance/default-information-originate
125 int ripd_instance_default_information_originate_modify(
126 enum nb_event event
, const struct lyd_node
*dnode
,
127 union nb_resource
*resource
)
130 bool default_information
;
131 struct prefix_ipv4 p
;
133 if (event
!= NB_EV_APPLY
)
136 rip
= nb_running_get_entry(dnode
, NULL
, true);
137 default_information
= yang_dnode_get_bool(dnode
, NULL
);
139 memset(&p
, 0, sizeof(struct prefix_ipv4
));
141 if (default_information
) {
144 memset(&nh
, 0, sizeof(nh
));
145 nh
.type
= NEXTHOP_TYPE_IPV4
;
146 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
149 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
157 * XPath: /frr-ripd:ripd/instance/default-metric
159 int ripd_instance_default_metric_modify(enum nb_event event
,
160 const struct lyd_node
*dnode
,
161 union nb_resource
*resource
)
165 if (event
!= NB_EV_APPLY
)
168 rip
= nb_running_get_entry(dnode
, NULL
, true);
169 rip
->default_metric
= yang_dnode_get_uint8(dnode
, NULL
);
170 /* rip_update_default_metric (); */
176 * XPath: /frr-ripd:ripd/instance/distance/default
178 int ripd_instance_distance_default_modify(enum nb_event event
,
179 const struct lyd_node
*dnode
,
180 union nb_resource
*resource
)
184 if (event
!= NB_EV_APPLY
)
187 rip
= nb_running_get_entry(dnode
, NULL
, true);
188 rip
->distance
= yang_dnode_get_uint8(dnode
, NULL
);
194 * XPath: /frr-ripd:ripd/instance/distance/source
196 int ripd_instance_distance_source_create(enum nb_event event
,
197 const struct lyd_node
*dnode
,
198 union nb_resource
*resource
)
201 struct prefix_ipv4 prefix
;
202 struct route_node
*rn
;
204 if (event
!= NB_EV_APPLY
)
207 yang_dnode_get_ipv4p(&prefix
, dnode
, "./prefix");
208 apply_mask_ipv4(&prefix
);
210 /* Get RIP distance node. */
211 rip
= nb_running_get_entry(dnode
, NULL
, true);
212 rn
= route_node_get(rip
->distance_table
, (struct prefix
*)&prefix
);
213 rn
->info
= rip_distance_new();
214 nb_running_set_entry(dnode
, rn
);
219 int ripd_instance_distance_source_destroy(enum nb_event event
,
220 const struct lyd_node
*dnode
)
222 struct route_node
*rn
;
223 struct rip_distance
*rdistance
;
225 if (event
!= NB_EV_APPLY
)
228 rn
= nb_running_unset_entry(dnode
);
229 rdistance
= rn
->info
;
230 rip_distance_free(rdistance
);
232 route_unlock_node(rn
);
238 * XPath: /frr-ripd:ripd/instance/distance/source/distance
240 int ripd_instance_distance_source_distance_modify(enum nb_event event
,
241 const struct lyd_node
*dnode
,
242 union nb_resource
*resource
)
244 struct route_node
*rn
;
246 struct rip_distance
*rdistance
;
248 if (event
!= NB_EV_APPLY
)
251 /* Set distance value. */
252 rn
= nb_running_get_entry(dnode
, NULL
, true);
253 distance
= yang_dnode_get_uint8(dnode
, NULL
);
254 rdistance
= rn
->info
;
255 rdistance
->distance
= distance
;
261 * XPath: /frr-ripd:ripd/instance/distance/source/access-list
263 int ripd_instance_distance_source_access_list_modify(
264 enum nb_event event
, const struct lyd_node
*dnode
,
265 union nb_resource
*resource
)
267 const char *acl_name
;
268 struct route_node
*rn
;
269 struct rip_distance
*rdistance
;
271 if (event
!= NB_EV_APPLY
)
274 acl_name
= yang_dnode_get_string(dnode
, NULL
);
276 /* Set access-list */
277 rn
= nb_running_get_entry(dnode
, NULL
, true);
278 rdistance
= rn
->info
;
279 if (rdistance
->access_list
)
280 free(rdistance
->access_list
);
281 rdistance
->access_list
= strdup(acl_name
);
286 int ripd_instance_distance_source_access_list_destroy(
287 enum nb_event event
, const struct lyd_node
*dnode
)
289 struct route_node
*rn
;
290 struct rip_distance
*rdistance
;
292 if (event
!= NB_EV_APPLY
)
295 /* Reset access-list configuration. */
296 rn
= nb_running_get_entry(dnode
, NULL
, true);
297 rdistance
= rn
->info
;
298 free(rdistance
->access_list
);
299 rdistance
->access_list
= NULL
;
305 * XPath: /frr-ripd:ripd/instance/explicit-neighbor
307 int ripd_instance_explicit_neighbor_create(enum nb_event event
,
308 const struct lyd_node
*dnode
,
309 union nb_resource
*resource
)
312 struct prefix_ipv4 p
;
314 if (event
!= NB_EV_APPLY
)
317 rip
= nb_running_get_entry(dnode
, NULL
, true);
319 p
.prefixlen
= IPV4_MAX_BITLEN
;
320 yang_dnode_get_ipv4(&p
.prefix
, dnode
, NULL
);
322 return rip_neighbor_add(rip
, &p
);
325 int ripd_instance_explicit_neighbor_destroy(enum nb_event event
,
326 const struct lyd_node
*dnode
)
329 struct prefix_ipv4 p
;
331 if (event
!= NB_EV_APPLY
)
334 rip
= nb_running_get_entry(dnode
, NULL
, true);
336 p
.prefixlen
= IPV4_MAX_BITLEN
;
337 yang_dnode_get_ipv4(&p
.prefix
, dnode
, NULL
);
339 return rip_neighbor_delete(rip
, &p
);
343 * XPath: /frr-ripd:ripd/instance/network
345 int ripd_instance_network_create(enum nb_event event
,
346 const struct lyd_node
*dnode
,
347 union nb_resource
*resource
)
352 if (event
!= NB_EV_APPLY
)
355 rip
= nb_running_get_entry(dnode
, NULL
, true);
356 yang_dnode_get_ipv4p(&p
, dnode
, NULL
);
357 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
359 return rip_enable_network_add(rip
, &p
);
362 int ripd_instance_network_destroy(enum nb_event event
,
363 const struct lyd_node
*dnode
)
368 if (event
!= NB_EV_APPLY
)
371 rip
= nb_running_get_entry(dnode
, NULL
, true);
372 yang_dnode_get_ipv4p(&p
, dnode
, NULL
);
373 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
375 return rip_enable_network_delete(rip
, &p
);
379 * XPath: /frr-ripd:ripd/instance/interface
381 int ripd_instance_interface_create(enum nb_event event
,
382 const struct lyd_node
*dnode
,
383 union nb_resource
*resource
)
388 if (event
!= NB_EV_APPLY
)
391 rip
= nb_running_get_entry(dnode
, NULL
, true);
392 ifname
= yang_dnode_get_string(dnode
, NULL
);
394 return rip_enable_if_add(rip
, ifname
);
397 int ripd_instance_interface_destroy(enum nb_event event
,
398 const struct lyd_node
*dnode
)
403 if (event
!= NB_EV_APPLY
)
406 rip
= nb_running_get_entry(dnode
, NULL
, true);
407 ifname
= yang_dnode_get_string(dnode
, NULL
);
409 return rip_enable_if_delete(rip
, ifname
);
413 * XPath: /frr-ripd:ripd/instance/offset-list
415 int ripd_instance_offset_list_create(enum nb_event event
,
416 const struct lyd_node
*dnode
,
417 union nb_resource
*resource
)
421 struct rip_offset_list
*offset
;
423 if (event
!= NB_EV_APPLY
)
426 rip
= nb_running_get_entry(dnode
, NULL
, true);
427 ifname
= yang_dnode_get_string(dnode
, "./interface");
429 offset
= rip_offset_list_new(rip
, ifname
);
430 nb_running_set_entry(dnode
, offset
);
435 int ripd_instance_offset_list_destroy(enum nb_event event
,
436 const struct lyd_node
*dnode
)
439 struct rip_offset_list
*offset
;
441 if (event
!= NB_EV_APPLY
)
444 direct
= yang_dnode_get_enum(dnode
, "./direction");
446 offset
= nb_running_unset_entry(dnode
);
447 if (offset
->direct
[direct
].alist_name
) {
448 free(offset
->direct
[direct
].alist_name
);
449 offset
->direct
[direct
].alist_name
= NULL
;
451 if (offset
->direct
[RIP_OFFSET_LIST_IN
].alist_name
== NULL
452 && offset
->direct
[RIP_OFFSET_LIST_OUT
].alist_name
== NULL
)
453 offset_list_del(offset
);
459 * XPath: /frr-ripd:ripd/instance/offset-list/access-list
461 int ripd_instance_offset_list_access_list_modify(enum nb_event event
,
462 const struct lyd_node
*dnode
,
463 union nb_resource
*resource
)
466 struct rip_offset_list
*offset
;
467 const char *alist_name
;
469 if (event
!= NB_EV_APPLY
)
472 direct
= yang_dnode_get_enum(dnode
, "../direction");
473 alist_name
= yang_dnode_get_string(dnode
, NULL
);
475 offset
= nb_running_get_entry(dnode
, NULL
, true);
476 if (offset
->direct
[direct
].alist_name
)
477 free(offset
->direct
[direct
].alist_name
);
478 offset
->direct
[direct
].alist_name
= strdup(alist_name
);
484 * XPath: /frr-ripd:ripd/instance/offset-list/metric
486 int ripd_instance_offset_list_metric_modify(enum nb_event event
,
487 const struct lyd_node
*dnode
,
488 union nb_resource
*resource
)
492 struct rip_offset_list
*offset
;
494 if (event
!= NB_EV_APPLY
)
497 direct
= yang_dnode_get_enum(dnode
, "../direction");
498 metric
= yang_dnode_get_uint8(dnode
, NULL
);
500 offset
= nb_running_get_entry(dnode
, NULL
, true);
501 offset
->direct
[direct
].metric
= metric
;
507 * XPath: /frr-ripd:ripd/instance/passive-default
509 int ripd_instance_passive_default_modify(enum nb_event event
,
510 const struct lyd_node
*dnode
,
511 union nb_resource
*resource
)
515 if (event
!= NB_EV_APPLY
)
518 rip
= nb_running_get_entry(dnode
, NULL
, true);
519 rip
->passive_default
= yang_dnode_get_bool(dnode
, NULL
);
520 rip_passive_nondefault_clean(rip
);
526 * XPath: /frr-ripd:ripd/instance/passive-interface
528 int ripd_instance_passive_interface_create(enum nb_event event
,
529 const struct lyd_node
*dnode
,
530 union nb_resource
*resource
)
535 if (event
!= NB_EV_APPLY
)
538 rip
= nb_running_get_entry(dnode
, NULL
, true);
539 ifname
= yang_dnode_get_string(dnode
, NULL
);
541 return rip_passive_nondefault_set(rip
, ifname
);
544 int ripd_instance_passive_interface_destroy(enum nb_event event
,
545 const struct lyd_node
*dnode
)
550 if (event
!= NB_EV_APPLY
)
553 rip
= nb_running_get_entry(dnode
, NULL
, true);
554 ifname
= yang_dnode_get_string(dnode
, NULL
);
556 return rip_passive_nondefault_unset(rip
, ifname
);
560 * XPath: /frr-ripd:ripd/instance/non-passive-interface
562 int ripd_instance_non_passive_interface_create(enum nb_event event
,
563 const struct lyd_node
*dnode
,
564 union nb_resource
*resource
)
569 if (event
!= NB_EV_APPLY
)
572 rip
= nb_running_get_entry(dnode
, NULL
, true);
573 ifname
= yang_dnode_get_string(dnode
, NULL
);
575 return rip_passive_nondefault_unset(rip
, ifname
);
578 int ripd_instance_non_passive_interface_destroy(enum nb_event event
,
579 const struct lyd_node
*dnode
)
584 if (event
!= NB_EV_APPLY
)
587 rip
= nb_running_get_entry(dnode
, NULL
, true);
588 ifname
= yang_dnode_get_string(dnode
, NULL
);
590 return rip_passive_nondefault_set(rip
, ifname
);
594 * XPath: /frr-ripd:ripd/instance/redistribute
596 int ripd_instance_redistribute_create(enum nb_event event
,
597 const struct lyd_node
*dnode
,
598 union nb_resource
*resource
)
603 if (event
!= NB_EV_APPLY
)
606 rip
= nb_running_get_entry(dnode
, NULL
, true);
607 type
= yang_dnode_get_enum(dnode
, "./protocol");
609 rip
->redist
[type
].enabled
= true;
614 int ripd_instance_redistribute_destroy(enum nb_event event
,
615 const struct lyd_node
*dnode
)
620 if (event
!= NB_EV_APPLY
)
623 rip
= nb_running_get_entry(dnode
, NULL
, true);
624 type
= yang_dnode_get_enum(dnode
, "./protocol");
626 rip
->redist
[type
].enabled
= false;
627 if (rip
->redist
[type
].route_map
.name
) {
628 free(rip
->redist
[type
].route_map
.name
);
629 rip
->redist
[type
].route_map
.name
= NULL
;
630 rip
->redist
[type
].route_map
.map
= NULL
;
632 rip
->redist
[type
].metric_config
= false;
633 rip
->redist
[type
].metric
= 0;
636 rip_redistribute_conf_delete(rip
, type
);
641 void ripd_instance_redistribute_apply_finish(const struct lyd_node
*dnode
)
646 rip
= nb_running_get_entry(dnode
, NULL
, true);
647 type
= yang_dnode_get_enum(dnode
, "./protocol");
650 rip_redistribute_conf_update(rip
, type
);
654 * XPath: /frr-ripd:ripd/instance/redistribute/route-map
656 int ripd_instance_redistribute_route_map_modify(enum nb_event event
,
657 const struct lyd_node
*dnode
,
658 union nb_resource
*resource
)
662 const char *rmap_name
;
664 if (event
!= NB_EV_APPLY
)
667 rip
= nb_running_get_entry(dnode
, NULL
, true);
668 type
= yang_dnode_get_enum(dnode
, "../protocol");
669 rmap_name
= yang_dnode_get_string(dnode
, NULL
);
671 if (rip
->redist
[type
].route_map
.name
)
672 free(rip
->redist
[type
].route_map
.name
);
673 rip
->redist
[type
].route_map
.name
= strdup(rmap_name
);
674 rip
->redist
[type
].route_map
.map
= route_map_lookup_by_name(rmap_name
);
679 int ripd_instance_redistribute_route_map_destroy(enum nb_event event
,
680 const struct lyd_node
*dnode
)
685 if (event
!= NB_EV_APPLY
)
688 rip
= nb_running_get_entry(dnode
, NULL
, true);
689 type
= yang_dnode_get_enum(dnode
, "../protocol");
691 free(rip
->redist
[type
].route_map
.name
);
692 rip
->redist
[type
].route_map
.name
= NULL
;
693 rip
->redist
[type
].route_map
.map
= NULL
;
699 * XPath: /frr-ripd:ripd/instance/redistribute/metric
701 int ripd_instance_redistribute_metric_modify(enum nb_event event
,
702 const struct lyd_node
*dnode
,
703 union nb_resource
*resource
)
709 if (event
!= NB_EV_APPLY
)
712 rip
= nb_running_get_entry(dnode
, NULL
, true);
713 type
= yang_dnode_get_enum(dnode
, "../protocol");
714 metric
= yang_dnode_get_uint8(dnode
, NULL
);
716 rip
->redist
[type
].metric_config
= true;
717 rip
->redist
[type
].metric
= metric
;
722 int ripd_instance_redistribute_metric_destroy(enum nb_event event
,
723 const struct lyd_node
*dnode
)
728 if (event
!= NB_EV_APPLY
)
731 rip
= nb_running_get_entry(dnode
, NULL
, true);
732 type
= yang_dnode_get_enum(dnode
, "../protocol");
734 rip
->redist
[type
].metric_config
= false;
735 rip
->redist
[type
].metric
= 0;
741 * XPath: /frr-ripd:ripd/instance/static-route
743 int ripd_instance_static_route_create(enum nb_event event
,
744 const struct lyd_node
*dnode
,
745 union nb_resource
*resource
)
749 struct prefix_ipv4 p
;
751 if (event
!= NB_EV_APPLY
)
754 rip
= nb_running_get_entry(dnode
, NULL
, true);
755 yang_dnode_get_ipv4p(&p
, dnode
, NULL
);
758 memset(&nh
, 0, sizeof(nh
));
759 nh
.type
= NEXTHOP_TYPE_IPV4
;
760 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, &nh
, 0,
766 int ripd_instance_static_route_destroy(enum nb_event event
,
767 const struct lyd_node
*dnode
)
770 struct prefix_ipv4 p
;
772 if (event
!= NB_EV_APPLY
)
775 rip
= nb_running_get_entry(dnode
, NULL
, true);
776 yang_dnode_get_ipv4p(&p
, dnode
, NULL
);
779 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, 0);
785 * XPath: /frr-ripd:ripd/instance/timers/
787 void ripd_instance_timers_apply_finish(const struct lyd_node
*dnode
)
791 rip
= nb_running_get_entry(dnode
, NULL
, true);
793 /* Reset update timer thread. */
794 rip_event(rip
, RIP_UPDATE_EVENT
, 0);
798 * XPath: /frr-ripd:ripd/instance/timers/flush-interval
800 int ripd_instance_timers_flush_interval_modify(enum nb_event event
,
801 const struct lyd_node
*dnode
,
802 union nb_resource
*resource
)
806 if (event
!= NB_EV_APPLY
)
809 rip
= nb_running_get_entry(dnode
, NULL
, true);
810 rip
->garbage_time
= yang_dnode_get_uint32(dnode
, NULL
);
816 * XPath: /frr-ripd:ripd/instance/timers/holddown-interval
818 int ripd_instance_timers_holddown_interval_modify(enum nb_event event
,
819 const struct lyd_node
*dnode
,
820 union nb_resource
*resource
)
824 if (event
!= NB_EV_APPLY
)
827 rip
= nb_running_get_entry(dnode
, NULL
, true);
828 rip
->timeout_time
= yang_dnode_get_uint32(dnode
, NULL
);
834 * XPath: /frr-ripd:ripd/instance/timers/update-interval
836 int ripd_instance_timers_update_interval_modify(enum nb_event event
,
837 const struct lyd_node
*dnode
,
838 union nb_resource
*resource
)
842 if (event
!= NB_EV_APPLY
)
845 rip
= nb_running_get_entry(dnode
, NULL
, true);
846 rip
->update_time
= yang_dnode_get_uint32(dnode
, NULL
);
852 * XPath: /frr-ripd:ripd/instance/version/receive
854 int ripd_instance_version_receive_modify(enum nb_event event
,
855 const struct lyd_node
*dnode
,
856 union nb_resource
*resource
)
860 if (event
!= NB_EV_APPLY
)
863 rip
= nb_running_get_entry(dnode
, NULL
, true);
864 rip
->version_recv
= yang_dnode_get_enum(dnode
, NULL
);
870 * XPath: /frr-ripd:ripd/instance/version/send
872 int ripd_instance_version_send_modify(enum nb_event event
,
873 const struct lyd_node
*dnode
,
874 union nb_resource
*resource
)
878 if (event
!= NB_EV_APPLY
)
881 rip
= nb_running_get_entry(dnode
, NULL
, true);
882 rip
->version_send
= yang_dnode_get_enum(dnode
, NULL
);
888 * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon
890 int lib_interface_rip_split_horizon_modify(enum nb_event event
,
891 const struct lyd_node
*dnode
,
892 union nb_resource
*resource
)
894 struct interface
*ifp
;
895 struct rip_interface
*ri
;
897 if (event
!= NB_EV_APPLY
)
900 ifp
= nb_running_get_entry(dnode
, NULL
, true);
902 ri
->split_horizon
= yang_dnode_get_enum(dnode
, NULL
);
908 * XPath: /frr-interface:lib/interface/frr-ripd:rip/v2-broadcast
910 int lib_interface_rip_v2_broadcast_modify(enum nb_event event
,
911 const struct lyd_node
*dnode
,
912 union nb_resource
*resource
)
914 struct interface
*ifp
;
915 struct rip_interface
*ri
;
917 if (event
!= NB_EV_APPLY
)
920 ifp
= nb_running_get_entry(dnode
, NULL
, true);
922 ri
->v2_broadcast
= yang_dnode_get_bool(dnode
, NULL
);
928 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-receive
930 int lib_interface_rip_version_receive_modify(enum nb_event event
,
931 const struct lyd_node
*dnode
,
932 union nb_resource
*resource
)
934 struct interface
*ifp
;
935 struct rip_interface
*ri
;
937 if (event
!= NB_EV_APPLY
)
940 ifp
= nb_running_get_entry(dnode
, NULL
, true);
942 ri
->ri_receive
= yang_dnode_get_enum(dnode
, NULL
);
948 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-send
950 int lib_interface_rip_version_send_modify(enum nb_event event
,
951 const struct lyd_node
*dnode
,
952 union nb_resource
*resource
)
954 struct interface
*ifp
;
955 struct rip_interface
*ri
;
957 if (event
!= NB_EV_APPLY
)
960 ifp
= nb_running_get_entry(dnode
, NULL
, true);
962 ri
->ri_send
= yang_dnode_get_enum(dnode
, NULL
);
968 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/mode
970 int lib_interface_rip_authentication_scheme_mode_modify(
971 enum nb_event event
, const struct lyd_node
*dnode
,
972 union nb_resource
*resource
)
974 struct interface
*ifp
;
975 struct rip_interface
*ri
;
977 if (event
!= NB_EV_APPLY
)
980 ifp
= nb_running_get_entry(dnode
, NULL
, true);
982 ri
->auth_type
= yang_dnode_get_enum(dnode
, NULL
);
989 * /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/md5-auth-length
991 int lib_interface_rip_authentication_scheme_md5_auth_length_modify(
992 enum nb_event event
, const struct lyd_node
*dnode
,
993 union nb_resource
*resource
)
995 struct interface
*ifp
;
996 struct rip_interface
*ri
;
998 if (event
!= NB_EV_APPLY
)
1001 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1003 ri
->md5_auth_len
= yang_dnode_get_enum(dnode
, NULL
);
1008 int lib_interface_rip_authentication_scheme_md5_auth_length_destroy(
1009 enum nb_event event
, const struct lyd_node
*dnode
)
1011 struct interface
*ifp
;
1012 struct rip_interface
*ri
;
1014 if (event
!= NB_EV_APPLY
)
1017 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1019 ri
->md5_auth_len
= yang_get_default_enum(
1020 "%s/authentication-scheme/md5-auth-length", RIP_IFACE
);
1026 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-password
1028 int lib_interface_rip_authentication_password_modify(
1029 enum nb_event event
, const struct lyd_node
*dnode
,
1030 union nb_resource
*resource
)
1032 struct interface
*ifp
;
1033 struct rip_interface
*ri
;
1035 if (event
!= NB_EV_APPLY
)
1038 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1040 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
1041 ri
->auth_str
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
1042 yang_dnode_get_string(dnode
, NULL
));
1047 int lib_interface_rip_authentication_password_destroy(
1048 enum nb_event event
, const struct lyd_node
*dnode
)
1050 struct interface
*ifp
;
1051 struct rip_interface
*ri
;
1053 if (event
!= NB_EV_APPLY
)
1056 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1058 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
1064 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain
1066 int lib_interface_rip_authentication_key_chain_modify(
1067 enum nb_event event
, const struct lyd_node
*dnode
,
1068 union nb_resource
*resource
)
1070 struct interface
*ifp
;
1071 struct rip_interface
*ri
;
1073 if (event
!= NB_EV_APPLY
)
1076 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1078 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);
1079 ri
->key_chain
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
1080 yang_dnode_get_string(dnode
, NULL
));
1085 int lib_interface_rip_authentication_key_chain_destroy(
1086 enum nb_event event
, const struct lyd_node
*dnode
)
1088 struct interface
*ifp
;
1089 struct rip_interface
*ri
;
1091 if (event
!= NB_EV_APPLY
)
1094 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1096 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);