struct peer *peer;
struct bgp_adj_out *adj;
route_map_result_t ret = RMAP_DENYMATCH;
+ route_map_result_t new_ret = RMAP_DENYMATCH;
afi_t afi;
safi_t safi;
+ int pref = 65536;
+ int new_pref = 0;
if (!subgrp)
return;
tmp_pi.attr = &tmp_attr;
- ret = route_map_apply_ext(
+ new_ret = route_map_apply_ext(
peer->default_rmap[afi][safi].map,
- bgp_dest_get_prefix(dest), pi, &tmp_pi);
-
- if (ret == RMAP_DENYMATCH) {
- bgp_attr_flush(&tmp_attr);
- continue;
- } else {
- new_attr = bgp_attr_intern(&tmp_attr);
-
+ bgp_dest_get_prefix(dest), pi, &tmp_pi,
+ &new_pref);
+
+ if (new_ret == RMAP_PERMITMATCH) {
+ if (new_pref < pref) {
+ pref = new_pref;
+ bgp_attr_flush(new_attr);
+ new_attr = bgp_attr_intern(
+ tmp_pi.attr);
+ bgp_attr_flush(tmp_pi.attr);
+ }
subgroup_announce_reset_nhop(
(peer_cap_enhe(peer, afi, safi)
? AF_INET6
: AF_INET),
new_attr);
-
- break;
- }
- }
- if (ret == RMAP_PERMITMATCH) {
- bgp_dest_unlock_node(dest);
- break;
+ ret = new_ret;
+ } else
+ bgp_attr_flush(&tmp_attr);
}
}
bgp->peer_self->rmap_type = 0;
*/
route_map_result_t route_map_apply_ext(struct route_map *map,
const struct prefix *prefix,
- void *match_object, void *set_object)
+ void *match_object, void *set_object,
+ int *pref)
{
static int recursion = 0;
enum route_map_cmd_result_t match_ret = RMAP_NOMATCH;
ret = route_map_apply_ext(
nextrm, prefix,
match_object,
- set_object);
+ set_object, NULL);
recursion--;
}
(map ? map->name : "null"), prefix,
route_map_result_str(ret));
+ if (pref) {
+ if (index != NULL && ret == RMAP_PERMITMATCH)
+ *pref = index->pref;
+ else
+ *pref = 65536;
+ }
+
return (ret);
}
extern route_map_result_t route_map_apply_ext(struct route_map *map,
const struct prefix *prefix,
void *match_object,
- void *set_object);
+ void *set_object, int *pref);
#define route_map_apply(map, prefix, object) \
- route_map_apply_ext(map, prefix, object, object)
+ route_map_apply_ext(map, prefix, object, object, NULL)
extern void route_map_add_hook(void (*func)(const char *));
extern void route_map_delete_hook(void (*func)(const char *));