From: Alexander Skorichenko Date: Fri, 18 Apr 2025 11:08:45 +0000 (+0200) Subject: bgpd: fix vty's version of show advertised-routes X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=af6fe87d7c03fb13d072de67554c51751e6c927f;p=mirror%2Ffrr.git 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 --- diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index bfd8fd7c22..9baccd8727 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -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) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index fd860c9236..ebc90a1fe2 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -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)++; diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index af8c111043..34e59c0704 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -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, diff --git a/tests/topotests/bgp_show_routes_vty/r1/frr.conf b/tests/topotests/bgp_show_routes_vty/r1/frr.conf new file mode 100644 index 0000000000..d95c4569f2 --- /dev/null +++ b/tests/topotests/bgp_show_routes_vty/r1/frr.conf @@ -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 +! + diff --git a/tests/topotests/bgp_show_routes_vty/r2/frr.conf b/tests/topotests/bgp_show_routes_vty/r2/frr.conf new file mode 100644 index 0000000000..2bb4dc0221 --- /dev/null +++ b/tests/topotests/bgp_show_routes_vty/r2/frr.conf @@ -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 +! + diff --git a/tests/topotests/bgp_show_routes_vty/test_bgp_show_advertised_routes.py b/tests/topotests/bgp_show_routes_vty/test_bgp_show_advertised_routes.py new file mode 100644 index 0000000000..c49d1284d9 --- /dev/null +++ b/tests/topotests/bgp_show_routes_vty/test_bgp_show_advertised_routes.py @@ -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))