diff options
author | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-19 15:59:47 +0100 |
---|---|---|
committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-19 16:10:06 +0100 |
commit | 708f08cb189ce15e3b55b6a8f6e1247df5849f86 (patch) | |
tree | 64b0226150c7afe73988872856ca2ebc7b8eecaf /bgpd/bgp_route.c | |
parent | tests: Check if we can see advertised routes with route-map applied (diff) | |
download | frr-708f08cb189ce15e3b55b6a8f6e1247df5849f86.tar.xz frr-708f08cb189ce15e3b55b6a8f6e1247df5849f86.zip |
bgpd: Show applied route-map attributes for `neighbor X advertised-routes detail`
If we have a route-map that sets some attributes e.g. community or large-community,
and the route-map is applied for outgoing direction, everything is fine, but
we missed the point that `advertised-routes detail` was not using the applied
attributes to display and instead it uses what is received from the peer (original).
Let's fix this, and use what's already applied (advertise attributes), and
we can now see:
```
route-map r3 permit 10
match ip address prefix-list p1
set community 65001:65002
set extcommunity bandwidth 100
set large-community 65001:65002:65003
exit
!
...
address-family ipv4 unicast
neighbor 192.168.2.3 route-map r3 out
exit-address-family
...
```
The output:
```
r2# show bgp ipv4 neighbors 192.168.2.3 advertised-routes detail
BGP table version is 1, local router ID is 192.168.2.2, vrf id 0
Default local pref 100, local AS 65002
BGP routing table entry for 10.10.10.1/32, version 1
Paths: (1 available, best #1, table default)
Advertised to non peer-group peers:
192.168.1.1 192.168.2.3
65001
0.0.0.0 from 192.168.1.1 (192.168.1.1)
Origin IGP, valid, external, best (First path received)
Community: 65001:65002
Extended Community: LB:65002:12500000 (100.000 Mbps)
Large Community: 65001:65002:65003
Last update: Thu Dec 19 17:00:40 2024
```
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
Diffstat (limited to '')
-rw-r--r-- | bgpd/bgp_route.c | 89 |
1 files changed, 42 insertions, 47 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 7c3dd234a..b0a394234 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -10552,14 +10552,13 @@ static void route_vty_out_detail_es_info(struct vty *vty, } void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn, - const struct prefix *p, struct bgp_path_info *path, - afi_t afi, safi_t safi, - enum rpki_states rpki_curr_state, - json_object *json_paths) + const struct prefix *p, struct bgp_path_info *path, afi_t afi, + safi_t safi, enum rpki_states rpki_curr_state, json_object *json_paths, + struct attr *pattr) { char buf[INET6_ADDRSTRLEN]; char vni_buf[30] = {}; - struct attr *attr = path->attr; + struct attr *attr = pattr ? pattr : path->attr; time_t tbuf; char timebuf[32]; json_object *json_bestpath = NULL; @@ -11284,6 +11283,8 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn, json_path, "community", bgp_attr_get_community(attr)->json); } else { + if (!bgp_attr_get_community(attr)->str) + community_str(bgp_attr_get_community(attr), true, true); vty_out(vty, " Community: %s\n", bgp_attr_get_community(attr)->str); } @@ -11291,6 +11292,9 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn, /* Line 5 display Extended-community */ if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))) { + if (!bgp_attr_get_ecommunity(attr)->str) + ecommunity_str(bgp_attr_get_ecommunity(attr)); + if (json_paths) { json_ext_community = json_object_new_object(); json_object_string_add( @@ -11305,6 +11309,9 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn, } if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_IPV6_EXT_COMMUNITIES))) { + if (!bgp_attr_get_ipv6_ecommunity(attr)->str) + ecommunity_str(bgp_attr_get_ipv6_ecommunity(attr)); + if (json_paths) { json_ext_ipv6_community = json_object_new_object(); json_object_string_add(json_ext_ipv6_community, "string", @@ -11330,6 +11337,8 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn, json_path, "largeCommunity", bgp_attr_get_lcommunity(attr)->json); } else { + if (!bgp_attr_get_lcommunity(attr)->str) + lcommunity_str(bgp_attr_get_lcommunity(attr), true, true); vty_out(vty, " Large Community: %s\n", bgp_attr_get_lcommunity(attr)->str); } @@ -11997,11 +12006,9 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t sa prd, table->afi, safi, NULL, false, false); - route_vty_out_detail( - vty, bgp, dest, dest_p, pi, - family2afi(dest_p->family), - safi, RPKI_NOT_BEING_USED, - json_paths); + route_vty_out_detail(vty, bgp, dest, dest_p, pi, + family2afi(dest_p->family), safi, + RPKI_NOT_BEING_USED, json_paths, NULL); } else { route_vty_out(vty, dest_p, pi, display, safi, json_paths, wide); @@ -12511,11 +12518,10 @@ void route_vty_out_detail_header(struct vty *vty, struct bgp *bgp, } } -static void bgp_show_path_info(const struct prefix_rd *pfx_rd, - struct bgp_dest *bgp_node, struct vty *vty, - struct bgp *bgp, afi_t afi, safi_t safi, - json_object *json, enum bgp_path_type pathtype, - int *display, enum rpki_states rpki_target_state) +static void bgp_show_path_info(const struct prefix_rd *pfx_rd, struct bgp_dest *bgp_node, + struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi, + json_object *json, enum bgp_path_type pathtype, int *display, + enum rpki_states rpki_target_state, struct attr *attr) { struct bgp_path_info *pi; int header = 1; @@ -12558,10 +12564,8 @@ static void bgp_show_path_info(const struct prefix_rd *pfx_rd, || (pathtype == BGP_PATH_SHOW_MULTIPATH && (CHECK_FLAG(pi->flags, BGP_PATH_MULTIPATH) || CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)))) - route_vty_out_detail(vty, bgp, bgp_node, - bgp_dest_get_prefix(bgp_node), pi, - afi, safi, rpki_curr_state, - json_paths); + route_vty_out_detail(vty, bgp, bgp_node, bgp_dest_get_prefix(bgp_node), pi, + afi, safi, rpki_curr_state, json_paths, attr); } if (json && json_paths) { @@ -12648,9 +12652,8 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp, continue; } - bgp_show_path_info((struct prefix_rd *)dest_p, rm, vty, - bgp, afi, safi, json, pathtype, - &display, rpki_target_state); + bgp_show_path_info((struct prefix_rd *)dest_p, rm, vty, bgp, afi, safi, + json, pathtype, &display, rpki_target_state, NULL); bgp_dest_unlock_node(rm); } @@ -12709,9 +12712,8 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp, rm = longest_pfx; bgp_dest_lock_node(rm); - bgp_show_path_info((struct prefix_rd *)dest_p, rm, vty, - bgp, afi, safi, json, pathtype, - &display, rpki_target_state); + bgp_show_path_info((struct prefix_rd *)dest_p, rm, vty, bgp, afi, safi, + json, pathtype, &display, rpki_target_state, NULL); bgp_dest_unlock_node(rm); } @@ -12737,9 +12739,8 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp, const struct prefix *dest_p = bgp_dest_get_prefix(dest); if (!prefix_check || dest_p->prefixlen == match.prefixlen) { - bgp_show_path_info(NULL, dest, vty, bgp, afi, - safi, json, pathtype, - &display, rpki_target_state); + bgp_show_path_info(NULL, dest, vty, bgp, afi, safi, json, pathtype, + &display, rpki_target_state, NULL); } bgp_dest_unlock_node(dest); @@ -14633,10 +14634,8 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table, if (use_json) json_net = json_object_new_object(); - bgp_show_path_info(NULL /* prefix_rd */, dest, vty, bgp, - afi, safi, json_net, - BGP_PATH_SHOW_ALL, &display, - RPKI_NOT_BEING_USED); + bgp_show_path_info(NULL /* prefix_rd */, dest, vty, bgp, afi, safi, json_net, + BGP_PATH_SHOW_ALL, &display, RPKI_NOT_BEING_USED, NULL); if (use_json) json_object_object_addf(json_ar, json_net, "%pFX", rn_p); @@ -14770,11 +14769,9 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table, pass_in = &buildit; } else pass_in = dest; - bgp_show_path_info( - NULL, pass_in, vty, bgp, afi, - safi, json_net, - BGP_PATH_SHOW_ALL, &display, - RPKI_NOT_BEING_USED); + bgp_show_path_info(NULL, pass_in, vty, bgp, afi, safi, + json_net, BGP_PATH_SHOW_ALL, &display, + RPKI_NOT_BEING_USED, NULL); if (use_json) json_object_object_addf( json_ar, json_net, @@ -14800,9 +14797,8 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table, bgp_dest_get_prefix(dest); attr = *adj->attr; - ret = bgp_output_modifier( - peer, rn_p, &attr, afi, safi, - rmap_name); + ret = bgp_output_modifier(peer, rn_p, &attr, afi, safi, + rmap_name); if (ret == RMAP_DENY) { (*filtered_count)++; @@ -14826,7 +14822,8 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table, json_net = json_object_new_object(); bgp_show_path_info(NULL, dest, vty, bgp, afi, safi, json_net, BGP_PATH_SHOW_ALL, - &display, RPKI_NOT_BEING_USED); + &display, RPKI_NOT_BEING_USED, + adj->attr); if (use_json) json_object_object_addf(json_ar, json_net, "%pFX", rn_p); @@ -14839,7 +14836,7 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table, */ if (use_json) { route_vty_out_tmp(vty, bgp, dest, rn_p, - &attr, safi, use_json, + adj->attr, safi, use_json, json_ar, wide); } else { for (bpi = bgp_dest_get_bgp_path_info(dest); @@ -14872,11 +14869,9 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table, if (use_json) json_net = json_object_new_object(); - bgp_show_path_info( - NULL /* prefix_rd */, dest, vty, - bgp, afi, safi, json_net, - BGP_PATH_SHOW_BESTPATH, - &display, RPKI_NOT_BEING_USED); + bgp_show_path_info(NULL /* prefix_rd */, dest, vty, bgp, afi, + safi, json_net, BGP_PATH_SHOW_BESTPATH, + &display, RPKI_NOT_BEING_USED, NULL); if (use_json) json_object_object_addf( json_ar, json_net, |