]>
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"
25 #include "lib/command.h"
26 #include "lib/routemap.h"
27 #include "zebra/zebra_nb.h"
28 #include "zebra/rib.h"
30 #include "zebra/interface.h"
31 #include "zebra/connected.h"
32 #include "zebra/zebra_router.h"
33 #include "zebra/debug.h"
34 #include "zebra/zebra_vxlan_private.h"
35 #include "zebra/zebra_vxlan.h"
38 * XPath: /frr-zebra:zebra/mcast-rpf-lookup
40 int zebra_mcast_rpf_lookup_modify(struct nb_cb_modify_args
*args
)
42 switch (args
->event
) {
47 /* TODO: implement me. */
55 * XPath: /frr-zebra:zebra/ip-forwarding
57 int zebra_ip_forwarding_modify(struct nb_cb_modify_args
*args
)
59 switch (args
->event
) {
64 /* TODO: implement me. */
71 int zebra_ip_forwarding_destroy(struct nb_cb_destroy_args
*args
)
73 switch (args
->event
) {
78 /* TODO: implement me. */
86 * XPath: /frr-zebra:zebra/ipv6-forwarding
88 int zebra_ipv6_forwarding_modify(struct nb_cb_modify_args
*args
)
90 switch (args
->event
) {
95 /* TODO: implement me. */
102 int zebra_ipv6_forwarding_destroy(struct nb_cb_destroy_args
*args
)
104 switch (args
->event
) {
109 /* TODO: implement me. */
117 * XPath: /frr-zebra:zebra/workqueue-hold-timer
119 int zebra_workqueue_hold_timer_modify(struct nb_cb_modify_args
*args
)
121 switch (args
->event
) {
126 /* TODO: implement me. */
134 * XPath: /frr-zebra:zebra/zapi-packets
136 int zebra_zapi_packets_modify(struct nb_cb_modify_args
*args
)
138 switch (args
->event
) {
143 /* TODO: implement me. */
151 * XPath: /frr-zebra:zebra/import-kernel-table/table-id
153 int zebra_import_kernel_table_table_id_modify(struct nb_cb_modify_args
*args
)
155 switch (args
->event
) {
160 /* TODO: implement me. */
167 int zebra_import_kernel_table_table_id_destroy(struct nb_cb_destroy_args
*args
)
169 switch (args
->event
) {
174 /* TODO: implement me. */
182 * XPath: /frr-zebra:zebra/import-kernel-table/distance
184 int zebra_import_kernel_table_distance_modify(struct nb_cb_modify_args
*args
)
186 switch (args
->event
) {
191 /* TODO: implement me. */
199 * XPath: /frr-zebra:zebra/import-kernel-table/route-map
201 int zebra_import_kernel_table_route_map_modify(struct nb_cb_modify_args
*args
)
203 switch (args
->event
) {
208 /* TODO: implement me. */
215 int zebra_import_kernel_table_route_map_destroy(struct nb_cb_destroy_args
*args
)
217 switch (args
->event
) {
222 /* TODO: implement me. */
230 * XPath: /frr-zebra:zebra/allow-external-route-update
232 int zebra_allow_external_route_update_create(struct nb_cb_create_args
*args
)
234 switch (args
->event
) {
239 /* TODO: implement me. */
246 int zebra_allow_external_route_update_destroy(struct nb_cb_destroy_args
*args
)
248 switch (args
->event
) {
253 /* TODO: implement me. */
261 * XPath: /frr-zebra:zebra/dplane-queue-limit
263 int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args
*args
)
265 switch (args
->event
) {
270 /* TODO: implement me. */
278 * XPath: /frr-zebra:zebra/debugs/debug-events
280 int zebra_debugs_debug_events_modify(struct nb_cb_modify_args
*args
)
282 switch (args
->event
) {
287 /* TODO: implement me. */
294 int zebra_debugs_debug_events_destroy(struct nb_cb_destroy_args
*args
)
296 switch (args
->event
) {
301 /* TODO: implement me. */
309 * XPath: /frr-zebra:zebra/debugs/debug-zapi-send
311 int zebra_debugs_debug_zapi_send_modify(struct nb_cb_modify_args
*args
)
313 switch (args
->event
) {
318 /* TODO: implement me. */
325 int zebra_debugs_debug_zapi_send_destroy(struct nb_cb_destroy_args
*args
)
327 switch (args
->event
) {
332 /* TODO: implement me. */
340 * XPath: /frr-zebra:zebra/debugs/debug-zapi-recv
342 int zebra_debugs_debug_zapi_recv_modify(struct nb_cb_modify_args
*args
)
344 switch (args
->event
) {
349 /* TODO: implement me. */
356 int zebra_debugs_debug_zapi_recv_destroy(struct nb_cb_destroy_args
*args
)
358 switch (args
->event
) {
363 /* TODO: implement me. */
371 * XPath: /frr-zebra:zebra/debugs/debug-zapi-detail
373 int zebra_debugs_debug_zapi_detail_modify(struct nb_cb_modify_args
*args
)
375 switch (args
->event
) {
380 /* TODO: implement me. */
387 int zebra_debugs_debug_zapi_detail_destroy(struct nb_cb_destroy_args
*args
)
389 switch (args
->event
) {
394 /* TODO: implement me. */
402 * XPath: /frr-zebra:zebra/debugs/debug-kernel
404 int zebra_debugs_debug_kernel_modify(struct nb_cb_modify_args
*args
)
406 switch (args
->event
) {
411 /* TODO: implement me. */
418 int zebra_debugs_debug_kernel_destroy(struct nb_cb_destroy_args
*args
)
420 switch (args
->event
) {
425 /* TODO: implement me. */
433 * XPath: /frr-zebra:zebra/debugs/debug-kernel-msg-send
435 int zebra_debugs_debug_kernel_msg_send_modify(struct nb_cb_modify_args
*args
)
437 switch (args
->event
) {
442 /* TODO: implement me. */
449 int zebra_debugs_debug_kernel_msg_send_destroy(struct nb_cb_destroy_args
*args
)
451 switch (args
->event
) {
456 /* TODO: implement me. */
464 * XPath: /frr-zebra:zebra/debugs/debug-kernel-msg-recv
466 int zebra_debugs_debug_kernel_msg_recv_modify(struct nb_cb_modify_args
*args
)
468 switch (args
->event
) {
473 /* TODO: implement me. */
480 int zebra_debugs_debug_kernel_msg_recv_destroy(struct nb_cb_destroy_args
*args
)
482 switch (args
->event
) {
487 /* TODO: implement me. */
495 * XPath: /frr-zebra:zebra/debugs/debug-rib
497 int zebra_debugs_debug_rib_modify(struct nb_cb_modify_args
*args
)
499 switch (args
->event
) {
504 /* TODO: implement me. */
511 int zebra_debugs_debug_rib_destroy(struct nb_cb_destroy_args
*args
)
513 switch (args
->event
) {
518 /* TODO: implement me. */
526 * XPath: /frr-zebra:zebra/debugs/debug-rib-detail
528 int zebra_debugs_debug_rib_detail_modify(struct nb_cb_modify_args
*args
)
530 switch (args
->event
) {
535 /* TODO: implement me. */
542 int zebra_debugs_debug_rib_detail_destroy(struct nb_cb_destroy_args
*args
)
544 switch (args
->event
) {
549 /* TODO: implement me. */
557 * XPath: /frr-zebra:zebra/debugs/debug-fpm
559 int zebra_debugs_debug_fpm_modify(struct nb_cb_modify_args
*args
)
561 switch (args
->event
) {
566 /* TODO: implement me. */
573 int zebra_debugs_debug_fpm_destroy(struct nb_cb_destroy_args
*args
)
575 switch (args
->event
) {
580 /* TODO: implement me. */
588 * XPath: /frr-zebra:zebra/debugs/debug-nht
590 int zebra_debugs_debug_nht_modify(struct nb_cb_modify_args
*args
)
592 switch (args
->event
) {
597 /* TODO: implement me. */
604 int zebra_debugs_debug_nht_destroy(struct nb_cb_destroy_args
*args
)
606 switch (args
->event
) {
611 /* TODO: implement me. */
619 * XPath: /frr-zebra:zebra/debugs/debug-nht-detail
621 int zebra_debugs_debug_nht_detail_modify(struct nb_cb_modify_args
*args
)
623 switch (args
->event
) {
628 /* TODO: implement me. */
635 int zebra_debugs_debug_nht_detail_destroy(struct nb_cb_destroy_args
*args
)
637 switch (args
->event
) {
642 /* TODO: implement me. */
650 * XPath: /frr-zebra:zebra/debugs/debug-mpls
652 int zebra_debugs_debug_mpls_modify(struct nb_cb_modify_args
*args
)
654 switch (args
->event
) {
659 /* TODO: implement me. */
666 int zebra_debugs_debug_mpls_destroy(struct nb_cb_destroy_args
*args
)
668 switch (args
->event
) {
673 /* TODO: implement me. */
681 * XPath: /frr-zebra:zebra/debugs/debug-vxlan
683 int zebra_debugs_debug_vxlan_modify(struct nb_cb_modify_args
*args
)
685 switch (args
->event
) {
690 /* TODO: implement me. */
697 int zebra_debugs_debug_vxlan_destroy(struct nb_cb_destroy_args
*args
)
699 switch (args
->event
) {
704 /* TODO: implement me. */
712 * XPath: /frr-zebra:zebra/debugs/debug-pw
714 int zebra_debugs_debug_pw_modify(struct nb_cb_modify_args
*args
)
716 switch (args
->event
) {
721 /* TODO: implement me. */
728 int zebra_debugs_debug_pw_destroy(struct nb_cb_destroy_args
*args
)
730 switch (args
->event
) {
735 /* TODO: implement me. */
743 * XPath: /frr-zebra:zebra/debugs/debug-dplane
745 int zebra_debugs_debug_dplane_modify(struct nb_cb_modify_args
*args
)
747 switch (args
->event
) {
752 /* TODO: implement me. */
759 int zebra_debugs_debug_dplane_destroy(struct nb_cb_destroy_args
*args
)
761 switch (args
->event
) {
766 /* TODO: implement me. */
774 * XPath: /frr-zebra:zebra/debugs/debug-dplane-detail
776 int zebra_debugs_debug_dplane_detail_modify(struct nb_cb_modify_args
*args
)
778 switch (args
->event
) {
783 /* TODO: implement me. */
790 int zebra_debugs_debug_dplane_detail_destroy(struct nb_cb_destroy_args
*args
)
792 switch (args
->event
) {
797 /* TODO: implement me. */
805 * XPath: /frr-zebra:zebra/debugs/debug-mlag
807 int zebra_debugs_debug_mlag_modify(struct nb_cb_modify_args
*args
)
809 switch (args
->event
) {
814 /* TODO: implement me. */
821 int zebra_debugs_debug_mlag_destroy(struct nb_cb_destroy_args
*args
)
823 switch (args
->event
) {
828 /* TODO: implement me. */
836 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs
838 int lib_interface_zebra_ip_addrs_create(struct nb_cb_create_args
*args
)
840 struct interface
*ifp
;
841 struct prefix prefix
;
842 char buf
[PREFIX_STRLEN
] = {0};
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 snprintf(args
->errmsg
, args
->errmsg_len
,
854 "invalid address %s",
855 prefix2str(&prefix
, buf
, sizeof(buf
)));
856 return NB_ERR_VALIDATION
;
857 } else if (prefix
.family
== AF_INET6
858 && ipv6_martian(&prefix
.u
.prefix6
)) {
859 snprintf(args
->errmsg
, args
->errmsg_len
,
860 "invalid address %s",
861 prefix2str(&prefix
, buf
, sizeof(buf
)));
862 return NB_ERR_VALIDATION
;
869 if (prefix
.family
== AF_INET
)
870 if_ip_address_install(ifp
, &prefix
, NULL
, NULL
);
871 else if (prefix
.family
== AF_INET6
)
872 if_ipv6_address_install(ifp
, &prefix
, NULL
);
880 int lib_interface_zebra_ip_addrs_destroy(struct nb_cb_destroy_args
*args
)
882 struct interface
*ifp
;
883 struct prefix prefix
;
884 struct connected
*ifc
;
886 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
887 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
890 switch (args
->event
) {
892 if (prefix
.family
== AF_INET
) {
893 /* Check current interface address. */
894 ifc
= connected_check_ptp(ifp
, &prefix
, NULL
);
896 snprintf(args
->errmsg
, args
->errmsg_len
,
897 "interface %s Can't find address\n",
899 return NB_ERR_VALIDATION
;
901 } else if (prefix
.family
== AF_INET6
) {
902 /* Check current interface address. */
903 ifc
= connected_check(ifp
, &prefix
);
905 snprintf(args
->errmsg
, args
->errmsg_len
,
906 "interface can't find address %s",
908 return NB_ERR_VALIDATION
;
911 return NB_ERR_VALIDATION
;
913 /* This is not configured address. */
914 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
)) {
915 snprintf(args
->errmsg
, args
->errmsg_len
,
916 "interface %s not configured", ifp
->name
);
917 return NB_ERR_VALIDATION
;
920 /* This is not real address or interface is not active. */
921 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
922 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
923 listnode_delete(ifp
->connected
, ifc
);
924 connected_free(&ifc
);
925 return NB_ERR_VALIDATION
;
932 if_ip_address_uinstall(ifp
, &prefix
);
940 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/label
942 int lib_interface_zebra_ip_addrs_label_modify(struct nb_cb_modify_args
*args
)
944 switch (args
->event
) {
949 /* TODO: implement me. */
956 int lib_interface_zebra_ip_addrs_label_destroy(struct nb_cb_destroy_args
*args
)
958 switch (args
->event
) {
963 /* TODO: implement me. */
971 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/ip4-peer
973 int lib_interface_zebra_ip_addrs_ip4_peer_modify(struct nb_cb_modify_args
*args
)
975 switch (args
->event
) {
980 /* TODO: implement me. */
987 int lib_interface_zebra_ip_addrs_ip4_peer_destroy(
988 struct nb_cb_destroy_args
*args
)
990 switch (args
->event
) {
995 /* TODO: implement me. */
1003 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/multicast
1005 int lib_interface_zebra_multicast_modify(struct nb_cb_modify_args
*args
)
1007 if (args
->event
!= NB_EV_APPLY
)
1010 struct interface
*ifp
;
1012 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1014 if_multicast_set(ifp
);
1019 int lib_interface_zebra_multicast_destroy(struct nb_cb_destroy_args
*args
)
1021 if (args
->event
!= NB_EV_APPLY
)
1024 struct interface
*ifp
;
1026 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1028 if_multicast_unset(ifp
);
1034 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-detect
1036 int lib_interface_zebra_link_detect_modify(struct nb_cb_modify_args
*args
)
1038 if (args
->event
!= NB_EV_APPLY
)
1041 struct interface
*ifp
;
1044 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1045 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1047 if_linkdetect(ifp
, link_detect
);
1052 int lib_interface_zebra_link_detect_destroy(struct nb_cb_destroy_args
*args
)
1054 if (args
->event
!= NB_EV_APPLY
)
1057 struct interface
*ifp
;
1060 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1061 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1063 if_linkdetect(ifp
, link_detect
);
1069 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/shutdown
1071 int lib_interface_zebra_shutdown_modify(struct nb_cb_modify_args
*args
)
1073 struct interface
*ifp
;
1075 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1082 int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args
*args
)
1084 struct interface
*ifp
;
1086 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1088 if_no_shutdown(ifp
);
1094 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/bandwidth
1096 int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args
*args
)
1098 if (args
->event
!= NB_EV_APPLY
)
1101 struct interface
*ifp
;
1104 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1105 bandwidth
= yang_dnode_get_uint32(args
->dnode
, "./bandwidth");
1107 ifp
->bandwidth
= bandwidth
;
1109 /* force protocols to recalculate routes due to cost change */
1110 if (if_is_operative(ifp
))
1111 zebra_interface_up_update(ifp
);
1116 int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args
*args
)
1118 if (args
->event
!= NB_EV_APPLY
)
1121 struct interface
*ifp
;
1123 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1127 /* force protocols to recalculate routes due to cost change */
1128 if (if_is_operative(ifp
))
1129 zebra_interface_up_update(ifp
);
1135 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib
1137 int lib_vrf_zebra_ribs_rib_create(struct nb_cb_create_args
*args
)
1142 struct zebra_vrf
*zvrf
;
1143 struct zebra_router_table
*zrt
;
1145 const char *afi_safi_name
;
1147 vrf
= nb_running_get_entry(args
->dnode
, NULL
, false);
1148 zvrf
= vrf_info_lookup(vrf
->vrf_id
);
1149 table_id
= yang_dnode_get_uint32(args
->dnode
, "./table-id");
1151 table_id
= zvrf
->table_id
;
1153 afi_safi_name
= yang_dnode_get_string(args
->dnode
, "./afi-safi-name");
1154 yang_afi_safi_identity2value(afi_safi_name
, &afi
, &safi
);
1156 zrt
= zebra_router_find_zrt(zvrf
, table_id
, afi
, safi
);
1158 switch (args
->event
) {
1159 case NB_EV_VALIDATE
:
1161 snprintf(args
->errmsg
, args
->errmsg_len
,
1162 "vrf %s table is not found.", vrf
->name
);
1163 return NB_ERR_VALIDATION
;
1171 nb_running_set_entry(args
->dnode
, zrt
);
1179 int lib_vrf_zebra_ribs_rib_destroy(struct nb_cb_destroy_args
*args
)
1181 if (args
->event
!= NB_EV_APPLY
)
1184 nb_running_unset_entry(args
->dnode
);
1190 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id
1192 int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args
*args
)
1195 struct zebra_vrf
*zvrf
;
1197 zebra_l3vni_t
*zl3vni
= NULL
;
1198 struct zebra_vrf
*zvrf_evpn
= NULL
;
1199 char err
[ERR_STR_SZ
];
1200 bool pfx_only
= false;
1201 const struct lyd_node
*pn_dnode
;
1202 const char *vrfname
;
1204 switch (args
->event
) {
1208 case NB_EV_VALIDATE
:
1209 zvrf_evpn
= zebra_vrf_get_evpn();
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 vrf
= vrf_lookup_by_name(vrfname
);
1221 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
1222 if (zvrf
->l3vni
&& zvrf
->l3vni
!= vni
) {
1224 "vni %u cannot be configured as vni %u is already configured under the vrf",
1226 return NB_ERR_VALIDATION
;
1230 /* Check if this VNI is already present in the system */
1231 zl3vni
= zl3vni_lookup(vni
);
1233 if (IS_ZEBRA_DEBUG_VXLAN
)
1235 "VNI %u is already configured as L3-VNI",
1237 return NB_ERR_VALIDATION
;
1243 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1244 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
1245 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1246 /* Note: This covers lib_vrf_zebra_prefix_only_modify() config
1247 * along with l3vni config
1249 pfx_only
= yang_dnode_get_bool(args
->dnode
, "../prefix-only");
1251 if (zebra_vxlan_process_vrf_vni_cmd(zvrf
, vni
, err
, ERR_STR_SZ
,
1252 pfx_only
? 1 : 0, 1)
1254 if (IS_ZEBRA_DEBUG_VXLAN
)
1256 "vrf vni %u mapping failed with error: %s",
1261 /* Mark as having FRR configuration */
1262 vrf_set_user_cfged(vrf
);
1270 int lib_vrf_zebra_l3vni_id_destroy(struct nb_cb_destroy_args
*args
)
1273 struct zebra_vrf
*zvrf
;
1275 char err
[ERR_STR_SZ
];
1278 switch (args
->event
) {
1281 case NB_EV_VALIDATE
:
1284 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1285 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
1286 vni
= yang_dnode_get_uint32(args
->dnode
, NULL
);
1288 if (!zl3vni_lookup(vni
))
1291 if (zvrf
->l3vni
!= vni
)
1294 if (is_l3vni_for_prefix_routes_only(zvrf
->l3vni
))
1297 if (zebra_vxlan_process_vrf_vni_cmd(zvrf
, vni
, err
, ERR_STR_SZ
,
1300 if (IS_ZEBRA_DEBUG_VXLAN
)
1302 "vrf vni %u unmapping failed with error: %s",
1307 /* If no other FRR config for this VRF, mark accordingly. */
1308 if (!zebra_vrf_has_config(zvrf
))
1309 vrf_reset_user_cfged(vrf
);
1318 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/prefix-only
1320 int lib_vrf_zebra_prefix_only_modify(struct nb_cb_modify_args
*args
)
1322 switch (args
->event
) {
1323 case NB_EV_VALIDATE
:
1327 /* TODO: implement me. */
1336 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv4-prefix-length
1338 int lib_route_map_entry_match_condition_ipv4_prefix_length_modify(
1339 struct nb_cb_modify_args
*args
)
1341 struct routemap_hook_context
*rhc
;
1345 if (args
->event
!= NB_EV_APPLY
)
1348 /* Add configuration. */
1349 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1350 length
= yang_dnode_get_string(args
->dnode
, NULL
);
1352 yang_dnode_get_enum(args
->dnode
, "../frr-route-map:condition");
1354 /* Set destroy information. */
1355 switch (condition
) {
1356 case 100: /* ipv4-prefix-length */
1357 rhc
->rhc_rule
= "ip address prefix-len";
1360 case 102: /* ipv4-next-hop-prefix-length */
1361 rhc
->rhc_rule
= "ip next-hop prefix-len";
1364 rhc
->rhc_mhook
= generic_match_delete
;
1365 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1367 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, rhc
->rhc_rule
, length
,
1368 RMAP_EVENT_MATCH_ADDED
);
1369 if (rv
!= CMD_SUCCESS
) {
1370 rhc
->rhc_mhook
= NULL
;
1371 return NB_ERR_INCONSISTENCY
;
1377 int lib_route_map_entry_match_condition_ipv4_prefix_length_destroy(
1378 struct nb_cb_destroy_args
*args
)
1380 return lib_route_map_entry_match_destroy(args
);
1385 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv6-prefix-length
1387 int lib_route_map_entry_match_condition_ipv6_prefix_length_modify(
1388 struct nb_cb_modify_args
*args
)
1390 struct routemap_hook_context
*rhc
;
1394 if (args
->event
!= NB_EV_APPLY
)
1397 /* Add configuration. */
1398 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1399 length
= yang_dnode_get_string(args
->dnode
, NULL
);
1401 /* Set destroy information. */
1402 rhc
->rhc_mhook
= generic_match_delete
;
1403 rhc
->rhc_rule
= "ipv6 address prefix-len";
1404 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1406 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "ipv6 address prefix-len",
1407 length
, RMAP_EVENT_MATCH_ADDED
);
1408 if (rv
!= CMD_SUCCESS
) {
1409 rhc
->rhc_mhook
= NULL
;
1410 return NB_ERR_INCONSISTENCY
;
1416 int lib_route_map_entry_match_condition_ipv6_prefix_length_destroy(
1417 struct nb_cb_destroy_args
*args
)
1419 return lib_route_map_entry_match_destroy(args
);
1424 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:source-protocol
1426 int lib_route_map_entry_match_condition_source_protocol_modify(
1427 struct nb_cb_modify_args
*args
)
1429 struct routemap_hook_context
*rhc
;
1433 switch (args
->event
) {
1434 case NB_EV_VALIDATE
:
1435 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1436 if (proto_name2num(type
) == -1) {
1437 snprintf(args
->errmsg
, args
->errmsg_len
,
1438 "invalid protocol: %s", type
);
1439 return NB_ERR_VALIDATION
;
1450 /* Add configuration. */
1451 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1452 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1454 /* Set destroy information. */
1455 rhc
->rhc_mhook
= generic_match_delete
;
1456 rhc
->rhc_rule
= "source-protocol";
1457 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1459 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "source-protocol", type
,
1460 RMAP_EVENT_MATCH_ADDED
);
1461 if (rv
!= CMD_SUCCESS
) {
1462 rhc
->rhc_mhook
= NULL
;
1463 return NB_ERR_INCONSISTENCY
;
1469 int lib_route_map_entry_match_condition_source_protocol_destroy(
1470 struct nb_cb_destroy_args
*args
)
1472 return lib_route_map_entry_match_destroy(args
);
1477 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:source-instance
1479 int lib_route_map_entry_match_condition_source_instance_modify(
1480 struct nb_cb_modify_args
*args
)
1482 struct routemap_hook_context
*rhc
;
1486 if (args
->event
!= NB_EV_APPLY
)
1489 /* Add configuration. */
1490 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1491 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1493 /* Set destroy information. */
1494 rhc
->rhc_mhook
= generic_match_delete
;
1495 rhc
->rhc_rule
= "source-instance";
1496 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1498 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "source-instance", type
,
1499 RMAP_EVENT_MATCH_ADDED
);
1500 if (rv
!= CMD_SUCCESS
) {
1501 rhc
->rhc_mhook
= NULL
;
1502 return NB_ERR_INCONSISTENCY
;
1508 int lib_route_map_entry_match_condition_source_instance_destroy(
1509 struct nb_cb_destroy_args
*args
)
1511 return lib_route_map_entry_match_destroy(args
);
1515 * XPath: /frr-route-map:lib/route-map/entry/set-action/frr-zebra:source-v4
1517 int lib_route_map_entry_set_action_source_v4_modify(
1518 struct nb_cb_modify_args
*args
)
1520 struct routemap_hook_context
*rhc
;
1521 struct interface
*pif
= NULL
;
1527 switch (args
->event
) {
1528 case NB_EV_VALIDATE
:
1529 memset(&p
, 0, sizeof(p
));
1530 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
1531 if (zebra_check_addr(&p
) == 0) {
1532 snprintf(args
->errmsg
, args
->errmsg_len
,
1533 "invalid IPv4 address: %s",
1534 yang_dnode_get_string(args
->dnode
, NULL
));
1535 return NB_ERR_VALIDATION
;
1538 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
1539 pif
= if_lookup_exact_address(&p
.u
.prefix4
, AF_INET
,
1545 snprintf(args
->errmsg
, args
->errmsg_len
,
1546 "is not a local adddress: %s",
1547 yang_dnode_get_string(args
->dnode
, NULL
));
1548 return NB_ERR_VALIDATION
;
1559 /* Add configuration. */
1560 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1561 source
= yang_dnode_get_string(args
->dnode
, NULL
);
1563 /* Set destroy information. */
1564 rhc
->rhc_shook
= generic_set_delete
;
1565 rhc
->rhc_rule
= "src";
1567 rv
= generic_set_add(NULL
, rhc
->rhc_rmi
, "src", source
);
1568 if (rv
!= CMD_SUCCESS
) {
1569 rhc
->rhc_shook
= NULL
;
1570 return NB_ERR_INCONSISTENCY
;
1576 int lib_route_map_entry_set_action_source_v4_destroy(
1577 struct nb_cb_destroy_args
*args
)
1579 return lib_route_map_entry_set_destroy(args
);
1583 * XPath: /frr-route-map:lib/route-map/entry/set-action/frr-zebra:source-v6
1585 int lib_route_map_entry_set_action_source_v6_modify(
1586 struct nb_cb_modify_args
*args
)
1588 struct routemap_hook_context
*rhc
;
1589 struct interface
*pif
= NULL
;
1595 switch (args
->event
) {
1596 case NB_EV_VALIDATE
:
1597 memset(&p
, 0, sizeof(p
));
1598 yang_dnode_get_ipv6p(&p
, args
->dnode
, NULL
);
1599 if (zebra_check_addr(&p
) == 0) {
1600 snprintf(args
->errmsg
, args
->errmsg_len
,
1601 "invalid IPv6 address: %s",
1602 yang_dnode_get_string(args
->dnode
, NULL
));
1603 return NB_ERR_VALIDATION
;
1606 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
1607 pif
= if_lookup_exact_address(&p
.u
.prefix6
, AF_INET6
,
1613 snprintf(args
->errmsg
, args
->errmsg_len
,
1614 "is not a local adddress: %s",
1615 yang_dnode_get_string(args
->dnode
, NULL
));
1616 return NB_ERR_VALIDATION
;
1627 /* Add configuration. */
1628 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1629 source
= yang_dnode_get_string(args
->dnode
, NULL
);
1631 /* Set destroy information. */
1632 rhc
->rhc_shook
= generic_set_delete
;
1633 rhc
->rhc_rule
= "src";
1635 rv
= generic_set_add(NULL
, rhc
->rhc_rmi
, "src", source
);
1636 if (rv
!= CMD_SUCCESS
) {
1637 rhc
->rhc_shook
= NULL
;
1638 return NB_ERR_INCONSISTENCY
;
1644 int lib_route_map_entry_set_action_source_v6_destroy(
1645 struct nb_cb_destroy_args
*args
)
1647 return lib_route_map_entry_set_destroy(args
);