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.
6 * Copyright (C) 2023 LabN Consulting, L.L.C.
19 #include "northbound.h"
22 #include "ripd/ripd.h"
23 #include "ripd/rip_nb.h"
24 #include "ripd/rip_debug.h"
25 #include "ripd/rip_interface.h"
26 #include "ripd/rip_bfd.h"
28 DEFINE_MTYPE_STATIC(RIPD
, RIP_BFD_PROFILE
, "RIP BFD profile name");
31 * XPath: /frr-ripd:ripd/instance
33 int ripd_instance_create(struct nb_cb_create_args
*args
)
40 vrf_name
= yang_dnode_get_string(args
->dnode
, "./vrf");
41 vrf
= vrf_lookup_by_name(vrf_name
);
44 * Try to create a RIP socket only if the VRF is enabled, otherwise
45 * create a disabled RIP instance and wait for the VRF to be enabled.
47 switch (args
->event
) {
51 if (!vrf
|| !vrf_is_enabled(vrf
))
54 socket
= rip_create_socket(vrf
);
56 return NB_ERR_RESOURCE
;
57 args
->resource
->fd
= socket
;
60 if (!vrf
|| !vrf_is_enabled(vrf
))
63 socket
= args
->resource
->fd
;
67 if (vrf
&& vrf_is_enabled(vrf
))
68 socket
= args
->resource
->fd
;
72 rip
= rip_create(vrf_name
, vrf
, socket
);
73 nb_running_set_entry(args
->dnode
, rip
);
80 int ripd_instance_destroy(struct nb_cb_destroy_args
*args
)
84 if (args
->event
!= NB_EV_APPLY
)
87 rip
= nb_running_unset_entry(args
->dnode
);
94 * XPath: /frr-ripd:ripd/instance/allow-ecmp
96 int ripd_instance_allow_ecmp_modify(struct nb_cb_modify_args
*args
)
100 if (args
->event
!= NB_EV_APPLY
)
103 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
104 rip
->ecmp
= yang_dnode_get_bool(args
->dnode
, NULL
);
106 rip_ecmp_disable(rip
);
112 * XPath: /frr-ripd:ripd/instance/default-information-originate
114 int ripd_instance_default_information_originate_modify(
115 struct nb_cb_modify_args
*args
)
118 bool default_information
;
119 struct prefix_ipv4 p
;
121 if (args
->event
!= NB_EV_APPLY
)
124 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
125 default_information
= yang_dnode_get_bool(args
->dnode
, NULL
);
127 memset(&p
, 0, sizeof(p
));
129 if (default_information
) {
132 memset(&nh
, 0, sizeof(nh
));
133 nh
.type
= NEXTHOP_TYPE_IPV4
;
134 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
137 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
145 * XPath: /frr-ripd:ripd/instance/default-metric
147 int ripd_instance_default_metric_modify(struct nb_cb_modify_args
*args
)
151 if (args
->event
!= NB_EV_APPLY
)
154 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
155 rip
->default_metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
156 /* rip_update_default_metric (); */
162 * XPath: /frr-ripd:ripd/instance/distance/default
164 int ripd_instance_distance_default_modify(struct nb_cb_modify_args
*args
)
168 if (args
->event
!= NB_EV_APPLY
)
171 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
172 rip
->distance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
178 * XPath: /frr-ripd:ripd/instance/distance/source
180 int ripd_instance_distance_source_create(struct nb_cb_create_args
*args
)
183 struct prefix_ipv4 prefix
;
184 struct route_node
*rn
;
186 if (args
->event
!= NB_EV_APPLY
)
189 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, "./prefix");
190 apply_mask_ipv4(&prefix
);
192 /* Get RIP distance node. */
193 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
194 rn
= route_node_get(rip
->distance_table
, (struct prefix
*)&prefix
);
195 rn
->info
= rip_distance_new();
196 nb_running_set_entry(args
->dnode
, rn
);
201 int ripd_instance_distance_source_destroy(struct nb_cb_destroy_args
*args
)
203 struct route_node
*rn
;
204 struct rip_distance
*rdistance
;
206 if (args
->event
!= NB_EV_APPLY
)
209 rn
= nb_running_unset_entry(args
->dnode
);
210 rdistance
= rn
->info
;
211 rip_distance_free(rdistance
);
213 route_unlock_node(rn
);
219 * XPath: /frr-ripd:ripd/instance/distance/source/distance
221 int ripd_instance_distance_source_distance_modify(
222 struct nb_cb_modify_args
*args
)
224 struct route_node
*rn
;
226 struct rip_distance
*rdistance
;
228 if (args
->event
!= NB_EV_APPLY
)
231 /* Set distance value. */
232 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
233 distance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
234 rdistance
= rn
->info
;
235 rdistance
->distance
= distance
;
241 * XPath: /frr-ripd:ripd/instance/distance/source/access-list
243 int ripd_instance_distance_source_access_list_modify(
244 struct nb_cb_modify_args
*args
)
246 const char *acl_name
;
247 struct route_node
*rn
;
248 struct rip_distance
*rdistance
;
250 if (args
->event
!= NB_EV_APPLY
)
253 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
255 /* Set access-list */
256 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
257 rdistance
= rn
->info
;
258 if (rdistance
->access_list
)
259 free(rdistance
->access_list
);
260 rdistance
->access_list
= strdup(acl_name
);
265 int ripd_instance_distance_source_access_list_destroy(
266 struct nb_cb_destroy_args
*args
)
268 struct route_node
*rn
;
269 struct rip_distance
*rdistance
;
271 if (args
->event
!= NB_EV_APPLY
)
274 /* Reset access-list configuration. */
275 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
276 rdistance
= rn
->info
;
277 free(rdistance
->access_list
);
278 rdistance
->access_list
= NULL
;
284 * XPath: /frr-ripd:ripd/instance/explicit-neighbor
286 int ripd_instance_explicit_neighbor_create(struct nb_cb_create_args
*args
)
289 struct prefix_ipv4 p
;
291 if (args
->event
!= NB_EV_APPLY
)
294 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
296 p
.prefixlen
= IPV4_MAX_BITLEN
;
297 yang_dnode_get_ipv4(&p
.prefix
, args
->dnode
, NULL
);
299 return rip_neighbor_add(rip
, &p
);
302 int ripd_instance_explicit_neighbor_destroy(struct nb_cb_destroy_args
*args
)
305 struct prefix_ipv4 p
;
307 if (args
->event
!= NB_EV_APPLY
)
310 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
312 p
.prefixlen
= IPV4_MAX_BITLEN
;
313 yang_dnode_get_ipv4(&p
.prefix
, args
->dnode
, NULL
);
315 return rip_neighbor_delete(rip
, &p
);
319 * XPath: /frr-ripd:ripd/instance/network
321 int ripd_instance_network_create(struct nb_cb_create_args
*args
)
326 if (args
->event
!= NB_EV_APPLY
)
329 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
330 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
331 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
333 return rip_enable_network_add(rip
, &p
);
336 int ripd_instance_network_destroy(struct nb_cb_destroy_args
*args
)
341 if (args
->event
!= NB_EV_APPLY
)
344 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
345 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
346 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
348 return rip_enable_network_delete(rip
, &p
);
352 * XPath: /frr-ripd:ripd/instance/interface
354 int ripd_instance_interface_create(struct nb_cb_create_args
*args
)
359 if (args
->event
!= NB_EV_APPLY
)
362 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
363 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
365 return rip_enable_if_add(rip
, ifname
);
368 int ripd_instance_interface_destroy(struct nb_cb_destroy_args
*args
)
373 if (args
->event
!= NB_EV_APPLY
)
376 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
377 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
379 return rip_enable_if_delete(rip
, ifname
);
383 * XPath: /frr-ripd:ripd/instance/offset-list
385 int ripd_instance_offset_list_create(struct nb_cb_create_args
*args
)
389 struct rip_offset_list
*offset
;
391 if (args
->event
!= NB_EV_APPLY
)
394 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
395 ifname
= yang_dnode_get_string(args
->dnode
, "./interface");
397 offset
= rip_offset_list_new(rip
, ifname
);
398 nb_running_set_entry(args
->dnode
, offset
);
403 int ripd_instance_offset_list_destroy(struct nb_cb_destroy_args
*args
)
406 struct rip_offset_list
*offset
;
408 if (args
->event
!= NB_EV_APPLY
)
411 direct
= yang_dnode_get_enum(args
->dnode
, "./direction");
413 offset
= nb_running_unset_entry(args
->dnode
);
414 if (offset
->direct
[direct
].alist_name
) {
415 free(offset
->direct
[direct
].alist_name
);
416 offset
->direct
[direct
].alist_name
= NULL
;
418 if (offset
->direct
[RIP_OFFSET_LIST_IN
].alist_name
== NULL
419 && offset
->direct
[RIP_OFFSET_LIST_OUT
].alist_name
== NULL
)
420 offset_list_del(offset
);
426 * XPath: /frr-ripd:ripd/instance/offset-list/access-list
428 int ripd_instance_offset_list_access_list_modify(struct nb_cb_modify_args
*args
)
431 struct rip_offset_list
*offset
;
432 const char *alist_name
;
434 if (args
->event
!= NB_EV_APPLY
)
437 direct
= yang_dnode_get_enum(args
->dnode
, "../direction");
438 alist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
440 offset
= nb_running_get_entry(args
->dnode
, NULL
, true);
441 if (offset
->direct
[direct
].alist_name
)
442 free(offset
->direct
[direct
].alist_name
);
443 offset
->direct
[direct
].alist_name
= strdup(alist_name
);
449 * XPath: /frr-ripd:ripd/instance/offset-list/metric
451 int ripd_instance_offset_list_metric_modify(struct nb_cb_modify_args
*args
)
455 struct rip_offset_list
*offset
;
457 if (args
->event
!= NB_EV_APPLY
)
460 direct
= yang_dnode_get_enum(args
->dnode
, "../direction");
461 metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
463 offset
= nb_running_get_entry(args
->dnode
, NULL
, true);
464 offset
->direct
[direct
].metric
= metric
;
470 * XPath: /frr-ripd:ripd/instance/passive-default
472 int ripd_instance_passive_default_modify(struct nb_cb_modify_args
*args
)
476 if (args
->event
!= NB_EV_APPLY
)
479 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
480 rip
->passive_default
= yang_dnode_get_bool(args
->dnode
, NULL
);
481 rip_passive_nondefault_clean(rip
);
487 * XPath: /frr-ripd:ripd/instance/passive-interface
489 int ripd_instance_passive_interface_create(struct nb_cb_create_args
*args
)
494 if (args
->event
!= NB_EV_APPLY
)
497 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
498 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
500 return rip_passive_nondefault_set(rip
, ifname
);
503 int ripd_instance_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
508 if (args
->event
!= NB_EV_APPLY
)
511 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
512 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
514 return rip_passive_nondefault_unset(rip
, ifname
);
518 * XPath: /frr-ripd:ripd/instance/non-passive-interface
520 int ripd_instance_non_passive_interface_create(struct nb_cb_create_args
*args
)
525 if (args
->event
!= NB_EV_APPLY
)
528 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
529 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
531 return rip_passive_nondefault_set(rip
, ifname
);
534 int ripd_instance_non_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
539 if (args
->event
!= NB_EV_APPLY
)
542 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
543 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
545 return rip_passive_nondefault_unset(rip
, ifname
);
549 * XPath: /frr-ripd:ripd/instance/redistribute
551 int ripd_instance_redistribute_create(struct nb_cb_create_args
*args
)
556 if (args
->event
!= NB_EV_APPLY
)
559 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
560 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
562 rip
->redist
[type
].enabled
= true;
567 int ripd_instance_redistribute_destroy(struct nb_cb_destroy_args
*args
)
572 if (args
->event
!= NB_EV_APPLY
)
575 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
576 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
578 rip
->redist
[type
].enabled
= false;
579 if (rip
->redist
[type
].route_map
.name
) {
580 free(rip
->redist
[type
].route_map
.name
);
581 rip
->redist
[type
].route_map
.name
= NULL
;
582 rip
->redist
[type
].route_map
.map
= NULL
;
584 rip
->redist
[type
].metric_config
= false;
585 rip
->redist
[type
].metric
= 0;
588 rip_redistribute_conf_delete(rip
, type
);
593 void ripd_instance_redistribute_apply_finish(
594 struct nb_cb_apply_finish_args
*args
)
599 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
600 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
603 rip_redistribute_conf_update(rip
, type
);
607 * XPath: /frr-ripd:ripd/instance/redistribute/route-map
609 int ripd_instance_redistribute_route_map_modify(struct nb_cb_modify_args
*args
)
613 const char *rmap_name
;
615 if (args
->event
!= NB_EV_APPLY
)
618 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
619 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
620 rmap_name
= yang_dnode_get_string(args
->dnode
, NULL
);
622 if (rip
->redist
[type
].route_map
.name
)
623 free(rip
->redist
[type
].route_map
.name
);
624 rip
->redist
[type
].route_map
.name
= strdup(rmap_name
);
625 rip
->redist
[type
].route_map
.map
= route_map_lookup_by_name(rmap_name
);
630 int ripd_instance_redistribute_route_map_destroy(
631 struct nb_cb_destroy_args
*args
)
636 if (args
->event
!= NB_EV_APPLY
)
639 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
640 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
642 free(rip
->redist
[type
].route_map
.name
);
643 rip
->redist
[type
].route_map
.name
= NULL
;
644 rip
->redist
[type
].route_map
.map
= NULL
;
650 * XPath: /frr-ripd:ripd/instance/redistribute/metric
652 int ripd_instance_redistribute_metric_modify(struct nb_cb_modify_args
*args
)
658 if (args
->event
!= NB_EV_APPLY
)
661 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
662 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
663 metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
665 rip
->redist
[type
].metric_config
= true;
666 rip
->redist
[type
].metric
= metric
;
671 int ripd_instance_redistribute_metric_destroy(struct nb_cb_destroy_args
*args
)
676 if (args
->event
!= NB_EV_APPLY
)
679 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
680 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
682 rip
->redist
[type
].metric_config
= false;
683 rip
->redist
[type
].metric
= 0;
689 * XPath: /frr-ripd:ripd/instance/if-route-maps/if-route-map
691 int ripd_instance_if_route_maps_if_route_map_create(
692 struct nb_cb_create_args
*args
)
694 /* if_rmap is created when first routemap is added */
698 int ripd_instance_if_route_maps_if_route_map_destroy(
699 struct nb_cb_destroy_args
*args
)
703 if (args
->event
!= NB_EV_APPLY
)
707 * YANG will prune edit deletes up to the most general deleted node so
708 * we need to handle deleting any existing state underneath and not
709 * count on those more specific callbacks being called individually.
712 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
713 if_rmap_yang_destroy_cb(rip
->if_rmap_ctx
, args
->dnode
);
718 static void if_route_map_modify(const struct lyd_node
*dnode
,
719 enum if_rmap_type type
, bool delete)
721 struct rip
*rip
= nb_running_get_entry(dnode
, NULL
, true);
723 if_rmap_yang_modify_cb(rip
->if_rmap_ctx
, dnode
, type
, delete);
727 * XPath: /frr-ripd:ripd/instance/if-route-maps/if-route-map/in-route-map
729 int ripd_instance_if_route_maps_if_route_map_in_route_map_modify(
730 struct nb_cb_modify_args
*args
)
732 if (args
->event
!= NB_EV_APPLY
)
735 if_route_map_modify(args
->dnode
, IF_RMAP_IN
, false);
740 int ripd_instance_if_route_maps_if_route_map_in_route_map_destroy(
741 struct nb_cb_destroy_args
*args
)
743 if (args
->event
!= NB_EV_APPLY
)
746 if_route_map_modify(args
->dnode
, IF_RMAP_IN
, true);
752 * XPath: /frr-ripd:ripd/instance/if-route-maps/if-route-map/out-route-map
754 int ripd_instance_if_route_maps_if_route_map_out_route_map_modify(
755 struct nb_cb_modify_args
*args
)
757 if (args
->event
!= NB_EV_APPLY
)
760 if_route_map_modify(args
->dnode
, IF_RMAP_OUT
, false);
765 int ripd_instance_if_route_maps_if_route_map_out_route_map_destroy(
766 struct nb_cb_destroy_args
*args
)
768 if (args
->event
!= NB_EV_APPLY
)
771 if_route_map_modify(args
->dnode
, IF_RMAP_OUT
, true);
777 * XPath: /frr-ripd:ripd/instance/static-route
779 int ripd_instance_static_route_create(struct nb_cb_create_args
*args
)
783 struct prefix_ipv4 p
;
785 if (args
->event
!= NB_EV_APPLY
)
788 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
789 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
792 memset(&nh
, 0, sizeof(nh
));
793 nh
.type
= NEXTHOP_TYPE_IPV4
;
794 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, &nh
, 0,
800 int ripd_instance_static_route_destroy(struct nb_cb_destroy_args
*args
)
803 struct prefix_ipv4 p
;
805 if (args
->event
!= NB_EV_APPLY
)
808 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
809 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
812 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, 0);
818 * XPath: /frr-ripd:ripd/instance/timers/
820 void ripd_instance_timers_apply_finish(struct nb_cb_apply_finish_args
*args
)
824 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
826 /* Reset update timer thread. */
827 rip_event(rip
, RIP_UPDATE_EVENT
, 0);
831 * XPath: /frr-ripd:ripd/instance/timers/flush-interval
833 int ripd_instance_timers_flush_interval_modify(struct nb_cb_modify_args
*args
)
837 if (args
->event
!= NB_EV_APPLY
)
840 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
841 rip
->garbage_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
847 * XPath: /frr-ripd:ripd/instance/timers/holddown-interval
849 int ripd_instance_timers_holddown_interval_modify(
850 struct nb_cb_modify_args
*args
)
854 if (args
->event
!= NB_EV_APPLY
)
857 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
858 rip
->timeout_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
864 * XPath: /frr-ripd:ripd/instance/timers/update-interval
866 int ripd_instance_timers_update_interval_modify(struct nb_cb_modify_args
*args
)
870 if (args
->event
!= NB_EV_APPLY
)
873 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
874 rip
->update_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
880 * XPath: /frr-ripd:ripd/instance/version/receive
882 int ripd_instance_version_receive_modify(struct nb_cb_modify_args
*args
)
886 if (args
->event
!= NB_EV_APPLY
)
889 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
890 rip
->version_recv
= yang_dnode_get_enum(args
->dnode
, NULL
);
896 * XPath: /frr-ripd:ripd/instance/version/send
898 int ripd_instance_version_send_modify(struct nb_cb_modify_args
*args
)
902 if (args
->event
!= NB_EV_APPLY
)
905 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
906 rip
->version_send
= yang_dnode_get_enum(args
->dnode
, NULL
);
912 * XPath: /frr-ripd:ripd/instance/default-bfd-profile
914 int ripd_instance_default_bfd_profile_modify(struct nb_cb_modify_args
*args
)
918 if (args
->event
!= NB_EV_APPLY
)
921 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
922 XFREE(MTYPE_RIP_BFD_PROFILE
, rip
->default_bfd_profile
);
923 rip
->default_bfd_profile
=
924 XSTRDUP(MTYPE_RIP_BFD_PROFILE
,
925 yang_dnode_get_string(args
->dnode
, NULL
));
926 rip_bfd_instance_update(rip
);
931 int ripd_instance_default_bfd_profile_destroy(struct nb_cb_destroy_args
*args
)
935 if (args
->event
!= NB_EV_APPLY
)
938 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
939 XFREE(MTYPE_RIP_BFD_PROFILE
, rip
->default_bfd_profile
);
940 rip_bfd_instance_update(rip
);
946 * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon
948 int lib_interface_rip_split_horizon_modify(struct nb_cb_modify_args
*args
)
950 struct interface
*ifp
;
951 struct rip_interface
*ri
;
953 if (args
->event
!= NB_EV_APPLY
)
956 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
958 ri
->split_horizon
= yang_dnode_get_enum(args
->dnode
, NULL
);
964 * XPath: /frr-interface:lib/interface/frr-ripd:rip/v2-broadcast
966 int lib_interface_rip_v2_broadcast_modify(struct nb_cb_modify_args
*args
)
968 struct interface
*ifp
;
969 struct rip_interface
*ri
;
971 if (args
->event
!= NB_EV_APPLY
)
974 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
976 ri
->v2_broadcast
= yang_dnode_get_bool(args
->dnode
, NULL
);
982 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-receive
984 int lib_interface_rip_version_receive_modify(struct nb_cb_modify_args
*args
)
986 struct interface
*ifp
;
987 struct rip_interface
*ri
;
989 if (args
->event
!= NB_EV_APPLY
)
992 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
994 ri
->ri_receive
= yang_dnode_get_enum(args
->dnode
, NULL
);
1000 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-send
1002 int lib_interface_rip_version_send_modify(struct nb_cb_modify_args
*args
)
1004 struct interface
*ifp
;
1005 struct rip_interface
*ri
;
1007 if (args
->event
!= NB_EV_APPLY
)
1010 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1012 ri
->ri_send
= yang_dnode_get_enum(args
->dnode
, NULL
);
1018 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/mode
1020 int lib_interface_rip_authentication_scheme_mode_modify(
1021 struct nb_cb_modify_args
*args
)
1023 struct interface
*ifp
;
1024 struct rip_interface
*ri
;
1026 if (args
->event
!= NB_EV_APPLY
)
1029 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1031 ri
->auth_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1038 * /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/md5-auth-length
1040 int lib_interface_rip_authentication_scheme_md5_auth_length_modify(
1041 struct nb_cb_modify_args
*args
)
1043 struct interface
*ifp
;
1044 struct rip_interface
*ri
;
1046 if (args
->event
!= NB_EV_APPLY
)
1049 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1051 ri
->md5_auth_len
= yang_dnode_get_enum(args
->dnode
, NULL
);
1056 int lib_interface_rip_authentication_scheme_md5_auth_length_destroy(
1057 struct nb_cb_destroy_args
*args
)
1059 struct interface
*ifp
;
1060 struct rip_interface
*ri
;
1062 if (args
->event
!= NB_EV_APPLY
)
1065 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1067 ri
->md5_auth_len
= yang_get_default_enum(
1068 "%s/authentication-scheme/md5-auth-length", RIP_IFACE
);
1074 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-password
1076 int lib_interface_rip_authentication_password_modify(
1077 struct nb_cb_modify_args
*args
)
1079 struct interface
*ifp
;
1080 struct rip_interface
*ri
;
1082 if (args
->event
!= NB_EV_APPLY
)
1085 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1087 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
1088 ri
->auth_str
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
1089 yang_dnode_get_string(args
->dnode
, NULL
));
1094 int lib_interface_rip_authentication_password_destroy(
1095 struct nb_cb_destroy_args
*args
)
1097 struct interface
*ifp
;
1098 struct rip_interface
*ri
;
1100 if (args
->event
!= NB_EV_APPLY
)
1103 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1105 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
1111 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring
1113 int lib_interface_rip_bfd_create(struct nb_cb_create_args
*args
)
1115 struct interface
*ifp
;
1116 struct rip_interface
*ri
;
1118 if (args
->event
!= NB_EV_APPLY
)
1121 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1123 ri
->bfd
.enabled
= yang_dnode_get_bool(args
->dnode
, "./enable");
1124 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1125 if (yang_dnode_exists(args
->dnode
, "./profile"))
1126 ri
->bfd
.profile
= XSTRDUP(
1127 MTYPE_RIP_BFD_PROFILE
,
1128 yang_dnode_get_string(args
->dnode
, "./profile"));
1130 rip_bfd_interface_update(ri
);
1135 int lib_interface_rip_bfd_destroy(struct nb_cb_destroy_args
*args
)
1137 struct interface
*ifp
;
1138 struct rip_interface
*ri
;
1140 if (args
->event
!= NB_EV_APPLY
)
1143 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1145 ri
->bfd
.enabled
= false;
1146 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1147 rip_bfd_interface_update(ri
);
1153 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/enable
1155 int lib_interface_rip_bfd_enable_modify(struct nb_cb_modify_args
*args
)
1157 struct interface
*ifp
;
1158 struct rip_interface
*ri
;
1160 if (args
->event
!= NB_EV_APPLY
)
1163 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1165 ri
->bfd
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
1166 rip_bfd_interface_update(ri
);
1172 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/profile
1174 int lib_interface_rip_bfd_profile_modify(struct nb_cb_modify_args
*args
)
1176 struct interface
*ifp
;
1177 struct rip_interface
*ri
;
1179 if (args
->event
!= NB_EV_APPLY
)
1182 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1184 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1185 ri
->bfd
.profile
= XSTRDUP(MTYPE_RIP_BFD_PROFILE
,
1186 yang_dnode_get_string(args
->dnode
, NULL
));
1187 rip_bfd_interface_update(ri
);
1192 int lib_interface_rip_bfd_profile_destroy(struct nb_cb_destroy_args
*args
)
1194 struct interface
*ifp
;
1195 struct rip_interface
*ri
;
1197 if (args
->event
!= NB_EV_APPLY
)
1200 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1202 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1203 rip_bfd_interface_update(ri
);
1209 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain
1211 int lib_interface_rip_authentication_key_chain_modify(
1212 struct nb_cb_modify_args
*args
)
1214 struct interface
*ifp
;
1215 struct rip_interface
*ri
;
1217 if (args
->event
!= NB_EV_APPLY
)
1220 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1222 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);
1223 ri
->key_chain
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
1224 yang_dnode_get_string(args
->dnode
, NULL
));
1229 int lib_interface_rip_authentication_key_chain_destroy(
1230 struct nb_cb_destroy_args
*args
)
1232 struct interface
*ifp
;
1233 struct rip_interface
*ri
;
1235 if (args
->event
!= NB_EV_APPLY
)
1238 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1240 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);