Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bgpd: Do not filter no-export community for BGP OAD #17165

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -1779,14 +1779,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 @@ -51,6 +53,9 @@ def test_bgp_oad():
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 @@ -85,6 +90,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
Loading