1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * IS-IS Rout(e)ing protocol - isis_routemap.c
5 * Copyright (C) 2013-2015 Christian Franke <chris@opensourcerouting.org>
24 #include "isis_constants.h"
25 #include "isis_common.h"
26 #include "isis_flags.h"
28 #include "isis_misc.h"
29 #include "isis_adjacency.h"
30 #include "isis_circuit.h"
34 #include "isis_route.h"
35 #include "isis_zebra.h"
36 #include "isis_routemap.h"
38 static enum route_map_cmd_result_t
39 route_match_ip_address(void *rule
, const struct prefix
*prefix
, void *object
)
41 struct access_list
*alist
;
43 alist
= access_list_lookup(AFI_IP
, (char *)rule
);
44 if (access_list_apply(alist
, prefix
) != FILTER_DENY
)
50 static void *route_match_ip_address_compile(const char *arg
)
52 return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED
, arg
);
55 static void route_match_ip_address_free(void *rule
)
57 XFREE(MTYPE_ROUTE_MAP_COMPILED
, rule
);
60 static const struct route_map_rule_cmd route_match_ip_address_cmd
= {
62 route_match_ip_address
,
63 route_match_ip_address_compile
,
64 route_match_ip_address_free
67 /* ------------------------------------------------------------*/
69 static enum route_map_cmd_result_t
70 route_match_ip_address_prefix_list(void *rule
, const struct prefix
*prefix
,
73 struct prefix_list
*plist
;
75 plist
= prefix_list_lookup(AFI_IP
, (char *)rule
);
76 if (prefix_list_apply(plist
, prefix
) != PREFIX_DENY
)
82 static void *route_match_ip_address_prefix_list_compile(const char *arg
)
84 return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED
, arg
);
87 static void route_match_ip_address_prefix_list_free(void *rule
)
89 XFREE(MTYPE_ROUTE_MAP_COMPILED
, rule
);
92 static const struct route_map_rule_cmd
93 route_match_ip_address_prefix_list_cmd
= {
94 "ip address prefix-list",
95 route_match_ip_address_prefix_list
,
96 route_match_ip_address_prefix_list_compile
,
97 route_match_ip_address_prefix_list_free
100 /* ------------------------------------------------------------*/
102 /* `match tag TAG' */
103 /* Match function return 1 if match is success else return zero. */
104 static enum route_map_cmd_result_t
105 route_match_tag(void *rule
, const struct prefix
*p
, void *object
)
108 struct isis_ext_info
*info
;
109 route_tag_t info_tag
;
114 info_tag
= info
->tag
;
115 if (info_tag
== *tag
)
121 /* Route map commands for tag matching. */
122 static const struct route_map_rule_cmd route_match_tag_cmd
= {
125 route_map_rule_tag_compile
,
126 route_map_rule_tag_free
,
129 /* ------------------------------------------------------------*/
131 static enum route_map_cmd_result_t
132 route_match_ipv6_address(void *rule
, const struct prefix
*prefix
, void *object
)
134 struct access_list
*alist
;
136 alist
= access_list_lookup(AFI_IP6
, (char *)rule
);
137 if (access_list_apply(alist
, prefix
) != FILTER_DENY
)
143 static void *route_match_ipv6_address_compile(const char *arg
)
145 return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED
, arg
);
148 static void route_match_ipv6_address_free(void *rule
)
150 XFREE(MTYPE_ROUTE_MAP_COMPILED
, rule
);
153 static const struct route_map_rule_cmd route_match_ipv6_address_cmd
= {
155 route_match_ipv6_address
,
156 route_match_ipv6_address_compile
,
157 route_match_ipv6_address_free
160 /* ------------------------------------------------------------*/
162 static enum route_map_cmd_result_t
163 route_match_ipv6_address_prefix_list(void *rule
, const struct prefix
*prefix
,
166 struct prefix_list
*plist
;
168 plist
= prefix_list_lookup(AFI_IP6
, (char *)rule
);
169 if (prefix_list_apply(plist
, prefix
) != PREFIX_DENY
)
175 static void *route_match_ipv6_address_prefix_list_compile(const char *arg
)
177 return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED
, arg
);
180 static void route_match_ipv6_address_prefix_list_free(void *rule
)
182 XFREE(MTYPE_ROUTE_MAP_COMPILED
, rule
);
185 static const struct route_map_rule_cmd
186 route_match_ipv6_address_prefix_list_cmd
= {
187 "ipv6 address prefix-list",
188 route_match_ipv6_address_prefix_list
,
189 route_match_ipv6_address_prefix_list_compile
,
190 route_match_ipv6_address_prefix_list_free
193 /* ------------------------------------------------------------*/
195 static enum route_map_cmd_result_t
196 route_set_metric(void *rule
, const struct prefix
*prefix
, void *object
)
199 struct isis_ext_info
*info
;
204 info
->metric
= *metric
;
209 static void *route_set_metric_compile(const char *arg
)
211 unsigned long metric
;
215 metric
= strtoul(arg
, &endp
, 10);
216 if (arg
[0] == '\0' || *endp
!= '\0' || metric
> MAX_WIDE_PATH_METRIC
)
219 ret
= XCALLOC(MTYPE_ROUTE_MAP_COMPILED
, sizeof(*ret
));
225 static void route_set_metric_free(void *rule
)
227 XFREE(MTYPE_ROUTE_MAP_COMPILED
, rule
);
230 static const struct route_map_rule_cmd route_set_metric_cmd
= {
233 route_set_metric_compile
,
234 route_set_metric_free
237 void isis_route_map_init(void)
241 route_map_match_ip_address_hook(generic_match_add
);
242 route_map_no_match_ip_address_hook(generic_match_delete
);
244 route_map_match_ip_address_prefix_list_hook(generic_match_add
);
245 route_map_no_match_ip_address_prefix_list_hook(generic_match_delete
);
247 route_map_match_ipv6_address_hook(generic_match_add
);
248 route_map_no_match_ipv6_address_hook(generic_match_delete
);
250 route_map_match_ipv6_address_prefix_list_hook(generic_match_add
);
251 route_map_no_match_ipv6_address_prefix_list_hook(generic_match_delete
);
253 route_map_match_tag_hook(generic_match_add
);
254 route_map_no_match_tag_hook(generic_match_delete
);
256 route_map_set_metric_hook(generic_set_add
);
257 route_map_no_set_metric_hook(generic_set_delete
);
259 route_map_install_match(&route_match_ip_address_cmd
);
260 route_map_install_match(&route_match_ip_address_prefix_list_cmd
);
261 route_map_install_match(&route_match_ipv6_address_cmd
);
262 route_map_install_match(&route_match_ipv6_address_prefix_list_cmd
);
263 route_map_install_match(&route_match_tag_cmd
);
264 route_map_install_set(&route_set_metric_cmd
);