2 * Copyright (C) 2020 Vmware
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
22 #include "lib/command.h"
24 #include "lib/northbound.h"
25 #include "lib/routemap.h"
26 #include "bgpd/bgpd.h"
27 #include "bgpd/bgp_routemap_nb.h"
29 /* Add bgp route map rule. */
30 static int bgp_route_match_add(struct route_map_index
*index
,
31 const char *command
, const char *arg
,
32 route_map_event_t type
,
33 char *errmsg
, size_t errmsg_len
)
35 int retval
= CMD_SUCCESS
;
36 enum rmap_compile_rets ret
;
38 ret
= route_map_add_match(index
, command
, arg
, type
);
40 case RMAP_RULE_MISSING
:
41 snprintf(errmsg
, errmsg_len
, "%% BGP Can't find rule.");
42 retval
= CMD_WARNING_CONFIG_FAILED
;
44 case RMAP_COMPILE_ERROR
:
45 snprintf(errmsg
, errmsg_len
, "%% BGP Argument is malformed.");
46 retval
= CMD_WARNING_CONFIG_FAILED
;
48 case RMAP_COMPILE_SUCCESS
:
50 * Intentionally doing nothing here.
58 /* Delete bgp route map rule. */
59 static int bgp_route_match_delete(struct route_map_index
*index
,
60 const char *command
, const char *arg
,
61 route_map_event_t type
,
62 char *errmsg
, size_t errmsg_len
)
64 enum rmap_compile_rets ret
;
65 int retval
= CMD_SUCCESS
;
66 char *dep_name
= NULL
;
68 char *rmap_name
= NULL
;
70 if (type
!= RMAP_EVENT_MATCH_DELETED
) {
71 /* ignore the mundane, the types without any dependency */
73 tmpstr
= route_map_get_match_arg(index
, command
);
76 XSTRDUP(MTYPE_ROUTE_MAP_RULE
, tmpstr
);
78 dep_name
= XSTRDUP(MTYPE_ROUTE_MAP_RULE
, arg
);
80 rmap_name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, index
->map
->name
);
83 ret
= route_map_delete_match(index
, command
, dep_name
, type
);
85 case RMAP_RULE_MISSING
:
86 snprintf(errmsg
, errmsg_len
, "%% BGP Can't find rule.");
87 retval
= CMD_WARNING_CONFIG_FAILED
;
89 case RMAP_COMPILE_ERROR
:
90 snprintf(errmsg
, errmsg_len
,
91 "%% BGP Argument is malformed.");
92 retval
= CMD_WARNING_CONFIG_FAILED
;
94 case RMAP_COMPILE_SUCCESS
:
101 XFREE(MTYPE_ROUTE_MAP_RULE
, dep_name
);
102 XFREE(MTYPE_ROUTE_MAP_NAME
, rmap_name
);
108 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:local-preference
111 lib_route_map_entry_match_condition_rmap_match_condition_local_preference_modify(
112 struct nb_cb_modify_args
*args
)
114 struct routemap_hook_context
*rhc
;
115 const char *local_pref
;
116 enum rmap_compile_rets ret
;
118 switch (args
->event
) {
124 /* Add configuration. */
125 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
126 local_pref
= yang_dnode_get_string(args
->dnode
, NULL
);
128 /* Set destroy information. */
129 rhc
->rhc_mhook
= bgp_route_match_delete
;
130 rhc
->rhc_rule
= "local-preference";
131 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
133 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "local-preference",
134 local_pref
, RMAP_EVENT_MATCH_ADDED
,
135 args
->errmsg
, args
->errmsg_len
);
137 if (ret
!= RMAP_COMPILE_SUCCESS
) {
138 rhc
->rhc_mhook
= NULL
;
139 return NB_ERR_INCONSISTENCY
;
147 lib_route_map_entry_match_condition_rmap_match_condition_local_preference_destroy(
148 struct nb_cb_destroy_args
*args
)
150 switch (args
->event
) {
156 return lib_route_map_entry_match_destroy(args
);
164 * /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:alias
166 int lib_route_map_entry_match_condition_rmap_match_condition_alias_modify(
167 struct nb_cb_modify_args
*args
)
169 struct routemap_hook_context
*rhc
;
171 enum rmap_compile_rets ret
;
173 switch (args
->event
) {
179 /* Add configuration. */
180 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
181 alias
= yang_dnode_get_string(args
->dnode
, NULL
);
183 /* Set destroy information. */
184 rhc
->rhc_mhook
= bgp_route_match_delete
;
185 rhc
->rhc_rule
= "alias";
186 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
188 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "alias", alias
,
189 RMAP_EVENT_MATCH_ADDED
, args
->errmsg
,
192 if (ret
!= RMAP_COMPILE_SUCCESS
) {
193 rhc
->rhc_mhook
= NULL
;
194 return NB_ERR_VALIDATION
;
203 int lib_route_map_entry_match_condition_rmap_match_condition_alias_destroy(
204 struct nb_cb_destroy_args
*args
)
206 switch (args
->event
) {
212 return lib_route_map_entry_match_destroy(args
);
219 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:script
222 lib_route_map_entry_match_condition_rmap_match_condition_script_modify(
223 struct nb_cb_modify_args
*args
)
225 struct routemap_hook_context
*rhc
;
227 enum rmap_compile_rets ret
;
229 switch (args
->event
) {
235 /* Add configuration. */
236 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
237 script
= yang_dnode_get_string(args
->dnode
, NULL
);
239 /* Set destroy information. */
240 rhc
->rhc_mhook
= bgp_route_match_delete
;
241 rhc
->rhc_rule
= "script";
242 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
244 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "script",
245 script
, RMAP_EVENT_MATCH_ADDED
,
246 args
->errmsg
, args
->errmsg_len
);
248 if (ret
!= RMAP_COMPILE_SUCCESS
) {
249 rhc
->rhc_mhook
= NULL
;
250 return NB_ERR_INCONSISTENCY
;
258 lib_route_map_entry_match_condition_rmap_match_condition_script_destroy(
259 struct nb_cb_destroy_args
*args
)
261 switch (args
->event
) {
267 return lib_route_map_entry_match_destroy(args
);
274 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:origin
277 lib_route_map_entry_match_condition_rmap_match_condition_origin_modify(
278 struct nb_cb_modify_args
*args
)
280 struct routemap_hook_context
*rhc
;
282 enum rmap_compile_rets ret
;
284 switch (args
->event
) {
290 /* Add configuration. */
291 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
292 origin
= yang_dnode_get_string(args
->dnode
, NULL
);
294 /* Set destroy information. */
295 rhc
->rhc_mhook
= bgp_route_match_delete
;
296 rhc
->rhc_rule
= "origin";
297 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
299 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "origin", origin
,
300 RMAP_EVENT_MATCH_ADDED
,
301 args
->errmsg
, args
->errmsg_len
);
303 if (ret
!= RMAP_COMPILE_SUCCESS
) {
304 rhc
->rhc_mhook
= NULL
;
305 return NB_ERR_INCONSISTENCY
;
313 lib_route_map_entry_match_condition_rmap_match_condition_origin_destroy(
314 struct nb_cb_destroy_args
*args
)
316 switch (args
->event
) {
322 return lib_route_map_entry_match_destroy(args
);
329 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:rpki
332 lib_route_map_entry_match_condition_rmap_match_condition_rpki_modify(
333 struct nb_cb_modify_args
*args
)
335 struct routemap_hook_context
*rhc
;
337 enum rmap_compile_rets ret
;
339 switch (args
->event
) {
345 /* Add configuration. */
346 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
347 rpki
= yang_dnode_get_string(args
->dnode
, NULL
);
349 /* Set destroy information. */
350 rhc
->rhc_mhook
= bgp_route_match_delete
;
351 rhc
->rhc_rule
= "rpki";
352 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
354 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "rpki", rpki
,
355 RMAP_EVENT_MATCH_ADDED
,
356 args
->errmsg
, args
->errmsg_len
);
358 if (ret
!= RMAP_COMPILE_SUCCESS
) {
359 rhc
->rhc_mhook
= NULL
;
360 return NB_ERR_INCONSISTENCY
;
368 lib_route_map_entry_match_condition_rmap_match_condition_rpki_destroy(
369 struct nb_cb_destroy_args
*args
)
371 switch (args
->event
) {
377 return lib_route_map_entry_match_destroy(args
);
384 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:probability
387 lib_route_map_entry_match_condition_rmap_match_condition_probability_modify(
388 struct nb_cb_modify_args
*args
)
390 struct routemap_hook_context
*rhc
;
391 const char *probability
;
392 enum rmap_compile_rets ret
;
394 switch (args
->event
) {
400 /* Add configuration. */
401 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
402 probability
= yang_dnode_get_string(args
->dnode
, NULL
);
404 /* Set destroy information. */
405 rhc
->rhc_mhook
= bgp_route_match_delete
;
406 rhc
->rhc_rule
= "probability";
407 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
409 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "probability",
410 probability
, RMAP_EVENT_MATCH_ADDED
,
411 args
->errmsg
, args
->errmsg_len
);
413 if (ret
!= RMAP_COMPILE_SUCCESS
) {
414 rhc
->rhc_mhook
= NULL
;
415 return NB_ERR_INCONSISTENCY
;
423 lib_route_map_entry_match_condition_rmap_match_condition_probability_destroy(
424 struct nb_cb_destroy_args
*args
)
426 switch (args
->event
) {
431 return lib_route_map_entry_match_destroy(args
);
438 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:source-vrf
441 lib_route_map_entry_match_condition_rmap_match_condition_source_vrf_modify(
442 struct nb_cb_modify_args
*args
)
444 struct routemap_hook_context
*rhc
;
446 enum rmap_compile_rets ret
;
448 switch (args
->event
) {
454 /* Add configuration. */
455 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
456 vrf
= yang_dnode_get_string(args
->dnode
, NULL
);
458 /* Set destroy information. */
459 rhc
->rhc_mhook
= bgp_route_match_delete
;
460 rhc
->rhc_rule
= "source-vrf";
461 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
463 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "source-vrf", vrf
,
464 RMAP_EVENT_MATCH_ADDED
,
465 args
->errmsg
, args
->errmsg_len
);
467 if (ret
!= RMAP_COMPILE_SUCCESS
) {
468 rhc
->rhc_mhook
= NULL
;
469 return NB_ERR_INCONSISTENCY
;
477 lib_route_map_entry_match_condition_rmap_match_condition_source_vrf_destroy(
478 struct nb_cb_destroy_args
*args
)
480 switch (args
->event
) {
486 return lib_route_map_entry_match_destroy(args
);
493 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:peer-ipv4-address
496 lib_route_map_entry_match_condition_rmap_match_condition_peer_ipv4_address_modify(
497 struct nb_cb_modify_args
*args
)
499 struct routemap_hook_context
*rhc
;
501 enum rmap_compile_rets ret
;
503 switch (args
->event
) {
509 /* Add configuration. */
510 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
511 peer
= yang_dnode_get_string(args
->dnode
, NULL
);
513 /* Set destroy information. */
514 rhc
->rhc_mhook
= bgp_route_match_delete
;
515 rhc
->rhc_rule
= "peer";
516 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
518 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "peer", peer
,
519 RMAP_EVENT_MATCH_ADDED
,
520 args
->errmsg
, args
->errmsg_len
);
522 if (ret
!= RMAP_COMPILE_SUCCESS
) {
523 rhc
->rhc_mhook
= NULL
;
524 return NB_ERR_INCONSISTENCY
;
532 lib_route_map_entry_match_condition_rmap_match_condition_peer_ipv4_address_destroy(
533 struct nb_cb_destroy_args
*args
)
535 switch (args
->event
) {
541 return lib_route_map_entry_match_destroy(args
);
548 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:peer-interface
551 lib_route_map_entry_match_condition_rmap_match_condition_peer_interface_modify(
552 struct nb_cb_modify_args
*args
)
554 struct routemap_hook_context
*rhc
;
556 enum rmap_compile_rets ret
;
558 switch (args
->event
) {
564 /* Add configuration. */
565 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
566 peer
= yang_dnode_get_string(args
->dnode
, NULL
);
568 /* Set destroy information. */
569 rhc
->rhc_mhook
= bgp_route_match_delete
;
570 rhc
->rhc_rule
= "peer";
571 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
573 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "peer", peer
,
574 RMAP_EVENT_MATCH_ADDED
,
575 args
->errmsg
, args
->errmsg_len
);
577 if (ret
!= RMAP_COMPILE_SUCCESS
) {
578 rhc
->rhc_mhook
= NULL
;
579 return NB_ERR_INCONSISTENCY
;
587 lib_route_map_entry_match_condition_rmap_match_condition_peer_interface_destroy(
588 struct nb_cb_destroy_args
*args
)
590 switch (args
->event
) {
596 return lib_route_map_entry_match_destroy(args
);
603 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:peer-ipv6-address
606 lib_route_map_entry_match_condition_rmap_match_condition_peer_ipv6_address_modify(
607 struct nb_cb_modify_args
*args
)
609 struct routemap_hook_context
*rhc
;
611 enum rmap_compile_rets ret
;
613 switch (args
->event
) {
619 /* Add configuration. */
620 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
621 peer
= yang_dnode_get_string(args
->dnode
, NULL
);
623 /* Set destroy information. */
624 rhc
->rhc_mhook
= bgp_route_match_delete
;
625 rhc
->rhc_rule
= "peer";
626 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
628 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "peer", peer
,
629 RMAP_EVENT_MATCH_ADDED
,
630 args
->errmsg
, args
->errmsg_len
);
632 if (ret
!= RMAP_COMPILE_SUCCESS
) {
633 rhc
->rhc_mhook
= NULL
;
634 return NB_ERR_INCONSISTENCY
;
642 lib_route_map_entry_match_condition_rmap_match_condition_peer_ipv6_address_destroy(
643 struct nb_cb_destroy_args
*args
)
645 switch (args
->event
) {
651 return lib_route_map_entry_match_destroy(args
);
658 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:peer-local
661 lib_route_map_entry_match_condition_rmap_match_condition_peer_local_modify(
662 struct nb_cb_modify_args
*args
)
664 struct routemap_hook_context
*rhc
;
666 enum rmap_compile_rets ret
;
668 switch (args
->event
) {
674 /* Add configuration. */
675 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
676 value
= yang_dnode_get_bool(args
->dnode
, NULL
);
678 /* Set destroy information. */
679 rhc
->rhc_mhook
= bgp_route_match_delete
;
680 rhc
->rhc_rule
= "peer";
681 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
684 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "peer",
686 RMAP_EVENT_MATCH_ADDED
,
687 args
->errmsg
, args
->errmsg_len
);
689 if (ret
!= RMAP_COMPILE_SUCCESS
) {
690 rhc
->rhc_mhook
= NULL
;
691 return NB_ERR_INCONSISTENCY
;
700 lib_route_map_entry_match_condition_rmap_match_condition_peer_local_destroy(
701 struct nb_cb_destroy_args
*args
)
703 switch (args
->event
) {
709 return lib_route_map_entry_match_destroy(args
);
716 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:list-name
719 lib_route_map_entry_match_condition_rmap_match_condition_list_name_modify(
720 struct nb_cb_modify_args
*args
)
722 struct routemap_hook_context
*rhc
;
723 const char *list_name
;
724 enum rmap_compile_rets ret
= RMAP_COMPILE_SUCCESS
;
725 const char *condition
;
727 switch (args
->event
) {
733 /* Add configuration. */
734 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
735 list_name
= yang_dnode_get_string(args
->dnode
, NULL
);
736 condition
= yang_dnode_get_string(args
->dnode
,
737 "../../frr-route-map:condition");
739 if (IS_MATCH_AS_LIST(condition
)) {
740 /* Set destroy information. */
741 rhc
->rhc_mhook
= bgp_route_match_delete
;
742 rhc
->rhc_rule
= "as-path";
743 rhc
->rhc_event
= RMAP_EVENT_ASLIST_DELETED
;
745 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "as-path",
746 list_name
, RMAP_EVENT_ASLIST_ADDED
,
747 args
->errmsg
, args
->errmsg_len
);
748 } else if (IS_MATCH_MAC_LIST(condition
)) {
749 /* Set destroy information. */
750 rhc
->rhc_mhook
= bgp_route_match_delete
;
751 rhc
->rhc_rule
= "mac address";
752 rhc
->rhc_event
= RMAP_EVENT_FILTER_DELETED
;
754 ret
= bgp_route_match_add(rhc
->rhc_rmi
,
757 RMAP_EVENT_FILTER_ADDED
,
758 args
->errmsg
, args
->errmsg_len
);
759 } else if (IS_MATCH_ROUTE_SRC(condition
)) {
760 /* Set destroy information. */
761 rhc
->rhc_mhook
= bgp_route_match_delete
;
762 rhc
->rhc_rule
= "ip route-source";
763 rhc
->rhc_event
= RMAP_EVENT_FILTER_DELETED
;
765 ret
= bgp_route_match_add(rhc
->rhc_rmi
,
767 list_name
, RMAP_EVENT_FILTER_ADDED
,
768 args
->errmsg
, args
->errmsg_len
);
769 } else if (IS_MATCH_ROUTE_SRC_PL(condition
)) {
770 /* Set destroy information. */
771 rhc
->rhc_mhook
= bgp_route_match_delete
;
772 rhc
->rhc_rule
= "ip route-source prefix-list";
773 rhc
->rhc_event
= RMAP_EVENT_PLIST_DELETED
;
775 ret
= bgp_route_match_add(rhc
->rhc_rmi
,
776 "ip route-source prefix-list",
777 list_name
, RMAP_EVENT_PLIST_ADDED
,
778 args
->errmsg
, args
->errmsg_len
);
781 if (ret
!= RMAP_COMPILE_SUCCESS
) {
782 rhc
->rhc_mhook
= NULL
;
783 return NB_ERR_INCONSISTENCY
;
791 lib_route_map_entry_match_condition_rmap_match_condition_list_name_destroy(
792 struct nb_cb_destroy_args
*args
)
794 switch (args
->event
) {
800 return lib_route_map_entry_match_destroy(args
);
807 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:evpn-default-route
810 lib_route_map_entry_match_condition_rmap_match_condition_evpn_default_route_create(
811 struct nb_cb_create_args
*args
)
813 struct routemap_hook_context
*rhc
;
814 enum rmap_compile_rets ret
;
816 switch (args
->event
) {
822 /* Add configuration. */
823 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
825 /* Set destroy information. */
826 rhc
->rhc_mhook
= bgp_route_match_delete
;
827 rhc
->rhc_rule
= "evpn default-route";
828 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
830 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "evpn default-route",
831 NULL
, RMAP_EVENT_MATCH_ADDED
,
832 args
->errmsg
, args
->errmsg_len
);
834 if (ret
!= RMAP_COMPILE_SUCCESS
) {
835 rhc
->rhc_mhook
= NULL
;
836 return NB_ERR_INCONSISTENCY
;
844 lib_route_map_entry_match_condition_rmap_match_condition_evpn_default_route_destroy(
845 struct nb_cb_destroy_args
*args
)
847 switch (args
->event
) {
853 return lib_route_map_entry_match_destroy(args
);
860 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:evpn-vni
863 lib_route_map_entry_match_condition_rmap_match_condition_evpn_vni_modify(
864 struct nb_cb_modify_args
*args
)
866 struct routemap_hook_context
*rhc
;
868 enum rmap_compile_rets ret
;
870 switch (args
->event
) {
876 /* Add configuration. */
877 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
878 vni
= yang_dnode_get_string(args
->dnode
, NULL
);
880 /* Set destroy information. */
881 rhc
->rhc_mhook
= bgp_route_match_delete
;
882 rhc
->rhc_rule
= "evpn vni";
883 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
885 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "evpn vni", vni
,
886 RMAP_EVENT_MATCH_ADDED
,
887 args
->errmsg
, args
->errmsg_len
);
889 if (ret
!= RMAP_COMPILE_SUCCESS
) {
890 rhc
->rhc_mhook
= NULL
;
891 return NB_ERR_INCONSISTENCY
;
899 lib_route_map_entry_match_condition_rmap_match_condition_evpn_vni_destroy(
900 struct nb_cb_destroy_args
*args
)
902 switch (args
->event
) {
908 return lib_route_map_entry_match_destroy(args
);
915 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:evpn-route-type
918 lib_route_map_entry_match_condition_rmap_match_condition_evpn_route_type_modify(
919 struct nb_cb_modify_args
*args
)
921 struct routemap_hook_context
*rhc
;
923 enum rmap_compile_rets ret
;
925 switch (args
->event
) {
931 /* Add configuration. */
932 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
933 type
= yang_dnode_get_string(args
->dnode
, NULL
);
935 /* Set destroy information. */
936 rhc
->rhc_mhook
= bgp_route_match_delete
;
937 rhc
->rhc_rule
= "evpn route-type";
938 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
940 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "evpn route-type",
942 RMAP_EVENT_MATCH_ADDED
,
943 args
->errmsg
, args
->errmsg_len
);
945 if (ret
!= RMAP_COMPILE_SUCCESS
) {
946 rhc
->rhc_mhook
= NULL
;
947 return NB_ERR_INCONSISTENCY
;
955 lib_route_map_entry_match_condition_rmap_match_condition_evpn_route_type_destroy(
956 struct nb_cb_destroy_args
*args
)
958 switch (args
->event
) {
964 return lib_route_map_entry_match_destroy(args
);
971 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:route-distinguisher
974 lib_route_map_entry_match_condition_rmap_match_condition_route_distinguisher_modify(
975 struct nb_cb_modify_args
*args
)
977 struct routemap_hook_context
*rhc
;
979 enum rmap_compile_rets ret
;
981 switch (args
->event
) {
987 /* Add configuration. */
988 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
989 rd
= yang_dnode_get_string(args
->dnode
, NULL
);
991 /* Set destroy information. */
992 rhc
->rhc_mhook
= bgp_route_match_delete
;
993 rhc
->rhc_rule
= "evpn rd";
994 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
996 ret
= bgp_route_match_add(rhc
->rhc_rmi
, "evpn rd", rd
,
997 RMAP_EVENT_MATCH_ADDED
,
998 args
->errmsg
, args
->errmsg_len
);
1000 if (ret
!= RMAP_COMPILE_SUCCESS
) {
1001 rhc
->rhc_mhook
= NULL
;
1002 return NB_ERR_INCONSISTENCY
;
1010 lib_route_map_entry_match_condition_rmap_match_condition_route_distinguisher_destroy(
1011 struct nb_cb_destroy_args
*args
)
1013 switch (args
->event
) {
1014 case NB_EV_VALIDATE
:
1019 return lib_route_map_entry_match_destroy(args
);
1026 * XPath = /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:comm-list
1029 lib_route_map_entry_match_condition_rmap_match_condition_comm_list_finish(
1030 struct nb_cb_apply_finish_args
*args
)
1032 struct routemap_hook_context
*rhc
;
1034 bool exact_match
= false;
1036 const char *condition
;
1037 route_map_event_t event
;
1039 /* Add configuration. */
1040 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1041 value
= yang_dnode_get_string(args
->dnode
, "./comm-list-name");
1043 if (yang_dnode_exists(args
->dnode
, "./comm-list-name-exact-match"))
1044 exact_match
= yang_dnode_get_bool(
1045 args
->dnode
, "./comm-list-name-exact-match");
1048 argstr
= XMALLOC(MTYPE_ROUTE_MAP_COMPILED
,
1049 strlen(value
) + strlen("exact-match") + 2);
1051 snprintf(argstr
, (strlen(value
) + strlen("exact-match") + 2),
1052 "%s exact-match", value
);
1054 argstr
= (char *)value
;
1056 /* Set destroy information. */
1057 rhc
->rhc_mhook
= bgp_route_match_delete
;
1059 condition
= yang_dnode_get_string(args
->dnode
,
1060 "../../frr-route-map:condition");
1061 if (IS_MATCH_COMMUNITY(condition
)) {
1062 rhc
->rhc_rule
= "community";
1063 event
= RMAP_EVENT_CLIST_ADDED
;
1064 rhc
->rhc_event
= RMAP_EVENT_CLIST_DELETED
;
1065 } else if (IS_MATCH_LCOMMUNITY(condition
)) {
1066 rhc
->rhc_rule
= "large-community";
1067 event
= RMAP_EVENT_LLIST_ADDED
;
1068 rhc
->rhc_event
= RMAP_EVENT_LLIST_DELETED
;
1070 rhc
->rhc_rule
= "extcommunity";
1071 event
= RMAP_EVENT_ECLIST_ADDED
;
1072 rhc
->rhc_event
= RMAP_EVENT_ECLIST_DELETED
;
1075 bgp_route_match_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, argstr
, event
,
1076 args
->errmsg
, args
->errmsg_len
);
1078 if (argstr
!= value
)
1079 XFREE(MTYPE_ROUTE_MAP_COMPILED
, argstr
);
1084 * /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:comm-list/comm-list-name
1087 lib_route_map_entry_match_condition_rmap_match_condition_comm_list_comm_list_name_modify(
1088 struct nb_cb_modify_args
*args
)
1090 switch (args
->event
) {
1091 case NB_EV_VALIDATE
:
1102 lib_route_map_entry_match_condition_rmap_match_condition_comm_list_comm_list_name_destroy(
1103 struct nb_cb_destroy_args
*args
)
1105 switch (args
->event
) {
1106 case NB_EV_VALIDATE
:
1111 return lib_route_map_entry_match_destroy(args
);
1119 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:comm-list/comm-list-name-exact-match
1122 lib_route_map_entry_match_condition_rmap_match_condition_comm_list_comm_list_name_exact_match_modify(
1123 struct nb_cb_modify_args
*args
)
1125 switch (args
->event
) {
1126 case NB_EV_VALIDATE
:
1137 lib_route_map_entry_match_condition_rmap_match_condition_comm_list_comm_list_name_exact_match_destroy(
1138 struct nb_cb_destroy_args
*args
)
1140 switch (args
->event
) {
1141 case NB_EV_VALIDATE
:
1146 return lib_route_map_entry_match_destroy(args
);
1153 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:ipv4-address
1156 lib_route_map_entry_match_condition_rmap_match_condition_ipv4_address_modify(
1157 struct nb_cb_modify_args
*args
)
1159 struct routemap_hook_context
*rhc
;
1161 enum rmap_compile_rets ret
;
1163 switch (args
->event
) {
1164 case NB_EV_VALIDATE
:
1169 /* Add configuration. */
1170 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1171 peer
= yang_dnode_get_string(args
->dnode
, NULL
);
1173 /* Set destroy information. */
1174 rhc
->rhc_mhook
= bgp_route_match_delete
;
1175 rhc
->rhc_rule
= "ip next-hop address";
1176 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1178 ret
= bgp_route_match_add(rhc
->rhc_rmi
, rhc
->rhc_rule
,
1179 peer
, RMAP_EVENT_MATCH_ADDED
,
1180 args
->errmsg
, args
->errmsg_len
);
1182 if (ret
!= RMAP_COMPILE_SUCCESS
) {
1183 rhc
->rhc_mhook
= NULL
;
1184 return NB_ERR_INCONSISTENCY
;
1192 lib_route_map_entry_match_condition_rmap_match_condition_ipv4_address_destroy(
1193 struct nb_cb_destroy_args
*args
)
1195 switch (args
->event
) {
1196 case NB_EV_VALIDATE
:
1201 return lib_route_map_entry_match_destroy(args
);
1208 * XPath: /frr-route-map:lib/route-map/entry/match-condition/rmap-match-condition/frr-bgp-route-map:ipv6-address
1211 lib_route_map_entry_match_condition_rmap_match_condition_ipv6_address_modify(
1212 struct nb_cb_modify_args
*args
)
1214 struct routemap_hook_context
*rhc
;
1216 enum rmap_compile_rets ret
;
1218 switch (args
->event
) {
1219 case NB_EV_VALIDATE
:
1224 /* Add configuration. */
1225 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1226 peer
= yang_dnode_get_string(args
->dnode
, NULL
);
1228 /* Set destroy information. */
1229 rhc
->rhc_mhook
= bgp_route_match_delete
;
1230 rhc
->rhc_rule
= "ipv6 next-hop";
1231 rhc
->rhc_event
= RMAP_EVENT_MATCH_DELETED
;
1233 ret
= bgp_route_match_add(rhc
->rhc_rmi
, rhc
->rhc_rule
,
1234 peer
, RMAP_EVENT_MATCH_ADDED
,
1235 args
->errmsg
, args
->errmsg_len
);
1237 if (ret
!= RMAP_COMPILE_SUCCESS
) {
1238 rhc
->rhc_mhook
= NULL
;
1239 return NB_ERR_INCONSISTENCY
;
1247 lib_route_map_entry_match_condition_rmap_match_condition_ipv6_address_destroy(
1248 struct nb_cb_destroy_args
*args
)
1250 switch (args
->event
) {
1251 case NB_EV_VALIDATE
:
1256 return lib_route_map_entry_match_destroy(args
);
1264 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:distance
1266 int lib_route_map_entry_set_action_rmap_set_action_distance_modify(
1267 struct nb_cb_modify_args
*args
)
1269 struct routemap_hook_context
*rhc
;
1273 switch (args
->event
) {
1274 case NB_EV_VALIDATE
:
1279 /* Add configuration. */
1280 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1281 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1283 /* Set destroy information. */
1284 rhc
->rhc_shook
= generic_set_delete
;
1285 rhc
->rhc_rule
= "distance";
1286 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1288 rv
= generic_set_add(rhc
->rhc_rmi
, "distance", type
,
1289 args
->errmsg
, args
->errmsg_len
);
1290 if (rv
!= CMD_SUCCESS
) {
1291 rhc
->rhc_shook
= NULL
;
1292 return NB_ERR_INCONSISTENCY
;
1299 int lib_route_map_entry_set_action_rmap_set_action_distance_destroy(
1300 struct nb_cb_destroy_args
*args
)
1302 switch (args
->event
) {
1303 case NB_EV_VALIDATE
:
1308 return lib_route_map_entry_match_destroy(args
);
1316 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-rt
1319 lib_route_map_entry_set_action_rmap_set_action_extcommunity_rt_modify(
1320 struct nb_cb_modify_args
*args
)
1322 struct routemap_hook_context
*rhc
;
1326 switch (args
->event
) {
1327 case NB_EV_VALIDATE
:
1332 /* Add configuration. */
1333 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1334 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1336 /* Set destroy information. */
1337 rhc
->rhc_shook
= generic_set_delete
;
1338 rhc
->rhc_rule
= "extcommunity rt";
1339 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1341 rv
= generic_set_add(rhc
->rhc_rmi
, "extcommunity rt", type
,
1342 args
->errmsg
, args
->errmsg_len
);
1343 if (rv
!= CMD_SUCCESS
) {
1344 rhc
->rhc_shook
= NULL
;
1345 return NB_ERR_INCONSISTENCY
;
1353 lib_route_map_entry_set_action_rmap_set_action_extcommunity_rt_destroy(
1354 struct nb_cb_destroy_args
*args
)
1356 switch (args
->event
) {
1357 case NB_EV_VALIDATE
:
1362 return lib_route_map_entry_match_destroy(args
);
1370 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-soo
1373 lib_route_map_entry_set_action_rmap_set_action_extcommunity_soo_modify(
1374 struct nb_cb_modify_args
*args
)
1376 struct routemap_hook_context
*rhc
;
1380 switch (args
->event
) {
1381 case NB_EV_VALIDATE
:
1386 /* Add configuration. */
1387 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1388 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1390 /* Set destroy information. */
1391 rhc
->rhc_shook
= generic_set_delete
;
1392 rhc
->rhc_rule
= "extcommunity soo";
1393 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1395 rv
= generic_set_add(rhc
->rhc_rmi
, "extcommunity soo",
1397 args
->errmsg
, args
->errmsg_len
);
1398 if (rv
!= CMD_SUCCESS
) {
1399 rhc
->rhc_shook
= NULL
;
1400 return NB_ERR_INCONSISTENCY
;
1408 lib_route_map_entry_set_action_rmap_set_action_extcommunity_soo_destroy(
1409 struct nb_cb_destroy_args
*args
)
1411 switch (args
->event
) {
1412 case NB_EV_VALIDATE
:
1417 return lib_route_map_entry_match_destroy(args
);
1425 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:ipv4-address
1427 int lib_route_map_entry_set_action_rmap_set_action_ipv4_address_modify(
1428 struct nb_cb_modify_args
*args
)
1430 struct routemap_hook_context
*rhc
;
1432 int rv
= CMD_SUCCESS
;
1434 switch (args
->event
) {
1435 case NB_EV_VALIDATE
:
1440 /* Add configuration. */
1441 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1442 addr
= yang_dnode_get_string(args
->dnode
, NULL
);
1444 rhc
->rhc_shook
= generic_set_delete
;
1445 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1446 rhc
->rhc_rule
= "ipv4 vpn next-hop";
1448 rv
= generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, addr
,
1449 args
->errmsg
, args
->errmsg_len
);
1451 if (rv
!= CMD_SUCCESS
) {
1452 rhc
->rhc_shook
= NULL
;
1453 return NB_ERR_INCONSISTENCY
;
1460 int lib_route_map_entry_set_action_rmap_set_action_ipv4_address_destroy(
1461 struct nb_cb_destroy_args
*args
)
1463 switch (args
->event
) {
1464 case NB_EV_VALIDATE
:
1469 return lib_route_map_entry_set_destroy(args
);
1477 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:ipv4-nexthop
1479 int lib_route_map_entry_set_action_rmap_set_action_ipv4_nexthop_modify(
1480 struct nb_cb_modify_args
*args
)
1482 struct routemap_hook_context
*rhc
;
1486 switch (args
->event
) {
1487 case NB_EV_VALIDATE
:
1492 /* Add configuration. */
1493 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1494 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1496 /* Set destroy information. */
1497 rhc
->rhc_shook
= generic_set_delete
;
1498 rhc
->rhc_rule
= "ip next-hop";
1499 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1501 rv
= generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, type
,
1502 args
->errmsg
, args
->errmsg_len
);
1504 if (rv
!= CMD_SUCCESS
) {
1505 rhc
->rhc_shook
= NULL
;
1506 return NB_ERR_INCONSISTENCY
;
1513 int lib_route_map_entry_set_action_rmap_set_action_ipv4_nexthop_destroy(
1514 struct nb_cb_destroy_args
*args
)
1516 switch (args
->event
) {
1517 case NB_EV_VALIDATE
:
1522 return lib_route_map_entry_set_destroy(args
);
1530 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:ipv6-address
1532 int lib_route_map_entry_set_action_rmap_set_action_ipv6_address_modify(
1533 struct nb_cb_modify_args
*args
)
1535 struct routemap_hook_context
*rhc
;
1537 int rv
= CMD_SUCCESS
;
1538 const char *action
= NULL
;
1539 struct in6_addr i6a
;
1541 action
= yang_dnode_get_string(args
->dnode
,
1542 "../../frr-route-map:action");
1543 switch (args
->event
) {
1544 case NB_EV_VALIDATE
:
1545 if (action
&& IS_SET_IPV6_NH_GLOBAL(action
)) {
1546 yang_dnode_get_ipv6(&i6a
, args
->dnode
, NULL
);
1547 if (IN6_IS_ADDR_UNSPECIFIED(&i6a
)
1548 || IN6_IS_ADDR_LOOPBACK(&i6a
)
1549 || IN6_IS_ADDR_MULTICAST(&i6a
)
1550 || IN6_IS_ADDR_LINKLOCAL(&i6a
))
1551 return NB_ERR_VALIDATION
;
1561 /* Add configuration. */
1562 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1563 addr
= yang_dnode_get_string(args
->dnode
, NULL
);
1565 rhc
->rhc_shook
= generic_set_delete
;
1566 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1568 if (IS_SET_IPV6_NH_GLOBAL(action
))
1569 /* Set destroy information. */
1570 rhc
->rhc_rule
= "ipv6 next-hop global";
1572 rhc
->rhc_rule
= "ipv6 vpn next-hop";
1574 rv
= generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, addr
,
1575 args
->errmsg
, args
->errmsg_len
);
1577 if (rv
!= CMD_SUCCESS
) {
1578 rhc
->rhc_shook
= NULL
;
1579 return NB_ERR_INCONSISTENCY
;
1585 int lib_route_map_entry_set_action_rmap_set_action_ipv6_address_destroy(
1586 struct nb_cb_destroy_args
*args
)
1588 switch (args
->event
) {
1589 case NB_EV_VALIDATE
:
1594 return lib_route_map_entry_set_destroy(args
);
1602 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:preference
1604 int lib_route_map_entry_set_action_rmap_set_action_preference_modify(
1605 struct nb_cb_modify_args
*args
)
1607 struct routemap_hook_context
*rhc
;
1608 int rv
= CMD_SUCCESS
;
1609 const char *action
= NULL
;
1612 switch (args
->event
) {
1613 case NB_EV_VALIDATE
:
1618 /* Add configuration. */
1619 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1620 value
= yang_dnode_get_bool(args
->dnode
, NULL
);
1622 rhc
->rhc_shook
= generic_set_delete
;
1623 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1625 action
= yang_dnode_get_string(args
->dnode
,
1626 "../../frr-route-map:action");
1629 if (IS_SET_IPV6_PEER_ADDR(action
))
1630 /* Set destroy information. */
1631 rhc
->rhc_rule
= "ipv6 next-hop peer-address";
1633 rhc
->rhc_rule
= "ipv6 next-hop prefer-global";
1635 rv
= generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
,
1637 args
->errmsg
, args
->errmsg_len
);
1640 if (rv
!= CMD_SUCCESS
) {
1641 rhc
->rhc_shook
= NULL
;
1642 return NB_ERR_INCONSISTENCY
;
1649 int lib_route_map_entry_set_action_rmap_set_action_preference_destroy(
1650 struct nb_cb_destroy_args
*args
)
1652 switch (args
->event
) {
1653 case NB_EV_VALIDATE
:
1658 return lib_route_map_entry_set_destroy(args
);
1666 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:label-index
1668 int lib_route_map_entry_set_action_rmap_set_action_label_index_modify(
1669 struct nb_cb_modify_args
*args
)
1671 struct routemap_hook_context
*rhc
;
1675 switch (args
->event
) {
1676 case NB_EV_VALIDATE
:
1681 /* Add configuration. */
1682 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1683 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1685 /* Set destroy information. */
1686 rhc
->rhc_shook
= generic_set_delete
;
1687 rhc
->rhc_rule
= "label-index";
1688 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1690 rv
= generic_set_add(rhc
->rhc_rmi
, "label-index", type
,
1691 args
->errmsg
, args
->errmsg_len
);
1692 if (rv
!= CMD_SUCCESS
) {
1693 rhc
->rhc_shook
= NULL
;
1694 return NB_ERR_INCONSISTENCY
;
1701 int lib_route_map_entry_set_action_rmap_set_action_label_index_destroy(
1702 struct nb_cb_destroy_args
*args
)
1704 switch (args
->event
) {
1705 case NB_EV_VALIDATE
:
1710 return lib_route_map_entry_set_destroy(args
);
1718 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:local-pref
1720 int lib_route_map_entry_set_action_rmap_set_action_local_pref_modify(
1721 struct nb_cb_modify_args
*args
)
1723 struct routemap_hook_context
*rhc
;
1727 switch (args
->event
) {
1728 case NB_EV_VALIDATE
:
1733 /* Add configuration. */
1734 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1735 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1737 /* Set destroy information. */
1738 rhc
->rhc_shook
= generic_set_delete
;
1739 rhc
->rhc_rule
= "local-preference";
1740 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1742 rv
= generic_set_add(rhc
->rhc_rmi
, "local-preference",
1744 args
->errmsg
, args
->errmsg_len
);
1745 if (rv
!= CMD_SUCCESS
) {
1746 rhc
->rhc_shook
= NULL
;
1747 return NB_ERR_INCONSISTENCY
;
1754 int lib_route_map_entry_set_action_rmap_set_action_local_pref_destroy(
1755 struct nb_cb_destroy_args
*args
)
1757 switch (args
->event
) {
1758 case NB_EV_VALIDATE
:
1763 return lib_route_map_entry_set_destroy(args
);
1771 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:weight
1773 int lib_route_map_entry_set_action_rmap_set_action_weight_modify(
1774 struct nb_cb_modify_args
*args
)
1776 struct routemap_hook_context
*rhc
;
1780 switch (args
->event
) {
1781 case NB_EV_VALIDATE
:
1786 /* Add configuration. */
1787 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1788 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1790 /* Set destroy information. */
1791 rhc
->rhc_shook
= generic_set_delete
;
1792 rhc
->rhc_rule
= "weight";
1793 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1795 rv
= generic_set_add(rhc
->rhc_rmi
, "weight", type
,
1796 args
->errmsg
, args
->errmsg_len
);
1797 if (rv
!= CMD_SUCCESS
) {
1798 rhc
->rhc_shook
= NULL
;
1799 return NB_ERR_INCONSISTENCY
;
1806 int lib_route_map_entry_set_action_rmap_set_action_weight_destroy(
1807 struct nb_cb_destroy_args
*args
)
1809 switch (args
->event
) {
1810 case NB_EV_VALIDATE
:
1815 return lib_route_map_entry_set_destroy(args
);
1823 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:origin
1825 int lib_route_map_entry_set_action_rmap_set_action_origin_modify(
1826 struct nb_cb_modify_args
*args
)
1828 struct routemap_hook_context
*rhc
;
1832 switch (args
->event
) {
1833 case NB_EV_VALIDATE
:
1838 /* Add configuration. */
1839 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1840 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1842 /* Set destroy information. */
1843 rhc
->rhc_shook
= generic_set_delete
;
1844 rhc
->rhc_rule
= "origin";
1845 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1847 rv
= generic_set_add(rhc
->rhc_rmi
, "origin", type
,
1848 args
->errmsg
, args
->errmsg_len
);
1849 if (rv
!= CMD_SUCCESS
) {
1850 rhc
->rhc_shook
= NULL
;
1851 return NB_ERR_INCONSISTENCY
;
1858 int lib_route_map_entry_set_action_rmap_set_action_origin_destroy(
1859 struct nb_cb_destroy_args
*args
)
1861 switch (args
->event
) {
1862 case NB_EV_VALIDATE
:
1867 return lib_route_map_entry_set_destroy(args
);
1876 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:originator-id
1878 int lib_route_map_entry_set_action_rmap_set_action_originator_id_modify(
1879 struct nb_cb_modify_args
*args
)
1881 struct routemap_hook_context
*rhc
;
1885 switch (args
->event
) {
1886 case NB_EV_VALIDATE
:
1891 /* Add configuration. */
1892 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1893 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1895 /* Set destroy information. */
1896 rhc
->rhc_shook
= generic_set_delete
;
1897 rhc
->rhc_rule
= "originator-id";
1898 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1900 rv
= generic_set_add(rhc
->rhc_rmi
, "originator-id", type
,
1901 args
->errmsg
, args
->errmsg_len
);
1902 if (rv
!= CMD_SUCCESS
) {
1903 rhc
->rhc_shook
= NULL
;
1904 return NB_ERR_INCONSISTENCY
;
1911 int lib_route_map_entry_set_action_rmap_set_action_originator_id_destroy(
1912 struct nb_cb_destroy_args
*args
)
1914 switch (args
->event
) {
1915 case NB_EV_VALIDATE
:
1920 return lib_route_map_entry_set_destroy(args
);
1928 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:table
1930 int lib_route_map_entry_set_action_rmap_set_action_table_modify(
1931 struct nb_cb_modify_args
*args
)
1933 struct routemap_hook_context
*rhc
;
1937 switch (args
->event
) {
1938 case NB_EV_VALIDATE
:
1943 /* Add configuration. */
1944 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1945 type
= yang_dnode_get_string(args
->dnode
, NULL
);
1947 /* Set destroy information. */
1948 rhc
->rhc_shook
= generic_set_delete
;
1949 rhc
->rhc_rule
= "table";
1950 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
1952 rv
= generic_set_add(rhc
->rhc_rmi
, "table", type
,
1953 args
->errmsg
, args
->errmsg_len
);
1954 if (rv
!= CMD_SUCCESS
) {
1955 rhc
->rhc_shook
= NULL
;
1956 return NB_ERR_INCONSISTENCY
;
1963 int lib_route_map_entry_set_action_rmap_set_action_table_destroy(
1964 struct nb_cb_destroy_args
*args
)
1966 switch (args
->event
) {
1967 case NB_EV_VALIDATE
:
1972 return lib_route_map_entry_set_destroy(args
);
1980 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:atomic-aggregate
1983 lib_route_map_entry_set_action_rmap_set_action_atomic_aggregate_create(
1984 struct nb_cb_create_args
*args
)
1986 struct routemap_hook_context
*rhc
;
1989 switch (args
->event
) {
1990 case NB_EV_VALIDATE
:
1995 /* Add configuration. */
1996 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
1998 /* Set destroy information. */
1999 rhc
->rhc_shook
= generic_set_delete
;
2000 rhc
->rhc_rule
= "atomic-aggregate";
2001 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2003 rv
= generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, NULL
,
2004 args
->errmsg
, args
->errmsg_len
);
2005 if (rv
!= CMD_SUCCESS
) {
2006 rhc
->rhc_shook
= NULL
;
2007 return NB_ERR_INCONSISTENCY
;
2015 lib_route_map_entry_set_action_rmap_set_action_atomic_aggregate_destroy(
2016 struct nb_cb_destroy_args
*args
)
2018 switch (args
->event
) {
2019 case NB_EV_VALIDATE
:
2024 return lib_route_map_entry_set_destroy(args
);
2032 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:prepend-as-path
2035 lib_route_map_entry_set_action_rmap_set_action_prepend_as_path_modify(
2036 struct nb_cb_modify_args
*args
)
2038 struct routemap_hook_context
*rhc
;
2042 switch (args
->event
) {
2043 case NB_EV_VALIDATE
:
2048 /* Add configuration. */
2049 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2050 type
= yang_dnode_get_string(args
->dnode
, NULL
);
2052 /* Set destroy information. */
2053 rhc
->rhc_shook
= generic_set_delete
;
2054 rhc
->rhc_rule
= "as-path prepend";
2055 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2057 rv
= generic_set_add(rhc
->rhc_rmi
, "as-path prepend",
2059 args
->errmsg
, args
->errmsg_len
);
2060 if (rv
!= CMD_SUCCESS
) {
2061 rhc
->rhc_shook
= NULL
;
2062 return NB_ERR_INCONSISTENCY
;
2070 lib_route_map_entry_set_action_rmap_set_action_prepend_as_path_destroy(
2071 struct nb_cb_destroy_args
*args
)
2073 switch (args
->event
) {
2074 case NB_EV_VALIDATE
:
2079 return lib_route_map_entry_set_destroy(args
);
2087 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:last-as
2089 int lib_route_map_entry_set_action_rmap_set_action_last_as_modify(
2090 struct nb_cb_modify_args
*args
)
2092 struct routemap_hook_context
*rhc
;
2097 switch (args
->event
) {
2098 case NB_EV_VALIDATE
:
2103 /* Add configuration. */
2104 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2105 value
= yang_dnode_get_string(args
->dnode
, NULL
);
2107 /* Set destroy information. */
2108 rhc
->rhc_shook
= generic_set_delete
;
2109 rhc
->rhc_rule
= "as-path prepend";
2110 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2112 argstr
= XMALLOC(MTYPE_ROUTE_MAP_COMPILED
,
2113 strlen(value
) + strlen("last-as") + 2);
2115 snprintf(argstr
, (strlen(value
) + strlen("last-as") + 2),
2116 "last-as %s", value
);
2118 rv
= generic_set_add(rhc
->rhc_rmi
, "as-path prepend",
2120 args
->errmsg
, args
->errmsg_len
);
2121 if (rv
!= CMD_SUCCESS
) {
2122 rhc
->rhc_shook
= NULL
;
2123 XFREE(MTYPE_ROUTE_MAP_COMPILED
, argstr
);
2124 return NB_ERR_INCONSISTENCY
;
2127 XFREE(MTYPE_ROUTE_MAP_COMPILED
, argstr
);
2133 int lib_route_map_entry_set_action_rmap_set_action_last_as_destroy(
2134 struct nb_cb_destroy_args
*args
)
2136 switch (args
->event
) {
2137 case NB_EV_VALIDATE
:
2142 return lib_route_map_entry_set_destroy(args
);
2150 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:exclude-as-path
2153 lib_route_map_entry_set_action_rmap_set_action_exclude_as_path_modify(
2154 struct nb_cb_modify_args
*args
)
2156 struct routemap_hook_context
*rhc
;
2160 switch (args
->event
) {
2161 case NB_EV_VALIDATE
:
2166 /* Add configuration. */
2167 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2168 type
= yang_dnode_get_string(args
->dnode
, NULL
);
2170 /* Set destroy information. */
2171 rhc
->rhc_shook
= generic_set_delete
;
2172 rhc
->rhc_rule
= "as-path exclude";
2173 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2175 rv
= generic_set_add(rhc
->rhc_rmi
, "as-path exclude",
2177 args
->errmsg
, args
->errmsg_len
);
2178 if (rv
!= CMD_SUCCESS
) {
2179 rhc
->rhc_shook
= NULL
;
2180 return NB_ERR_INCONSISTENCY
;
2188 lib_route_map_entry_set_action_rmap_set_action_exclude_as_path_destroy(
2189 struct nb_cb_destroy_args
*args
)
2191 switch (args
->event
) {
2192 case NB_EV_VALIDATE
:
2197 return lib_route_map_entry_set_destroy(args
);
2205 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:community-none
2207 int lib_route_map_entry_set_action_rmap_set_action_community_none_modify(
2208 struct nb_cb_modify_args
*args
)
2210 struct routemap_hook_context
*rhc
;
2214 switch (args
->event
) {
2215 case NB_EV_VALIDATE
:
2220 /* Add configuration. */
2221 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2222 none
= yang_dnode_get_bool(args
->dnode
, NULL
);
2224 /* Set destroy information. */
2225 rhc
->rhc_shook
= generic_set_delete
;
2226 rhc
->rhc_rule
= "community";
2227 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2230 rv
= generic_set_add(rhc
->rhc_rmi
, "community",
2232 args
->errmsg
, args
->errmsg_len
);
2233 if (rv
!= CMD_SUCCESS
) {
2234 rhc
->rhc_shook
= NULL
;
2235 return NB_ERR_INCONSISTENCY
;
2240 return NB_ERR_INCONSISTENCY
;
2247 lib_route_map_entry_set_action_rmap_set_action_community_none_destroy(
2248 struct nb_cb_destroy_args
*args
)
2250 switch (args
->event
) {
2251 case NB_EV_VALIDATE
:
2256 return lib_route_map_entry_set_destroy(args
);
2264 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:community-string
2267 lib_route_map_entry_set_action_rmap_set_action_community_string_modify(
2268 struct nb_cb_modify_args
*args
)
2270 struct routemap_hook_context
*rhc
;
2274 switch (args
->event
) {
2275 case NB_EV_VALIDATE
:
2280 /* Add configuration. */
2281 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2282 type
= yang_dnode_get_string(args
->dnode
, NULL
);
2284 /* Set destroy information. */
2285 rhc
->rhc_shook
= generic_set_delete
;
2286 rhc
->rhc_rule
= "community";
2287 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2289 rv
= generic_set_add(rhc
->rhc_rmi
, "community", type
,
2290 args
->errmsg
, args
->errmsg_len
);
2291 if (rv
!= CMD_SUCCESS
) {
2292 rhc
->rhc_shook
= NULL
;
2293 return NB_ERR_INCONSISTENCY
;
2301 lib_route_map_entry_set_action_rmap_set_action_community_string_destroy(
2302 struct nb_cb_destroy_args
*args
)
2304 switch (args
->event
) {
2305 case NB_EV_VALIDATE
:
2310 return lib_route_map_entry_set_destroy(args
);
2318 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:large-community-none
2321 lib_route_map_entry_set_action_rmap_set_action_large_community_none_modify(
2322 struct nb_cb_modify_args
*args
)
2324 struct routemap_hook_context
*rhc
;
2328 switch (args
->event
) {
2329 case NB_EV_VALIDATE
:
2334 /* Add configuration. */
2335 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2336 none
= yang_dnode_get_bool(args
->dnode
, NULL
);
2338 /* Set destroy information. */
2339 rhc
->rhc_shook
= generic_set_delete
;
2340 rhc
->rhc_rule
= "large-community";
2341 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2344 rv
= generic_set_add(rhc
->rhc_rmi
,
2347 args
->errmsg
, args
->errmsg_len
);
2348 if (rv
!= CMD_SUCCESS
) {
2349 rhc
->rhc_shook
= NULL
;
2350 return NB_ERR_INCONSISTENCY
;
2355 return NB_ERR_INCONSISTENCY
;
2362 lib_route_map_entry_set_action_rmap_set_action_large_community_none_destroy(
2363 struct nb_cb_destroy_args
*args
)
2365 switch (args
->event
) {
2366 case NB_EV_VALIDATE
:
2371 return lib_route_map_entry_set_destroy(args
);
2379 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:large-community-string
2382 lib_route_map_entry_set_action_rmap_set_action_large_community_string_modify(
2383 struct nb_cb_modify_args
*args
)
2385 struct routemap_hook_context
*rhc
;
2389 switch (args
->event
) {
2390 case NB_EV_VALIDATE
:
2395 /* Add configuration. */
2396 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2397 type
= yang_dnode_get_string(args
->dnode
, NULL
);
2399 /* Set destroy information. */
2400 rhc
->rhc_shook
= generic_set_delete
;
2401 rhc
->rhc_rule
= "large-community";
2402 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2404 rv
= generic_set_add(rhc
->rhc_rmi
, "large-community",
2406 args
->errmsg
, args
->errmsg_len
);
2407 if (rv
!= CMD_SUCCESS
) {
2408 rhc
->rhc_shook
= NULL
;
2409 return NB_ERR_INCONSISTENCY
;
2417 lib_route_map_entry_set_action_rmap_set_action_large_community_string_destroy(
2418 struct nb_cb_destroy_args
*args
)
2420 switch (args
->event
) {
2421 case NB_EV_VALIDATE
:
2426 return lib_route_map_entry_set_destroy(args
);
2434 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:aggregator
2436 void lib_route_map_entry_set_action_rmap_set_action_aggregator_finish(
2437 struct nb_cb_apply_finish_args
*args
)
2439 struct routemap_hook_context
*rhc
;
2444 /* Add configuration. */
2445 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2446 asn
= yang_dnode_get_string(args
->dnode
, "./aggregator-asn");
2447 addr
= yang_dnode_get_string(args
->dnode
, "./aggregator-address");
2449 argstr
= XMALLOC(MTYPE_ROUTE_MAP_COMPILED
,
2450 strlen(asn
) + strlen(addr
) + 2);
2452 snprintf(argstr
, (strlen(asn
) + strlen(addr
) + 2), "%s %s", asn
, addr
);
2454 /* Set destroy information. */
2455 rhc
->rhc_shook
= generic_set_delete
;
2456 rhc
->rhc_rule
= "aggregator as";
2457 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2459 generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, argstr
,
2460 args
->errmsg
, args
->errmsg_len
);
2461 XFREE(MTYPE_ROUTE_MAP_COMPILED
, argstr
);
2465 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:aggregator/aggregator-asn
2468 lib_route_map_entry_set_action_rmap_set_action_aggregator_aggregator_asn_modify(
2469 struct nb_cb_modify_args
*args
)
2471 switch (args
->event
) {
2472 case NB_EV_VALIDATE
:
2483 lib_route_map_entry_set_action_rmap_set_action_aggregator_aggregator_asn_destroy(
2484 struct nb_cb_destroy_args
*args
)
2486 switch (args
->event
) {
2487 case NB_EV_VALIDATE
:
2492 return lib_route_map_entry_set_destroy(args
);
2500 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:aggregator/aggregator-address
2503 lib_route_map_entry_set_action_rmap_set_action_aggregator_aggregator_address_modify(
2504 struct nb_cb_modify_args
*args
)
2506 switch (args
->event
) {
2507 case NB_EV_VALIDATE
:
2518 lib_route_map_entry_set_action_rmap_set_action_aggregator_aggregator_address_destroy(
2519 struct nb_cb_destroy_args
*args
)
2521 switch (args
->event
) {
2522 case NB_EV_VALIDATE
:
2527 return lib_route_map_entry_set_destroy(args
);
2535 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:comm-list-name
2537 int lib_route_map_entry_set_action_rmap_set_action_comm_list_name_modify(
2538 struct nb_cb_modify_args
*args
)
2540 struct routemap_hook_context
*rhc
;
2543 int rv
= CMD_SUCCESS
;
2545 switch (args
->event
) {
2546 case NB_EV_VALIDATE
:
2551 /* Add configuration. */
2552 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2553 value
= yang_dnode_get_string(args
->dnode
, NULL
);
2555 /* Set destroy information. */
2556 rhc
->rhc_shook
= generic_set_delete
;
2558 action
= yang_dnode_get_string(args
->dnode
,
2559 "../../frr-route-map:action");
2560 if (IS_SET_COMM_LIST_DEL(action
))
2561 rhc
->rhc_rule
= "comm-list";
2563 rhc
->rhc_rule
= "large-comm-list";
2565 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2567 rv
= generic_set_add(rhc
->rhc_rmi
, rhc
->rhc_rule
, value
,
2568 args
->errmsg
, args
->errmsg_len
);
2570 if (rv
!= CMD_SUCCESS
) {
2571 rhc
->rhc_shook
= NULL
;
2572 return NB_ERR_INCONSISTENCY
;
2580 lib_route_map_entry_set_action_rmap_set_action_comm_list_name_destroy(
2581 struct nb_cb_destroy_args
*args
)
2583 switch (args
->event
) {
2584 case NB_EV_VALIDATE
:
2589 return lib_route_map_entry_set_destroy(args
);
2597 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-lb
2600 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_finish(
2601 struct nb_cb_apply_finish_args
*args
)
2603 struct routemap_hook_context
*rhc
;
2604 enum ecommunity_lb_type lb_type
;
2605 char str
[VTY_BUFSIZ
];
2608 /* Add configuration. */
2609 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2610 lb_type
= yang_dnode_get_enum(args
->dnode
, "./lb-type");
2612 /* Set destroy information. */
2613 rhc
->rhc_shook
= generic_set_delete
;
2614 rhc
->rhc_rule
= "extcommunity bandwidth";
2615 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2618 case EXPLICIT_BANDWIDTH
:
2619 bandwidth
= yang_dnode_get_uint16(args
->dnode
, "./bandwidth");
2620 snprintf(str
, sizeof(str
), "%d", bandwidth
);
2622 case CUMULATIVE_BANDWIDTH
:
2623 snprintf(str
, sizeof(str
), "%s", "cumulative");
2625 case COMPUTED_BANDWIDTH
:
2626 snprintf(str
, sizeof(str
), "%s", "num-multipaths");
2629 if (yang_dnode_get_bool(args
->dnode
, "./two-octet-as-specific"))
2630 strlcat(str
, " non-transitive", sizeof(str
));
2632 generic_set_add(rhc
->rhc_rmi
,
2633 "extcommunity bandwidth", str
,
2634 args
->errmsg
, args
->errmsg_len
);
2639 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-lb/lb-type
2642 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_lb_type_modify(
2643 struct nb_cb_modify_args
*args
)
2649 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_lb_type_destroy(
2650 struct nb_cb_destroy_args
*args
)
2652 return lib_route_map_entry_set_destroy(args
);
2657 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-lb/bandwidth
2660 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_bandwidth_modify(
2661 struct nb_cb_modify_args
*args
)
2667 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_bandwidth_destroy(
2668 struct nb_cb_destroy_args
*args
)
2670 return lib_route_map_entry_set_destroy(args
);
2675 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-lb/two-octet-as-specific
2678 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_two_octet_as_specific_modify(
2679 struct nb_cb_modify_args
*args
)
2685 lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_two_octet_as_specific_destroy(
2686 struct nb_cb_destroy_args
*args
)
2688 return lib_route_map_entry_set_destroy(args
);
2693 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:evpn-gateway-ip-ipv4
2695 int lib_route_map_entry_set_action_rmap_set_action_evpn_gateway_ip_ipv4_modify(
2696 struct nb_cb_modify_args
*args
)
2698 struct routemap_hook_context
*rhc
;
2702 switch (args
->event
) {
2703 case NB_EV_VALIDATE
:
2708 /* Add configuration. */
2709 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2710 type
= yang_dnode_get_string(args
->dnode
, NULL
);
2712 /* Set destroy information. */
2713 rhc
->rhc_shook
= generic_set_delete
;
2714 rhc
->rhc_rule
= "evpn gateway-ip ipv4";
2715 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2717 rv
= generic_set_add(rhc
->rhc_rmi
, "evpn gateway-ip ipv4", type
,
2718 args
->errmsg
, args
->errmsg_len
);
2719 if (rv
!= CMD_SUCCESS
) {
2720 rhc
->rhc_shook
= NULL
;
2721 return NB_ERR_INCONSISTENCY
;
2728 int lib_route_map_entry_set_action_rmap_set_action_evpn_gateway_ip_ipv4_destroy(
2729 struct nb_cb_destroy_args
*args
)
2731 switch (args
->event
) {
2732 case NB_EV_VALIDATE
:
2737 return lib_route_map_entry_set_destroy(args
);
2745 * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:evpn-gateway-ip-ipv6
2747 int lib_route_map_entry_set_action_rmap_set_action_evpn_gateway_ip_ipv6_modify(
2748 struct nb_cb_modify_args
*args
)
2750 struct routemap_hook_context
*rhc
;
2754 switch (args
->event
) {
2755 case NB_EV_VALIDATE
:
2760 /* Add configuration. */
2761 rhc
= nb_running_get_entry(args
->dnode
, NULL
, true);
2762 type
= yang_dnode_get_string(args
->dnode
, NULL
);
2764 /* Set destroy information. */
2765 rhc
->rhc_shook
= generic_set_delete
;
2766 rhc
->rhc_rule
= "evpn gateway-ip ipv6";
2767 rhc
->rhc_event
= RMAP_EVENT_SET_DELETED
;
2769 rv
= generic_set_add(rhc
->rhc_rmi
, "evpn gateway-ip ipv6", type
,
2770 args
->errmsg
, args
->errmsg_len
);
2771 if (rv
!= CMD_SUCCESS
) {
2772 rhc
->rhc_shook
= NULL
;
2773 return NB_ERR_INCONSISTENCY
;
2780 int lib_route_map_entry_set_action_rmap_set_action_evpn_gateway_ip_ipv6_destroy(
2781 struct nb_cb_destroy_args
*args
)
2783 switch (args
->event
) {
2784 case NB_EV_VALIDATE
:
2789 return lib_route_map_entry_set_destroy(args
);