diff options
| author | Chirag Shah <chirag@nvidia.com> | 2023-09-22 17:19:09 -0700 |
|---|---|---|
| committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2023-11-30 11:41:09 +0200 |
| commit | df4906f6cb1bb78f9a4957de6479286b4d839c3f (patch) | |
| tree | 8b9d27028c4ca31ce6df8682833ccdbcec9d7b83 | |
| parent | 154b3f61e9409fa6fd6f38647f9e833e7c2025ab (diff) | |
bgpd: aggr summary-only suppressed export to evpn
When exporting bgp vrf instance unicast route into
EVPN as type-5, check for suppressed ones and do not
export them.
Ticket:#3534718
Testing Done:
Config:
router bgp 660000 vrf vrf1
bgp router-id 144.1.1.2
no bgp network import-check
neighbor 144.1.1.1 remote-as external
!
address-family ipv4 unicast
aggregate-address 50.1.0.0/16 summary-only
redistribute connected
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
exit
v4 suppressed route: (5 suppressed routes not exported to evpn)
tor1# vtysh -c "show bgp vrf vrf1 ipv4 unicast" | grep "50.1"
*> 50.1.0.0/16 0.0.0.0(bordertor-11)
s> 50.1.1.212/32 6.0.0.30(leaf-11)<
s> 50.1.1.222/32 6.0.0.31(leaf-11)<
s> 50.1.110.0/24 0.0.0.0(bordertor-11)
s> 50.1.210.214/32 6.0.0.30(leaf-11)<
s> 50.1.220.224/32 6.0.0.31(leaf-11)<
tor1# vtysh -c "show bgp l2vpn evpn route" | grep -A3 "*> \[5\].*\[50.1"
*> [5]:[0]:[16]:[50.1.0.0] RD 144.1.1.2:7
6.0.0.1 (bordertor-11)
0 32768 ?
ET:8 RT:4640:104001 Rmac:00:02:00:00:00:04
Signed-off-by: Chirag Shah <chirag@nvidia.com>
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
| -rw-r--r-- | bgpd/bgp_evpn.c | 33 | ||||
| -rw-r--r-- | bgpd/bgp_evpn.h | 27 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_route.h | 1 |
4 files changed, 36 insertions, 27 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index cbd474cdcb..64b1fb18da 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -309,6 +309,39 @@ static int is_vni_present_in_irt_vnis(struct list *vnis, struct bgpevpn *vpn) return 0; } +/* Flag if the route is injectable into EVPN. + * This would be following category: + * Non-imported route, + * Non-EVPN imported route, + * Non Aggregate suppressed route. + */ +bool is_route_injectable_into_evpn(struct bgp_path_info *pi) +{ + struct bgp_path_info *parent_pi; + struct bgp_table *table; + struct bgp_dest *dest; + + /* do not import aggr suppressed routes */ + if (bgp_path_suppressed(pi)) + return false; + + if (pi->sub_type != BGP_ROUTE_IMPORTED || !pi->extra || + !pi->extra || !pi->extra->parent) + return true; + + parent_pi = (struct bgp_path_info *)pi->extra->parent; + dest = parent_pi->net; + if (!dest) + return true; + table = bgp_dest_table(dest); + if (table && + table->afi == AFI_L2VPN && + table->safi == SAFI_EVPN) + return false; + + return true; +} + /* * Compare Route Targets. */ diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h index a034bfbd7e..a1be06a4e4 100644 --- a/bgpd/bgp_evpn.h +++ b/bgpd/bgp_evpn.h @@ -94,32 +94,6 @@ static inline bool is_pi_family_evpn(struct bgp_path_info *pi) return is_pi_family_matching(pi, AFI_L2VPN, SAFI_EVPN); } -/* Flag if the route is injectable into EVPN. This would be either a - * non-imported route or a non-EVPN imported route. - */ -static inline bool is_route_injectable_into_evpn(struct bgp_path_info *pi) -{ - struct bgp_path_info *parent_pi; - struct bgp_table *table; - struct bgp_dest *dest; - - if (pi->sub_type != BGP_ROUTE_IMPORTED || - !pi->extra || - !pi->extra->parent) - return true; - - parent_pi = (struct bgp_path_info *)pi->extra->parent; - dest = parent_pi->net; - if (!dest) - return true; - table = bgp_dest_table(dest); - if (table && - table->afi == AFI_L2VPN && - table->safi == SAFI_EVPN) - return false; - return true; -} - static inline bool evpn_resolve_overlay_index(void) { struct bgp *bgp = NULL; @@ -198,5 +172,6 @@ extern mpls_label_t *bgp_evpn_path_info_labels_get_l3vni(mpls_label_t *labels, extern vni_t bgp_evpn_path_info_get_l3vni(const struct bgp_path_info *pi); extern bool bgp_evpn_mpath_has_dvni(const struct bgp *bgp_vrf, struct bgp_path_info *mpinfo); +extern bool is_route_injectable_into_evpn(struct bgp_path_info *pi); #endif /* _QUAGGA_BGP_EVPN_H */ diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 0885c9f1a9..2cd61b94b0 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -113,7 +113,7 @@ DEFINE_HOOK(bgp_process, (bgp, afi, safi, bn, peer, withdraw)); /** Test if path is suppressed. */ -static bool bgp_path_suppressed(struct bgp_path_info *pi) +bool bgp_path_suppressed(struct bgp_path_info *pi) { if (pi->extra == NULL || pi->extra->aggr_suppressors == NULL) return false; diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index d5a00059ad..b429578b0d 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -877,6 +877,7 @@ extern void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, extern void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr); const char * bgp_path_selection_reason2str(enum bgp_path_selection_reason reason); +extern bool bgp_path_suppressed(struct bgp_path_info *pi); extern bool bgp_addpath_encode_rx(struct peer *peer, afi_t afi, safi_t safi); extern const struct prefix_rd *bgp_rd_from_dest(const struct bgp_dest *dest, safi_t safi); |
