mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-26 00:10:24 +00:00
Merge pull request #15377 from opensourcerouting/fix/bgpd_evpn_route_map
lib: Do not convert EVPN prefixes into IPv4/IPv6 if not needed
This commit is contained in:
commit
8dbfc57ec6
@ -2548,7 +2548,6 @@ route_map_result_t route_map_apply_ext(struct route_map *map,
|
|||||||
struct route_map_index *index = NULL;
|
struct route_map_index *index = NULL;
|
||||||
struct route_map_rule *set = NULL;
|
struct route_map_rule *set = NULL;
|
||||||
bool skip_match_clause = false;
|
bool skip_match_clause = false;
|
||||||
struct prefix conv;
|
|
||||||
|
|
||||||
if (recursion > RMAP_RECURSION_LIMIT) {
|
if (recursion > RMAP_RECURSION_LIMIT) {
|
||||||
if (map)
|
if (map)
|
||||||
@ -2571,31 +2570,14 @@ route_map_result_t route_map_apply_ext(struct route_map *map,
|
|||||||
|
|
||||||
map->applied++;
|
map->applied++;
|
||||||
|
|
||||||
/*
|
|
||||||
* Handling for matching evpn_routes in the prefix table.
|
|
||||||
*
|
|
||||||
* We convert type2/5 prefix to ipv4/6 prefix to do longest
|
|
||||||
* prefix matching on.
|
|
||||||
*/
|
|
||||||
if (prefix->family == AF_EVPN) {
|
if (prefix->family == AF_EVPN) {
|
||||||
if (evpn_prefix2prefix(prefix, &conv) != 0) {
|
index = map->head;
|
||||||
if (unlikely(CHECK_FLAG(rmap_debug,
|
} else {
|
||||||
DEBUG_ROUTEMAP_DETAIL)))
|
skip_match_clause = true;
|
||||||
zlog_debug(
|
index = route_map_get_index(map, prefix, match_object,
|
||||||
"Unable to convert EVPN prefix %pFX into IPv4/IPv6 prefix. Falling back to non-optimized route-map lookup",
|
&match_ret);
|
||||||
prefix);
|
|
||||||
} else {
|
|
||||||
if (unlikely(CHECK_FLAG(rmap_debug,
|
|
||||||
DEBUG_ROUTEMAP_DETAIL)))
|
|
||||||
zlog_debug(
|
|
||||||
"Converted EVPN prefix %pFX into %pFX for optimized route-map lookup",
|
|
||||||
prefix, &conv);
|
|
||||||
|
|
||||||
prefix = &conv;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
index = route_map_get_index(map, prefix, match_object, &match_ret);
|
|
||||||
if (index) {
|
if (index) {
|
||||||
index->applied++;
|
index->applied++;
|
||||||
if (unlikely(CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP)))
|
if (unlikely(CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP)))
|
||||||
@ -2619,7 +2601,6 @@ route_map_result_t route_map_apply_ext(struct route_map *map,
|
|||||||
ret = RMAP_DENYMATCH;
|
ret = RMAP_DENYMATCH;
|
||||||
goto route_map_apply_end;
|
goto route_map_apply_end;
|
||||||
}
|
}
|
||||||
skip_match_clause = true;
|
|
||||||
|
|
||||||
for (; index; index = index->next) {
|
for (; index; index = index->next) {
|
||||||
if (!skip_match_clause) {
|
if (!skip_match_clause) {
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
!
|
!
|
||||||
!debug bgp neighbor
|
!debug bgp neighbor
|
||||||
|
!debug route-map detail
|
||||||
|
!
|
||||||
|
vni 10
|
||||||
!
|
!
|
||||||
int lo
|
int lo
|
||||||
ip address 10.10.10.1/32
|
ip address 10.10.10.1/32
|
||||||
@ -9,22 +12,33 @@ int r1-eth1
|
|||||||
!
|
!
|
||||||
router bgp 65001
|
router bgp 65001
|
||||||
no bgp ebgp-requires-policy
|
no bgp ebgp-requires-policy
|
||||||
|
no bgp network import-check
|
||||||
neighbor 192.168.1.2 remote-as external
|
neighbor 192.168.1.2 remote-as external
|
||||||
neighbor 192.168.1.2 timers 1 3
|
neighbor 192.168.1.2 timers 1 3
|
||||||
neighbor 192.168.1.2 timers connect 1
|
neighbor 192.168.1.2 timers connect 1
|
||||||
!
|
!
|
||||||
address-family ipv4 unicast
|
address-family ipv4 unicast
|
||||||
redistribute connected
|
redistribute connected
|
||||||
|
network 10.10.10.10/32
|
||||||
exit-address-family
|
exit-address-family
|
||||||
!
|
!
|
||||||
address-family l2vpn evpn
|
address-family l2vpn evpn
|
||||||
neighbor 192.168.1.2 activate
|
neighbor 192.168.1.2 activate
|
||||||
neighbor 192.168.1.2 route-map r2 out
|
neighbor 192.168.1.2 route-map r2 out
|
||||||
advertise-all-vni
|
advertise-all-vni
|
||||||
|
advertise ipv4 unicast
|
||||||
exit-address-family
|
exit-address-family
|
||||||
!
|
!
|
||||||
route-map r2 deny 10
|
route-map r2 deny 10
|
||||||
match evpn route-type macip
|
match evpn route-type macip
|
||||||
!
|
!
|
||||||
route-map r2 permit 20
|
route-map r2 deny 20
|
||||||
|
match ip address prefix-list pl
|
||||||
|
match evpn route-type prefix
|
||||||
|
!
|
||||||
|
route-map r2 permit 30
|
||||||
|
!
|
||||||
|
ip prefix-list pl seq 5 permit 192.168.1.0/24
|
||||||
|
ip prefix-list pl seq 10 permit 10.10.10.1/32
|
||||||
|
ip prefix-list pl seq 15 permit 10.10.10.2/32
|
||||||
!
|
!
|
||||||
|
@ -83,8 +83,8 @@ def test_bgp_evpn_route_map_match_route_type():
|
|||||||
)
|
)
|
||||||
expected = {
|
expected = {
|
||||||
"advertisedRoutes": {
|
"advertisedRoutes": {
|
||||||
"10.10.10.1:2": {
|
"10.10.10.1:1": {
|
||||||
"[3]:[0]:[32]:[10.10.10.1]": {
|
"[5]:[0]:[32]:[10.10.10.10]": {
|
||||||
"valid": True,
|
"valid": True,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -102,7 +102,7 @@ def test_bgp_evpn_route_map_match_route_type():
|
|||||||
_bgp_converge,
|
_bgp_converge,
|
||||||
)
|
)
|
||||||
_, result = topotest.run_and_expect(test_func, None, count=60, wait=1)
|
_, result = topotest.run_and_expect(test_func, None, count=60, wait=1)
|
||||||
assert result is None, "MAC-IP EVPN routes should not be advertised"
|
assert result is None, "Filtered EVPN routes should not be advertised"
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Loading…
Reference in New Issue
Block a user