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);
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)
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)
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;
}
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)
/* 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;
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);
}
}
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)++;
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,
--- /dev/null
+!
+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
+!
+
--- /dev/null
+!
+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
+!
+
--- /dev/null
+#!/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))