mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 20:22:36 +00:00
* bgp_routemap.c: New route-map command - "match ip route-source".
[merge from GNU Zebra]
This commit is contained in:
parent
fee6e4e454
commit
c1643bb7d7
@ -1,3 +1,7 @@
|
|||||||
|
2005-02-02 Akihiro Mizutani <mizutani@net-chef.net>
|
||||||
|
|
||||||
|
* bgp_routemap.c: New route-map command - "match ip route-source".
|
||||||
|
|
||||||
2005-02-02 Akihiro Mizutani <mizutani@net-chef.net>
|
2005-02-02 Akihiro Mizutani <mizutani@net-chef.net>
|
||||||
|
|
||||||
* bgp_clist.[ch], bgp_route.c, bgp_routemap.c, bgp_vty.c:
|
* bgp_clist.[ch], bgp_route.c, bgp_routemap.c, bgp_vty.c:
|
||||||
|
@ -57,7 +57,7 @@ o Cisco route-map
|
|||||||
interface : Not yet
|
interface : Not yet
|
||||||
ip address : Done
|
ip address : Done
|
||||||
ip next-hop : Done
|
ip next-hop : Done
|
||||||
ip route-source : (This will not be implemented by bgpd)
|
ip route-source : Done
|
||||||
ip prefix-list : Done
|
ip prefix-list : Done
|
||||||
ipv6 address : Done
|
ipv6 address : Done
|
||||||
ipv6 next-hop : Done
|
ipv6 next-hop : Done
|
||||||
@ -291,6 +291,64 @@ struct route_map_rule_cmd route_match_ip_next_hop_cmd =
|
|||||||
route_match_ip_next_hop_free
|
route_match_ip_next_hop_free
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* `match ip route-source ACCESS-LIST' */
|
||||||
|
|
||||||
|
/* Match function return 1 if match is success else return zero. */
|
||||||
|
route_map_result_t
|
||||||
|
route_match_ip_route_source (void *rule, struct prefix *prefix,
|
||||||
|
route_map_object_t type, void *object)
|
||||||
|
{
|
||||||
|
struct access_list *alist;
|
||||||
|
struct bgp_info *bgp_info;
|
||||||
|
struct peer *peer;
|
||||||
|
struct prefix_ipv4 p;
|
||||||
|
|
||||||
|
if (type == RMAP_BGP)
|
||||||
|
{
|
||||||
|
bgp_info = object;
|
||||||
|
peer = bgp_info->peer;
|
||||||
|
|
||||||
|
if (! peer || sockunion_family (&peer->su) != AF_INET)
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
|
||||||
|
p.family = AF_INET;
|
||||||
|
p.prefix = peer->su.sin.sin_addr;
|
||||||
|
p.prefixlen = IPV4_MAX_BITLEN;
|
||||||
|
|
||||||
|
alist = access_list_lookup (AFI_IP, (char *) rule);
|
||||||
|
if (alist == NULL)
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
|
||||||
|
return (access_list_apply (alist, &p) == FILTER_DENY ?
|
||||||
|
RMAP_NOMATCH : RMAP_MATCH);
|
||||||
|
}
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Route map `ip route-source' match statement. `arg' is
|
||||||
|
access-list name. */
|
||||||
|
void *
|
||||||
|
route_match_ip_route_source_compile (const char *arg)
|
||||||
|
{
|
||||||
|
return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free route map's compiled `ip address' value. */
|
||||||
|
void
|
||||||
|
route_match_ip_route_source_free (void *rule)
|
||||||
|
{
|
||||||
|
XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Route map commands for ip route-source matching. */
|
||||||
|
struct route_map_rule_cmd route_match_ip_route_source_cmd =
|
||||||
|
{
|
||||||
|
"ip route-source",
|
||||||
|
route_match_ip_route_source,
|
||||||
|
route_match_ip_route_source_compile,
|
||||||
|
route_match_ip_route_source_free
|
||||||
|
};
|
||||||
|
|
||||||
/* `match ip address prefix-list PREFIX_LIST' */
|
/* `match ip address prefix-list PREFIX_LIST' */
|
||||||
|
|
||||||
route_map_result_t
|
route_map_result_t
|
||||||
@ -378,6 +436,59 @@ struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd =
|
|||||||
route_match_ip_next_hop_prefix_list_free
|
route_match_ip_next_hop_prefix_list_free
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* `match ip route-source prefix-list PREFIX_LIST' */
|
||||||
|
|
||||||
|
route_map_result_t
|
||||||
|
route_match_ip_route_source_prefix_list (void *rule, struct prefix *prefix,
|
||||||
|
route_map_object_t type, void *object)
|
||||||
|
{
|
||||||
|
struct prefix_list *plist;
|
||||||
|
struct bgp_info *bgp_info;
|
||||||
|
struct peer *peer;
|
||||||
|
struct prefix_ipv4 p;
|
||||||
|
|
||||||
|
if (type == RMAP_BGP)
|
||||||
|
{
|
||||||
|
bgp_info = object;
|
||||||
|
peer = bgp_info->peer;
|
||||||
|
|
||||||
|
if (! peer || sockunion_family (&peer->su) != AF_INET)
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
|
||||||
|
p.family = AF_INET;
|
||||||
|
p.prefix = peer->su.sin.sin_addr;
|
||||||
|
p.prefixlen = IPV4_MAX_BITLEN;
|
||||||
|
|
||||||
|
plist = prefix_list_lookup (AFI_IP, (char *) rule);
|
||||||
|
if (plist == NULL)
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
|
||||||
|
return (prefix_list_apply (plist, &p) == PREFIX_DENY ?
|
||||||
|
RMAP_NOMATCH : RMAP_MATCH);
|
||||||
|
}
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
route_match_ip_route_source_prefix_list_compile (const char *arg)
|
||||||
|
{
|
||||||
|
return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
route_match_ip_route_source_prefix_list_free (void *rule)
|
||||||
|
{
|
||||||
|
XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct route_map_rule_cmd route_match_ip_route_source_prefix_list_cmd =
|
||||||
|
{
|
||||||
|
"ip route-source prefix-list",
|
||||||
|
route_match_ip_route_source_prefix_list,
|
||||||
|
route_match_ip_route_source_prefix_list_compile,
|
||||||
|
route_match_ip_route_source_prefix_list_free
|
||||||
|
};
|
||||||
|
|
||||||
/* `match metric METRIC' */
|
/* `match metric METRIC' */
|
||||||
|
|
||||||
/* Match function return 1 if match is success else return zero. */
|
/* Match function return 1 if match is success else return zero. */
|
||||||
@ -2305,6 +2416,44 @@ ALIAS (no_match_ip_next_hop,
|
|||||||
"IP access-list number (expanded range)\n"
|
"IP access-list number (expanded range)\n"
|
||||||
"IP Access-list name\n")
|
"IP Access-list name\n")
|
||||||
|
|
||||||
|
DEFUN (match_ip_route_source,
|
||||||
|
match_ip_route_source_cmd,
|
||||||
|
"match ip route-source (<1-199>|<1300-2699>|WORD)",
|
||||||
|
MATCH_STR
|
||||||
|
IP_STR
|
||||||
|
"Match advertising source address of route\n"
|
||||||
|
"IP access-list number\n"
|
||||||
|
"IP access-list number (expanded range)\n"
|
||||||
|
"IP standard access-list name\n")
|
||||||
|
{
|
||||||
|
return bgp_route_match_add (vty, vty->index, "ip route-source", argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN (no_match_ip_route_source,
|
||||||
|
no_match_ip_route_source_cmd,
|
||||||
|
"no match ip route-source",
|
||||||
|
NO_STR
|
||||||
|
MATCH_STR
|
||||||
|
IP_STR
|
||||||
|
"Match advertising source address of route\n")
|
||||||
|
{
|
||||||
|
if (argc == 0)
|
||||||
|
return bgp_route_match_delete (vty, vty->index, "ip route-source", NULL);
|
||||||
|
|
||||||
|
return bgp_route_match_delete (vty, vty->index, "ip route-source", argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIAS (no_match_ip_route_source,
|
||||||
|
no_match_ip_route_source_val_cmd,
|
||||||
|
"no match ip route-source (<1-199>|<1300-2699>|WORD)",
|
||||||
|
NO_STR
|
||||||
|
MATCH_STR
|
||||||
|
IP_STR
|
||||||
|
"Match advertising source address of route\n"
|
||||||
|
"IP access-list number\n"
|
||||||
|
"IP access-list number (expanded range)\n"
|
||||||
|
"IP standard access-list name\n");
|
||||||
|
|
||||||
DEFUN (match_ip_address_prefix_list,
|
DEFUN (match_ip_address_prefix_list,
|
||||||
match_ip_address_prefix_list_cmd,
|
match_ip_address_prefix_list_cmd,
|
||||||
"match ip address prefix-list WORD",
|
"match ip address prefix-list WORD",
|
||||||
@ -2379,6 +2528,43 @@ ALIAS (no_match_ip_next_hop_prefix_list,
|
|||||||
"Match entries of prefix-lists\n"
|
"Match entries of prefix-lists\n"
|
||||||
"IP prefix-list name\n")
|
"IP prefix-list name\n")
|
||||||
|
|
||||||
|
DEFUN (match_ip_route_source_prefix_list,
|
||||||
|
match_ip_route_source_prefix_list_cmd,
|
||||||
|
"match ip route-source prefix-list WORD",
|
||||||
|
MATCH_STR
|
||||||
|
IP_STR
|
||||||
|
"Match advertising source address of route\n"
|
||||||
|
"Match entries of prefix-lists\n"
|
||||||
|
"IP prefix-list name\n")
|
||||||
|
{
|
||||||
|
return bgp_route_match_add (vty, vty->index, "ip route-source prefix-list", argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN (no_match_ip_route_source_prefix_list,
|
||||||
|
no_match_ip_route_source_prefix_list_cmd,
|
||||||
|
"no match ip route-source prefix-list",
|
||||||
|
NO_STR
|
||||||
|
MATCH_STR
|
||||||
|
IP_STR
|
||||||
|
"Match advertising source address of route\n"
|
||||||
|
"Match entries of prefix-lists\n")
|
||||||
|
{
|
||||||
|
if (argc == 0)
|
||||||
|
return bgp_route_match_delete (vty, vty->index, "ip route-source prefix-list", NULL);
|
||||||
|
|
||||||
|
return bgp_route_match_delete (vty, vty->index, "ip route-source prefix-list", argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIAS (no_match_ip_route_source_prefix_list,
|
||||||
|
no_match_ip_route_source_prefix_list_val_cmd,
|
||||||
|
"no match ip route-source prefix-list WORD",
|
||||||
|
NO_STR
|
||||||
|
MATCH_STR
|
||||||
|
IP_STR
|
||||||
|
"Match advertising source address of route\n"
|
||||||
|
"Match entries of prefix-lists\n"
|
||||||
|
"IP prefix-list name\n");
|
||||||
|
|
||||||
DEFUN (match_metric,
|
DEFUN (match_metric,
|
||||||
match_metric_cmd,
|
match_metric_cmd,
|
||||||
"match metric <0-4294967295>",
|
"match metric <0-4294967295>",
|
||||||
@ -3395,8 +3581,10 @@ bgp_route_map_init ()
|
|||||||
route_map_install_match (&route_match_peer_cmd);
|
route_map_install_match (&route_match_peer_cmd);
|
||||||
route_map_install_match (&route_match_ip_address_cmd);
|
route_map_install_match (&route_match_ip_address_cmd);
|
||||||
route_map_install_match (&route_match_ip_next_hop_cmd);
|
route_map_install_match (&route_match_ip_next_hop_cmd);
|
||||||
|
route_map_install_match (&route_match_ip_route_source_cmd);
|
||||||
route_map_install_match (&route_match_ip_address_prefix_list_cmd);
|
route_map_install_match (&route_match_ip_address_prefix_list_cmd);
|
||||||
route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
|
route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
|
||||||
|
route_map_install_match (&route_match_ip_route_source_prefix_list_cmd);
|
||||||
route_map_install_match (&route_match_aspath_cmd);
|
route_map_install_match (&route_match_aspath_cmd);
|
||||||
route_map_install_match (&route_match_community_cmd);
|
route_map_install_match (&route_match_community_cmd);
|
||||||
route_map_install_match (&route_match_ecommunity_cmd);
|
route_map_install_match (&route_match_ecommunity_cmd);
|
||||||
@ -3429,6 +3617,9 @@ bgp_route_map_init ()
|
|||||||
install_element (RMAP_NODE, &match_ip_next_hop_cmd);
|
install_element (RMAP_NODE, &match_ip_next_hop_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_next_hop_cmd);
|
install_element (RMAP_NODE, &no_match_ip_next_hop_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_next_hop_val_cmd);
|
install_element (RMAP_NODE, &no_match_ip_next_hop_val_cmd);
|
||||||
|
install_element (RMAP_NODE, &match_ip_route_source_cmd);
|
||||||
|
install_element (RMAP_NODE, &no_match_ip_route_source_cmd);
|
||||||
|
install_element (RMAP_NODE, &no_match_ip_route_source_val_cmd);
|
||||||
|
|
||||||
install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
|
install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
|
install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
|
||||||
@ -3436,6 +3627,9 @@ bgp_route_map_init ()
|
|||||||
install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
|
install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
|
install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
|
install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
|
||||||
|
install_element (RMAP_NODE, &match_ip_route_source_prefix_list_cmd);
|
||||||
|
install_element (RMAP_NODE, &no_match_ip_route_source_prefix_list_cmd);
|
||||||
|
install_element (RMAP_NODE, &no_match_ip_route_source_prefix_list_val_cmd);
|
||||||
|
|
||||||
install_element (RMAP_NODE, &match_aspath_cmd);
|
install_element (RMAP_NODE, &match_aspath_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_aspath_cmd);
|
install_element (RMAP_NODE, &no_match_aspath_cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user