]>
git.proxmox.com Git - mirror_frr.git/blob - zebra/zebra_nb_config.c
ea2e20ed3b6cc4297b672aff473b252e48d00b94
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 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
845 // addr_family = yang_dnode_get_enum(dnode, "./address-family");
846 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
849 switch (args
->event
) {
851 if (prefix
.family
== AF_INET
852 && ipv4_martian(&prefix
.u
.prefix4
)) {
853 snprintfrr(args
->errmsg
, args
->errmsg_len
,
854 "invalid address %pFX", &prefix
);
855 return NB_ERR_VALIDATION
;
856 } else if (prefix
.family
== AF_INET6
857 && ipv6_martian(&prefix
.u
.prefix6
)) {
858 snprintfrr(args
->errmsg
, args
->errmsg_len
,
859 "invalid address %pFX", &prefix
);
860 return NB_ERR_VALIDATION
;
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 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
885 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
888 switch (args
->event
) {
890 if (prefix
.family
== AF_INET
) {
891 /* Check current interface address. */
892 ifc
= connected_check_ptp(ifp
, &prefix
, NULL
);
894 snprintf(args
->errmsg
, args
->errmsg_len
,
895 "interface %s Can't find address\n",
897 return NB_ERR_VALIDATION
;
899 } else if (prefix
.family
== AF_INET6
) {
900 /* Check current interface address. */
901 ifc
= connected_check(ifp
, &prefix
);
903 snprintf(args
->errmsg
, args
->errmsg_len
,
904 "interface can't find address %s",
906 return NB_ERR_VALIDATION
;
909 return NB_ERR_VALIDATION
;
911 /* This is not configured address. */
912 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
)) {
913 snprintf(args
->errmsg
, args
->errmsg_len
,
914 "interface %s not configured", ifp
->name
);
915 return NB_ERR_VALIDATION
;
918 /* This is not real address or interface is not active. */
919 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
920 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
921 listnode_delete(ifp
->connected
, ifc
);
922 connected_free(&ifc
);
923 return NB_ERR_VALIDATION
;
930 if_ip_address_uinstall(ifp
, &prefix
);
938 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/label
940 int lib_interface_zebra_ip_addrs_label_modify(struct nb_cb_modify_args
*args
)
942 switch (args
->event
) {
947 /* TODO: implement me. */
954 int lib_interface_zebra_ip_addrs_label_destroy(struct nb_cb_destroy_args
*args
)
956 switch (args
->event
) {
961 /* TODO: implement me. */
969 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/ip4-peer
971 int lib_interface_zebra_ip_addrs_ip4_peer_modify(struct nb_cb_modify_args
*args
)
973 switch (args
->event
) {
978 /* TODO: implement me. */
985 int lib_interface_zebra_ip_addrs_ip4_peer_destroy(
986 struct nb_cb_destroy_args
*args
)
988 switch (args
->event
) {
993 /* TODO: implement me. */
1001 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/multicast
1003 int lib_interface_zebra_multicast_modify(struct nb_cb_modify_args
*args
)
1005 if (args
->event
!= NB_EV_APPLY
)
1008 struct interface
*ifp
;
1010 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1012 if_multicast_set(ifp
);
1017 int lib_interface_zebra_multicast_destroy(struct nb_cb_destroy_args
*args
)
1019 if (args
->event
!= NB_EV_APPLY
)
1022 struct interface
*ifp
;
1024 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1026 if_multicast_unset(ifp
);
1032 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-detect
1034 int lib_interface_zebra_link_detect_modify(struct nb_cb_modify_args
*args
)
1036 if (args
->event
!= NB_EV_APPLY
)
1039 struct interface
*ifp
;
1042 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1043 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1045 if_linkdetect(ifp
, link_detect
);
1050 int lib_interface_zebra_link_detect_destroy(struct nb_cb_destroy_args
*args
)
1052 if (args
->event
!= NB_EV_APPLY
)
1055 struct interface
*ifp
;
1058 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1059 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1061 if_linkdetect(ifp
, link_detect
);
1067 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/shutdown
1069 int lib_interface_zebra_shutdown_modify(struct nb_cb_modify_args
*args
)
1071 struct interface
*ifp
;
1073 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1080 int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args
*args
)
1082 struct interface
*ifp
;
1084 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1086 if_no_shutdown(ifp
);
1092 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/bandwidth
1094 int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args
*args
)
1096 if (args
->event
!= NB_EV_APPLY
)
1099 struct interface
*ifp
;
1102 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1103 bandwidth
= yang_dnode_get_uint32(args
->dnode
, "./bandwidth");
1105 ifp
->bandwidth
= bandwidth
;
1107 /* force protocols to recalculate routes due to cost change */
1108 if (if_is_operative(ifp
))
1109 zebra_interface_up_update(ifp
);
1114 int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args
*args
)
1116 if (args
->event
!= NB_EV_APPLY
)
1119 struct interface
*ifp
;
1121 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1125 /* force protocols to recalculate routes due to cost change */
1126 if (if_is_operative(ifp
))
1127 zebra_interface_up_update(ifp
);
1133 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib
1135 int lib_vrf_zebra_ribs_rib_create(struct nb_cb_create_args
*args
)
1140 struct zebra_vrf
*zvrf
;
1141 struct zebra_router_table
*zrt
;
1143 const char *afi_safi_name
;
1145 vrf
= nb_running_get_entry(args
->dnode
, NULL
, false);
1146 zvrf
= vrf_info_lookup(vrf
->vrf_id
);
1147 table_id
= yang_dnode_get_uint32(args
->dnode
, "./table-id");
1149 table_id
= zvrf
->table_id
;
1151 afi_safi_name
= yang_dnode_get_string(args
->dnode
, "./afi-safi-name");
1152 yang_afi_safi_identity2value(afi_safi_name
, &afi
, &safi
);
1154 zrt
= zebra_router_find_zrt(zvrf
, table_id
, afi
, safi
);
1156 switch (args
->event
) {
1157 case NB_EV_VALIDATE
:
1159 snprintf(args
->errmsg
, args
->errmsg_len
,
1160 "vrf %s table is not found.", vrf
->name
);
1161 return NB_ERR_VALIDATION
;
1169 nb_running_set_entry(args
->dnode
, zrt
);
1177 int lib_vrf_zebra_ribs_rib_destroy(struct nb_cb_destroy_args
*args
)
1179 if (args
->event
!= NB_EV_APPLY
)
1182 nb_running_unset_entry(args
->dnode
);
1188 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id
1190 int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args
*args
)
1193 struct zebra_vrf
*zvrf
;
1195 zebra_l3vni_t
*zl3vni
= NULL
;
1196 struct zebra_vrf
*zvrf_evpn
= NULL
;
1197 char err
[ERR_STR_SZ
];
1198 bool pfx_only
= false;
1199 const struct lyd_node
*pn_dnode
;
1200 const char *vrfname
;
1202 switch (args
->event
) {
1206 case NB_EV_VALIDATE
:
1207 zvrf_evpn
= zebra_vrf_get_evpn();
1209 snprintf(args
->errmsg
, args
->errmsg_len
,
1210 "evpn vrf is not present.");
1211 return NB_ERR_VALIDATION
;
1213 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1214 /* Get vrf info from parent node, reject configuration
1215 * if zebra vrf already mapped to different vni id.
1217 pn_dnode
= yang_dnode_get_parent(args
->dnode
, "vrf");
1219 vrfname
= yang_dnode_get_string(pn_dnode
, "./name");
1220 zvrf
= zebra_vrf_lookup_by_name(vrfname
);
1222 snprintf(args
->errmsg
, args
->errmsg_len
,
1223 "zebra vrf info not found for vrf:%s.",
1225 return NB_ERR_VALIDATION
;
1227 if (zvrf
->l3vni
&& zvrf
->l3vni
!= vni
) {
1229 args
->errmsg
, args
->errmsg_len
,
1230 "vni %u cannot be configured as vni %u is already configured under the vrf",
1232 return NB_ERR_VALIDATION
;
1236 /* Check if this VNI is already present in the system */
1237 zl3vni
= zl3vni_lookup(vni
);
1239 snprintf(args
->errmsg
, args
->errmsg_len
,
1240 "VNI %u is already configured as L3-VNI", vni
);
1241 return NB_ERR_VALIDATION
;
1247 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1248 zvrf
= zebra_vrf_lookup_by_name(vrf
->name
);
1249 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1250 /* Note: This covers lib_vrf_zebra_prefix_only_modify() config
1251 * along with l3vni config
1253 pfx_only
= yang_dnode_get_bool(args
->dnode
, "../prefix-only");
1255 if (zebra_vxlan_process_vrf_vni_cmd(zvrf
, vni
, err
, ERR_STR_SZ
,
1256 pfx_only
? 1 : 0, 1)
1258 if (IS_ZEBRA_DEBUG_VXLAN
)
1260 args
->errmsg
, args
->errmsg_len
,
1261 "vrf vni %u mapping failed with error: %s",
1266 /* Mark as having FRR configuration */
1267 vrf_set_user_cfged(vrf
);
1275 int lib_vrf_zebra_l3vni_id_destroy(struct nb_cb_destroy_args
*args
)
1278 struct zebra_vrf
*zvrf
;
1280 char err
[ERR_STR_SZ
];
1283 switch (args
->event
) {
1286 case NB_EV_VALIDATE
:
1289 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1290 zvrf
= zebra_vrf_lookup_by_name(vrf
->name
);
1291 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1293 if (!zl3vni_lookup(vni
))
1296 if (zvrf
->l3vni
!= vni
) {
1297 snprintf(args
->errmsg
, args
->errmsg_len
,
1298 "vrf %s has different vni %u mapped",
1299 vrf
->name
, zvrf
->l3vni
);
1303 if (is_l3vni_for_prefix_routes_only(zvrf
->l3vni
))
1306 if (zebra_vxlan_process_vrf_vni_cmd(zvrf
, vni
, err
, ERR_STR_SZ
,
1309 if (IS_ZEBRA_DEBUG_VXLAN
)
1311 "vrf vni %u unmapping failed with error: %s",
1316 /* If no other FRR config for this VRF, mark accordingly. */
1317 if (!zebra_vrf_has_config(zvrf
))
1318 vrf_reset_user_cfged(vrf
);
1327 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/prefix-only
1329 int lib_vrf_zebra_prefix_only_modify(struct nb_cb_modify_args
*args
)
1331 switch (args
->event
) {
1332 case NB_EV_VALIDATE
:
1336 /* TODO: implement me. */
1345 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv4-prefix-length
1347 int lib_route_map_entry_match_condition_ipv4_prefix_length_modify(
1348 struct nb_cb_modify_args
*args
)
1350 struct routemap_hook_context
*rhc
;
1354 if (args
->event
!= NB_EV_APPLY
)
1357 /* Add configuration. */
1358 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1359 length
= yang_dnode_get_string(args
->dnode
, NULL
);
1361 yang_dnode_get_enum(args
->dnode
, "../frr-route-map:condition");
1363 /* Set destroy information. */
1364 switch (condition
) {
1365 case 100: /* ipv4-prefix-length */
1366 rhc
->rhc_rule
= "ip address prefix-len";
1369 case 102: /* ipv4-next-hop-prefix-length */
1370 rhc
->rhc_rule
= "ip next-hop prefix-len";
1373 rhc
->rhc_mhook
= generic_match_delete
;
1374 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1376 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, rhc
->rhc_rule
, length
,
1377 RMAP_EVENT_MATCH_ADDED
);
1378 if (rv
!= CMD_SUCCESS
) {
1379 rhc
->rhc_mhook
= NULL
;
1380 return NB_ERR_INCONSISTENCY
;
1386 int lib_route_map_entry_match_condition_ipv4_prefix_length_destroy(
1387 struct nb_cb_destroy_args
*args
)
1389 return lib_route_map_entry_match_destroy(args
);
1394 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv6-prefix-length
1396 int lib_route_map_entry_match_condition_ipv6_prefix_length_modify(
1397 struct nb_cb_modify_args
*args
)
1399 struct routemap_hook_context
*rhc
;
1403 if (args
->event
!= NB_EV_APPLY
)
1406 /* Add configuration. */
1407 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1408 length
= yang_dnode_get_string(args
->dnode
, NULL
);
1410 /* Set destroy information. */
1411 rhc
->rhc_mhook
= generic_match_delete
;
1412 rhc
->rhc_rule
= "ipv6 address prefix-len";
1413 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1415 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "ipv6 address prefix-len",
1416 length
, RMAP_EVENT_MATCH_ADDED
);
1417 if (rv
!= CMD_SUCCESS
) {
1418 rhc
->rhc_mhook
= NULL
;
1419 return NB_ERR_INCONSISTENCY
;
1425 int lib_route_map_entry_match_condition_ipv6_prefix_length_destroy(
1426 struct nb_cb_destroy_args
*args
)
1428 return lib_route_map_entry_match_destroy(args
);
1433 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:source-protocol
1435 int lib_route_map_entry_match_condition_source_protocol_modify(
1436 struct nb_cb_modify_args
*args
)
1438 struct routemap_hook_context
*rhc
;
1442 switch (args
->event
) {
1443 case NB_EV_VALIDATE
:
1444 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1445 if (proto_name2num(type
) == -1) {
1446 snprintf(args
->errmsg
, args
->errmsg_len
,
1447 "invalid protocol: %s", type
);
1448 return NB_ERR_VALIDATION
;
1459 /* Add configuration. */
1460 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1461 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1463 /* Set destroy information. */
1464 rhc
->rhc_mhook
= generic_match_delete
;
1465 rhc
->rhc_rule
= "source-protocol";
1466 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1468 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "source-protocol", type
,
1469 RMAP_EVENT_MATCH_ADDED
);
1470 if (rv
!= CMD_SUCCESS
) {
1471 rhc
->rhc_mhook
= NULL
;
1472 return NB_ERR_INCONSISTENCY
;
1478 int lib_route_map_entry_match_condition_source_protocol_destroy(
1479 struct nb_cb_destroy_args
*args
)
1481 return lib_route_map_entry_match_destroy(args
);
1486 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:source-instance
1488 int lib_route_map_entry_match_condition_source_instance_modify(
1489 struct nb_cb_modify_args
*args
)
1491 struct routemap_hook_context
*rhc
;
1495 if (args
->event
!= NB_EV_APPLY
)
1498 /* Add configuration. */
1499 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1500 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1502 /* Set destroy information. */
1503 rhc
->rhc_mhook
= generic_match_delete
;
1504 rhc
->rhc_rule
= "source-instance";
1505 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1507 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "source-instance", type
,
1508 RMAP_EVENT_MATCH_ADDED
);
1509 if (rv
!= CMD_SUCCESS
) {
1510 rhc
->rhc_mhook
= NULL
;
1511 return NB_ERR_INCONSISTENCY
;
1517 int lib_route_map_entry_match_condition_source_instance_destroy(
1518 struct nb_cb_destroy_args
*args
)
1520 return lib_route_map_entry_match_destroy(args
);
1524 * XPath: /frr-route-map:lib/route-map/entry/set-action/frr-zebra:source-v4
1526 int lib_route_map_entry_set_action_source_v4_modify(
1527 struct nb_cb_modify_args
*args
)
1529 struct routemap_hook_context
*rhc
;
1530 struct interface
*pif
= NULL
;
1536 switch (args
->event
) {
1537 case NB_EV_VALIDATE
:
1538 memset(&p
, 0, sizeof(p
));
1539 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
1540 if (zebra_check_addr(&p
) == 0) {
1541 snprintf(args
->errmsg
, args
->errmsg_len
,
1542 "invalid IPv4 address: %s",
1543 yang_dnode_get_string(args
->dnode
, NULL
));
1544 return NB_ERR_VALIDATION
;
1547 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
1548 pif
= if_lookup_exact_address(&p
.u
.prefix4
, AF_INET
,
1554 * On startup the local address *may* not have come up
1555 * yet. We need to allow startup configuration of
1556 * set src or we are fudged. Log it for future fun
1559 zlog_warn("set src %pI4 is not a local address",
1570 /* Add configuration. */
1571 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1572 source
= yang_dnode_get_string(args
->dnode
, NULL
);
1574 /* Set destroy information. */
1575 rhc
->rhc_shook
= generic_set_delete
;
1576 rhc
->rhc_rule
= "src";
1578 rv
= generic_set_add(NULL
, rhc
->rhc_rmi
, "src", source
);
1579 if (rv
!= CMD_SUCCESS
) {
1580 rhc
->rhc_shook
= NULL
;
1581 return NB_ERR_INCONSISTENCY
;
1587 int lib_route_map_entry_set_action_source_v4_destroy(
1588 struct nb_cb_destroy_args
*args
)
1590 return lib_route_map_entry_set_destroy(args
);
1594 * XPath: /frr-route-map:lib/route-map/entry/set-action/frr-zebra:source-v6
1596 int lib_route_map_entry_set_action_source_v6_modify(
1597 struct nb_cb_modify_args
*args
)
1599 struct routemap_hook_context
*rhc
;
1600 struct interface
*pif
= NULL
;
1606 switch (args
->event
) {
1607 case NB_EV_VALIDATE
:
1608 memset(&p
, 0, sizeof(p
));
1609 yang_dnode_get_ipv6p(&p
, args
->dnode
, NULL
);
1610 if (zebra_check_addr(&p
) == 0) {
1611 snprintf(args
->errmsg
, args
->errmsg_len
,
1612 "invalid IPv6 address: %s",
1613 yang_dnode_get_string(args
->dnode
, NULL
));
1614 return NB_ERR_VALIDATION
;
1617 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
1618 pif
= if_lookup_exact_address(&p
.u
.prefix6
, AF_INET6
,
1624 * On startup the local address *may* not have come up
1625 * yet. We need to allow startup configuration of
1626 * set src or we are fudged. Log it for future fun
1629 zlog_warn("set src %pI6 is not a local address",
1640 /* Add configuration. */
1641 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1642 source
= yang_dnode_get_string(args
->dnode
, NULL
);
1644 /* Set destroy information. */
1645 rhc
->rhc_shook
= generic_set_delete
;
1646 rhc
->rhc_rule
= "src";
1648 rv
= generic_set_add(NULL
, rhc
->rhc_rmi
, "src", source
);
1649 if (rv
!= CMD_SUCCESS
) {
1650 rhc
->rhc_shook
= NULL
;
1651 return NB_ERR_INCONSISTENCY
;
1657 int lib_route_map_entry_set_action_source_v6_destroy(
1658 struct nb_cb_destroy_args
*args
)
1660 return lib_route_map_entry_set_destroy(args
);