]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: fix vty's version of show advertised-routes 18695/head
authorAlexander Skorichenko <askorichenko@netgate.com>
Fri, 18 Apr 2025 11:08:45 +0000 (13:08 +0200)
committerAlexander Skorichenko <askorichenko@netgate.com>
Mon, 21 Apr 2025 19:23:54 +0000 (21:23 +0200)
Fix displayed metric if a route-map is applied to advertised routes

Signed-off-by: Alexander Skorichenko <askorichenko@netgate.com>
bgpd/bgp_evpn_vty.c
bgpd/bgp_route.c
bgpd/bgp_route.h
tests/topotests/bgp_show_routes_vty/r1/frr.conf [new file with mode: 0644]
tests/topotests/bgp_show_routes_vty/r2/frr.conf [new file with mode: 0644]
tests/topotests/bgp_show_routes_vty/test_bgp_show_advertised_routes.py [new file with mode: 0644]

index bfd8fd7c227851dd5c1f329d78ff61e6898ba3d8..9baccd872727c0e0f76b4708fc967764fb3fb3d3 100644 (file)
@@ -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)
index fd860c9236dca4a09f643e983d19e986440c6094..ebc90a1fe24268f0332808ce0d7d50127ae3a186 100644 (file)
@@ -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)++;
index af8c1110433961624f749842525f0300149a7584..34e59c070406726a318ea648c2518ec35441ed69 100644 (file)
@@ -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 (file)
index 0000000..d95c456
--- /dev/null
@@ -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 (file)
index 0000000..2bb4dc0
--- /dev/null
@@ -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 (file)
index 0000000..c49d128
--- /dev/null
@@ -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))