mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
bgpd: fix vty's version of show advertised-routes
Fix displayed metric if a route-map is applied to advertised routes Signed-off-by: Alexander Skorichenko <askorichenko@netgate.com>
This commit is contained in:
parent
004c6c0260
commit
af6fe87d7c
|
@ -668,8 +668,8 @@ static void show_esi_routes(struct bgp *bgp,
|
|||
if (json)
|
||||
json_path = json_object_new_array();
|
||||
|
||||
route_vty_out(vty, p, pi, 0, SAFI_EVPN, json_path,
|
||||
false);
|
||||
route_vty_out(vty, p, pi, 0, NULL, SAFI_EVPN,
|
||||
json_path, false);
|
||||
|
||||
if (json)
|
||||
json_object_array_add(json_paths, json_path);
|
||||
|
@ -768,7 +768,7 @@ static void bgp_evpn_show_routes_mac_ip_es(struct vty *vty, esi_t *esi,
|
|||
AFI_L2VPN, SAFI_EVPN, RPKI_NOT_BEING_USED,
|
||||
json_path, NULL, 0);
|
||||
else
|
||||
route_vty_out(vty, &bd->rn->p, pi, 0, SAFI_EVPN,
|
||||
route_vty_out(vty, &bd->rn->p, pi, 0, NULL, SAFI_EVPN,
|
||||
json_path, false);
|
||||
|
||||
if (json)
|
||||
|
@ -896,7 +896,7 @@ static void show_vni_routes(struct bgp *bgp, struct bgpevpn *vpn,
|
|||
NULL, 0);
|
||||
|
||||
else
|
||||
route_vty_out(vty, &tmp_p, pi, 0, SAFI_EVPN,
|
||||
route_vty_out(vty, &tmp_p, pi, 0, NULL, SAFI_EVPN,
|
||||
json_path, false);
|
||||
|
||||
if (json)
|
||||
|
@ -1453,8 +1453,9 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
|
|||
else
|
||||
route_vty_out(vty,
|
||||
bgp_dest_get_prefix(rm),
|
||||
pi, no_display, SAFI_EVPN,
|
||||
json_array, false);
|
||||
pi, no_display, NULL,
|
||||
SAFI_EVPN, json_array,
|
||||
false);
|
||||
no_display = 1;
|
||||
}
|
||||
|
||||
|
@ -3230,7 +3231,7 @@ static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type,
|
|||
RPKI_NOT_BEING_USED, json_path, NULL,
|
||||
0);
|
||||
} else
|
||||
route_vty_out(vty, p, pi, 0, SAFI_EVPN,
|
||||
route_vty_out(vty, p, pi, 0, NULL, SAFI_EVPN,
|
||||
json_path, false);
|
||||
|
||||
if (json)
|
||||
|
|
|
@ -10146,11 +10146,12 @@ static char *bgp_nexthop_hostname(struct peer *peer,
|
|||
|
||||
/* called from terminal list command */
|
||||
void route_vty_out(struct vty *vty, const struct prefix *p,
|
||||
struct bgp_path_info *path, int display, safi_t safi,
|
||||
struct bgp_path_info *path, int display,
|
||||
struct attr *pattr, safi_t safi,
|
||||
json_object *json_paths, bool wide)
|
||||
{
|
||||
int len;
|
||||
struct attr *attr = path->attr;
|
||||
struct attr *attr = pattr ? pattr : path->attr;
|
||||
json_object *json_path = NULL;
|
||||
json_object *json_nexthops = NULL;
|
||||
json_object *json_nexthop_global = NULL;
|
||||
|
@ -12714,7 +12715,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t sa
|
|||
rpki_curr_state, json_paths, NULL,
|
||||
show_flags);
|
||||
} else {
|
||||
route_vty_out(vty, dest_p, pi, display,
|
||||
route_vty_out(vty, dest_p, pi, display, NULL,
|
||||
safi, json_paths, wide);
|
||||
}
|
||||
}
|
||||
|
@ -15561,7 +15562,8 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table,
|
|||
for (bpi = bgp_dest_get_bgp_path_info(dest);
|
||||
bpi; bpi = bpi->next)
|
||||
route_vty_out(vty, rn_p, bpi, 0,
|
||||
safi, NULL, wide);
|
||||
adj->attr, safi, NULL,
|
||||
wide);
|
||||
}
|
||||
}
|
||||
(*output_count)++;
|
||||
|
|
|
@ -909,7 +909,8 @@ extern struct bgp_path_info *info_make(int type, int sub_type,
|
|||
struct bgp_dest *dest);
|
||||
|
||||
extern void route_vty_out(struct vty *vty, const struct prefix *p,
|
||||
struct bgp_path_info *path, int display, safi_t safi,
|
||||
struct bgp_path_info *path, int display,
|
||||
struct attr *attr, safi_t safi,
|
||||
json_object *json_paths, bool wide);
|
||||
extern void route_vty_out_tag(struct vty *vty, const struct prefix *p,
|
||||
struct bgp_path_info *path, int display,
|
||||
|
|
18
tests/topotests/bgp_show_routes_vty/r1/frr.conf
Normal file
18
tests/topotests/bgp_show_routes_vty/r1/frr.conf
Normal file
|
@ -0,0 +1,18 @@
|
|||
!
|
||||
int r1-eth0
|
||||
ip address 192.168.1.1/24
|
||||
!
|
||||
router bgp 65001
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp network import-check
|
||||
neighbor 192.168.1.2 remote-as auto
|
||||
neighbor 192.168.1.2 timers 1 3
|
||||
neighbor 192.168.1.2 timers connect 1
|
||||
network 10.10.10.1/32
|
||||
address-family ipv4 unicast
|
||||
neighbor 192.168.1.2 route-map r2 out
|
||||
exit-address-family
|
||||
!
|
||||
route-map r2 permit 10
|
||||
!
|
||||
|
11
tests/topotests/bgp_show_routes_vty/r2/frr.conf
Normal file
11
tests/topotests/bgp_show_routes_vty/r2/frr.conf
Normal file
|
@ -0,0 +1,11 @@
|
|||
!
|
||||
int r2-eth0
|
||||
ip address 192.168.1.2/24
|
||||
!
|
||||
router bgp 65002
|
||||
no bgp ebgp-requires-policy
|
||||
neighbor 192.168.1.1 remote-as auto
|
||||
neighbor 192.168.1.1 timers 1 3
|
||||
neighbor 192.168.1.1 timers connect 1
|
||||
!
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: ISC
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import pytest
|
||||
import functools
|
||||
|
||||
pytestmark = [pytest.mark.bgpd]
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
from lib.topogen import Topogen, get_topogen
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
topodef = {"s1": ("r1", "r2")}
|
||||
tgen = Topogen(topodef, mod.__name__)
|
||||
tgen.start_topology()
|
||||
|
||||
router_list = tgen.routers()
|
||||
|
||||
for _, (rname, router) in enumerate(router_list.items(), 1):
|
||||
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_show_advertised_routes_detail():
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
r1 = tgen.gears["r1"]
|
||||
|
||||
def _bgp_check_metric():
|
||||
output = r1.vtysh_cmd(
|
||||
"show bgp ipv4 unicast neighbor 192.168.1.2 advertised-routes"
|
||||
)
|
||||
return [output.find("Total number of prefixes 1") == -1, output.find("777") == -1]
|
||||
|
||||
test_func = functools.partial(
|
||||
_bgp_check_metric,
|
||||
)
|
||||
|
||||
# Check no special metric is set for the routes
|
||||
_, result = topotest.run_and_expect(test_func, [False, True], count=30, wait=1)
|
||||
assert result[0] == False, "No routes"
|
||||
assert result[1] == True, "Wrong metric"
|
||||
|
||||
# Apply metric with the route-map
|
||||
r1.vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
route-map r2 permit 10
|
||||
set metric 777
|
||||
"""
|
||||
)
|
||||
|
||||
# Check metric '777' is present on the route
|
||||
_, result = topotest.run_and_expect(test_func, [False, False], count=30, wait=1)
|
||||
assert result[0] == False, "No routes"
|
||||
assert result[1] == False, "Wrong metric"
|
||||
|
||||
# Stop applying metric with the route-map
|
||||
r1.vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
route-map r2 permit 10
|
||||
no set metric 777
|
||||
"""
|
||||
)
|
||||
|
||||
# Check metric '777' is removed from the route
|
||||
_, result = topotest.run_and_expect(test_func, [False, True], count=30, wait=1)
|
||||
assert result[0] == False, "No routes"
|
||||
assert result[1] == True, "Wrong metric"
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
Loading…
Reference in a new issue