]>
git.proxmox.com Git - mirror_frr.git/blob - zebra/zebra_nb_config.c
2 * Copyright (C) 2019 Cumulus Networks, Inc.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along
16 * with this program; see the file COPYING; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "lib/northbound.h"
24 #include "lib/printfrr.h"
26 #include "lib/command.h"
27 #include "lib/routemap.h"
28 #include "zebra/zebra_nb.h"
29 #include "zebra/rib.h"
31 #include "zebra/interface.h"
32 #include "zebra/connected.h"
33 #include "zebra/zebra_router.h"
34 #include "zebra/debug.h"
35 #include "zebra/zebra_vxlan_private.h"
36 #include "zebra/zebra_vxlan.h"
39 * XPath: /frr-zebra:zebra/mcast-rpf-lookup
41 int zebra_mcast_rpf_lookup_modify(struct nb_cb_modify_args
*args
)
43 switch (args
->event
) {
48 /* TODO: implement me. */
56 * XPath: /frr-zebra:zebra/ip-forwarding
58 int zebra_ip_forwarding_modify(struct nb_cb_modify_args
*args
)
60 switch (args
->event
) {
65 /* TODO: implement me. */
72 int zebra_ip_forwarding_destroy(struct nb_cb_destroy_args
*args
)
74 switch (args
->event
) {
79 /* TODO: implement me. */
87 * XPath: /frr-zebra:zebra/ipv6-forwarding
89 int zebra_ipv6_forwarding_modify(struct nb_cb_modify_args
*args
)
91 switch (args
->event
) {
96 /* TODO: implement me. */
103 int zebra_ipv6_forwarding_destroy(struct nb_cb_destroy_args
*args
)
105 switch (args
->event
) {
110 /* TODO: implement me. */
118 * XPath: /frr-zebra:zebra/workqueue-hold-timer
120 int zebra_workqueue_hold_timer_modify(struct nb_cb_modify_args
*args
)
122 switch (args
->event
) {
127 /* TODO: implement me. */
135 * XPath: /frr-zebra:zebra/zapi-packets
137 int zebra_zapi_packets_modify(struct nb_cb_modify_args
*args
)
139 switch (args
->event
) {
144 /* TODO: implement me. */
152 * XPath: /frr-zebra:zebra/import-kernel-table/table-id
154 int zebra_import_kernel_table_table_id_modify(struct nb_cb_modify_args
*args
)
156 switch (args
->event
) {
161 /* TODO: implement me. */
168 int zebra_import_kernel_table_table_id_destroy(struct nb_cb_destroy_args
*args
)
170 switch (args
->event
) {
175 /* TODO: implement me. */
183 * XPath: /frr-zebra:zebra/import-kernel-table/distance
185 int zebra_import_kernel_table_distance_modify(struct nb_cb_modify_args
*args
)
187 switch (args
->event
) {
192 /* TODO: implement me. */
200 * XPath: /frr-zebra:zebra/import-kernel-table/route-map
202 int zebra_import_kernel_table_route_map_modify(struct nb_cb_modify_args
*args
)
204 switch (args
->event
) {
209 /* TODO: implement me. */
216 int zebra_import_kernel_table_route_map_destroy(struct nb_cb_destroy_args
*args
)
218 switch (args
->event
) {
223 /* TODO: implement me. */
231 * XPath: /frr-zebra:zebra/allow-external-route-update
233 int zebra_allow_external_route_update_create(struct nb_cb_create_args
*args
)
235 switch (args
->event
) {
240 /* TODO: implement me. */
247 int zebra_allow_external_route_update_destroy(struct nb_cb_destroy_args
*args
)
249 switch (args
->event
) {
254 /* TODO: implement me. */
262 * XPath: /frr-zebra:zebra/dplane-queue-limit
264 int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args
*args
)
266 switch (args
->event
) {
271 /* TODO: implement me. */
279 * XPath: /frr-zebra:zebra/debugs/debug-events
281 int zebra_debugs_debug_events_modify(struct nb_cb_modify_args
*args
)
283 switch (args
->event
) {
288 /* TODO: implement me. */
295 int zebra_debugs_debug_events_destroy(struct nb_cb_destroy_args
*args
)
297 switch (args
->event
) {
302 /* TODO: implement me. */
310 * XPath: /frr-zebra:zebra/debugs/debug-zapi-send
312 int zebra_debugs_debug_zapi_send_modify(struct nb_cb_modify_args
*args
)
314 switch (args
->event
) {
319 /* TODO: implement me. */
326 int zebra_debugs_debug_zapi_send_destroy(struct nb_cb_destroy_args
*args
)
328 switch (args
->event
) {
333 /* TODO: implement me. */
341 * XPath: /frr-zebra:zebra/debugs/debug-zapi-recv
343 int zebra_debugs_debug_zapi_recv_modify(struct nb_cb_modify_args
*args
)
345 switch (args
->event
) {
350 /* TODO: implement me. */
357 int zebra_debugs_debug_zapi_recv_destroy(struct nb_cb_destroy_args
*args
)
359 switch (args
->event
) {
364 /* TODO: implement me. */
372 * XPath: /frr-zebra:zebra/debugs/debug-zapi-detail
374 int zebra_debugs_debug_zapi_detail_modify(struct nb_cb_modify_args
*args
)
376 switch (args
->event
) {
381 /* TODO: implement me. */
388 int zebra_debugs_debug_zapi_detail_destroy(struct nb_cb_destroy_args
*args
)
390 switch (args
->event
) {
395 /* TODO: implement me. */
403 * XPath: /frr-zebra:zebra/debugs/debug-kernel
405 int zebra_debugs_debug_kernel_modify(struct nb_cb_modify_args
*args
)
407 switch (args
->event
) {
412 /* TODO: implement me. */
419 int zebra_debugs_debug_kernel_destroy(struct nb_cb_destroy_args
*args
)
421 switch (args
->event
) {
426 /* TODO: implement me. */
434 * XPath: /frr-zebra:zebra/debugs/debug-kernel-msg-send
436 int zebra_debugs_debug_kernel_msg_send_modify(struct nb_cb_modify_args
*args
)
438 switch (args
->event
) {
443 /* TODO: implement me. */
450 int zebra_debugs_debug_kernel_msg_send_destroy(struct nb_cb_destroy_args
*args
)
452 switch (args
->event
) {
457 /* TODO: implement me. */
465 * XPath: /frr-zebra:zebra/debugs/debug-kernel-msg-recv
467 int zebra_debugs_debug_kernel_msg_recv_modify(struct nb_cb_modify_args
*args
)
469 switch (args
->event
) {
474 /* TODO: implement me. */
481 int zebra_debugs_debug_kernel_msg_recv_destroy(struct nb_cb_destroy_args
*args
)
483 switch (args
->event
) {
488 /* TODO: implement me. */
496 * XPath: /frr-zebra:zebra/debugs/debug-rib
498 int zebra_debugs_debug_rib_modify(struct nb_cb_modify_args
*args
)
500 switch (args
->event
) {
505 /* TODO: implement me. */
512 int zebra_debugs_debug_rib_destroy(struct nb_cb_destroy_args
*args
)
514 switch (args
->event
) {
519 /* TODO: implement me. */
527 * XPath: /frr-zebra:zebra/debugs/debug-rib-detail
529 int zebra_debugs_debug_rib_detail_modify(struct nb_cb_modify_args
*args
)
531 switch (args
->event
) {
536 /* TODO: implement me. */
543 int zebra_debugs_debug_rib_detail_destroy(struct nb_cb_destroy_args
*args
)
545 switch (args
->event
) {
550 /* TODO: implement me. */
558 * XPath: /frr-zebra:zebra/debugs/debug-fpm
560 int zebra_debugs_debug_fpm_modify(struct nb_cb_modify_args
*args
)
562 switch (args
->event
) {
567 /* TODO: implement me. */
574 int zebra_debugs_debug_fpm_destroy(struct nb_cb_destroy_args
*args
)
576 switch (args
->event
) {
581 /* TODO: implement me. */
589 * XPath: /frr-zebra:zebra/debugs/debug-nht
591 int zebra_debugs_debug_nht_modify(struct nb_cb_modify_args
*args
)
593 switch (args
->event
) {
598 /* TODO: implement me. */
605 int zebra_debugs_debug_nht_destroy(struct nb_cb_destroy_args
*args
)
607 switch (args
->event
) {
612 /* TODO: implement me. */
620 * XPath: /frr-zebra:zebra/debugs/debug-nht-detail
622 int zebra_debugs_debug_nht_detail_modify(struct nb_cb_modify_args
*args
)
624 switch (args
->event
) {
629 /* TODO: implement me. */
636 int zebra_debugs_debug_nht_detail_destroy(struct nb_cb_destroy_args
*args
)
638 switch (args
->event
) {
643 /* TODO: implement me. */
651 * XPath: /frr-zebra:zebra/debugs/debug-mpls
653 int zebra_debugs_debug_mpls_modify(struct nb_cb_modify_args
*args
)
655 switch (args
->event
) {
660 /* TODO: implement me. */
667 int zebra_debugs_debug_mpls_destroy(struct nb_cb_destroy_args
*args
)
669 switch (args
->event
) {
674 /* TODO: implement me. */
682 * XPath: /frr-zebra:zebra/debugs/debug-vxlan
684 int zebra_debugs_debug_vxlan_modify(struct nb_cb_modify_args
*args
)
686 switch (args
->event
) {
691 /* TODO: implement me. */
698 int zebra_debugs_debug_vxlan_destroy(struct nb_cb_destroy_args
*args
)
700 switch (args
->event
) {
705 /* TODO: implement me. */
713 * XPath: /frr-zebra:zebra/debugs/debug-pw
715 int zebra_debugs_debug_pw_modify(struct nb_cb_modify_args
*args
)
717 switch (args
->event
) {
722 /* TODO: implement me. */
729 int zebra_debugs_debug_pw_destroy(struct nb_cb_destroy_args
*args
)
731 switch (args
->event
) {
736 /* TODO: implement me. */
744 * XPath: /frr-zebra:zebra/debugs/debug-dplane
746 int zebra_debugs_debug_dplane_modify(struct nb_cb_modify_args
*args
)
748 switch (args
->event
) {
753 /* TODO: implement me. */
760 int zebra_debugs_debug_dplane_destroy(struct nb_cb_destroy_args
*args
)
762 switch (args
->event
) {
767 /* TODO: implement me. */
775 * XPath: /frr-zebra:zebra/debugs/debug-dplane-detail
777 int zebra_debugs_debug_dplane_detail_modify(struct nb_cb_modify_args
*args
)
779 switch (args
->event
) {
784 /* TODO: implement me. */
791 int zebra_debugs_debug_dplane_detail_destroy(struct nb_cb_destroy_args
*args
)
793 switch (args
->event
) {
798 /* TODO: implement me. */
806 * XPath: /frr-zebra:zebra/debugs/debug-mlag
808 int zebra_debugs_debug_mlag_modify(struct nb_cb_modify_args
*args
)
810 switch (args
->event
) {
815 /* TODO: implement me. */
822 int zebra_debugs_debug_mlag_destroy(struct nb_cb_destroy_args
*args
)
824 switch (args
->event
) {
829 /* TODO: implement me. */
837 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs
839 int lib_interface_zebra_ip_addrs_create(struct nb_cb_create_args
*args
)
841 struct interface
*ifp
;
842 struct prefix prefix
;
844 // addr_family = yang_dnode_get_enum(dnode, "./address-family");
845 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
848 switch (args
->event
) {
850 if (prefix
.family
== AF_INET
851 && ipv4_martian(&prefix
.u
.prefix4
)) {
852 snprintfrr(args
->errmsg
, args
->errmsg_len
,
853 "invalid address %pFX", &prefix
);
854 return NB_ERR_VALIDATION
;
855 } else if (prefix
.family
== AF_INET6
856 && ipv6_martian(&prefix
.u
.prefix6
)) {
857 snprintfrr(args
->errmsg
, args
->errmsg_len
,
858 "invalid address %pFX", &prefix
);
859 return NB_ERR_VALIDATION
;
866 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
867 if (prefix
.family
== AF_INET
)
868 if_ip_address_install(ifp
, &prefix
, NULL
, NULL
);
869 else if (prefix
.family
== AF_INET6
)
870 if_ipv6_address_install(ifp
, &prefix
, NULL
);
878 int lib_interface_zebra_ip_addrs_destroy(struct nb_cb_destroy_args
*args
)
880 struct interface
*ifp
;
881 struct prefix prefix
;
882 struct connected
*ifc
;
884 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
887 switch (args
->event
) {
889 ifp
= nb_running_get_entry(args
->dnode
, NULL
, false);
893 if (prefix
.family
== AF_INET
) {
894 /* Check current interface address. */
895 ifc
= connected_check_ptp(ifp
, &prefix
, NULL
);
897 snprintf(args
->errmsg
, args
->errmsg_len
,
898 "interface %s Can't find address\n",
900 return NB_ERR_VALIDATION
;
902 } else if (prefix
.family
== AF_INET6
) {
903 /* Check current interface address. */
904 ifc
= connected_check(ifp
, &prefix
);
906 snprintf(args
->errmsg
, args
->errmsg_len
,
907 "interface can't find address %s",
909 return NB_ERR_VALIDATION
;
912 return NB_ERR_VALIDATION
;
914 /* This is not configured address. */
915 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
)) {
916 snprintf(args
->errmsg
, args
->errmsg_len
,
917 "interface %s not configured", ifp
->name
);
918 return NB_ERR_VALIDATION
;
921 /* This is not real address or interface is not active. */
922 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
923 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
924 listnode_delete(ifp
->connected
, ifc
);
925 connected_free(&ifc
);
926 return NB_ERR_VALIDATION
;
933 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
934 if_ip_address_uinstall(ifp
, &prefix
);
942 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/label
944 int lib_interface_zebra_ip_addrs_label_modify(struct nb_cb_modify_args
*args
)
946 switch (args
->event
) {
951 /* TODO: implement me. */
958 int lib_interface_zebra_ip_addrs_label_destroy(struct nb_cb_destroy_args
*args
)
960 switch (args
->event
) {
965 /* TODO: implement me. */
973 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/ip4-peer
975 int lib_interface_zebra_ip_addrs_ip4_peer_modify(struct nb_cb_modify_args
*args
)
977 switch (args
->event
) {
982 /* TODO: implement me. */
989 int lib_interface_zebra_ip_addrs_ip4_peer_destroy(
990 struct nb_cb_destroy_args
*args
)
992 switch (args
->event
) {
997 /* TODO: implement me. */
1005 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/multicast
1007 int lib_interface_zebra_multicast_modify(struct nb_cb_modify_args
*args
)
1009 if (args
->event
!= NB_EV_APPLY
)
1012 struct interface
*ifp
;
1014 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1016 if_multicast_set(ifp
);
1021 int lib_interface_zebra_multicast_destroy(struct nb_cb_destroy_args
*args
)
1023 if (args
->event
!= NB_EV_APPLY
)
1026 struct interface
*ifp
;
1028 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1030 if_multicast_unset(ifp
);
1036 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-detect
1038 int lib_interface_zebra_link_detect_modify(struct nb_cb_modify_args
*args
)
1040 if (args
->event
!= NB_EV_APPLY
)
1043 struct interface
*ifp
;
1046 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1047 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1049 if_linkdetect(ifp
, link_detect
);
1054 int lib_interface_zebra_link_detect_destroy(struct nb_cb_destroy_args
*args
)
1056 if (args
->event
!= NB_EV_APPLY
)
1059 struct interface
*ifp
;
1062 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1063 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1065 if_linkdetect(ifp
, link_detect
);
1071 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/shutdown
1073 int lib_interface_zebra_shutdown_modify(struct nb_cb_modify_args
*args
)
1075 if (args
->event
!= NB_EV_APPLY
)
1078 struct interface
*ifp
;
1080 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1087 int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args
*args
)
1089 if (args
->event
!= NB_EV_APPLY
)
1092 struct interface
*ifp
;
1094 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1096 if_no_shutdown(ifp
);
1102 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/bandwidth
1104 int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args
*args
)
1106 if (args
->event
!= NB_EV_APPLY
)
1109 struct interface
*ifp
;
1112 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1113 bandwidth
= yang_dnode_get_uint32(args
->dnode
, "./bandwidth");
1115 ifp
->bandwidth
= bandwidth
;
1117 /* force protocols to recalculate routes due to cost change */
1118 if (if_is_operative(ifp
))
1119 zebra_interface_up_update(ifp
);
1124 int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args
*args
)
1126 if (args
->event
!= NB_EV_APPLY
)
1129 struct interface
*ifp
;
1131 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1135 /* force protocols to recalculate routes due to cost change */
1136 if (if_is_operative(ifp
))
1137 zebra_interface_up_update(ifp
);
1143 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id
1145 int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args
*args
)
1148 struct zebra_vrf
*zvrf
;
1150 struct zebra_l3vni
*zl3vni
= NULL
;
1151 struct zebra_vrf
*zvrf_evpn
= NULL
;
1152 char err
[ERR_STR_SZ
];
1153 bool pfx_only
= false;
1154 const struct lyd_node
*pn_dnode
;
1155 const char *vrfname
;
1157 switch (args
->event
) {
1161 case NB_EV_VALIDATE
:
1162 zvrf_evpn
= zebra_vrf_get_evpn();
1164 snprintf(args
->errmsg
, args
->errmsg_len
,
1165 "evpn vrf is not present.");
1166 return NB_ERR_VALIDATION
;
1168 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1169 /* Get vrf info from parent node, reject configuration
1170 * if zebra vrf already mapped to different vni id.
1172 pn_dnode
= yang_dnode_get_parent(args
->dnode
, "vrf");
1174 vrfname
= yang_dnode_get_string(pn_dnode
, "./name");
1175 zvrf
= zebra_vrf_lookup_by_name(vrfname
);
1177 snprintf(args
->errmsg
, args
->errmsg_len
,
1178 "zebra vrf info not found for vrf:%s.",
1180 return NB_ERR_VALIDATION
;
1182 if (zvrf
->l3vni
&& zvrf
->l3vni
!= vni
) {
1184 args
->errmsg
, args
->errmsg_len
,
1185 "vni %u cannot be configured as vni %u is already configured under the vrf",
1187 return NB_ERR_VALIDATION
;
1191 /* Check if this VNI is already present in the system */
1192 zl3vni
= zl3vni_lookup(vni
);
1194 snprintf(args
->errmsg
, args
->errmsg_len
,
1195 "VNI %u is already configured as L3-VNI", vni
);
1196 return NB_ERR_VALIDATION
;
1202 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1203 zvrf
= zebra_vrf_lookup_by_name(vrf
->name
);
1204 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1205 /* Note: This covers lib_vrf_zebra_prefix_only_modify() config
1206 * along with l3vni config
1208 pfx_only
= yang_dnode_get_bool(args
->dnode
, "../prefix-only");
1210 if (zebra_vxlan_process_vrf_vni_cmd(zvrf
, vni
, err
, ERR_STR_SZ
,
1211 pfx_only
? 1 : 0, 1)
1213 if (IS_ZEBRA_DEBUG_VXLAN
)
1215 args
->errmsg
, args
->errmsg_len
,
1216 "vrf vni %u mapping failed with error: %s",
1227 int lib_vrf_zebra_l3vni_id_destroy(struct nb_cb_destroy_args
*args
)
1230 struct zebra_vrf
*zvrf
;
1232 char err
[ERR_STR_SZ
];
1235 switch (args
->event
) {
1238 case NB_EV_VALIDATE
:
1241 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1242 zvrf
= zebra_vrf_lookup_by_name(vrf
->name
);
1243 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1245 if (!zl3vni_lookup(vni
))
1248 if (zvrf
->l3vni
!= vni
) {
1249 snprintf(args
->errmsg
, args
->errmsg_len
,
1250 "vrf %s has different vni %u mapped",
1251 vrf
->name
, zvrf
->l3vni
);
1255 if (is_l3vni_for_prefix_routes_only(zvrf
->l3vni
))
1258 if (zebra_vxlan_process_vrf_vni_cmd(zvrf
, vni
, err
, ERR_STR_SZ
,
1261 if (IS_ZEBRA_DEBUG_VXLAN
)
1263 "vrf vni %u unmapping failed with error: %s",
1275 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/prefix-only
1277 int lib_vrf_zebra_prefix_only_modify(struct nb_cb_modify_args
*args
)
1279 switch (args
->event
) {
1280 case NB_EV_VALIDATE
:
1284 /* TODO: implement me. */