*: Remove route_map_object_t from the system

The route_map_object_t was being used to track what protocol we were
being called against.  But each protocol was only ever calling itself.
So we had a variable that was only ever being passed in from route_map_apply
that had to be carried against and everyone was testing if that variable
was for their own stack.

Clean up this route_map_object_t from the entire system.  We should
speed some stuff up.  Yes I know not a bunch but this will add up.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
Donald Sharp 2020-11-13 19:35:20 -05:00
parent 15675d025d
commit 1782514fb9
23 changed files with 967 additions and 1337 deletions

View File

@ -1003,8 +1003,7 @@ struct attr *bgp_attr_aggregate_intern(
SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_AGGREGATE); SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_AGGREGATE);
ret = route_map_apply(aggregate->rmap.map, p, RMAP_BGP, ret = route_map_apply(aggregate->rmap.map, p, &rmap_path);
&rmap_path);
bgp->peer_self->rmap_type = 0; bgp->peer_self->rmap_type = 0;

View File

@ -47,7 +47,7 @@ bgp_check_rmap_prefixes_in_bgp_table(struct bgp_table *table,
RESET_FLAG(dummy_attr.rmap_change_flags); RESET_FLAG(dummy_attr.rmap_change_flags);
ret = route_map_apply(rmap, dest_p, RMAP_BGP, &path); ret = route_map_apply(rmap, dest_p, &path);
if (ret != RMAP_PERMITMATCH) if (ret != RMAP_PERMITMATCH)
bgp_attr_flush(&dummy_attr); bgp_attr_flush(&dummy_attr);
else { else {
@ -112,7 +112,7 @@ static void bgp_conditional_adv_routes(struct peer *peer, afi_t afi,
RESET_FLAG(dummy_attr.rmap_change_flags); RESET_FLAG(dummy_attr.rmap_change_flags);
if (route_map_apply(rmap, dest_p, RMAP_BGP, &path) if (route_map_apply(rmap, dest_p, &path)
!= RMAP_PERMITMATCH) { != RMAP_PERMITMATCH) {
bgp_attr_flush(&dummy_attr); bgp_attr_flush(&dummy_attr);
continue; continue;

View File

@ -4201,7 +4201,7 @@ void bgp_evpn_advertise_type5_routes(struct bgp *bgp_vrf, afi_t afi,
bgp_vrf->adv_cmd_rmap[afi][safi] bgp_vrf->adv_cmd_rmap[afi][safi]
.map, .map,
bgp_dest_get_prefix(dest), bgp_dest_get_prefix(dest),
RMAP_BGP, &tmp_pi); &tmp_pi);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&tmp_attr); bgp_attr_flush(&tmp_attr);
continue; continue;

View File

@ -744,7 +744,7 @@ void vpn_leak_from_vrf_update(struct bgp *bgp_vpn, /* to */
info.attr = &static_attr; info.attr = &static_attr;
ret = route_map_apply( ret = route_map_apply(
bgp_vrf->vpn_policy[afi].rmap[BGP_VPN_POLICY_DIR_TOVPN], bgp_vrf->vpn_policy[afi].rmap[BGP_VPN_POLICY_DIR_TOVPN],
p, RMAP_BGP, &info); p, &info);
if (RMAP_DENYMATCH == ret) { if (RMAP_DENYMATCH == ret) {
bgp_attr_flush(&static_attr); /* free any added parts */ bgp_attr_flush(&static_attr); /* free any added parts */
if (debug) if (debug)
@ -1190,7 +1190,7 @@ vpn_leak_to_vrf_update_onevrf(struct bgp *bgp_vrf, /* to */
info.extra = path_vpn->extra; /* Used for source-vrf filter */ info.extra = path_vpn->extra; /* Used for source-vrf filter */
ret = route_map_apply(bgp_vrf->vpn_policy[afi] ret = route_map_apply(bgp_vrf->vpn_policy[afi]
.rmap[BGP_VPN_POLICY_DIR_FROMVPN], .rmap[BGP_VPN_POLICY_DIR_FROMVPN],
p, RMAP_BGP, &info); p, &info);
if (RMAP_DENYMATCH == ret) { if (RMAP_DENYMATCH == ret) {
bgp_attr_flush(&static_attr); /* free any added parts */ bgp_attr_flush(&static_attr); /* free any added parts */
if (debug) if (debug)

View File

@ -1500,7 +1500,7 @@ static int bgp_input_modifier(struct peer *peer, const struct prefix *p,
SET_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IN); SET_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IN);
/* Apply BGP route map to the attribute. */ /* Apply BGP route map to the attribute. */
ret = route_map_apply(rmap, p, RMAP_BGP, &rmap_path); ret = route_map_apply(rmap, p, &rmap_path);
peer->rmap_type = 0; peer->rmap_type = 0;
@ -1551,7 +1551,7 @@ static int bgp_output_modifier(struct peer *peer, const struct prefix *p,
SET_FLAG(peer->rmap_type, PEER_RMAP_TYPE_OUT); SET_FLAG(peer->rmap_type, PEER_RMAP_TYPE_OUT);
/* Apply BGP route map to the attribute. */ /* Apply BGP route map to the attribute. */
ret = route_map_apply(rmap, p, RMAP_BGP, &rmap_path); ret = route_map_apply(rmap, p, &rmap_path);
peer->rmap_type = rmap_type; peer->rmap_type = rmap_type;
@ -2047,10 +2047,10 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi,
if (bgp_path_suppressed(pi)) if (bgp_path_suppressed(pi))
ret = route_map_apply(UNSUPPRESS_MAP(filter), p, ret = route_map_apply(UNSUPPRESS_MAP(filter), p,
RMAP_BGP, &rmap_path); &rmap_path);
else else
ret = route_map_apply(ROUTE_MAP_OUT(filter), p, ret = route_map_apply(ROUTE_MAP_OUT(filter), p,
RMAP_BGP, &rmap_path); &rmap_path);
peer->rmap_type = 0; peer->rmap_type = 0;
@ -2633,7 +2633,7 @@ static void bgp_process_evpn_route_injection(struct bgp *bgp, afi_t afi,
RESET_FLAG(dummy_attr.rmap_change_flags); RESET_FLAG(dummy_attr.rmap_change_flags);
ret = route_map_apply(bgp->adv_cmd_rmap[afi][safi].map, ret = route_map_apply(bgp->adv_cmd_rmap[afi][safi].map,
p, RMAP_BGP, &rmap_path); p, &rmap_path);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&dummy_attr); bgp_attr_flush(&dummy_attr);
@ -5215,8 +5215,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK); SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
ret = route_map_apply(bgp_static->rmap.map, p, RMAP_BGP, ret = route_map_apply(bgp_static->rmap.map, p, &rmap_path);
&rmap_path);
bgp->peer_self->rmap_type = 0; bgp->peer_self->rmap_type = 0;
@ -5535,8 +5534,7 @@ static void bgp_static_update_safi(struct bgp *bgp, const struct prefix *p,
SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK); SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
ret = route_map_apply(bgp_static->rmap.map, p, RMAP_BGP, ret = route_map_apply(bgp_static->rmap.map, p, &rmap_path);
&rmap_path);
bgp->peer_self->rmap_type = 0; bgp->peer_self->rmap_type = 0;
@ -6387,7 +6385,7 @@ static bool aggr_suppress_map_test(struct bgp *bgp,
rmap_path.attr = &attr; rmap_path.attr = &attr;
SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_AGGREGATE); SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_AGGREGATE);
rmr = route_map_apply(aggregate->suppress_map, p, RMAP_BGP, &rmap_path); rmr = route_map_apply(aggregate->suppress_map, p, &rmap_path);
bgp->peer_self->rmap_type = 0; bgp->peer_self->rmap_type = 0;
bgp_attr_flush(&attr); bgp_attr_flush(&attr);
@ -7845,8 +7843,7 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p,
SET_FLAG(bgp->peer_self->rmap_type, SET_FLAG(bgp->peer_self->rmap_type,
PEER_RMAP_TYPE_REDISTRIBUTE); PEER_RMAP_TYPE_REDISTRIBUTE);
ret = route_map_apply(red->rmap.map, p, RMAP_BGP, ret = route_map_apply(red->rmap.map, p, &rmap_path);
&rmap_path);
bgp->peer_self->rmap_type = 0; bgp->peer_self->rmap_type = 0;
@ -10392,8 +10389,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
path.peer = pi->peer; path.peer = pi->peer;
path.attr = &dummy_attr; path.attr = &dummy_attr;
ret = route_map_apply(rmap, dest_p, RMAP_BGP, ret = route_map_apply(rmap, dest_p, &path);
&path);
if (ret == RMAP_DENYMATCH) if (ret == RMAP_DENYMATCH)
continue; continue;
} }

File diff suppressed because it is too large Load Diff

View File

@ -124,7 +124,7 @@ static int is_running(void);
static void route_match_free(void *rule); static void route_match_free(void *rule);
static enum route_map_cmd_result_t route_match(void *rule, static enum route_map_cmd_result_t route_match(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type,
void *object); void *object);
static void *route_match_compile(const char *arg); static void *route_match_compile(const char *arg);
static void revalidate_bgp_node(struct bgp_dest *dest, afi_t afi, safi_t safi); static void revalidate_bgp_node(struct bgp_dest *dest, afi_t afi, safi_t safi);
@ -213,20 +213,18 @@ static void ipv6_addr_to_host_byte_order(const uint32_t *src, uint32_t *dest)
static enum route_map_cmd_result_t route_match(void *rule, static enum route_map_cmd_result_t route_match(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type,
void *object) void *object)
{ {
int *rpki_status = rule; int *rpki_status = rule;
struct bgp_path_info *path; struct bgp_path_info *path;
if (type == RMAP_BGP) { path = object;
path = object;
if (rpki_validate_prefix(path->peer, path->attr, prefix) if (rpki_validate_prefix(path->peer, path->attr, prefix)
== *rpki_status) { == *rpki_status) {
return RMAP_MATCH; return RMAP_MATCH;
}
} }
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }

View File

@ -823,8 +823,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
ret = route_map_apply( ret = route_map_apply(
peer->default_rmap[afi][safi].map, peer->default_rmap[afi][safi].map,
bgp_dest_get_prefix(dest), RMAP_BGP, bgp_dest_get_prefix(dest), &tmp_pi);
&tmp_pi);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&tmp_attr); bgp_attr_flush(&tmp_attr);

View File

@ -918,7 +918,7 @@ static bool bgp_table_map_apply(struct route_map *map, const struct prefix *p,
{ {
route_map_result_t ret; route_map_result_t ret;
ret = route_map_apply(map, p, RMAP_BGP, path); ret = route_map_apply(map, p, path);
bgp_attr_flush(path->attr); bgp_attr_flush(path->attr);
if (ret != RMAP_DENYMATCH) if (ret != RMAP_DENYMATCH)

View File

@ -290,7 +290,7 @@ void vnc_direct_bgp_add_route_ce(struct bgp *bgp, struct agg_node *rn,
info.peer = peer; info.peer = peer;
info.attr = &hattr; info.attr = &hattr;
ret = route_map_apply(bgp->rfapi_cfg->routemap_export_bgp, ret = route_map_apply(bgp->rfapi_cfg->routemap_export_bgp,
prefix, RMAP_BGP, &info); prefix, &info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
return; return;
@ -1033,7 +1033,7 @@ void vnc_direct_bgp_add_nve(struct bgp *bgp, struct rfapi_descriptor *rfd)
ret = route_map_apply( ret = route_map_apply(
rfgn->rfg rfgn->rfg
->routemap_export_bgp, ->routemap_export_bgp,
p, RMAP_BGP, &info); p, &info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
continue; continue;
@ -1242,8 +1242,7 @@ static void vnc_direct_add_rn_group_rd(struct bgp *bgp,
info.peer = irfd->peer; info.peer = irfd->peer;
info.attr = &hattr; info.attr = &hattr;
ret = route_map_apply(rfg->routemap_export_bgp, p, RMAP_BGP, ret = route_map_apply(rfg->routemap_export_bgp, p, &info);
&info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
vnc_zlog_debug_verbose( vnc_zlog_debug_verbose(
@ -1691,8 +1690,7 @@ void vnc_direct_bgp_rh_add_route(struct bgp *bgp, afi_t afi,
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
info.peer = peer; info.peer = peer;
info.attr = &hattr; info.attr = &hattr;
ret = route_map_apply(hc->routemap_export_bgp, prefix, RMAP_BGP, ret = route_map_apply(hc->routemap_export_bgp, prefix, &info);
&info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
return; return;
@ -1917,8 +1915,7 @@ void vnc_direct_bgp_rh_vpn_enable(struct bgp *bgp, afi_t afi)
info.attr = &hattr; info.attr = &hattr;
ret = route_map_apply( ret = route_map_apply(
hc->routemap_export_bgp, hc->routemap_export_bgp,
dest_p, RMAP_BGP, dest_p, &info);
&info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
vnc_zlog_debug_verbose( vnc_zlog_debug_verbose(

View File

@ -357,7 +357,7 @@ static int process_unicast_route(struct bgp *bgp, /* in */
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
info.peer = peer; info.peer = peer;
info.attr = &hattr; info.attr = &hattr;
ret = route_map_apply(rmap, prefix, RMAP_BGP, &info); ret = route_map_apply(rmap, prefix, &info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
vnc_zlog_debug_verbose( vnc_zlog_debug_verbose(
@ -784,7 +784,7 @@ static void vnc_import_bgp_add_route_mode_plain(struct bgp *bgp,
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
info.peer = peer; info.peer = peer;
info.attr = &hattr; info.attr = &hattr;
ret = route_map_apply(rmap, prefix, RMAP_BGP, &info); ret = route_map_apply(rmap, prefix, &info);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
vnc_zlog_debug_verbose( vnc_zlog_debug_verbose(
@ -977,7 +977,7 @@ static void vnc_import_bgp_add_route_mode_nvegroup(
memset(&path, 0, sizeof(path)); memset(&path, 0, sizeof(path));
path.peer = peer; path.peer = peer;
path.attr = &hattr; path.attr = &hattr;
ret = route_map_apply(rmap, prefix, RMAP_BGP, &path); ret = route_map_apply(rmap, prefix, &path);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
bgp_attr_flush(&hattr); bgp_attr_flush(&hattr);
vnc_zlog_debug_verbose( vnc_zlog_debug_verbose(

View File

@ -167,8 +167,7 @@ static void isis_redist_update_ext_reach(struct isis_area *area, int level,
area_info.metric = redist->metric; area_info.metric = redist->metric;
if (redist->map_name) { if (redist->map_name) {
map_ret = map_ret = route_map_apply(redist->map, p, &area_info);
route_map_apply(redist->map, p, RMAP_ISIS, &area_info);
if (map_ret == RMAP_DENYMATCH) if (map_ret == RMAP_DENYMATCH)
area_info.distance = 255; area_info.distance = 255;
} }

View File

@ -49,14 +49,10 @@
#include "isis_routemap.h" #include "isis_routemap.h"
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address(void *rule, const struct prefix *prefix, route_match_ip_address(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
if (type != RMAP_ISIS)
return RMAP_NOMATCH;
alist = access_list_lookup(AFI_IP, (char *)rule); alist = access_list_lookup(AFI_IP, (char *)rule);
if (access_list_apply(alist, prefix) != FILTER_DENY) if (access_list_apply(alist, prefix) != FILTER_DENY)
return RMAP_MATCH; return RMAP_MATCH;
@ -85,13 +81,10 @@ static const struct route_map_rule_cmd route_match_ip_address_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
if (type != RMAP_ISIS)
return RMAP_NOMATCH;
plist = prefix_list_lookup(AFI_IP, (char *)rule); plist = prefix_list_lookup(AFI_IP, (char *)rule);
if (prefix_list_apply(plist, prefix) != PREFIX_DENY) if (prefix_list_apply(plist, prefix) != PREFIX_DENY)
return RMAP_MATCH; return RMAP_MATCH;
@ -120,14 +113,10 @@ static const struct route_map_rule_cmd
/* ------------------------------------------------------------*/ /* ------------------------------------------------------------*/
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ipv6_address(void *rule, const struct prefix *prefix, route_match_ipv6_address(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
if (type != RMAP_ISIS)
return RMAP_NOMATCH;
alist = access_list_lookup(AFI_IP6, (char *)rule); alist = access_list_lookup(AFI_IP6, (char *)rule);
if (access_list_apply(alist, prefix) != FILTER_DENY) if (access_list_apply(alist, prefix) != FILTER_DENY)
return RMAP_MATCH; return RMAP_MATCH;
@ -156,13 +145,10 @@ static const struct route_map_rule_cmd route_match_ipv6_address_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ipv6_address_prefix_list(void *rule, const struct prefix *prefix, route_match_ipv6_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
if (type != RMAP_ISIS)
return RMAP_NOMATCH;
plist = prefix_list_lookup(AFI_IP6, (char *)rule); plist = prefix_list_lookup(AFI_IP6, (char *)rule);
if (prefix_list_apply(plist, prefix) != PREFIX_DENY) if (prefix_list_apply(plist, prefix) != PREFIX_DENY)
return RMAP_MATCH; return RMAP_MATCH;
@ -191,18 +177,16 @@ static const struct route_map_rule_cmd
/* ------------------------------------------------------------*/ /* ------------------------------------------------------------*/
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_metric(void *rule, const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
uint32_t *metric; uint32_t *metric;
struct isis_ext_info *info; struct isis_ext_info *info;
if (type == RMAP_ISIS) { metric = rule;
metric = rule; info = object;
info = object;
info->metric = *metric;
info->metric = *metric;
}
return RMAP_OKAY; return RMAP_OKAY;
} }

View File

@ -1530,8 +1530,7 @@ enum rmap_compile_rets route_map_delete_set(struct route_map_index *index,
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_map_apply_match(struct route_map_rule_list *match_list, route_map_apply_match(struct route_map_rule_list *match_list,
const struct prefix *prefix, route_map_object_t type, const struct prefix *prefix, void *object)
void *object)
{ {
enum route_map_cmd_result_t ret = RMAP_NOMATCH; enum route_map_cmd_result_t ret = RMAP_NOMATCH;
struct route_map_rule *match; struct route_map_rule *match;
@ -1555,7 +1554,7 @@ route_map_apply_match(struct route_map_rule_list *match_list,
* If all result in NOOP, end-result is NOOP. * If all result in NOOP, end-result is NOOP.
*/ */
ret = (*match->cmd->func_apply)(match->value, prefix, ret = (*match->cmd->func_apply)(match->value, prefix,
type, object); object);
/* /*
* If the consolidated result of func_apply is: * If the consolidated result of func_apply is:
@ -1647,9 +1646,10 @@ static struct list *route_map_get_index_list(struct route_node **rn,
/* /*
* This function returns the route-map index that best matches the prefix. * This function returns the route-map index that best matches the prefix.
*/ */
static struct route_map_index * static struct route_map_index *route_map_get_index(struct route_map *map,
route_map_get_index(struct route_map *map, const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type, void *object, uint8_t *match_ret) void *object,
uint8_t *match_ret)
{ {
int ret = 0; int ret = 0;
struct list *candidate_rmap_list = NULL; struct list *candidate_rmap_list = NULL;
@ -1695,7 +1695,7 @@ route_map_get_index(struct route_map *map, const struct prefix *prefix,
break; break;
ret = route_map_apply_match(&index->match_list, prefix, ret = route_map_apply_match(&index->match_list, prefix,
type, object); object);
if (ret == RMAP_MATCH) { if (ret == RMAP_MATCH) {
*match_ret = ret; *match_ret = ret;
@ -2369,8 +2369,7 @@ void route_map_notify_pentry_dependencies(const char *affected_name,
We need to make sure our route-map processing matches the above We need to make sure our route-map processing matches the above
*/ */
route_map_result_t route_map_apply(struct route_map *map, route_map_result_t route_map_apply(struct route_map *map,
const struct prefix *prefix, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
static int recursion = 0; static int recursion = 0;
enum route_map_cmd_result_t match_ret = RMAP_NOMATCH; enum route_map_cmd_result_t match_ret = RMAP_NOMATCH;
@ -2397,7 +2396,7 @@ route_map_result_t route_map_apply(struct route_map *map,
if ((!map->optimization_disabled) if ((!map->optimization_disabled)
&& (map->ipv4_prefix_table || map->ipv6_prefix_table)) { && (map->ipv4_prefix_table || map->ipv6_prefix_table)) {
index = route_map_get_index(map, prefix, type, object, index = route_map_get_index(map, prefix, object,
(uint8_t *)&match_ret); (uint8_t *)&match_ret);
if (index) { if (index) {
if (rmap_debug) if (rmap_debug)
@ -2431,7 +2430,7 @@ route_map_result_t route_map_apply(struct route_map *map,
index->applied++; index->applied++;
/* Apply this index. */ /* Apply this index. */
match_ret = route_map_apply_match(&index->match_list, match_ret = route_map_apply_match(&index->match_list,
prefix, type, object); prefix, object);
if (rmap_debug) { if (rmap_debug) {
zlog_debug( zlog_debug(
"Route-map: %s, sequence: %d, prefix: %pFX, result: %s", "Route-map: %s, sequence: %d, prefix: %pFX, result: %s",
@ -2489,9 +2488,8 @@ route_map_result_t route_map_apply(struct route_map *map,
* set succeeded or not. So, ignore * set succeeded or not. So, ignore
* return code. * return code.
*/ */
(void) (*set->cmd->func_apply)( (void)(*set->cmd->func_apply)(
set->value, prefix, type, set->value, prefix, object);
object);
/* Call another route-map if available */ /* Call another route-map if available */
if (index->nextrm) { if (index->nextrm) {
@ -2504,8 +2502,7 @@ route_map_result_t route_map_apply(struct route_map *map,
{ {
recursion++; recursion++;
ret = route_map_apply( ret = route_map_apply(
nextrm, prefix, type, nextrm, prefix, object);
object);
recursion--; recursion--;
} }

View File

@ -68,17 +68,6 @@ enum route_map_cmd_result_t {
RMAP_ERROR RMAP_ERROR
}; };
typedef enum {
RMAP_RIP,
RMAP_RIPNG,
RMAP_OSPF,
RMAP_OSPF6,
RMAP_BGP,
RMAP_ZEBRA,
RMAP_ISIS,
} route_map_object_t;
typedef enum { RMAP_EXIT, RMAP_GOTO, RMAP_NEXT } route_map_end_t; typedef enum { RMAP_EXIT, RMAP_GOTO, RMAP_NEXT } route_map_end_t;
typedef enum { typedef enum {
@ -117,7 +106,6 @@ struct route_map_rule_cmd {
/* Function for value set or match. */ /* Function for value set or match. */
enum route_map_cmd_result_t (*func_apply)(void *rule, enum route_map_cmd_result_t (*func_apply)(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type,
void *object); void *object);
/* Compile argument and return result as void *. */ /* Compile argument and return result as void *. */
@ -299,7 +287,6 @@ struct route_map *route_map_lookup_warn_noexist(struct vty *vty, const char *nam
/* Apply route map to the object. */ /* Apply route map to the object. */
extern route_map_result_t route_map_apply(struct route_map *map, extern route_map_result_t route_map_apply(struct route_map *map,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t object_type,
void *object); void *object);
extern void route_map_add_hook(void (*func)(const char *)); extern void route_map_add_hook(void (*func)(const char *));

View File

@ -1095,8 +1095,7 @@ void ospf6_asbr_redistribute_add(int type, ifindex_t ifindex,
tinfo.ifindex = ifindex; tinfo.ifindex = ifindex;
tinfo.tag = tag; tinfo.tag = tag;
ret = route_map_apply(ospf6->rmap[type].map, prefix, RMAP_OSPF6, ret = route_map_apply(ospf6->rmap[type].map, prefix, &troute);
&troute);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_OSPF6_DEBUG_ASBR) if (IS_OSPF6_DEBUG_ASBR)
zlog_debug("Denied by route-map \"%s\"", zlog_debug("Denied by route-map \"%s\"",
@ -1400,14 +1399,11 @@ static void ospf6_redistribute_show_config(struct vty *vty, struct ospf6 *ospf6)
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_match_address_prefixlist(void *rule, ospf6_routemap_rule_match_address_prefixlist(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type,
void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
if (type != RMAP_OSPF6)
return RMAP_NOMATCH;
plist = prefix_list_lookup(AFI_IP6, (char *)rule); plist = prefix_list_lookup(AFI_IP6, (char *)rule);
if (plist == NULL) if (plist == NULL)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -1440,18 +1436,16 @@ static const struct route_map_rule_cmd
zero. */ zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_match_interface(void *rule, const struct prefix *prefix, ospf6_routemap_rule_match_interface(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct interface *ifp; struct interface *ifp;
struct ospf6_external_info *ei; struct ospf6_external_info *ei;
if (type == RMAP_OSPF6) { ei = ((struct ospf6_route *)object)->route_option;
ei = ((struct ospf6_route *)object)->route_option; ifp = if_lookup_by_name_all_vrf((char *)rule);
ifp = if_lookup_by_name_all_vrf((char *)rule);
if (ifp != NULL && ei->ifindex == ifp->ifindex) if (ifp != NULL && ei->ifindex == ifp->ifindex)
return RMAP_MATCH; return RMAP_MATCH;
}
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -1480,14 +1474,13 @@ static const struct route_map_rule_cmd
/* Match function for matching route tags */ /* Match function for matching route tags */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_match_tag(void *rule, const struct prefix *p, ospf6_routemap_rule_match_tag(void *rule, const struct prefix *p, void *object)
route_map_object_t type, void *object)
{ {
route_tag_t *tag = rule; route_tag_t *tag = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;
struct ospf6_external_info *info = route->route_option; struct ospf6_external_info *info = route->route_option;
if (type == RMAP_OSPF6 && info->tag == *tag) if (info->tag == *tag)
return RMAP_MATCH; return RMAP_MATCH;
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -1503,14 +1496,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_set_metric_type(void *rule, const struct prefix *prefix, ospf6_routemap_rule_set_metric_type(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
char *metric_type = rule; char *metric_type = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;
if (type != RMAP_OSPF6)
return RMAP_OKAY;
if (strcmp(metric_type, "type-2") == 0) if (strcmp(metric_type, "type-2") == 0)
route->path.metric_type = 2; route->path.metric_type = 2;
else else
@ -1541,14 +1531,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_set_metric(void *rule, const struct prefix *prefix, ospf6_routemap_rule_set_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
char *metric = rule; char *metric = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;
if (type != RMAP_OSPF6)
return RMAP_OKAY;
route->path.cost = atoi(metric); route->path.cost = atoi(metric);
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -1578,15 +1565,12 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_set_forwarding(void *rule, const struct prefix *prefix, ospf6_routemap_rule_set_forwarding(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
char *forwarding = rule; char *forwarding = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;
struct ospf6_external_info *info = route->route_option; struct ospf6_external_info *info = route->route_option;
if (type != RMAP_OSPF6)
return RMAP_OKAY;
if (inet_pton(AF_INET6, forwarding, &info->forwarding) != 1) { if (inet_pton(AF_INET6, forwarding, &info->forwarding) != 1) {
memset(&info->forwarding, 0, sizeof(struct in6_addr)); memset(&info->forwarding, 0, sizeof(struct in6_addr));
return RMAP_ERROR; return RMAP_ERROR;
@ -1617,16 +1601,12 @@ static const struct route_map_rule_cmd
}; };
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
ospf6_routemap_rule_set_tag(void *rule, const struct prefix *p, ospf6_routemap_rule_set_tag(void *rule, const struct prefix *p, void *object)
route_map_object_t type, void *object)
{ {
route_tag_t *tag = rule; route_tag_t *tag = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;
struct ospf6_external_info *info = route->route_option; struct ospf6_external_info *info = route->route_option;
if (type != RMAP_OSPF6)
return RMAP_OKAY;
info->tag = *tag; info->tag = *tag;
return RMAP_OKAY; return RMAP_OKAY;
} }

View File

@ -127,27 +127,22 @@ static void ospf_route_map_event(const char *name)
/* `match ip netxthop ' */ /* `match ip netxthop ' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_nexthop(void *rule, const struct prefix *prefix, route_match_ip_nexthop(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
struct external_info *ei = object; struct external_info *ei = object;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_OSPF) { p.family = AF_INET;
p.family = AF_INET; p.prefix = ei->nexthop;
p.prefix = ei->nexthop; p.prefixlen = IPV4_MAX_BITLEN;
p.prefixlen = IPV4_MAX_BITLEN;
alist = access_list_lookup(AFI_IP, (char *)rule); alist = access_list_lookup(AFI_IP, (char *)rule);
if (alist == NULL) if (alist == NULL)
return RMAP_NOMATCH; return RMAP_NOMATCH;
return (access_list_apply(alist, &p) == FILTER_DENY return (access_list_apply(alist, &p) == FILTER_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
/* Route map `ip next-hop' match statement. `arg' should be /* Route map `ip next-hop' match statement. `arg' should be
@ -175,26 +170,22 @@ static const struct route_map_rule_cmd route_match_ip_nexthop_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
struct external_info *ei = object; struct external_info *ei = object;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_OSPF) { p.family = AF_INET;
p.family = AF_INET; p.prefix = ei->nexthop;
p.prefix = ei->nexthop; p.prefixlen = IPV4_MAX_BITLEN;
p.prefixlen = IPV4_MAX_BITLEN;
plist = prefix_list_lookup(AFI_IP, (char *)rule); plist = prefix_list_lookup(AFI_IP, (char *)rule);
if (plist == NULL) if (plist == NULL)
return RMAP_NOMATCH; return RMAP_NOMATCH;
return (prefix_list_apply(plist, &p) == PREFIX_DENY return (prefix_list_apply(plist, &p) == PREFIX_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
static void *route_match_ip_next_hop_prefix_list_compile(const char *arg) static void *route_match_ip_next_hop_prefix_list_compile(const char *arg)
@ -219,11 +210,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop_type(void *rule, const struct prefix *prefix, route_match_ip_next_hop_type(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct external_info *ei = object; struct external_info *ei = object;
if (type == RMAP_OSPF && prefix->family == AF_INET) { if (prefix->family == AF_INET) {
ei = (struct external_info *)object; ei = (struct external_info *)object;
if (!ei) if (!ei)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -256,22 +247,17 @@ static const struct route_map_rule_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 enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address(void *rule, const struct prefix *prefix, route_match_ip_address(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
/* struct prefix_ipv4 match; */ /* struct prefix_ipv4 match; */
if (type == RMAP_OSPF) { alist = access_list_lookup(AFI_IP, (char *)rule);
alist = access_list_lookup(AFI_IP, (char *)rule); if (alist == NULL)
if (alist == NULL) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return (access_list_apply(alist, prefix) == FILTER_DENY return (access_list_apply(alist, prefix) == FILTER_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
/* Route map `ip address' match statement. `arg' should be /* Route map `ip address' match statement. `arg' should be
@ -298,20 +284,16 @@ static const struct route_map_rule_cmd route_match_ip_address_cmd = {
/* `match ip address prefix-list PREFIX_LIST' */ /* `match ip address prefix-list PREFIX_LIST' */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
if (type == RMAP_OSPF) { plist = prefix_list_lookup(AFI_IP, (char *)rule);
plist = prefix_list_lookup(AFI_IP, (char *)rule); if (plist == NULL)
if (plist == NULL) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return (prefix_list_apply(plist, prefix) == PREFIX_DENY return (prefix_list_apply(plist, prefix) == PREFIX_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
static void *route_match_ip_address_prefix_list_compile(const char *arg) static void *route_match_ip_address_prefix_list_compile(const char *arg)
@ -336,22 +318,18 @@ static const struct route_map_rule_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 enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_interface(void *rule, const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct interface *ifp; struct interface *ifp;
struct external_info *ei; struct external_info *ei;
if (type == RMAP_OSPF) { ei = object;
ei = object; ifp = if_lookup_by_name_all_vrf((char *)rule);
ifp = if_lookup_by_name_all_vrf((char *)rule);
if (ifp == NULL || ifp->ifindex != ei->ifindex) if (ifp == NULL || ifp->ifindex != ei->ifindex)
return RMAP_NOMATCH; return RMAP_NOMATCH;
return RMAP_MATCH; return RMAP_MATCH;
}
return RMAP_NOMATCH;
} }
/* Route map `interface' match statement. `arg' should be /* Route map `interface' match statement. `arg' should be
@ -377,20 +355,15 @@ static const struct route_map_rule_cmd route_match_interface_cmd = {
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_tag(void *rule, const struct prefix *prefix, route_match_tag(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct external_info *ei; struct external_info *ei;
if (type == RMAP_OSPF) { tag = rule;
tag = rule; ei = object;
ei = object;
return ((ei->tag == *tag) ? RMAP_MATCH : RMAP_NOMATCH); return ((ei->tag == *tag) ? RMAP_MATCH : RMAP_NOMATCH);
}
return RMAP_NOMATCH;
} }
/* Route map commands for tag matching. */ /* Route map commands for tag matching. */
@ -410,33 +383,31 @@ struct ospf_metric {
/* `set metric METRIC' */ /* `set metric METRIC' */
/* Set metric to attribute. */ /* Set metric to attribute. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_metric(void *rule, const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct ospf_metric *metric; struct ospf_metric *metric;
struct external_info *ei; struct external_info *ei;
if (type == RMAP_OSPF) { /* Fetch routemap's rule information. */
/* Fetch routemap's rule information. */ metric = rule;
metric = rule; ei = object;
ei = object;
/* Set metric out value. */ /* Set metric out value. */
if (!metric->used) if (!metric->used)
return RMAP_OKAY; return RMAP_OKAY;
ei->route_map_set.metric = DEFAULT_DEFAULT_METRIC; ei->route_map_set.metric = DEFAULT_DEFAULT_METRIC;
if (metric->type == metric_increment) if (metric->type == metric_increment)
ei->route_map_set.metric += metric->metric; ei->route_map_set.metric += metric->metric;
else if (metric->type == metric_decrement) else if (metric->type == metric_decrement)
ei->route_map_set.metric -= metric->metric; ei->route_map_set.metric -= metric->metric;
else if (metric->type == metric_absolute) else if (metric->type == metric_absolute)
ei->route_map_set.metric = metric->metric; ei->route_map_set.metric = metric->metric;
if (ei->route_map_set.metric > OSPF_LS_INFINITY)
ei->route_map_set.metric = OSPF_LS_INFINITY;
if (ei->route_map_set.metric > OSPF_LS_INFINITY)
ei->route_map_set.metric = OSPF_LS_INFINITY;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -492,20 +463,18 @@ static const struct route_map_rule_cmd route_set_metric_cmd = {
/* `set metric-type TYPE' */ /* `set metric-type TYPE' */
/* Set metric-type to attribute. */ /* Set metric-type to attribute. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_metric_type(void *rule, const struct prefix *prefix, route_set_metric_type(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
uint32_t *metric_type; uint32_t *metric_type;
struct external_info *ei; struct external_info *ei;
if (type == RMAP_OSPF) { /* Fetch routemap's rule information. */
/* Fetch routemap's rule information. */ metric_type = rule;
metric_type = rule; ei = object;
ei = object;
/* Set metric out value. */
ei->route_map_set.metric_type = *metric_type;
/* Set metric out value. */
ei->route_map_set.metric_type = *metric_type;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -543,19 +512,16 @@ static const struct route_map_rule_cmd route_set_metric_type_cmd = {
}; };
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_tag(void *rule, const struct prefix *prefix, route_map_object_t type, route_set_tag(void *rule, const struct prefix *prefix, void *object)
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct external_info *ei; struct external_info *ei;
if (type == RMAP_OSPF) { tag = rule;
tag = rule; ei = object;
ei = object;
/* Set tag value */ /* Set tag value */
ei->tag = *tag; ei->tag = *tag;
}
return RMAP_OKAY; return RMAP_OKAY;
} }

View File

@ -902,8 +902,7 @@ int ospf_external_info_apply_default_routemap(struct ospf *ospf,
if (red && ROUTEMAP_NAME(red)) { if (red && ROUTEMAP_NAME(red)) {
route_map_result_t ret; route_map_result_t ret;
ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p, ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p, ei);
RMAP_OSPF, ei);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
ei->route_map_set = save_values; ei->route_map_set = save_values;
@ -1056,8 +1055,7 @@ int ospf_redistribute_check(struct ospf *ospf, struct external_info *ei,
if (red && ROUTEMAP_NAME(red)) { if (red && ROUTEMAP_NAME(red)) {
route_map_result_t ret; route_map_result_t ret;
ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p, ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p, ei);
RMAP_OSPF, ei);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
ei->route_map_set = save_values; ei->route_map_set = save_values;

View File

@ -43,27 +43,23 @@ struct rip_metric_modifier {
/* `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. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_metric(void *rule, const struct prefix *prefix, route_match_metric(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
uint32_t *metric; uint32_t *metric;
uint32_t check; uint32_t check;
struct rip_info *rinfo; struct rip_info *rinfo;
if (type == RMAP_RIP) { metric = rule;
metric = rule; rinfo = object;
rinfo = object;
/* If external metric is available, the route-map should /* If external metric is available, the route-map should
work on this one (for redistribute purpose) */ work on this one (for redistribute purpose) */
check = (rinfo->external_metric) ? rinfo->external_metric check = (rinfo->external_metric) ? rinfo->external_metric
: rinfo->metric; : rinfo->metric;
if (check == *metric) if (check == *metric)
return RMAP_MATCH; return RMAP_MATCH;
else else
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
return RMAP_NOMATCH;
} }
/* Route map `match metric' match statement. `arg' is METRIC value */ /* Route map `match metric' match statement. `arg' is METRIC value */
@ -98,29 +94,25 @@ static const struct route_map_rule_cmd route_match_metric_cmd = {
/* `match interface IFNAME' */ /* `match interface IFNAME' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_interface(void *rule, const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct rip_info *rinfo; struct rip_info *rinfo;
struct interface *ifp; struct interface *ifp;
char *ifname; char *ifname;
if (type == RMAP_RIP) { ifname = rule;
ifname = rule; ifp = if_lookup_by_name(ifname, VRF_DEFAULT);
ifp = if_lookup_by_name(ifname, VRF_DEFAULT);
if (!ifp) if (!ifp)
return RMAP_NOMATCH; return RMAP_NOMATCH;
rinfo = object; rinfo = object;
if (rinfo->ifindex_out == ifp->ifindex if (rinfo->ifindex_out == ifp->ifindex
|| rinfo->nh.ifindex == ifp->ifindex) || rinfo->nh.ifindex == ifp->ifindex)
return RMAP_MATCH; return RMAP_MATCH;
else else
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
return RMAP_NOMATCH;
} }
/* Route map `match interface' match statement. `arg' is IFNAME value */ /* Route map `match interface' match statement. `arg' is IFNAME value */
@ -148,30 +140,25 @@ static const struct route_map_rule_cmd route_match_interface_cmd = {
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop(void *rule, const struct prefix *prefix, route_match_ip_next_hop(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
struct rip_info *rinfo; struct rip_info *rinfo;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_RIP) { rinfo = object;
rinfo = object; p.family = AF_INET;
p.family = AF_INET; p.prefix = (rinfo->nh.gate.ipv4.s_addr != INADDR_ANY)
p.prefix = (rinfo->nh.gate.ipv4.s_addr != INADDR_ANY) ? rinfo->nh.gate.ipv4
? rinfo->nh.gate.ipv4 : rinfo->from;
: rinfo->from; p.prefixlen = IPV4_MAX_BITLEN;
p.prefixlen = IPV4_MAX_BITLEN;
alist = access_list_lookup(AFI_IP, (char *)rule); alist = access_list_lookup(AFI_IP, (char *)rule);
if (alist == NULL) if (alist == NULL)
return RMAP_NOMATCH; return RMAP_NOMATCH;
return (access_list_apply(alist, &p) == FILTER_DENY return (access_list_apply(alist, &p) == FILTER_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
/* Route map `ip next-hop' match statement. `arg' should be /* Route map `ip next-hop' match statement. `arg' should be
@ -199,29 +186,25 @@ static const struct route_map_rule_cmd route_match_ip_next_hop_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
struct rip_info *rinfo; struct rip_info *rinfo;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_RIP) { rinfo = object;
rinfo = object; p.family = AF_INET;
p.family = AF_INET; p.prefix = (rinfo->nh.gate.ipv4.s_addr != INADDR_ANY)
p.prefix = (rinfo->nh.gate.ipv4.s_addr != INADDR_ANY) ? rinfo->nh.gate.ipv4
? rinfo->nh.gate.ipv4 : rinfo->from;
: rinfo->from; p.prefixlen = IPV4_MAX_BITLEN;
p.prefixlen = IPV4_MAX_BITLEN;
plist = prefix_list_lookup(AFI_IP, (char *)rule); plist = prefix_list_lookup(AFI_IP, (char *)rule);
if (plist == NULL) if (plist == NULL)
return RMAP_NOMATCH; return RMAP_NOMATCH;
return (prefix_list_apply(plist, &p) == PREFIX_DENY return (prefix_list_apply(plist, &p) == PREFIX_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
static void *route_match_ip_next_hop_prefix_list_compile(const char *arg) static void *route_match_ip_next_hop_prefix_list_compile(const char *arg)
@ -246,11 +229,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop_type(void *rule, const struct prefix *prefix, route_match_ip_next_hop_type(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct rip_info *rinfo; struct rip_info *rinfo;
if (type == RMAP_RIP && prefix->family == AF_INET) { if (prefix->family == AF_INET) {
rinfo = (struct rip_info *)object; rinfo = (struct rip_info *)object;
if (!rinfo) if (!rinfo)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -284,21 +267,16 @@ static const struct route_map_rule_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 enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address(void *rule, const struct prefix *prefix, route_match_ip_address(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
if (type == RMAP_RIP) { alist = access_list_lookup(AFI_IP, (char *)rule);
alist = access_list_lookup(AFI_IP, (char *)rule); if (alist == NULL)
if (alist == NULL) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return (access_list_apply(alist, prefix) == FILTER_DENY return (access_list_apply(alist, prefix) == FILTER_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
/* Route map `ip address' match statement. `arg' should be /* Route map `ip address' match statement. `arg' should be
@ -326,20 +304,16 @@ static const struct route_map_rule_cmd route_match_ip_address_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
if (type == RMAP_RIP) { plist = prefix_list_lookup(AFI_IP, (char *)rule);
plist = prefix_list_lookup(AFI_IP, (char *)rule); if (plist == NULL)
if (plist == NULL) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return (prefix_list_apply(plist, prefix) == PREFIX_DENY return (prefix_list_apply(plist, prefix) == PREFIX_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
static void *route_match_ip_address_prefix_list_compile(const char *arg) static void *route_match_ip_address_prefix_list_compile(const char *arg)
@ -363,25 +337,21 @@ static const struct route_map_rule_cmd
/* `match tag TAG' */ /* `match tag TAG' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_tag(void *rule, const struct prefix *p, route_map_object_t type, route_match_tag(void *rule, const struct prefix *p, void *object)
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct rip_info *rinfo; struct rip_info *rinfo;
route_tag_t rinfo_tag; route_tag_t rinfo_tag;
if (type == RMAP_RIP) { tag = rule;
tag = rule; rinfo = object;
rinfo = object;
/* The information stored by rinfo is host ordered. */ /* The information stored by rinfo is host ordered. */
rinfo_tag = rinfo->tag; rinfo_tag = rinfo->tag;
if (rinfo_tag == *tag) if (rinfo_tag == *tag)
return RMAP_MATCH; return RMAP_MATCH;
else else
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
return RMAP_NOMATCH;
} }
/* Route map commands for tag matching. */ /* Route map commands for tag matching. */
@ -396,33 +366,30 @@ static const struct route_map_rule_cmd route_match_tag_cmd = {
/* Set metric to attribute. */ /* Set metric to attribute. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_metric(void *rule, const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
if (type == RMAP_RIP) { struct rip_metric_modifier *mod;
struct rip_metric_modifier *mod; struct rip_info *rinfo;
struct rip_info *rinfo;
mod = rule; mod = rule;
rinfo = object; rinfo = object;
if (!mod->used) if (!mod->used)
return RMAP_OKAY; return RMAP_OKAY;
if (mod->type == metric_increment) if (mod->type == metric_increment)
rinfo->metric_out += mod->metric; rinfo->metric_out += mod->metric;
else if (mod->type == metric_decrement) else if (mod->type == metric_decrement)
rinfo->metric_out -= mod->metric; rinfo->metric_out -= mod->metric;
else if (mod->type == metric_absolute) else if (mod->type == metric_absolute)
rinfo->metric_out = mod->metric; rinfo->metric_out = mod->metric;
if ((signed int)rinfo->metric_out < 1) if ((signed int)rinfo->metric_out < 1)
rinfo->metric_out = 1; rinfo->metric_out = 1;
if (rinfo->metric_out > RIP_METRIC_INFINITY) if (rinfo->metric_out > RIP_METRIC_INFINITY)
rinfo->metric_out = RIP_METRIC_INFINITY; rinfo->metric_out = RIP_METRIC_INFINITY;
rinfo->metric_set = 1; rinfo->metric_set = 1;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -495,22 +462,20 @@ static const struct route_map_rule_cmd route_set_metric_cmd = {
/* `set ip next-hop IP_ADDRESS' */ /* `set ip next-hop IP_ADDRESS' */
/* Set nexthop to object. ojbect must be pointer to struct attr. */ /* Set nexthop to object. ojbect must be pointer to struct attr. */
static enum route_map_cmd_result_t route_set_ip_nexthop(void *rule, static enum route_map_cmd_result_t
const struct prefix *prefix, route_set_ip_nexthop(void *rule, const struct prefix *prefix,
route_map_object_t type,
void *object) void *object)
{ {
struct in_addr *address; struct in_addr *address;
struct rip_info *rinfo; struct rip_info *rinfo;
if (type == RMAP_RIP) { /* Fetch routemap's rule information. */
/* Fetch routemap's rule information. */ address = rule;
address = rule; rinfo = object;
rinfo = object;
/* Set next hop value. */ /* Set next hop value. */
rinfo->nexthop_out = *address; rinfo->nexthop_out = *address;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -552,20 +517,17 @@ static const struct route_map_rule_cmd route_set_ip_nexthop_cmd = {
/* Set tag to object. ojbect must be pointer to struct attr. */ /* Set tag to object. ojbect must be pointer to struct attr. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_tag(void *rule, const struct prefix *prefix, route_map_object_t type, route_set_tag(void *rule, const struct prefix *prefix, void *object)
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct rip_info *rinfo; struct rip_info *rinfo;
if (type == RMAP_RIP) { /* Fetch routemap's rule information. */
/* Fetch routemap's rule information. */ tag = rule;
tag = rule; rinfo = object;
rinfo = object;
/* Set next hop value. */ /* Set next hop value. */
rinfo->tag_out = *tag; rinfo->tag_out = *tag;
}
return RMAP_OKAY; return RMAP_OKAY;
} }

View File

@ -462,7 +462,7 @@ static void rip_rte_process(struct rte *rte, struct sockaddr_in *from,
if (ri->routemap[RIP_FILTER_IN]) { if (ri->routemap[RIP_FILTER_IN]) {
/* The object should be of the type of rip_info */ /* The object should be of the type of rip_info */
ret = route_map_apply(ri->routemap[RIP_FILTER_IN], ret = route_map_apply(ri->routemap[RIP_FILTER_IN],
(struct prefix *)&p, RMAP_RIP, &newinfo); (struct prefix *)&p, &newinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIP_DEBUG_PACKET) if (IS_RIP_DEBUG_PACKET)
@ -2251,7 +2251,7 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to,
if (ri->routemap[RIP_FILTER_OUT]) { if (ri->routemap[RIP_FILTER_OUT]) {
ret = route_map_apply( ret = route_map_apply(
ri->routemap[RIP_FILTER_OUT], ri->routemap[RIP_FILTER_OUT],
(struct prefix *)p, RMAP_RIP, rinfo); (struct prefix *)p, rinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIP_DEBUG_PACKET) if (IS_RIP_DEBUG_PACKET)
@ -2267,7 +2267,7 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to,
&& rinfo->sub_type != RIP_ROUTE_INTERFACE) { && rinfo->sub_type != RIP_ROUTE_INTERFACE) {
ret = route_map_apply( ret = route_map_apply(
rip->redist[rinfo->type].route_map.map, rip->redist[rinfo->type].route_map.map,
(struct prefix *)p, RMAP_RIP, rinfo); (struct prefix *)p, rinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIP_DEBUG_PACKET) if (IS_RIP_DEBUG_PACKET)

View File

@ -39,21 +39,19 @@ struct rip_metric_modifier {
/* `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. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_metric(void *rule, const struct prefix *prefix, route_match_metric(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
uint32_t *metric; uint32_t *metric;
struct ripng_info *rinfo; struct ripng_info *rinfo;
if (type == RMAP_RIPNG) { metric = rule;
metric = rule; rinfo = object;
rinfo = object;
if (rinfo->metric == *metric)
return RMAP_MATCH;
else
return RMAP_NOMATCH;
if (rinfo->metric == *metric)
return RMAP_MATCH;
else
return RMAP_NOMATCH;
}
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -89,27 +87,25 @@ static const struct route_map_rule_cmd route_match_metric_cmd = {
/* `match interface IFNAME' */ /* `match interface IFNAME' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_interface(void *rule, const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct ripng_info *rinfo; struct ripng_info *rinfo;
struct interface *ifp; struct interface *ifp;
char *ifname; char *ifname;
if (type == RMAP_RIPNG) { ifname = rule;
ifname = rule; ifp = if_lookup_by_name(ifname, VRF_DEFAULT);
ifp = if_lookup_by_name(ifname, VRF_DEFAULT);
if (!ifp) if (!ifp)
return RMAP_NOMATCH; return RMAP_NOMATCH;
rinfo = object; rinfo = object;
if (rinfo->ifindex == ifp->ifindex)
return RMAP_MATCH;
else
return RMAP_NOMATCH;
if (rinfo->ifindex == ifp->ifindex)
return RMAP_MATCH;
else
return RMAP_NOMATCH;
}
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -135,27 +131,24 @@ static const struct route_map_rule_cmd route_match_interface_cmd = {
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t route_match_tag(void *rule, static enum route_map_cmd_result_t route_match_tag(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type,
void *object) void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct ripng_info *rinfo; struct ripng_info *rinfo;
route_tag_t rinfo_tag; route_tag_t rinfo_tag;
if (type == RMAP_RIPNG) { tag = rule;
tag = rule; rinfo = object;
rinfo = object;
/* The information stored by rinfo is host ordered. */ /* The information stored by rinfo is host ordered. */
rinfo_tag = rinfo->tag; rinfo_tag = rinfo->tag;
if (rinfo_tag == *tag) if (rinfo_tag == *tag)
return RMAP_MATCH; return RMAP_MATCH;
else else
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
return RMAP_NOMATCH;
} }
static const struct route_map_rule_cmd route_match_tag_cmd = { static const struct route_map_rule_cmd route_match_tag_cmd = {
"tag", "tag",
route_match_tag, route_match_tag,
@ -167,33 +160,31 @@ static const struct route_map_rule_cmd route_match_tag_cmd = {
/* Set metric to attribute. */ /* Set metric to attribute. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_metric(void *rule, const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
if (type == RMAP_RIPNG) { struct rip_metric_modifier *mod;
struct rip_metric_modifier *mod; struct ripng_info *rinfo;
struct ripng_info *rinfo;
mod = rule; mod = rule;
rinfo = object; rinfo = object;
if (!mod->used) if (!mod->used)
return RMAP_OKAY; return RMAP_OKAY;
if (mod->type == metric_increment) if (mod->type == metric_increment)
rinfo->metric_out += mod->metric; rinfo->metric_out += mod->metric;
else if (mod->type == metric_decrement) else if (mod->type == metric_decrement)
rinfo->metric_out -= mod->metric; rinfo->metric_out -= mod->metric;
else if (mod->type == metric_absolute) else if (mod->type == metric_absolute)
rinfo->metric_out = mod->metric; rinfo->metric_out = mod->metric;
if (rinfo->metric_out < 1) if (rinfo->metric_out < 1)
rinfo->metric_out = 1; rinfo->metric_out = 1;
if (rinfo->metric_out > RIPNG_METRIC_INFINITY) if (rinfo->metric_out > RIPNG_METRIC_INFINITY)
rinfo->metric_out = RIPNG_METRIC_INFINITY; rinfo->metric_out = RIPNG_METRIC_INFINITY;
rinfo->metric_set = 1;
rinfo->metric_set = 1;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -265,20 +256,17 @@ static const struct route_map_rule_cmd route_set_metric_cmd = {
/* Set nexthop to object. ojbect must be pointer to struct attr. */ /* Set nexthop to object. ojbect must be pointer to struct attr. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_ipv6_nexthop_local(void *rule, const struct prefix *p, route_set_ipv6_nexthop_local(void *rule, const struct prefix *p, void *object)
route_map_object_t type, void *object)
{ {
struct in6_addr *address; struct in6_addr *address;
struct ripng_info *rinfo; struct ripng_info *rinfo;
if (type == RMAP_RIPNG) { /* Fetch routemap's rule information. */
/* Fetch routemap's rule information. */ address = rule;
address = rule; rinfo = object;
rinfo = object;
/* Set next hop value. */ /* Set next hop value. */
rinfo->nexthop_out = *address; rinfo->nexthop_out = *address;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -321,20 +309,17 @@ static const struct route_map_rule_cmd
/* Set tag to object. ojbect must be pointer to struct attr. */ /* Set tag to object. ojbect must be pointer to struct attr. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_tag(void *rule, const struct prefix *prefix, route_map_object_t type, route_set_tag(void *rule, const struct prefix *prefix, void *object)
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct ripng_info *rinfo; struct ripng_info *rinfo;
if (type == RMAP_RIPNG) { /* Fetch routemap's rule information. */
/* Fetch routemap's rule information. */ tag = rule;
tag = rule; rinfo = object;
rinfo = object;
/* Set next hop value. */ /* Set next hop value. */
rinfo->tag_out = *tag; rinfo->tag_out = *tag;
}
return RMAP_OKAY; return RMAP_OKAY;
} }

View File

@ -748,8 +748,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
/* Modify entry. */ /* Modify entry. */
if (ri->routemap[RIPNG_FILTER_IN]) { if (ri->routemap[RIPNG_FILTER_IN]) {
ret = route_map_apply(ri->routemap[RIPNG_FILTER_IN], ret = route_map_apply(ri->routemap[RIPNG_FILTER_IN],
(struct prefix *)&p, RMAP_RIPNG, (struct prefix *)&p, &newinfo);
&newinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIPNG_DEBUG_PACKET) if (IS_RIPNG_DEBUG_PACKET)
@ -1661,7 +1660,7 @@ void ripng_output_process(struct interface *ifp, struct sockaddr_in6 *to,
if (ri->routemap[RIPNG_FILTER_OUT]) { if (ri->routemap[RIPNG_FILTER_OUT]) {
ret = route_map_apply( ret = route_map_apply(
ri->routemap[RIPNG_FILTER_OUT], ri->routemap[RIPNG_FILTER_OUT],
(struct prefix *)p, RMAP_RIPNG, rinfo); (struct prefix *)p, rinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIPNG_DEBUG_PACKET) if (IS_RIPNG_DEBUG_PACKET)
@ -1677,7 +1676,7 @@ void ripng_output_process(struct interface *ifp, struct sockaddr_in6 *to,
ret = route_map_apply(ripng->redist[rinfo->type] ret = route_map_apply(ripng->redist[rinfo->type]
.route_map.map, .route_map.map,
(struct prefix *)p, (struct prefix *)p,
RMAP_RIPNG, rinfo); rinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIPNG_DEBUG_PACKET) if (IS_RIPNG_DEBUG_PACKET)
@ -1773,8 +1772,7 @@ void ripng_output_process(struct interface *ifp, struct sockaddr_in6 *to,
ret = route_map_apply( ret = route_map_apply(
ri->routemap[RIPNG_FILTER_OUT], ri->routemap[RIPNG_FILTER_OUT],
(struct prefix *)p, RMAP_RIPNG, (struct prefix *)p, &newinfo);
&newinfo);
if (ret == RMAP_DENYMATCH) { if (ret == RMAP_DENYMATCH) {
if (IS_RIPNG_DEBUG_PACKET) if (IS_RIPNG_DEBUG_PACKET)

View File

@ -64,19 +64,17 @@ static void zebra_route_map_set_delay_timer(uint32_t value);
* Match function return 1 if match is success else return 0 * Match function return 1 if match is success else return 0
*/ */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_tag(void *rule, const struct prefix *prefix, route_match_tag(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
if (type == RMAP_ZEBRA) { tag = rule;
tag = rule; nh_data = object;
nh_data = object;
if (nh_data->tag == *tag)
return RMAP_MATCH;
if (nh_data->tag == *tag)
return RMAP_MATCH;
}
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -92,25 +90,23 @@ static const struct route_map_rule_cmd route_match_tag_cmd = {
/* `match interface IFNAME' */ /* `match interface IFNAME' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_interface(void *rule, const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
char *ifname = rule; char *ifname = rule;
ifindex_t ifindex; ifindex_t ifindex;
if (type == RMAP_ZEBRA) { if (strcasecmp(ifname, "any") == 0)
if (strcasecmp(ifname, "any") == 0) return RMAP_MATCH;
return RMAP_MATCH; nh_data = object;
nh_data = object; if (!nh_data || !nh_data->nexthop)
if (!nh_data || !nh_data->nexthop) return RMAP_NOMATCH;
return RMAP_NOMATCH; ifindex = ifname2ifindex(ifname, nh_data->vrf_id);
ifindex = ifname2ifindex(ifname, nh_data->vrf_id); if (ifindex == 0)
if (ifindex == 0) return RMAP_NOMATCH;
return RMAP_NOMATCH; if (nh_data->nexthop->ifindex == ifindex)
if (nh_data->nexthop->ifindex == ifindex) return RMAP_MATCH;
return RMAP_MATCH;
}
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -938,40 +934,35 @@ DEFPY_YANG (show_ipv6_protocol_nht,
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop(void *rule, const struct prefix *prefix, route_match_ip_next_hop(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
struct access_list *alist; struct access_list *alist;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_ZEBRA) { nh_data = object;
nh_data = object; if (!nh_data)
if (!nh_data) return RMAP_NOMATCH;
return RMAP_NOMATCH;
switch (nh_data->nexthop->type) { switch (nh_data->nexthop->type) {
case NEXTHOP_TYPE_IFINDEX: case NEXTHOP_TYPE_IFINDEX:
/* Interface routes can't match ip next-hop */ /* Interface routes can't match ip next-hop */
return RMAP_NOMATCH; return RMAP_NOMATCH;
case NEXTHOP_TYPE_IPV4_IFINDEX: case NEXTHOP_TYPE_IPV4_IFINDEX:
case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4:
p.family = AF_INET; p.family = AF_INET;
p.prefix = nh_data->nexthop->gate.ipv4; p.prefix = nh_data->nexthop->gate.ipv4;
p.prefixlen = IPV4_MAX_BITLEN; p.prefixlen = IPV4_MAX_BITLEN;
break; break;
default: default:
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
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; 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);
} }
/* Route map `ip next-hop' match statement. `arg' should be /* Route map `ip next-hop' match statement. `arg' should be
@ -999,39 +990,35 @@ static const struct route_map_rule_cmd route_match_ip_next_hop_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct prefix_list *plist; struct prefix_list *plist;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_ZEBRA) { nh_data = (struct nh_rmap_obj *)object;
nh_data = (struct nh_rmap_obj *)object; if (!nh_data)
if (!nh_data) return RMAP_NOMATCH;
return RMAP_NOMATCH;
switch (nh_data->nexthop->type) { switch (nh_data->nexthop->type) {
case NEXTHOP_TYPE_IFINDEX: case NEXTHOP_TYPE_IFINDEX:
/* Interface routes can't match ip next-hop */ /* Interface routes can't match ip next-hop */
return RMAP_NOMATCH; return RMAP_NOMATCH;
case NEXTHOP_TYPE_IPV4_IFINDEX: case NEXTHOP_TYPE_IPV4_IFINDEX:
case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4:
p.family = AF_INET; p.family = AF_INET;
p.prefix = nh_data->nexthop->gate.ipv4; p.prefix = nh_data->nexthop->gate.ipv4;
p.prefixlen = IPV4_MAX_BITLEN; p.prefixlen = IPV4_MAX_BITLEN;
break; break;
default: default:
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
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; 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);
} }
static void *route_match_ip_next_hop_prefix_list_compile(const char *arg) static void *route_match_ip_next_hop_prefix_list_compile(const char *arg)
@ -1058,34 +1045,28 @@ static const struct route_map_rule_cmd
zero. */ zero. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_address(afi_t afi, void *rule, const struct prefix *prefix, route_match_address(afi_t afi, void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct access_list *alist; struct access_list *alist;
if (type == RMAP_ZEBRA) { alist = access_list_lookup(afi, (char *)rule);
alist = access_list_lookup(afi, (char *)rule); if (alist == NULL)
if (alist == NULL) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return (access_list_apply(alist, prefix) == FILTER_DENY return (access_list_apply(alist, prefix) == FILTER_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address(void *rule, const struct prefix *prefix, route_match_ip_address(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
return route_match_address(AFI_IP, rule, prefix, type, object); return route_match_address(AFI_IP, rule, prefix, object);
} }
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ipv6_address(void *rule, const struct prefix *prefix, route_match_ipv6_address(void *rule, const struct prefix *prefix, void *object)
route_map_object_t type, void *object)
{ {
return route_match_address(AFI_IP6, rule, prefix, type, object); return route_match_address(AFI_IP6, rule, prefix, object);
} }
/* Route map `ip address' match statement. `arg' should be /* Route map `ip address' match statement. `arg' should be
@ -1121,28 +1102,23 @@ static const struct route_map_rule_cmd route_match_ipv6_address_cmd = {
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_address_prefix_list(void *rule, const struct prefix *prefix, route_match_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object, afi_t afi) void *object, afi_t afi)
{ {
struct prefix_list *plist; struct prefix_list *plist;
if (type == RMAP_ZEBRA) { plist = prefix_list_lookup(afi, (char *)rule);
plist = prefix_list_lookup(afi, (char *)rule); if (plist == NULL)
if (plist == NULL) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return (prefix_list_apply(plist, prefix) == PREFIX_DENY return (prefix_list_apply(plist, prefix) == PREFIX_DENY ? RMAP_NOMATCH
? RMAP_NOMATCH : RMAP_MATCH);
: RMAP_MATCH);
}
return RMAP_NOMATCH;
} }
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix, route_match_ip_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
return (route_match_address_prefix_list(rule, prefix, type, object, return (route_match_address_prefix_list(rule, prefix, object, AFI_IP));
AFI_IP));
} }
static void *route_match_address_prefix_list_compile(const char *arg) static void *route_match_address_prefix_list_compile(const char *arg)
@ -1165,10 +1141,9 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ipv6_address_prefix_list(void *rule, const struct prefix *prefix, route_match_ipv6_address_prefix_list(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
return (route_match_address_prefix_list(rule, prefix, type, object, return (route_match_address_prefix_list(rule, prefix, object, AFI_IP6));
AFI_IP6));
} }
static const struct route_map_rule_cmd static const struct route_map_rule_cmd
@ -1183,11 +1158,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ipv6_next_hop_type(void *rule, const struct prefix *prefix, route_match_ipv6_next_hop_type(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
if (type == RMAP_ZEBRA && prefix->family == AF_INET6) { if (prefix->family == AF_INET6) {
nh_data = (struct nh_rmap_obj *)object; nh_data = (struct nh_rmap_obj *)object;
if (!nh_data) if (!nh_data)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -1195,6 +1170,7 @@ route_match_ipv6_next_hop_type(void *rule, const struct prefix *prefix,
if (nh_data->nexthop->type == NEXTHOP_TYPE_BLACKHOLE) if (nh_data->nexthop->type == NEXTHOP_TYPE_BLACKHOLE)
return RMAP_MATCH; return RMAP_MATCH;
} }
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -1220,15 +1196,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_address_prefix_len(void *rule, const struct prefix *prefix, route_match_address_prefix_len(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
uint32_t *prefixlen = (uint32_t *)rule; uint32_t *prefixlen = (uint32_t *)rule;
if (type == RMAP_ZEBRA) { return ((prefix->prefixlen == *prefixlen) ? RMAP_MATCH : RMAP_NOMATCH);
return ((prefix->prefixlen == *prefixlen) ? RMAP_MATCH
: RMAP_NOMATCH);
}
return RMAP_NOMATCH;
} }
static void *route_match_address_prefix_len_compile(const char *arg) static void *route_match_address_prefix_len_compile(const char *arg)
@ -1277,34 +1249,30 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_nexthop_prefix_len(void *rule, const struct prefix *prefix, route_match_ip_nexthop_prefix_len(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
uint32_t *prefixlen = (uint32_t *)rule; uint32_t *prefixlen = (uint32_t *)rule;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
struct prefix_ipv4 p; struct prefix_ipv4 p;
if (type == RMAP_ZEBRA) { nh_data = (struct nh_rmap_obj *)object;
nh_data = (struct nh_rmap_obj *)object; if (!nh_data || !nh_data->nexthop)
if (!nh_data || !nh_data->nexthop) return RMAP_NOMATCH;
return RMAP_NOMATCH;
switch (nh_data->nexthop->type) { switch (nh_data->nexthop->type) {
case NEXTHOP_TYPE_IFINDEX: case NEXTHOP_TYPE_IFINDEX:
/* Interface routes can't match ip next-hop */ /* Interface routes can't match ip next-hop */
return RMAP_NOMATCH; return RMAP_NOMATCH;
case NEXTHOP_TYPE_IPV4_IFINDEX: case NEXTHOP_TYPE_IPV4_IFINDEX:
case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4:
p.family = AF_INET; p.family = AF_INET;
p.prefix = nh_data->nexthop->gate.ipv4; p.prefix = nh_data->nexthop->gate.ipv4;
p.prefixlen = IPV4_MAX_BITLEN; p.prefixlen = IPV4_MAX_BITLEN;
break; break;
default: default:
return RMAP_NOMATCH; return RMAP_NOMATCH;
}
return ((p.prefixlen == *prefixlen) ? RMAP_MATCH
: RMAP_NOMATCH);
} }
return RMAP_NOMATCH; return ((p.prefixlen == *prefixlen) ? RMAP_MATCH : RMAP_NOMATCH);
} }
static const struct route_map_rule_cmd static const struct route_map_rule_cmd
@ -1319,11 +1287,11 @@ static const struct route_map_rule_cmd
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_ip_next_hop_type(void *rule, const struct prefix *prefix, route_match_ip_next_hop_type(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) void *object)
{ {
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
if (type == RMAP_ZEBRA && prefix->family == AF_INET) { if (prefix->family == AF_INET) {
nh_data = (struct nh_rmap_obj *)object; nh_data = (struct nh_rmap_obj *)object;
if (!nh_data) if (!nh_data)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -1331,6 +1299,7 @@ route_match_ip_next_hop_type(void *rule, const struct prefix *prefix,
if (nh_data->nexthop->type == NEXTHOP_TYPE_BLACKHOLE) if (nh_data->nexthop->type == NEXTHOP_TYPE_BLACKHOLE)
return RMAP_MATCH; return RMAP_MATCH;
} }
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
@ -1355,21 +1324,17 @@ static const struct route_map_rule_cmd
/* `match source-protocol PROTOCOL' */ /* `match source-protocol PROTOCOL' */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_source_protocol(void *rule, const struct prefix *p, route_match_source_protocol(void *rule, const struct prefix *p, void *object)
route_map_object_t type, void *object)
{ {
uint32_t *rib_type = (uint32_t *)rule; uint32_t *rib_type = (uint32_t *)rule;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
if (type == RMAP_ZEBRA) { nh_data = (struct nh_rmap_obj *)object;
nh_data = (struct nh_rmap_obj *)object; if (!nh_data)
if (!nh_data) return RMAP_NOMATCH;
return RMAP_NOMATCH;
return ((nh_data->source_protocol == *rib_type) ? RMAP_MATCH return ((nh_data->source_protocol == *rib_type) ? RMAP_MATCH
: RMAP_NOMATCH); : RMAP_NOMATCH);
}
return RMAP_NOMATCH;
} }
static void *route_match_source_protocol_compile(const char *arg) static void *route_match_source_protocol_compile(const char *arg)
@ -1399,15 +1364,11 @@ static const struct route_map_rule_cmd route_match_source_protocol_cmd = {
/* `source-instance` */ /* `source-instance` */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_match_source_instance(void *rule, const struct prefix *p, route_match_source_instance(void *rule, const struct prefix *p, void *object)
route_map_object_t type, void *object)
{ {
uint8_t *instance = (uint8_t *)rule; uint8_t *instance = (uint8_t *)rule;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
if (type != RMAP_ZEBRA)
return RMAP_NOMATCH;
nh_data = (struct nh_rmap_obj *)object; nh_data = (struct nh_rmap_obj *)object;
if (!nh_data) if (!nh_data)
return RMAP_NOMATCH; return RMAP_NOMATCH;
@ -1444,15 +1405,13 @@ static const struct route_map_rule_cmd route_match_source_instance_cmd = {
/* Set src. */ /* Set src. */
static enum route_map_cmd_result_t static enum route_map_cmd_result_t
route_set_src(void *rule, const struct prefix *prefix, route_map_object_t type, route_set_src(void *rule, const struct prefix *prefix, void *object)
void *object)
{ {
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
if (type == RMAP_ZEBRA) { nh_data = (struct nh_rmap_obj *)object;
nh_data = (struct nh_rmap_obj *)object; nh_data->nexthop->rmap_src = *(union g_addr *)rule;
nh_data->nexthop->rmap_src = *(union g_addr *)rule;
}
return RMAP_OKAY; return RMAP_OKAY;
} }
@ -1738,7 +1697,7 @@ zebra_route_map_check(int family, int rib_type, uint8_t instance,
if (!rmap && PROTO_RM_NAME(zvrf, family, ZEBRA_ROUTE_MAX)) if (!rmap && PROTO_RM_NAME(zvrf, family, ZEBRA_ROUTE_MAX))
rmap = PROTO_RM_MAP(zvrf, family, ZEBRA_ROUTE_MAX); rmap = PROTO_RM_MAP(zvrf, family, ZEBRA_ROUTE_MAX);
if (rmap) { if (rmap) {
ret = route_map_apply(rmap, p, RMAP_ZEBRA, &nh_obj); ret = route_map_apply(rmap, p, &nh_obj);
} }
return (ret); return (ret);
@ -1782,7 +1741,7 @@ zebra_import_table_route_map_check(int family, int re_type, uint8_t instance,
if (re_type >= 0 && re_type < ZEBRA_ROUTE_MAX) if (re_type >= 0 && re_type < ZEBRA_ROUTE_MAX)
rmap = route_map_lookup_by_name(rmap_name); rmap = route_map_lookup_by_name(rmap_name);
if (rmap) { if (rmap) {
ret = route_map_apply(rmap, p, RMAP_ZEBRA, &nh_obj); ret = route_map_apply(rmap, p, &nh_obj);
} }
return (ret); return (ret);
@ -1810,7 +1769,7 @@ route_map_result_t zebra_nht_route_map_check(afi_t afi, int client_proto,
if (!rmap && NHT_RM_MAP(zvrf, afi, ZEBRA_ROUTE_MAX)) if (!rmap && NHT_RM_MAP(zvrf, afi, ZEBRA_ROUTE_MAX))
rmap = NHT_RM_MAP(zvrf, afi, ZEBRA_ROUTE_MAX); rmap = NHT_RM_MAP(zvrf, afi, ZEBRA_ROUTE_MAX);
if (rmap) if (rmap)
ret = route_map_apply(rmap, p, RMAP_ZEBRA, &nh_obj); ret = route_map_apply(rmap, p, &nh_obj);
return ret; return ret;
} }