zebra: Add match ipv6 address WORD as a legal option

Zebra did not have the ability to use v6 access-lists
as part of a route-map.  Add it in.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-11-06 19:25:58 -05:00
parent 8dfa7e4680
commit 86405f9e14

View File

@ -1116,15 +1116,15 @@ static struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = {
/* Match function should return 1 if match is success else return /* Match function should return 1 if match is success else return
zero. */ zero. */
static route_map_result_t route_match_ip_address(void *rule, static route_map_result_t route_match_address(afi_t afi, void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type,
void *object) void *object)
{ {
struct access_list *alist; struct access_list *alist;
if (type == RMAP_ZEBRA) { if (type == RMAP_ZEBRA) {
alist = access_list_lookup(AFI_IP, (char *)rule); alist = access_list_lookup(afi, (char *)rule);
if (alist == NULL) if (alist == NULL)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -1135,23 +1135,45 @@ static route_map_result_t route_match_ip_address(void *rule,
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
static route_map_result_t route_match_ip_address(void *rule,
const struct prefix *prefix,
route_map_object_t type,
void *object)
{
return route_match_address(AFI_IP, rule, prefix, type, object);
}
static route_map_result_t route_match_ipv6_address(void *rule,
const struct prefix *prefix,
route_map_object_t type,
void *object)
{
return route_match_address(AFI_IP6, rule, prefix, type, object);
}
/* Route map `ip address' match statement. `arg' should be /* Route map `ip address' match statement. `arg' should be
access-list name. */ access-list name. */
static void *route_match_ip_address_compile(const char *arg) static void *route_match_address_compile(const char *arg)
{ {
return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg); return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);
} }
/* Free route map's compiled `ip address' value. */ /* Free route map's compiled `ip address' value. */
static void route_match_ip_address_free(void *rule) static void route_match_address_free(void *rule)
{ {
XFREE(MTYPE_ROUTE_MAP_COMPILED, rule); XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);
} }
/* Route map commands for ip address matching. */ /* Route map commands for ip address matching. */
static struct route_map_rule_cmd route_match_ip_address_cmd = { static struct route_map_rule_cmd route_match_ip_address_cmd = {
"ip address", route_match_ip_address, route_match_ip_address_compile, "ip address", route_match_ip_address, route_match_address_compile,
route_match_ip_address_free}; route_match_address_free};
/* Route map commands for ipv6 address matching. */
static struct route_map_rule_cmd route_match_ipv6_address_cmd = {
"ipv6 address", route_match_ipv6_address, route_match_address_compile,
route_match_address_free};
/* `match ip address prefix-list PREFIX_LIST' */ /* `match ip address prefix-list PREFIX_LIST' */
@ -1869,6 +1891,7 @@ void zebra_route_map_init()
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_next_hop_prefix_list_cmd); route_map_install_match(&route_match_ip_next_hop_prefix_list_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_ipv6_address_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_ipv6_address_prefix_list_cmd); route_map_install_match(&route_match_ipv6_address_prefix_list_cmd);
route_map_install_match(&route_match_ip_address_prefix_len_cmd); route_map_install_match(&route_match_ip_address_prefix_len_cmd);