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
)
85 switch (args
->event
) {
90 vrf
= yang_dnode_get_string(args
->dnode
, "./vrf");
92 pVrf
= vrf_lookup_by_name(vrf
);
98 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
100 args
->resource
->ptr
= eigrp
;
103 eigrp_finish_final(args
->resource
->ptr
);
106 nb_running_set_entry(args
->dnode
, args
->resource
->ptr
);
113 static int eigrpd_instance_destroy(struct nb_cb_destroy_args
*args
)
117 switch (args
->event
) {
124 eigrp
= nb_running_unset_entry(args
->dnode
);
125 eigrp_finish_final(eigrp
);
133 * XPath: /frr-eigrpd:eigrpd/instance/router-id
135 static int eigrpd_instance_router_id_modify(struct nb_cb_modify_args
*args
)
139 switch (args
->event
) {
146 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
147 yang_dnode_get_ipv4(&eigrp
->router_id_static
, args
->dnode
,
155 static int eigrpd_instance_router_id_destroy(struct nb_cb_destroy_args
*args
)
159 switch (args
->event
) {
166 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
167 eigrp
->router_id_static
.s_addr
= INADDR_ANY
;
175 * XPath: /frr-eigrpd:eigrpd/instance/passive-interface
178 eigrpd_instance_passive_interface_create(struct nb_cb_create_args
*args
)
180 struct eigrp_interface
*eif
;
184 switch (args
->event
) {
186 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
189 * XXX: we can't verify if the interface exists
190 * and is active until EIGRP is up.
195 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
196 eif
= eigrp_interface_lookup(eigrp
, ifname
);
198 return NB_ERR_INCONSISTENCY
;
205 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
206 ifname
= yang_dnode_get_string(args
->dnode
, NULL
);
207 eif
= eigrp_interface_lookup(eigrp
, ifname
);
209 return NB_ERR_INCONSISTENCY
;
211 eif
->params
.passive_interface
= EIGRP_IF_PASSIVE
;
219 eigrpd_instance_passive_interface_destroy(struct nb_cb_destroy_args
*args
)
221 struct eigrp_interface
*eif
;
225 switch (args
->event
) {
232 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
233 ifname
= yang_dnode_get_string(args
->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(struct nb_cb_modify_args
*args
)
250 switch (args
->event
) {
252 /* TODO: Not implemented. */
257 snprintf(args
->errmsg
, args
->errmsg_len
,
258 "active time not implemented yet");
267 * XPath: /frr-eigrpd:eigrpd/instance/variance
269 static int eigrpd_instance_variance_modify(struct nb_cb_modify_args
*args
)
273 switch (args
->event
) {
280 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
281 eigrp
->variance
= yang_dnode_get_uint8(args
->dnode
, NULL
);
288 static int eigrpd_instance_variance_destroy(struct nb_cb_destroy_args
*args
)
292 switch (args
->event
) {
299 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
300 eigrp
->variance
= EIGRP_VARIANCE_DEFAULT
;
308 * XPath: /frr-eigrpd:eigrpd/instance/maximum-paths
310 static int eigrpd_instance_maximum_paths_modify(struct nb_cb_modify_args
*args
)
314 switch (args
->event
) {
321 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
322 eigrp
->max_paths
= yang_dnode_get_uint8(args
->dnode
, NULL
);
330 eigrpd_instance_maximum_paths_destroy(struct nb_cb_destroy_args
*args
)
334 switch (args
->event
) {
341 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
342 eigrp
->max_paths
= EIGRP_MAX_PATHS_DEFAULT
;
350 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K1
353 eigrpd_instance_metric_weights_K1_modify(struct nb_cb_modify_args
*args
)
357 switch (args
->event
) {
364 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
365 eigrp
->k_values
[0] = yang_dnode_get_uint8(args
->dnode
, NULL
);
373 eigrpd_instance_metric_weights_K1_destroy(struct nb_cb_destroy_args
*args
)
377 switch (args
->event
) {
384 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
385 eigrp
->k_values
[0] = EIGRP_K1_DEFAULT
;
393 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K2
396 eigrpd_instance_metric_weights_K2_modify(struct nb_cb_modify_args
*args
)
400 switch (args
->event
) {
407 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
408 eigrp
->k_values
[1] = yang_dnode_get_uint8(args
->dnode
, NULL
);
416 eigrpd_instance_metric_weights_K2_destroy(struct nb_cb_destroy_args
*args
)
420 switch (args
->event
) {
427 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
428 eigrp
->k_values
[1] = EIGRP_K2_DEFAULT
;
436 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K3
439 eigrpd_instance_metric_weights_K3_modify(struct nb_cb_modify_args
*args
)
443 switch (args
->event
) {
450 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
451 eigrp
->k_values
[2] = yang_dnode_get_uint8(args
->dnode
, NULL
);
459 eigrpd_instance_metric_weights_K3_destroy(struct nb_cb_destroy_args
*args
)
463 switch (args
->event
) {
470 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
471 eigrp
->k_values
[2] = EIGRP_K3_DEFAULT
;
479 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K4
482 eigrpd_instance_metric_weights_K4_modify(struct nb_cb_modify_args
*args
)
486 switch (args
->event
) {
493 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
494 eigrp
->k_values
[3] = yang_dnode_get_uint8(args
->dnode
, NULL
);
502 eigrpd_instance_metric_weights_K4_destroy(struct nb_cb_destroy_args
*args
)
506 switch (args
->event
) {
513 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
514 eigrp
->k_values
[3] = EIGRP_K4_DEFAULT
;
522 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K5
525 eigrpd_instance_metric_weights_K5_modify(struct nb_cb_modify_args
*args
)
529 switch (args
->event
) {
536 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
537 eigrp
->k_values
[4] = yang_dnode_get_uint8(args
->dnode
, NULL
);
545 eigrpd_instance_metric_weights_K5_destroy(struct nb_cb_destroy_args
*args
)
549 switch (args
->event
) {
556 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
557 eigrp
->k_values
[4] = EIGRP_K5_DEFAULT
;
565 * XPath: /frr-eigrpd:eigrpd/instance/metric-weights/K6
568 eigrpd_instance_metric_weights_K6_modify(struct nb_cb_modify_args
*args
)
572 switch (args
->event
) {
579 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
580 eigrp
->k_values
[5] = yang_dnode_get_uint8(args
->dnode
, NULL
);
588 eigrpd_instance_metric_weights_K6_destroy(struct nb_cb_destroy_args
*args
)
592 switch (args
->event
) {
599 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
600 eigrp
->k_values
[5] = EIGRP_K6_DEFAULT
;
608 * XPath: /frr-eigrpd:eigrpd/instance/network
610 static int eigrpd_instance_network_create(struct nb_cb_create_args
*args
)
612 struct route_node
*rnode
;
613 struct prefix prefix
;
617 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, NULL
);
619 switch (args
->event
) {
621 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
622 /* If entry doesn't exist it means the list is empty. */
626 rnode
= route_node_get(eigrp
->networks
, &prefix
);
627 exists
= (rnode
->info
!= NULL
);
628 route_unlock_node(rnode
);
630 return NB_ERR_INCONSISTENCY
;
637 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
638 if (eigrp_network_set(eigrp
, &prefix
) == 0)
639 return NB_ERR_INCONSISTENCY
;
646 static int eigrpd_instance_network_destroy(struct nb_cb_destroy_args
*args
)
648 struct route_node
*rnode
;
649 struct prefix prefix
;
653 yang_dnode_get_ipv4p(&prefix
, args
->dnode
, NULL
);
655 switch (args
->event
) {
657 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, false);
658 /* If entry doesn't exist it means the list is empty. */
662 rnode
= route_node_get(eigrp
->networks
, &prefix
);
663 exists
= (rnode
->info
!= NULL
);
664 route_unlock_node(rnode
);
666 return NB_ERR_INCONSISTENCY
;
673 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
674 eigrp_network_unset(eigrp
, &prefix
);
682 * XPath: /frr-eigrpd:eigrpd/instance/neighbor
684 static int eigrpd_instance_neighbor_create(struct nb_cb_create_args
*args
)
686 switch (args
->event
) {
688 /* TODO: Not implemented. */
693 snprintf(args
->errmsg
, args
->errmsg_len
,
694 "neighbor Command is not implemented yet");
701 static int eigrpd_instance_neighbor_destroy(struct nb_cb_destroy_args
*args
)
703 switch (args
->event
) {
705 /* TODO: Not implemented. */
710 snprintf(args
->errmsg
, args
->errmsg_len
,
711 "no neighbor Command is not implemented yet");
719 * XPath: /frr-eigrpd:eigrpd/instance/redistribute
721 static int eigrpd_instance_redistribute_create(struct nb_cb_create_args
*args
)
723 struct eigrp_metrics metrics
;
730 switch (args
->event
) {
732 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
733 vrfname
= yang_dnode_get_string(args
->dnode
, "../vrf");
735 pVrf
= vrf_lookup_by_name(vrfname
);
737 vrfid
= pVrf
->vrf_id
;
741 if (vrf_bitmap_check(zclient
->redist
[AFI_IP
][proto
], vrfid
))
742 return NB_ERR_INCONSISTENCY
;
749 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
750 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
751 redistribute_get_metrics(args
->dnode
, &metrics
);
752 eigrp_redistribute_set(eigrp
, proto
, metrics
);
759 static int eigrpd_instance_redistribute_destroy(struct nb_cb_destroy_args
*args
)
764 switch (args
->event
) {
771 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
772 proto
= yang_dnode_get_enum(args
->dnode
, "./protocol");
773 eigrp_redistribute_unset(eigrp
, proto
);
781 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/route-map
784 eigrpd_instance_redistribute_route_map_modify(struct nb_cb_modify_args
*args
)
786 switch (args
->event
) {
788 /* TODO: Not implemented. */
794 args
->errmsg
, args
->errmsg_len
,
795 "'redistribute X route-map FOO' command not implemented yet");
803 eigrpd_instance_redistribute_route_map_destroy(struct nb_cb_destroy_args
*args
)
805 switch (args
->event
) {
807 /* TODO: Not implemented. */
813 args
->errmsg
, args
->errmsg_len
,
814 "'no redistribute X route-map FOO' command not implemented yet");
822 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth
824 static int eigrpd_instance_redistribute_metrics_bandwidth_modify(
825 struct nb_cb_modify_args
*args
)
827 struct eigrp_metrics metrics
;
831 switch (args
->event
) {
838 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
839 proto
= yang_dnode_get_enum(args
->dnode
, "../../protocol");
840 redistribute_get_metrics(args
->dnode
, &metrics
);
841 eigrp_redistribute_set(eigrp
, proto
, metrics
);
848 static int eigrpd_instance_redistribute_metrics_bandwidth_destroy(
849 struct nb_cb_destroy_args
*args
)
851 struct eigrp_metrics metrics
;
855 switch (args
->event
) {
862 eigrp
= nb_running_get_entry(args
->dnode
, NULL
, true);
863 proto
= yang_dnode_get_enum(args
->dnode
, "../../protocol");
864 redistribute_get_metrics(args
->dnode
, &metrics
);
865 eigrp_redistribute_set(eigrp
, proto
, metrics
);
873 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/delay
875 static int eigrpd_instance_redistribute_metrics_delay_modify(
876 struct nb_cb_modify_args
*args
)
878 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
881 static int eigrpd_instance_redistribute_metrics_delay_destroy(
882 struct nb_cb_destroy_args
*args
)
884 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
888 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability
890 static int eigrpd_instance_redistribute_metrics_reliability_modify(
891 struct nb_cb_modify_args
*args
)
893 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
896 static int eigrpd_instance_redistribute_metrics_reliability_destroy(
897 struct nb_cb_destroy_args
*args
)
899 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
903 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/load
906 eigrpd_instance_redistribute_metrics_load_modify(struct nb_cb_modify_args
*args
)
908 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
911 static int eigrpd_instance_redistribute_metrics_load_destroy(
912 struct nb_cb_destroy_args
*args
)
914 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
918 * XPath: /frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu
921 eigrpd_instance_redistribute_metrics_mtu_modify(struct nb_cb_modify_args
*args
)
923 return eigrpd_instance_redistribute_metrics_bandwidth_modify(args
);
926 static int eigrpd_instance_redistribute_metrics_mtu_destroy(
927 struct nb_cb_destroy_args
*args
)
929 return eigrpd_instance_redistribute_metrics_bandwidth_destroy(args
);
933 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/delay
935 static int lib_interface_eigrp_delay_modify(struct nb_cb_modify_args
*args
)
937 struct eigrp_interface
*ei
;
938 struct interface
*ifp
;
940 switch (args
->event
) {
942 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
945 * XXX: we can't verify if the interface exists
946 * and is active until EIGRP is up.
953 return NB_ERR_INCONSISTENCY
;
960 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
963 return NB_ERR_INCONSISTENCY
;
965 ei
->params
.delay
= yang_dnode_get_uint32(args
->dnode
, NULL
);
974 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth
976 static int lib_interface_eigrp_bandwidth_modify(struct nb_cb_modify_args
*args
)
978 struct interface
*ifp
;
979 struct eigrp_interface
*ei
;
981 switch (args
->event
) {
983 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
986 * XXX: we can't verify if the interface exists
987 * and is active until EIGRP is up.
994 return NB_ERR_INCONSISTENCY
;
1001 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1004 return NB_ERR_INCONSISTENCY
;
1006 ei
->params
.bandwidth
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1007 eigrp_if_reset(ifp
);
1015 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval
1018 lib_interface_eigrp_hello_interval_modify(struct nb_cb_modify_args
*args
)
1020 struct interface
*ifp
;
1021 struct eigrp_interface
*ei
;
1023 switch (args
->event
) {
1024 case NB_EV_VALIDATE
:
1025 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1028 * XXX: we can't verify if the interface exists
1029 * and is active until EIGRP is up.
1036 return NB_ERR_INCONSISTENCY
;
1043 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1046 return NB_ERR_INCONSISTENCY
;
1048 ei
->params
.v_hello
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1056 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time
1058 static int lib_interface_eigrp_hold_time_modify(struct nb_cb_modify_args
*args
)
1060 struct interface
*ifp
;
1061 struct eigrp_interface
*ei
;
1063 switch (args
->event
) {
1064 case NB_EV_VALIDATE
:
1065 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1068 * XXX: we can't verify if the interface exists
1069 * and is active until EIGRP is up.
1076 return NB_ERR_INCONSISTENCY
;
1083 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1086 return NB_ERR_INCONSISTENCY
;
1088 ei
->params
.v_wait
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1096 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon
1099 lib_interface_eigrp_split_horizon_modify(struct nb_cb_modify_args
*args
)
1101 switch (args
->event
) {
1102 case NB_EV_VALIDATE
:
1103 /* TODO: Not implemented. */
1108 snprintf(args
->errmsg
, args
->errmsg_len
,
1109 "split-horizon command not implemented yet");
1118 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance
1120 static int lib_interface_eigrp_instance_create(struct nb_cb_create_args
*args
)
1122 struct eigrp_interface
*eif
;
1123 struct interface
*ifp
;
1124 struct eigrp
*eigrp
;
1126 switch (args
->event
) {
1127 case NB_EV_VALIDATE
:
1128 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
1131 * XXX: we can't verify if the interface exists
1132 * and is active until EIGRP is up.
1137 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
1139 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1141 return NB_ERR_INCONSISTENCY
;
1148 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1149 eigrp
= eigrp_get(yang_dnode_get_uint16(args
->dnode
, "./asn"),
1151 eif
= eigrp_interface_lookup(eigrp
, ifp
->name
);
1153 return NB_ERR_INCONSISTENCY
;
1155 nb_running_set_entry(args
->dnode
, eif
);
1162 static int lib_interface_eigrp_instance_destroy(struct nb_cb_destroy_args
*args
)
1164 switch (args
->event
) {
1165 case NB_EV_VALIDATE
:
1171 nb_running_unset_entry(args
->dnode
);
1180 * /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses
1182 static int lib_interface_eigrp_instance_summarize_addresses_create(
1183 struct nb_cb_create_args
*args
)
1185 switch (args
->event
) {
1186 case NB_EV_VALIDATE
:
1187 /* TODO: Not implemented. */
1192 snprintf(args
->errmsg
, args
->errmsg_len
,
1193 "summary command not implemented yet");
1200 static int lib_interface_eigrp_instance_summarize_addresses_destroy(
1201 struct nb_cb_destroy_args
*args
)
1203 switch (args
->event
) {
1204 case NB_EV_VALIDATE
:
1205 /* TODO: Not implemented. */
1210 snprintf(args
->errmsg
, args
->errmsg_len
,
1211 "no summary command not implemented yet");
1220 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication
1222 static int lib_interface_eigrp_instance_authentication_modify(
1223 struct nb_cb_modify_args
*args
)
1225 struct eigrp_interface
*eif
;
1227 switch (args
->event
) {
1228 case NB_EV_VALIDATE
:
1234 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1235 eif
->params
.auth_type
= yang_dnode_get_enum(args
->dnode
, NULL
);
1243 * XPath: /frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain
1246 lib_interface_eigrp_instance_keychain_modify(struct nb_cb_modify_args
*args
)
1248 struct eigrp_interface
*eif
;
1249 struct keychain
*keychain
;
1251 switch (args
->event
) {
1252 case NB_EV_VALIDATE
:
1253 keychain
= keychain_lookup(
1254 yang_dnode_get_string(args
->dnode
, NULL
));
1255 if (keychain
== NULL
)
1256 return NB_ERR_INCONSISTENCY
;
1259 args
->resource
->ptr
=
1260 strdup(yang_dnode_get_string(args
->dnode
, NULL
));
1261 if (args
->resource
->ptr
== NULL
)
1262 return NB_ERR_RESOURCE
;
1265 free(args
->resource
->ptr
);
1266 args
->resource
->ptr
= NULL
;
1269 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1270 if (eif
->params
.auth_keychain
)
1271 free(eif
->params
.auth_keychain
);
1273 eif
->params
.auth_keychain
= args
->resource
->ptr
;
1281 lib_interface_eigrp_instance_keychain_destroy(struct nb_cb_destroy_args
*args
)
1283 struct eigrp_interface
*eif
;
1285 switch (args
->event
) {
1286 case NB_EV_VALIDATE
:
1292 eif
= nb_running_get_entry(args
->dnode
, NULL
, true);
1293 if (eif
->params
.auth_keychain
)
1294 free(eif
->params
.auth_keychain
);
1296 eif
->params
.auth_keychain
= NULL
;
1303 /* clang-format off */
1304 const struct frr_yang_module_info frr_eigrpd_info
= {
1305 .name
= "frr-eigrpd",
1308 .xpath
= "/frr-eigrpd:eigrpd/instance",
1310 .create
= eigrpd_instance_create
,
1311 .destroy
= eigrpd_instance_destroy
,
1312 .cli_show
= eigrp_cli_show_header
,
1313 .cli_show_end
= eigrp_cli_show_end_header
,
1317 .xpath
= "/frr-eigrpd:eigrpd/instance/router-id",
1319 .modify
= eigrpd_instance_router_id_modify
,
1320 .destroy
= eigrpd_instance_router_id_destroy
,
1321 .cli_show
= eigrp_cli_show_router_id
,
1325 .xpath
= "/frr-eigrpd:eigrpd/instance/passive-interface",
1327 .create
= eigrpd_instance_passive_interface_create
,
1328 .destroy
= eigrpd_instance_passive_interface_destroy
,
1329 .cli_show
= eigrp_cli_show_passive_interface
,
1333 .xpath
= "/frr-eigrpd:eigrpd/instance/active-time",
1335 .modify
= eigrpd_instance_active_time_modify
,
1336 .cli_show
= eigrp_cli_show_active_time
,
1340 .xpath
= "/frr-eigrpd:eigrpd/instance/variance",
1342 .modify
= eigrpd_instance_variance_modify
,
1343 .destroy
= eigrpd_instance_variance_destroy
,
1344 .cli_show
= eigrp_cli_show_variance
,
1348 .xpath
= "/frr-eigrpd:eigrpd/instance/maximum-paths",
1350 .modify
= eigrpd_instance_maximum_paths_modify
,
1351 .destroy
= eigrpd_instance_maximum_paths_destroy
,
1352 .cli_show
= eigrp_cli_show_maximum_paths
,
1356 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights",
1358 .cli_show
= eigrp_cli_show_metrics
,
1362 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K1",
1364 .modify
= eigrpd_instance_metric_weights_K1_modify
,
1365 .destroy
= eigrpd_instance_metric_weights_K1_destroy
,
1369 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K2",
1371 .modify
= eigrpd_instance_metric_weights_K2_modify
,
1372 .destroy
= eigrpd_instance_metric_weights_K2_destroy
,
1376 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K3",
1378 .modify
= eigrpd_instance_metric_weights_K3_modify
,
1379 .destroy
= eigrpd_instance_metric_weights_K3_destroy
,
1383 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K4",
1385 .modify
= eigrpd_instance_metric_weights_K4_modify
,
1386 .destroy
= eigrpd_instance_metric_weights_K4_destroy
,
1390 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K5",
1392 .modify
= eigrpd_instance_metric_weights_K5_modify
,
1393 .destroy
= eigrpd_instance_metric_weights_K5_destroy
,
1397 .xpath
= "/frr-eigrpd:eigrpd/instance/metric-weights/K6",
1399 .modify
= eigrpd_instance_metric_weights_K6_modify
,
1400 .destroy
= eigrpd_instance_metric_weights_K6_destroy
,
1404 .xpath
= "/frr-eigrpd:eigrpd/instance/network",
1406 .create
= eigrpd_instance_network_create
,
1407 .destroy
= eigrpd_instance_network_destroy
,
1408 .cli_show
= eigrp_cli_show_network
,
1412 .xpath
= "/frr-eigrpd:eigrpd/instance/neighbor",
1414 .create
= eigrpd_instance_neighbor_create
,
1415 .destroy
= eigrpd_instance_neighbor_destroy
,
1416 .cli_show
= eigrp_cli_show_neighbor
,
1420 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute",
1422 .create
= eigrpd_instance_redistribute_create
,
1423 .destroy
= eigrpd_instance_redistribute_destroy
,
1424 .cli_show
= eigrp_cli_show_redistribute
,
1428 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/route-map",
1430 .modify
= eigrpd_instance_redistribute_route_map_modify
,
1431 .destroy
= eigrpd_instance_redistribute_route_map_destroy
,
1435 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/bandwidth",
1437 .modify
= eigrpd_instance_redistribute_metrics_bandwidth_modify
,
1438 .destroy
= eigrpd_instance_redistribute_metrics_bandwidth_destroy
,
1442 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/delay",
1444 .modify
= eigrpd_instance_redistribute_metrics_delay_modify
,
1445 .destroy
= eigrpd_instance_redistribute_metrics_delay_destroy
,
1449 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/reliability",
1451 .modify
= eigrpd_instance_redistribute_metrics_reliability_modify
,
1452 .destroy
= eigrpd_instance_redistribute_metrics_reliability_destroy
,
1456 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/load",
1458 .modify
= eigrpd_instance_redistribute_metrics_load_modify
,
1459 .destroy
= eigrpd_instance_redistribute_metrics_load_destroy
,
1463 .xpath
= "/frr-eigrpd:eigrpd/instance/redistribute/metrics/mtu",
1465 .modify
= eigrpd_instance_redistribute_metrics_mtu_modify
,
1466 .destroy
= eigrpd_instance_redistribute_metrics_mtu_destroy
,
1470 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/delay",
1472 .modify
= lib_interface_eigrp_delay_modify
,
1473 .cli_show
= eigrp_cli_show_delay
,
1477 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/bandwidth",
1479 .modify
= lib_interface_eigrp_bandwidth_modify
,
1480 .cli_show
= eigrp_cli_show_bandwidth
,
1484 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hello-interval",
1486 .modify
= lib_interface_eigrp_hello_interval_modify
,
1487 .cli_show
= eigrp_cli_show_hello_interval
,
1491 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/hold-time",
1493 .modify
= lib_interface_eigrp_hold_time_modify
,
1494 .cli_show
= eigrp_cli_show_hold_time
,
1498 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/split-horizon",
1500 .modify
= lib_interface_eigrp_split_horizon_modify
,
1504 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance",
1506 .create
= lib_interface_eigrp_instance_create
,
1507 .destroy
= lib_interface_eigrp_instance_destroy
,
1511 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/summarize-addresses",
1513 .create
= lib_interface_eigrp_instance_summarize_addresses_create
,
1514 .destroy
= lib_interface_eigrp_instance_summarize_addresses_destroy
,
1515 .cli_show
= eigrp_cli_show_summarize_address
,
1519 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/authentication",
1521 .modify
= lib_interface_eigrp_instance_authentication_modify
,
1522 .cli_show
= eigrp_cli_show_authentication
,
1526 .xpath
= "/frr-interface:lib/interface/frr-eigrpd:eigrp/instance/keychain",
1528 .modify
= lib_interface_eigrp_instance_keychain_modify
,
1529 .destroy
= lib_interface_eigrp_instance_keychain_destroy
,
1530 .cli_show
= eigrp_cli_show_keychain
,