Skip to content

Commit

Permalink
Merge pull request FRRouting#17196 from FRRouting/mergify/bp/stable/1…
Browse files Browse the repository at this point in the history
…0.1/pr-17165

bgpd: Do not filter no-export community for BGP OAD (backport FRRouting#17165)
  • Loading branch information
riw777 authored Oct 22, 2024
2 parents 6bb1cc1 + f213be9 commit 0401930
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 6 deletions.
9 changes: 4 additions & 5 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -1780,14 +1780,13 @@ static bool bgp_community_filter(struct peer *peer, struct attr *attr)
return true;

/* NO_EXPORT check. */
if (peer->sort == BGP_PEER_EBGP &&
community_include(bgp_attr_get_community(attr),
COMMUNITY_NO_EXPORT))
if (peer->sort == BGP_PEER_EBGP && peer->sub_sort != BGP_PEER_EBGP_OAD &&
community_include(bgp_attr_get_community(attr), COMMUNITY_NO_EXPORT))
return true;

/* NO_EXPORT_SUBCONFED check. */
if (peer->sort == BGP_PEER_EBGP
|| peer->sort == BGP_PEER_CONFED)
if ((peer->sort == BGP_PEER_EBGP && peer->sub_sort != BGP_PEER_EBGP_OAD) ||
peer->sort == BGP_PEER_CONFED)
if (community_include(bgp_attr_get_community(attr),
COMMUNITY_NO_EXPORT_SUBCONFED))
return true;
Expand Down
7 changes: 6 additions & 1 deletion tests/topotests/bgp_oad/r1/frr.conf
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ int r1-eth0
!
router bgp 65001
no bgp ebgp-requires-policy
no bgp network import-check
neighbor 192.168.1.2 remote-as external
neighbor 192.168.1.2 timers 1 3
neighbor 192.168.1.2 timers connect 1
Expand All @@ -12,10 +13,14 @@ router bgp 65001
neighbor 192.168.1.4 timers 1 3
neighbor 192.168.1.4 timers connect 1
address-family ipv4 unicast
network 10.10.10.1/32 route-map local
neighbor 192.168.1.4 route-map r4 in
exit-address-family
!
route-map r4 permit 10
set local-preference 123
set metric 123
exit
!
route-map local permit 10
set community no-export
!
36 changes: 36 additions & 0 deletions tests/topotests/bgp_oad/test_bgp_oad.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
"""
Test if local-preference is passed between different EBGP peers when
EBGP-OAD is configured.
Also check if no-export community is passed to the EBGP-OAD peer.
"""

import os
Expand Down Expand Up @@ -53,6 +55,9 @@ def test_bgp_dynamic_capability_role():
pytest.skip(tgen.errors)

r1 = tgen.gears["r1"]
r2 = tgen.gears["r2"]
r3 = tgen.gears["r3"]
r4 = tgen.gears["r4"]

def _bgp_converge():
output = json.loads(r1.vtysh_cmd("show bgp ipv4 unicast 10.10.10.10/32 json"))
Expand Down Expand Up @@ -87,6 +92,37 @@ def _bgp_converge():
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Can't converge"

def _bgp_check_no_export(router, arg=[{"valid": True}]):
output = json.loads(router.vtysh_cmd("show bgp ipv4 unicast json"))
expected = {
"routes": {
"10.10.10.1/32": arg,
}
}
return topotest.json_cmp(output, expected)

test_func = functools.partial(
_bgp_check_no_export,
r2,
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "10.10.10.1/32 should be advertised to r2"

test_func = functools.partial(
_bgp_check_no_export,
r3,
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "10.10.10.1/32 should be advertised to r3"

test_func = functools.partial(
_bgp_check_no_export,
r4,
None,
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "10.10.10.1/32 should not be advertised to r4 (not OAD peer)"


if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
Expand Down

0 comments on commit 0401930

Please sign in to comment.