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"
37 #include "eigrp_cli.h"
39 /* Helper functions. */
40 static void redistribute_get_metrics(const struct lyd_node
*dnode
,
41 struct eigrp_metrics
*em
)
43 memset(em
, 0, sizeof(*em
));
45 if (yang_dnode_exists(dnode
, "./bandwidth"))
46 em
->bandwidth
= yang_dnode_get_uint32(dnode
, "./bandwidth");
47 if (yang_dnode_exists(dnode
, "./delay"))
48 em
->delay
= yang_dnode_get_uint32(dnode
, "./delay");
49 #if 0 /* TODO: How does MTU work? */
50 if (yang_dnode_exists(dnode
, "./mtu"))
51 em
->mtu
[0] = yang_dnode_get_uint32(dnode
, "./mtu");
53 if (yang_dnode_exists(dnode
, "./load"))
54 em
->load
= yang_dnode_get_uint32(dnode
, "./load");
55 if (yang_dnode_exists(dnode
, "./reliability"))
56 em
->reliability
= yang_dnode_get_uint32(dnode
, "./reliability");
59 static struct eigrp_interface
*eigrp_interface_lookup(const struct eigrp
*eigrp
,
62 struct eigrp_interface
*eif
;
65 for (ALL_LIST_ELEMENTS_RO(eigrp
->eiflist
, ln
, eif
)) {
66 if (strcmp(ifname
, eif
->ifp
->name
))
76 * XPath: /frr-eigrpd:eigrpd/instance
78 static int eigrpd_instance_create(struct nb_cb_create_args
*args
)
84 switch (args
->event
) {
89 vrf
= yang_dnode_get_string(args
->dnode
, "./vrf");
90 vrfid
= vrf_name_to_id(vrf
);
92 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
94 args
->resource
->ptr
= eigrp
;
97 eigrp_finish_final(args
->resource
->ptr
);
100 nb_running_set_entry(args
->dnode
, args
->resource
->ptr
);
107 static int eigrpd_instance_destroy(struct nb_cb_destroy_args
*args
)
111 switch (args
->event
) {
118 eigrp
= nb_running_unset_entry(args
->dnode
);
119 eigrp_finish_final(eigrp
);
127 * XPath: /frr-eigrpd:eigrpd/instance/router-id
129 static int eigrpd_instance_router_id_modify(struct nb_cb_modify_args
*args
)
133 switch (args
->event
) {
140 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
141 yang_dnode_get_ipv4(&eigrp
->router_id_static
, args
->dnode
,
149 static int eigrpd_instance_router_id_destroy(struct nb_cb_destroy_args
*args
)
153 switch (args
->event
) {
160 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
161 eigrp
->router_id_static
.s_addr
= INADDR_ANY
;
169 * XPath: /frr-eigrpd:eigrpd/instance/passive-interface
172 eigrpd_instance_passive_interface_create(struct nb_cb_create_args
*args
)
174 struct eigrp_interface
*eif
;
178 switch (args
->event
) {
180 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
183 * XXX: we can't verify if the interface exists
184 * and is active until EIGRP is up.
189 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
190 eif
= eigrp_interface_lookup(eigrp
, ifname
);
192 return NB_ERR_INCONSISTENCY
;
199 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
200 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
201 eif
= eigrp_interface_lookup(eigrp
, ifname
);
203 return NB_ERR_INCONSISTENCY
;
205 eif
->params
.passive_interface
= EIGRP_IF_PASSIVE
;
213 eigrpd_instance_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
215 struct eigrp_interface
*eif
;
219 switch (args
->event
) {
226 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
227 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
228 eif
= eigrp_interface_lookup(eigrp
, ifname
);
232 eif
->params
.passive_interface
= EIGRP_IF_ACTIVE
;
240 * XPath: /frr-eigrpd:eigrpd/instance/active-time
242 static int eigrpd_instance_active_time_modify(struct nb_cb_modify_args
*args
)
244 switch (args
->event
) {
246 /* TODO: Not implemented. */
251 snprintf(args
->errmsg
, args
->errmsg_len
,
252 "active time not implemented yet");
261 * XPath: /frr-eigrpd:eigrpd/instance/variance
263 static int eigrpd_instance_variance_modify(struct nb_cb_modify_args
*args
)
267 switch (args
->event
) {
274 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
275 eigrp
->variance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
282 static int eigrpd_instance_variance_destroy(struct nb_cb_destroy_args
*args
)
286 switch (args
->event
) {
293 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
294 eigrp
->variance
= EIGRP_VARIANCE_DEFAULT
;
302 * XPath: /frr-eigrpd:eigrpd/instance/maximum-paths
304 static int eigrpd_instance_maximum_paths_modify(struct nb_cb_modify_args
*args
)
308 switch (args
->event
) {
315 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
316 eigrp
->max_paths
= yang_dnode_get_uint8(args
->dnode
, NULL
);
324 eigrpd_instance_maximum_paths_destroy(struct nb_cb_destroy_args
*args
)
328 switch (args
->event
) {
335 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
336 eigrp
->max_paths
= EIGRP_MAX_PATHS_DEFAULT
;
344 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K1
347 eigrpd_instance_metric_weights_K1_modify(struct nb_cb_modify_args
*args
)
351 switch (args
->event
) {
358 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
359 eigrp
->k_values
[0] = yang_dnode_get_uint8(args
->dnode
, NULL
);
367 eigrpd_instance_metric_weights_K1_destroy(struct nb_cb_destroy_args
*args
)
371 switch (args
->event
) {
378 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
379 eigrp
->k_values
[0] = EIGRP_K1_DEFAULT
;
387 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K2
390 eigrpd_instance_metric_weights_K2_modify(struct nb_cb_modify_args
*args
)
394 switch (args
->event
) {
401 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
402 eigrp
->k_values
[1] = yang_dnode_get_uint8(args
->dnode
, NULL
);
410 eigrpd_instance_metric_weights_K2_destroy(struct nb_cb_destroy_args
*args
)
414 switch (args
->event
) {
421 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
422 eigrp
->k_values
[1] = EIGRP_K2_DEFAULT
;
430 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K3
433 eigrpd_instance_metric_weights_K3_modify(struct nb_cb_modify_args
*args
)
437 switch (args
->event
) {
444 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
445 eigrp
->k_values
[2] = yang_dnode_get_uint8(args
->dnode
, NULL
);
453 eigrpd_instance_metric_weights_K3_destroy(struct nb_cb_destroy_args
*args
)
457 switch (args
->event
) {
464 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
465 eigrp
->k_values
[2] = EIGRP_K3_DEFAULT
;
473 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K4
476 eigrpd_instance_metric_weights_K4_modify(struct nb_cb_modify_args
*args
)
480 switch (args
->event
) {
487 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
488 eigrp
->k_values
[3] = yang_dnode_get_uint8(args
->dnode
, NULL
);
496 eigrpd_instance_metric_weights_K4_destroy(struct nb_cb_destroy_args
*args
)
500 switch (args
->event
) {
507 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
508 eigrp
->k_values
[3] = EIGRP_K4_DEFAULT
;
516 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K5
519 eigrpd_instance_metric_weights_K5_modify(struct nb_cb_modify_args
*args
)
523 switch (args
->event
) {
530 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
531 eigrp
->k_values
[4] = yang_dnode_get_uint8(args
->dnode
, NULL
);
539 eigrpd_instance_metric_weights_K5_destroy(struct nb_cb_destroy_args
*args
)
543 switch (args
->event
) {
550 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
551 eigrp
->k_values
[4] = EIGRP_K5_DEFAULT
;
559 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K6
562 eigrpd_instance_metric_weights_K6_modify(struct nb_cb_modify_args
*args
)
566 switch (args
->event
) {
573 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
574 eigrp
->k_values
[5] = yang_dnode_get_uint8(args
->dnode
, NULL
);
582 eigrpd_instance_metric_weights_K6_destroy(struct nb_cb_destroy_args
*args
)
586 switch (args
->event
) {
593 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
594 eigrp
->k_values
[5] = EIGRP_K6_DEFAULT
;
602 * XPath: /frr-eigrpd:eigrpd/instance/network
604 static int eigrpd_instance_network_create(struct nb_cb_create_args
*args
)
606 struct route_node
*rnode
;
607 struct prefix prefix
;
611 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, NULL
);
613 switch (args
->event
) {
615 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
616 /* If entry doesn't exist it means the list is empty. */
620 rnode
= route_node_get(eigrp
->networks
, &prefix
);
621 exists
= (rnode
->info
!= NULL
);
622 route_unlock_node(rnode
);
624 return NB_ERR_INCONSISTENCY
;
631 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
632 if (eigrp_network_set(eigrp
, &prefix
) == 0)
633 return NB_ERR_INCONSISTENCY
;
640 static int eigrpd_instance_network_destroy(struct nb_cb_destroy_args
*args
)
642 struct route_node
*rnode
;
643 struct prefix prefix
;
647 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, NULL
);
649 switch (args
->event
) {
651 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
652 /* If entry doesn't exist it means the list is empty. */
656 rnode
= route_node_get(eigrp
->networks
, &prefix
);
657 exists
= (rnode
->info
!= NULL
);
658 route_unlock_node(rnode
);
660 return NB_ERR_INCONSISTENCY
;
667 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
668 eigrp_network_unset(eigrp
, &prefix
);
676 * XPath: /frr-eigrpd:eigrpd/instance/neighbor
678 static int eigrpd_instance_neighbor_create(struct nb_cb_create_args
*args
)
680 switch (args
->event
) {
682 /* TODO: Not implemented. */
687 snprintf(args
->errmsg
, args
->errmsg_len
,
688 "neighbor Command is not implemented yet");
695 static int eigrpd_instance_neighbor_destroy(struct nb_cb_destroy_args
*args
)
697 switch (args
->event
) {
699 /* TODO: Not implemented. */
704 snprintf(args
->errmsg
, args
->errmsg_len
,
705 "no neighbor Command is not implemented yet");
713 * XPath: /frr-eigrpd:eigrpd/instance/redistribute
715 static int eigrpd_instance_redistribute_create(struct nb_cb_create_args
*args
)
717 struct eigrp_metrics metrics
;
723 switch (args
->event
) {
725 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
726 vrfname
= yang_dnode_get_string(args
->dnode
, "../vrf");
727 vrfid
= vrf_name_to_id(vrfname
);
728 if (vrf_bitmap_check(zclient
->redist
[AFI_IP
][proto
], vrfid
))
729 return NB_ERR_INCONSISTENCY
;
736 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
737 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
738 redistribute_get_metrics(args
->dnode
, &metrics
);
739 eigrp_redistribute_set(eigrp
, proto
, metrics
);
746 static int eigrpd_instance_redistribute_destroy(struct nb_cb_destroy_args
*args
)
751 switch (args
->event
) {
758 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
759 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
760 eigrp_redistribute_unset(eigrp
, proto
);
768 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/route-map
771 eigrpd_instance_redistribute_route_map_modify(struct nb_cb_modify_args
*args
)
773 switch (args
->event
) {
775 /* TODO: Not implemented. */
781 args
->errmsg
, args
->errmsg_len
,
782 "'redistribute X route-map FOO' command not implemented yet");
790 eigrpd_instance_redistribute_route_map_destroy(struct nb_cb_destroy_args
*args
)
792 switch (args
->event
) {
794 /* TODO: Not implemented. */
800 args
->errmsg
, args
->errmsg_len
,
801 "'no redistribute X route-map FOO' command not implemented yet");
809 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth
811 static int eigrpd_instance_redistribute_metrics_bandwidth_modify(
812 struct nb_cb_modify_args
*args
)
814 struct eigrp_metrics metrics
;
818 switch (args
->event
) {
825 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
826 proto
= yang_dnode_get_enum(args
->dnode
, "../../protocol");
827 redistribute_get_metrics(args
->dnode
, &metrics
);
828 eigrp_redistribute_set(eigrp
, proto
, metrics
);
835 static int eigrpd_instance_redistribute_metrics_bandwidth_destroy(
836 struct nb_cb_destroy_args
*args
)
838 struct eigrp_metrics metrics
;
842 switch (args
->event
) {
849 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
850 proto
= yang_dnode_get_enum(args
->dnode
, "../../protocol");
851 redistribute_get_metrics(args
->dnode
, &metrics
);
852 eigrp_redistribute_set(eigrp
, proto
, metrics
);
860 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/delay
862 static int eigrpd_instance_redistribute_metrics_delay_modify(
863 struct nb_cb_modify_args
*args
)
865 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
868 static int eigrpd_instance_redistribute_metrics_delay_destroy(
869 struct nb_cb_destroy_args
*args
)
871 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
875 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability
877 static int eigrpd_instance_redistribute_metrics_reliability_modify(
878 struct nb_cb_modify_args
*args
)
880 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
883 static int eigrpd_instance_redistribute_metrics_reliability_destroy(
884 struct nb_cb_destroy_args
*args
)
886 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
890 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/load
893 eigrpd_instance_redistribute_metrics_load_modify(struct nb_cb_modify_args
*args
)
895 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
898 static int eigrpd_instance_redistribute_metrics_load_destroy(
899 struct nb_cb_destroy_args
*args
)
901 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
905 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu
908 eigrpd_instance_redistribute_metrics_mtu_modify(struct nb_cb_modify_args
*args
)
910 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
913 static int eigrpd_instance_redistribute_metrics_mtu_destroy(
914 struct nb_cb_destroy_args
*args
)
916 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
920 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/delay
922 static int lib_interface_eigrp_delay_modify(struct nb_cb_modify_args
*args
)
924 struct eigrp_interface
*ei
;
925 struct interface
*ifp
;
927 switch (args
->event
) {
929 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
932 * XXX: we can't verify if the interface exists
933 * and is active until EIGRP is up.
940 return NB_ERR_INCONSISTENCY
;
947 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
950 return NB_ERR_INCONSISTENCY
;
952 ei
->params
.delay
= yang_dnode_get_uint32(args
->dnode
, NULL
);
961 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth
963 static int lib_interface_eigrp_bandwidth_modify(struct nb_cb_modify_args
*args
)
965 struct interface
*ifp
;
966 struct eigrp_interface
*ei
;
968 switch (args
->event
) {
970 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
973 * XXX: we can't verify if the interface exists
974 * and is active until EIGRP is up.
981 return NB_ERR_INCONSISTENCY
;
988 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
991 return NB_ERR_INCONSISTENCY
;
993 ei
->params
.bandwidth
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1002 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval
1005 lib_interface_eigrp_hello_interval_modify(struct nb_cb_modify_args
*args
)
1007 struct interface
*ifp
;
1008 struct eigrp_interface
*ei
;
1010 switch (args
->event
) {
1011 case NB_EV_VALIDATE
:
1012 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1015 * XXX: we can't verify if the interface exists
1016 * and is active until EIGRP is up.
1023 return NB_ERR_INCONSISTENCY
;
1030 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1033 return NB_ERR_INCONSISTENCY
;
1035 ei
->params
.v_hello
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1043 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time
1045 static int lib_interface_eigrp_hold_time_modify(struct nb_cb_modify_args
*args
)
1047 struct interface
*ifp
;
1048 struct eigrp_interface
*ei
;
1050 switch (args
->event
) {
1051 case NB_EV_VALIDATE
:
1052 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1055 * XXX: we can't verify if the interface exists
1056 * and is active until EIGRP is up.
1063 return NB_ERR_INCONSISTENCY
;
1070 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1073 return NB_ERR_INCONSISTENCY
;
1075 ei
->params
.v_wait
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1083 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon
1086 lib_interface_eigrp_split_horizon_modify(struct nb_cb_modify_args
*args
)
1088 switch (args
->event
) {
1089 case NB_EV_VALIDATE
:
1090 /* TODO: Not implemented. */
1095 snprintf(args
->errmsg
, args
->errmsg_len
,
1096 "split-horizon command not implemented yet");
1105 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance
1107 static int lib_interface_eigrp_instance_create(struct nb_cb_create_args
*args
)
1109 struct eigrp_interface
*eif
;
1110 struct interface
*ifp
;
1111 struct eigrp
*eigrp
;
1113 switch (args
->event
) {
1114 case NB_EV_VALIDATE
:
1115 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1118 * XXX: we can't verify if the interface exists
1119 * and is active until EIGRP is up.
1124 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
1126 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1128 return NB_ERR_INCONSISTENCY
;
1135 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1136 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
1138 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1140 return NB_ERR_INCONSISTENCY
;
1142 nb_running_set_entry(args
->dnode
, eif
);
1149 static int lib_interface_eigrp_instance_destroy(struct nb_cb_destroy_args
*args
)
1151 switch (args
->event
) {
1152 case NB_EV_VALIDATE
:
1158 nb_running_unset_entry(args
->dnode
);
1167 * /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses
1169 static int lib_interface_eigrp_instance_summarize_addresses_create(
1170 struct nb_cb_create_args
*args
)
1172 switch (args
->event
) {
1173 case NB_EV_VALIDATE
:
1174 /* TODO: Not implemented. */
1179 snprintf(args
->errmsg
, args
->errmsg_len
,
1180 "summary command not implemented yet");
1187 static int lib_interface_eigrp_instance_summarize_addresses_destroy(
1188 struct nb_cb_destroy_args
*args
)
1190 switch (args
->event
) {
1191 case NB_EV_VALIDATE
:
1192 /* TODO: Not implemented. */
1197 snprintf(args
->errmsg
, args
->errmsg_len
,
1198 "no summary command not implemented yet");
1207 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication
1209 static int lib_interface_eigrp_instance_authentication_modify(
1210 struct nb_cb_modify_args
*args
)
1212 struct eigrp_interface
*eif
;
1214 switch (args
->event
) {
1215 case NB_EV_VALIDATE
:
1221 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1222 eif
->params
.auth_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1230 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain
1233 lib_interface_eigrp_instance_keychain_modify(struct nb_cb_modify_args
*args
)
1235 struct eigrp_interface
*eif
;
1236 struct keychain
*keychain
;
1238 switch (args
->event
) {
1239 case NB_EV_VALIDATE
:
1240 keychain
= keychain_lookup(
1241 yang_dnode_get_string(args
->dnode
, NULL
));
1242 if (keychain
== NULL
)
1243 return NB_ERR_INCONSISTENCY
;
1246 args
->resource
->ptr
=
1247 strdup(yang_dnode_get_string(args
->dnode
, NULL
));
1248 if (args
->resource
->ptr
== NULL
)
1249 return NB_ERR_RESOURCE
;
1252 free(args
->resource
->ptr
);
1253 args
->resource
->ptr
= NULL
;
1256 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1257 if (eif
->params
.auth_keychain
)
1258 free(eif
->params
.auth_keychain
);
1260 eif
->params
.auth_keychain
= args
->resource
->ptr
;
1268 lib_interface_eigrp_instance_keychain_destroy(struct nb_cb_destroy_args
*args
)
1270 struct eigrp_interface
*eif
;
1272 switch (args
->event
) {
1273 case NB_EV_VALIDATE
:
1279 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1280 if (eif
->params
.auth_keychain
)
1281 free(eif
->params
.auth_keychain
);
1283 eif
->params
.auth_keychain
= NULL
;
1290 /* clang-format off */
1291 const struct frr_yang_module_info frr_eigrpd_info
= {
1292 .name
= "frr-eigrpd",
1295 .xpath
= "/frr-eigrpd:eigrpd/instance",
1297 .create
= eigrpd_instance_create
,
1298 .destroy
= eigrpd_instance_destroy
,
1299 .cli_show
= eigrp_cli_show_header
,
1300 .cli_show_end
= eigrp_cli_show_end_header
,
1304 .xpath
= "/frr-eigrpd:eigrpd/instance/router-id",
1306 .modify
= eigrpd_instance_router_id_modify
,
1307 .destroy
= eigrpd_instance_router_id_destroy
,
1308 .cli_show
= eigrp_cli_show_router_id
,
1312 .xpath
= "/frr-eigrpd:eigrpd/instance/passive-interface",
1314 .create
= eigrpd_instance_passive_interface_create
,
1315 .destroy
= eigrpd_instance_passive_interface_destroy
,
1316 .cli_show
= eigrp_cli_show_passive_interface
,
1320 .xpath
= "/frr-eigrpd:eigrpd/instance/active-time",
1322 .modify
= eigrpd_instance_active_time_modify
,
1323 .cli_show
= eigrp_cli_show_active_time
,
1327 .xpath
= "/frr-eigrpd:eigrpd/instance/variance",
1329 .modify
= eigrpd_instance_variance_modify
,
1330 .destroy
= eigrpd_instance_variance_destroy
,
1331 .cli_show
= eigrp_cli_show_variance
,
1335 .xpath
= "/frr-eigrpd:eigrpd/instance/maximum-paths",
1337 .modify
= eigrpd_instance_maximum_paths_modify
,
1338 .destroy
= eigrpd_instance_maximum_paths_destroy
,
1339 .cli_show
= eigrp_cli_show_maximum_paths
,
1343 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights",
1345 .cli_show
= eigrp_cli_show_metrics
,
1349 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K1",
1351 .modify
= eigrpd_instance_metric_weights_K1_modify
,
1352 .destroy
= eigrpd_instance_metric_weights_K1_destroy
,
1356 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K2",
1358 .modify
= eigrpd_instance_metric_weights_K2_modify
,
1359 .destroy
= eigrpd_instance_metric_weights_K2_destroy
,
1363 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K3",
1365 .modify
= eigrpd_instance_metric_weights_K3_modify
,
1366 .destroy
= eigrpd_instance_metric_weights_K3_destroy
,
1370 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K4",
1372 .modify
= eigrpd_instance_metric_weights_K4_modify
,
1373 .destroy
= eigrpd_instance_metric_weights_K4_destroy
,
1377 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K5",
1379 .modify
= eigrpd_instance_metric_weights_K5_modify
,
1380 .destroy
= eigrpd_instance_metric_weights_K5_destroy
,
1384 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K6",
1386 .modify
= eigrpd_instance_metric_weights_K6_modify
,
1387 .destroy
= eigrpd_instance_metric_weights_K6_destroy
,
1391 .xpath
= "/frr-eigrpd:eigrpd/instance/network",
1393 .create
= eigrpd_instance_network_create
,
1394 .destroy
= eigrpd_instance_network_destroy
,
1395 .cli_show
= eigrp_cli_show_network
,
1399 .xpath
= "/frr-eigrpd:eigrpd/instance/neighbor",
1401 .create
= eigrpd_instance_neighbor_create
,
1402 .destroy
= eigrpd_instance_neighbor_destroy
,
1403 .cli_show
= eigrp_cli_show_neighbor
,
1407 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute",
1409 .create
= eigrpd_instance_redistribute_create
,
1410 .destroy
= eigrpd_instance_redistribute_destroy
,
1411 .cli_show
= eigrp_cli_show_redistribute
,
1415 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/route-map",
1417 .modify
= eigrpd_instance_redistribute_route_map_modify
,
1418 .destroy
= eigrpd_instance_redistribute_route_map_destroy
,
1422 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth",
1424 .modify
= eigrpd_instance_redistribute_metrics_bandwidth_modify
,
1425 .destroy
= eigrpd_instance_redistribute_metrics_bandwidth_destroy
,
1429 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/delay",
1431 .modify
= eigrpd_instance_redistribute_metrics_delay_modify
,
1432 .destroy
= eigrpd_instance_redistribute_metrics_delay_destroy
,
1436 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability",
1438 .modify
= eigrpd_instance_redistribute_metrics_reliability_modify
,
1439 .destroy
= eigrpd_instance_redistribute_metrics_reliability_destroy
,
1443 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/load",
1445 .modify
= eigrpd_instance_redistribute_metrics_load_modify
,
1446 .destroy
= eigrpd_instance_redistribute_metrics_load_destroy
,
1450 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu",
1452 .modify
= eigrpd_instance_redistribute_metrics_mtu_modify
,
1453 .destroy
= eigrpd_instance_redistribute_metrics_mtu_destroy
,
1457 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/delay",
1459 .modify
= lib_interface_eigrp_delay_modify
,
1460 .cli_show
= eigrp_cli_show_delay
,
1464 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth",
1466 .modify
= lib_interface_eigrp_bandwidth_modify
,
1467 .cli_show
= eigrp_cli_show_bandwidth
,
1471 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval",
1473 .modify
= lib_interface_eigrp_hello_interval_modify
,
1474 .cli_show
= eigrp_cli_show_hello_interval
,
1478 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time",
1480 .modify
= lib_interface_eigrp_hold_time_modify
,
1481 .cli_show
= eigrp_cli_show_hold_time
,
1485 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon",
1487 .modify
= lib_interface_eigrp_split_horizon_modify
,
1491 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance",
1493 .create
= lib_interface_eigrp_instance_create
,
1494 .destroy
= lib_interface_eigrp_instance_destroy
,
1498 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses",
1500 .create
= lib_interface_eigrp_instance_summarize_addresses_create
,
1501 .destroy
= lib_interface_eigrp_instance_summarize_addresses_destroy
,
1502 .cli_show
= eigrp_cli_show_summarize_address
,
1506 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication",
1508 .modify
= lib_interface_eigrp_instance_authentication_modify
,
1509 .cli_show
= eigrp_cli_show_authentication
,
1513 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain",
1515 .modify
= lib_interface_eigrp_instance_keychain_modify
,
1516 .destroy
= lib_interface_eigrp_instance_keychain_destroy
,
1517 .cli_show
= eigrp_cli_show_keychain
,