1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * EIGRP daemon northbound implementation.
5 * Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF")
11 #include "lib/keychain.h"
13 #include "lib/northbound.h"
14 #include "lib/table.h"
16 #include "lib/zclient.h"
18 #include "eigrp_structs.h"
20 #include "eigrp_interface.h"
21 #include "eigrp_network.h"
22 #include "eigrp_zebra.h"
23 #include "eigrp_cli.h"
25 /* Helper functions. */
26 static void redistribute_get_metrics(const struct lyd_node
*dnode
,
27 struct eigrp_metrics
*em
)
29 memset(em
, 0, sizeof(*em
));
31 if (yang_dnode_exists(dnode
, "./bandwidth"))
32 em
->bandwidth
= yang_dnode_get_uint32(dnode
, "./bandwidth");
33 if (yang_dnode_exists(dnode
, "./delay"))
34 em
->delay
= yang_dnode_get_uint32(dnode
, "./delay");
35 #if 0 /* TODO: How does MTU work? */
36 if (yang_dnode_exists(dnode
, "./mtu"))
37 em
->mtu
[0] = yang_dnode_get_uint32(dnode
, "./mtu");
39 if (yang_dnode_exists(dnode
, "./load"))
40 em
->load
= yang_dnode_get_uint32(dnode
, "./load");
41 if (yang_dnode_exists(dnode
, "./reliability"))
42 em
->reliability
= yang_dnode_get_uint32(dnode
, "./reliability");
45 static struct eigrp_interface
*eigrp_interface_lookup(const struct eigrp
*eigrp
,
48 struct eigrp_interface
*eif
;
51 for (ALL_LIST_ELEMENTS_RO(eigrp
->eiflist
, ln
, eif
)) {
52 if (strcmp(ifname
, eif
->ifp
->name
))
62 * XPath: /frr-eigrpd:eigrpd/instance
64 static int eigrpd_instance_create(struct nb_cb_create_args
*args
)
71 switch (args
->event
) {
76 vrf
= yang_dnode_get_string(args
->dnode
, "./vrf");
78 pVrf
= vrf_lookup_by_name(vrf
);
84 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
86 args
->resource
->ptr
= eigrp
;
89 eigrp_finish_final(args
->resource
->ptr
);
92 nb_running_set_entry(args
->dnode
, args
->resource
->ptr
);
99 static int eigrpd_instance_destroy(struct nb_cb_destroy_args
*args
)
103 switch (args
->event
) {
110 eigrp
= nb_running_unset_entry(args
->dnode
);
111 eigrp_finish_final(eigrp
);
119 * XPath: /frr-eigrpd:eigrpd/instance/router-id
121 static int eigrpd_instance_router_id_modify(struct nb_cb_modify_args
*args
)
125 switch (args
->event
) {
132 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
133 yang_dnode_get_ipv4(&eigrp
->router_id_static
, args
->dnode
,
141 static int eigrpd_instance_router_id_destroy(struct nb_cb_destroy_args
*args
)
145 switch (args
->event
) {
152 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
153 eigrp
->router_id_static
.s_addr
= INADDR_ANY
;
161 * XPath: /frr-eigrpd:eigrpd/instance/passive-interface
164 eigrpd_instance_passive_interface_create(struct nb_cb_create_args
*args
)
166 struct eigrp_interface
*eif
;
170 switch (args
->event
) {
172 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
175 * XXX: we can't verify if the interface exists
176 * and is active until EIGRP is up.
181 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
182 eif
= eigrp_interface_lookup(eigrp
, ifname
);
184 return NB_ERR_INCONSISTENCY
;
191 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
192 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
193 eif
= eigrp_interface_lookup(eigrp
, ifname
);
195 return NB_ERR_INCONSISTENCY
;
197 eif
->params
.passive_interface
= EIGRP_IF_PASSIVE
;
205 eigrpd_instance_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
207 struct eigrp_interface
*eif
;
211 switch (args
->event
) {
218 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
219 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
220 eif
= eigrp_interface_lookup(eigrp
, ifname
);
224 eif
->params
.passive_interface
= EIGRP_IF_ACTIVE
;
232 * XPath: /frr-eigrpd:eigrpd/instance/active-time
234 static int eigrpd_instance_active_time_modify(struct nb_cb_modify_args
*args
)
236 switch (args
->event
) {
238 /* TODO: Not implemented. */
243 snprintf(args
->errmsg
, args
->errmsg_len
,
244 "active time not implemented yet");
253 * XPath: /frr-eigrpd:eigrpd/instance/variance
255 static int eigrpd_instance_variance_modify(struct nb_cb_modify_args
*args
)
259 switch (args
->event
) {
266 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
267 eigrp
->variance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
274 static int eigrpd_instance_variance_destroy(struct nb_cb_destroy_args
*args
)
278 switch (args
->event
) {
285 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
286 eigrp
->variance
= EIGRP_VARIANCE_DEFAULT
;
294 * XPath: /frr-eigrpd:eigrpd/instance/maximum-paths
296 static int eigrpd_instance_maximum_paths_modify(struct nb_cb_modify_args
*args
)
300 switch (args
->event
) {
307 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
308 eigrp
->max_paths
= yang_dnode_get_uint8(args
->dnode
, NULL
);
316 eigrpd_instance_maximum_paths_destroy(struct nb_cb_destroy_args
*args
)
320 switch (args
->event
) {
327 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
328 eigrp
->max_paths
= EIGRP_MAX_PATHS_DEFAULT
;
336 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K1
339 eigrpd_instance_metric_weights_K1_modify(struct nb_cb_modify_args
*args
)
343 switch (args
->event
) {
350 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
351 eigrp
->k_values
[0] = yang_dnode_get_uint8(args
->dnode
, NULL
);
359 eigrpd_instance_metric_weights_K1_destroy(struct nb_cb_destroy_args
*args
)
363 switch (args
->event
) {
370 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
371 eigrp
->k_values
[0] = EIGRP_K1_DEFAULT
;
379 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K2
382 eigrpd_instance_metric_weights_K2_modify(struct nb_cb_modify_args
*args
)
386 switch (args
->event
) {
393 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
394 eigrp
->k_values
[1] = yang_dnode_get_uint8(args
->dnode
, NULL
);
402 eigrpd_instance_metric_weights_K2_destroy(struct nb_cb_destroy_args
*args
)
406 switch (args
->event
) {
413 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
414 eigrp
->k_values
[1] = EIGRP_K2_DEFAULT
;
422 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K3
425 eigrpd_instance_metric_weights_K3_modify(struct nb_cb_modify_args
*args
)
429 switch (args
->event
) {
436 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
437 eigrp
->k_values
[2] = yang_dnode_get_uint8(args
->dnode
, NULL
);
445 eigrpd_instance_metric_weights_K3_destroy(struct nb_cb_destroy_args
*args
)
449 switch (args
->event
) {
456 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
457 eigrp
->k_values
[2] = EIGRP_K3_DEFAULT
;
465 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K4
468 eigrpd_instance_metric_weights_K4_modify(struct nb_cb_modify_args
*args
)
472 switch (args
->event
) {
479 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
480 eigrp
->k_values
[3] = yang_dnode_get_uint8(args
->dnode
, NULL
);
488 eigrpd_instance_metric_weights_K4_destroy(struct nb_cb_destroy_args
*args
)
492 switch (args
->event
) {
499 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
500 eigrp
->k_values
[3] = EIGRP_K4_DEFAULT
;
508 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K5
511 eigrpd_instance_metric_weights_K5_modify(struct nb_cb_modify_args
*args
)
515 switch (args
->event
) {
522 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
523 eigrp
->k_values
[4] = yang_dnode_get_uint8(args
->dnode
, NULL
);
531 eigrpd_instance_metric_weights_K5_destroy(struct nb_cb_destroy_args
*args
)
535 switch (args
->event
) {
542 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
543 eigrp
->k_values
[4] = EIGRP_K5_DEFAULT
;
551 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K6
554 eigrpd_instance_metric_weights_K6_modify(struct nb_cb_modify_args
*args
)
558 switch (args
->event
) {
565 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
566 eigrp
->k_values
[5] = yang_dnode_get_uint8(args
->dnode
, NULL
);
574 eigrpd_instance_metric_weights_K6_destroy(struct nb_cb_destroy_args
*args
)
578 switch (args
->event
) {
585 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
586 eigrp
->k_values
[5] = EIGRP_K6_DEFAULT
;
594 * XPath: /frr-eigrpd:eigrpd/instance/network
596 static int eigrpd_instance_network_create(struct nb_cb_create_args
*args
)
598 struct route_node
*rnode
;
599 struct prefix prefix
;
603 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, NULL
);
605 switch (args
->event
) {
607 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
608 /* If entry doesn't exist it means the list is empty. */
612 rnode
= route_node_get(eigrp
->networks
, &prefix
);
613 exists
= (rnode
->info
!= NULL
);
614 route_unlock_node(rnode
);
616 return NB_ERR_INCONSISTENCY
;
623 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
624 if (eigrp_network_set(eigrp
, &prefix
) == 0)
625 return NB_ERR_INCONSISTENCY
;
632 static int eigrpd_instance_network_destroy(struct nb_cb_destroy_args
*args
)
634 struct route_node
*rnode
;
635 struct prefix prefix
;
639 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, NULL
);
641 switch (args
->event
) {
643 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
644 /* If entry doesn't exist it means the list is empty. */
648 rnode
= route_node_get(eigrp
->networks
, &prefix
);
649 exists
= (rnode
->info
!= NULL
);
650 route_unlock_node(rnode
);
652 return NB_ERR_INCONSISTENCY
;
659 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
660 eigrp_network_unset(eigrp
, &prefix
);
668 * XPath: /frr-eigrpd:eigrpd/instance/neighbor
670 static int eigrpd_instance_neighbor_create(struct nb_cb_create_args
*args
)
672 switch (args
->event
) {
674 /* TODO: Not implemented. */
679 snprintf(args
->errmsg
, args
->errmsg_len
,
680 "neighbor Command is not implemented yet");
687 static int eigrpd_instance_neighbor_destroy(struct nb_cb_destroy_args
*args
)
689 switch (args
->event
) {
691 /* TODO: Not implemented. */
696 snprintf(args
->errmsg
, args
->errmsg_len
,
697 "no neighbor Command is not implemented yet");
705 * XPath: /frr-eigrpd:eigrpd/instance/redistribute
707 static int eigrpd_instance_redistribute_create(struct nb_cb_create_args
*args
)
709 struct eigrp_metrics metrics
;
716 switch (args
->event
) {
718 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
719 vrfname
= yang_dnode_get_string(args
->dnode
, "../vrf");
721 pVrf
= vrf_lookup_by_name(vrfname
);
723 vrfid
= pVrf
->vrf_id
;
727 if (vrf_bitmap_check(zclient
->redist
[AFI_IP
][proto
], vrfid
))
728 return NB_ERR_INCONSISTENCY
;
735 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
736 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
737 redistribute_get_metrics(args
->dnode
, &metrics
);
738 eigrp_redistribute_set(eigrp
, proto
, metrics
);
745 static int eigrpd_instance_redistribute_destroy(struct nb_cb_destroy_args
*args
)
750 switch (args
->event
) {
757 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
758 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
759 eigrp_redistribute_unset(eigrp
, proto
);
767 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/route-map
770 eigrpd_instance_redistribute_route_map_modify(struct nb_cb_modify_args
*args
)
772 switch (args
->event
) {
774 /* TODO: Not implemented. */
780 args
->errmsg
, args
->errmsg_len
,
781 "'redistribute X route-map FOO' command not implemented yet");
789 eigrpd_instance_redistribute_route_map_destroy(struct nb_cb_destroy_args
*args
)
791 switch (args
->event
) {
793 /* TODO: Not implemented. */
799 args
->errmsg
, args
->errmsg_len
,
800 "'no redistribute X route-map FOO' command not implemented yet");
808 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth
810 static int eigrpd_instance_redistribute_metrics_bandwidth_modify(
811 struct nb_cb_modify_args
*args
)
813 struct eigrp_metrics metrics
;
817 switch (args
->event
) {
824 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
825 proto
= yang_dnode_get_enum(args
->dnode
, "../../protocol");
826 redistribute_get_metrics(args
->dnode
, &metrics
);
827 eigrp_redistribute_set(eigrp
, proto
, metrics
);
834 static int eigrpd_instance_redistribute_metrics_bandwidth_destroy(
835 struct nb_cb_destroy_args
*args
)
837 struct eigrp_metrics metrics
;
841 switch (args
->event
) {
848 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
849 proto
= yang_dnode_get_enum(args
->dnode
, "../../protocol");
850 redistribute_get_metrics(args
->dnode
, &metrics
);
851 eigrp_redistribute_set(eigrp
, proto
, metrics
);
859 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/delay
861 static int eigrpd_instance_redistribute_metrics_delay_modify(
862 struct nb_cb_modify_args
*args
)
864 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
867 static int eigrpd_instance_redistribute_metrics_delay_destroy(
868 struct nb_cb_destroy_args
*args
)
870 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
874 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability
876 static int eigrpd_instance_redistribute_metrics_reliability_modify(
877 struct nb_cb_modify_args
*args
)
879 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
882 static int eigrpd_instance_redistribute_metrics_reliability_destroy(
883 struct nb_cb_destroy_args
*args
)
885 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
889 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/load
892 eigrpd_instance_redistribute_metrics_load_modify(struct nb_cb_modify_args
*args
)
894 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
897 static int eigrpd_instance_redistribute_metrics_load_destroy(
898 struct nb_cb_destroy_args
*args
)
900 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
904 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu
907 eigrpd_instance_redistribute_metrics_mtu_modify(struct nb_cb_modify_args
*args
)
909 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
912 static int eigrpd_instance_redistribute_metrics_mtu_destroy(
913 struct nb_cb_destroy_args
*args
)
915 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
919 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/delay
921 static int lib_interface_eigrp_delay_modify(struct nb_cb_modify_args
*args
)
923 struct eigrp_interface
*ei
;
924 struct interface
*ifp
;
926 switch (args
->event
) {
928 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
931 * XXX: we can't verify if the interface exists
932 * and is active until EIGRP is up.
939 return NB_ERR_INCONSISTENCY
;
946 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
949 return NB_ERR_INCONSISTENCY
;
951 ei
->params
.delay
= yang_dnode_get_uint32(args
->dnode
, NULL
);
960 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth
962 static int lib_interface_eigrp_bandwidth_modify(struct nb_cb_modify_args
*args
)
964 struct interface
*ifp
;
965 struct eigrp_interface
*ei
;
967 switch (args
->event
) {
969 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
972 * XXX: we can't verify if the interface exists
973 * and is active until EIGRP is up.
980 return NB_ERR_INCONSISTENCY
;
987 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
990 return NB_ERR_INCONSISTENCY
;
992 ei
->params
.bandwidth
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1001 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval
1004 lib_interface_eigrp_hello_interval_modify(struct nb_cb_modify_args
*args
)
1006 struct interface
*ifp
;
1007 struct eigrp_interface
*ei
;
1009 switch (args
->event
) {
1010 case NB_EV_VALIDATE
:
1011 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1014 * XXX: we can't verify if the interface exists
1015 * and is active until EIGRP is up.
1022 return NB_ERR_INCONSISTENCY
;
1029 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1032 return NB_ERR_INCONSISTENCY
;
1034 ei
->params
.v_hello
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1042 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time
1044 static int lib_interface_eigrp_hold_time_modify(struct nb_cb_modify_args
*args
)
1046 struct interface
*ifp
;
1047 struct eigrp_interface
*ei
;
1049 switch (args
->event
) {
1050 case NB_EV_VALIDATE
:
1051 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1054 * XXX: we can't verify if the interface exists
1055 * and is active until EIGRP is up.
1062 return NB_ERR_INCONSISTENCY
;
1069 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1072 return NB_ERR_INCONSISTENCY
;
1074 ei
->params
.v_wait
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1082 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon
1085 lib_interface_eigrp_split_horizon_modify(struct nb_cb_modify_args
*args
)
1087 switch (args
->event
) {
1088 case NB_EV_VALIDATE
:
1089 /* TODO: Not implemented. */
1094 snprintf(args
->errmsg
, args
->errmsg_len
,
1095 "split-horizon command not implemented yet");
1104 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance
1106 static int lib_interface_eigrp_instance_create(struct nb_cb_create_args
*args
)
1108 struct eigrp_interface
*eif
;
1109 struct interface
*ifp
;
1110 struct eigrp
*eigrp
;
1112 switch (args
->event
) {
1113 case NB_EV_VALIDATE
:
1114 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1117 * XXX: we can't verify if the interface exists
1118 * and is active until EIGRP is up.
1123 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
1125 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1127 return NB_ERR_INCONSISTENCY
;
1134 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1135 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
1137 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1139 return NB_ERR_INCONSISTENCY
;
1141 nb_running_set_entry(args
->dnode
, eif
);
1148 static int lib_interface_eigrp_instance_destroy(struct nb_cb_destroy_args
*args
)
1150 switch (args
->event
) {
1151 case NB_EV_VALIDATE
:
1157 nb_running_unset_entry(args
->dnode
);
1166 * /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses
1168 static int lib_interface_eigrp_instance_summarize_addresses_create(
1169 struct nb_cb_create_args
*args
)
1171 switch (args
->event
) {
1172 case NB_EV_VALIDATE
:
1173 /* TODO: Not implemented. */
1178 snprintf(args
->errmsg
, args
->errmsg_len
,
1179 "summary command not implemented yet");
1186 static int lib_interface_eigrp_instance_summarize_addresses_destroy(
1187 struct nb_cb_destroy_args
*args
)
1189 switch (args
->event
) {
1190 case NB_EV_VALIDATE
:
1191 /* TODO: Not implemented. */
1196 snprintf(args
->errmsg
, args
->errmsg_len
,
1197 "no summary command not implemented yet");
1206 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication
1208 static int lib_interface_eigrp_instance_authentication_modify(
1209 struct nb_cb_modify_args
*args
)
1211 struct eigrp_interface
*eif
;
1213 switch (args
->event
) {
1214 case NB_EV_VALIDATE
:
1220 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1221 eif
->params
.auth_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1229 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain
1232 lib_interface_eigrp_instance_keychain_modify(struct nb_cb_modify_args
*args
)
1234 struct eigrp_interface
*eif
;
1235 struct keychain
*keychain
;
1237 switch (args
->event
) {
1238 case NB_EV_VALIDATE
:
1239 keychain
= keychain_lookup(
1240 yang_dnode_get_string(args
->dnode
, NULL
));
1241 if (keychain
== NULL
)
1242 return NB_ERR_INCONSISTENCY
;
1245 args
->resource
->ptr
=
1246 strdup(yang_dnode_get_string(args
->dnode
, NULL
));
1247 if (args
->resource
->ptr
== NULL
)
1248 return NB_ERR_RESOURCE
;
1251 free(args
->resource
->ptr
);
1252 args
->resource
->ptr
= NULL
;
1255 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1256 if (eif
->params
.auth_keychain
)
1257 free(eif
->params
.auth_keychain
);
1259 eif
->params
.auth_keychain
= args
->resource
->ptr
;
1267 lib_interface_eigrp_instance_keychain_destroy(struct nb_cb_destroy_args
*args
)
1269 struct eigrp_interface
*eif
;
1271 switch (args
->event
) {
1272 case NB_EV_VALIDATE
:
1278 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1279 if (eif
->params
.auth_keychain
)
1280 free(eif
->params
.auth_keychain
);
1282 eif
->params
.auth_keychain
= NULL
;
1289 /* clang-format off */
1290 const struct frr_yang_module_info frr_eigrpd_info
= {
1291 .name
= "frr-eigrpd",
1294 .xpath
= "/frr-eigrpd:eigrpd/instance",
1296 .create
= eigrpd_instance_create
,
1297 .destroy
= eigrpd_instance_destroy
,
1298 .cli_show
= eigrp_cli_show_header
,
1299 .cli_show_end
= eigrp_cli_show_end_header
,
1303 .xpath
= "/frr-eigrpd:eigrpd/instance/router-id",
1305 .modify
= eigrpd_instance_router_id_modify
,
1306 .destroy
= eigrpd_instance_router_id_destroy
,
1307 .cli_show
= eigrp_cli_show_router_id
,
1311 .xpath
= "/frr-eigrpd:eigrpd/instance/passive-interface",
1313 .create
= eigrpd_instance_passive_interface_create
,
1314 .destroy
= eigrpd_instance_passive_interface_destroy
,
1315 .cli_show
= eigrp_cli_show_passive_interface
,
1319 .xpath
= "/frr-eigrpd:eigrpd/instance/active-time",
1321 .modify
= eigrpd_instance_active_time_modify
,
1322 .cli_show
= eigrp_cli_show_active_time
,
1326 .xpath
= "/frr-eigrpd:eigrpd/instance/variance",
1328 .modify
= eigrpd_instance_variance_modify
,
1329 .destroy
= eigrpd_instance_variance_destroy
,
1330 .cli_show
= eigrp_cli_show_variance
,
1334 .xpath
= "/frr-eigrpd:eigrpd/instance/maximum-paths",
1336 .modify
= eigrpd_instance_maximum_paths_modify
,
1337 .destroy
= eigrpd_instance_maximum_paths_destroy
,
1338 .cli_show
= eigrp_cli_show_maximum_paths
,
1342 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights",
1344 .cli_show
= eigrp_cli_show_metrics
,
1348 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K1",
1350 .modify
= eigrpd_instance_metric_weights_K1_modify
,
1351 .destroy
= eigrpd_instance_metric_weights_K1_destroy
,
1355 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K2",
1357 .modify
= eigrpd_instance_metric_weights_K2_modify
,
1358 .destroy
= eigrpd_instance_metric_weights_K2_destroy
,
1362 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K3",
1364 .modify
= eigrpd_instance_metric_weights_K3_modify
,
1365 .destroy
= eigrpd_instance_metric_weights_K3_destroy
,
1369 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K4",
1371 .modify
= eigrpd_instance_metric_weights_K4_modify
,
1372 .destroy
= eigrpd_instance_metric_weights_K4_destroy
,
1376 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K5",
1378 .modify
= eigrpd_instance_metric_weights_K5_modify
,
1379 .destroy
= eigrpd_instance_metric_weights_K5_destroy
,
1383 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K6",
1385 .modify
= eigrpd_instance_metric_weights_K6_modify
,
1386 .destroy
= eigrpd_instance_metric_weights_K6_destroy
,
1390 .xpath
= "/frr-eigrpd:eigrpd/instance/network",
1392 .create
= eigrpd_instance_network_create
,
1393 .destroy
= eigrpd_instance_network_destroy
,
1394 .cli_show
= eigrp_cli_show_network
,
1398 .xpath
= "/frr-eigrpd:eigrpd/instance/neighbor",
1400 .create
= eigrpd_instance_neighbor_create
,
1401 .destroy
= eigrpd_instance_neighbor_destroy
,
1402 .cli_show
= eigrp_cli_show_neighbor
,
1406 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute",
1408 .create
= eigrpd_instance_redistribute_create
,
1409 .destroy
= eigrpd_instance_redistribute_destroy
,
1410 .cli_show
= eigrp_cli_show_redistribute
,
1414 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/route-map",
1416 .modify
= eigrpd_instance_redistribute_route_map_modify
,
1417 .destroy
= eigrpd_instance_redistribute_route_map_destroy
,
1421 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth",
1423 .modify
= eigrpd_instance_redistribute_metrics_bandwidth_modify
,
1424 .destroy
= eigrpd_instance_redistribute_metrics_bandwidth_destroy
,
1428 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/delay",
1430 .modify
= eigrpd_instance_redistribute_metrics_delay_modify
,
1431 .destroy
= eigrpd_instance_redistribute_metrics_delay_destroy
,
1435 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability",
1437 .modify
= eigrpd_instance_redistribute_metrics_reliability_modify
,
1438 .destroy
= eigrpd_instance_redistribute_metrics_reliability_destroy
,
1442 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/load",
1444 .modify
= eigrpd_instance_redistribute_metrics_load_modify
,
1445 .destroy
= eigrpd_instance_redistribute_metrics_load_destroy
,
1449 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu",
1451 .modify
= eigrpd_instance_redistribute_metrics_mtu_modify
,
1452 .destroy
= eigrpd_instance_redistribute_metrics_mtu_destroy
,
1456 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/delay",
1458 .modify
= lib_interface_eigrp_delay_modify
,
1459 .cli_show
= eigrp_cli_show_delay
,
1463 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth",
1465 .modify
= lib_interface_eigrp_bandwidth_modify
,
1466 .cli_show
= eigrp_cli_show_bandwidth
,
1470 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval",
1472 .modify
= lib_interface_eigrp_hello_interval_modify
,
1473 .cli_show
= eigrp_cli_show_hello_interval
,
1477 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time",
1479 .modify
= lib_interface_eigrp_hold_time_modify
,
1480 .cli_show
= eigrp_cli_show_hold_time
,
1484 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon",
1486 .modify
= lib_interface_eigrp_split_horizon_modify
,
1490 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance",
1492 .create
= lib_interface_eigrp_instance_create
,
1493 .destroy
= lib_interface_eigrp_instance_destroy
,
1497 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses",
1499 .create
= lib_interface_eigrp_instance_summarize_addresses_create
,
1500 .destroy
= lib_interface_eigrp_instance_summarize_addresses_destroy
,
1501 .cli_show
= eigrp_cli_show_summarize_address
,
1505 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication",
1507 .modify
= lib_interface_eigrp_instance_authentication_modify
,
1508 .cli_show
= eigrp_cli_show_authentication
,
1512 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain",
1514 .modify
= lib_interface_eigrp_instance_keychain_modify
,
1515 .destroy
= lib_interface_eigrp_instance_keychain_destroy
,
1516 .cli_show
= eigrp_cli_show_keychain
,