1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
4 * Copyright (C) 2018 NetDEF, Inc.
17 #include "northbound.h"
20 #include "ripd/ripd.h"
21 #include "ripd/rip_nb.h"
22 #include "ripd/rip_debug.h"
23 #include "ripd/rip_interface.h"
26 * XPath: /frr-ripd:ripd/instance
28 int ripd_instance_create(struct nb_cb_create_args
*args
)
35 vrf_name
= yang_dnode_get_string(args
->dnode
, "./vrf");
36 vrf
= vrf_lookup_by_name(vrf_name
);
39 * Try to create a RIP socket only if the VRF is enabled, otherwise
40 * create a disabled RIP instance and wait for the VRF to be enabled.
42 switch (args
->event
) {
46 if (!vrf
|| !vrf_is_enabled(vrf
))
49 socket
= rip_create_socket(vrf
);
51 return NB_ERR_RESOURCE
;
52 args
->resource
->fd
= socket
;
55 if (!vrf
|| !vrf_is_enabled(vrf
))
58 socket
= args
->resource
->fd
;
62 if (vrf
&& vrf_is_enabled(vrf
))
63 socket
= args
->resource
->fd
;
67 rip
= rip_create(vrf_name
, vrf
, socket
);
68 nb_running_set_entry(args
->dnode
, rip
);
75 int ripd_instance_destroy(struct nb_cb_destroy_args
*args
)
79 if (args
->event
!= NB_EV_APPLY
)
82 rip
= nb_running_unset_entry(args
->dnode
);
89 * XPath: /frr-ripd:ripd/instance/allow-ecmp
91 int ripd_instance_allow_ecmp_modify(struct nb_cb_modify_args
*args
)
95 if (args
->event
!= NB_EV_APPLY
)
98 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
99 rip
->ecmp
= yang_dnode_get_bool(args
->dnode
, NULL
);
101 rip_ecmp_disable(rip
);
107 * XPath: /frr-ripd:ripd/instance/default-information-originate
109 int ripd_instance_default_information_originate_modify(
110 struct nb_cb_modify_args
*args
)
113 bool default_information
;
114 struct prefix_ipv4 p
;
116 if (args
->event
!= NB_EV_APPLY
)
119 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
120 default_information
= yang_dnode_get_bool(args
->dnode
, NULL
);
122 memset(&p
, 0, sizeof(p
));
124 if (default_information
) {
127 memset(&nh
, 0, sizeof(nh
));
128 nh
.type
= NEXTHOP_TYPE_IPV4
;
129 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
132 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
140 * XPath: /frr-ripd:ripd/instance/default-metric
142 int ripd_instance_default_metric_modify(struct nb_cb_modify_args
*args
)
146 if (args
->event
!= NB_EV_APPLY
)
149 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
150 rip
->default_metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
151 /* rip_update_default_metric (); */
157 * XPath: /frr-ripd:ripd/instance/distance/default
159 int ripd_instance_distance_default_modify(struct nb_cb_modify_args
*args
)
163 if (args
->event
!= NB_EV_APPLY
)
166 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
167 rip
->distance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
173 * XPath: /frr-ripd:ripd/instance/distance/source
175 int ripd_instance_distance_source_create(struct nb_cb_create_args
*args
)
178 struct prefix_ipv4 prefix
;
179 struct route_node
*rn
;
181 if (args
->event
!= NB_EV_APPLY
)
184 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, "./prefix");
185 apply_mask_ipv4(&prefix
);
187 /* Get RIP distance node. */
188 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
189 rn
= route_node_get(rip
->distance_table
, (struct prefix
*)&prefix
);
190 rn
->info
= rip_distance_new();
191 nb_running_set_entry(args
->dnode
, rn
);
196 int ripd_instance_distance_source_destroy(struct nb_cb_destroy_args
*args
)
198 struct route_node
*rn
;
199 struct rip_distance
*rdistance
;
201 if (args
->event
!= NB_EV_APPLY
)
204 rn
= nb_running_unset_entry(args
->dnode
);
205 rdistance
= rn
->info
;
206 rip_distance_free(rdistance
);
208 route_unlock_node(rn
);
214 * XPath: /frr-ripd:ripd/instance/distance/source/distance
216 int ripd_instance_distance_source_distance_modify(
217 struct nb_cb_modify_args
*args
)
219 struct route_node
*rn
;
221 struct rip_distance
*rdistance
;
223 if (args
->event
!= NB_EV_APPLY
)
226 /* Set distance value. */
227 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
228 distance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
229 rdistance
= rn
->info
;
230 rdistance
->distance
= distance
;
236 * XPath: /frr-ripd:ripd/instance/distance/source/access-list
238 int ripd_instance_distance_source_access_list_modify(
239 struct nb_cb_modify_args
*args
)
241 const char *acl_name
;
242 struct route_node
*rn
;
243 struct rip_distance
*rdistance
;
245 if (args
->event
!= NB_EV_APPLY
)
248 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
250 /* Set access-list */
251 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
252 rdistance
= rn
->info
;
253 if (rdistance
->access_list
)
254 free(rdistance
->access_list
);
255 rdistance
->access_list
= strdup(acl_name
);
260 int ripd_instance_distance_source_access_list_destroy(
261 struct nb_cb_destroy_args
*args
)
263 struct route_node
*rn
;
264 struct rip_distance
*rdistance
;
266 if (args
->event
!= NB_EV_APPLY
)
269 /* Reset access-list configuration. */
270 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
271 rdistance
= rn
->info
;
272 free(rdistance
->access_list
);
273 rdistance
->access_list
= NULL
;
279 * XPath: /frr-ripd:ripd/instance/explicit-neighbor
281 int ripd_instance_explicit_neighbor_create(struct nb_cb_create_args
*args
)
284 struct prefix_ipv4 p
;
286 if (args
->event
!= NB_EV_APPLY
)
289 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
291 p
.prefixlen
= IPV4_MAX_BITLEN
;
292 yang_dnode_get_ipv4(&p
.prefix
, args
->dnode
, NULL
);
294 return rip_neighbor_add(rip
, &p
);
297 int ripd_instance_explicit_neighbor_destroy(struct nb_cb_destroy_args
*args
)
300 struct prefix_ipv4 p
;
302 if (args
->event
!= NB_EV_APPLY
)
305 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
307 p
.prefixlen
= IPV4_MAX_BITLEN
;
308 yang_dnode_get_ipv4(&p
.prefix
, args
->dnode
, NULL
);
310 return rip_neighbor_delete(rip
, &p
);
314 * XPath: /frr-ripd:ripd/instance/network
316 int ripd_instance_network_create(struct nb_cb_create_args
*args
)
321 if (args
->event
!= NB_EV_APPLY
)
324 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
325 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
326 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
328 return rip_enable_network_add(rip
, &p
);
331 int ripd_instance_network_destroy(struct nb_cb_destroy_args
*args
)
336 if (args
->event
!= NB_EV_APPLY
)
339 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
340 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
341 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
343 return rip_enable_network_delete(rip
, &p
);
347 * XPath: /frr-ripd:ripd/instance/interface
349 int ripd_instance_interface_create(struct nb_cb_create_args
*args
)
354 if (args
->event
!= NB_EV_APPLY
)
357 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
358 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
360 return rip_enable_if_add(rip
, ifname
);
363 int ripd_instance_interface_destroy(struct nb_cb_destroy_args
*args
)
368 if (args
->event
!= NB_EV_APPLY
)
371 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
372 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
374 return rip_enable_if_delete(rip
, ifname
);
378 * XPath: /frr-ripd:ripd/instance/offset-list
380 int ripd_instance_offset_list_create(struct nb_cb_create_args
*args
)
384 struct rip_offset_list
*offset
;
386 if (args
->event
!= NB_EV_APPLY
)
389 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
390 ifname
= yang_dnode_get_string(args
->dnode
, "./interface");
392 offset
= rip_offset_list_new(rip
, ifname
);
393 nb_running_set_entry(args
->dnode
, offset
);
398 int ripd_instance_offset_list_destroy(struct nb_cb_destroy_args
*args
)
401 struct rip_offset_list
*offset
;
403 if (args
->event
!= NB_EV_APPLY
)
406 direct
= yang_dnode_get_enum(args
->dnode
, "./direction");
408 offset
= nb_running_unset_entry(args
->dnode
);
409 if (offset
->direct
[direct
].alist_name
) {
410 free(offset
->direct
[direct
].alist_name
);
411 offset
->direct
[direct
].alist_name
= NULL
;
413 if (offset
->direct
[RIP_OFFSET_LIST_IN
].alist_name
== NULL
414 && offset
->direct
[RIP_OFFSET_LIST_OUT
].alist_name
== NULL
)
415 offset_list_del(offset
);
421 * XPath: /frr-ripd:ripd/instance/offset-list/access-list
423 int ripd_instance_offset_list_access_list_modify(struct nb_cb_modify_args
*args
)
426 struct rip_offset_list
*offset
;
427 const char *alist_name
;
429 if (args
->event
!= NB_EV_APPLY
)
432 direct
= yang_dnode_get_enum(args
->dnode
, "../direction");
433 alist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
435 offset
= nb_running_get_entry(args
->dnode
, NULL
, true);
436 if (offset
->direct
[direct
].alist_name
)
437 free(offset
->direct
[direct
].alist_name
);
438 offset
->direct
[direct
].alist_name
= strdup(alist_name
);
444 * XPath: /frr-ripd:ripd/instance/offset-list/metric
446 int ripd_instance_offset_list_metric_modify(struct nb_cb_modify_args
*args
)
450 struct rip_offset_list
*offset
;
452 if (args
->event
!= NB_EV_APPLY
)
455 direct
= yang_dnode_get_enum(args
->dnode
, "../direction");
456 metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
458 offset
= nb_running_get_entry(args
->dnode
, NULL
, true);
459 offset
->direct
[direct
].metric
= metric
;
465 * XPath: /frr-ripd:ripd/instance/passive-default
467 int ripd_instance_passive_default_modify(struct nb_cb_modify_args
*args
)
471 if (args
->event
!= NB_EV_APPLY
)
474 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
475 rip
->passive_default
= yang_dnode_get_bool(args
->dnode
, NULL
);
476 rip_passive_nondefault_clean(rip
);
482 * XPath: /frr-ripd:ripd/instance/passive-interface
484 int ripd_instance_passive_interface_create(struct nb_cb_create_args
*args
)
489 if (args
->event
!= NB_EV_APPLY
)
492 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
493 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
495 return rip_passive_nondefault_set(rip
, ifname
);
498 int ripd_instance_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
503 if (args
->event
!= NB_EV_APPLY
)
506 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
507 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
509 return rip_passive_nondefault_unset(rip
, ifname
);
513 * XPath: /frr-ripd:ripd/instance/non-passive-interface
515 int ripd_instance_non_passive_interface_create(struct nb_cb_create_args
*args
)
520 if (args
->event
!= NB_EV_APPLY
)
523 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
524 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
526 return rip_passive_nondefault_unset(rip
, ifname
);
529 int ripd_instance_non_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
534 if (args
->event
!= NB_EV_APPLY
)
537 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
538 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
540 return rip_passive_nondefault_set(rip
, ifname
);
544 * XPath: /frr-ripd:ripd/instance/redistribute
546 int ripd_instance_redistribute_create(struct nb_cb_create_args
*args
)
551 if (args
->event
!= NB_EV_APPLY
)
554 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
555 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
557 rip
->redist
[type
].enabled
= true;
562 int ripd_instance_redistribute_destroy(struct nb_cb_destroy_args
*args
)
567 if (args
->event
!= NB_EV_APPLY
)
570 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
571 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
573 rip
->redist
[type
].enabled
= false;
574 if (rip
->redist
[type
].route_map
.name
) {
575 free(rip
->redist
[type
].route_map
.name
);
576 rip
->redist
[type
].route_map
.name
= NULL
;
577 rip
->redist
[type
].route_map
.map
= NULL
;
579 rip
->redist
[type
].metric_config
= false;
580 rip
->redist
[type
].metric
= 0;
583 rip_redistribute_conf_delete(rip
, type
);
588 void ripd_instance_redistribute_apply_finish(
589 struct nb_cb_apply_finish_args
*args
)
594 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
595 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
598 rip_redistribute_conf_update(rip
, type
);
602 * XPath: /frr-ripd:ripd/instance/redistribute/route-map
604 int ripd_instance_redistribute_route_map_modify(struct nb_cb_modify_args
*args
)
608 const char *rmap_name
;
610 if (args
->event
!= NB_EV_APPLY
)
613 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
614 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
615 rmap_name
= yang_dnode_get_string(args
->dnode
, NULL
);
617 if (rip
->redist
[type
].route_map
.name
)
618 free(rip
->redist
[type
].route_map
.name
);
619 rip
->redist
[type
].route_map
.name
= strdup(rmap_name
);
620 rip
->redist
[type
].route_map
.map
= route_map_lookup_by_name(rmap_name
);
625 int ripd_instance_redistribute_route_map_destroy(
626 struct nb_cb_destroy_args
*args
)
631 if (args
->event
!= NB_EV_APPLY
)
634 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
635 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
637 free(rip
->redist
[type
].route_map
.name
);
638 rip
->redist
[type
].route_map
.name
= NULL
;
639 rip
->redist
[type
].route_map
.map
= NULL
;
645 * XPath: /frr-ripd:ripd/instance/redistribute/metric
647 int ripd_instance_redistribute_metric_modify(struct nb_cb_modify_args
*args
)
653 if (args
->event
!= NB_EV_APPLY
)
656 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
657 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
658 metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
660 rip
->redist
[type
].metric_config
= true;
661 rip
->redist
[type
].metric
= metric
;
666 int ripd_instance_redistribute_metric_destroy(struct nb_cb_destroy_args
*args
)
671 if (args
->event
!= NB_EV_APPLY
)
674 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
675 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
677 rip
->redist
[type
].metric_config
= false;
678 rip
->redist
[type
].metric
= 0;
684 * XPath: /frr-ripd:ripd/instance/static-route
686 int ripd_instance_static_route_create(struct nb_cb_create_args
*args
)
690 struct prefix_ipv4 p
;
692 if (args
->event
!= NB_EV_APPLY
)
695 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
696 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
699 memset(&nh
, 0, sizeof(nh
));
700 nh
.type
= NEXTHOP_TYPE_IPV4
;
701 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, &nh
, 0,
707 int ripd_instance_static_route_destroy(struct nb_cb_destroy_args
*args
)
710 struct prefix_ipv4 p
;
712 if (args
->event
!= NB_EV_APPLY
)
715 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
716 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
719 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, 0);
725 * XPath: /frr-ripd:ripd/instance/timers/
727 void ripd_instance_timers_apply_finish(struct nb_cb_apply_finish_args
*args
)
731 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
733 /* Reset update timer thread. */
734 rip_event(rip
, RIP_UPDATE_EVENT
, 0);
738 * XPath: /frr-ripd:ripd/instance/timers/flush-interval
740 int ripd_instance_timers_flush_interval_modify(struct nb_cb_modify_args
*args
)
744 if (args
->event
!= NB_EV_APPLY
)
747 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
748 rip
->garbage_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
754 * XPath: /frr-ripd:ripd/instance/timers/holddown-interval
756 int ripd_instance_timers_holddown_interval_modify(
757 struct nb_cb_modify_args
*args
)
761 if (args
->event
!= NB_EV_APPLY
)
764 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
765 rip
->timeout_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
771 * XPath: /frr-ripd:ripd/instance/timers/update-interval
773 int ripd_instance_timers_update_interval_modify(struct nb_cb_modify_args
*args
)
777 if (args
->event
!= NB_EV_APPLY
)
780 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
781 rip
->update_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
787 * XPath: /frr-ripd:ripd/instance/version/receive
789 int ripd_instance_version_receive_modify(struct nb_cb_modify_args
*args
)
793 if (args
->event
!= NB_EV_APPLY
)
796 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
797 rip
->version_recv
= yang_dnode_get_enum(args
->dnode
, NULL
);
803 * XPath: /frr-ripd:ripd/instance/version/send
805 int ripd_instance_version_send_modify(struct nb_cb_modify_args
*args
)
809 if (args
->event
!= NB_EV_APPLY
)
812 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
813 rip
->version_send
= yang_dnode_get_enum(args
->dnode
, NULL
);
819 * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon
821 int lib_interface_rip_split_horizon_modify(struct nb_cb_modify_args
*args
)
823 struct interface
*ifp
;
824 struct rip_interface
*ri
;
826 if (args
->event
!= NB_EV_APPLY
)
829 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
831 ri
->split_horizon
= yang_dnode_get_enum(args
->dnode
, NULL
);
837 * XPath: /frr-interface:lib/interface/frr-ripd:rip/v2-broadcast
839 int lib_interface_rip_v2_broadcast_modify(struct nb_cb_modify_args
*args
)
841 struct interface
*ifp
;
842 struct rip_interface
*ri
;
844 if (args
->event
!= NB_EV_APPLY
)
847 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
849 ri
->v2_broadcast
= yang_dnode_get_bool(args
->dnode
, NULL
);
855 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-receive
857 int lib_interface_rip_version_receive_modify(struct nb_cb_modify_args
*args
)
859 struct interface
*ifp
;
860 struct rip_interface
*ri
;
862 if (args
->event
!= NB_EV_APPLY
)
865 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
867 ri
->ri_receive
= yang_dnode_get_enum(args
->dnode
, NULL
);
873 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-send
875 int lib_interface_rip_version_send_modify(struct nb_cb_modify_args
*args
)
877 struct interface
*ifp
;
878 struct rip_interface
*ri
;
880 if (args
->event
!= NB_EV_APPLY
)
883 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
885 ri
->ri_send
= yang_dnode_get_enum(args
->dnode
, NULL
);
891 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/mode
893 int lib_interface_rip_authentication_scheme_mode_modify(
894 struct nb_cb_modify_args
*args
)
896 struct interface
*ifp
;
897 struct rip_interface
*ri
;
899 if (args
->event
!= NB_EV_APPLY
)
902 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
904 ri
->auth_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
911 * /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/md5-auth-length
913 int lib_interface_rip_authentication_scheme_md5_auth_length_modify(
914 struct nb_cb_modify_args
*args
)
916 struct interface
*ifp
;
917 struct rip_interface
*ri
;
919 if (args
->event
!= NB_EV_APPLY
)
922 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
924 ri
->md5_auth_len
= yang_dnode_get_enum(args
->dnode
, NULL
);
929 int lib_interface_rip_authentication_scheme_md5_auth_length_destroy(
930 struct nb_cb_destroy_args
*args
)
932 struct interface
*ifp
;
933 struct rip_interface
*ri
;
935 if (args
->event
!= NB_EV_APPLY
)
938 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
940 ri
->md5_auth_len
= yang_get_default_enum(
941 "%s/authentication-scheme/md5-auth-length", RIP_IFACE
);
947 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-password
949 int lib_interface_rip_authentication_password_modify(
950 struct nb_cb_modify_args
*args
)
952 struct interface
*ifp
;
953 struct rip_interface
*ri
;
955 if (args
->event
!= NB_EV_APPLY
)
958 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
960 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
961 ri
->auth_str
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
962 yang_dnode_get_string(args
->dnode
, NULL
));
967 int lib_interface_rip_authentication_password_destroy(
968 struct nb_cb_destroy_args
*args
)
970 struct interface
*ifp
;
971 struct rip_interface
*ri
;
973 if (args
->event
!= NB_EV_APPLY
)
976 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
978 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
984 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain
986 int lib_interface_rip_authentication_key_chain_modify(
987 struct nb_cb_modify_args
*args
)
989 struct interface
*ifp
;
990 struct rip_interface
*ri
;
992 if (args
->event
!= NB_EV_APPLY
)
995 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
997 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);
998 ri
->key_chain
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
999 yang_dnode_get_string(args
->dnode
, NULL
));
1004 int lib_interface_rip_authentication_key_chain_destroy(
1005 struct nb_cb_destroy_args
*args
)
1007 struct interface
*ifp
;
1008 struct rip_interface
*ri
;
1010 if (args
->event
!= NB_EV_APPLY
)
1013 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1015 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);