From: Donatas Abraitis Date: Thu, 29 Oct 2020 19:41:12 +0000 (+0200) Subject: bgpd: Handle route-maps properly for `default-originate route-map` command X-Git-Tag: frr-7.5.1~37^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=6bb008588b53ddaa124f52966047c90555799665;p=mirror%2Ffrr.git bgpd: Handle route-maps properly for `default-originate route-map` command The problem is that only prefixes were handled and any other `match` commands were ignored. Let's do not forget them as well. Signed-off-by: Donatas Abraitis --- diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 7ad0580678..1c646c03e3 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -1613,7 +1613,7 @@ void bgp_attr_add_gshut_community(struct attr *attr) } -static void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr) +void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr) { if (family == AF_INET) { attr->nexthop.s_addr = INADDR_ANY; diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index 3f734d2672..9b711a1444 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -684,4 +684,5 @@ extern bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi, struct attr *attr, struct bgp_dest *dest); extern int bgp_evpn_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, struct bgp_path_info *exist, int *paths_eq); +extern void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr); #endif /* _QUAGGA_BGP_ROUTE_H */ diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c index 76bf2db05b..4524d1be71 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c @@ -726,7 +726,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) struct bgp *bgp; struct attr attr; struct attr *new_attr = &attr; - struct aspath *aspath; struct prefix p; struct peer *from; struct bgp_dest *dest; @@ -751,7 +750,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) from = bgp->peer_self; bgp_attr_default_set(&attr, BGP_ORIGIN_IGP); - aspath = attr.aspath; attr.local_pref = bgp->default_local_pref; @@ -767,12 +765,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) } if (peer->default_rmap[afi][safi].name) { - struct attr attr_tmp = attr; - struct bgp_path_info bpi_rmap = {0}; - - bpi_rmap.peer = bgp->peer_self; - bpi_rmap.attr = &attr_tmp; - SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT); /* Iterate over the RIB to see if we can announce @@ -784,20 +776,45 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) if (!bgp_dest_has_bgp_path_info_data(dest)) continue; - ret = route_map_apply(peer->default_rmap[afi][safi].map, - bgp_dest_get_prefix(dest), - RMAP_BGP, &bpi_rmap); + for (pi = bgp_dest_get_bgp_path_info(dest); pi; + pi = pi->next) { + struct attr tmp_attr; + struct bgp_path_info tmp_pi; + struct bgp_path_info_extra tmp_pie; + + tmp_attr = *pi->attr; + + prep_for_rmap_apply(&tmp_pi, &tmp_pie, dest, pi, + pi->peer, &tmp_attr); - if (ret != RMAP_DENYMATCH) + ret = route_map_apply( + peer->default_rmap[afi][safi].map, + bgp_dest_get_prefix(dest), RMAP_BGP, + &tmp_pi); + + if (ret == RMAP_DENYMATCH) { + bgp_attr_flush(&tmp_attr); + continue; + } else { + new_attr = bgp_attr_intern(&tmp_attr); + new_attr->aspath = attr.aspath; + + subgroup_announce_reset_nhop( + (peer_cap_enhe(peer, afi, safi) + ? AF_INET6 + : AF_INET), + new_attr); + + break; + } + } + if (ret == RMAP_PERMITMATCH) break; } bgp->peer_self->rmap_type = 0; - new_attr = bgp_attr_intern(&attr_tmp); - if (ret == RMAP_DENYMATCH) { - bgp_attr_flush(&attr_tmp); + if (ret == RMAP_DENYMATCH) withdraw = 1; - } } /* Check if the default route is in local BGP RIB which is @@ -876,8 +893,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) subgroup_default_update_packet(subgrp, new_attr, from); } } - - aspath_unintern(&aspath); } /*