1 /* Route map function of bgpd.
2 Copyright (C) 1998, 1999 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
34 #include "regex-gnu.h"
35 #endif /* HAVE_GNU_REGEX */
37 #include "sockunion.h"
39 #include "bgpd/bgpd.h"
40 #include "bgpd/bgp_table.h"
41 #include "bgpd/bgp_attr.h"
42 #include "bgpd/bgp_aspath.h"
43 #include "bgpd/bgp_route.h"
44 #include "bgpd/bgp_regex.h"
45 #include "bgpd/bgp_community.h"
46 #include "bgpd/bgp_clist.h"
47 #include "bgpd/bgp_filter.h"
48 #include "bgpd/bgp_mplsvpn.h"
49 #include "bgpd/bgp_ecommunity.h"
51 /* Memo of route-map commands.
60 ip route-source : Done
64 ipv6 route-source: (This will not be implemented by bgpd)
65 ipv6 prefix-list : Done
66 length : (This will not be implemented by bgpd)
68 route-type : (This will not be implemented by bgpd)
69 tag : (This will not be implemented by bgpd)
71 set as-path prepend : Done
73 automatic-tag : (This will not be implemented by bgpd)
77 default : (This will not be implemented by bgpd)
78 interface : (This will not be implemented by bgpd)
79 ip default : (This will not be implemented by bgpd)
81 ip precedence : (This will not be implemented by bgpd)
82 ip tos : (This will not be implemented by bgpd)
83 level : (This will not be implemented by bgpd)
84 local-preference : Done
88 tag : (This will not be implemented by bgpd)
93 set ipv6 next-hop global: Done
94 set ipv6 next-hop local : Done
98 /* 'match peer (A.B.C.D|X:X::X:X)' */
100 /* Compares the peer specified in the 'match peer' clause with the peer
101 received in bgp_info->peer. If it is the same, or if the peer structure
102 received is a peer_group containing it, returns RMAP_MATCH. */
103 static route_map_result_t
104 route_match_peer (void *rule
, struct prefix
*prefix
, route_map_object_t type
,
108 union sockunion
*su2
;
109 struct peer_group
*group
;
111 struct listnode
*node
, *nnode
;
113 if (type
== RMAP_BGP
)
116 peer
= ((struct bgp_info
*) object
)->peer
;
118 if ( ! CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_IMPORT
) &&
119 ! CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_EXPORT
) )
122 /* If su='0.0.0.0' (command 'match peer local'), and it's a NETWORK,
123 REDISTRIBUTE or DEFAULT_GENERATED route => return RMAP_MATCH */
124 su2
= sockunion_str2su ("0.0.0.0");
125 if ( sockunion_same (su
, su2
) )
128 if ( CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_NETWORK
) ||
129 CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_REDISTRIBUTE
) ||
130 CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_DEFAULT
))
135 sockunion_free (su2
);
138 sockunion_free (su2
);
140 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
142 if (sockunion_same (su
, &peer
->su
))
150 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
152 if (sockunion_same (su
, &peer
->su
))
163 route_match_peer_compile (const char *arg
)
168 su
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (union sockunion
));
170 ret
= str2sockunion ( (arg
)? arg
: "0.0.0.0", su
);
172 XFREE (MTYPE_ROUTE_MAP_COMPILED
, su
);
179 /* Free route map's compiled `ip address' value. */
181 route_match_peer_free (void *rule
)
183 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
186 /* Route map commands for ip address matching. */
187 struct route_map_rule_cmd route_match_peer_cmd
=
191 route_match_peer_compile
,
192 route_match_peer_free
195 /* `match ip address IP_ACCESS_LIST' */
197 /* Match function should return 1 if match is success else return
199 static route_map_result_t
200 route_match_ip_address (void *rule
, struct prefix
*prefix
,
201 route_map_object_t type
, void *object
)
203 struct access_list
*alist
;
204 /* struct prefix_ipv4 match; */
206 if (type
== RMAP_BGP
)
208 alist
= access_list_lookup (AFI_IP
, (char *) rule
);
212 return (access_list_apply (alist
, prefix
) == FILTER_DENY
?
213 RMAP_NOMATCH
: RMAP_MATCH
);
218 /* Route map `ip address' match statement. `arg' should be
221 route_match_ip_address_compile (const char *arg
)
223 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
226 /* Free route map's compiled `ip address' value. */
228 route_match_ip_address_free (void *rule
)
230 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
233 /* Route map commands for ip address matching. */
234 struct route_map_rule_cmd route_match_ip_address_cmd
=
237 route_match_ip_address
,
238 route_match_ip_address_compile
,
239 route_match_ip_address_free
242 /* `match ip next-hop IP_ADDRESS' */
244 /* Match function return 1 if match is success else return zero. */
245 static route_map_result_t
246 route_match_ip_next_hop (void *rule
, struct prefix
*prefix
,
247 route_map_object_t type
, void *object
)
249 struct access_list
*alist
;
250 struct bgp_info
*bgp_info
;
251 struct prefix_ipv4 p
;
253 if (type
== RMAP_BGP
)
257 p
.prefix
= bgp_info
->attr
->nexthop
;
258 p
.prefixlen
= IPV4_MAX_BITLEN
;
260 alist
= access_list_lookup (AFI_IP
, (char *) rule
);
264 return (access_list_apply (alist
, &p
) == FILTER_DENY
?
265 RMAP_NOMATCH
: RMAP_MATCH
);
270 /* Route map `ip next-hop' match statement. `arg' is
273 route_match_ip_next_hop_compile (const char *arg
)
275 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
278 /* Free route map's compiled `ip address' value. */
280 route_match_ip_next_hop_free (void *rule
)
282 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
285 /* Route map commands for ip next-hop matching. */
286 struct route_map_rule_cmd route_match_ip_next_hop_cmd
=
289 route_match_ip_next_hop
,
290 route_match_ip_next_hop_compile
,
291 route_match_ip_next_hop_free
294 /* `match ip route-source ACCESS-LIST' */
296 /* Match function return 1 if match is success else return zero. */
297 static route_map_result_t
298 route_match_ip_route_source (void *rule
, struct prefix
*prefix
,
299 route_map_object_t type
, void *object
)
301 struct access_list
*alist
;
302 struct bgp_info
*bgp_info
;
304 struct prefix_ipv4 p
;
306 if (type
== RMAP_BGP
)
309 peer
= bgp_info
->peer
;
311 if (! peer
|| sockunion_family (&peer
->su
) != AF_INET
)
315 p
.prefix
= peer
->su
.sin
.sin_addr
;
316 p
.prefixlen
= IPV4_MAX_BITLEN
;
318 alist
= access_list_lookup (AFI_IP
, (char *) rule
);
322 return (access_list_apply (alist
, &p
) == FILTER_DENY
?
323 RMAP_NOMATCH
: RMAP_MATCH
);
328 /* Route map `ip route-source' match statement. `arg' is
331 route_match_ip_route_source_compile (const char *arg
)
333 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
336 /* Free route map's compiled `ip address' value. */
338 route_match_ip_route_source_free (void *rule
)
340 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
343 /* Route map commands for ip route-source matching. */
344 struct route_map_rule_cmd route_match_ip_route_source_cmd
=
347 route_match_ip_route_source
,
348 route_match_ip_route_source_compile
,
349 route_match_ip_route_source_free
352 /* `match ip address prefix-list PREFIX_LIST' */
354 static route_map_result_t
355 route_match_ip_address_prefix_list (void *rule
, struct prefix
*prefix
,
356 route_map_object_t type
, void *object
)
358 struct prefix_list
*plist
;
360 if (type
== RMAP_BGP
)
362 plist
= prefix_list_lookup (AFI_IP
, (char *) rule
);
366 return (prefix_list_apply (plist
, prefix
) == PREFIX_DENY
?
367 RMAP_NOMATCH
: RMAP_MATCH
);
373 route_match_ip_address_prefix_list_compile (const char *arg
)
375 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
379 route_match_ip_address_prefix_list_free (void *rule
)
381 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
384 struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd
=
386 "ip address prefix-list",
387 route_match_ip_address_prefix_list
,
388 route_match_ip_address_prefix_list_compile
,
389 route_match_ip_address_prefix_list_free
392 /* `match ip next-hop prefix-list PREFIX_LIST' */
394 static route_map_result_t
395 route_match_ip_next_hop_prefix_list (void *rule
, struct prefix
*prefix
,
396 route_map_object_t type
, void *object
)
398 struct prefix_list
*plist
;
399 struct bgp_info
*bgp_info
;
400 struct prefix_ipv4 p
;
402 if (type
== RMAP_BGP
)
406 p
.prefix
= bgp_info
->attr
->nexthop
;
407 p
.prefixlen
= IPV4_MAX_BITLEN
;
409 plist
= prefix_list_lookup (AFI_IP
, (char *) rule
);
413 return (prefix_list_apply (plist
, &p
) == PREFIX_DENY
?
414 RMAP_NOMATCH
: RMAP_MATCH
);
420 route_match_ip_next_hop_prefix_list_compile (const char *arg
)
422 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
426 route_match_ip_next_hop_prefix_list_free (void *rule
)
428 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
431 struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd
=
433 "ip next-hop prefix-list",
434 route_match_ip_next_hop_prefix_list
,
435 route_match_ip_next_hop_prefix_list_compile
,
436 route_match_ip_next_hop_prefix_list_free
439 /* `match ip route-source prefix-list PREFIX_LIST' */
441 static route_map_result_t
442 route_match_ip_route_source_prefix_list (void *rule
, struct prefix
*prefix
,
443 route_map_object_t type
, void *object
)
445 struct prefix_list
*plist
;
446 struct bgp_info
*bgp_info
;
448 struct prefix_ipv4 p
;
450 if (type
== RMAP_BGP
)
453 peer
= bgp_info
->peer
;
455 if (! peer
|| sockunion_family (&peer
->su
) != AF_INET
)
459 p
.prefix
= peer
->su
.sin
.sin_addr
;
460 p
.prefixlen
= IPV4_MAX_BITLEN
;
462 plist
= prefix_list_lookup (AFI_IP
, (char *) rule
);
466 return (prefix_list_apply (plist
, &p
) == PREFIX_DENY
?
467 RMAP_NOMATCH
: RMAP_MATCH
);
473 route_match_ip_route_source_prefix_list_compile (const char *arg
)
475 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
479 route_match_ip_route_source_prefix_list_free (void *rule
)
481 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
484 struct route_map_rule_cmd route_match_ip_route_source_prefix_list_cmd
=
486 "ip route-source prefix-list",
487 route_match_ip_route_source_prefix_list
,
488 route_match_ip_route_source_prefix_list_compile
,
489 route_match_ip_route_source_prefix_list_free
492 /* `match metric METRIC' */
494 /* Match function return 1 if match is success else return zero. */
495 static route_map_result_t
496 route_match_metric (void *rule
, struct prefix
*prefix
,
497 route_map_object_t type
, void *object
)
500 struct bgp_info
*bgp_info
;
502 if (type
== RMAP_BGP
)
507 if (bgp_info
->attr
->med
== *med
)
515 /* Route map `match metric' match statement. `arg' is MED value */
517 route_match_metric_compile (const char *arg
)
521 unsigned long tmpval
;
523 tmpval
= strtoul (arg
, &endptr
, 10);
524 if (*endptr
!= '\0' || tmpval
== ULONG_MAX
|| tmpval
> UINT32_MAX
)
527 med
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_int32_t
));
536 /* Free route map's compiled `match metric' value. */
538 route_match_metric_free (void *rule
)
540 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
543 /* Route map commands for metric matching. */
544 struct route_map_rule_cmd route_match_metric_cmd
=
548 route_match_metric_compile
,
549 route_match_metric_free
552 /* `match as-path ASPATH' */
554 /* Match function for as-path match. I assume given object is */
555 static route_map_result_t
556 route_match_aspath (void *rule
, struct prefix
*prefix
,
557 route_map_object_t type
, void *object
)
560 struct as_list
*as_list
;
561 struct bgp_info
*bgp_info
;
563 if (type
== RMAP_BGP
)
565 as_list
= as_list_lookup ((char *) rule
);
572 return ((as_list_apply (as_list
, bgp_info
->attr
->aspath
) == AS_FILTER_DENY
) ? RMAP_NOMATCH
: RMAP_MATCH
);
577 /* Compile function for as-path match. */
579 route_match_aspath_compile (const char *arg
)
581 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
584 /* Compile function for as-path match. */
586 route_match_aspath_free (void *rule
)
588 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
591 /* Route map commands for aspath matching. */
592 struct route_map_rule_cmd route_match_aspath_cmd
=
596 route_match_aspath_compile
,
597 route_match_aspath_free
600 /* `match community COMMUNIY' */
601 struct rmap_community
607 /* Match function for community match. */
608 static route_map_result_t
609 route_match_community (void *rule
, struct prefix
*prefix
,
610 route_map_object_t type
, void *object
)
612 struct community_list
*list
;
613 struct bgp_info
*bgp_info
;
614 struct rmap_community
*rcom
;
616 if (type
== RMAP_BGP
)
621 list
= community_list_lookup (bgp_clist
, rcom
->name
, COMMUNITY_LIST_MASTER
);
627 if (community_list_exact_match (bgp_info
->attr
->community
, list
))
632 if (community_list_match (bgp_info
->attr
->community
, list
))
639 /* Compile function for community match. */
641 route_match_community_compile (const char *arg
)
643 struct rmap_community
*rcom
;
647 rcom
= XCALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct rmap_community
));
649 p
= strchr (arg
, ' ');
653 rcom
->name
= XCALLOC (MTYPE_ROUTE_MAP_COMPILED
, len
+ 1);
654 memcpy (rcom
->name
, arg
, len
);
659 rcom
->name
= XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
665 /* Compile function for community match. */
667 route_match_community_free (void *rule
)
669 struct rmap_community
*rcom
= rule
;
671 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rcom
->name
);
672 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rcom
);
675 /* Route map commands for community matching. */
676 struct route_map_rule_cmd route_match_community_cmd
=
679 route_match_community
,
680 route_match_community_compile
,
681 route_match_community_free
684 /* Match function for extcommunity match. */
685 static route_map_result_t
686 route_match_ecommunity (void *rule
, struct prefix
*prefix
,
687 route_map_object_t type
, void *object
)
689 struct community_list
*list
;
690 struct bgp_info
*bgp_info
;
692 if (type
== RMAP_BGP
)
696 list
= community_list_lookup (bgp_clist
, (char *) rule
,
697 EXTCOMMUNITY_LIST_MASTER
);
701 if (ecommunity_list_match (bgp_info
->attr
->ecommunity
, list
))
707 /* Compile function for extcommunity match. */
709 route_match_ecommunity_compile (const char *arg
)
711 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
714 /* Compile function for extcommunity match. */
716 route_match_ecommunity_free (void *rule
)
718 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
721 /* Route map commands for community matching. */
722 struct route_map_rule_cmd route_match_ecommunity_cmd
=
725 route_match_ecommunity
,
726 route_match_ecommunity_compile
,
727 route_match_ecommunity_free
730 /* `match nlri` and `set nlri` are replaced by `address-family ipv4`
731 and `address-family vpnv4'. */
734 static route_map_result_t
735 route_match_origin (void *rule
, struct prefix
*prefix
,
736 route_map_object_t type
, void *object
)
739 struct bgp_info
*bgp_info
;
741 if (type
== RMAP_BGP
)
746 if (bgp_info
->attr
->origin
== *origin
)
754 route_match_origin_compile (const char *arg
)
758 origin
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_char
));
760 if (strcmp (arg
, "igp") == 0)
762 else if (strcmp (arg
, "egp") == 0)
770 /* Free route map's compiled `ip address' value. */
772 route_match_origin_free (void *rule
)
774 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
777 /* Route map commands for origin matching. */
778 struct route_map_rule_cmd route_match_origin_cmd
=
782 route_match_origin_compile
,
783 route_match_origin_free
785 /* `set ip next-hop IP_ADDRESS' */
787 /* Set nexthop to object. ojbect must be pointer to struct attr. */
788 struct rmap_ip_nexthop_set
790 struct in_addr
*address
;
794 static route_map_result_t
795 route_set_ip_nexthop (void *rule
, struct prefix
*prefix
,
796 route_map_object_t type
, void *object
)
798 struct rmap_ip_nexthop_set
*rins
= rule
;
799 struct in_addr peer_address
;
800 struct bgp_info
*bgp_info
;
803 if (type
== RMAP_BGP
)
806 peer
= bgp_info
->peer
;
808 if (rins
->peer_address
)
810 if ((CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_IN
) ||
811 CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_IMPORT
))
813 && sockunion_family (peer
->su_remote
) == AF_INET
)
815 inet_aton (sockunion_su2str (peer
->su_remote
), &peer_address
);
816 bgp_info
->attr
->nexthop
= peer_address
;
817 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP
);
819 else if (CHECK_FLAG (peer
->rmap_type
, PEER_RMAP_TYPE_OUT
)
821 && sockunion_family (peer
->su_local
) == AF_INET
)
823 inet_aton (sockunion_su2str (peer
->su_local
), &peer_address
);
824 bgp_info
->attr
->nexthop
= peer_address
;
825 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP
);
830 /* Set next hop value. */
831 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP
);
832 bgp_info
->attr
->nexthop
= *rins
->address
;
839 /* Route map `ip nexthop' compile function. Given string is converted
840 to struct in_addr structure. */
842 route_set_ip_nexthop_compile (const char *arg
)
844 struct rmap_ip_nexthop_set
*rins
;
845 struct in_addr
*address
= NULL
;
846 int peer_address
= 0;
849 if (strcmp (arg
, "peer-address") == 0)
853 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in_addr
));
854 ret
= inet_aton (arg
, address
);
858 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
863 rins
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct rmap_ip_nexthop_set
));
864 memset (rins
, 0, sizeof (struct rmap_ip_nexthop_set
));
866 rins
->address
= address
;
867 rins
->peer_address
= peer_address
;
872 /* Free route map's compiled `ip nexthop' value. */
874 route_set_ip_nexthop_free (void *rule
)
876 struct rmap_ip_nexthop_set
*rins
= rule
;
879 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rins
->address
);
881 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rins
);
884 /* Route map commands for ip nexthop set. */
885 struct route_map_rule_cmd route_set_ip_nexthop_cmd
=
888 route_set_ip_nexthop
,
889 route_set_ip_nexthop_compile
,
890 route_set_ip_nexthop_free
893 /* `set local-preference LOCAL_PREF' */
895 /* Set local preference. */
896 static route_map_result_t
897 route_set_local_pref (void *rule
, struct prefix
*prefix
,
898 route_map_object_t type
, void *object
)
900 u_int32_t
*local_pref
;
901 struct bgp_info
*bgp_info
;
903 if (type
== RMAP_BGP
)
905 /* Fetch routemap's rule information. */
909 /* Set local preference value. */
910 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF
);
911 bgp_info
->attr
->local_pref
= *local_pref
;
917 /* set local preference compilation. */
919 route_set_local_pref_compile (const char *arg
)
922 u_int32_t
*local_pref
;
925 /* Local preference value shoud be integer. */
926 if (! all_digit (arg
))
929 tmp
= strtoul (arg
, &endptr
, 10);
930 if (*endptr
!= '\0' || tmp
== ULONG_MAX
|| tmp
> UINT32_MAX
)
933 local_pref
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_int32_t
));
943 /* Free route map's local preference value. */
945 route_set_local_pref_free (void *rule
)
947 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
950 /* Set local preference rule structure. */
951 struct route_map_rule_cmd route_set_local_pref_cmd
=
954 route_set_local_pref
,
955 route_set_local_pref_compile
,
956 route_set_local_pref_free
,
959 /* `set weight WEIGHT' */
962 static route_map_result_t
963 route_set_weight (void *rule
, struct prefix
*prefix
, route_map_object_t type
,
967 struct bgp_info
*bgp_info
;
969 if (type
== RMAP_BGP
)
971 /* Fetch routemap's rule information. */
975 /* Set weight value. */
976 bgp_info
->attr
->weight
= *weight
;
982 /* set local preference compilation. */
984 route_set_weight_compile (const char *arg
)
990 /* Local preference value shoud be integer. */
991 if (! all_digit (arg
))
995 tmp
= strtoul (arg
, &endptr
, 10);
996 if (*endptr
!= '\0' || tmp
== ULONG_MAX
|| tmp
> UINT32_MAX
)
999 weight
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_int32_t
));
1009 /* Free route map's local preference value. */
1011 route_set_weight_free (void *rule
)
1013 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1016 /* Set local preference rule structure. */
1017 struct route_map_rule_cmd route_set_weight_cmd
=
1021 route_set_weight_compile
,
1022 route_set_weight_free
,
1025 /* `set metric METRIC' */
1027 /* Set metric to attribute. */
1028 static route_map_result_t
1029 route_set_metric (void *rule
, struct prefix
*prefix
,
1030 route_map_object_t type
, void *object
)
1033 u_int32_t metric_val
;
1034 struct bgp_info
*bgp_info
;
1036 if (type
== RMAP_BGP
)
1038 /* Fetch routemap's rule information. */
1042 if (! (bgp_info
->attr
->flag
& ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC
)))
1043 bgp_info
->attr
->med
= 0;
1044 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC
);
1046 if (all_digit (metric
))
1048 metric_val
= strtoul (metric
, (char **)NULL
, 10);
1049 bgp_info
->attr
->med
= metric_val
;
1053 metric_val
= strtoul (metric
+1, (char **)NULL
, 10);
1055 if (strncmp (metric
, "+", 1) == 0)
1057 if (bgp_info
->attr
->med
/2 + metric_val
/2 > BGP_MED_MAX
/2)
1058 bgp_info
->attr
->med
= BGP_MED_MAX
- 1;
1060 bgp_info
->attr
->med
+= metric_val
;
1062 else if (strncmp (metric
, "-", 1) == 0)
1064 if (bgp_info
->attr
->med
<= metric_val
)
1065 bgp_info
->attr
->med
= 0;
1067 bgp_info
->attr
->med
-= metric_val
;
1074 /* set metric compilation. */
1076 route_set_metric_compile (const char *arg
)
1080 char *endptr
= NULL
;
1082 if (all_digit (arg
))
1084 /* set metric value check*/
1085 larg
= strtoul (arg
, &endptr
, 10);
1086 if (*endptr
!= '\0' || larg
== ULONG_MAX
|| larg
> UINT32_MAX
)
1092 /* set metric +/-value check */
1093 if ((strncmp (arg
, "+", 1) != 0
1094 && strncmp (arg
, "-", 1) != 0)
1095 || (! all_digit (arg
+1)))
1098 larg
= strtoul (arg
+1, &endptr
, 10);
1099 if (*endptr
!= '\0' || larg
== ULONG_MAX
|| larg
> UINT32_MAX
)
1104 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
1107 /* Free route map's compiled `set metric' value. */
1109 route_set_metric_free (void *rule
)
1111 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1114 /* Set metric rule structure. */
1115 struct route_map_rule_cmd route_set_metric_cmd
=
1119 route_set_metric_compile
,
1120 route_set_metric_free
,
1123 /* `set as-path prepend ASPATH' */
1125 /* For AS path prepend mechanism. */
1126 static route_map_result_t
1127 route_set_aspath_prepend (void *rule
, struct prefix
*prefix
, route_map_object_t type
, void *object
)
1129 struct aspath
*aspath
;
1131 struct bgp_info
*binfo
;
1133 if (type
== RMAP_BGP
)
1138 if (binfo
->attr
->aspath
->refcnt
)
1139 new = aspath_dup (binfo
->attr
->aspath
);
1141 new = binfo
->attr
->aspath
;
1143 aspath_prepend (aspath
, new);
1144 binfo
->attr
->aspath
= new;
1150 /* Compile function for as-path prepend. */
1152 route_set_aspath_prepend_compile (const char *arg
)
1154 struct aspath
*aspath
;
1156 aspath
= aspath_str2aspath (arg
);
1162 /* Compile function for as-path prepend. */
1164 route_set_aspath_prepend_free (void *rule
)
1166 struct aspath
*aspath
= rule
;
1167 aspath_free (aspath
);
1170 /* Set metric rule structure. */
1171 struct route_map_rule_cmd route_set_aspath_prepend_cmd
=
1174 route_set_aspath_prepend
,
1175 route_set_aspath_prepend_compile
,
1176 route_set_aspath_prepend_free
,
1179 /* `set community COMMUNITY' */
1182 struct community
*com
;
1187 /* For community set mechanism. */
1188 static route_map_result_t
1189 route_set_community (void *rule
, struct prefix
*prefix
,
1190 route_map_object_t type
, void *object
)
1192 struct rmap_com_set
*rcs
;
1193 struct bgp_info
*binfo
;
1195 struct community
*new = NULL
;
1196 struct community
*old
;
1197 struct community
*merge
;
1199 if (type
== RMAP_BGP
)
1204 old
= attr
->community
;
1209 attr
->flag
&= ~(ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES
));
1210 attr
->community
= NULL
;
1214 /* "additive" case. */
1215 if (rcs
->additive
&& old
)
1217 merge
= community_merge (community_dup (old
), rcs
->com
);
1218 new = community_uniq_sort (merge
);
1219 community_free (merge
);
1222 new = community_dup (rcs
->com
);
1224 attr
->community
= new;
1226 attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES
);
1232 /* Compile function for set community. */
1234 route_set_community_compile (const char *arg
)
1236 struct rmap_com_set
*rcs
;
1237 struct community
*com
= NULL
;
1242 if (strcmp (arg
, "none") == 0)
1246 sp
= strstr (arg
, "additive");
1250 /* "additive" keyworkd is included. */
1255 com
= community_str2com (arg
);
1264 rcs
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct rmap_com_set
));
1265 memset (rcs
, 0, sizeof (struct rmap_com_set
));
1268 rcs
->additive
= additive
;
1274 /* Free function for set community. */
1276 route_set_community_free (void *rule
)
1278 struct rmap_com_set
*rcs
= rule
;
1281 community_free (rcs
->com
);
1282 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rcs
);
1285 /* Set community rule structure. */
1286 struct route_map_rule_cmd route_set_community_cmd
=
1289 route_set_community
,
1290 route_set_community_compile
,
1291 route_set_community_free
,
1294 /* `set comm-list (<1-99>|<100-500>|WORD) delete' */
1296 /* For community set mechanism. */
1297 static route_map_result_t
1298 route_set_community_delete (void *rule
, struct prefix
*prefix
,
1299 route_map_object_t type
, void *object
)
1301 struct community_list
*list
;
1302 struct community
*merge
;
1303 struct community
*new;
1304 struct community
*old
;
1305 struct bgp_info
*binfo
;
1307 if (type
== RMAP_BGP
)
1313 list
= community_list_lookup (bgp_clist
, rule
, COMMUNITY_LIST_MASTER
);
1314 old
= binfo
->attr
->community
;
1318 merge
= community_list_match_delete (community_dup (old
), list
);
1319 new = community_uniq_sort (merge
);
1320 community_free (merge
);
1324 binfo
->attr
->community
= NULL
;
1325 binfo
->attr
->flag
&= ~ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES
);
1326 community_free (new);
1330 binfo
->attr
->community
= new;
1331 binfo
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES
);
1339 /* Compile function for set community. */
1341 route_set_community_delete_compile (const char *arg
)
1347 p
= strchr (arg
, ' ');
1351 str
= XCALLOC (MTYPE_ROUTE_MAP_COMPILED
, len
+ 1);
1352 memcpy (str
, arg
, len
);
1360 /* Free function for set community. */
1362 route_set_community_delete_free (void *rule
)
1364 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1367 /* Set community rule structure. */
1368 struct route_map_rule_cmd route_set_community_delete_cmd
=
1371 route_set_community_delete
,
1372 route_set_community_delete_compile
,
1373 route_set_community_delete_free
,
1376 /* `set extcommunity rt COMMUNITY' */
1378 /* For community set mechanism. */
1379 static route_map_result_t
1380 route_set_ecommunity_rt (void *rule
, struct prefix
*prefix
,
1381 route_map_object_t type
, void *object
)
1383 struct ecommunity
*ecom
;
1384 struct ecommunity
*new_ecom
;
1385 struct ecommunity
*old_ecom
;
1386 struct bgp_info
*bgp_info
;
1388 if (type
== RMAP_BGP
)
1396 /* We assume additive for Extended Community. */
1397 old_ecom
= bgp_info
->attr
->ecommunity
;
1400 new_ecom
= ecommunity_merge (ecommunity_dup (old_ecom
), ecom
);
1402 new_ecom
= ecommunity_dup (ecom
);
1404 bgp_info
->attr
->ecommunity
= new_ecom
;
1407 ecommunity_free (old_ecom
);
1409 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES
);
1414 /* Compile function for set community. */
1416 route_set_ecommunity_rt_compile (const char *arg
)
1418 struct ecommunity
*ecom
;
1420 ecom
= ecommunity_str2com (arg
, ECOMMUNITY_ROUTE_TARGET
, 0);
1426 /* Free function for set community. */
1428 route_set_ecommunity_rt_free (void *rule
)
1430 struct ecommunity
*ecom
= rule
;
1431 ecommunity_free (ecom
);
1434 /* Set community rule structure. */
1435 struct route_map_rule_cmd route_set_ecommunity_rt_cmd
=
1438 route_set_ecommunity_rt
,
1439 route_set_ecommunity_rt_compile
,
1440 route_set_ecommunity_rt_free
,
1443 /* `set extcommunity soo COMMUNITY' */
1445 /* For community set mechanism. */
1446 static route_map_result_t
1447 route_set_ecommunity_soo (void *rule
, struct prefix
*prefix
,
1448 route_map_object_t type
, void *object
)
1450 struct ecommunity
*ecom
;
1451 struct bgp_info
*bgp_info
;
1453 if (type
== RMAP_BGP
)
1461 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES
);
1462 bgp_info
->attr
->ecommunity
= ecommunity_dup (ecom
);
1467 /* Compile function for set community. */
1469 route_set_ecommunity_soo_compile (const char *arg
)
1471 struct ecommunity
*ecom
;
1473 ecom
= ecommunity_str2com (arg
, ECOMMUNITY_SITE_ORIGIN
, 0);
1480 /* Free function for set community. */
1482 route_set_ecommunity_soo_free (void *rule
)
1484 struct ecommunity
*ecom
= rule
;
1485 ecommunity_free (ecom
);
1488 /* Set community rule structure. */
1489 struct route_map_rule_cmd route_set_ecommunity_soo_cmd
=
1492 route_set_ecommunity_soo
,
1493 route_set_ecommunity_soo_compile
,
1494 route_set_ecommunity_soo_free
,
1497 /* `set origin ORIGIN' */
1499 /* For origin set. */
1500 static route_map_result_t
1501 route_set_origin (void *rule
, struct prefix
*prefix
, route_map_object_t type
, void *object
)
1504 struct bgp_info
*bgp_info
;
1506 if (type
== RMAP_BGP
)
1511 bgp_info
->attr
->origin
= *origin
;
1517 /* Compile function for origin set. */
1519 route_set_origin_compile (const char *arg
)
1523 origin
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (u_char
));
1525 if (strcmp (arg
, "igp") == 0)
1527 else if (strcmp (arg
, "egp") == 0)
1535 /* Compile function for origin set. */
1537 route_set_origin_free (void *rule
)
1539 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1542 /* Set metric rule structure. */
1543 struct route_map_rule_cmd route_set_origin_cmd
=
1547 route_set_origin_compile
,
1548 route_set_origin_free
,
1551 /* `set atomic-aggregate' */
1553 /* For atomic aggregate set. */
1554 static route_map_result_t
1555 route_set_atomic_aggregate (void *rule
, struct prefix
*prefix
,
1556 route_map_object_t type
, void *object
)
1558 struct bgp_info
*bgp_info
;
1560 if (type
== RMAP_BGP
)
1563 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE
);
1569 /* Compile function for atomic aggregate. */
1571 route_set_atomic_aggregate_compile (const char *arg
)
1576 /* Compile function for atomic aggregate. */
1578 route_set_atomic_aggregate_free (void *rule
)
1583 /* Set atomic aggregate rule structure. */
1584 struct route_map_rule_cmd route_set_atomic_aggregate_cmd
=
1587 route_set_atomic_aggregate
,
1588 route_set_atomic_aggregate_compile
,
1589 route_set_atomic_aggregate_free
,
1592 /* `set aggregator as AS A.B.C.D' */
1596 struct in_addr address
;
1599 static route_map_result_t
1600 route_set_aggregator_as (void *rule
, struct prefix
*prefix
,
1601 route_map_object_t type
, void *object
)
1603 struct bgp_info
*bgp_info
;
1604 struct aggregator
*aggregator
;
1606 if (type
== RMAP_BGP
)
1611 bgp_info
->attr
->aggregator_as
= aggregator
->as
;
1612 bgp_info
->attr
->aggregator_addr
= aggregator
->address
;
1613 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR
);
1620 route_set_aggregator_as_compile (const char *arg
)
1622 struct aggregator
*aggregator
;
1626 aggregator
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct aggregator
));
1627 memset (aggregator
, 0, sizeof (struct aggregator
));
1629 sscanf (arg
, "%s %s", as
, address
);
1631 aggregator
->as
= strtoul (as
, NULL
, 10);
1632 inet_aton (address
, &aggregator
->address
);
1638 route_set_aggregator_as_free (void *rule
)
1640 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1643 struct route_map_rule_cmd route_set_aggregator_as_cmd
=
1646 route_set_aggregator_as
,
1647 route_set_aggregator_as_compile
,
1648 route_set_aggregator_as_free
,
1652 /* `match ipv6 address IP_ACCESS_LIST' */
1654 static route_map_result_t
1655 route_match_ipv6_address (void *rule
, struct prefix
*prefix
,
1656 route_map_object_t type
, void *object
)
1658 struct access_list
*alist
;
1660 if (type
== RMAP_BGP
)
1662 alist
= access_list_lookup (AFI_IP6
, (char *) rule
);
1664 return RMAP_NOMATCH
;
1666 return (access_list_apply (alist
, prefix
) == FILTER_DENY
?
1667 RMAP_NOMATCH
: RMAP_MATCH
);
1669 return RMAP_NOMATCH
;
1673 route_match_ipv6_address_compile (const char *arg
)
1675 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
1679 route_match_ipv6_address_free (void *rule
)
1681 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1684 /* Route map commands for ip address matching. */
1685 struct route_map_rule_cmd route_match_ipv6_address_cmd
=
1688 route_match_ipv6_address
,
1689 route_match_ipv6_address_compile
,
1690 route_match_ipv6_address_free
1693 /* `match ipv6 next-hop IP_ADDRESS' */
1695 static route_map_result_t
1696 route_match_ipv6_next_hop (void *rule
, struct prefix
*prefix
,
1697 route_map_object_t type
, void *object
)
1699 struct in6_addr
*addr
;
1700 struct bgp_info
*bgp_info
;
1702 if (type
== RMAP_BGP
)
1707 if (IPV6_ADDR_SAME (&bgp_info
->attr
->mp_nexthop_global
, rule
))
1710 if (bgp_info
->attr
->mp_nexthop_len
== 32 &&
1711 IPV6_ADDR_SAME (&bgp_info
->attr
->mp_nexthop_local
, rule
))
1714 return RMAP_NOMATCH
;
1717 return RMAP_NOMATCH
;
1721 route_match_ipv6_next_hop_compile (const char *arg
)
1723 struct in6_addr
*address
;
1726 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in6_addr
));
1728 ret
= inet_pton (AF_INET6
, arg
, address
);
1731 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
1739 route_match_ipv6_next_hop_free (void *rule
)
1741 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1744 struct route_map_rule_cmd route_match_ipv6_next_hop_cmd
=
1747 route_match_ipv6_next_hop
,
1748 route_match_ipv6_next_hop_compile
,
1749 route_match_ipv6_next_hop_free
1752 /* `match ipv6 address prefix-list PREFIX_LIST' */
1754 static route_map_result_t
1755 route_match_ipv6_address_prefix_list (void *rule
, struct prefix
*prefix
,
1756 route_map_object_t type
, void *object
)
1758 struct prefix_list
*plist
;
1760 if (type
== RMAP_BGP
)
1762 plist
= prefix_list_lookup (AFI_IP6
, (char *) rule
);
1764 return RMAP_NOMATCH
;
1766 return (prefix_list_apply (plist
, prefix
) == PREFIX_DENY
?
1767 RMAP_NOMATCH
: RMAP_MATCH
);
1769 return RMAP_NOMATCH
;
1773 route_match_ipv6_address_prefix_list_compile (const char *arg
)
1775 return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED
, arg
);
1779 route_match_ipv6_address_prefix_list_free (void *rule
)
1781 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1784 struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd
=
1786 "ipv6 address prefix-list",
1787 route_match_ipv6_address_prefix_list
,
1788 route_match_ipv6_address_prefix_list_compile
,
1789 route_match_ipv6_address_prefix_list_free
1792 /* `set ipv6 nexthop global IP_ADDRESS' */
1794 /* Set nexthop to object. ojbect must be pointer to struct attr. */
1795 static route_map_result_t
1796 route_set_ipv6_nexthop_global (void *rule
, struct prefix
*prefix
,
1797 route_map_object_t type
, void *object
)
1799 struct in6_addr
*address
;
1800 struct bgp_info
*bgp_info
;
1802 if (type
== RMAP_BGP
)
1804 /* Fetch routemap's rule information. */
1808 /* Set next hop value. */
1809 bgp_info
->attr
->mp_nexthop_global
= *address
;
1811 /* Set nexthop length. */
1812 if (bgp_info
->attr
->mp_nexthop_len
== 0)
1813 bgp_info
->attr
->mp_nexthop_len
= 16;
1819 /* Route map `ip next-hop' compile function. Given string is converted
1820 to struct in_addr structure. */
1822 route_set_ipv6_nexthop_global_compile (const char *arg
)
1825 struct in6_addr
*address
;
1827 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in6_addr
));
1829 ret
= inet_pton (AF_INET6
, arg
, address
);
1833 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
1840 /* Free route map's compiled `ip next-hop' value. */
1842 route_set_ipv6_nexthop_global_free (void *rule
)
1844 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1847 /* Route map commands for ip nexthop set. */
1848 struct route_map_rule_cmd route_set_ipv6_nexthop_global_cmd
=
1850 "ipv6 next-hop global",
1851 route_set_ipv6_nexthop_global
,
1852 route_set_ipv6_nexthop_global_compile
,
1853 route_set_ipv6_nexthop_global_free
1856 /* `set ipv6 nexthop local IP_ADDRESS' */
1858 /* Set nexthop to object. ojbect must be pointer to struct attr. */
1859 static route_map_result_t
1860 route_set_ipv6_nexthop_local (void *rule
, struct prefix
*prefix
,
1861 route_map_object_t type
, void *object
)
1863 struct in6_addr
*address
;
1864 struct bgp_info
*bgp_info
;
1866 if (type
== RMAP_BGP
)
1868 /* Fetch routemap's rule information. */
1872 /* Set next hop value. */
1873 bgp_info
->attr
->mp_nexthop_local
= *address
;
1875 /* Set nexthop length. */
1876 if (bgp_info
->attr
->mp_nexthop_len
!= 32)
1877 bgp_info
->attr
->mp_nexthop_len
= 32;
1883 /* Route map `ip nexthop' compile function. Given string is converted
1884 to struct in_addr structure. */
1886 route_set_ipv6_nexthop_local_compile (const char *arg
)
1889 struct in6_addr
*address
;
1891 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in6_addr
));
1893 ret
= inet_pton (AF_INET6
, arg
, address
);
1897 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
1904 /* Free route map's compiled `ip nexthop' value. */
1906 route_set_ipv6_nexthop_local_free (void *rule
)
1908 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1911 /* Route map commands for ip nexthop set. */
1912 struct route_map_rule_cmd route_set_ipv6_nexthop_local_cmd
=
1914 "ipv6 next-hop local",
1915 route_set_ipv6_nexthop_local
,
1916 route_set_ipv6_nexthop_local_compile
,
1917 route_set_ipv6_nexthop_local_free
1919 #endif /* HAVE_IPV6 */
1921 /* `set vpnv4 nexthop A.B.C.D' */
1923 static route_map_result_t
1924 route_set_vpnv4_nexthop (void *rule
, struct prefix
*prefix
,
1925 route_map_object_t type
, void *object
)
1927 struct in_addr
*address
;
1928 struct bgp_info
*bgp_info
;
1930 if (type
== RMAP_BGP
)
1932 /* Fetch routemap's rule information. */
1936 /* Set next hop value. */
1937 bgp_info
->attr
->mp_nexthop_global_in
= *address
;
1944 route_set_vpnv4_nexthop_compile (const char *arg
)
1947 struct in_addr
*address
;
1949 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in_addr
));
1951 ret
= inet_aton (arg
, address
);
1955 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
1963 route_set_vpnv4_nexthop_free (void *rule
)
1965 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
1968 /* Route map commands for ip nexthop set. */
1969 struct route_map_rule_cmd route_set_vpnv4_nexthop_cmd
=
1972 route_set_vpnv4_nexthop
,
1973 route_set_vpnv4_nexthop_compile
,
1974 route_set_vpnv4_nexthop_free
1977 /* `set originator-id' */
1979 /* For origin set. */
1980 static route_map_result_t
1981 route_set_originator_id (void *rule
, struct prefix
*prefix
, route_map_object_t type
, void *object
)
1983 struct in_addr
*address
;
1984 struct bgp_info
*bgp_info
;
1986 if (type
== RMAP_BGP
)
1991 bgp_info
->attr
->flag
|= ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID
);
1992 bgp_info
->attr
->originator_id
= *address
;
1998 /* Compile function for originator-id set. */
2000 route_set_originator_id_compile (const char *arg
)
2003 struct in_addr
*address
;
2005 address
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
, sizeof (struct in_addr
));
2007 ret
= inet_aton (arg
, address
);
2011 XFREE (MTYPE_ROUTE_MAP_COMPILED
, address
);
2018 /* Compile function for originator_id set. */
2020 route_set_originator_id_free (void *rule
)
2022 XFREE (MTYPE_ROUTE_MAP_COMPILED
, rule
);
2025 /* Set metric rule structure. */
2026 struct route_map_rule_cmd route_set_originator_id_cmd
=
2029 route_set_originator_id
,
2030 route_set_originator_id_compile
,
2031 route_set_originator_id_free
,
2034 /* Add bgp route map rule. */
2036 bgp_route_match_add (struct vty
*vty
, struct route_map_index
*index
,
2037 const char *command
, const char *arg
)
2041 ret
= route_map_add_match (index
, command
, arg
);
2046 case RMAP_RULE_MISSING
:
2047 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
2050 case RMAP_COMPILE_ERROR
:
2051 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
2059 /* Delete bgp route map rule. */
2061 bgp_route_match_delete (struct vty
*vty
, struct route_map_index
*index
,
2062 const char *command
, const char *arg
)
2066 ret
= route_map_delete_match (index
, command
, arg
);
2071 case RMAP_RULE_MISSING
:
2072 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
2075 case RMAP_COMPILE_ERROR
:
2076 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
2084 /* Add bgp route map rule. */
2086 bgp_route_set_add (struct vty
*vty
, struct route_map_index
*index
,
2087 const char *command
, const char *arg
)
2091 ret
= route_map_add_set (index
, command
, arg
);
2096 case RMAP_RULE_MISSING
:
2097 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
2100 case RMAP_COMPILE_ERROR
:
2101 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
2109 /* Delete bgp route map rule. */
2111 bgp_route_set_delete (struct vty
*vty
, struct route_map_index
*index
,
2112 const char *command
, const char *arg
)
2116 ret
= route_map_delete_set (index
, command
, arg
);
2121 case RMAP_RULE_MISSING
:
2122 vty_out (vty
, "%% Can't find rule.%s", VTY_NEWLINE
);
2125 case RMAP_COMPILE_ERROR
:
2126 vty_out (vty
, "%% Argument is malformed.%s", VTY_NEWLINE
);
2134 /* Hook function for updating route_map assignment. */
2136 bgp_route_map_update (const char *unused
)
2142 struct listnode
*node
, *nnode
;
2143 struct listnode
*mnode
, *mnnode
;
2146 struct peer_group
*group
;
2147 struct bgp_filter
*filter
;
2148 struct bgp_node
*bn
;
2149 struct bgp_static
*bgp_static
;
2151 /* For neighbor route-map updates. */
2152 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
2154 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2156 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2157 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2159 filter
= &peer
->filter
[afi
][safi
];
2161 for (direct
= RMAP_IN
; direct
< RMAP_MAX
; direct
++)
2163 if (filter
->map
[direct
].name
)
2164 filter
->map
[direct
].map
=
2165 route_map_lookup_by_name (filter
->map
[direct
].name
);
2167 filter
->map
[direct
].map
= NULL
;
2170 if (filter
->usmap
.name
)
2171 filter
->usmap
.map
= route_map_lookup_by_name (filter
->usmap
.name
);
2173 filter
->usmap
.map
= NULL
;
2176 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
2178 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2179 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2181 filter
= &group
->conf
->filter
[afi
][safi
];
2183 for (direct
= RMAP_IN
; direct
< RMAP_MAX
; direct
++)
2185 if (filter
->map
[direct
].name
)
2186 filter
->map
[direct
].map
=
2187 route_map_lookup_by_name (filter
->map
[direct
].name
);
2189 filter
->map
[direct
].map
= NULL
;
2192 if (filter
->usmap
.name
)
2193 filter
->usmap
.map
= route_map_lookup_by_name (filter
->usmap
.name
);
2195 filter
->usmap
.map
= NULL
;
2200 /* For default-originate route-map updates. */
2201 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
2203 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2205 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2206 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2208 if (peer
->default_rmap
[afi
][safi
].name
)
2209 peer
->default_rmap
[afi
][safi
].map
=
2210 route_map_lookup_by_name (peer
->default_rmap
[afi
][safi
].name
);
2212 peer
->default_rmap
[afi
][safi
].map
= NULL
;
2217 /* For network route-map updates. */
2218 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
2220 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2221 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2222 for (bn
= bgp_table_top (bgp
->route
[afi
][safi
]); bn
;
2223 bn
= bgp_route_next (bn
))
2224 if ((bgp_static
= bn
->info
) != NULL
)
2226 if (bgp_static
->rmap
.name
)
2227 bgp_static
->rmap
.map
=
2228 route_map_lookup_by_name (bgp_static
->rmap
.name
);
2230 bgp_static
->rmap
.map
= NULL
;
2234 /* For redistribute route-map updates. */
2235 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
2237 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2239 if (bgp
->rmap
[ZEBRA_FAMILY_IPV4
][i
].name
)
2240 bgp
->rmap
[ZEBRA_FAMILY_IPV4
][i
].map
=
2241 route_map_lookup_by_name (bgp
->rmap
[ZEBRA_FAMILY_IPV4
][i
].name
);
2243 if (bgp
->rmap
[ZEBRA_FAMILY_IPV6
][i
].name
)
2244 bgp
->rmap
[ZEBRA_FAMILY_IPV6
][i
].map
=
2245 route_map_lookup_by_name (bgp
->rmap
[ZEBRA_FAMILY_IPV6
][i
].name
);
2246 #endif /* HAVE_IPV6 */
2253 "match peer (A.B.C.D|X:X::X:X)",
2255 "Match peer address\n"
2256 "IPv6 address of peer\n"
2257 "IP address of peer\n")
2259 return bgp_route_match_add (vty
, vty
->index
, "peer", argv
[0]);
2262 DEFUN (match_peer_local
,
2263 match_peer_local_cmd
,
2266 "Match peer address\n"
2267 "Static or Redistributed routes\n")
2269 return bgp_route_match_add (vty
, vty
->index
, "peer", NULL
);
2272 DEFUN (no_match_peer
,
2277 "Match peer address\n")
2280 return bgp_route_match_delete (vty
, vty
->index
, "peer", NULL
);
2282 return bgp_route_match_delete (vty
, vty
->index
, "peer", argv
[0]);
2285 ALIAS (no_match_peer
,
2286 no_match_peer_val_cmd
,
2287 "no match peer (A.B.C.D|X:X::X:X)",
2290 "Match peer address\n"
2291 "IPv6 address of peer\n"
2292 "IP address of peer\n")
2294 ALIAS (no_match_peer
,
2295 no_match_peer_local_cmd
,
2296 "no match peer local",
2299 "Match peer address\n"
2300 "Static or Redistributed routes\n")
2302 DEFUN (match_ip_address
,
2303 match_ip_address_cmd
,
2304 "match ip address (<1-199>|<1300-2699>|WORD)",
2307 "Match address of route\n"
2308 "IP access-list number\n"
2309 "IP access-list number (expanded range)\n"
2310 "IP Access-list name\n")
2312 return bgp_route_match_add (vty
, vty
->index
, "ip address", argv
[0]);
2315 DEFUN (no_match_ip_address
,
2316 no_match_ip_address_cmd
,
2317 "no match ip address",
2321 "Match address of route\n")
2324 return bgp_route_match_delete (vty
, vty
->index
, "ip address", NULL
);
2326 return bgp_route_match_delete (vty
, vty
->index
, "ip address", argv
[0]);
2329 ALIAS (no_match_ip_address
,
2330 no_match_ip_address_val_cmd
,
2331 "no match ip address (<1-199>|<1300-2699>|WORD)",
2335 "Match address of route\n"
2336 "IP access-list number\n"
2337 "IP access-list number (expanded range)\n"
2338 "IP Access-list name\n")
2340 DEFUN (match_ip_next_hop
,
2341 match_ip_next_hop_cmd
,
2342 "match ip next-hop (<1-199>|<1300-2699>|WORD)",
2345 "Match next-hop address of route\n"
2346 "IP access-list number\n"
2347 "IP access-list number (expanded range)\n"
2348 "IP Access-list name\n")
2350 return bgp_route_match_add (vty
, vty
->index
, "ip next-hop", argv
[0]);
2353 DEFUN (no_match_ip_next_hop
,
2354 no_match_ip_next_hop_cmd
,
2355 "no match ip next-hop",
2359 "Match next-hop address of route\n")
2362 return bgp_route_match_delete (vty
, vty
->index
, "ip next-hop", NULL
);
2364 return bgp_route_match_delete (vty
, vty
->index
, "ip next-hop", argv
[0]);
2367 ALIAS (no_match_ip_next_hop
,
2368 no_match_ip_next_hop_val_cmd
,
2369 "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
2373 "Match next-hop address of route\n"
2374 "IP access-list number\n"
2375 "IP access-list number (expanded range)\n"
2376 "IP Access-list name\n")
2378 DEFUN (match_ip_route_source
,
2379 match_ip_route_source_cmd
,
2380 "match ip route-source (<1-199>|<1300-2699>|WORD)",
2383 "Match advertising source address of route\n"
2384 "IP access-list number\n"
2385 "IP access-list number (expanded range)\n"
2386 "IP standard access-list name\n")
2388 return bgp_route_match_add (vty
, vty
->index
, "ip route-source", argv
[0]);
2391 DEFUN (no_match_ip_route_source
,
2392 no_match_ip_route_source_cmd
,
2393 "no match ip route-source",
2397 "Match advertising source address of route\n")
2400 return bgp_route_match_delete (vty
, vty
->index
, "ip route-source", NULL
);
2402 return bgp_route_match_delete (vty
, vty
->index
, "ip route-source", argv
[0]);
2405 ALIAS (no_match_ip_route_source
,
2406 no_match_ip_route_source_val_cmd
,
2407 "no match ip route-source (<1-199>|<1300-2699>|WORD)",
2411 "Match advertising source address of route\n"
2412 "IP access-list number\n"
2413 "IP access-list number (expanded range)\n"
2414 "IP standard access-list name\n");
2416 DEFUN (match_ip_address_prefix_list
,
2417 match_ip_address_prefix_list_cmd
,
2418 "match ip address prefix-list WORD",
2421 "Match address of route\n"
2422 "Match entries of prefix-lists\n"
2423 "IP prefix-list name\n")
2425 return bgp_route_match_add (vty
, vty
->index
, "ip address prefix-list", argv
[0]);
2428 DEFUN (no_match_ip_address_prefix_list
,
2429 no_match_ip_address_prefix_list_cmd
,
2430 "no match ip address prefix-list",
2434 "Match address of route\n"
2435 "Match entries of prefix-lists\n")
2438 return bgp_route_match_delete (vty
, vty
->index
, "ip address prefix-list", NULL
);
2440 return bgp_route_match_delete (vty
, vty
->index
, "ip address prefix-list", argv
[0]);
2443 ALIAS (no_match_ip_address_prefix_list
,
2444 no_match_ip_address_prefix_list_val_cmd
,
2445 "no match ip address prefix-list WORD",
2449 "Match address of route\n"
2450 "Match entries of prefix-lists\n"
2451 "IP prefix-list name\n")
2453 DEFUN (match_ip_next_hop_prefix_list
,
2454 match_ip_next_hop_prefix_list_cmd
,
2455 "match ip next-hop prefix-list WORD",
2458 "Match next-hop address of route\n"
2459 "Match entries of prefix-lists\n"
2460 "IP prefix-list name\n")
2462 return bgp_route_match_add (vty
, vty
->index
, "ip next-hop prefix-list", argv
[0]);
2465 DEFUN (no_match_ip_next_hop_prefix_list
,
2466 no_match_ip_next_hop_prefix_list_cmd
,
2467 "no match ip next-hop prefix-list",
2471 "Match next-hop address of route\n"
2472 "Match entries of prefix-lists\n")
2475 return bgp_route_match_delete (vty
, vty
->index
, "ip next-hop prefix-list", NULL
);
2477 return bgp_route_match_delete (vty
, vty
->index
, "ip next-hop prefix-list", argv
[0]);
2480 ALIAS (no_match_ip_next_hop_prefix_list
,
2481 no_match_ip_next_hop_prefix_list_val_cmd
,
2482 "no match ip next-hop prefix-list WORD",
2486 "Match next-hop address of route\n"
2487 "Match entries of prefix-lists\n"
2488 "IP prefix-list name\n")
2490 DEFUN (match_ip_route_source_prefix_list
,
2491 match_ip_route_source_prefix_list_cmd
,
2492 "match ip route-source prefix-list WORD",
2495 "Match advertising source address of route\n"
2496 "Match entries of prefix-lists\n"
2497 "IP prefix-list name\n")
2499 return bgp_route_match_add (vty
, vty
->index
, "ip route-source prefix-list", argv
[0]);
2502 DEFUN (no_match_ip_route_source_prefix_list
,
2503 no_match_ip_route_source_prefix_list_cmd
,
2504 "no match ip route-source prefix-list",
2508 "Match advertising source address of route\n"
2509 "Match entries of prefix-lists\n")
2512 return bgp_route_match_delete (vty
, vty
->index
, "ip route-source prefix-list", NULL
);
2514 return bgp_route_match_delete (vty
, vty
->index
, "ip route-source prefix-list", argv
[0]);
2517 ALIAS (no_match_ip_route_source_prefix_list
,
2518 no_match_ip_route_source_prefix_list_val_cmd
,
2519 "no match ip route-source prefix-list WORD",
2523 "Match advertising source address of route\n"
2524 "Match entries of prefix-lists\n"
2525 "IP prefix-list name\n");
2527 DEFUN (match_metric
,
2529 "match metric <0-4294967295>",
2531 "Match metric of route\n"
2534 return bgp_route_match_add (vty
, vty
->index
, "metric", argv
[0]);
2537 DEFUN (no_match_metric
,
2538 no_match_metric_cmd
,
2542 "Match metric of route\n")
2545 return bgp_route_match_delete (vty
, vty
->index
, "metric", NULL
);
2547 return bgp_route_match_delete (vty
, vty
->index
, "metric", argv
[0]);
2550 ALIAS (no_match_metric
,
2551 no_match_metric_val_cmd
,
2552 "no match metric <0-4294967295>",
2555 "Match metric of route\n"
2558 DEFUN (match_community
,
2559 match_community_cmd
,
2560 "match community (<1-99>|<100-500>|WORD)",
2562 "Match BGP community list\n"
2563 "Community-list number (standard)\n"
2564 "Community-list number (expanded)\n"
2565 "Community-list name\n")
2567 return bgp_route_match_add (vty
, vty
->index
, "community", argv
[0]);
2570 DEFUN (match_community_exact
,
2571 match_community_exact_cmd
,
2572 "match community (<1-99>|<100-500>|WORD) exact-match",
2574 "Match BGP community list\n"
2575 "Community-list number (standard)\n"
2576 "Community-list number (expanded)\n"
2577 "Community-list name\n"
2578 "Do exact matching of communities\n")
2583 argstr
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
,
2584 strlen (argv
[0]) + strlen ("exact-match") + 2);
2586 sprintf (argstr
, "%s exact-match", argv
[0]);
2588 ret
= bgp_route_match_add (vty
, vty
->index
, "community", argstr
);
2590 XFREE (MTYPE_ROUTE_MAP_COMPILED
, argstr
);
2595 DEFUN (no_match_community
,
2596 no_match_community_cmd
,
2597 "no match community",
2600 "Match BGP community list\n")
2602 return bgp_route_match_delete (vty
, vty
->index
, "community", NULL
);
2605 ALIAS (no_match_community
,
2606 no_match_community_val_cmd
,
2607 "no match community (<1-99>|<100-500>|WORD)",
2610 "Match BGP community list\n"
2611 "Community-list number (standard)\n"
2612 "Community-list number (expanded)\n"
2613 "Community-list name\n")
2615 ALIAS (no_match_community
,
2616 no_match_community_exact_cmd
,
2617 "no match community (<1-99>|<100-500>|WORD) exact-match",
2620 "Match BGP community list\n"
2621 "Community-list number (standard)\n"
2622 "Community-list number (expanded)\n"
2623 "Community-list name\n"
2624 "Do exact matching of communities\n")
2626 DEFUN (match_ecommunity
,
2627 match_ecommunity_cmd
,
2628 "match extcommunity (<1-99>|<100-500>|WORD)",
2630 "Match BGP/VPN extended community list\n"
2631 "Extended community-list number (standard)\n"
2632 "Extended community-list number (expanded)\n"
2633 "Extended community-list name\n")
2635 return bgp_route_match_add (vty
, vty
->index
, "extcommunity", argv
[0]);
2638 DEFUN (no_match_ecommunity
,
2639 no_match_ecommunity_cmd
,
2640 "no match extcommunity",
2643 "Match BGP/VPN extended community list\n")
2645 return bgp_route_match_delete (vty
, vty
->index
, "extcommunity", NULL
);
2648 ALIAS (no_match_ecommunity
,
2649 no_match_ecommunity_val_cmd
,
2650 "no match extcommunity (<1-99>|<100-500>|WORD)",
2653 "Match BGP/VPN extended community list\n"
2654 "Extended community-list number (standard)\n"
2655 "Extended community-list number (expanded)\n"
2656 "Extended community-list name\n")
2658 DEFUN (match_aspath
,
2660 "match as-path WORD",
2662 "Match BGP AS path list\n"
2663 "AS path access-list name\n")
2665 return bgp_route_match_add (vty
, vty
->index
, "as-path", argv
[0]);
2668 DEFUN (no_match_aspath
,
2669 no_match_aspath_cmd
,
2673 "Match BGP AS path list\n")
2675 return bgp_route_match_delete (vty
, vty
->index
, "as-path", NULL
);
2678 ALIAS (no_match_aspath
,
2679 no_match_aspath_val_cmd
,
2680 "no match as-path WORD",
2683 "Match BGP AS path list\n"
2684 "AS path access-list name\n")
2686 DEFUN (match_origin
,
2688 "match origin (egp|igp|incomplete)",
2693 "unknown heritage\n")
2695 if (strncmp (argv
[0], "igp", 2) == 0)
2696 return bgp_route_match_add (vty
, vty
->index
, "origin", "igp");
2697 if (strncmp (argv
[0], "egp", 1) == 0)
2698 return bgp_route_match_add (vty
, vty
->index
, "origin", "egp");
2699 if (strncmp (argv
[0], "incomplete", 2) == 0)
2700 return bgp_route_match_add (vty
, vty
->index
, "origin", "incomplete");
2705 DEFUN (no_match_origin
,
2706 no_match_origin_cmd
,
2710 "BGP origin code\n")
2712 return bgp_route_match_delete (vty
, vty
->index
, "origin", NULL
);
2715 ALIAS (no_match_origin
,
2716 no_match_origin_val_cmd
,
2717 "no match origin (egp|igp|incomplete)",
2723 "unknown heritage\n")
2725 DEFUN (set_ip_nexthop
,
2727 "set ip next-hop A.B.C.D",
2730 "Next hop address\n"
2731 "IP address of next hop\n")
2736 ret
= str2sockunion (argv
[0], &su
);
2739 vty_out (vty
, "%% Malformed Next-hop address%s", VTY_NEWLINE
);
2743 return bgp_route_set_add (vty
, vty
->index
, "ip next-hop", argv
[0]);
2746 DEFUN (set_ip_nexthop_peer
,
2747 set_ip_nexthop_peer_cmd
,
2748 "set ip next-hop peer-address",
2751 "Next hop address\n"
2752 "Use peer address (for BGP only)\n")
2754 return bgp_route_set_add (vty
, vty
->index
, "ip next-hop", "peer-address");
2757 DEFUN_DEPRECATED (no_set_ip_nexthop_peer
,
2758 no_set_ip_nexthop_peer_cmd
,
2759 "no set ip next-hop peer-address",
2763 "Next hop address\n"
2764 "Use peer address (for BGP only)\n")
2766 return bgp_route_set_delete (vty
, vty
->index
, "ip next-hop", NULL
);
2770 DEFUN (no_set_ip_nexthop
,
2771 no_set_ip_nexthop_cmd
,
2772 "no set ip next-hop",
2775 "Next hop address\n")
2778 return bgp_route_set_delete (vty
, vty
->index
, "ip next-hop", NULL
);
2780 return bgp_route_set_delete (vty
, vty
->index
, "ip next-hop", argv
[0]);
2783 ALIAS (no_set_ip_nexthop
,
2784 no_set_ip_nexthop_val_cmd
,
2785 "no set ip next-hop A.B.C.D",
2789 "Next hop address\n"
2790 "IP address of next hop\n")
2794 "set metric <0-4294967295>",
2796 "Metric value for destination routing protocol\n"
2799 return bgp_route_set_add (vty
, vty
->index
, "metric", argv
[0]);
2803 set_metric_addsub_cmd
,
2804 "set metric <+/-metric>",
2806 "Metric value for destination routing protocol\n"
2807 "Add or subtract metric\n")
2809 DEFUN (no_set_metric
,
2814 "Metric value for destination routing protocol\n")
2817 return bgp_route_set_delete (vty
, vty
->index
, "metric", NULL
);
2819 return bgp_route_set_delete (vty
, vty
->index
, "metric", argv
[0]);
2822 ALIAS (no_set_metric
,
2823 no_set_metric_val_cmd
,
2824 "no set metric <0-4294967295>",
2827 "Metric value for destination routing protocol\n"
2830 DEFUN (set_local_pref
,
2832 "set local-preference <0-4294967295>",
2834 "BGP local preference path attribute\n"
2835 "Preference value\n")
2837 return bgp_route_set_add (vty
, vty
->index
, "local-preference", argv
[0]);
2840 DEFUN (no_set_local_pref
,
2841 no_set_local_pref_cmd
,
2842 "no set local-preference",
2845 "BGP local preference path attribute\n")
2848 return bgp_route_set_delete (vty
, vty
->index
, "local-preference", NULL
);
2850 return bgp_route_set_delete (vty
, vty
->index
, "local-preference", argv
[0]);
2853 ALIAS (no_set_local_pref
,
2854 no_set_local_pref_val_cmd
,
2855 "no set local-preference <0-4294967295>",
2858 "BGP local preference path attribute\n"
2859 "Preference value\n")
2863 "set weight <0-4294967295>",
2865 "BGP weight for routing table\n"
2868 return bgp_route_set_add (vty
, vty
->index
, "weight", argv
[0]);
2871 DEFUN (no_set_weight
,
2876 "BGP weight for routing table\n")
2879 return bgp_route_set_delete (vty
, vty
->index
, "weight", NULL
);
2881 return bgp_route_set_delete (vty
, vty
->index
, "weight", argv
[0]);
2884 ALIAS (no_set_weight
,
2885 no_set_weight_val_cmd
,
2886 "no set weight <0-4294967295>",
2889 "BGP weight for routing table\n"
2892 DEFUN (set_aspath_prepend
,
2893 set_aspath_prepend_cmd
,
2894 "set as-path prepend .<1-65535>",
2896 "Prepend string for a BGP AS-path attribute\n"
2897 "Prepend to the as-path\n"
2903 str
= argv_concat (argv
, argc
, 0);
2904 ret
= bgp_route_set_add (vty
, vty
->index
, "as-path prepend", str
);
2905 XFREE (MTYPE_TMP
, str
);
2910 DEFUN (no_set_aspath_prepend
,
2911 no_set_aspath_prepend_cmd
,
2912 "no set as-path prepend",
2915 "Prepend string for a BGP AS-path attribute\n"
2916 "Prepend to the as-path\n")
2918 return bgp_route_set_delete (vty
, vty
->index
, "as-path prepend", NULL
);
2921 ALIAS (no_set_aspath_prepend
,
2922 no_set_aspath_prepend_val_cmd
,
2923 "no set as-path prepend .<1-65535>",
2926 "Prepend string for a BGP AS-path attribute\n"
2927 "Prepend to the as-path\n"
2930 DEFUN (set_community
,
2932 "set community .AA:NN",
2934 "BGP community attribute\n"
2935 "Community number in aa:nn format or local-AS|no-advertise|no-export|internet or additive\n")
2941 struct community
*com
= NULL
;
2946 b
= buffer_new (1024);
2948 for (i
= 0; i
< argc
; i
++)
2950 if (strncmp (argv
[i
], "additive", strlen (argv
[i
])) == 0)
2957 buffer_putc (b
, ' ');
2961 if (strncmp (argv
[i
], "internet", strlen (argv
[i
])) == 0)
2963 buffer_putstr (b
, "internet");
2966 if (strncmp (argv
[i
], "local-AS", strlen (argv
[i
])) == 0)
2968 buffer_putstr (b
, "local-AS");
2971 if (strncmp (argv
[i
], "no-a", strlen ("no-a")) == 0
2972 && strncmp (argv
[i
], "no-advertise", strlen (argv
[i
])) == 0)
2974 buffer_putstr (b
, "no-advertise");
2977 if (strncmp (argv
[i
], "no-e", strlen ("no-e"))== 0
2978 && strncmp (argv
[i
], "no-export", strlen (argv
[i
])) == 0)
2980 buffer_putstr (b
, "no-export");
2983 buffer_putstr (b
, argv
[i
]);
2985 buffer_putc (b
, '\0');
2987 /* Fetch result string then compile it to communities attribute. */
2988 str
= buffer_getstr (b
);
2993 com
= community_str2com (str
);
2994 XFREE (MTYPE_TMP
, str
);
2997 /* Can't compile user input into communities attribute. */
3000 vty_out (vty
, "%% Malformed communities attribute%s", VTY_NEWLINE
);
3004 /* Set communites attribute string. */
3005 str
= community_str (com
);
3009 argstr
= XCALLOC (MTYPE_TMP
, strlen (str
) + strlen (" additive") + 1);
3010 strcpy (argstr
, str
);
3011 strcpy (argstr
+ strlen (str
), " additive");
3012 ret
= bgp_route_set_add (vty
, vty
->index
, "community", argstr
);
3013 XFREE (MTYPE_TMP
, argstr
);
3016 ret
= bgp_route_set_add (vty
, vty
->index
, "community", str
);
3018 community_free (com
);
3023 DEFUN (set_community_none
,
3024 set_community_none_cmd
,
3025 "set community none",
3027 "BGP community attribute\n"
3028 "No community attribute\n")
3030 return bgp_route_set_add (vty
, vty
->index
, "community", "none");
3033 DEFUN (no_set_community
,
3034 no_set_community_cmd
,
3038 "BGP community attribute\n")
3040 return bgp_route_set_delete (vty
, vty
->index
, "community", NULL
);
3043 ALIAS (no_set_community
,
3044 no_set_community_val_cmd
,
3045 "no set community .AA:NN",
3048 "BGP community attribute\n"
3049 "Community number in aa:nn format or local-AS|no-advertise|no-export|internet or additive\n")
3051 ALIAS (no_set_community
,
3052 no_set_community_none_cmd
,
3053 "no set community none",
3056 "BGP community attribute\n"
3057 "No community attribute\n")
3059 DEFUN (set_community_delete
,
3060 set_community_delete_cmd
,
3061 "set comm-list (<1-99>|<100-500>|WORD) delete",
3063 "set BGP community list (for deletion)\n"
3064 "Community-list number (standard)\n"
3065 "Communitly-list number (expanded)\n"
3066 "Community-list name\n"
3067 "Delete matching communities\n")
3071 str
= XCALLOC (MTYPE_TMP
, strlen (argv
[0]) + strlen (" delete") + 1);
3072 strcpy (str
, argv
[0]);
3073 strcpy (str
+ strlen (argv
[0]), " delete");
3075 bgp_route_set_add (vty
, vty
->index
, "comm-list", str
);
3077 XFREE (MTYPE_TMP
, str
);
3081 DEFUN (no_set_community_delete
,
3082 no_set_community_delete_cmd
,
3086 "set BGP community list (for deletion)\n")
3088 return bgp_route_set_delete (vty
, vty
->index
, "comm-list", NULL
);
3091 ALIAS (no_set_community_delete
,
3092 no_set_community_delete_val_cmd
,
3093 "no set comm-list (<1-99>|<100-500>|WORD) delete",
3096 "set BGP community list (for deletion)\n"
3097 "Community-list number (standard)\n"
3098 "Communitly-list number (expanded)\n"
3099 "Community-list name\n"
3100 "Delete matching communities\n")
3102 DEFUN (set_ecommunity_rt
,
3103 set_ecommunity_rt_cmd
,
3104 "set extcommunity rt .ASN:nn_or_IP-address:nn",
3106 "BGP extended community attribute\n"
3107 "Route Target extened communityt\n"
3108 "VPN extended community\n")
3113 str
= argv_concat (argv
, argc
, 0);
3114 ret
= bgp_route_set_add (vty
, vty
->index
, "extcommunity rt", str
);
3115 XFREE (MTYPE_TMP
, str
);
3120 DEFUN (no_set_ecommunity_rt
,
3121 no_set_ecommunity_rt_cmd
,
3122 "no set extcommunity rt",
3125 "BGP extended community attribute\n"
3126 "Route Target extened communityt\n")
3128 return bgp_route_set_delete (vty
, vty
->index
, "extcommunity rt", NULL
);
3131 ALIAS (no_set_ecommunity_rt
,
3132 no_set_ecommunity_rt_val_cmd
,
3133 "no set extcommunity rt .ASN:nn_or_IP-address:nn",
3136 "BGP extended community attribute\n"
3137 "Route Target extened communityt\n"
3138 "VPN extended community\n")
3140 DEFUN (set_ecommunity_soo
,
3141 set_ecommunity_soo_cmd
,
3142 "set extcommunity soo .ASN:nn_or_IP-address:nn",
3144 "BGP extended community attribute\n"
3145 "Site-of-Origin extended community\n"
3146 "VPN extended community\n")
3151 str
= argv_concat (argv
, argc
, 0);
3152 ret
= bgp_route_set_add (vty
, vty
->index
, "extcommunity soo", str
);
3153 XFREE (MTYPE_TMP
, str
);
3157 DEFUN (no_set_ecommunity_soo
,
3158 no_set_ecommunity_soo_cmd
,
3159 "no set extcommunity soo",
3162 "BGP extended community attribute\n"
3163 "Site-of-Origin extended community\n")
3165 return bgp_route_set_delete (vty
, vty
->index
, "extcommunity soo", NULL
);
3168 ALIAS (no_set_ecommunity_soo
,
3169 no_set_ecommunity_soo_val_cmd
,
3170 "no set extcommunity soo .ASN:nn_or_IP-address:nn",
3173 "BGP extended community attribute\n"
3174 "Site-of-Origin extended community\n"
3175 "VPN extended community\n")
3179 "set origin (egp|igp|incomplete)",
3184 "unknown heritage\n")
3186 if (strncmp (argv
[0], "igp", 2) == 0)
3187 return bgp_route_set_add (vty
, vty
->index
, "origin", "igp");
3188 if (strncmp (argv
[0], "egp", 1) == 0)
3189 return bgp_route_set_add (vty
, vty
->index
, "origin", "egp");
3190 if (strncmp (argv
[0], "incomplete", 2) == 0)
3191 return bgp_route_set_add (vty
, vty
->index
, "origin", "incomplete");
3196 DEFUN (no_set_origin
,
3201 "BGP origin code\n")
3203 return bgp_route_set_delete (vty
, vty
->index
, "origin", NULL
);
3206 ALIAS (no_set_origin
,
3207 no_set_origin_val_cmd
,
3208 "no set origin (egp|igp|incomplete)",
3214 "unknown heritage\n")
3216 DEFUN (set_atomic_aggregate
,
3217 set_atomic_aggregate_cmd
,
3218 "set atomic-aggregate",
3220 "BGP atomic aggregate attribute\n" )
3222 return bgp_route_set_add (vty
, vty
->index
, "atomic-aggregate", NULL
);
3225 DEFUN (no_set_atomic_aggregate
,
3226 no_set_atomic_aggregate_cmd
,
3227 "no set atomic-aggregate",
3230 "BGP atomic aggregate attribute\n" )
3232 return bgp_route_set_delete (vty
, vty
->index
, "atomic-aggregate", NULL
);
3235 DEFUN (set_aggregator_as
,
3236 set_aggregator_as_cmd
,
3237 "set aggregator as <1-65535> A.B.C.D",
3239 "BGP aggregator attribute\n"
3240 "AS number of aggregator\n"
3242 "IP address of aggregator\n")
3246 struct in_addr address
;
3249 VTY_GET_INTEGER_RANGE ("AS Path", as
, argv
[0], 1, BGP_AS_MAX
);
3251 ret
= inet_aton (argv
[1], &address
);
3254 vty_out (vty
, "Aggregator IP address is invalid%s", VTY_NEWLINE
);
3258 argstr
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
,
3259 strlen (argv
[0]) + strlen (argv
[1]) + 2);
3261 sprintf (argstr
, "%s %s", argv
[0], argv
[1]);
3263 ret
= bgp_route_set_add (vty
, vty
->index
, "aggregator as", argstr
);
3265 XFREE (MTYPE_ROUTE_MAP_COMPILED
, argstr
);
3270 DEFUN (no_set_aggregator_as
,
3271 no_set_aggregator_as_cmd
,
3272 "no set aggregator as",
3275 "BGP aggregator attribute\n"
3276 "AS number of aggregator\n")
3280 struct in_addr address
;
3284 return bgp_route_set_delete (vty
, vty
->index
, "aggregator as", NULL
);
3286 VTY_GET_INTEGER_RANGE ("AS Path", as
, argv
[0], 1, BGP_AS_MAX
);
3288 ret
= inet_aton (argv
[1], &address
);
3291 vty_out (vty
, "Aggregator IP address is invalid%s", VTY_NEWLINE
);
3295 argstr
= XMALLOC (MTYPE_ROUTE_MAP_COMPILED
,
3296 strlen (argv
[0]) + strlen (argv
[1]) + 2);
3298 sprintf (argstr
, "%s %s", argv
[0], argv
[1]);
3300 ret
= bgp_route_set_delete (vty
, vty
->index
, "aggregator as", argstr
);
3302 XFREE (MTYPE_ROUTE_MAP_COMPILED
, argstr
);
3307 ALIAS (no_set_aggregator_as
,
3308 no_set_aggregator_as_val_cmd
,
3309 "no set aggregator as <1-65535> A.B.C.D",
3312 "BGP aggregator attribute\n"
3313 "AS number of aggregator\n"
3315 "IP address of aggregator\n")
3319 DEFUN (match_ipv6_address
,
3320 match_ipv6_address_cmd
,
3321 "match ipv6 address WORD",
3324 "Match IPv6 address of route\n"
3325 "IPv6 access-list name\n")
3327 return bgp_route_match_add (vty
, vty
->index
, "ipv6 address", argv
[0]);
3330 DEFUN (no_match_ipv6_address
,
3331 no_match_ipv6_address_cmd
,
3332 "no match ipv6 address WORD",
3336 "Match IPv6 address of route\n"
3337 "IPv6 access-list name\n")
3339 return bgp_route_match_delete (vty
, vty
->index
, "ipv6 address", argv
[0]);
3342 DEFUN (match_ipv6_next_hop
,
3343 match_ipv6_next_hop_cmd
,
3344 "match ipv6 next-hop X:X::X:X",
3347 "Match IPv6 next-hop address of route\n"
3348 "IPv6 address of next hop\n")
3350 return bgp_route_match_add (vty
, vty
->index
, "ipv6 next-hop", argv
[0]);
3353 DEFUN (no_match_ipv6_next_hop
,
3354 no_match_ipv6_next_hop_cmd
,
3355 "no match ipv6 next-hop X:X::X:X",
3359 "Match IPv6 next-hop address of route\n"
3360 "IPv6 address of next hop\n")
3362 return bgp_route_match_delete (vty
, vty
->index
, "ipv6 next-hop", argv
[0]);
3365 DEFUN (match_ipv6_address_prefix_list
,
3366 match_ipv6_address_prefix_list_cmd
,
3367 "match ipv6 address prefix-list WORD",
3370 "Match address of route\n"
3371 "Match entries of prefix-lists\n"
3372 "IP prefix-list name\n")
3374 return bgp_route_match_add (vty
, vty
->index
, "ipv6 address prefix-list", argv
[0]);
3377 DEFUN (no_match_ipv6_address_prefix_list
,
3378 no_match_ipv6_address_prefix_list_cmd
,
3379 "no match ipv6 address prefix-list WORD",
3383 "Match address of route\n"
3384 "Match entries of prefix-lists\n"
3385 "IP prefix-list name\n")
3387 return bgp_route_match_delete (vty
, vty
->index
, "ipv6 address prefix-list", argv
[0]);
3390 DEFUN (set_ipv6_nexthop_global
,
3391 set_ipv6_nexthop_global_cmd
,
3392 "set ipv6 next-hop global X:X::X:X",
3395 "IPv6 next-hop address\n"
3396 "IPv6 global address\n"
3397 "IPv6 address of next hop\n")
3399 return bgp_route_set_add (vty
, vty
->index
, "ipv6 next-hop global", argv
[0]);
3402 DEFUN (no_set_ipv6_nexthop_global
,
3403 no_set_ipv6_nexthop_global_cmd
,
3404 "no set ipv6 next-hop global",
3408 "IPv6 next-hop address\n"
3409 "IPv6 global address\n")
3412 return bgp_route_set_delete (vty
, vty
->index
, "ipv6 next-hop global", NULL
);
3414 return bgp_route_set_delete (vty
, vty
->index
, "ipv6 next-hop global", argv
[0]);
3417 ALIAS (no_set_ipv6_nexthop_global
,
3418 no_set_ipv6_nexthop_global_val_cmd
,
3419 "no set ipv6 next-hop global X:X::X:X",
3423 "IPv6 next-hop address\n"
3424 "IPv6 global address\n"
3425 "IPv6 address of next hop\n")
3427 DEFUN (set_ipv6_nexthop_local
,
3428 set_ipv6_nexthop_local_cmd
,
3429 "set ipv6 next-hop local X:X::X:X",
3432 "IPv6 next-hop address\n"
3433 "IPv6 local address\n"
3434 "IPv6 address of next hop\n")
3436 return bgp_route_set_add (vty
, vty
->index
, "ipv6 next-hop local", argv
[0]);
3439 DEFUN (no_set_ipv6_nexthop_local
,
3440 no_set_ipv6_nexthop_local_cmd
,
3441 "no set ipv6 next-hop local",
3445 "IPv6 next-hop address\n"
3446 "IPv6 local address\n")
3449 return bgp_route_set_delete (vty
, vty
->index
, "ipv6 next-hop local", NULL
);
3451 return bgp_route_set_delete (vty
, vty
->index
, "ipv6 next-hop local", argv
[0]);
3454 ALIAS (no_set_ipv6_nexthop_local
,
3455 no_set_ipv6_nexthop_local_val_cmd
,
3456 "no set ipv6 next-hop local X:X::X:X",
3460 "IPv6 next-hop address\n"
3461 "IPv6 local address\n"
3462 "IPv6 address of next hop\n")
3463 #endif /* HAVE_IPV6 */
3465 DEFUN (set_vpnv4_nexthop
,
3466 set_vpnv4_nexthop_cmd
,
3467 "set vpnv4 next-hop A.B.C.D",
3469 "VPNv4 information\n"
3470 "VPNv4 next-hop address\n"
3471 "IP address of next hop\n")
3473 return bgp_route_set_add (vty
, vty
->index
, "vpnv4 next-hop", argv
[0]);
3476 DEFUN (no_set_vpnv4_nexthop
,
3477 no_set_vpnv4_nexthop_cmd
,
3478 "no set vpnv4 next-hop",
3481 "VPNv4 information\n"
3482 "VPNv4 next-hop address\n")
3485 return bgp_route_set_delete (vty
, vty
->index
, "vpnv4 next-hop", NULL
);
3487 return bgp_route_set_delete (vty
, vty
->index
, "vpnv4 next-hop", argv
[0]);
3490 ALIAS (no_set_vpnv4_nexthop
,
3491 no_set_vpnv4_nexthop_val_cmd
,
3492 "no set vpnv4 next-hop A.B.C.D",
3495 "VPNv4 information\n"
3496 "VPNv4 next-hop address\n"
3497 "IP address of next hop\n")
3499 DEFUN (set_originator_id
,
3500 set_originator_id_cmd
,
3501 "set originator-id A.B.C.D",
3503 "BGP originator ID attribute\n"
3504 "IP address of originator\n")
3506 return bgp_route_set_add (vty
, vty
->index
, "originator-id", argv
[0]);
3509 DEFUN (no_set_originator_id
,
3510 no_set_originator_id_cmd
,
3511 "no set originator-id",
3514 "BGP originator ID attribute\n")
3517 return bgp_route_set_delete (vty
, vty
->index
, "originator-id", NULL
);
3519 return bgp_route_set_delete (vty
, vty
->index
, "originator-id", argv
[0]);
3522 ALIAS (no_set_originator_id
,
3523 no_set_originator_id_val_cmd
,
3524 "no set originator-id A.B.C.D",
3527 "BGP originator ID attribute\n"
3528 "IP address of originator\n")
3531 /* Initialization of route map. */
3533 bgp_route_map_init (void)
3536 route_map_init_vty ();
3537 route_map_add_hook (bgp_route_map_update
);
3538 route_map_delete_hook (bgp_route_map_update
);
3540 route_map_install_match (&route_match_peer_cmd
);
3541 route_map_install_match (&route_match_ip_address_cmd
);
3542 route_map_install_match (&route_match_ip_next_hop_cmd
);
3543 route_map_install_match (&route_match_ip_route_source_cmd
);
3544 route_map_install_match (&route_match_ip_address_prefix_list_cmd
);
3545 route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd
);
3546 route_map_install_match (&route_match_ip_route_source_prefix_list_cmd
);
3547 route_map_install_match (&route_match_aspath_cmd
);
3548 route_map_install_match (&route_match_community_cmd
);
3549 route_map_install_match (&route_match_ecommunity_cmd
);
3550 route_map_install_match (&route_match_metric_cmd
);
3551 route_map_install_match (&route_match_origin_cmd
);
3553 route_map_install_set (&route_set_ip_nexthop_cmd
);
3554 route_map_install_set (&route_set_local_pref_cmd
);
3555 route_map_install_set (&route_set_weight_cmd
);
3556 route_map_install_set (&route_set_metric_cmd
);
3557 route_map_install_set (&route_set_aspath_prepend_cmd
);
3558 route_map_install_set (&route_set_origin_cmd
);
3559 route_map_install_set (&route_set_atomic_aggregate_cmd
);
3560 route_map_install_set (&route_set_aggregator_as_cmd
);
3561 route_map_install_set (&route_set_community_cmd
);
3562 route_map_install_set (&route_set_community_delete_cmd
);
3563 route_map_install_set (&route_set_vpnv4_nexthop_cmd
);
3564 route_map_install_set (&route_set_originator_id_cmd
);
3565 route_map_install_set (&route_set_ecommunity_rt_cmd
);
3566 route_map_install_set (&route_set_ecommunity_soo_cmd
);
3568 install_element (RMAP_NODE
, &match_peer_cmd
);
3569 install_element (RMAP_NODE
, &match_peer_local_cmd
);
3570 install_element (RMAP_NODE
, &no_match_peer_cmd
);
3571 install_element (RMAP_NODE
, &no_match_peer_val_cmd
);
3572 install_element (RMAP_NODE
, &no_match_peer_local_cmd
);
3573 install_element (RMAP_NODE
, &match_ip_address_cmd
);
3574 install_element (RMAP_NODE
, &no_match_ip_address_cmd
);
3575 install_element (RMAP_NODE
, &no_match_ip_address_val_cmd
);
3576 install_element (RMAP_NODE
, &match_ip_next_hop_cmd
);
3577 install_element (RMAP_NODE
, &no_match_ip_next_hop_cmd
);
3578 install_element (RMAP_NODE
, &no_match_ip_next_hop_val_cmd
);
3579 install_element (RMAP_NODE
, &match_ip_route_source_cmd
);
3580 install_element (RMAP_NODE
, &no_match_ip_route_source_cmd
);
3581 install_element (RMAP_NODE
, &no_match_ip_route_source_val_cmd
);
3583 install_element (RMAP_NODE
, &match_ip_address_prefix_list_cmd
);
3584 install_element (RMAP_NODE
, &no_match_ip_address_prefix_list_cmd
);
3585 install_element (RMAP_NODE
, &no_match_ip_address_prefix_list_val_cmd
);
3586 install_element (RMAP_NODE
, &match_ip_next_hop_prefix_list_cmd
);
3587 install_element (RMAP_NODE
, &no_match_ip_next_hop_prefix_list_cmd
);
3588 install_element (RMAP_NODE
, &no_match_ip_next_hop_prefix_list_val_cmd
);
3589 install_element (RMAP_NODE
, &match_ip_route_source_prefix_list_cmd
);
3590 install_element (RMAP_NODE
, &no_match_ip_route_source_prefix_list_cmd
);
3591 install_element (RMAP_NODE
, &no_match_ip_route_source_prefix_list_val_cmd
);
3593 install_element (RMAP_NODE
, &match_aspath_cmd
);
3594 install_element (RMAP_NODE
, &no_match_aspath_cmd
);
3595 install_element (RMAP_NODE
, &no_match_aspath_val_cmd
);
3596 install_element (RMAP_NODE
, &match_metric_cmd
);
3597 install_element (RMAP_NODE
, &no_match_metric_cmd
);
3598 install_element (RMAP_NODE
, &no_match_metric_val_cmd
);
3599 install_element (RMAP_NODE
, &match_community_cmd
);
3600 install_element (RMAP_NODE
, &match_community_exact_cmd
);
3601 install_element (RMAP_NODE
, &no_match_community_cmd
);
3602 install_element (RMAP_NODE
, &no_match_community_val_cmd
);
3603 install_element (RMAP_NODE
, &no_match_community_exact_cmd
);
3604 install_element (RMAP_NODE
, &match_ecommunity_cmd
);
3605 install_element (RMAP_NODE
, &no_match_ecommunity_cmd
);
3606 install_element (RMAP_NODE
, &no_match_ecommunity_val_cmd
);
3607 install_element (RMAP_NODE
, &match_origin_cmd
);
3608 install_element (RMAP_NODE
, &no_match_origin_cmd
);
3609 install_element (RMAP_NODE
, &no_match_origin_val_cmd
);
3611 install_element (RMAP_NODE
, &set_ip_nexthop_cmd
);
3612 install_element (RMAP_NODE
, &set_ip_nexthop_peer_cmd
);
3613 install_element (RMAP_NODE
, &no_set_ip_nexthop_cmd
);
3614 install_element (RMAP_NODE
, &no_set_ip_nexthop_val_cmd
);
3615 install_element (RMAP_NODE
, &set_local_pref_cmd
);
3616 install_element (RMAP_NODE
, &no_set_local_pref_cmd
);
3617 install_element (RMAP_NODE
, &no_set_local_pref_val_cmd
);
3618 install_element (RMAP_NODE
, &set_weight_cmd
);
3619 install_element (RMAP_NODE
, &no_set_weight_cmd
);
3620 install_element (RMAP_NODE
, &no_set_weight_val_cmd
);
3621 install_element (RMAP_NODE
, &set_metric_cmd
);
3622 install_element (RMAP_NODE
, &set_metric_addsub_cmd
);
3623 install_element (RMAP_NODE
, &no_set_metric_cmd
);
3624 install_element (RMAP_NODE
, &no_set_metric_val_cmd
);
3625 install_element (RMAP_NODE
, &set_aspath_prepend_cmd
);
3626 install_element (RMAP_NODE
, &no_set_aspath_prepend_cmd
);
3627 install_element (RMAP_NODE
, &no_set_aspath_prepend_val_cmd
);
3628 install_element (RMAP_NODE
, &set_origin_cmd
);
3629 install_element (RMAP_NODE
, &no_set_origin_cmd
);
3630 install_element (RMAP_NODE
, &no_set_origin_val_cmd
);
3631 install_element (RMAP_NODE
, &set_atomic_aggregate_cmd
);
3632 install_element (RMAP_NODE
, &no_set_atomic_aggregate_cmd
);
3633 install_element (RMAP_NODE
, &set_aggregator_as_cmd
);
3634 install_element (RMAP_NODE
, &no_set_aggregator_as_cmd
);
3635 install_element (RMAP_NODE
, &no_set_aggregator_as_val_cmd
);
3636 install_element (RMAP_NODE
, &set_community_cmd
);
3637 install_element (RMAP_NODE
, &set_community_none_cmd
);
3638 install_element (RMAP_NODE
, &no_set_community_cmd
);
3639 install_element (RMAP_NODE
, &no_set_community_val_cmd
);
3640 install_element (RMAP_NODE
, &no_set_community_none_cmd
);
3641 install_element (RMAP_NODE
, &set_community_delete_cmd
);
3642 install_element (RMAP_NODE
, &no_set_community_delete_cmd
);
3643 install_element (RMAP_NODE
, &no_set_community_delete_val_cmd
);
3644 install_element (RMAP_NODE
, &set_ecommunity_rt_cmd
);
3645 install_element (RMAP_NODE
, &no_set_ecommunity_rt_cmd
);
3646 install_element (RMAP_NODE
, &no_set_ecommunity_rt_val_cmd
);
3647 install_element (RMAP_NODE
, &set_ecommunity_soo_cmd
);
3648 install_element (RMAP_NODE
, &no_set_ecommunity_soo_cmd
);
3649 install_element (RMAP_NODE
, &no_set_ecommunity_soo_val_cmd
);
3650 install_element (RMAP_NODE
, &set_vpnv4_nexthop_cmd
);
3651 install_element (RMAP_NODE
, &no_set_vpnv4_nexthop_cmd
);
3652 install_element (RMAP_NODE
, &no_set_vpnv4_nexthop_val_cmd
);
3653 install_element (RMAP_NODE
, &set_originator_id_cmd
);
3654 install_element (RMAP_NODE
, &no_set_originator_id_cmd
);
3655 install_element (RMAP_NODE
, &no_set_originator_id_val_cmd
);
3658 route_map_install_match (&route_match_ipv6_address_cmd
);
3659 route_map_install_match (&route_match_ipv6_next_hop_cmd
);
3660 route_map_install_match (&route_match_ipv6_address_prefix_list_cmd
);
3661 route_map_install_set (&route_set_ipv6_nexthop_global_cmd
);
3662 route_map_install_set (&route_set_ipv6_nexthop_local_cmd
);
3664 install_element (RMAP_NODE
, &match_ipv6_address_cmd
);
3665 install_element (RMAP_NODE
, &no_match_ipv6_address_cmd
);
3666 install_element (RMAP_NODE
, &match_ipv6_next_hop_cmd
);
3667 install_element (RMAP_NODE
, &no_match_ipv6_next_hop_cmd
);
3668 install_element (RMAP_NODE
, &match_ipv6_address_prefix_list_cmd
);
3669 install_element (RMAP_NODE
, &no_match_ipv6_address_prefix_list_cmd
);
3670 install_element (RMAP_NODE
, &set_ipv6_nexthop_global_cmd
);
3671 install_element (RMAP_NODE
, &no_set_ipv6_nexthop_global_cmd
);
3672 install_element (RMAP_NODE
, &no_set_ipv6_nexthop_global_val_cmd
);
3673 install_element (RMAP_NODE
, &set_ipv6_nexthop_local_cmd
);
3674 install_element (RMAP_NODE
, &no_set_ipv6_nexthop_local_cmd
);
3675 install_element (RMAP_NODE
, &no_set_ipv6_nexthop_local_val_cmd
);
3676 #endif /* HAVE_IPV6 */