]>
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"
36 * XPath: /frr-zebra:zebra/mcast-rpf-lookup
38 int zebra_mcast_rpf_lookup_modify(struct nb_cb_modify_args
*args
)
40 switch (args
->event
) {
45 /* TODO: implement me. */
53 * XPath: /frr-zebra:zebra/ip-forwarding
55 int zebra_ip_forwarding_modify(struct nb_cb_modify_args
*args
)
57 switch (args
->event
) {
62 /* TODO: implement me. */
69 int zebra_ip_forwarding_destroy(struct nb_cb_destroy_args
*args
)
71 switch (args
->event
) {
76 /* TODO: implement me. */
84 * XPath: /frr-zebra:zebra/ipv6-forwarding
86 int zebra_ipv6_forwarding_modify(struct nb_cb_modify_args
*args
)
88 switch (args
->event
) {
93 /* TODO: implement me. */
100 int zebra_ipv6_forwarding_destroy(struct nb_cb_destroy_args
*args
)
102 switch (args
->event
) {
107 /* TODO: implement me. */
115 * XPath: /frr-zebra:zebra/workqueue-hold-timer
117 int zebra_workqueue_hold_timer_modify(struct nb_cb_modify_args
*args
)
119 switch (args
->event
) {
124 /* TODO: implement me. */
132 * XPath: /frr-zebra:zebra/zapi-packets
134 int zebra_zapi_packets_modify(struct nb_cb_modify_args
*args
)
136 switch (args
->event
) {
141 /* TODO: implement me. */
149 * XPath: /frr-zebra:zebra/import-kernel-table/table-id
151 int zebra_import_kernel_table_table_id_modify(struct nb_cb_modify_args
*args
)
153 switch (args
->event
) {
158 /* TODO: implement me. */
165 int zebra_import_kernel_table_table_id_destroy(struct nb_cb_destroy_args
*args
)
167 switch (args
->event
) {
172 /* TODO: implement me. */
180 * XPath: /frr-zebra:zebra/import-kernel-table/distance
182 int zebra_import_kernel_table_distance_modify(struct nb_cb_modify_args
*args
)
184 switch (args
->event
) {
189 /* TODO: implement me. */
197 * XPath: /frr-zebra:zebra/import-kernel-table/route-map
199 int zebra_import_kernel_table_route_map_modify(struct nb_cb_modify_args
*args
)
201 switch (args
->event
) {
206 /* TODO: implement me. */
213 int zebra_import_kernel_table_route_map_destroy(struct nb_cb_destroy_args
*args
)
215 switch (args
->event
) {
220 /* TODO: implement me. */
228 * XPath: /frr-zebra:zebra/allow-external-route-update
230 int zebra_allow_external_route_update_create(struct nb_cb_create_args
*args
)
232 switch (args
->event
) {
237 /* TODO: implement me. */
244 int zebra_allow_external_route_update_destroy(struct nb_cb_destroy_args
*args
)
246 switch (args
->event
) {
251 /* TODO: implement me. */
259 * XPath: /frr-zebra:zebra/dplane-queue-limit
261 int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args
*args
)
263 switch (args
->event
) {
268 /* TODO: implement me. */
276 * XPath: /frr-zebra:zebra/vrf-vni-mapping
278 int zebra_vrf_vni_mapping_create(struct nb_cb_create_args
*args
)
280 switch (args
->event
) {
285 /* TODO: implement me. */
292 int zebra_vrf_vni_mapping_destroy(struct nb_cb_destroy_args
*args
)
294 switch (args
->event
) {
299 /* TODO: implement me. */
307 * XPath: /frr-zebra:zebra/vrf-vni-mapping/vni-id
309 int zebra_vrf_vni_mapping_vni_id_modify(struct nb_cb_modify_args
*args
)
311 switch (args
->event
) {
316 /* TODO: implement me. */
323 int zebra_vrf_vni_mapping_vni_id_destroy(struct nb_cb_destroy_args
*args
)
325 switch (args
->event
) {
330 /* TODO: implement me. */
338 * XPath: /frr-zebra:zebra/vrf-vni-mapping/prefix-only
340 int zebra_vrf_vni_mapping_prefix_only_create(struct nb_cb_create_args
*args
)
342 switch (args
->event
) {
347 /* TODO: implement me. */
354 int zebra_vrf_vni_mapping_prefix_only_destroy(struct nb_cb_destroy_args
*args
)
356 switch (args
->event
) {
361 /* TODO: implement me. */
369 * XPath: /frr-zebra:zebra/debugs/debug-events
371 int zebra_debugs_debug_events_modify(struct nb_cb_modify_args
*args
)
373 switch (args
->event
) {
378 /* TODO: implement me. */
385 int zebra_debugs_debug_events_destroy(struct nb_cb_destroy_args
*args
)
387 switch (args
->event
) {
392 /* TODO: implement me. */
400 * XPath: /frr-zebra:zebra/debugs/debug-zapi-send
402 int zebra_debugs_debug_zapi_send_modify(struct nb_cb_modify_args
*args
)
404 switch (args
->event
) {
409 /* TODO: implement me. */
416 int zebra_debugs_debug_zapi_send_destroy(struct nb_cb_destroy_args
*args
)
418 switch (args
->event
) {
423 /* TODO: implement me. */
431 * XPath: /frr-zebra:zebra/debugs/debug-zapi-recv
433 int zebra_debugs_debug_zapi_recv_modify(struct nb_cb_modify_args
*args
)
435 switch (args
->event
) {
440 /* TODO: implement me. */
447 int zebra_debugs_debug_zapi_recv_destroy(struct nb_cb_destroy_args
*args
)
449 switch (args
->event
) {
454 /* TODO: implement me. */
462 * XPath: /frr-zebra:zebra/debugs/debug-zapi-detail
464 int zebra_debugs_debug_zapi_detail_modify(struct nb_cb_modify_args
*args
)
466 switch (args
->event
) {
471 /* TODO: implement me. */
478 int zebra_debugs_debug_zapi_detail_destroy(struct nb_cb_destroy_args
*args
)
480 switch (args
->event
) {
485 /* TODO: implement me. */
493 * XPath: /frr-zebra:zebra/debugs/debug-kernel
495 int zebra_debugs_debug_kernel_modify(struct nb_cb_modify_args
*args
)
497 switch (args
->event
) {
502 /* TODO: implement me. */
509 int zebra_debugs_debug_kernel_destroy(struct nb_cb_destroy_args
*args
)
511 switch (args
->event
) {
516 /* TODO: implement me. */
524 * XPath: /frr-zebra:zebra/debugs/debug-kernel-msg-send
526 int zebra_debugs_debug_kernel_msg_send_modify(struct nb_cb_modify_args
*args
)
528 switch (args
->event
) {
533 /* TODO: implement me. */
540 int zebra_debugs_debug_kernel_msg_send_destroy(struct nb_cb_destroy_args
*args
)
542 switch (args
->event
) {
547 /* TODO: implement me. */
555 * XPath: /frr-zebra:zebra/debugs/debug-kernel-msg-recv
557 int zebra_debugs_debug_kernel_msg_recv_modify(struct nb_cb_modify_args
*args
)
559 switch (args
->event
) {
564 /* TODO: implement me. */
571 int zebra_debugs_debug_kernel_msg_recv_destroy(struct nb_cb_destroy_args
*args
)
573 switch (args
->event
) {
578 /* TODO: implement me. */
586 * XPath: /frr-zebra:zebra/debugs/debug-rib
588 int zebra_debugs_debug_rib_modify(struct nb_cb_modify_args
*args
)
590 switch (args
->event
) {
595 /* TODO: implement me. */
602 int zebra_debugs_debug_rib_destroy(struct nb_cb_destroy_args
*args
)
604 switch (args
->event
) {
609 /* TODO: implement me. */
617 * XPath: /frr-zebra:zebra/debugs/debug-rib-detail
619 int zebra_debugs_debug_rib_detail_modify(struct nb_cb_modify_args
*args
)
621 switch (args
->event
) {
626 /* TODO: implement me. */
633 int zebra_debugs_debug_rib_detail_destroy(struct nb_cb_destroy_args
*args
)
635 switch (args
->event
) {
640 /* TODO: implement me. */
648 * XPath: /frr-zebra:zebra/debugs/debug-fpm
650 int zebra_debugs_debug_fpm_modify(struct nb_cb_modify_args
*args
)
652 switch (args
->event
) {
657 /* TODO: implement me. */
664 int zebra_debugs_debug_fpm_destroy(struct nb_cb_destroy_args
*args
)
666 switch (args
->event
) {
671 /* TODO: implement me. */
679 * XPath: /frr-zebra:zebra/debugs/debug-nht
681 int zebra_debugs_debug_nht_modify(struct nb_cb_modify_args
*args
)
683 switch (args
->event
) {
688 /* TODO: implement me. */
695 int zebra_debugs_debug_nht_destroy(struct nb_cb_destroy_args
*args
)
697 switch (args
->event
) {
702 /* TODO: implement me. */
710 * XPath: /frr-zebra:zebra/debugs/debug-nht-detail
712 int zebra_debugs_debug_nht_detail_modify(struct nb_cb_modify_args
*args
)
714 switch (args
->event
) {
719 /* TODO: implement me. */
726 int zebra_debugs_debug_nht_detail_destroy(struct nb_cb_destroy_args
*args
)
728 switch (args
->event
) {
733 /* TODO: implement me. */
741 * XPath: /frr-zebra:zebra/debugs/debug-mpls
743 int zebra_debugs_debug_mpls_modify(struct nb_cb_modify_args
*args
)
745 switch (args
->event
) {
750 /* TODO: implement me. */
757 int zebra_debugs_debug_mpls_destroy(struct nb_cb_destroy_args
*args
)
759 switch (args
->event
) {
764 /* TODO: implement me. */
772 * XPath: /frr-zebra:zebra/debugs/debug-vxlan
774 int zebra_debugs_debug_vxlan_modify(struct nb_cb_modify_args
*args
)
776 switch (args
->event
) {
781 /* TODO: implement me. */
788 int zebra_debugs_debug_vxlan_destroy(struct nb_cb_destroy_args
*args
)
790 switch (args
->event
) {
795 /* TODO: implement me. */
803 * XPath: /frr-zebra:zebra/debugs/debug-pw
805 int zebra_debugs_debug_pw_modify(struct nb_cb_modify_args
*args
)
807 switch (args
->event
) {
812 /* TODO: implement me. */
819 int zebra_debugs_debug_pw_destroy(struct nb_cb_destroy_args
*args
)
821 switch (args
->event
) {
826 /* TODO: implement me. */
834 * XPath: /frr-zebra:zebra/debugs/debug-dplane
836 int zebra_debugs_debug_dplane_modify(struct nb_cb_modify_args
*args
)
838 switch (args
->event
) {
843 /* TODO: implement me. */
850 int zebra_debugs_debug_dplane_destroy(struct nb_cb_destroy_args
*args
)
852 switch (args
->event
) {
857 /* TODO: implement me. */
865 * XPath: /frr-zebra:zebra/debugs/debug-dplane-detail
867 int zebra_debugs_debug_dplane_detail_modify(struct nb_cb_modify_args
*args
)
869 switch (args
->event
) {
874 /* TODO: implement me. */
881 int zebra_debugs_debug_dplane_detail_destroy(struct nb_cb_destroy_args
*args
)
883 switch (args
->event
) {
888 /* TODO: implement me. */
896 * XPath: /frr-zebra:zebra/debugs/debug-mlag
898 int zebra_debugs_debug_mlag_modify(struct nb_cb_modify_args
*args
)
900 switch (args
->event
) {
905 /* TODO: implement me. */
912 int zebra_debugs_debug_mlag_destroy(struct nb_cb_destroy_args
*args
)
914 switch (args
->event
) {
919 /* TODO: implement me. */
927 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs
929 int lib_interface_zebra_ip_addrs_create(struct nb_cb_create_args
*args
)
931 struct interface
*ifp
;
932 struct prefix prefix
;
933 char buf
[PREFIX_STRLEN
] = {0};
935 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
936 // addr_family = yang_dnode_get_enum(dnode, "./address-family");
937 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
940 switch (args
->event
) {
942 if (prefix
.family
== AF_INET
943 && ipv4_martian(&prefix
.u
.prefix4
)) {
944 zlog_debug("invalid address %s",
945 prefix2str(&prefix
, buf
, sizeof(buf
)));
946 return NB_ERR_VALIDATION
;
947 } else if (prefix
.family
== AF_INET6
948 && ipv6_martian(&prefix
.u
.prefix6
)) {
949 zlog_debug("invalid address %s",
950 prefix2str(&prefix
, buf
, sizeof(buf
)));
951 return NB_ERR_VALIDATION
;
958 if (prefix
.family
== AF_INET
)
959 if_ip_address_install(ifp
, &prefix
, NULL
, NULL
);
960 else if (prefix
.family
== AF_INET6
)
961 if_ipv6_address_install(ifp
, &prefix
, NULL
);
969 int lib_interface_zebra_ip_addrs_destroy(struct nb_cb_destroy_args
*args
)
971 struct interface
*ifp
;
972 struct prefix prefix
;
973 struct connected
*ifc
;
975 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
976 yang_dnode_get_prefix(&prefix
, args
->dnode
, "./ip-prefix");
979 switch (args
->event
) {
981 if (prefix
.family
== AF_INET
) {
982 /* Check current interface address. */
983 ifc
= connected_check_ptp(ifp
, &prefix
, NULL
);
985 zlog_debug("interface %s Can't find address\n",
987 return NB_ERR_VALIDATION
;
989 } else if (prefix
.family
== AF_INET6
) {
990 /* Check current interface address. */
991 ifc
= connected_check(ifp
, &prefix
);
993 zlog_debug("interface can't find address %s",
995 return NB_ERR_VALIDATION
;
998 return NB_ERR_VALIDATION
;
1000 /* This is not configured address. */
1001 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
)) {
1002 zlog_debug("interface %s not configured", ifp
->name
);
1003 return NB_ERR_VALIDATION
;
1006 /* This is not real address or interface is not active. */
1007 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
1008 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1009 listnode_delete(ifp
->connected
, ifc
);
1010 connected_free(&ifc
);
1011 return NB_ERR_VALIDATION
;
1018 if_ip_address_uinstall(ifp
, &prefix
);
1026 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/label
1028 int lib_interface_zebra_ip_addrs_label_modify(struct nb_cb_modify_args
*args
)
1030 switch (args
->event
) {
1031 case NB_EV_VALIDATE
:
1035 /* TODO: implement me. */
1042 int lib_interface_zebra_ip_addrs_label_destroy(struct nb_cb_destroy_args
*args
)
1044 switch (args
->event
) {
1045 case NB_EV_VALIDATE
:
1049 /* TODO: implement me. */
1057 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ip-addrs/ip4-peer
1059 int lib_interface_zebra_ip_addrs_ip4_peer_modify(struct nb_cb_modify_args
*args
)
1061 switch (args
->event
) {
1062 case NB_EV_VALIDATE
:
1066 /* TODO: implement me. */
1073 int lib_interface_zebra_ip_addrs_ip4_peer_destroy(
1074 struct nb_cb_destroy_args
*args
)
1076 switch (args
->event
) {
1077 case NB_EV_VALIDATE
:
1081 /* TODO: implement me. */
1089 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/multicast
1091 int lib_interface_zebra_multicast_modify(struct nb_cb_modify_args
*args
)
1093 if (args
->event
!= NB_EV_APPLY
)
1096 struct interface
*ifp
;
1098 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1100 if_multicast_set(ifp
);
1105 int lib_interface_zebra_multicast_destroy(struct nb_cb_destroy_args
*args
)
1107 if (args
->event
!= NB_EV_APPLY
)
1110 struct interface
*ifp
;
1112 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1114 if_multicast_unset(ifp
);
1120 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-detect
1122 int lib_interface_zebra_link_detect_modify(struct nb_cb_modify_args
*args
)
1124 if (args
->event
!= NB_EV_APPLY
)
1127 struct interface
*ifp
;
1130 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1131 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1133 if_linkdetect(ifp
, link_detect
);
1138 int lib_interface_zebra_link_detect_destroy(struct nb_cb_destroy_args
*args
)
1140 if (args
->event
!= NB_EV_APPLY
)
1143 struct interface
*ifp
;
1146 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1147 link_detect
= yang_dnode_get_bool(args
->dnode
, "./link-detect");
1149 if_linkdetect(ifp
, link_detect
);
1155 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/shutdown
1157 int lib_interface_zebra_shutdown_modify(struct nb_cb_modify_args
*args
)
1159 struct interface
*ifp
;
1161 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1168 int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args
*args
)
1170 struct interface
*ifp
;
1172 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1174 if_no_shutdown(ifp
);
1180 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/bandwidth
1182 int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args
*args
)
1184 if (args
->event
!= NB_EV_APPLY
)
1187 struct interface
*ifp
;
1190 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1191 bandwidth
= yang_dnode_get_uint32(args
->dnode
, "./bandwidth");
1193 ifp
->bandwidth
= bandwidth
;
1195 /* force protocols to recalculate routes due to cost change */
1196 if (if_is_operative(ifp
))
1197 zebra_interface_up_update(ifp
);
1202 int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args
*args
)
1204 if (args
->event
!= NB_EV_APPLY
)
1207 struct interface
*ifp
;
1209 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1213 /* force protocols to recalculate routes due to cost change */
1214 if (if_is_operative(ifp
))
1215 zebra_interface_up_update(ifp
);
1221 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib
1223 int lib_vrf_zebra_ribs_rib_create(struct nb_cb_create_args
*args
)
1228 struct zebra_vrf
*zvrf
;
1229 struct zebra_router_table
*zrt
;
1231 const char *afi_safi_name
;
1233 vrf
= nb_running_get_entry(args
->dnode
, NULL
, false);
1234 zvrf
= vrf_info_lookup(vrf
->vrf_id
);
1235 table_id
= yang_dnode_get_uint32(args
->dnode
, "./table-id");
1237 table_id
= zvrf
->table_id
;
1239 afi_safi_name
= yang_dnode_get_string(args
->dnode
, "./afi-safi-name");
1240 zebra_afi_safi_identity2value(afi_safi_name
, &afi
, &safi
);
1242 zrt
= zebra_router_find_zrt(zvrf
, table_id
, afi
, safi
);
1244 switch (args
->event
) {
1245 case NB_EV_VALIDATE
:
1247 zlog_debug("%s: vrf %s table is not found.", __func__
,
1249 return NB_ERR_VALIDATION
;
1257 nb_running_set_entry(args
->dnode
, zrt
);
1265 int lib_vrf_zebra_ribs_rib_destroy(struct nb_cb_destroy_args
*args
)
1267 if (args
->event
!= NB_EV_APPLY
)
1270 nb_running_unset_entry(args
->dnode
);
1278 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv4-prefix-length
1280 int lib_route_map_entry_match_condition_ipv4_prefix_length_modify(
1281 struct nb_cb_modify_args
*args
)
1283 struct routemap_hook_context
*rhc
;
1287 if (args
->event
!= NB_EV_APPLY
)
1290 /* Add configuration. */
1291 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1292 length
= yang_dnode_get_string(args
->dnode
, NULL
);
1294 yang_dnode_get_enum(args
->dnode
, "../frr-route-map:condition");
1296 /* Set destroy information. */
1297 switch (condition
) {
1298 case 100: /* ipv4-prefix-length */
1299 rhc
->rhc_rule
= "ip address prefix-len";
1302 case 102: /* ipv4-next-hop-prefix-length */
1303 rhc
->rhc_rule
= "ip next-hop prefix-len";
1306 rhc
->rhc_mhook
= generic_match_delete
;
1307 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1309 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, rhc
->rhc_rule
, length
,
1310 RMAP_EVENT_MATCH_ADDED
);
1311 if (rv
!= CMD_SUCCESS
) {
1312 rhc
->rhc_mhook
= NULL
;
1313 return NB_ERR_INCONSISTENCY
;
1319 int lib_route_map_entry_match_condition_ipv4_prefix_length_destroy(
1320 struct nb_cb_destroy_args
*args
)
1322 return lib_route_map_entry_match_destroy(args
);
1327 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv6-prefix-length
1329 int lib_route_map_entry_match_condition_ipv6_prefix_length_modify(
1330 struct nb_cb_modify_args
*args
)
1332 struct routemap_hook_context
*rhc
;
1336 if (args
->event
!= NB_EV_APPLY
)
1339 /* Add configuration. */
1340 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1341 length
= yang_dnode_get_string(args
->dnode
, NULL
);
1343 /* Set destroy information. */
1344 rhc
->rhc_mhook
= generic_match_delete
;
1345 rhc
->rhc_rule
= "ipv6 address prefix-len";
1346 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1348 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "ipv6 address prefix-len",
1349 length
, RMAP_EVENT_MATCH_ADDED
);
1350 if (rv
!= CMD_SUCCESS
) {
1351 rhc
->rhc_mhook
= NULL
;
1352 return NB_ERR_INCONSISTENCY
;
1358 int lib_route_map_entry_match_condition_ipv6_prefix_length_destroy(
1359 struct nb_cb_destroy_args
*args
)
1361 return lib_route_map_entry_match_destroy(args
);
1366 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:source-protocol
1368 int lib_route_map_entry_match_condition_source_protocol_modify(
1369 struct nb_cb_modify_args
*args
)
1371 struct routemap_hook_context
*rhc
;
1375 switch (args
->event
) {
1376 case NB_EV_VALIDATE
:
1377 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1378 if (proto_name2num(type
) == -1) {
1379 zlog_warn("%s: invalid protocol: %s", __func__
, type
);
1380 return NB_ERR_VALIDATION
;
1391 /* Add configuration. */
1392 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1393 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1395 /* Set destroy information. */
1396 rhc
->rhc_mhook
= generic_match_delete
;
1397 rhc
->rhc_rule
= "source-protocol";
1398 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1400 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "source-protocol", type
,
1401 RMAP_EVENT_MATCH_ADDED
);
1402 if (rv
!= CMD_SUCCESS
) {
1403 rhc
->rhc_mhook
= NULL
;
1404 return NB_ERR_INCONSISTENCY
;
1410 int lib_route_map_entry_match_condition_source_protocol_destroy(
1411 struct nb_cb_destroy_args
*args
)
1413 return lib_route_map_entry_match_destroy(args
);
1418 * /frr-route-map:lib/route-map/entry/match-condition/frr-zebra:source-instance
1420 int lib_route_map_entry_match_condition_source_instance_modify(
1421 struct nb_cb_modify_args
*args
)
1423 struct routemap_hook_context
*rhc
;
1427 if (args
->event
!= NB_EV_APPLY
)
1430 /* Add configuration. */
1431 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1432 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1434 /* Set destroy information. */
1435 rhc
->rhc_mhook
= generic_match_delete
;
1436 rhc
->rhc_rule
= "source-instance";
1437 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1439 rv
= generic_match_add(NULL
, rhc
->rhc_rmi
, "source-instance", type
,
1440 RMAP_EVENT_MATCH_ADDED
);
1441 if (rv
!= CMD_SUCCESS
) {
1442 rhc
->rhc_mhook
= NULL
;
1443 return NB_ERR_INCONSISTENCY
;
1449 int lib_route_map_entry_match_condition_source_instance_destroy(
1450 struct nb_cb_destroy_args
*args
)
1452 return lib_route_map_entry_match_destroy(args
);
1456 * XPath: /frr-route-map:lib/route-map/entry/set-action/frr-zebra:source-v4
1458 int lib_route_map_entry_set_action_source_v4_modify(
1459 struct nb_cb_modify_args
*args
)
1461 struct routemap_hook_context
*rhc
;
1462 struct interface
*pif
= NULL
;
1468 switch (args
->event
) {
1469 case NB_EV_VALIDATE
:
1470 memset(&p
, 0, sizeof(p
));
1471 yang_dnode_get_ipv4p(&p
, args
->dnode
, NULL
);
1472 if (zebra_check_addr(&p
) == 0) {
1473 zlog_warn("%s: invalid IPv4 address: %s", __func__
,
1474 yang_dnode_get_string(args
->dnode
, NULL
));
1475 return NB_ERR_VALIDATION
;
1478 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
1479 pif
= if_lookup_exact_address(&p
.u
.prefix4
, AF_INET
,
1485 zlog_warn("%s: is not a local adddress: %s", __func__
,
1486 yang_dnode_get_string(args
->dnode
, NULL
));
1487 return NB_ERR_VALIDATION
;
1498 /* Add configuration. */
1499 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1500 source
= yang_dnode_get_string(args
->dnode
, NULL
);
1502 /* Set destroy information. */
1503 rhc
->rhc_shook
= generic_set_delete
;
1504 rhc
->rhc_rule
= "src";
1506 rv
= generic_set_add(NULL
, rhc
->rhc_rmi
, "src", source
);
1507 if (rv
!= CMD_SUCCESS
) {
1508 rhc
->rhc_shook
= NULL
;
1509 return NB_ERR_INCONSISTENCY
;
1515 int lib_route_map_entry_set_action_source_v4_destroy(
1516 struct nb_cb_destroy_args
*args
)
1518 return lib_route_map_entry_set_destroy(args
);
1522 * XPath: /frr-route-map:lib/route-map/entry/set-action/frr-zebra:source-v6
1524 int lib_route_map_entry_set_action_source_v6_modify(
1525 struct nb_cb_modify_args
*args
)
1527 struct routemap_hook_context
*rhc
;
1528 struct interface
*pif
= NULL
;
1534 switch (args
->event
) {
1535 case NB_EV_VALIDATE
:
1536 memset(&p
, 0, sizeof(p
));
1537 yang_dnode_get_ipv6p(&p
, args
->dnode
, NULL
);
1538 if (zebra_check_addr(&p
) == 0) {
1539 zlog_warn("%s: invalid IPv6 address: %s", __func__
,
1540 yang_dnode_get_string(args
->dnode
, NULL
));
1541 return NB_ERR_VALIDATION
;
1544 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
1545 pif
= if_lookup_exact_address(&p
.u
.prefix6
, AF_INET6
,
1551 zlog_warn("%s: is not a local adddress: %s", __func__
,
1552 yang_dnode_get_string(args
->dnode
, NULL
));
1553 return NB_ERR_VALIDATION
;
1564 /* Add configuration. */
1565 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1566 source
= yang_dnode_get_string(args
->dnode
, NULL
);
1568 /* Set destroy information. */
1569 rhc
->rhc_shook
= generic_set_delete
;
1570 rhc
->rhc_rule
= "src";
1572 rv
= generic_set_add(NULL
, rhc
->rhc_rmi
, "src", source
);
1573 if (rv
!= CMD_SUCCESS
) {
1574 rhc
->rhc_shook
= NULL
;
1575 return NB_ERR_INCONSISTENCY
;
1581 int lib_route_map_entry_set_action_source_v6_destroy(
1582 struct nb_cb_destroy_args
*args
)
1584 return lib_route_map_entry_set_destroy(args
);