2 * EIGRP daemon northbound implementation.
4 * Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF")
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 #include "lib/keychain.h"
27 #include "lib/northbound.h"
28 #include "lib/table.h"
30 #include "lib/zclient.h"
32 #include "eigrp_structs.h"
34 #include "eigrp_interface.h"
35 #include "eigrp_network.h"
36 #include "eigrp_zebra.h"
38 /* Helper functions. */
39 static void redistribute_get_metrics(const struct lyd_node
*dnode
,
40 struct eigrp_metrics
*em
)
42 memset(em
, 0, sizeof(*em
));
44 if (yang_dnode_exists(dnode
, "./bandwidth"))
45 em
->bandwidth
= yang_dnode_get_uint32(dnode
, "./bandwidth");
46 if (yang_dnode_exists(dnode
, "./delay"))
47 em
->delay
= yang_dnode_get_uint32(dnode
, "./delay");
48 #if 0 /* TODO: How does MTU work? */
49 if (yang_dnode_exists(dnode
, "./mtu"))
50 em
->mtu
[0] = yang_dnode_get_uint32(dnode
, "./mtu");
52 if (yang_dnode_exists(dnode
, "./load"))
53 em
->load
= yang_dnode_get_uint32(dnode
, "./load");
54 if (yang_dnode_exists(dnode
, "./reliability"))
55 em
->reliability
= yang_dnode_get_uint32(dnode
, "./reliability");
58 static struct eigrp_interface
*eigrp_interface_lookup(const struct eigrp
*eigrp
,
61 struct eigrp_interface
*eif
;
64 for (ALL_LIST_ELEMENTS_RO(eigrp
->eiflist
, ln
, eif
)) {
65 if (strcmp(ifname
, eif
->ifp
->name
))
75 * XPath: /frr-eigrpd:eigrpd/instance
77 static int eigrpd_instance_create(enum nb_event event
,
78 const struct lyd_node
*dnode
,
79 union nb_resource
*resource
)
90 vrf
= yang_dnode_get_string(dnode
, "./vrf");
91 vrfid
= vrf_name_to_id(vrf
);
93 eigrp
= eigrp_get(yang_dnode_get_uint16(dnode
, "./asn"), vrfid
);
94 resource
->ptr
= eigrp
;
97 eigrp_finish_final(resource
->ptr
);
100 nb_running_set_entry(dnode
, resource
->ptr
);
107 static int eigrpd_instance_destroy(enum nb_event event
,
108 const struct lyd_node
*dnode
)
119 eigrp
= nb_running_unset_entry(dnode
);
120 eigrp_finish_final(eigrp
);
128 * XPath: /frr-eigrpd:eigrpd/instance/router-id
130 static int eigrpd_instance_router_id_modify(enum nb_event event
,
131 const struct lyd_node
*dnode
,
132 union nb_resource
*resource
)
143 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
144 yang_dnode_get_ipv4(&eigrp
->router_id_static
, dnode
, NULL
);
151 static int eigrpd_instance_router_id_destroy(enum nb_event event
,
152 const struct lyd_node
*dnode
)
163 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
164 eigrp
->router_id_static
.s_addr
= 0;
172 * XPath: /frr-eigrpd:eigrpd/instance/passive-interface
175 eigrpd_instance_passive_interface_create(enum nb_event event
,
176 const struct lyd_node
*dnode
,
177 union nb_resource
*resource
)
179 struct eigrp_interface
*eif
;
185 eigrp
= nb_running_get_entry(dnode
, NULL
, false);
188 * XXX: we can't verify if the interface exists
189 * and is active until EIGRP is up.
194 ifname
= yang_dnode_get_string(dnode
, NULL
);
195 eif
= eigrp_interface_lookup(eigrp
, ifname
);
197 return NB_ERR_INCONSISTENCY
;
204 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
205 ifname
= yang_dnode_get_string(dnode
, NULL
);
206 eif
= eigrp_interface_lookup(eigrp
, ifname
);
208 return NB_ERR_INCONSISTENCY
;
210 eif
->params
.passive_interface
= EIGRP_IF_PASSIVE
;
218 eigrpd_instance_passive_interface_destroy(enum nb_event event
,
219 const struct lyd_node
*dnode
)
221 struct eigrp_interface
*eif
;
232 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
233 ifname
= yang_dnode_get_string(dnode
, NULL
);
234 eif
= eigrp_interface_lookup(eigrp
, ifname
);
238 eif
->params
.passive_interface
= EIGRP_IF_ACTIVE
;
246 * XPath: /frr-eigrpd:eigrpd/instance/active-time
248 static int eigrpd_instance_active_time_modify(enum nb_event event
,
249 const struct lyd_node
*dnode
,
250 union nb_resource
*resource
)
254 /* TODO: Not implemented. */
255 return NB_ERR_INCONSISTENCY
;
267 * XPath: /frr-eigrpd:eigrpd/instance/variance
269 static int eigrpd_instance_variance_modify(enum nb_event event
,
270 const struct lyd_node
*dnode
,
271 union nb_resource
*resource
)
282 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
283 eigrp
->variance
= yang_dnode_get_uint8(dnode
, NULL
);
290 static int eigrpd_instance_variance_destroy(enum nb_event event
,
291 const struct lyd_node
*dnode
)
302 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
303 eigrp
->variance
= EIGRP_VARIANCE_DEFAULT
;
311 * XPath: /frr-eigrpd:eigrpd/instance/maximum-paths
313 static int eigrpd_instance_maximum_paths_modify(enum nb_event event
,
314 const struct lyd_node
*dnode
,
315 union nb_resource
*resource
)
326 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
327 eigrp
->max_paths
= yang_dnode_get_uint8(dnode
, NULL
);
334 static int eigrpd_instance_maximum_paths_destroy(enum nb_event event
,
335 const struct lyd_node
*dnode
)
346 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
347 eigrp
->max_paths
= EIGRP_MAX_PATHS_DEFAULT
;
355 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K1
358 eigrpd_instance_metric_weights_K1_modify(enum nb_event event
,
359 const struct lyd_node
*dnode
,
360 union nb_resource
*resource
)
371 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
372 eigrp
->k_values
[0] = yang_dnode_get_uint8(dnode
, NULL
);
380 eigrpd_instance_metric_weights_K1_destroy(enum nb_event event
,
381 const struct lyd_node
*dnode
)
392 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
393 eigrp
->k_values
[0] = EIGRP_K1_DEFAULT
;
401 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K2
404 eigrpd_instance_metric_weights_K2_modify(enum nb_event event
,
405 const struct lyd_node
*dnode
,
406 union nb_resource
*resource
)
417 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
418 eigrp
->k_values
[1] = yang_dnode_get_uint8(dnode
, NULL
);
426 eigrpd_instance_metric_weights_K2_destroy(enum nb_event event
,
427 const struct lyd_node
*dnode
)
438 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
439 eigrp
->k_values
[1] = EIGRP_K2_DEFAULT
;
447 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K3
450 eigrpd_instance_metric_weights_K3_modify(enum nb_event event
,
451 const struct lyd_node
*dnode
,
452 union nb_resource
*resource
)
463 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
464 eigrp
->k_values
[2] = yang_dnode_get_uint8(dnode
, NULL
);
472 eigrpd_instance_metric_weights_K3_destroy(enum nb_event event
,
473 const struct lyd_node
*dnode
)
484 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
485 eigrp
->k_values
[2] = EIGRP_K3_DEFAULT
;
493 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K4
496 eigrpd_instance_metric_weights_K4_modify(enum nb_event event
,
497 const struct lyd_node
*dnode
,
498 union nb_resource
*resource
)
509 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
510 eigrp
->k_values
[3] = yang_dnode_get_uint8(dnode
, NULL
);
518 eigrpd_instance_metric_weights_K4_destroy(enum nb_event event
,
519 const struct lyd_node
*dnode
)
530 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
531 eigrp
->k_values
[3] = EIGRP_K4_DEFAULT
;
539 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K5
542 eigrpd_instance_metric_weights_K5_modify(enum nb_event event
,
543 const struct lyd_node
*dnode
,
544 union nb_resource
*resource
)
555 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
556 eigrp
->k_values
[4] = yang_dnode_get_uint8(dnode
, NULL
);
564 eigrpd_instance_metric_weights_K5_destroy(enum nb_event event
,
565 const struct lyd_node
*dnode
)
576 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
577 eigrp
->k_values
[4] = EIGRP_K5_DEFAULT
;
585 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K6
588 eigrpd_instance_metric_weights_K6_modify(enum nb_event event
,
589 const struct lyd_node
*dnode
,
590 union nb_resource
*resource
)
601 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
602 eigrp
->k_values
[5] = yang_dnode_get_uint8(dnode
, NULL
);
610 eigrpd_instance_metric_weights_K6_destroy(enum nb_event event
,
611 const struct lyd_node
*dnode
)
622 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
623 eigrp
->k_values
[5] = EIGRP_K6_DEFAULT
;
631 * XPath: /frr-eigrpd:eigrpd/instance/network
633 static int eigrpd_instance_network_create(enum nb_event event
,
634 const struct lyd_node
*dnode
,
635 union nb_resource
*resource
)
637 struct route_node
*rnode
;
638 struct prefix prefix
;
642 yang_dnode_get_ipv4p(&prefix
, dnode
, NULL
);
646 eigrp
= nb_running_get_entry(dnode
, NULL
, false);
647 /* If entry doesn't exist it means the list is empty. */
651 rnode
= route_node_get(eigrp
->networks
, &prefix
);
652 exists
= (rnode
->info
!= NULL
);
653 route_unlock_node(rnode
);
655 return NB_ERR_INCONSISTENCY
;
662 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
663 if (eigrp_network_set(eigrp
, &prefix
) == 0)
664 return NB_ERR_INCONSISTENCY
;
671 static int eigrpd_instance_network_destroy(enum nb_event event
,
672 const struct lyd_node
*dnode
)
674 struct route_node
*rnode
;
675 struct prefix prefix
;
679 yang_dnode_get_ipv4p(&prefix
, dnode
, NULL
);
683 eigrp
= nb_running_get_entry(dnode
, NULL
, false);
684 /* If entry doesn't exist it means the list is empty. */
688 rnode
= route_node_get(eigrp
->networks
, &prefix
);
689 exists
= (rnode
->info
!= NULL
);
690 route_unlock_node(rnode
);
692 return NB_ERR_INCONSISTENCY
;
699 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
700 eigrp_network_unset(eigrp
, &prefix
);
708 * XPath: /frr-eigrpd:eigrpd/instance/neighbor
710 static int eigrpd_instance_neighbor_create(enum nb_event event
,
711 const struct lyd_node
*dnode
,
712 union nb_resource
*resource
)
716 /* TODO: Not implemented. */
717 return NB_ERR_INCONSISTENCY
;
728 static int eigrpd_instance_neighbor_destroy(enum nb_event event
,
729 const struct lyd_node
*dnode
)
733 /* TODO: Not implemented. */
734 return NB_ERR_INCONSISTENCY
;
746 * XPath: /frr-eigrpd:eigrpd/instance/redistribute
748 static int eigrpd_instance_redistribute_create(enum nb_event event
,
749 const struct lyd_node
*dnode
,
750 union nb_resource
*resource
)
752 struct eigrp_metrics metrics
;
760 proto
= yang_dnode_get_enum(dnode
, "./protocol");
761 vrfname
= yang_dnode_get_string(dnode
, "../vrf");
762 vrfid
= vrf_name_to_id(vrfname
);
763 if (vrf_bitmap_check(zclient
->redist
[AFI_IP
][proto
], vrfid
))
764 return NB_ERR_INCONSISTENCY
;
771 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
772 proto
= yang_dnode_get_enum(dnode
, "./protocol");
773 redistribute_get_metrics(dnode
, &metrics
);
774 eigrp_redistribute_set(eigrp
, proto
, metrics
);
781 static int eigrpd_instance_redistribute_destroy(enum nb_event event
,
782 const struct lyd_node
*dnode
)
794 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
795 proto
= yang_dnode_get_enum(dnode
, "./protocol");
796 eigrp_redistribute_unset(eigrp
, proto
);
804 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/route-map
807 eigrpd_instance_redistribute_route_map_modify(enum nb_event event
,
808 const struct lyd_node
*dnode
,
809 union nb_resource
*resource
)
813 /* TODO: Not implemented. */
814 return NB_ERR_INCONSISTENCY
;
826 eigrpd_instance_redistribute_route_map_destroy(enum nb_event event
,
827 const struct lyd_node
*dnode
)
831 /* TODO: Not implemented. */
832 return NB_ERR_INCONSISTENCY
;
844 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth
846 static int eigrpd_instance_redistribute_metrics_bandwidth_modify(
847 enum nb_event event
, const struct lyd_node
*dnode
,
848 union nb_resource
*resource
)
850 struct eigrp_metrics metrics
;
861 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
862 proto
= yang_dnode_get_enum(dnode
, "../../protocol");
863 redistribute_get_metrics(dnode
, &metrics
);
864 eigrp_redistribute_set(eigrp
, proto
, metrics
);
871 static int eigrpd_instance_redistribute_metrics_bandwidth_destroy(
872 enum nb_event event
, const struct lyd_node
*dnode
)
874 struct eigrp_metrics metrics
;
885 eigrp
= nb_running_get_entry(dnode
, NULL
, true);
886 proto
= yang_dnode_get_enum(dnode
, "../../protocol");
887 redistribute_get_metrics(dnode
, &metrics
);
888 eigrp_redistribute_set(eigrp
, proto
, metrics
);
896 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/delay
899 eigrpd_instance_redistribute_metrics_delay_modify(enum nb_event event
,
900 const struct lyd_node
*dnode
,
901 union nb_resource
*resource
)
903 return eigrpd_instance_redistribute_metrics_bandwidth_modify(event
,
909 eigrpd_instance_redistribute_metrics_delay_destroy(enum nb_event event
,
910 const struct lyd_node
*dnode
)
912 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(event
,
917 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability
919 static int eigrpd_instance_redistribute_metrics_reliability_modify(
920 enum nb_event event
, const struct lyd_node
*dnode
,
921 union nb_resource
*resource
)
923 return eigrpd_instance_redistribute_metrics_bandwidth_modify(event
,
928 static int eigrpd_instance_redistribute_metrics_reliability_destroy(
929 enum nb_event event
, const struct lyd_node
*dnode
)
931 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(event
,
936 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/load
939 eigrpd_instance_redistribute_metrics_load_modify(enum nb_event event
,
940 const struct lyd_node
*dnode
,
941 union nb_resource
*resource
)
943 return eigrpd_instance_redistribute_metrics_bandwidth_modify(event
,
949 eigrpd_instance_redistribute_metrics_load_destroy(enum nb_event event
,
950 const struct lyd_node
*dnode
)
952 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(event
,
957 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu
960 eigrpd_instance_redistribute_metrics_mtu_modify(enum nb_event event
,
961 const struct lyd_node
*dnode
,
962 union nb_resource
*resource
)
964 return eigrpd_instance_redistribute_metrics_bandwidth_modify(event
,
970 eigrpd_instance_redistribute_metrics_mtu_destroy(enum nb_event event
,
971 const struct lyd_node
*dnode
)
973 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(event
,
978 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/delay
980 static int lib_interface_eigrp_delay_modify(enum nb_event event
,
981 const struct lyd_node
*dnode
,
982 union nb_resource
*resource
)
984 struct eigrp_interface
*ei
;
985 struct interface
*ifp
;
989 ifp
= nb_running_get_entry(dnode
, NULL
, false);
992 * XXX: we can't verify if the interface exists
993 * and is active until EIGRP is up.
1000 return NB_ERR_INCONSISTENCY
;
1007 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1010 return NB_ERR_INCONSISTENCY
;
1012 ei
->params
.delay
= yang_dnode_get_uint32(dnode
, NULL
);
1013 eigrp_if_reset(ifp
);
1021 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth
1023 static int lib_interface_eigrp_bandwidth_modify(enum nb_event event
,
1024 const struct lyd_node
*dnode
,
1025 union nb_resource
*resource
)
1027 struct interface
*ifp
;
1028 struct eigrp_interface
*ei
;
1031 case NB_EV_VALIDATE
:
1032 ifp
= nb_running_get_entry(dnode
, NULL
, false);
1035 * XXX: we can't verify if the interface exists
1036 * and is active until EIGRP is up.
1043 return NB_ERR_INCONSISTENCY
;
1050 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1053 return NB_ERR_INCONSISTENCY
;
1055 ei
->params
.bandwidth
= yang_dnode_get_uint32(dnode
, NULL
);
1056 eigrp_if_reset(ifp
);
1064 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval
1067 lib_interface_eigrp_hello_interval_modify(enum nb_event event
,
1068 const struct lyd_node
*dnode
,
1069 union nb_resource
*resource
)
1071 struct interface
*ifp
;
1072 struct eigrp_interface
*ei
;
1075 case NB_EV_VALIDATE
:
1076 ifp
= nb_running_get_entry(dnode
, NULL
, false);
1079 * XXX: we can't verify if the interface exists
1080 * and is active until EIGRP is up.
1087 return NB_ERR_INCONSISTENCY
;
1094 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1097 return NB_ERR_INCONSISTENCY
;
1099 ei
->params
.v_hello
= yang_dnode_get_uint16(dnode
, NULL
);
1107 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time
1109 static int lib_interface_eigrp_hold_time_modify(enum nb_event event
,
1110 const struct lyd_node
*dnode
,
1111 union nb_resource
*resource
)
1113 struct interface
*ifp
;
1114 struct eigrp_interface
*ei
;
1117 case NB_EV_VALIDATE
:
1118 ifp
= nb_running_get_entry(dnode
, NULL
, false);
1121 * XXX: we can't verify if the interface exists
1122 * and is active until EIGRP is up.
1129 return NB_ERR_INCONSISTENCY
;
1136 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1139 return NB_ERR_INCONSISTENCY
;
1141 ei
->params
.v_wait
= yang_dnode_get_uint16(dnode
, NULL
);
1149 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon
1152 lib_interface_eigrp_split_horizon_modify(enum nb_event event
,
1153 const struct lyd_node
*dnode
,
1154 union nb_resource
*resource
)
1157 case NB_EV_VALIDATE
:
1158 /* TODO: Not implemented. */
1159 return NB_ERR_INCONSISTENCY
;
1171 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance
1173 static int lib_interface_eigrp_instance_create(enum nb_event event
,
1174 const struct lyd_node
*dnode
,
1175 union nb_resource
*resource
)
1177 struct eigrp_interface
*eif
;
1178 struct interface
*ifp
;
1179 struct eigrp
*eigrp
;
1182 case NB_EV_VALIDATE
:
1183 ifp
= nb_running_get_entry(dnode
, NULL
, false);
1186 * XXX: we can't verify if the interface exists
1187 * and is active until EIGRP is up.
1192 eigrp
= eigrp_get(yang_dnode_get_uint16(dnode
, "./asn"),
1194 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1196 return NB_ERR_INCONSISTENCY
;
1203 ifp
= nb_running_get_entry(dnode
, NULL
, true);
1204 eigrp
= eigrp_get(yang_dnode_get_uint16(dnode
, "./asn"),
1206 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1208 return NB_ERR_INCONSISTENCY
;
1210 nb_running_set_entry(dnode
, eif
);
1217 static int lib_interface_eigrp_instance_destroy(enum nb_event event
,
1218 const struct lyd_node
*dnode
)
1221 case NB_EV_VALIDATE
:
1227 nb_running_unset_entry(dnode
);
1236 * /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses
1238 static int lib_interface_eigrp_instance_summarize_addresses_create(
1239 enum nb_event event
, const struct lyd_node
*dnode
,
1240 union nb_resource
*resource
)
1243 case NB_EV_VALIDATE
:
1244 /* TODO: Not implemented. */
1245 return NB_ERR_INCONSISTENCY
;
1256 static int lib_interface_eigrp_instance_summarize_addresses_destroy(
1257 enum nb_event event
, const struct lyd_node
*dnode
)
1260 case NB_EV_VALIDATE
:
1261 /* TODO: Not implemented. */
1262 return NB_ERR_INCONSISTENCY
;
1274 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication
1277 lib_interface_eigrp_instance_authentication_modify(enum nb_event event
,
1278 const struct lyd_node
*dnode
,
1279 union nb_resource
*resource
)
1281 struct eigrp_interface
*eif
;
1284 case NB_EV_VALIDATE
:
1290 eif
= nb_running_get_entry(dnode
, NULL
, true);
1291 eif
->params
.auth_type
= yang_dnode_get_enum(dnode
, NULL
);
1299 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain
1302 lib_interface_eigrp_instance_keychain_modify(enum nb_event event
,
1303 const struct lyd_node
*dnode
,
1304 union nb_resource
*resource
)
1306 struct eigrp_interface
*eif
;
1307 struct keychain
*keychain
;
1310 case NB_EV_VALIDATE
:
1311 keychain
= keychain_lookup(yang_dnode_get_string(dnode
, NULL
));
1312 if (keychain
== NULL
)
1313 return NB_ERR_INCONSISTENCY
;
1316 resource
->ptr
= strdup(yang_dnode_get_string(dnode
, NULL
));
1317 if (resource
->ptr
== NULL
)
1318 return NB_ERR_RESOURCE
;
1321 free(resource
->ptr
);
1322 resource
->ptr
= NULL
;
1325 eif
= nb_running_get_entry(dnode
, NULL
, true);
1326 if (eif
->params
.auth_keychain
)
1327 free(eif
->params
.auth_keychain
);
1329 eif
->params
.auth_keychain
= resource
->ptr
;
1337 lib_interface_eigrp_instance_keychain_destroy(enum nb_event event
,
1338 const struct lyd_node
*dnode
)
1340 struct eigrp_interface
*eif
;
1343 case NB_EV_VALIDATE
:
1349 eif
= nb_running_get_entry(dnode
, NULL
, true);
1350 if (eif
->params
.auth_keychain
)
1351 free(eif
->params
.auth_keychain
);
1353 eif
->params
.auth_keychain
= NULL
;
1360 /* clang-format off */
1361 const struct frr_yang_module_info frr_eigrpd_info
= {
1362 .name
= "frr-eigrpd",
1365 .xpath
= "/frr-eigrpd:eigrpd/instance",
1367 .create
= eigrpd_instance_create
,
1368 .destroy
= eigrpd_instance_destroy
,
1369 .cli_show
= eigrp_cli_show_header
,
1370 .cli_show_end
= eigrp_cli_show_end_header
,
1374 .xpath
= "/frr-eigrpd:eigrpd/instance/router-id",
1376 .modify
= eigrpd_instance_router_id_modify
,
1377 .destroy
= eigrpd_instance_router_id_destroy
,
1378 .cli_show
= eigrp_cli_show_router_id
,
1382 .xpath
= "/frr-eigrpd:eigrpd/instance/passive-interface",
1384 .create
= eigrpd_instance_passive_interface_create
,
1385 .destroy
= eigrpd_instance_passive_interface_destroy
,
1386 .cli_show
= eigrp_cli_show_passive_interface
,
1390 .xpath
= "/frr-eigrpd:eigrpd/instance/active-time",
1392 .modify
= eigrpd_instance_active_time_modify
,
1393 .cli_show
= eigrp_cli_show_active_time
,
1397 .xpath
= "/frr-eigrpd:eigrpd/instance/variance",
1399 .modify
= eigrpd_instance_variance_modify
,
1400 .destroy
= eigrpd_instance_variance_destroy
,
1401 .cli_show
= eigrp_cli_show_variance
,
1405 .xpath
= "/frr-eigrpd:eigrpd/instance/maximum-paths",
1407 .modify
= eigrpd_instance_maximum_paths_modify
,
1408 .destroy
= eigrpd_instance_maximum_paths_destroy
,
1409 .cli_show
= eigrp_cli_show_maximum_paths
,
1413 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights",
1415 .cli_show
= eigrp_cli_show_metrics
,
1419 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K1",
1421 .modify
= eigrpd_instance_metric_weights_K1_modify
,
1422 .destroy
= eigrpd_instance_metric_weights_K1_destroy
,
1426 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K2",
1428 .modify
= eigrpd_instance_metric_weights_K2_modify
,
1429 .destroy
= eigrpd_instance_metric_weights_K2_destroy
,
1433 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K3",
1435 .modify
= eigrpd_instance_metric_weights_K3_modify
,
1436 .destroy
= eigrpd_instance_metric_weights_K3_destroy
,
1440 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K4",
1442 .modify
= eigrpd_instance_metric_weights_K4_modify
,
1443 .destroy
= eigrpd_instance_metric_weights_K4_destroy
,
1447 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K5",
1449 .modify
= eigrpd_instance_metric_weights_K5_modify
,
1450 .destroy
= eigrpd_instance_metric_weights_K5_destroy
,
1454 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K6",
1456 .modify
= eigrpd_instance_metric_weights_K6_modify
,
1457 .destroy
= eigrpd_instance_metric_weights_K6_destroy
,
1461 .xpath
= "/frr-eigrpd:eigrpd/instance/network",
1463 .create
= eigrpd_instance_network_create
,
1464 .destroy
= eigrpd_instance_network_destroy
,
1465 .cli_show
= eigrp_cli_show_network
,
1469 .xpath
= "/frr-eigrpd:eigrpd/instance/neighbor",
1471 .create
= eigrpd_instance_neighbor_create
,
1472 .destroy
= eigrpd_instance_neighbor_destroy
,
1473 .cli_show
= eigrp_cli_show_neighbor
,
1477 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute",
1479 .create
= eigrpd_instance_redistribute_create
,
1480 .destroy
= eigrpd_instance_redistribute_destroy
,
1481 .cli_show
= eigrp_cli_show_redistribute
,
1485 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/route-map",
1487 .modify
= eigrpd_instance_redistribute_route_map_modify
,
1488 .destroy
= eigrpd_instance_redistribute_route_map_destroy
,
1492 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth",
1494 .modify
= eigrpd_instance_redistribute_metrics_bandwidth_modify
,
1495 .destroy
= eigrpd_instance_redistribute_metrics_bandwidth_destroy
,
1499 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/delay",
1501 .modify
= eigrpd_instance_redistribute_metrics_delay_modify
,
1502 .destroy
= eigrpd_instance_redistribute_metrics_delay_destroy
,
1506 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability",
1508 .modify
= eigrpd_instance_redistribute_metrics_reliability_modify
,
1509 .destroy
= eigrpd_instance_redistribute_metrics_reliability_destroy
,
1513 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/load",
1515 .modify
= eigrpd_instance_redistribute_metrics_load_modify
,
1516 .destroy
= eigrpd_instance_redistribute_metrics_load_destroy
,
1520 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu",
1522 .modify
= eigrpd_instance_redistribute_metrics_mtu_modify
,
1523 .destroy
= eigrpd_instance_redistribute_metrics_mtu_destroy
,
1527 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/delay",
1529 .modify
= lib_interface_eigrp_delay_modify
,
1530 .cli_show
= eigrp_cli_show_delay
,
1534 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth",
1536 .modify
= lib_interface_eigrp_bandwidth_modify
,
1537 .cli_show
= eigrp_cli_show_bandwidth
,
1541 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval",
1543 .modify
= lib_interface_eigrp_hello_interval_modify
,
1544 .cli_show
= eigrp_cli_show_hello_interval
,
1548 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time",
1550 .modify
= lib_interface_eigrp_hold_time_modify
,
1551 .cli_show
= eigrp_cli_show_hold_time
,
1555 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon",
1557 .modify
= lib_interface_eigrp_split_horizon_modify
,
1561 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance",
1563 .create
= lib_interface_eigrp_instance_create
,
1564 .destroy
= lib_interface_eigrp_instance_destroy
,
1568 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses",
1570 .create
= lib_interface_eigrp_instance_summarize_addresses_create
,
1571 .destroy
= lib_interface_eigrp_instance_summarize_addresses_destroy
,
1572 .cli_show
= eigrp_cli_show_summarize_address
,
1576 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication",
1578 .modify
= lib_interface_eigrp_instance_authentication_modify
,
1579 .cli_show
= eigrp_cli_show_authentication
,
1583 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain",
1585 .modify
= lib_interface_eigrp_instance_keychain_modify
,
1586 .destroy
= lib_interface_eigrp_instance_keychain_destroy
,
1587 .cli_show
= eigrp_cli_show_keychain
,