2 * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
3 * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
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 Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
31 #include "sockunion.h" /* for inet_aton () */
34 #include "ripd/ripd.h"
36 struct rip_metric_modifier
48 /* Add rip route map rule. */
50 rip_route_match_add (struct vty
*vty
, struct route_map_index
*index
,
51 const char *command
, const char *arg
)
55 ret
= route_map_add_match (index
, command
, arg
);
60 case RMAP_RULE_MISSING
:
61 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
63 case RMAP_COMPILE_ERROR
:
64 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
71 /* Delete rip route map rule. */
73 rip_route_match_delete (struct vty
*vty
, struct route_map_index
*index
,
74 const char *command
, const char *arg
)
78 ret
= route_map_delete_match (index
, command
, arg
);
83 case RMAP_RULE_MISSING
:
84 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
86 case RMAP_COMPILE_ERROR
:
87 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
94 /* Add rip route map rule. */
96 rip_route_set_add (struct vty
*vty
, struct route_map_index
*index
,
97 const char *command
, const char *arg
)
101 ret
= route_map_add_set (index
, command
, arg
);
106 case RMAP_RULE_MISSING
:
107 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
109 case RMAP_COMPILE_ERROR
:
110 /* rip, ripng and other protocols share the set metric command
111 but only values from 0 to 16 are valid for rip and ripng
112 if metric is out of range for rip and ripng, it is not for
113 other protocols. Do not return an error */
114 if (strcmp(command
, "metric")) {
115 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
123 /* Delete rip route map rule. */
125 rip_route_set_delete (struct vty
*vty
, struct route_map_index
*index
,
126 const char *command
, const char *arg
)
130 ret
= route_map_delete_set (index
, command
, arg
);
135 case RMAP_RULE_MISSING
:
136 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
138 case RMAP_COMPILE_ERROR
:
139 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
146 /* Hook function for updating route_map assignment. */
149 rip_route_map_update (const char *notused
)
155 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
157 if (rip
->route_map
[i
].name
)
158 rip
->route_map
[i
].map
=
159 route_map_lookup_by_name (rip
->route_map
[i
].name
);
164 /* `match metric METRIC' */
165 /* Match function return 1 if match is success else return zero. */
166 static route_map_result_t
167 route_match_metric (void *rule
, struct prefix
*prefix
,
168 route_map_object_t type
, void *object
)
172 struct rip_info
*rinfo
;
174 if (type
== RMAP_RIP
)
179 /* If external metric is available, the route-map should
180 work on this one (for redistribute purpose) */
181 check
= (rinfo
->external_metric
) ? rinfo
->external_metric
:
183 if (check
== *metric
)
191 /* Route map `match metric' match statement. `arg' is METRIC value */
193 route_match_metric_compile (const char *arg
)
197 metric
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_int32_t
));
198 *metric
= atoi (arg
);
203 XFREE (MTYPE_ROUTE_MAP_COMPILED
, metric
);
207 /* Free route map's compiled `match metric' value. */
209 route_match_metric_free (void *rule
)
211 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
214 /* Route map commands for metric matching. */
215 struct route_map_rule_cmd route_match_metric_cmd
=
219 route_match_metric_compile
,
220 route_match_metric_free
223 /* `match interface IFNAME' */
224 /* Match function return 1 if match is success else return zero. */
225 static route_map_result_t
226 route_match_interface (void *rule
, struct prefix
*prefix
,
227 route_map_object_t type
, void *object
)
229 struct rip_info
*rinfo
;
230 struct interface
*ifp
;
233 if (type
== RMAP_RIP
)
236 ifp
= if_lookup_by_name(ifname
);
243 if (rinfo
->ifindex_out
== ifp
->ifindex
|| rinfo
->ifindex
== ifp
->ifindex
)
251 /* Route map `match interface' match statement. `arg' is IFNAME value */
252 /* XXX I don`t know if I need to check does interface exist? */
254 route_match_interface_compile (const char *arg
)
256 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
259 /* Free route map's compiled `match interface' value. */
261 route_match_interface_free (void *rule
)
263 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
266 /* Route map commands for interface matching. */
267 struct route_map_rule_cmd route_match_interface_cmd
=
270 route_match_interface
,
271 route_match_interface_compile
,
272 route_match_interface_free
275 /* `match ip next-hop IP_ACCESS_LIST' */
277 /* Match function return 1 if match is success else return zero. */
278 static route_map_result_t
279 route_match_ip_next_hop (void *rule
, struct prefix
*prefix
,
280 route_map_object_t type
, void *object
)
282 struct access_list
*alist
;
283 struct rip_info
*rinfo
;
284 struct prefix_ipv4 p
;
286 if (type
== RMAP_RIP
)
290 p
.prefix
= (rinfo
->nexthop
.s_addr
) ? rinfo
->nexthop
: rinfo
->from
;
291 p
.prefixlen
= IPV4_MAX_BITLEN
;
293 alist
= access_list_lookup (AFI_IP
, (char *) rule
);
297 return (access_list_apply (alist
, &p
) == FILTER_DENY
?
298 RMAP_NOMATCH
: RMAP_MATCH
);
303 /* Route map `ip next-hop' match statement. `arg' should be
306 route_match_ip_next_hop_compile (const char *arg
)
308 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
311 /* Free route map's compiled `. */
313 route_match_ip_next_hop_free (void *rule
)
315 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
318 /* Route map commands for ip next-hop matching. */
319 static struct route_map_rule_cmd route_match_ip_next_hop_cmd
=
322 route_match_ip_next_hop
,
323 route_match_ip_next_hop_compile
,
324 route_match_ip_next_hop_free
327 /* `match ip next-hop prefix-list PREFIX_LIST' */
329 static route_map_result_t
330 route_match_ip_next_hop_prefix_list (void *rule
, struct prefix
*prefix
,
331 route_map_object_t type
, void *object
)
333 struct prefix_list
*plist
;
334 struct rip_info
*rinfo
;
335 struct prefix_ipv4 p
;
337 if (type
== RMAP_RIP
)
341 p
.prefix
= (rinfo
->nexthop
.s_addr
) ? rinfo
->nexthop
: rinfo
->from
;
342 p
.prefixlen
= IPV4_MAX_BITLEN
;
344 plist
= prefix_list_lookup (AFI_IP
, (char *) rule
);
348 return (prefix_list_apply (plist
, &p
) == PREFIX_DENY
?
349 RMAP_NOMATCH
: RMAP_MATCH
);
355 route_match_ip_next_hop_prefix_list_compile (const char *arg
)
357 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
361 route_match_ip_next_hop_prefix_list_free (void *rule
)
363 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
366 static struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd
=
368 "ip next-hop prefix-list",
369 route_match_ip_next_hop_prefix_list
,
370 route_match_ip_next_hop_prefix_list_compile
,
371 route_match_ip_next_hop_prefix_list_free
374 /* `match ip address IP_ACCESS_LIST' */
376 /* Match function should return 1 if match is success else return
378 static route_map_result_t
379 route_match_ip_address (void *rule
, struct prefix
*prefix
,
380 route_map_object_t type
, void *object
)
382 struct access_list
*alist
;
384 if (type
== RMAP_RIP
)
386 alist
= access_list_lookup (AFI_IP
, (char *) rule
);
390 return (access_list_apply (alist
, prefix
) == FILTER_DENY
?
391 RMAP_NOMATCH
: RMAP_MATCH
);
396 /* Route map `ip address' match statement. `arg' should be
399 route_match_ip_address_compile (const char *arg
)
401 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
404 /* Free route map's compiled `ip address' value. */
406 route_match_ip_address_free (void *rule
)
408 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
411 /* Route map commands for ip address matching. */
412 static struct route_map_rule_cmd route_match_ip_address_cmd
=
415 route_match_ip_address
,
416 route_match_ip_address_compile
,
417 route_match_ip_address_free
420 /* `match ip address prefix-list PREFIX_LIST' */
422 static route_map_result_t
423 route_match_ip_address_prefix_list (void *rule
, struct prefix
*prefix
,
424 route_map_object_t type
, void *object
)
426 struct prefix_list
*plist
;
428 if (type
== RMAP_RIP
)
430 plist
= prefix_list_lookup (AFI_IP
, (char *) rule
);
434 return (prefix_list_apply (plist
, prefix
) == PREFIX_DENY
?
435 RMAP_NOMATCH
: RMAP_MATCH
);
441 route_match_ip_address_prefix_list_compile (const char *arg
)
443 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
447 route_match_ip_address_prefix_list_free (void *rule
)
449 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
452 static struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd
=
454 "ip address prefix-list",
455 route_match_ip_address_prefix_list
,
456 route_match_ip_address_prefix_list_compile
,
457 route_match_ip_address_prefix_list_free
460 /* `match tag TAG' */
461 /* Match function return 1 if match is success else return zero. */
462 static route_map_result_t
463 route_match_tag (void *rule
, struct prefix
*prefix
,
464 route_map_object_t type
, void *object
)
467 struct rip_info
*rinfo
;
469 if (type
== RMAP_RIP
)
474 /* The information stored by rinfo is host ordered. */
475 if (rinfo
->tag
== *tag
)
483 /* Route map `match tag' match statement. `arg' is TAG value */
485 route_match_tag_compile (const char *arg
)
489 tag
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_short
));
495 /* Free route map's compiled `match tag' value. */
497 route_match_tag_free (void *rule
)
499 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
502 /* Route map commands for tag matching. */
503 struct route_map_rule_cmd route_match_tag_cmd
=
507 route_match_tag_compile
,
511 /* `set metric METRIC' */
513 /* Set metric to attribute. */
514 static route_map_result_t
515 route_set_metric (void *rule
, struct prefix
*prefix
,
516 route_map_object_t type
, void *object
)
518 if (type
== RMAP_RIP
)
520 struct rip_metric_modifier
*mod
;
521 struct rip_info
*rinfo
;
526 if (mod
->type
== metric_increment
)
527 rinfo
->metric_out
+= mod
->metric
;
528 else if (mod
->type
== metric_decrement
)
529 rinfo
->metric_out
-= mod
->metric
;
530 else if (mod
->type
== metric_absolute
)
531 rinfo
->metric_out
= mod
->metric
;
533 if ((signed int)rinfo
->metric_out
< 1)
534 rinfo
->metric_out
= 1;
535 if (rinfo
->metric_out
> RIP_METRIC_INFINITY
)
536 rinfo
->metric_out
= RIP_METRIC_INFINITY
;
538 rinfo
->metric_set
= 1;
543 /* set metric compilation. */
545 route_set_metric_compile (const char *arg
)
552 struct rip_metric_modifier
*mod
;
560 /* Examine first character. */
563 type
= metric_increment
;
566 else if (arg
[0] == '-')
568 type
= metric_decrement
;
572 type
= metric_absolute
;
574 /* Check beginning with digit string. */
575 if (*pnt
< '0' || *pnt
> '9')
578 /* Convert string to integer. */
579 metric
= strtol (pnt
, &endptr
, 10);
581 if (metric
== LONG_MAX
|| *endptr
!= '\0')
583 if (metric
< 0 || metric
> RIP_METRIC_INFINITY
)
586 mod
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
,
587 sizeof (struct rip_metric_modifier
));
589 mod
->metric
= metric
;
594 /* Free route map's compiled `set metric' value. */
596 route_set_metric_free (void *rule
)
598 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
601 /* Set metric rule structure. */
602 static struct route_map_rule_cmd route_set_metric_cmd
=
606 route_set_metric_compile
,
607 route_set_metric_free
,
610 /* `set ip next-hop IP_ADDRESS' */
612 /* Set nexthop to object. ojbect must be pointer to struct attr. */
613 static route_map_result_t
614 route_set_ip_nexthop (void *rule
, struct prefix
*prefix
,
615 route_map_object_t type
, void *object
)
617 struct in_addr
*address
;
618 struct rip_info
*rinfo
;
622 /* Fetch routemap's rule information. */
626 /* Set next hop value. */
627 rinfo
->nexthop_out
= *address
;
633 /* Route map `ip nexthop' compile function. Given string is converted
634 to struct in_addr structure. */
636 route_set_ip_nexthop_compile (const char *arg
)
639 struct in_addr
*address
;
641 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in_addr
));
643 ret
= inet_aton (arg
, address
);
647 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
654 /* Free route map's compiled `ip nexthop' value. */
656 route_set_ip_nexthop_free (void *rule
)
658 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
661 /* Route map commands for ip nexthop set. */
662 static struct route_map_rule_cmd route_set_ip_nexthop_cmd
=
665 route_set_ip_nexthop
,
666 route_set_ip_nexthop_compile
,
667 route_set_ip_nexthop_free
672 /* Set tag to object. ojbect must be pointer to struct attr. */
673 static route_map_result_t
674 route_set_tag (void *rule
, struct prefix
*prefix
,
675 route_map_object_t type
, void *object
)
678 struct rip_info
*rinfo
;
682 /* Fetch routemap's rule information. */
686 /* Set next hop value. */
687 rinfo
->tag_out
= *tag
;
693 /* Route map `tag' compile function. Given string is converted
696 route_set_tag_compile (const char *arg
)
700 tag
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_short
));
706 /* Free route map's compiled `ip nexthop' value. */
708 route_set_tag_free (void *rule
)
710 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
713 /* Route map commands for tag set. */
714 static struct route_map_rule_cmd route_set_tag_cmd
=
718 route_set_tag_compile
,
722 #define MATCH_STR "Match values from routing table\n"
723 #define SET_STR "Set values in destination routing protocol\n"
727 "match metric <0-4294967295>",
729 "Match metric of route\n"
732 return rip_route_match_add (vty
, vty
->index
, "metric", argv
[0]);
735 DEFUN (no_match_metric
,
740 "Match metric of route\n")
743 return rip_route_match_delete (vty
, vty
->index
, "metric", NULL
);
745 return rip_route_match_delete (vty
, vty
->index
, "metric", argv
[0]);
748 ALIAS (no_match_metric
,
749 no_match_metric_val_cmd
,
750 "no match metric <0-4294967295>",
753 "Match metric of route\n"
756 DEFUN (match_interface
,
758 "match interface WORD",
760 "Match first hop interface of route\n"
763 return rip_route_match_add (vty
, vty
->index
, "interface", argv
[0]);
766 DEFUN (no_match_interface
,
767 no_match_interface_cmd
,
768 "no match interface",
771 "Match first hop interface of route\n")
774 return rip_route_match_delete (vty
, vty
->index
, "interface", NULL
);
776 return rip_route_match_delete (vty
, vty
->index
, "interface", argv
[0]);
779 ALIAS (no_match_interface
,
780 no_match_interface_val_cmd
,
781 "no match interface WORD",
784 "Match first hop interface of route\n"
787 DEFUN (match_ip_next_hop
,
788 match_ip_next_hop_cmd
,
789 "match ip next-hop (<1-199>|<1300-2699>|WORD)",
792 "Match next-hop address of route\n"
793 "IP access-list number\n"
794 "IP access-list number (expanded range)\n"
795 "IP Access-list name\n")
797 return rip_route_match_add (vty
, vty
->index
, "ip next-hop", argv
[0]);
800 DEFUN (no_match_ip_next_hop
,
801 no_match_ip_next_hop_cmd
,
802 "no match ip next-hop",
806 "Match next-hop address of route\n")
809 return rip_route_match_delete (vty
, vty
->index
, "ip next-hop", NULL
);
811 return rip_route_match_delete (vty
, vty
->index
, "ip next-hop", argv
[0]);
814 ALIAS (no_match_ip_next_hop
,
815 no_match_ip_next_hop_val_cmd
,
816 "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
820 "Match next-hop address of route\n"
821 "IP access-list number\n"
822 "IP access-list number (expanded range)\n"
823 "IP Access-list name\n")
825 DEFUN (match_ip_next_hop_prefix_list
,
826 match_ip_next_hop_prefix_list_cmd
,
827 "match ip next-hop prefix-list WORD",
830 "Match next-hop address of route\n"
831 "Match entries of prefix-lists\n"
832 "IP prefix-list name\n")
834 return rip_route_match_add (vty
, vty
->index
, "ip next-hop prefix-list", argv
[0]);
837 DEFUN (no_match_ip_next_hop_prefix_list
,
838 no_match_ip_next_hop_prefix_list_cmd
,
839 "no match ip next-hop prefix-list",
843 "Match next-hop address of route\n"
844 "Match entries of prefix-lists\n")
847 return rip_route_match_delete (vty
, vty
->index
, "ip next-hop prefix-list", NULL
);
849 return rip_route_match_delete (vty
, vty
->index
, "ip next-hop prefix-list", argv
[0]);
852 ALIAS (no_match_ip_next_hop_prefix_list
,
853 no_match_ip_next_hop_prefix_list_val_cmd
,
854 "no match ip next-hop prefix-list WORD",
858 "Match next-hop address of route\n"
859 "Match entries of prefix-lists\n"
860 "IP prefix-list name\n")
862 DEFUN (match_ip_address
,
863 match_ip_address_cmd
,
864 "match ip address (<1-199>|<1300-2699>|WORD)",
867 "Match address of route\n"
868 "IP access-list number\n"
869 "IP access-list number (expanded range)\n"
870 "IP Access-list name\n")
873 return rip_route_match_add (vty
, vty
->index
, "ip address", argv
[0]);
876 DEFUN (no_match_ip_address
,
877 no_match_ip_address_cmd
,
878 "no match ip address",
882 "Match address of route\n")
885 return rip_route_match_delete (vty
, vty
->index
, "ip address", NULL
);
887 return rip_route_match_delete (vty
, vty
->index
, "ip address", argv
[0]);
890 ALIAS (no_match_ip_address
,
891 no_match_ip_address_val_cmd
,
892 "no match ip address (<1-199>|<1300-2699>|WORD)",
896 "Match address of route\n"
897 "IP access-list number\n"
898 "IP access-list number (expanded range)\n"
899 "IP Access-list name\n")
901 DEFUN (match_ip_address_prefix_list
,
902 match_ip_address_prefix_list_cmd
,
903 "match ip address prefix-list WORD",
906 "Match address of route\n"
907 "Match entries of prefix-lists\n"
908 "IP prefix-list name\n")
910 return rip_route_match_add (vty
, vty
->index
, "ip address prefix-list", argv
[0]);
913 DEFUN (no_match_ip_address_prefix_list
,
914 no_match_ip_address_prefix_list_cmd
,
915 "no match ip address prefix-list",
919 "Match address of route\n"
920 "Match entries of prefix-lists\n")
923 return rip_route_match_delete (vty
, vty
->index
, "ip address prefix-list", NULL
);
925 return rip_route_match_delete (vty
, vty
->index
, "ip address prefix-list", argv
[0]);
928 ALIAS (no_match_ip_address_prefix_list
,
929 no_match_ip_address_prefix_list_val_cmd
,
930 "no match ip address prefix-list WORD",
934 "Match address of route\n"
935 "Match entries of prefix-lists\n"
936 "IP prefix-list name\n")
940 "match tag <0-65535>",
942 "Match tag of route\n"
945 return rip_route_match_add (vty
, vty
->index
, "tag", argv
[0]);
953 "Match tag of route\n")
956 return rip_route_match_delete (vty
, vty
->index
, "tag", NULL
);
958 return rip_route_match_delete (vty
, vty
->index
, "tag", argv
[0]);
962 no_match_tag_val_cmd
,
963 "no match tag <0-65535>",
966 "Match tag of route\n"
973 "set metric <0-4294967295>",
975 "Metric value for destination routing protocol\n"
978 return rip_route_set_add (vty
, vty
->index
, "metric", argv
[0]);
982 set_metric_addsub_cmd
,
983 "set metric <+/-metric>",
985 "Metric value for destination routing protocol\n"
986 "Add or subtract metric\n")
988 DEFUN (no_set_metric
,
993 "Metric value for destination routing protocol\n")
996 return rip_route_set_delete (vty
, vty
->index
, "metric", NULL
);
998 return rip_route_set_delete (vty
, vty
->index
, "metric", argv
[0]);
1001 ALIAS (no_set_metric
,
1002 no_set_metric_val_cmd
,
1003 "no set metric (<0-4294967295>|<+/-metric>)",
1006 "Metric value for destination routing protocol\n"
1008 "Add or subtract metric\n")
1010 DEFUN (set_ip_nexthop
,
1012 "set ip next-hop A.B.C.D",
1015 "Next hop address\n"
1016 "IP address of next hop\n")
1021 ret
= str2sockunion (argv
[0], &su
);
1024 vty_out (vty
, "%% Malformed next-hop address%s", VTY_NEWLINE
);
1028 return rip_route_set_add (vty
, vty
->index
, "ip next-hop", argv
[0]);
1031 DEFUN (no_set_ip_nexthop
,
1032 no_set_ip_nexthop_cmd
,
1033 "no set ip next-hop",
1037 "Next hop address\n")
1040 return rip_route_set_delete (vty
, vty
->index
, "ip next-hop", NULL
);
1042 return rip_route_set_delete (vty
, vty
->index
, "ip next-hop", argv
[0]);
1045 ALIAS (no_set_ip_nexthop
,
1046 no_set_ip_nexthop_val_cmd
,
1047 "no set ip next-hop A.B.C.D",
1051 "Next hop address\n"
1052 "IP address of next hop\n")
1056 "set tag <0-65535>",
1058 "Tag value for routing protocol\n"
1061 return rip_route_set_add (vty
, vty
->index
, "tag", argv
[0]);
1069 "Tag value for routing protocol\n")
1072 return rip_route_set_delete (vty
, vty
->index
, "tag", NULL
);
1074 return rip_route_set_delete (vty
, vty
->index
, "tag", argv
[0]);
1079 "no set tag <0-65535>",
1082 "Tag value for routing protocol\n"
1086 rip_route_map_reset ()
1091 /* Route-map init */
1093 rip_route_map_init ()
1096 route_map_init_vty ();
1097 route_map_add_hook (rip_route_map_update
);
1098 route_map_delete_hook (rip_route_map_update
);
1100 route_map_install_match (&route_match_metric_cmd
);
1101 route_map_install_match (&route_match_interface_cmd
);
1102 route_map_install_match (&route_match_ip_next_hop_cmd
);
1103 route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd
);
1104 route_map_install_match (&route_match_ip_address_cmd
);
1105 route_map_install_match (&route_match_ip_address_prefix_list_cmd
);
1106 route_map_install_match (&route_match_tag_cmd
);
1108 route_map_install_set (&route_set_metric_cmd
);
1109 route_map_install_set (&route_set_ip_nexthop_cmd
);
1110 route_map_install_set (&route_set_tag_cmd
);
1112 install_element (RMAP_NODE
, &match_metric_cmd
);
1113 install_element (RMAP_NODE
, &no_match_metric_cmd
);
1114 install_element (RMAP_NODE
, &no_match_metric_val_cmd
);
1115 install_element (RMAP_NODE
, &match_interface_cmd
);
1116 install_element (RMAP_NODE
, &no_match_interface_cmd
);
1117 install_element (RMAP_NODE
, &no_match_interface_val_cmd
);
1118 install_element (RMAP_NODE
, &match_ip_next_hop_cmd
);
1119 install_element (RMAP_NODE
, &no_match_ip_next_hop_cmd
);
1120 install_element (RMAP_NODE
, &no_match_ip_next_hop_val_cmd
);
1121 install_element (RMAP_NODE
, &match_ip_next_hop_prefix_list_cmd
);
1122 install_element (RMAP_NODE
, &no_match_ip_next_hop_prefix_list_cmd
);
1123 install_element (RMAP_NODE
, &no_match_ip_next_hop_prefix_list_val_cmd
);
1124 install_element (RMAP_NODE
, &match_ip_address_cmd
);
1125 install_element (RMAP_NODE
, &no_match_ip_address_cmd
);
1126 install_element (RMAP_NODE
, &no_match_ip_address_val_cmd
);
1127 install_element (RMAP_NODE
, &match_ip_address_prefix_list_cmd
);
1128 install_element (RMAP_NODE
, &no_match_ip_address_prefix_list_cmd
);
1129 install_element (RMAP_NODE
, &no_match_ip_address_prefix_list_val_cmd
);
1130 install_element (RMAP_NODE
, &match_tag_cmd
);
1131 install_element (RMAP_NODE
, &no_match_tag_cmd
);
1132 install_element (RMAP_NODE
, &no_match_tag_val_cmd
);
1134 install_element (RMAP_NODE
, &set_metric_cmd
);
1135 install_element (RMAP_NODE
, &set_metric_addsub_cmd
);
1136 install_element (RMAP_NODE
, &no_set_metric_cmd
);
1137 install_element (RMAP_NODE
, &no_set_metric_val_cmd
);
1138 install_element (RMAP_NODE
, &set_ip_nexthop_cmd
);
1139 install_element (RMAP_NODE
, &no_set_ip_nexthop_cmd
);
1140 install_element (RMAP_NODE
, &no_set_ip_nexthop_val_cmd
);
1141 install_element (RMAP_NODE
, &set_tag_cmd
);
1142 install_element (RMAP_NODE
, &no_set_tag_cmd
);
1143 install_element (RMAP_NODE
, &no_set_tag_val_cmd
);