3 * Copyright (C) 1999 Yasuhiro Ohara
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
35 #include "ospf6_route.h"
36 #include "ospf6_prefix.h"
37 #include "ospf6_lsa.h"
38 #include "ospf6_asbr.h"
41 ospf6_routemap_rule_match_address_prefixlist (void *rule
,
42 struct prefix
*prefix
,
43 route_map_object_t type
,
46 struct prefix_list
*plist
;
48 if (type
!= RMAP_OSPF6
)
51 plist
= prefix_list_lookup (AFI_IP6
, (char *) rule
);
56 return (prefix_list_apply (plist
, prefix
) == PREFIX_DENY
?
57 RMAP_NOMATCH
: RMAP_MATCH
);
61 ospf6_routemap_rule_match_address_prefixlist_compile (char *arg
)
63 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
67 ospf6_routemap_rule_match_address_prefixlist_free (void *rule
)
69 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
72 struct route_map_rule_cmd
73 ospf6_routemap_rule_match_address_prefixlist_cmd
=
75 "ipv6 address prefix-list",
76 ospf6_routemap_rule_match_address_prefixlist
,
77 ospf6_routemap_rule_match_address_prefixlist_compile
,
78 ospf6_routemap_rule_match_address_prefixlist_free
,
82 ospf6_routemap_rule_set_metric_type (void *rule
, struct prefix
*prefix
,
83 route_map_object_t type
, void *object
)
85 char *metric_type
= rule
;
86 struct ospf6_external_info
*info
= object
;
88 if (type
!= RMAP_OSPF6
)
91 if (strcmp (metric_type
, "type-2") == 0)
92 info
->metric_type
= 2;
94 info
->metric_type
= 1;
100 ospf6_routemap_rule_set_metric_type_compile (char *arg
)
102 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
106 ospf6_routemap_rule_set_metric_type_free (void *rule
)
108 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
111 struct route_map_rule_cmd
112 ospf6_routemap_rule_set_metric_type_cmd
=
115 ospf6_routemap_rule_set_metric_type
,
116 ospf6_routemap_rule_set_metric_type_compile
,
117 ospf6_routemap_rule_set_metric_type_free
,
121 ospf6_routemap_rule_set_metric (void *rule
, struct prefix
*prefix
,
122 route_map_object_t type
, void *object
)
125 struct ospf6_external_info
*info
= object
;
127 if (type
!= RMAP_OSPF6
)
130 info
->metric
= atoi (metric
);
135 ospf6_routemap_rule_set_metric_compile (char *arg
)
137 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
141 ospf6_routemap_rule_set_metric_free (void *rule
)
143 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
146 struct route_map_rule_cmd
147 ospf6_routemap_rule_set_metric_cmd
=
150 ospf6_routemap_rule_set_metric
,
151 ospf6_routemap_rule_set_metric_compile
,
152 ospf6_routemap_rule_set_metric_free
,
156 ospf6_routemap_rule_set_forwarding (void *rule
, struct prefix
*prefix
,
157 route_map_object_t type
, void *object
)
159 char *forwarding
= rule
;
160 struct ospf6_external_info
*info
= object
;
162 if (type
!= RMAP_OSPF6
)
165 if (inet_pton (AF_INET6
, forwarding
, &info
->forwarding
) != 1)
167 memset (&info
->forwarding
, 0, sizeof (struct in6_addr
));
175 ospf6_routemap_rule_set_forwarding_compile (char *arg
)
177 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
181 ospf6_routemap_rule_set_forwarding_free (void *rule
)
183 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
186 struct route_map_rule_cmd
187 ospf6_routemap_rule_set_forwarding_cmd
=
189 "forwarding-address",
190 ospf6_routemap_rule_set_forwarding
,
191 ospf6_routemap_rule_set_forwarding_compile
,
192 ospf6_routemap_rule_set_forwarding_free
,
196 route_map_command_status (struct vty
*vty
, int ret
)
203 case RMAP_RULE_MISSING
:
204 vty_out (vty
, "Can't find rule.%s", VTY_NEWLINE
);
206 case RMAP_COMPILE_ERROR
:
207 vty_out (vty
, "Argument is malformed.%s", VTY_NEWLINE
);
210 vty_out (vty
, "route-map add set failed.%s", VTY_NEWLINE
);
216 /* add "match address" */
217 DEFUN (ospf6_routemap_match_address_prefixlist
,
218 ospf6_routemap_match_address_prefixlist_cmd
,
219 "match ipv6 address prefix-list WORD",
222 "Match address of route\n"
223 "Match entries of prefix-lists\n"
224 "IPv6 prefix-list name\n")
226 int ret
= route_map_add_match ((struct route_map_index
*) vty
->index
,
227 "ipv6 address prefix-list", argv
[0]);
228 return route_map_command_status (vty
, ret
);
231 /* delete "match address" */
232 DEFUN (ospf6_routemap_no_match_address_prefixlist
,
233 ospf6_routemap_no_match_address_prefixlist_cmd
,
234 "no match ipv6 address prefix-list WORD",
238 "Match address of route\n"
239 "Match entries of prefix-lists\n"
240 "IPv6 prefix-list name\n")
242 int ret
= route_map_delete_match ((struct route_map_index
*) vty
->index
,
243 "ipv6 address prefix-list", argv
[0]);
244 return route_map_command_status (vty
, ret
);
247 /* add "set metric-type" */
248 DEFUN (ospf6_routemap_set_metric_type
,
249 ospf6_routemap_set_metric_type_cmd
,
250 "set metric-type (type-1|type-2)",
253 "OSPF6 external type 1 metric\n"
254 "OSPF6 external type 2 metric\n")
256 int ret
= route_map_add_set ((struct route_map_index
*) vty
->index
,
257 "metric-type", argv
[0]);
258 return route_map_command_status (vty
, ret
);
261 /* delete "set metric-type" */
262 DEFUN (ospf6_routemap_no_set_metric_type
,
263 ospf6_routemap_no_set_metric_type_cmd
,
264 "no set metric-type (type-1|type-2)",
268 "OSPF6 external type 1 metric\n"
269 "OSPF6 external type 2 metric\n")
271 int ret
= route_map_delete_set ((struct route_map_index
*) vty
->index
,
272 "metric-type", argv
[0]);
273 return route_map_command_status (vty
, ret
);
276 /* add "set metric" */
279 "set metric <0-4294967295>",
284 int ret
= route_map_add_set ((struct route_map_index
*) vty
->index
,
286 return route_map_command_status (vty
, ret
);
289 /* delete "set metric" */
290 DEFUN (no_set_metric
,
292 "no set metric <0-4294967295>",
298 int ret
= route_map_delete_set ((struct route_map_index
*) vty
->index
,
300 return route_map_command_status (vty
, ret
);
303 /* add "set forwarding-address" */
304 DEFUN (ospf6_routemap_set_forwarding
,
305 ospf6_routemap_set_forwarding_cmd
,
306 "set forwarding-address X:X::X:X",
308 "Forwarding Address\n"
311 int ret
= route_map_add_set ((struct route_map_index
*) vty
->index
,
312 "forwarding-address", argv
[0]);
313 return route_map_command_status (vty
, ret
);
316 /* delete "set forwarding-address" */
317 DEFUN (ospf6_routemap_no_set_forwarding
,
318 ospf6_routemap_no_set_forwarding_cmd
,
319 "no set forwarding-address X:X::X:X",
322 "Forwarding Address\n"
325 int ret
= route_map_delete_set ((struct route_map_index
*) vty
->index
,
326 "forwarding-address", argv
[0]);
327 return route_map_command_status (vty
, ret
);
331 ospf6_routemap_init ()
334 route_map_init_vty ();
335 route_map_add_hook (ospf6_asbr_routemap_update
);
336 route_map_delete_hook (ospf6_asbr_routemap_update
);
338 route_map_install_match (&ospf6_routemap_rule_match_address_prefixlist_cmd
);
339 route_map_install_set (&ospf6_routemap_rule_set_metric_type_cmd
);
340 route_map_install_set (&ospf6_routemap_rule_set_metric_cmd
);
341 route_map_install_set (&ospf6_routemap_rule_set_forwarding_cmd
);
343 /* Match address prefix-list */
344 install_element (RMAP_NODE
, &ospf6_routemap_match_address_prefixlist_cmd
);
345 install_element (RMAP_NODE
, &ospf6_routemap_no_match_address_prefixlist_cmd
);
347 /* ASE Metric Type (e.g. Type-1/Type-2) */
348 install_element (RMAP_NODE
, &ospf6_routemap_set_metric_type_cmd
);
349 install_element (RMAP_NODE
, &ospf6_routemap_no_set_metric_type_cmd
);
352 install_element (RMAP_NODE
, &set_metric_cmd
);
353 install_element (RMAP_NODE
, &no_set_metric_cmd
);
356 install_element (RMAP_NODE
, &ospf6_routemap_set_forwarding_cmd
);
357 install_element (RMAP_NODE
, &ospf6_routemap_no_set_forwarding_cmd
);