blob: a2b257facdc6bfeffd9cc21720478d6576d2ed27 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
2 * Route map function of ospfd.
3 * Copyright (C) 2000 IP Infusion Inc.
4 *
5 * Written by Toshiaki Takada.
6 *
7 * This file is part of GNU Zebra.
8 *
9 * GNU Zebra is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2, or (at your option) any
12 * later version.
13 *
14 * GNU Zebra is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with GNU Zebra; see the file COPYING. If not, write to the Free
21 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 * 02111-1307, USA.
23 */
24
25#include <zebra.h>
26
27#include "memory.h"
28#include "prefix.h"
29#include "table.h"
30#include "routemap.h"
31#include "command.h"
32#include "log.h"
33#include "plist.h"
34
35#include "ospfd/ospfd.h"
36#include "ospfd/ospf_asbr.h"
37#include "ospfd/ospf_interface.h"
38#include "ospfd/ospf_lsa.h"
39#include "ospfd/ospf_route.h"
40#include "ospfd/ospf_zebra.h"
41
42/* Hook function for updating route_map assignment. */
43void
44ospf_route_map_update (char *name)
45{
46 int type;
47
48 /* If OSPF instatnce does not exist, return right now. */
49 if (!ospf_top)
50 return;
51
52 /* Update route-map */
53 for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
54 {
55 if (ROUTEMAP_NAME (type) && strcmp (ROUTEMAP_NAME (type), name) == 0)
56 {
57 /* Keep old route-map. */
58 struct route_map *old = ROUTEMAP (type);
59
60 /* Update route-map. */
61 ROUTEMAP (type) = route_map_lookup_by_name (ROUTEMAP_NAME (type));
62
63 /* No update for this distribute type. */
64 if (old == NULL && ROUTEMAP (type) == NULL)
65 continue;
66
67 ospf_distribute_list_update (type);
68 }
69 }
70}
71
72void
73ospf_route_map_event (route_map_event_t event, char *name)
74{
75 int type;
76
77 /* If OSPF instatnce does not exist, return right now. */
78 if (!ospf_top)
79 return;
80
81 /* Update route-map. */
82 for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
83 {
84 if (ROUTEMAP_NAME (type) && ROUTEMAP (type) &&
85 !strcmp (ROUTEMAP_NAME (type), name))
86 {
87 ospf_distribute_list_update (type);
88 }
89 }
90}
91
92/* Delete rip route map rule. */
93int
94ospf_route_match_delete (struct vty *vty, struct route_map_index *index,
95 char *command, char *arg)
96{
97 int ret;
98
99 ret = route_map_delete_match (index, command, arg);
100 if (ret)
101 {
102 switch (ret)
103 {
104 case RMAP_RULE_MISSING:
105 vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
106 return CMD_WARNING;
107 break;
108 case RMAP_COMPILE_ERROR:
109 vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
110 return CMD_WARNING;
111 break;
112 }
113 }
114
115 return CMD_SUCCESS;
116}
117
118int
119ospf_route_match_add (struct vty *vty, struct route_map_index *index,
120 char *command, char *arg)
121{
122 int ret;
123
124 ret = route_map_add_match (index, command, arg);
125 if (ret)
126 {
127 switch (ret)
128 {
129 case RMAP_RULE_MISSING:
130 vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
131 return CMD_WARNING;
132 break;
133 case RMAP_COMPILE_ERROR:
134 vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
135 return CMD_WARNING;
136 break;
137 }
138 }
139
140 return CMD_SUCCESS;
141}
142
143int
144ospf_route_set_add (struct vty *vty, struct route_map_index *index,
145 char *command, char *arg)
146{
147 int ret;
148
149 ret = route_map_add_set (index, command, arg);
150 if (ret)
151 {
152 switch (ret)
153 {
154 case RMAP_RULE_MISSING:
155 vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
156 return CMD_WARNING;
157 break;
158 case RMAP_COMPILE_ERROR:
159 vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
160 return CMD_WARNING;
161 break;
162 }
163 }
164
165 return CMD_SUCCESS;
166}
167
168/* Delete rip route map rule. */
169int
170ospf_route_set_delete (struct vty *vty, struct route_map_index *index,
171 char *command, char *arg)
172{
173 int ret;
174
175 ret = route_map_delete_set (index, command, arg);
176 if (ret)
177 {
178 switch (ret)
179 {
180 case RMAP_RULE_MISSING:
181 vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
182 return CMD_WARNING;
183 break;
184 case RMAP_COMPILE_ERROR:
185 vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
186 return CMD_WARNING;
187 break;
188 }
189 }
190
191 return CMD_SUCCESS;
192}
193
194/* `match ip netxthop ' */
195/* Match function return 1 if match is success else return zero. */
196route_map_result_t
197route_match_ip_nexthop (void *rule, struct prefix *prefix,
198 route_map_object_t type, void *object)
199{
200 struct access_list *alist;
201 struct external_info *ei = object;
202 struct prefix_ipv4 p;
203
204 if (type == RMAP_OSPF)
205 {
206 p.family = AF_INET;
207 p.prefix = ei->nexthop;
208 p.prefixlen = IPV4_MAX_BITLEN;
209
210 alist = access_list_lookup (AFI_IP, (char *) rule);
211 if (alist == NULL)
212 return RMAP_NOMATCH;
213
214 return (access_list_apply (alist, &p) == FILTER_DENY ?
215 RMAP_NOMATCH : RMAP_MATCH);
216 }
217 return RMAP_NOMATCH;
218}
219
220/* Route map `ip next-hop' match statement. `arg' should be
221 access-list name. */
222void *
223route_match_ip_nexthop_compile (char *arg)
224{
225 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
226}
227
228/* Free route map's compiled `ip address' value. */
229void
230route_match_ip_nexthop_free (void *rule)
231{
232 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
233}
234
235/* Route map commands for metric matching. */
236struct route_map_rule_cmd route_match_ip_nexthop_cmd =
237{
238 "ip next-hop",
239 route_match_ip_nexthop,
240 route_match_ip_nexthop_compile,
241 route_match_ip_nexthop_free
242};
243
244/* `match ip next-hop prefix-list PREFIX_LIST' */
245
246route_map_result_t
247route_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix,
248 route_map_object_t type, void *object)
249{
250 struct prefix_list *plist;
251 struct external_info *ei = object;
252 struct prefix_ipv4 p;
253
254 if (type == RMAP_OSPF)
255 {
256 p.family = AF_INET;
257 p.prefix = ei->nexthop;
258 p.prefixlen = IPV4_MAX_BITLEN;
259
260 plist = prefix_list_lookup (AFI_IP, (char *) rule);
261 if (plist == NULL)
262 return RMAP_NOMATCH;
263
264 return (prefix_list_apply (plist, &p) == PREFIX_DENY ?
265 RMAP_NOMATCH : RMAP_MATCH);
266 }
267 return RMAP_NOMATCH;
268}
269
270void *
271route_match_ip_next_hop_prefix_list_compile (char *arg)
272{
273 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
274}
275
276void
277route_match_ip_next_hop_prefix_list_free (void *rule)
278{
279 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
280}
281
282struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd =
283{
284 "ip next-hop prefix-list",
285 route_match_ip_next_hop_prefix_list,
286 route_match_ip_next_hop_prefix_list_compile,
287 route_match_ip_next_hop_prefix_list_free
288};
289
290/* `match ip address IP_ACCESS_LIST' */
291/* Match function should return 1 if match is success else return
292 zero. */
293route_map_result_t
294route_match_ip_address (void *rule, struct prefix *prefix,
295 route_map_object_t type, void *object)
296{
297 struct access_list *alist;
298 /* struct prefix_ipv4 match; */
299
300 if (type == RMAP_OSPF)
301 {
302 alist = access_list_lookup (AFI_IP, (char *) rule);
303 if (alist == NULL)
304 return RMAP_NOMATCH;
305
306 return (access_list_apply (alist, prefix) == FILTER_DENY ?
307 RMAP_NOMATCH : RMAP_MATCH);
308 }
309 return RMAP_NOMATCH;
310}
311
312/* Route map `ip address' match statement. `arg' should be
313 access-list name. */
314void *
315route_match_ip_address_compile (char *arg)
316{
317 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
318}
319
320/* Free route map's compiled `ip address' value. */
321void
322route_match_ip_address_free (void *rule)
323{
324 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
325}
326
327/* Route map commands for ip address matching. */
328struct route_map_rule_cmd route_match_ip_address_cmd =
329{
330 "ip address",
331 route_match_ip_address,
332 route_match_ip_address_compile,
333 route_match_ip_address_free
334};
335
336/* `match ip address prefix-list PREFIX_LIST' */
337route_map_result_t
338route_match_ip_address_prefix_list (void *rule, struct prefix *prefix,
339 route_map_object_t type, void *object)
340{
341 struct prefix_list *plist;
342
343 if (type == RMAP_OSPF)
344 {
345 plist = prefix_list_lookup (AFI_IP, (char *) rule);
346 if (plist == NULL)
347 return RMAP_NOMATCH;
348
349 return (prefix_list_apply (plist, prefix) == PREFIX_DENY ?
350 RMAP_NOMATCH : RMAP_MATCH);
351 }
352 return RMAP_NOMATCH;
353}
354
355void *
356route_match_ip_address_prefix_list_compile (char *arg)
357{
358 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
359}
360
361void
362route_match_ip_address_prefix_list_free (void *rule)
363{
364 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
365}
366
367struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd =
368{
369 "ip address prefix-list",
370 route_match_ip_address_prefix_list,
371 route_match_ip_address_prefix_list_compile,
372 route_match_ip_address_prefix_list_free
373};
374
375/* `match interface IFNAME' */
376/* Match function should return 1 if match is success else return
377 zero. */
378route_map_result_t
379route_match_interface (void *rule, struct prefix *prefix,
380 route_map_object_t type, void *object)
381{
382 struct interface *ifp;
383 struct external_info *ei;
384
385 if (type == RMAP_OSPF)
386 {
387 ei = object;
388 ifp = if_lookup_by_name ((char *)rule);
389
390 if (ifp == NULL || ifp->ifindex != ei->ifindex)
391 return RMAP_NOMATCH;
392
393 return RMAP_MATCH;
394 }
395 return RMAP_NOMATCH;
396}
397
398/* Route map `interface' match statement. `arg' should be
399 interface name. */
400void *
401route_match_interface_compile (char *arg)
402{
403 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
404}
405
406/* Free route map's compiled `interface' value. */
407void
408route_match_interface_free (void *rule)
409{
410 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
411}
412
413/* Route map commands for ip address matching. */
414struct route_map_rule_cmd route_match_interface_cmd =
415{
416 "interface",
417 route_match_interface,
418 route_match_interface_compile,
419 route_match_interface_free
420};
421
422/* `set metric METRIC' */
423/* Set metric to attribute. */
424route_map_result_t
425route_set_metric (void *rule, struct prefix *prefix,
426 route_map_object_t type, void *object)
427{
428 u_int32_t *metric;
429 struct external_info *ei;
430
431 if (type == RMAP_OSPF)
432 {
433 /* Fetch routemap's rule information. */
434 metric = rule;
435 ei = object;
436
437 /* Set metric out value. */
438 ei->route_map_set.metric = *metric;
439 }
440 return RMAP_OKAY;
441}
442
443/* set metric compilation. */
444void *
445route_set_metric_compile (char *arg)
446{
447 u_int32_t *metric;
448
449 metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
450 *metric = atoi (arg);
451
452 if (*metric >= 0)
453 return metric;
454
455 XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
456 return NULL;
457}
458
459/* Free route map's compiled `set metric' value. */
460void
461route_set_metric_free (void *rule)
462{
463 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
464}
465
466/* Set metric rule structure. */
467struct route_map_rule_cmd route_set_metric_cmd =
468{
469 "metric",
470 route_set_metric,
471 route_set_metric_compile,
472 route_set_metric_free,
473};
474
475/* `set metric-type TYPE' */
476/* Set metric-type to attribute. */
477route_map_result_t
478route_set_metric_type (void *rule, struct prefix *prefix,
479 route_map_object_t type, void *object)
480{
481 u_int32_t *metric_type;
482 struct external_info *ei;
483
484 if (type == RMAP_OSPF)
485 {
486 /* Fetch routemap's rule information. */
487 metric_type = rule;
488 ei = object;
489
490 /* Set metric out value. */
491 ei->route_map_set.metric_type = *metric_type;
492 }
493 return RMAP_OKAY;
494}
495
496/* set metric-type compilation. */
497void *
498route_set_metric_type_compile (char *arg)
499{
500 u_int32_t *metric_type;
501
502 metric_type = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
503 if (strcmp (arg, "type-1") == 0)
504 *metric_type = EXTERNAL_METRIC_TYPE_1;
505 else if (strcmp (arg, "type-2") == 0)
506 *metric_type = EXTERNAL_METRIC_TYPE_2;
507
508 if (*metric_type == EXTERNAL_METRIC_TYPE_1 ||
509 *metric_type == EXTERNAL_METRIC_TYPE_2)
510 return metric_type;
511
512 XFREE (MTYPE_ROUTE_MAP_COMPILED, metric_type);
513 return NULL;
514}
515
516/* Free route map's compiled `set metric-type' value. */
517void
518route_set_metric_type_free (void *rule)
519{
520 XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
521}
522
523/* Set metric rule structure. */
524struct route_map_rule_cmd route_set_metric_type_cmd =
525{
526 "metric-type",
527 route_set_metric_type,
528 route_set_metric_type_compile,
529 route_set_metric_type_free,
530};
531
532DEFUN (match_ip_nexthop,
533 match_ip_nexthop_cmd,
534 "match ip next-hop (<1-199>|<1300-2699>|WORD)",
535 MATCH_STR
536 IP_STR
537 "Match next-hop address of route\n"
538 "IP access-list number\n"
539 "IP access-list number (expanded range)\n"
540 "IP access-list name\n")
541{
542 return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
543}
544
545DEFUN (no_match_ip_nexthop,
546 no_match_ip_nexthop_cmd,
547 "no match ip next-hop",
548 NO_STR
549 MATCH_STR
550 IP_STR
551 "Match next-hop address of route\n")
552{
553 if (argc == 0)
554 return ospf_route_match_delete (vty, vty->index, "ip next-hop", NULL);
555
556 return ospf_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
557}
558
559ALIAS (no_match_ip_nexthop,
560 no_match_ip_nexthop_val_cmd,
561 "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
562 NO_STR
563 MATCH_STR
564 IP_STR
565 "Match next-hop address of route\n"
566 "IP access-list number\n"
567 "IP access-list number (expanded range)\n"
568 "IP access-list name\n")
569
570DEFUN (match_ip_next_hop_prefix_list,
571 match_ip_next_hop_prefix_list_cmd,
572 "match ip next-hop prefix-list WORD",
573 MATCH_STR
574 IP_STR
575 "Match next-hop address of route\n"
576 "Match entries of prefix-lists\n"
577 "IP prefix-list name\n")
578{
579 return ospf_route_match_add (vty, vty->index, "ip next-hop prefix-list",
580 argv[0]);
581}
582
583DEFUN (no_match_ip_next_hop_prefix_list,
584 no_match_ip_next_hop_prefix_list_cmd,
585 "no match ip next-hop prefix-list",
586 NO_STR
587 MATCH_STR
588 IP_STR
589 "Match next-hop address of route\n"
590 "Match entries of prefix-lists\n")
591{
592 if (argc == 0)
593 return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
594 NULL);
595 return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
596 argv[0]);
597}
598
599ALIAS (no_match_ip_next_hop_prefix_list,
600 no_match_ip_next_hop_prefix_list_val_cmd,
601 "no match ip next-hop prefix-list WORD",
602 NO_STR
603 MATCH_STR
604 IP_STR
605 "Match next-hop address of route\n"
606 "Match entries of prefix-lists\n"
607 "IP prefix-list name\n")
608
609DEFUN (match_ip_address,
610 match_ip_address_cmd,
611 "match ip address (<1-199>|<1300-2699>|WORD)",
612 MATCH_STR
613 IP_STR
614 "Match address of route\n"
615 "IP access-list number\n"
616 "IP access-list number (expanded range)\n"
617 "IP access-list name\n")
618{
619 return ospf_route_match_add (vty, vty->index, "ip address", argv[0]);
620}
621
622DEFUN (no_match_ip_address,
623 no_match_ip_address_cmd,
624 "no match ip address",
625 NO_STR
626 MATCH_STR
627 IP_STR
628 "Match address of route\n")
629{
630 if (argc == 0)
631 return ospf_route_match_delete (vty, vty->index, "ip address", NULL);
632
633 return ospf_route_match_delete (vty, vty->index, "ip address", argv[0]);
634}
635
636ALIAS (no_match_ip_address,
637 no_match_ip_address_val_cmd,
638 "no match ip address (<1-199>|<1300-2699>|WORD)",
639 NO_STR
640 MATCH_STR
641 IP_STR
642 "Match address of route\n"
643 "IP access-list number\n"
644 "IP access-list number (expanded range)\n"
645 "IP access-list name\n")
646
647DEFUN (match_ip_address_prefix_list,
648 match_ip_address_prefix_list_cmd,
649 "match ip address prefix-list WORD",
650 MATCH_STR
651 IP_STR
652 "Match address of route\n"
653 "Match entries of prefix-lists\n"
654 "IP prefix-list name\n")
655{
656 return ospf_route_match_add (vty, vty->index, "ip address prefix-list",
657 argv[0]);
658}
659
660DEFUN (no_match_ip_address_prefix_list,
661 no_match_ip_address_prefix_list_cmd,
662 "no match ip address prefix-list",
663 NO_STR
664 MATCH_STR
665 IP_STR
666 "Match address of route\n"
667 "Match entries of prefix-lists\n")
668{
669 if (argc == 0)
670 return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
671 NULL);
672 return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
673 argv[0]);
674}
675
676ALIAS (no_match_ip_address_prefix_list,
677 no_match_ip_address_prefix_list_val_cmd,
678 "no match ip address prefix-list WORD",
679 NO_STR
680 MATCH_STR
681 IP_STR
682 "Match address of route\n"
683 "Match entries of prefix-lists\n"
684 "IP prefix-list name\n")
685
686DEFUN (match_interface,
687 match_interface_cmd,
688 "match interface WORD",
689 MATCH_STR
690 "Match first hop interface of route\n"
691 "Interface name\n")
692{
693 return ospf_route_match_add (vty, vty->index, "interface", argv[0]);
694}
695
696DEFUN (no_match_interface,
697 no_match_interface_cmd,
698 "no match interface",
699 NO_STR
700 MATCH_STR
701 "Match first hop interface of route\n")
702{
703 if (argc == 0)
704 return ospf_route_match_delete (vty, vty->index, "interface", NULL);
705
706 return ospf_route_match_delete (vty, vty->index, "interface", argv[0]);
707}
708
709ALIAS (no_match_interface,
710 no_match_interface_val_cmd,
711 "no match interface WORD",
712 NO_STR
713 MATCH_STR
714 "Match first hop interface of route\n"
715 "Interface name\n")
716
717DEFUN (set_metric,
718 set_metric_cmd,
719 "set metric <0-4294967295>",
720 SET_STR
721 "Metric value for destination routing protocol\n"
722 "Metric value\n")
723{
724 return ospf_route_set_add (vty, vty->index, "metric", argv[0]);
725}
726
727DEFUN (no_set_metric,
728 no_set_metric_cmd,
729 "no set metric",
730 NO_STR
731 SET_STR
732 "Metric value for destination routing protocol\n")
733{
734 if (argc == 0)
735 return ospf_route_set_delete (vty, vty->index, "metric", NULL);
736
737 return ospf_route_set_delete (vty, vty->index, "metric", argv[0]);
738}
739
740ALIAS (no_set_metric,
741 no_set_metric_val_cmd,
742 "no set metric <0-4294967295>",
743 NO_STR
744 SET_STR
745 "Metric value for destination routing protocol\n"
746 "Metric value\n")
747
748DEFUN (set_metric_type,
749 set_metric_type_cmd,
750 "set metric-type (type-1|type-2)",
751 SET_STR
752 "Type of metric for destination routing protocol\n"
753 "OSPF external type 1 metric\n"
754 "OSPF external type 2 metric\n")
755{
756 if (strcmp (argv[0], "1") == 0)
757 return ospf_route_set_add (vty, vty->index, "metric-type", "type-1");
758 if (strcmp (argv[0], "2") == 0)
759 return ospf_route_set_add (vty, vty->index, "metric-type", "type-2");
760
761 return ospf_route_set_add (vty, vty->index, "metric-type", argv[0]);
762}
763
764DEFUN (no_set_metric_type,
765 no_set_metric_type_cmd,
766 "no set metric-type",
767 NO_STR
768 SET_STR
769 "Type of metric for destination routing protocol\n")
770{
771 if (argc == 0)
772 return ospf_route_set_delete (vty, vty->index, "metric-type", NULL);
773
774 return ospf_route_set_delete (vty, vty->index, "metric-type", argv[0]);
775}
776
777ALIAS (no_set_metric_type,
778 no_set_metric_type_val_cmd,
779 "no set metric-type (type-1|type-2)",
780 NO_STR
781 SET_STR
782 "Type of metric for destination routing protocol\n"
783 "OSPF external type 1 metric\n"
784 "OSPF external type 2 metric\n")
785
786/* Route-map init */
787void
788ospf_route_map_init (void)
789{
790 route_map_init ();
791 route_map_init_vty ();
792
793 route_map_add_hook (ospf_route_map_update);
794 route_map_delete_hook (ospf_route_map_update);
795 route_map_event_hook (ospf_route_map_event);
796
797 route_map_install_match (&route_match_ip_nexthop_cmd);
798 route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
799 route_map_install_match (&route_match_ip_address_cmd);
800 route_map_install_match (&route_match_ip_address_prefix_list_cmd);
801 route_map_install_match (&route_match_interface_cmd);
802
803 route_map_install_set (&route_set_metric_cmd);
804 route_map_install_set (&route_set_metric_type_cmd);
805
806 install_element (RMAP_NODE, &match_ip_nexthop_cmd);
807 install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
808 install_element (RMAP_NODE, &no_match_ip_nexthop_val_cmd);
809 install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
810 install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
811 install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
812 install_element (RMAP_NODE, &match_ip_address_cmd);
813 install_element (RMAP_NODE, &no_match_ip_address_cmd);
814 install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
815 install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
816 install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
817 install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
818 install_element (RMAP_NODE, &match_interface_cmd);
819 install_element (RMAP_NODE, &no_match_interface_cmd);
820 install_element (RMAP_NODE, &no_match_interface_val_cmd);
821
822 install_element (RMAP_NODE, &set_metric_cmd);
823 install_element (RMAP_NODE, &no_set_metric_cmd);
824 install_element (RMAP_NODE, &no_set_metric_val_cmd);
825 install_element (RMAP_NODE, &set_metric_type_cmd);
826 install_element (RMAP_NODE, &no_set_metric_type_cmd);
827 install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
828}