mirror of
https://git.proxmox.com/git/mirror_frr
synced 2026-02-01 17:19:52 +00:00
Merge pull request #14966 from opensourcerouting/fix/bgpd_route-map_default_originate_peer-group
tests: Check if default-originate works combined with peer-groups + route-maps
This commit is contained in:
commit
39ab18f1fd
@ -5164,7 +5164,7 @@ void bgp_withdraw(struct peer *peer, const struct prefix *p,
|
||||
}
|
||||
|
||||
void bgp_default_originate(struct peer *peer, afi_t afi, safi_t safi,
|
||||
int withdraw)
|
||||
bool withdraw)
|
||||
{
|
||||
struct update_subgroup *subgrp;
|
||||
subgrp = peer_subgroup(peer, afi, safi);
|
||||
|
||||
@ -707,7 +707,8 @@ extern void bgp_announce_route(struct peer *peer, afi_t afi, safi_t safi,
|
||||
bool force);
|
||||
extern void bgp_stop_announce_route_timer(struct peer_af *paf);
|
||||
extern void bgp_announce_route_all(struct peer *);
|
||||
extern void bgp_default_originate(struct peer *, afi_t, safi_t, int);
|
||||
extern void bgp_default_originate(struct peer *peer, afi_t afi, safi_t safi,
|
||||
bool withdraw);
|
||||
extern void bgp_soft_reconfig_table_task_cancel(const struct bgp *bgp,
|
||||
const struct bgp_table *table,
|
||||
const struct peer *peer);
|
||||
|
||||
@ -1699,14 +1699,14 @@ static int updgrp_policy_update_walkcb(struct update_group *updgrp, void *arg)
|
||||
*/
|
||||
UNSET_FLAG(subgrp->sflags,
|
||||
SUBGRP_STATUS_DEFAULT_ORIGINATE);
|
||||
subgroup_default_originate(subgrp, 0);
|
||||
subgroup_default_originate(subgrp, false);
|
||||
} else {
|
||||
/*
|
||||
* This is a explicit withdraw, since the
|
||||
* routemap is not present in routemap lib. need
|
||||
* to pass 1 for withdraw arg.
|
||||
* to pass `true` for withdraw arg.
|
||||
*/
|
||||
subgroup_default_originate(subgrp, 1);
|
||||
subgroup_default_originate(subgrp, true);
|
||||
}
|
||||
}
|
||||
update_subgroup_set_needs_refresh(subgrp, 0);
|
||||
@ -2102,7 +2102,7 @@ update_group_default_originate_route_map_walkcb(struct update_group *updgrp,
|
||||
*/
|
||||
UNSET_FLAG(subgrp->sflags,
|
||||
SUBGRP_STATUS_DEFAULT_ORIGINATE);
|
||||
subgroup_default_originate(subgrp, 0);
|
||||
subgroup_default_originate(subgrp, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -428,7 +428,7 @@ extern void subgroup_announce_route(struct update_subgroup *subgrp);
|
||||
extern void subgroup_announce_all(struct update_subgroup *subgrp);
|
||||
|
||||
extern void subgroup_default_originate(struct update_subgroup *subgrp,
|
||||
int withdraw);
|
||||
bool withdraw);
|
||||
extern void group_announce_route(struct bgp *bgp, afi_t afi, safi_t safi,
|
||||
struct bgp_dest *dest,
|
||||
struct bgp_path_info *pi);
|
||||
|
||||
@ -733,7 +733,7 @@ void subgroup_announce_table(struct update_subgroup *subgrp,
|
||||
if (safi != SAFI_MPLS_VPN && safi != SAFI_ENCAP && safi != SAFI_EVPN
|
||||
&& CHECK_FLAG(peer->af_flags[afi][safi],
|
||||
PEER_FLAG_DEFAULT_ORIGINATE))
|
||||
subgroup_default_originate(subgrp, 0);
|
||||
subgroup_default_originate(subgrp, false);
|
||||
|
||||
subgrp->pscount = 0;
|
||||
SET_FLAG(subgrp->sflags, SUBGRP_STATUS_TABLE_REPARSING);
|
||||
@ -825,7 +825,7 @@ void subgroup_announce_route(struct update_subgroup *subgrp)
|
||||
}
|
||||
}
|
||||
|
||||
void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
|
||||
void subgroup_default_originate(struct update_subgroup *subgrp, bool withdraw)
|
||||
{
|
||||
struct bgp *bgp;
|
||||
struct attr attr;
|
||||
@ -940,7 +940,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
|
||||
SUBGRP_STATUS_DEFAULT_ORIGINATE)))
|
||||
SET_FLAG(subgrp->sflags,
|
||||
SUBGRP_STATUS_DEFAULT_ORIGINATE);
|
||||
withdraw = 1;
|
||||
withdraw = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -5655,7 +5655,7 @@ int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
|
||||
if (peer_established(peer->connection) &&
|
||||
peer->afc_nego[afi][safi]) {
|
||||
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
||||
bgp_default_originate(peer, afi, safi, 0);
|
||||
bgp_default_originate(peer, afi, safi, false);
|
||||
bgp_announce_route(peer, afi, safi, false);
|
||||
}
|
||||
|
||||
@ -5698,7 +5698,7 @@ int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
|
||||
member->afc_nego[afi][safi]) {
|
||||
update_group_adjust_peer(
|
||||
peer_af_find(member, afi, safi));
|
||||
bgp_default_originate(member, afi, safi, 0);
|
||||
bgp_default_originate(member, afi, safi, false);
|
||||
bgp_announce_route(member, afi, safi, false);
|
||||
}
|
||||
}
|
||||
@ -5743,7 +5743,7 @@ int peer_default_originate_unset(struct peer *peer, afi_t afi, safi_t safi)
|
||||
if (peer_established(peer->connection) &&
|
||||
peer->afc_nego[afi][safi]) {
|
||||
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
||||
bgp_default_originate(peer, afi, safi, 1);
|
||||
bgp_default_originate(peer, afi, safi, true);
|
||||
bgp_announce_route(peer, afi, safi, false);
|
||||
}
|
||||
|
||||
@ -5782,7 +5782,7 @@ int peer_default_originate_unset(struct peer *peer, afi_t afi, safi_t safi)
|
||||
if (peer_established(member->connection) &&
|
||||
member->afc_nego[afi][safi]) {
|
||||
update_group_adjust_peer(peer_af_find(member, afi, safi));
|
||||
bgp_default_originate(member, afi, safi, 1);
|
||||
bgp_default_originate(member, afi, safi, true);
|
||||
bgp_announce_route(member, afi, safi, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,12 +1,17 @@
|
||||
router bgp 65000
|
||||
no bgp ebgp-requires-policy
|
||||
neighbor 192.168.255.2 remote-as 65001
|
||||
neighbor 192.168.255.2 timers 3 10
|
||||
address-family ipv4 unicast
|
||||
neighbor 192.168.255.2 default-originate route-map default
|
||||
exit-address-family
|
||||
router bgp 65001
|
||||
no bgp ebgp-requires-policy
|
||||
neighbor 192.168.255.2 remote-as external
|
||||
neighbor 192.168.255.2 timers 3 10
|
||||
neighbor PG peer-group
|
||||
neighbor PG remote-as external
|
||||
neighbor PG timers 3 10
|
||||
bgp listen range 192.168.255.0/24 peer-group PG
|
||||
address-family ipv4 unicast
|
||||
neighbor PG default-originate route-map default
|
||||
neighbor 192.168.255.2 default-originate route-map default
|
||||
exit-address-family
|
||||
!
|
||||
route-map default permit 10
|
||||
set metric 123
|
||||
set as-path prepend 65000 65000 65000
|
||||
set metric 123
|
||||
set as-path prepend 65001 65001 65001
|
||||
!
|
||||
|
||||
@ -5,5 +5,3 @@ interface lo
|
||||
interface r1-eth0
|
||||
ip address 192.168.255.1/24
|
||||
!
|
||||
ip forwarding
|
||||
!
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
router bgp 65001
|
||||
no bgp ebgp-requires-policy
|
||||
neighbor 192.168.255.1 remote-as 65000
|
||||
neighbor 192.168.255.1 timers 3 10
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
exit-address-family
|
||||
router bgp 65002
|
||||
no bgp ebgp-requires-policy
|
||||
neighbor 192.168.255.1 remote-as external
|
||||
neighbor 192.168.255.1 timers 3 10
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
exit-address-family
|
||||
!
|
||||
|
||||
@ -2,5 +2,3 @@
|
||||
interface r2-eth0
|
||||
ip address 192.168.255.2/24
|
||||
!
|
||||
ip forwarding
|
||||
!
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
router bgp 65003
|
||||
no bgp ebgp-requires-policy
|
||||
neighbor 192.168.255.1 remote-as external
|
||||
neighbor 192.168.255.1 timers 3 10
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
exit-address-family
|
||||
!
|
||||
@ -0,0 +1,4 @@
|
||||
!
|
||||
interface r3-eth0
|
||||
ip address 192.168.255.3/24
|
||||
!
|
||||
@ -26,12 +26,13 @@ pytestmark = [pytest.mark.bgpd]
|
||||
|
||||
|
||||
def build_topo(tgen):
|
||||
for routern in range(1, 3):
|
||||
for routern in range(1, 4):
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
@ -62,14 +63,17 @@ def test_bgp_default_originate_route_map():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
router = tgen.gears["r2"]
|
||||
r2 = tgen.gears["r2"]
|
||||
r3 = tgen.gears["r3"]
|
||||
|
||||
def _bgp_converge(router):
|
||||
def _bgp_converge(router, pfxCount):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
"192.168.255.1": {
|
||||
"bgpState": "Established",
|
||||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 1}},
|
||||
"addressFamilyInfo": {
|
||||
"ipv4Unicast": {"acceptedPrefixCounter": pfxCount}
|
||||
},
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
@ -77,21 +81,25 @@ def test_bgp_default_originate_route_map():
|
||||
def _bgp_default_route_has_metric(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json"))
|
||||
expected = {
|
||||
"paths": [{"aspath": {"string": "65000 65000 65000 65000"}, "metric": 123}]
|
||||
"paths": [{"aspath": {"string": "65001 65001 65001 65001"}, "metric": 123}]
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, router)
|
||||
success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
|
||||
test_func = functools.partial(_bgp_converge, r2, 1)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||
assert result is None, "Failed to see bgp convergence in r2"
|
||||
|
||||
assert result is None, 'Failed to see bgp convergence in "{}"'.format(router)
|
||||
test_func = functools.partial(_bgp_default_route_has_metric, r2)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||
assert result is None, "Failed to see applied metric for default route in r2"
|
||||
|
||||
test_func = functools.partial(_bgp_default_route_has_metric, router)
|
||||
success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
|
||||
test_func = functools.partial(_bgp_converge, r3, 2)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||
assert result is None, "Failed to see bgp convergence in r3"
|
||||
|
||||
assert (
|
||||
result is None
|
||||
), 'Failed to see applied metric for default route in "{}"'.format(router)
|
||||
test_func = functools.partial(_bgp_default_route_has_metric, r3)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||
assert result is None, "Failed to see applied metric for default route in r3"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Loading…
Reference in New Issue
Block a user