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"
29 * XPath: /frr-ripd:ripd/instance
31 int ripd_instance_create(struct nb_cb_create_args
*args
)
38 vrf_name
= yang_dnode_get_string(args
->dnode
, "./vrf");
39 vrf
= vrf_lookup_by_name(vrf_name
);
42 * Try to create a RIP socket only if the VRF is enabled, otherwise
43 * create a disabled RIP instance and wait for the VRF to be enabled.
45 switch (args
->event
) {
49 if (!vrf
|| !vrf_is_enabled(vrf
))
52 socket
= rip_create_socket(vrf
);
54 return NB_ERR_RESOURCE
;
55 args
->resource
->fd
= socket
;
58 if (!vrf
|| !vrf_is_enabled(vrf
))
61 socket
= args
->resource
->fd
;
65 if (vrf
&& vrf_is_enabled(vrf
))
66 socket
= args
->resource
->fd
;
70 rip
= rip_create(vrf_name
, vrf
, socket
);
71 nb_running_set_entry(args
->dnode
, rip
);
78 int ripd_instance_destroy(struct nb_cb_destroy_args
*args
)
82 if (args
->event
!= NB_EV_APPLY
)
85 rip
= nb_running_unset_entry(args
->dnode
);
92 * XPath: /frr-ripd:ripd/instance/allow-ecmp
94 int ripd_instance_allow_ecmp_modify(struct nb_cb_modify_args
*args
)
98 if (args
->event
!= NB_EV_APPLY
)
101 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
102 rip
->ecmp
= yang_dnode_get_uint8(args
->dnode
, NULL
);
104 rip_ecmp_disable(rip
);
108 rip_ecmp_change(rip
);
114 * XPath: /frr-ripd:ripd/instance/default-information-originate
116 int ripd_instance_default_information_originate_modify(
117 struct nb_cb_modify_args
*args
)
120 bool default_information
;
121 struct prefix_ipv4 p
;
123 if (args
->event
!= NB_EV_APPLY
)
126 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
127 default_information
= yang_dnode_get_bool(args
->dnode
, NULL
);
129 memset(&p
, 0, sizeof(p
));
131 if (default_information
) {
134 memset(&nh
, 0, sizeof(nh
));
135 nh
.type
= NEXTHOP_TYPE_IPV4
;
136 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
139 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_DEFAULT
,
147 * XPath: /frr-ripd:ripd/instance/default-metric
149 int ripd_instance_default_metric_modify(struct nb_cb_modify_args
*args
)
153 if (args
->event
!= NB_EV_APPLY
)
156 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
157 rip
->default_metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
158 /* rip_update_default_metric (); */
164 * XPath: /frr-ripd:ripd/instance/distance/default
166 int ripd_instance_distance_default_modify(struct nb_cb_modify_args
*args
)
170 if (args
->event
!= NB_EV_APPLY
)
173 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
174 rip
->distance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
180 * XPath: /frr-ripd:ripd/instance/distance/source
182 int ripd_instance_distance_source_create(struct nb_cb_create_args
*args
)
185 struct prefix_ipv4 prefix
;
186 struct route_node
*rn
;
188 if (args
->event
!= NB_EV_APPLY
)
191 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, "./prefix");
192 apply_mask_ipv4(&prefix
);
194 /* Get RIP distance node. */
195 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
196 rn
= route_node_get(rip
->distance_table
, (struct prefix
*)&prefix
);
197 rn
->info
= rip_distance_new();
198 nb_running_set_entry(args
->dnode
, rn
);
203 int ripd_instance_distance_source_destroy(struct nb_cb_destroy_args
*args
)
205 struct route_node
*rn
;
206 struct rip_distance
*rdistance
;
208 if (args
->event
!= NB_EV_APPLY
)
211 rn
= nb_running_unset_entry(args
->dnode
);
212 rdistance
= rn
->info
;
213 rip_distance_free(rdistance
);
215 route_unlock_node(rn
);
221 * XPath: /frr-ripd:ripd/instance/distance/source/distance
223 int ripd_instance_distance_source_distance_modify(
224 struct nb_cb_modify_args
*args
)
226 struct route_node
*rn
;
228 struct rip_distance
*rdistance
;
230 if (args
->event
!= NB_EV_APPLY
)
233 /* Set distance value. */
234 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
235 distance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
236 rdistance
= rn
->info
;
237 rdistance
->distance
= distance
;
243 * XPath: /frr-ripd:ripd/instance/distance/source/access-list
245 int ripd_instance_distance_source_access_list_modify(
246 struct nb_cb_modify_args
*args
)
248 const char *acl_name
;
249 struct route_node
*rn
;
250 struct rip_distance
*rdistance
;
252 if (args
->event
!= NB_EV_APPLY
)
255 acl_name
= yang_dnode_get_string(args
->dnode
, NULL
);
257 /* Set access-list */
258 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
259 rdistance
= rn
->info
;
260 if (rdistance
->access_list
)
261 free(rdistance
->access_list
);
262 rdistance
->access_list
= strdup(acl_name
);
267 int ripd_instance_distance_source_access_list_destroy(
268 struct nb_cb_destroy_args
*args
)
270 struct route_node
*rn
;
271 struct rip_distance
*rdistance
;
273 if (args
->event
!= NB_EV_APPLY
)
276 /* Reset access-list configuration. */
277 rn
= nb_running_get_entry(args
->dnode
, NULL
, true);
278 rdistance
= rn
->info
;
279 free(rdistance
->access_list
);
280 rdistance
->access_list
= NULL
;
286 * XPath: /frr-ripd:ripd/instance/explicit-neighbor
288 int ripd_instance_explicit_neighbor_create(struct nb_cb_create_args
*args
)
291 struct prefix_ipv4 p
;
293 if (args
->event
!= NB_EV_APPLY
)
296 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
298 p
.prefixlen
= IPV4_MAX_BITLEN
;
299 yang_dnode_get_ipv4(&p
.prefix
, args
->dnode
, NULL
);
301 return rip_neighbor_add(rip
, &p
);
304 int ripd_instance_explicit_neighbor_destroy(struct nb_cb_destroy_args
*args
)
307 struct prefix_ipv4 p
;
309 if (args
->event
!= NB_EV_APPLY
)
312 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
314 p
.prefixlen
= IPV4_MAX_BITLEN
;
315 yang_dnode_get_ipv4(&p
.prefix
, args
->dnode
, NULL
);
317 return rip_neighbor_delete(rip
, &p
);
321 * XPath: /frr-ripd:ripd/instance/network
323 int ripd_instance_network_create(struct nb_cb_create_args
*args
)
328 if (args
->event
!= NB_EV_APPLY
)
331 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
332 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
333 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
335 return rip_enable_network_add(rip
, &p
);
338 int ripd_instance_network_destroy(struct nb_cb_destroy_args
*args
)
343 if (args
->event
!= NB_EV_APPLY
)
346 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
347 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
348 apply_mask_ipv4((struct prefix_ipv4
*)&p
);
350 return rip_enable_network_delete(rip
, &p
);
354 * XPath: /frr-ripd:ripd/instance/interface
356 int ripd_instance_interface_create(struct nb_cb_create_args
*args
)
361 if (args
->event
!= NB_EV_APPLY
)
364 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
365 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
367 return rip_enable_if_add(rip
, ifname
);
370 int ripd_instance_interface_destroy(struct nb_cb_destroy_args
*args
)
375 if (args
->event
!= NB_EV_APPLY
)
378 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
379 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
381 return rip_enable_if_delete(rip
, ifname
);
385 * XPath: /frr-ripd:ripd/instance/offset-list
387 int ripd_instance_offset_list_create(struct nb_cb_create_args
*args
)
391 struct rip_offset_list
*offset
;
393 if (args
->event
!= NB_EV_APPLY
)
396 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
397 ifname
= yang_dnode_get_string(args
->dnode
, "./interface");
399 offset
= rip_offset_list_new(rip
, ifname
);
400 nb_running_set_entry(args
->dnode
, offset
);
405 int ripd_instance_offset_list_destroy(struct nb_cb_destroy_args
*args
)
408 struct rip_offset_list
*offset
;
410 if (args
->event
!= NB_EV_APPLY
)
413 direct
= yang_dnode_get_enum(args
->dnode
, "./direction");
415 offset
= nb_running_unset_entry(args
->dnode
);
416 if (offset
->direct
[direct
].alist_name
) {
417 free(offset
->direct
[direct
].alist_name
);
418 offset
->direct
[direct
].alist_name
= NULL
;
420 if (offset
->direct
[RIP_OFFSET_LIST_IN
].alist_name
== NULL
421 && offset
->direct
[RIP_OFFSET_LIST_OUT
].alist_name
== NULL
)
422 offset_list_del(offset
);
428 * XPath: /frr-ripd:ripd/instance/offset-list/access-list
430 int ripd_instance_offset_list_access_list_modify(struct nb_cb_modify_args
*args
)
433 struct rip_offset_list
*offset
;
434 const char *alist_name
;
436 if (args
->event
!= NB_EV_APPLY
)
439 direct
= yang_dnode_get_enum(args
->dnode
, "../direction");
440 alist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
442 offset
= nb_running_get_entry(args
->dnode
, NULL
, true);
443 if (offset
->direct
[direct
].alist_name
)
444 free(offset
->direct
[direct
].alist_name
);
445 offset
->direct
[direct
].alist_name
= strdup(alist_name
);
451 * XPath: /frr-ripd:ripd/instance/offset-list/metric
453 int ripd_instance_offset_list_metric_modify(struct nb_cb_modify_args
*args
)
457 struct rip_offset_list
*offset
;
459 if (args
->event
!= NB_EV_APPLY
)
462 direct
= yang_dnode_get_enum(args
->dnode
, "../direction");
463 metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
465 offset
= nb_running_get_entry(args
->dnode
, NULL
, true);
466 offset
->direct
[direct
].metric
= metric
;
472 * XPath: /frr-ripd:ripd/instance/passive-default
474 int ripd_instance_passive_default_modify(struct nb_cb_modify_args
*args
)
478 if (args
->event
!= NB_EV_APPLY
)
481 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
482 rip
->passive_default
= yang_dnode_get_bool(args
->dnode
, NULL
);
483 rip_passive_nondefault_clean(rip
);
489 * XPath: /frr-ripd:ripd/instance/passive-interface
491 int ripd_instance_passive_interface_create(struct nb_cb_create_args
*args
)
496 if (args
->event
!= NB_EV_APPLY
)
499 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
500 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
502 return rip_passive_nondefault_set(rip
, ifname
);
505 int ripd_instance_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
510 if (args
->event
!= NB_EV_APPLY
)
513 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
514 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
516 return rip_passive_nondefault_unset(rip
, ifname
);
520 * XPath: /frr-ripd:ripd/instance/non-passive-interface
522 int ripd_instance_non_passive_interface_create(struct nb_cb_create_args
*args
)
527 if (args
->event
!= NB_EV_APPLY
)
530 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
531 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
533 return rip_passive_nondefault_set(rip
, ifname
);
536 int ripd_instance_non_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
541 if (args
->event
!= NB_EV_APPLY
)
544 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
545 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
547 return rip_passive_nondefault_unset(rip
, ifname
);
551 * XPath: /frr-ripd:ripd/instance/redistribute
553 int ripd_instance_redistribute_create(struct nb_cb_create_args
*args
)
558 if (args
->event
!= NB_EV_APPLY
)
561 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
562 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
564 rip
->redist
[type
].enabled
= true;
569 int ripd_instance_redistribute_destroy(struct nb_cb_destroy_args
*args
)
574 if (args
->event
!= NB_EV_APPLY
)
577 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
578 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
580 rip
->redist
[type
].enabled
= false;
581 if (rip
->redist
[type
].route_map
.name
) {
582 free(rip
->redist
[type
].route_map
.name
);
583 rip
->redist
[type
].route_map
.name
= NULL
;
584 rip
->redist
[type
].route_map
.map
= NULL
;
586 rip
->redist
[type
].metric_config
= false;
587 rip
->redist
[type
].metric
= 0;
590 rip_redistribute_conf_delete(rip
, type
);
595 void ripd_instance_redistribute_apply_finish(
596 struct nb_cb_apply_finish_args
*args
)
601 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
602 type
= yang_dnode_get_enum(args
->dnode
, "./protocol");
605 rip_redistribute_conf_update(rip
, type
);
609 * XPath: /frr-ripd:ripd/instance/redistribute/route-map
611 int ripd_instance_redistribute_route_map_modify(struct nb_cb_modify_args
*args
)
615 const char *rmap_name
;
617 if (args
->event
!= NB_EV_APPLY
)
620 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
621 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
622 rmap_name
= yang_dnode_get_string(args
->dnode
, NULL
);
624 if (rip
->redist
[type
].route_map
.name
)
625 free(rip
->redist
[type
].route_map
.name
);
626 rip
->redist
[type
].route_map
.name
= strdup(rmap_name
);
627 rip
->redist
[type
].route_map
.map
= route_map_lookup_by_name(rmap_name
);
632 int ripd_instance_redistribute_route_map_destroy(
633 struct nb_cb_destroy_args
*args
)
638 if (args
->event
!= NB_EV_APPLY
)
641 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
642 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
644 free(rip
->redist
[type
].route_map
.name
);
645 rip
->redist
[type
].route_map
.name
= NULL
;
646 rip
->redist
[type
].route_map
.map
= NULL
;
652 * XPath: /frr-ripd:ripd/instance/redistribute/metric
654 int ripd_instance_redistribute_metric_modify(struct nb_cb_modify_args
*args
)
660 if (args
->event
!= NB_EV_APPLY
)
663 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
664 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
665 metric
= yang_dnode_get_uint8(args
->dnode
, NULL
);
667 rip
->redist
[type
].metric_config
= true;
668 rip
->redist
[type
].metric
= metric
;
673 int ripd_instance_redistribute_metric_destroy(struct nb_cb_destroy_args
*args
)
678 if (args
->event
!= NB_EV_APPLY
)
681 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
682 type
= yang_dnode_get_enum(args
->dnode
, "../protocol");
684 rip
->redist
[type
].metric_config
= false;
685 rip
->redist
[type
].metric
= 0;
691 * XPath: /frr-ripd:ripd/instance/if-route-maps/if-route-map
693 int ripd_instance_if_route_maps_if_route_map_create(
694 struct nb_cb_create_args
*args
)
696 /* if_rmap is created when first routemap is added */
700 int ripd_instance_if_route_maps_if_route_map_destroy(
701 struct nb_cb_destroy_args
*args
)
705 if (args
->event
!= NB_EV_APPLY
)
709 * YANG will prune edit deletes up to the most general deleted node so
710 * we need to handle deleting any existing state underneath and not
711 * count on those more specific callbacks being called individually.
714 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
715 if_rmap_yang_destroy_cb(rip
->if_rmap_ctx
, args
->dnode
);
720 static void if_route_map_modify(const struct lyd_node
*dnode
,
721 enum if_rmap_type type
, bool delete)
723 struct rip
*rip
= nb_running_get_entry(dnode
, NULL
, true);
725 if_rmap_yang_modify_cb(rip
->if_rmap_ctx
, dnode
, type
, delete);
729 * XPath: /frr-ripd:ripd/instance/if-route-maps/if-route-map/in-route-map
731 int ripd_instance_if_route_maps_if_route_map_in_route_map_modify(
732 struct nb_cb_modify_args
*args
)
734 if (args
->event
!= NB_EV_APPLY
)
737 if_route_map_modify(args
->dnode
, IF_RMAP_IN
, false);
742 int ripd_instance_if_route_maps_if_route_map_in_route_map_destroy(
743 struct nb_cb_destroy_args
*args
)
745 if (args
->event
!= NB_EV_APPLY
)
748 if_route_map_modify(args
->dnode
, IF_RMAP_IN
, true);
754 * XPath: /frr-ripd:ripd/instance/if-route-maps/if-route-map/out-route-map
756 int ripd_instance_if_route_maps_if_route_map_out_route_map_modify(
757 struct nb_cb_modify_args
*args
)
759 if (args
->event
!= NB_EV_APPLY
)
762 if_route_map_modify(args
->dnode
, IF_RMAP_OUT
, false);
767 int ripd_instance_if_route_maps_if_route_map_out_route_map_destroy(
768 struct nb_cb_destroy_args
*args
)
770 if (args
->event
!= NB_EV_APPLY
)
773 if_route_map_modify(args
->dnode
, IF_RMAP_OUT
, true);
779 * XPath: /frr-ripd:ripd/instance/static-route
781 int ripd_instance_static_route_create(struct nb_cb_create_args
*args
)
785 struct prefix_ipv4 p
;
787 if (args
->event
!= NB_EV_APPLY
)
790 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
791 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
794 memset(&nh
, 0, sizeof(nh
));
795 nh
.type
= NEXTHOP_TYPE_IPV4
;
796 rip_redistribute_add(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, &nh
, 0,
802 int ripd_instance_static_route_destroy(struct nb_cb_destroy_args
*args
)
805 struct prefix_ipv4 p
;
807 if (args
->event
!= NB_EV_APPLY
)
810 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
811 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
814 rip_redistribute_delete(rip
, ZEBRA_ROUTE_RIP
, RIP_ROUTE_STATIC
, &p
, 0);
820 * XPath: /frr-ripd:ripd/instance/timers/
822 void ripd_instance_timers_apply_finish(struct nb_cb_apply_finish_args
*args
)
826 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
828 /* Reset update timer thread. */
829 rip_event(rip
, RIP_UPDATE_EVENT
, 0);
833 * XPath: /frr-ripd:ripd/instance/timers/flush-interval
835 int ripd_instance_timers_flush_interval_modify(struct nb_cb_modify_args
*args
)
839 if (args
->event
!= NB_EV_APPLY
)
842 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
843 rip
->garbage_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
849 * XPath: /frr-ripd:ripd/instance/timers/holddown-interval
851 int ripd_instance_timers_holddown_interval_modify(
852 struct nb_cb_modify_args
*args
)
856 if (args
->event
!= NB_EV_APPLY
)
859 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
860 rip
->timeout_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
866 * XPath: /frr-ripd:ripd/instance/timers/update-interval
868 int ripd_instance_timers_update_interval_modify(struct nb_cb_modify_args
*args
)
872 if (args
->event
!= NB_EV_APPLY
)
875 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
876 rip
->update_time
= yang_dnode_get_uint32(args
->dnode
, NULL
);
882 * XPath: /frr-ripd:ripd/instance/version/receive
884 int ripd_instance_version_receive_modify(struct nb_cb_modify_args
*args
)
888 if (args
->event
!= NB_EV_APPLY
)
891 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
892 rip
->version_recv
= yang_dnode_get_enum(args
->dnode
, NULL
);
898 * XPath: /frr-ripd:ripd/instance/version/send
900 int ripd_instance_version_send_modify(struct nb_cb_modify_args
*args
)
904 if (args
->event
!= NB_EV_APPLY
)
907 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
908 rip
->version_send
= yang_dnode_get_enum(args
->dnode
, NULL
);
914 * XPath: /frr-ripd:ripd/instance/default-bfd-profile
916 int ripd_instance_default_bfd_profile_modify(struct nb_cb_modify_args
*args
)
920 if (args
->event
!= NB_EV_APPLY
)
923 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
924 XFREE(MTYPE_RIP_BFD_PROFILE
, rip
->default_bfd_profile
);
925 rip
->default_bfd_profile
=
926 XSTRDUP(MTYPE_RIP_BFD_PROFILE
,
927 yang_dnode_get_string(args
->dnode
, NULL
));
928 rip_bfd_instance_update(rip
);
933 int ripd_instance_default_bfd_profile_destroy(struct nb_cb_destroy_args
*args
)
937 if (args
->event
!= NB_EV_APPLY
)
940 rip
= nb_running_get_entry(args
->dnode
, NULL
, true);
941 XFREE(MTYPE_RIP_BFD_PROFILE
, rip
->default_bfd_profile
);
942 rip_bfd_instance_update(rip
);
948 * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon
950 int lib_interface_rip_split_horizon_modify(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 ri
->split_horizon
= yang_dnode_get_enum(args
->dnode
, NULL
);
966 * XPath: /frr-interface:lib/interface/frr-ripd:rip/v2-broadcast
968 int lib_interface_rip_v2_broadcast_modify(struct nb_cb_modify_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 ri
->v2_broadcast
= yang_dnode_get_bool(args
->dnode
, NULL
);
984 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-receive
986 int lib_interface_rip_version_receive_modify(struct nb_cb_modify_args
*args
)
988 struct interface
*ifp
;
989 struct rip_interface
*ri
;
991 if (args
->event
!= NB_EV_APPLY
)
994 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
996 ri
->ri_receive
= yang_dnode_get_enum(args
->dnode
, NULL
);
1002 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-send
1004 int lib_interface_rip_version_send_modify(struct nb_cb_modify_args
*args
)
1006 struct interface
*ifp
;
1007 struct rip_interface
*ri
;
1009 if (args
->event
!= NB_EV_APPLY
)
1012 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1014 ri
->ri_send
= yang_dnode_get_enum(args
->dnode
, NULL
);
1020 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/mode
1022 int lib_interface_rip_authentication_scheme_mode_modify(
1023 struct nb_cb_modify_args
*args
)
1025 struct interface
*ifp
;
1026 struct rip_interface
*ri
;
1028 if (args
->event
!= NB_EV_APPLY
)
1031 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1033 ri
->auth_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1040 * /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/md5-auth-length
1042 int lib_interface_rip_authentication_scheme_md5_auth_length_modify(
1043 struct nb_cb_modify_args
*args
)
1045 struct interface
*ifp
;
1046 struct rip_interface
*ri
;
1048 if (args
->event
!= NB_EV_APPLY
)
1051 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1053 ri
->md5_auth_len
= yang_dnode_get_enum(args
->dnode
, NULL
);
1058 int lib_interface_rip_authentication_scheme_md5_auth_length_destroy(
1059 struct nb_cb_destroy_args
*args
)
1061 struct interface
*ifp
;
1062 struct rip_interface
*ri
;
1064 if (args
->event
!= NB_EV_APPLY
)
1067 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1069 ri
->md5_auth_len
= yang_get_default_enum(
1070 "%s/authentication-scheme/md5-auth-length", RIP_IFACE
);
1076 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-password
1078 int lib_interface_rip_authentication_password_modify(
1079 struct nb_cb_modify_args
*args
)
1081 struct interface
*ifp
;
1082 struct rip_interface
*ri
;
1084 if (args
->event
!= NB_EV_APPLY
)
1087 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1089 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
1090 ri
->auth_str
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
1091 yang_dnode_get_string(args
->dnode
, NULL
));
1096 int lib_interface_rip_authentication_password_destroy(
1097 struct nb_cb_destroy_args
*args
)
1099 struct interface
*ifp
;
1100 struct rip_interface
*ri
;
1102 if (args
->event
!= NB_EV_APPLY
)
1105 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1107 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->auth_str
);
1113 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring
1115 int lib_interface_rip_bfd_create(struct nb_cb_create_args
*args
)
1117 struct interface
*ifp
;
1118 struct rip_interface
*ri
;
1120 if (args
->event
!= NB_EV_APPLY
)
1123 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1125 ri
->bfd
.enabled
= yang_dnode_get_bool(args
->dnode
, "./enable");
1126 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1127 if (yang_dnode_exists(args
->dnode
, "./profile"))
1128 ri
->bfd
.profile
= XSTRDUP(
1129 MTYPE_RIP_BFD_PROFILE
,
1130 yang_dnode_get_string(args
->dnode
, "./profile"));
1132 rip_bfd_interface_update(ri
);
1137 int lib_interface_rip_bfd_destroy(struct nb_cb_destroy_args
*args
)
1139 struct interface
*ifp
;
1140 struct rip_interface
*ri
;
1142 if (args
->event
!= NB_EV_APPLY
)
1145 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1147 ri
->bfd
.enabled
= false;
1148 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1149 rip_bfd_interface_update(ri
);
1155 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/enable
1157 int lib_interface_rip_bfd_enable_modify(struct nb_cb_modify_args
*args
)
1159 struct interface
*ifp
;
1160 struct rip_interface
*ri
;
1162 if (args
->event
!= NB_EV_APPLY
)
1165 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1167 ri
->bfd
.enabled
= yang_dnode_get_bool(args
->dnode
, NULL
);
1168 rip_bfd_interface_update(ri
);
1174 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/profile
1176 int lib_interface_rip_bfd_profile_modify(struct nb_cb_modify_args
*args
)
1178 struct interface
*ifp
;
1179 struct rip_interface
*ri
;
1181 if (args
->event
!= NB_EV_APPLY
)
1184 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1186 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1187 ri
->bfd
.profile
= XSTRDUP(MTYPE_RIP_BFD_PROFILE
,
1188 yang_dnode_get_string(args
->dnode
, NULL
));
1189 rip_bfd_interface_update(ri
);
1194 int lib_interface_rip_bfd_profile_destroy(struct nb_cb_destroy_args
*args
)
1196 struct interface
*ifp
;
1197 struct rip_interface
*ri
;
1199 if (args
->event
!= NB_EV_APPLY
)
1202 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1204 XFREE(MTYPE_RIP_BFD_PROFILE
, ri
->bfd
.profile
);
1205 rip_bfd_interface_update(ri
);
1211 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain
1213 int lib_interface_rip_authentication_key_chain_modify(
1214 struct nb_cb_modify_args
*args
)
1216 struct interface
*ifp
;
1217 struct rip_interface
*ri
;
1219 if (args
->event
!= NB_EV_APPLY
)
1222 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1224 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);
1225 ri
->key_chain
= XSTRDUP(MTYPE_RIP_INTERFACE_STRING
,
1226 yang_dnode_get_string(args
->dnode
, NULL
));
1231 int lib_interface_rip_authentication_key_chain_destroy(
1232 struct nb_cb_destroy_args
*args
)
1234 struct interface
*ifp
;
1235 struct rip_interface
*ri
;
1237 if (args
->event
!= NB_EV_APPLY
)
1240 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1242 XFREE(MTYPE_RIP_INTERFACE_STRING
, ri
->key_chain
);