Merge pull request #4315 from lkrishnamoor/route_map_3rd_state

lib: Introducing a 3rd state for route-map match cmd: RMAP_NOOP
This commit is contained in:
Donald Sharp 2019-05-30 21:25:18 -04:00 committed by GitHub
commit 9c61cec7e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 372 additions and 398 deletions

View File

@ -4411,7 +4411,7 @@ void bgp_evpn_advertise_type5_routes(struct bgp *bgp_vrf, afi_t afi,
/* apply the route-map */ /* apply the route-map */
if (bgp_vrf->adv_cmd_rmap[afi][safi].map) { if (bgp_vrf->adv_cmd_rmap[afi][safi].map) {
int ret = 0; route_map_result_t ret;
ret = route_map_apply( ret = route_map_apply(
bgp_vrf->adv_cmd_rmap[afi][safi] bgp_vrf->adv_cmd_rmap[afi][safi]

View File

@ -1458,7 +1458,7 @@ int subgroup_announce_check(struct bgp_node *rn, struct bgp_path_info *pi,
struct bgp *bgp; struct bgp *bgp;
struct attr *piattr; struct attr *piattr;
char buf[PREFIX_STRLEN]; char buf[PREFIX_STRLEN];
int ret; route_map_result_t ret;
int transparent; int transparent;
int reflect; int reflect;
afi_t afi; afi_t afi;
@ -2526,12 +2526,12 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn,
/* apply the route-map */ /* apply the route-map */
if (bgp->adv_cmd_rmap[afi][safi].map) { if (bgp->adv_cmd_rmap[afi][safi].map) {
int ret = 0; route_map_result_t ret;
ret = route_map_apply( ret = route_map_apply(
bgp->adv_cmd_rmap[afi][safi].map, bgp->adv_cmd_rmap[afi][safi].map,
&rn->p, RMAP_BGP, new_select); &rn->p, RMAP_BGP, new_select);
if (ret == RMAP_MATCH) if (ret == RMAP_PERMITMATCH)
bgp_evpn_advertise_type5_route( bgp_evpn_advertise_type5_route(
bgp, &rn->p, new_select->attr, bgp, &rn->p, new_select->attr,
afi, safi); afi, safi);
@ -4557,7 +4557,7 @@ void bgp_static_update(struct bgp *bgp, struct prefix *p,
struct bgp_path_info rmap_path; struct bgp_path_info rmap_path;
struct attr attr; struct attr attr;
struct attr *attr_new; struct attr *attr_new;
int ret; route_map_result_t ret;
#if ENABLE_BGP_VNC #if ENABLE_BGP_VNC
int vnc_implicit_withdraw = 0; int vnc_implicit_withdraw = 0;
#endif #endif
@ -4905,7 +4905,7 @@ static void bgp_static_update_safi(struct bgp *bgp, struct prefix *p,
if (bgp_static->rmap.name) { if (bgp_static->rmap.name) {
struct attr attr_tmp = attr; struct attr attr_tmp = attr;
struct bgp_path_info rmap_path; struct bgp_path_info rmap_path;
int ret; route_map_result_t ret;
rmap_path.peer = bgp->peer_self; rmap_path.peer = bgp->peer_self;
rmap_path.attr = &attr_tmp; rmap_path.attr = &attr_tmp;
@ -6567,7 +6567,7 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p,
struct attr attr; struct attr attr;
struct attr *new_attr; struct attr *new_attr;
afi_t afi; afi_t afi;
int ret; route_map_result_t ret;
struct bgp_redist *red; struct bgp_redist *red;
/* Make default attribute. */ /* Make default attribute. */
@ -9082,7 +9082,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
struct route_map *rmap = output_arg; struct route_map *rmap = output_arg;
struct bgp_path_info path; struct bgp_path_info path;
struct attr dummy_attr; struct attr dummy_attr;
int ret; route_map_result_t ret;
bgp_attr_dup(&dummy_attr, pi->attr); bgp_attr_dup(&dummy_attr, pi->attr);

View File

@ -237,10 +237,9 @@ struct bgp_match_peer_compiled {
/* Compares the peer specified in the 'match peer' clause with the peer /* Compares the peer specified in the 'match peer' clause with the peer
received in bgp_path_info->peer. If it is the same, or if the peer structure received in bgp_path_info->peer. If it is the same, or if the peer structure
received is a peer_group containing it, returns RMAP_MATCH. */ received is a peer_group containing it, returns RMAP_MATCH. */
static route_map_result_t route_match_peer(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_peer(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct bgp_match_peer_compiled *pc; struct bgp_match_peer_compiled *pc;
union sockunion *su; union sockunion *su;
@ -333,10 +332,9 @@ struct route_map_rule_cmd route_match_peer_cmd = {"peer", route_match_peer,
route_match_peer_free}; route_match_peer_free};
#if defined(HAVE_LUA) #if defined(HAVE_LUA)
static route_map_result_t route_match_command(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_command(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
int status = RMAP_NOMATCH; int status = RMAP_NOMATCH;
u_int32_t locpref = 0; u_int32_t locpref = 0;
@ -432,10 +430,9 @@ struct route_map_rule_cmd route_match_command_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 enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_address(void *rule, 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;
@ -472,10 +469,9 @@ struct route_map_rule_cmd route_match_ip_address_cmd = {
/* `match ip next-hop IP_ADDRESS' */ /* `match ip next-hop IP_ADDRESS' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_ip_next_hop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_next_hop(void *rule, 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;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -519,10 +515,9 @@ struct route_map_rule_cmd route_match_ip_next_hop_cmd = {
/* `match ip route-source ACCESS-LIST' */ /* `match ip route-source ACCESS-LIST' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_ip_route_source(void *rule, static enum route_map_match_result_t
const struct prefix *pfx, route_match_ip_route_source(void *rule, const struct prefix *pfx,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct access_list *alist; struct access_list *alist;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -571,7 +566,7 @@ struct route_map_rule_cmd route_match_ip_route_source_cmd = {
/* `match ip address prefix-list PREFIX_LIST' */ /* `match ip address prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -606,7 +601,7 @@ struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd = {
/* `match ip next-hop prefix-list PREFIX_LIST' */ /* `match ip next-hop prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -648,7 +643,7 @@ struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = {
/* `match ip next-hop type <blackhole>' */ /* `match ip next-hop type <blackhole>' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -687,7 +682,7 @@ static struct route_map_rule_cmd route_match_ip_next_hop_type_cmd = {
/* `match ip route-source prefix-list PREFIX_LIST' */ /* `match ip route-source prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_result_t
route_match_ip_route_source_prefix_list(void *rule, route_match_ip_route_source_prefix_list(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
@ -737,10 +732,9 @@ struct route_map_rule_cmd route_match_ip_route_source_prefix_list_cmd = {
/* `match evpn default-route' */ /* `match evpn default-route' */
/* Match function should return 1 if match is success else 0 */ /* Match function should return 1 if match is success else 0 */
static route_map_result_t route_match_evpn_default_route(void *rule, static enum route_map_match_result_t
const struct prefix *p, route_match_evpn_default_route(void *rule, const struct prefix *p,
route_map_object_t route_map_object_t type, void *object)
type, void *object)
{ {
if (type == RMAP_BGP && is_evpn_prefix_default(p)) if (type == RMAP_BGP && is_evpn_prefix_default(p))
return RMAP_MATCH; return RMAP_MATCH;
@ -756,10 +750,9 @@ struct route_map_rule_cmd route_match_evpn_default_route_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_mac_address(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_mac_address(void *rule, 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;
struct prefix p; struct prefix p;
@ -806,9 +799,9 @@ struct route_map_rule_cmd route_match_mac_address_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_vni(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_vni(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
vni_t vni = 0; vni_t vni = 0;
struct bgp_path_info *path = NULL; struct bgp_path_info *path = NULL;
@ -859,10 +852,9 @@ struct route_map_rule_cmd route_match_evpn_vni_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_evpn_route_type(void *rule, static enum route_map_match_result_t
const struct prefix *pfx, route_match_evpn_route_type(void *rule, const struct prefix *pfx,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint8_t route_type = 0; uint8_t route_type = 0;
@ -905,7 +897,7 @@ struct route_map_rule_cmd route_match_evpn_route_type_cmd = {
route_match_evpn_route_type_compile, route_match_evpn_route_type_free}; route_match_evpn_route_type_compile, route_match_evpn_route_type_free};
/* Route map commands for VRF route leak with source vrf matching */ /* Route map commands for VRF route leak with source vrf matching */
static route_map_result_t static enum route_map_match_result_t
route_match_vrl_source_vrf(void *rule, const struct prefix *prefix, route_match_vrl_source_vrf(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
@ -954,10 +946,9 @@ struct route_map_rule_cmd route_match_vrl_source_vrf_cmd = {
/* `match local-preference LOCAL-PREF' */ /* `match local-preference LOCAL-PREF' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_local_pref(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_local_pref(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint32_t *local_pref; uint32_t *local_pref;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1011,10 +1002,9 @@ struct route_map_rule_cmd route_match_local_pref_cmd = {
/* `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 route_map_result_t route_match_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_value *rv; struct rmap_value *rv;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1035,10 +1025,9 @@ struct route_map_rule_cmd route_match_metric_cmd = {
/* `match as-path ASPATH' */ /* `match as-path ASPATH' */
/* Match function for as-path match. I assume given object is */ /* Match function for as-path match. I assume given object is */
static route_map_result_t route_match_aspath(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_aspath(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct as_list *as_list; struct as_list *as_list;
@ -1085,10 +1074,9 @@ struct rmap_community {
}; };
/* Match function for community match. */ /* Match function for community match. */
static route_map_result_t route_match_community(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_community(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct community_list *list; struct community_list *list;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1155,10 +1143,9 @@ struct route_map_rule_cmd route_match_community_cmd = {
route_match_community_free}; route_match_community_free};
/* Match function for lcommunity match. */ /* Match function for lcommunity match. */
static route_map_result_t route_match_lcommunity(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_lcommunity(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct community_list *list; struct community_list *list;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1218,10 +1205,9 @@ struct route_map_rule_cmd route_match_lcommunity_cmd = {
/* Match function for extcommunity match. */ /* Match function for extcommunity match. */
static route_map_result_t route_match_ecommunity(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ecommunity(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct community_list *list; struct community_list *list;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1272,10 +1258,9 @@ struct route_map_rule_cmd route_match_ecommunity_cmd = {
and `address-family vpnv4'. */ and `address-family vpnv4'. */
/* `match origin' */ /* `match origin' */
static route_map_result_t route_match_origin(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_origin(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint8_t *origin; uint8_t *origin;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1320,10 +1305,9 @@ struct route_map_rule_cmd route_match_origin_cmd = {
/* match probability { */ /* match probability { */
static route_map_result_t route_match_probability(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_probability(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
long r = random(); long r = random();
@ -1375,10 +1359,9 @@ struct route_map_rule_cmd route_match_probability_cmd = {
/* `match interface IFNAME' */ /* `match interface IFNAME' */
/* 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_interface(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct interface *ifp; struct interface *ifp;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1422,9 +1405,9 @@ struct route_map_rule_cmd route_match_interface_cmd = {
/* `set ip next-hop IP_ADDRESS' */ /* `set ip next-hop IP_ADDRESS' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_tag(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_tag(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1454,10 +1437,9 @@ struct rmap_ip_nexthop_set {
int unchanged; int unchanged;
}; };
static route_map_result_t route_set_ip_nexthop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_ip_nexthop(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_ip_nexthop_set *rins = rule; struct rmap_ip_nexthop_set *rins = rule;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1560,10 +1542,9 @@ struct route_map_rule_cmd route_set_ip_nexthop_cmd = {
/* `set local-preference LOCAL_PREF' */ /* `set local-preference LOCAL_PREF' */
/* Set local preference. */ /* Set local preference. */
static route_map_result_t route_set_local_pref(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_local_pref(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_value *rv; struct rmap_value *rv;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1595,10 +1576,9 @@ struct route_map_rule_cmd route_set_local_pref_cmd = {
/* `set weight WEIGHT' */ /* `set weight WEIGHT' */
/* Set weight. */ /* Set weight. */
static route_map_result_t route_set_weight(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_weight(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_value *rv; struct rmap_value *rv;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1623,10 +1603,9 @@ struct route_map_rule_cmd route_set_weight_cmd = {
/* `set metric METRIC' */ /* `set metric METRIC' */
/* Set metric to attribute. */ /* Set metric to attribute. */
static route_map_result_t route_set_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_value *rv; struct rmap_value *rv;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1654,10 +1633,9 @@ struct route_map_rule_cmd route_set_metric_cmd = {
/* `set as-path prepend ASPATH' */ /* `set as-path prepend ASPATH' */
/* For AS path prepend mechanism. */ /* For AS path prepend mechanism. */
static route_map_result_t route_set_aspath_prepend(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_aspath_prepend(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct aspath *aspath; struct aspath *aspath;
struct aspath *new; struct aspath *new;
@ -1717,10 +1695,9 @@ struct route_map_rule_cmd route_set_aspath_prepend_cmd = {
* one. * one.
* Make a deep copy of existing AS_PATH, but for the first ASn only. * Make a deep copy of existing AS_PATH, but for the first ASn only.
*/ */
static route_map_result_t route_set_aspath_exclude(void *rule, static enum route_map_match_result_t
const struct prefix *dummy, route_set_aspath_exclude(void *rule, const struct prefix *dummy,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct aspath *new_path, *exclude_path; struct aspath *new_path, *exclude_path;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1752,10 +1729,9 @@ struct rmap_com_set {
}; };
/* For community set mechanism. */ /* For community set mechanism. */
static route_map_result_t route_set_community(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_community(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_com_set *rcs; struct rmap_com_set *rcs;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1868,10 +1844,9 @@ struct rmap_lcom_set {
/* For lcommunity set mechanism. */ /* For lcommunity set mechanism. */
static route_map_result_t route_set_lcommunity(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_lcommunity(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_lcom_set *rcs; struct rmap_lcom_set *rcs;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -1981,10 +1956,9 @@ struct route_map_rule_cmd route_set_lcommunity_cmd = {
/* `set large-comm-list (<1-99>|<100-500>|WORD) delete' */ /* `set large-comm-list (<1-99>|<100-500>|WORD) delete' */
/* For large community set mechanism. */ /* For large community set mechanism. */
static route_map_result_t route_set_lcommunity_delete(void *rule, static enum route_map_match_result_t
const struct prefix *pfx, route_set_lcommunity_delete(void *rule, const struct prefix *pfx,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct community_list *list; struct community_list *list;
struct lcommunity *merge; struct lcommunity *merge;
@ -2065,11 +2039,9 @@ struct route_map_rule_cmd route_set_lcommunity_delete_cmd = {
/* `set comm-list (<1-99>|<100-500>|WORD) delete' */ /* `set comm-list (<1-99>|<100-500>|WORD) delete' */
/* For community set mechanism. */ /* For community set mechanism. */
static route_map_result_t route_set_community_delete( static enum route_map_match_result_t
void *rule, route_set_community_delete(void *rule, const struct prefix *prefix,
const struct prefix *prefix, route_map_object_t type, void *object)
route_map_object_t type,
void *object)
{ {
struct community_list *list; struct community_list *list;
struct community *merge; struct community *merge;
@ -2149,10 +2121,9 @@ struct route_map_rule_cmd route_set_community_delete_cmd = {
/* `set extcommunity rt COMMUNITY' */ /* `set extcommunity rt COMMUNITY' */
/* For community set mechanism. Used by _rt and _soo. */ /* For community set mechanism. Used by _rt and _soo. */
static route_map_result_t route_set_ecommunity(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_ecommunity(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct ecommunity *ecom; struct ecommunity *ecom;
struct ecommunity *new_ecom; struct ecommunity *new_ecom;
@ -2237,10 +2208,9 @@ struct route_map_rule_cmd route_set_ecommunity_soo_cmd = {
/* `set origin ORIGIN' */ /* `set origin ORIGIN' */
/* For origin set. */ /* For origin set. */
static route_map_result_t route_set_origin(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_origin(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint8_t *origin; uint8_t *origin;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2287,10 +2257,9 @@ struct route_map_rule_cmd route_set_origin_cmd = {
/* `set atomic-aggregate' */ /* `set atomic-aggregate' */
/* For atomic aggregate set. */ /* For atomic aggregate set. */
static route_map_result_t route_set_atomic_aggregate(void *rule, static enum route_map_match_result_t
const struct prefix *pfx, route_set_atomic_aggregate(void *rule, const struct prefix *pfx,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2326,10 +2295,9 @@ struct aggregator {
struct in_addr address; struct in_addr address;
}; };
static route_map_result_t route_set_aggregator_as(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_aggregator_as(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct bgp_path_info *path; struct bgp_path_info *path;
struct aggregator *aggregator; struct aggregator *aggregator;
@ -2380,9 +2348,9 @@ struct route_map_rule_cmd route_set_aggregator_as_cmd = {
}; };
/* Set tag to object. object must be pointer to struct bgp_path_info */ /* Set tag to object. object must be pointer to struct bgp_path_info */
static route_map_result_t route_set_tag(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_tag(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2405,10 +2373,9 @@ static struct route_map_rule_cmd route_set_tag_cmd = {
}; };
/* Set label-index to object. object must be pointer to struct bgp_path_info */ /* Set label-index to object. object must be pointer to struct bgp_path_info */
static route_map_result_t route_set_label_index(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_label_index(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rmap_value *rv; struct rmap_value *rv;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2438,10 +2405,9 @@ static struct route_map_rule_cmd route_set_label_index_cmd = {
/* `match ipv6 address IP_ACCESS_LIST' */ /* `match ipv6 address IP_ACCESS_LIST' */
static route_map_result_t route_match_ipv6_address(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ipv6_address(void *rule, 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;
@ -2474,10 +2440,9 @@ struct route_map_rule_cmd route_match_ipv6_address_cmd = {
/* `match ipv6 next-hop IP_ADDRESS' */ /* `match ipv6 next-hop IP_ADDRESS' */
static route_map_result_t route_match_ipv6_next_hop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ipv6_next_hop(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in6_addr *addr = rule; struct in6_addr *addr = rule;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2526,7 +2491,7 @@ struct route_map_rule_cmd route_match_ipv6_next_hop_cmd = {
/* `match ipv6 address prefix-list PREFIX_LIST' */ /* `match ipv6 address prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -2561,9 +2526,9 @@ struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd = {
/* `match ipv6 next-hop type <TYPE>' */ /* `match ipv6 next-hop type <TYPE>' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
struct bgp_path_info *path; struct bgp_path_info *path;
struct in6_addr *addr = rule; struct in6_addr *addr = rule;
@ -2609,10 +2574,9 @@ struct route_map_rule_cmd route_match_ipv6_next_hop_type_cmd = {
/* `set ipv6 nexthop global IP_ADDRESS' */ /* `set ipv6 nexthop global 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 route_map_result_t route_set_ipv6_nexthop_global(void *rule, static enum route_map_match_result_t
const struct prefix *p, route_set_ipv6_nexthop_global(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in6_addr *address; struct in6_addr *address;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2668,7 +2632,7 @@ struct route_map_rule_cmd route_set_ipv6_nexthop_global_cmd = {
route_set_ipv6_nexthop_global_free}; route_set_ipv6_nexthop_global_free};
/* Set next-hop preference value. */ /* Set next-hop preference value. */
static route_map_result_t static enum route_map_match_result_t
route_set_ipv6_nexthop_prefer_global(void *rule, const struct prefix *prefix, route_set_ipv6_nexthop_prefer_global(void *rule, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
@ -2722,10 +2686,9 @@ struct route_map_rule_cmd route_set_ipv6_nexthop_prefer_global_cmd = {
/* `set ipv6 nexthop local IP_ADDRESS' */ /* `set ipv6 nexthop local 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 route_map_result_t route_set_ipv6_nexthop_local(void *rule, static enum route_map_match_result_t
const struct prefix *p, route_set_ipv6_nexthop_local(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in6_addr *address; struct in6_addr *address;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2785,10 +2748,9 @@ struct route_map_rule_cmd route_set_ipv6_nexthop_local_cmd = {
/* `set ipv6 nexthop peer-address' */ /* `set ipv6 nexthop peer-address' */
/* Set nexthop to object. ojbect must be pointer to struct attr. */ /* Set nexthop to object. ojbect must be pointer to struct attr. */
static route_map_result_t route_set_ipv6_nexthop_peer(void *rule, static enum route_map_match_result_t
const struct prefix *pfx, route_set_ipv6_nexthop_peer(void *rule, const struct prefix *pfx,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in6_addr peer_address; struct in6_addr peer_address;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2863,10 +2825,9 @@ struct route_map_rule_cmd route_set_ipv6_nexthop_peer_cmd = {
/* `set ipv4 vpn next-hop A.B.C.D' */ /* `set ipv4 vpn next-hop A.B.C.D' */
static route_map_result_t route_set_vpnv4_nexthop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_vpnv4_nexthop(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in_addr *address; struct in_addr *address;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2903,10 +2864,9 @@ static void *route_set_vpnv4_nexthop_compile(const char *arg)
/* `set ipv6 vpn next-hop A.B.C.D' */ /* `set ipv6 vpn next-hop A.B.C.D' */
static route_map_result_t route_set_vpnv6_nexthop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_vpnv6_nexthop(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in6_addr *address; struct in6_addr *address;
struct bgp_path_info *path; struct bgp_path_info *path;
@ -2959,10 +2919,9 @@ struct route_map_rule_cmd route_set_vpnv6_nexthop_cmd = {
/* `set originator-id' */ /* `set originator-id' */
/* For origin set. */ /* For origin set. */
static route_map_result_t route_set_originator_id(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_originator_id(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in_addr *address; struct in_addr *address;
struct bgp_path_info *path; struct bgp_path_info *path;

View File

@ -129,8 +129,10 @@ static void print_record(const struct pfx_record *record, struct vty *vty);
static int is_synchronized(void); static int is_synchronized(void);
static int is_running(void); static int is_running(void);
static void route_match_free(void *rule); static void route_match_free(void *rule);
static route_map_result_t route_match(void *rule, const struct prefix *prefix, static enum route_map_match_result_t route_match(void *rule,
route_map_object_t type, void *object); const struct prefix *prefix,
route_map_object_t type,
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_node *bgp_node, afi_t afi, static void revalidate_bgp_node(struct bgp_node *bgp_node, afi_t afi,
safi_t safi); safi_t safi);
@ -213,8 +215,10 @@ static void ipv6_addr_to_host_byte_order(const uint32_t *src, uint32_t *dest)
dest[i] = ntohl(src[i]); dest[i] = ntohl(src[i]);
} }
static route_map_result_t route_match(void *rule, const struct prefix *prefix, static enum route_map_match_result_t route_match(void *rule,
route_map_object_t type, void *object) const struct prefix *prefix,
route_map_object_t type,
void *object)
{ {
int *rpki_status = rule; int *rpki_status = rule;
struct bgp_path_info *path; struct bgp_path_info *path;

View File

@ -716,7 +716,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
struct bgp_node *rn; struct bgp_node *rn;
struct bgp_path_info *ri; struct bgp_path_info *ri;
struct peer *peer; struct peer *peer;
int ret = RMAP_DENYMATCH; route_map_result_t ret = RMAP_DENYMATCH;
afi_t afi; afi_t afi;
safi_t safi; safi_t safi;

View File

@ -251,9 +251,9 @@ void eigrp_route_map_update(const char *notused)
/* `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 route_map_result_t route_match_metric(void *rule, struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, route_match_metric(void *rule, struct prefix *prefix, route_map_object_t type,
void *object) void *object)
{ {
// uint32_t *metric; // uint32_t *metric;
// uint32_t check; // uint32_t check;
@ -311,10 +311,9 @@ 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 route_map_result_t route_match_interface(void *rule, static enum route_map_match_result_t
struct prefix *prefix, route_match_interface(void *rule, struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
// struct rip_info *rinfo; // struct rip_info *rinfo;
// struct interface *ifp; // struct interface *ifp;
@ -360,10 +359,9 @@ struct route_map_rule_cmd route_match_interface_cmd = {
/* `match ip next-hop IP_ACCESS_LIST' */ /* `match ip next-hop IP_ACCESS_LIST' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_ip_next_hop(void *rule, static enum route_map_match_result_t
struct prefix *prefix, route_match_ip_next_hop(void *rule, 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;
// struct rip_info *rinfo; // struct rip_info *rinfo;
@ -407,7 +405,7 @@ static struct route_map_rule_cmd route_match_ip_next_hop_cmd = {
/* `match ip next-hop prefix-list PREFIX_LIST' */ /* `match ip next-hop prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_result_t
route_match_ip_next_hop_prefix_list(void *rule, struct prefix *prefix, route_match_ip_next_hop_prefix_list(void *rule, struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
@ -452,10 +450,9 @@ 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 enum route_map_match_result_t
struct prefix *prefix, route_match_ip_address(void *rule, 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;
@ -491,7 +488,7 @@ static 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 route_map_result_t static enum route_map_match_result_t
route_match_ip_address_prefix_list(void *rule, struct prefix *prefix, route_match_ip_address_prefix_list(void *rule, struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
@ -526,8 +523,9 @@ static struct route_map_rule_cmd route_match_ip_address_prefix_list_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 route_map_result_t route_match_tag(void *rule, struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, void *object) route_match_tag(void *rule, struct prefix *prefix, route_map_object_t type,
void *object)
{ {
// unsigned short *tag; // unsigned short *tag;
// struct rip_info *rinfo; // struct rip_info *rinfo;
@ -568,9 +566,9 @@ struct route_map_rule_cmd route_match_tag_cmd = {
"tag", route_match_tag, route_match_tag_compile, route_match_tag_free}; "tag", route_match_tag, route_match_tag_compile, route_match_tag_free};
/* Set metric to attribute. */ /* Set metric to attribute. */
static route_map_result_t route_set_metric(void *rule, struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, route_set_metric(void *rule, struct prefix *prefix,
void *object) route_map_object_t type, void *object)
{ {
// if (type == RMAP_RIP) // if (type == RMAP_RIP)
// { // {
@ -662,10 +660,9 @@ static 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 route_map_result_t route_set_ip_nexthop(void *rule, static enum route_map_match_result_t
struct prefix *prefix, route_set_ip_nexthop(void *rule, struct prefix *prefix,
route_map_object_t type, 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;
@ -718,8 +715,9 @@ static struct route_map_rule_cmd route_set_ip_nexthop_cmd = {
/* `set tag TAG' */ /* `set tag TAG' */
/* Set tag to object. ojbect must be pointer to struct attr. */ /* Set tag to object. ojbect must be pointer to struct attr. */
static route_map_result_t route_set_tag(void *rule, struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, void *object) route_set_tag(void *rule, struct prefix *prefix,
route_map_object_t type, void *object)
{ {
// unsigned short *tag; // unsigned short *tag;
// struct rip_info *rinfo; // struct rip_info *rinfo;

View File

@ -48,10 +48,9 @@
#include "isis_zebra.h" #include "isis_zebra.h"
#include "isis_routemap.h" #include "isis_routemap.h"
static route_map_result_t route_match_ip_address(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_address(void *rule, 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;
@ -81,7 +80,7 @@ static struct route_map_rule_cmd route_match_ip_address_cmd = {
/* ------------------------------------------------------------*/ /* ------------------------------------------------------------*/
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -114,10 +113,9 @@ struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd = {
/* ------------------------------------------------------------*/ /* ------------------------------------------------------------*/
static route_map_result_t route_match_ipv6_address(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ipv6_address(void *rule, 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;
@ -147,7 +145,7 @@ static struct route_map_rule_cmd route_match_ipv6_address_cmd = {
/* ------------------------------------------------------------*/ /* ------------------------------------------------------------*/
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -180,10 +178,9 @@ struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd = {
/* ------------------------------------------------------------*/ /* ------------------------------------------------------------*/
static route_map_result_t route_set_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint32_t *metric; uint32_t *metric;
struct isis_ext_info *info; struct isis_ext_info *info;

View File

@ -1456,14 +1456,14 @@ int route_map_delete_set(struct route_map_index *index, const char *set_name,
(note, this includes the description for the "NEXT" (note, this includes the description for the "NEXT"
and "GOTO" frobs now and "GOTO" frobs now
Match | No Match | Match | No Match | No op
| |-----------|--------------|-------
permit action | cont permit | action | cont | cont.
| | | default:deny | default:permit
------------------+--------------- -------------------+-----------------------
| | deny | cont | cont.
deny deny | cont deny | | default:deny | default:permit
| |-----------|--------------|--------
action) action)
-Apply Set statements, accept route -Apply Set statements, accept route
@ -1497,12 +1497,12 @@ int route_map_delete_set(struct route_map_index *index, const char *set_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
*/ */
static route_map_result_t static enum route_map_match_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, route_map_object_t type,
void *object) void *object)
{ {
route_map_result_t ret = RMAP_NOMATCH; enum route_map_match_result_t ret = RMAP_NOMATCH;
struct route_map_rule *match; struct route_map_rule *match;
@ -1534,7 +1534,8 @@ route_map_result_t route_map_apply(struct route_map *map,
route_map_object_t type, void *object) route_map_object_t type, void *object)
{ {
static int recursion = 0; static int recursion = 0;
int ret = 0; enum route_map_match_result_t match_ret = RMAP_NOMATCH;
route_map_result_t ret = 0;
struct route_map_index *index; struct route_map_index *index;
struct route_map_rule *set; struct route_map_rule *set;
@ -1554,24 +1555,33 @@ route_map_result_t route_map_apply(struct route_map *map,
for (index = map->head; index; index = index->next) { for (index = map->head; index; index = index->next) {
/* Apply this index. */ /* Apply this index. */
index->applied++; index->applied++;
ret = route_map_apply_match(&index->match_list, prefix, type, match_ret = route_map_apply_match(&index->match_list, prefix,
object); type, object);
/* Now we apply the matrix from above */ /* Now we apply the matrix from above */
if (ret == RMAP_NOMATCH) if (match_ret == RMAP_NOMATCH || match_ret == RMAP_NOOP)
/* 'cont' from matrix - continue to next route-map /* 'cont' from matrix - continue to next route-map
* sequence */ * sequence */
continue; continue;
else if (ret == RMAP_MATCH) { else if (match_ret == RMAP_MATCH) {
if (index->type == RMAP_PERMIT) if (index->type == RMAP_PERMIT)
/* 'action' */ /* 'action' */
{ {
/* Match succeeded, rmap is of type permit */
ret = RMAP_PERMITMATCH;
/* permit+match must execute sets */ /* permit+match must execute sets */
for (set = index->set_list.head; set; for (set = index->set_list.head; set;
set = set->next) set = set->next)
ret = (*set->cmd->func_apply)( /*
set->value, prefix, type, * We dont care abt the return value
object); * for set cmd. Almost always,
* RMAP_OKAY is returned. Rarely
* do we see RMAP_ERROR
*/
match_ret = (*set->cmd->func_apply)(
set->value, prefix, type,
object);
/* Call another route-map if available */ /* Call another route-map if available */
if (index->nextrm) { if (index->nextrm) {
@ -1622,6 +1632,10 @@ route_map_result_t route_map_apply(struct route_map *map,
} }
} }
} }
if (match_ret == RMAP_NOOP)
return RMAP_PERMITMATCH;
/* Finally route-map does not match at all. */ /* Finally route-map does not match at all. */
return RMAP_DENYMATCH; return RMAP_DENYMATCH;
} }

View File

@ -34,15 +34,36 @@ DECLARE_MTYPE(ROUTE_MAP_NAME)
DECLARE_MTYPE(ROUTE_MAP_RULE) DECLARE_MTYPE(ROUTE_MAP_RULE)
DECLARE_MTYPE(ROUTE_MAP_COMPILED) DECLARE_MTYPE(ROUTE_MAP_COMPILED)
/*
* Route-map match or set result "Eg: match evpn vni xx"
* route-map match cmd always returns match/nomatch/noop
* match--> found a match
* nomatch--> didnt find a match
* noop--> invalid
* route-map set retuns okay/error
* okay --> set was successful
* error --> set was not successful
*/
enum route_map_match_result_t {
/*
* route-map match cmd results
*/
RMAP_MATCH,
RMAP_NOMATCH,
RMAP_NOOP,
/*
* route-map set cmd results
*/
RMAP_OKAY,
RMAP_ERROR
};
/* Route map's type. */ /* Route map's type. */
enum route_map_type { RMAP_PERMIT, RMAP_DENY, RMAP_ANY }; enum route_map_type { RMAP_PERMIT, RMAP_DENY, RMAP_ANY };
typedef enum { typedef enum {
RMAP_MATCH,
RMAP_DENYMATCH, RMAP_DENYMATCH,
RMAP_NOMATCH, RMAP_PERMITMATCH
RMAP_ERROR,
RMAP_OKAY
} route_map_result_t; } route_map_result_t;
typedef enum { typedef enum {
@ -91,10 +112,10 @@ struct route_map_rule_cmd {
const char *str; const char *str;
/* Function for value set or match. */ /* Function for value set or match. */
route_map_result_t (*func_apply)(void *rule, enum route_map_match_result_t (*func_apply)(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type,
void *object); void *object);
/* Compile argument and return result as void *. */ /* Compile argument and return result as void *. */
void *(*func_compile)(const char *); void *(*func_compile)(const char *);

View File

@ -1018,7 +1018,7 @@ void ospf6_asbr_redistribute_add(int type, ifindex_t ifindex,
unsigned int nexthop_num, unsigned int nexthop_num,
struct in6_addr *nexthop, route_tag_t tag) struct in6_addr *nexthop, route_tag_t tag)
{ {
int ret; route_map_result_t ret;
struct ospf6_route troute; struct ospf6_route troute;
struct ospf6_external_info tinfo; struct ospf6_external_info tinfo;
struct ospf6_route *route, *match; struct ospf6_route *route, *match;
@ -1355,7 +1355,7 @@ static void ospf6_redistribute_show_config(struct vty *vty)
/* Routemap Functions */ /* Routemap Functions */
static route_map_result_t static enum route_map_match_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, route_map_object_t type,
@ -1395,7 +1395,7 @@ struct route_map_rule_cmd ospf6_routemap_rule_match_address_prefixlist_cmd = {
/* `match interface IFNAME' */ /* `match interface IFNAME' */
/* 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 static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1433,10 +1433,9 @@ struct route_map_rule_cmd ospf6_routemap_rule_match_interface_cmd = {
ospf6_routemap_rule_match_interface_free}; ospf6_routemap_rule_match_interface_free};
/* Match function for matching route tags */ /* Match function for matching route tags */
static route_map_result_t ospf6_routemap_rule_match_tag(void *rule, static enum route_map_match_result_t
const struct prefix *p, ospf6_routemap_rule_match_tag(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
route_tag_t *tag = rule; route_tag_t *tag = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;
@ -1453,7 +1452,7 @@ static struct route_map_rule_cmd ospf6_routemap_rule_match_tag_cmd = {
route_map_rule_tag_free, route_map_rule_tag_free,
}; };
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1489,7 +1488,7 @@ struct route_map_rule_cmd ospf6_routemap_rule_set_metric_type_cmd = {
ospf6_routemap_rule_set_metric_type_free, ospf6_routemap_rule_set_metric_type_free,
}; };
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1524,7 +1523,7 @@ struct route_map_rule_cmd ospf6_routemap_rule_set_metric_cmd = {
ospf6_routemap_rule_set_metric_free, ospf6_routemap_rule_set_metric_free,
}; };
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1562,10 +1561,9 @@ struct route_map_rule_cmd ospf6_routemap_rule_set_forwarding_cmd = {
ospf6_routemap_rule_set_forwarding_free, ospf6_routemap_rule_set_forwarding_free,
}; };
static route_map_result_t ospf6_routemap_rule_set_tag(void *rule, static enum route_map_match_result_t
const struct prefix *p, ospf6_routemap_rule_set_tag(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
route_tag_t *tag = rule; route_tag_t *tag = rule;
struct ospf6_route *route = object; struct ospf6_route *route = object;

View File

@ -126,10 +126,9 @@ 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 route_map_result_t route_match_ip_nexthop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_nexthop(void *rule, 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;
struct external_info *ei = object; struct external_info *ei = object;
@ -171,7 +170,7 @@ struct route_map_rule_cmd route_match_ip_nexthop_cmd = {
/* `match ip next-hop prefix-list PREFIX_LIST' */ /* `match ip next-hop prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -213,10 +212,9 @@ struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = {
/* `match ip address IP_ACCESS_LIST' */ /* `match ip address IP_ACCESS_LIST' */
/* 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 enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_address(void *rule, 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;
/* struct prefix_ipv4 match; */ /* struct prefix_ipv4 match; */
@ -252,7 +250,7 @@ struct route_map_rule_cmd route_match_ip_address_cmd = {
route_match_ip_address_free}; route_match_ip_address_free};
/* `match ip address prefix-list PREFIX_LIST' */ /* `match ip address prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -288,10 +286,9 @@ struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd = {
/* `match interface IFNAME' */ /* `match interface IFNAME' */
/* 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_interface(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct interface *ifp; struct interface *ifp;
struct external_info *ei; struct external_info *ei;
@ -327,9 +324,9 @@ struct route_map_rule_cmd route_match_interface_cmd = {
route_match_interface_free}; route_match_interface_free};
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_tag(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_tag(void *rule, const struct prefix *prefix,
route_map_object_t type, 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;
@ -358,10 +355,9 @@ struct ospf_metric {
/* `set metric METRIC' */ /* `set metric METRIC' */
/* Set metric to attribute. */ /* Set metric to attribute. */
static route_map_result_t route_set_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct ospf_metric *metric; struct ospf_metric *metric;
struct external_info *ei; struct external_info *ei;
@ -439,10 +435,9 @@ 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 route_map_result_t route_set_metric_type(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_metric_type(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint32_t *metric_type; uint32_t *metric_type;
struct external_info *ei; struct external_info *ei;
@ -489,8 +484,9 @@ struct route_map_rule_cmd route_set_metric_type_cmd = {
route_set_metric_type_free, route_set_metric_type_free,
}; };
static route_map_result_t route_set_tag(void *rule, const struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, void *object) route_set_tag(void *rule, const struct prefix *prefix, route_map_object_t type,
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct external_info *ei; struct external_info *ei;

View File

@ -943,7 +943,7 @@ int ospf_redistribute_check(struct ospf *ospf, struct external_info *ei,
/* apply route-map if needed */ /* apply route-map if needed */
red = ospf_redist_lookup(ospf, type, instance); red = ospf_redist_lookup(ospf, type, instance);
if (red && ROUTEMAP_NAME(red)) { if (red && ROUTEMAP_NAME(red)) {
int ret; route_map_result_t ret;
ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p, ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p,
RMAP_OSPF, ei); RMAP_OSPF, ei);

View File

@ -42,10 +42,9 @@ 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 route_map_result_t route_match_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint32_t *metric; uint32_t *metric;
uint32_t check; uint32_t check;
@ -95,10 +94,9 @@ 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 route_map_result_t route_match_interface(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct rip_info *rinfo; struct rip_info *rinfo;
struct interface *ifp; struct interface *ifp;
@ -143,10 +141,9 @@ struct route_map_rule_cmd route_match_interface_cmd = {
/* `match ip next-hop IP_ACCESS_LIST' */ /* `match ip next-hop IP_ACCESS_LIST' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_ip_next_hop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_next_hop(void *rule, 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;
struct rip_info *rinfo; struct rip_info *rinfo;
@ -190,7 +187,7 @@ static struct route_map_rule_cmd route_match_ip_next_hop_cmd = {
/* `match ip next-hop prefix-list PREFIX_LIST' */ /* `match ip next-hop prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -235,10 +232,9 @@ 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 enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_address(void *rule, 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;
@ -274,7 +270,7 @@ static 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 route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -309,8 +305,9 @@ static struct route_map_rule_cmd route_match_ip_address_prefix_list_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 route_map_result_t route_match_tag(void *rule, const struct prefix *p, static enum route_map_match_result_t
route_map_object_t type, void *object) route_match_tag(void *rule, const struct prefix *p, route_map_object_t type,
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct rip_info *rinfo; struct rip_info *rinfo;
@ -339,10 +336,9 @@ static struct route_map_rule_cmd route_match_tag_cmd = {
/* `set metric METRIC' */ /* `set metric METRIC' */
/* Set metric to attribute. */ /* Set metric to attribute. */
static route_map_result_t route_set_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
if (type == RMAP_RIP) { if (type == RMAP_RIP) {
struct rip_metric_modifier *mod; struct rip_metric_modifier *mod;
@ -438,7 +434,7 @@ static 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 route_map_result_t route_set_ip_nexthop(void *rule, static enum route_map_match_result_t route_set_ip_nexthop(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type,
void *object) void *object)
@ -491,8 +487,9 @@ static struct route_map_rule_cmd route_set_ip_nexthop_cmd = {
/* `set tag TAG' */ /* `set tag TAG' */
/* Set tag to object. ojbect must be pointer to struct attr. */ /* Set tag to object. ojbect must be pointer to struct attr. */
static route_map_result_t route_set_tag(void *rule, const struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, void *object) route_set_tag(void *rule, const struct prefix *prefix, route_map_object_t type,
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct rip_info *rinfo; struct rip_info *rinfo;

View File

@ -38,10 +38,9 @@ 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 route_map_result_t route_match_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
uint32_t *metric; uint32_t *metric;
struct ripng_info *rinfo; struct ripng_info *rinfo;
@ -86,10 +85,9 @@ static 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 route_map_result_t route_match_interface(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct ripng_info *rinfo; struct ripng_info *rinfo;
struct interface *ifp; struct interface *ifp;
@ -129,9 +127,10 @@ static struct route_map_rule_cmd route_match_interface_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 route_map_result_t route_match_tag(void *rule, static enum route_map_match_result_t route_match_tag(void *rule,
const struct prefix *prefix, const struct prefix *prefix,
route_map_object_t type, void *object) route_map_object_t type,
void *object)
{ {
route_tag_t *tag; route_tag_t *tag;
struct ripng_info *rinfo; struct ripng_info *rinfo;
@ -159,10 +158,9 @@ static struct route_map_rule_cmd route_match_tag_cmd = {
/* `set metric METRIC' */ /* `set metric METRIC' */
/* Set metric to attribute. */ /* Set metric to attribute. */
static route_map_result_t route_set_metric(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_metric(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
if (type == RMAP_RIPNG) { if (type == RMAP_RIPNG) {
struct rip_metric_modifier *mod; struct rip_metric_modifier *mod;
@ -256,10 +254,9 @@ static struct route_map_rule_cmd route_set_metric_cmd = {
/* `set ipv6 next-hop local IP_ADDRESS' */ /* `set ipv6 next-hop local 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 route_map_result_t route_set_ipv6_nexthop_local(void *rule, static enum route_map_match_result_t
const struct prefix *p, route_set_ipv6_nexthop_local(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct in6_addr *address; struct in6_addr *address;
struct ripng_info *rinfo; struct ripng_info *rinfo;
@ -310,9 +307,9 @@ static struct route_map_rule_cmd route_set_ipv6_nexthop_local_cmd = {
/* `set tag TAG' */ /* `set tag TAG' */
/* Set tag to object. ojbect must be pointer to struct attr. */ /* Set tag to object. ojbect must be pointer to struct attr. */
static route_map_result_t route_set_tag(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_set_tag(void *rule, const struct prefix *prefix, route_map_object_t type,
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;

View File

@ -574,7 +574,7 @@ int zebra_add_import_table_entry(struct route_node *rn, struct route_entry *re,
struct route_entry *newre; struct route_entry *newre;
struct route_entry *same; struct route_entry *same;
struct prefix p; struct prefix p;
route_map_result_t ret = RMAP_MATCH; route_map_result_t ret = RMAP_PERMITMATCH;
afi_t afi; afi_t afi;
afi = family2afi(rn->p.family); afi = family2afi(rn->p.family);
@ -583,7 +583,7 @@ int zebra_add_import_table_entry(struct route_node *rn, struct route_entry *re,
afi, re->type, re->instance, &rn->p, re->ng.nexthop, afi, re->type, re->instance, &rn->p, re->ng.nexthop,
re->vrf_id, re->tag, rmap_name); re->vrf_id, re->tag, rmap_name);
if (ret != RMAP_MATCH) { if (ret != RMAP_PERMITMATCH) {
UNSET_FLAG(re->flags, ZEBRA_FLAG_SELECTED); UNSET_FLAG(re->flags, ZEBRA_FLAG_SELECTED);
zebra_del_import_table_entry(rn, re); zebra_del_import_table_entry(rn, re);
return 0; return 0;

View File

@ -338,7 +338,7 @@ static unsigned nexthop_active_check(struct route_node *rn,
struct nexthop *nexthop) struct nexthop *nexthop)
{ {
struct interface *ifp; struct interface *ifp;
route_map_result_t ret = RMAP_MATCH; route_map_result_t ret = RMAP_PERMITMATCH;
int family; int family;
char buf[SRCDEST2STR_BUFFER]; char buf[SRCDEST2STR_BUFFER];
const struct prefix *p, *src_p; const struct prefix *p, *src_p;

View File

@ -400,7 +400,7 @@ static int zebra_rnh_apply_nht_rmap(afi_t afi, struct zebra_vrf *zvrf,
{ {
int at_least_one = 0; int at_least_one = 0;
struct nexthop *nexthop; struct nexthop *nexthop;
int ret; route_map_result_t ret;
if (prn && re) { if (prn && re) {
for (nexthop = re->ng.nexthop; nexthop; for (nexthop = re->ng.nexthop; nexthop;

View File

@ -136,9 +136,9 @@ static int zebra_route_match_delete(struct vty *vty, const char *command,
/* 'match tag TAG' /* 'match tag TAG'
* Match function return 1 if match is success else return 0 * Match function return 1 if match is success else return 0
*/ */
static route_map_result_t route_match_tag(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_tag(void *rule, const struct prefix *prefix,
route_map_object_t type, 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;
@ -162,10 +162,9 @@ static 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 route_map_result_t route_match_interface(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_interface(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
char *ifname = rule; char *ifname = rule;
@ -1025,10 +1024,9 @@ DEFPY (show_ipv6_protocol_nht,
/* `match ip next-hop IP_ACCESS_LIST' */ /* `match ip next-hop IP_ACCESS_LIST' */
/* Match function return 1 if match is success else return zero. */ /* Match function return 1 if match is success else return zero. */
static route_map_result_t route_match_ip_next_hop(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_next_hop(void *rule, 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;
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
@ -1083,7 +1081,7 @@ static struct route_map_rule_cmd route_match_ip_next_hop_cmd = {
/* `match ip next-hop prefix-list PREFIX_LIST' */ /* `match ip next-hop prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1139,10 +1137,9 @@ 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_address(afi_t afi, void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_address(afi_t afi, void *rule, 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;
@ -1158,19 +1155,16 @@ static route_map_result_t route_match_address(afi_t afi, void *rule,
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
static route_map_result_t route_match_ip_address(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ip_address(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
return route_match_address(AFI_IP, rule, prefix, type, object); return route_match_address(AFI_IP, rule, prefix, type, object);
} }
static route_map_result_t route_match_ipv6_address(void *rule, static enum route_map_match_result_t
const struct prefix *prefix, route_match_ipv6_address(void *rule, const struct prefix *prefix,
route_map_object_t type, route_map_object_t type, void *object)
void *object)
{ {
return route_match_address(AFI_IP6, rule, prefix, type, object); return route_match_address(AFI_IP6, rule, prefix, type, object);
} }
@ -1200,7 +1194,7 @@ static struct route_map_rule_cmd route_match_ipv6_address_cmd = {
/* `match ip address prefix-list PREFIX_LIST' */ /* `match ip address prefix-list PREFIX_LIST' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object, afi_t afi)
{ {
@ -1218,7 +1212,7 @@ route_match_address_prefix_list(void *rule, const struct prefix *prefix,
return RMAP_NOMATCH; return RMAP_NOMATCH;
} }
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1241,7 +1235,7 @@ static struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd = {
route_match_address_prefix_list_compile, route_match_address_prefix_list_compile,
route_match_address_prefix_list_free}; route_match_address_prefix_list_free};
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1256,7 +1250,7 @@ static struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd = {
/* `match ip address prefix-len PREFIXLEN' */ /* `match ip address prefix-len PREFIXLEN' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1307,7 +1301,7 @@ static struct route_map_rule_cmd route_match_ipv6_address_prefix_len_cmd = {
/* `match ip nexthop prefix-len PREFIXLEN' */ /* `match ip nexthop prefix-len PREFIXLEN' */
static route_map_result_t static enum route_map_match_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) route_map_object_t type, void *object)
{ {
@ -1347,10 +1341,9 @@ static struct route_map_rule_cmd route_match_ip_nexthop_prefix_len_cmd = {
/* `match source-protocol PROTOCOL' */ /* `match source-protocol PROTOCOL' */
static route_map_result_t route_match_source_protocol(void *rule, static enum route_map_match_result_t
const struct prefix *p, route_match_source_protocol(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
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;
@ -1389,10 +1382,9 @@ static struct route_map_rule_cmd route_match_source_protocol_cmd = {
route_match_source_protocol_compile, route_match_source_protocol_free}; route_match_source_protocol_compile, route_match_source_protocol_free};
/* `source-instance` */ /* `source-instance` */
static route_map_result_t route_match_source_instance(void *rule, static enum route_map_match_result_t
const struct prefix *p, route_match_source_instance(void *rule, const struct prefix *p,
route_map_object_t type, route_map_object_t type, void *object)
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;
@ -1432,8 +1424,9 @@ static struct route_map_rule_cmd route_match_source_instance_cmd = {
/* `set src A.B.C.D' */ /* `set src A.B.C.D' */
/* Set src. */ /* Set src. */
static route_map_result_t route_set_src(void *rule, const struct prefix *prefix, static enum route_map_match_result_t
route_map_object_t type, void *object) route_set_src(void *rule, const struct prefix *prefix, route_map_object_t type,
void *object)
{ {
struct nh_rmap_obj *nh_data; struct nh_rmap_obj *nh_data;
@ -1699,7 +1692,7 @@ zebra_route_map_check(int family, int rib_type, uint8_t instance,
struct zebra_vrf *zvrf, route_tag_t tag) struct zebra_vrf *zvrf, route_tag_t tag)
{ {
struct route_map *rmap = NULL; struct route_map *rmap = NULL;
route_map_result_t ret = RMAP_MATCH; route_map_result_t ret = RMAP_PERMITMATCH;
struct nh_rmap_obj nh_obj; struct nh_rmap_obj nh_obj;
nh_obj.nexthop = nexthop; nh_obj.nexthop = nexthop;
@ -1745,7 +1738,7 @@ zebra_import_table_route_map_check(int family, int re_type, uint8_t instance,
const char *rmap_name) const char *rmap_name)
{ {
struct route_map *rmap = NULL; struct route_map *rmap = NULL;
route_map_result_t ret = RMAP_DENYMATCH; enum route_map_match_result_t ret = RMAP_DENYMATCH;
struct nh_rmap_obj nh_obj; struct nh_rmap_obj nh_obj;
nh_obj.nexthop = nexthop; nh_obj.nexthop = nexthop;
@ -1771,7 +1764,7 @@ route_map_result_t zebra_nht_route_map_check(afi_t afi, int client_proto,
struct nexthop *nexthop) struct nexthop *nexthop)
{ {
struct route_map *rmap = NULL; struct route_map *rmap = NULL;
route_map_result_t ret = RMAP_MATCH; route_map_result_t ret = RMAP_PERMITMATCH;
struct nh_rmap_obj nh_obj; struct nh_rmap_obj nh_obj;
nh_obj.nexthop = nexthop; nh_obj.nexthop = nexthop;