mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-12-30 15:51:59 +00:00
bgpd: Send BGP best path reason to Zebra
```
exit1-debian-9# show ip route 172.16.16.1/32
Routing entry for 172.16.16.1/32
Known via "bgp", distance 20, metric 0, best
Last update 00:00:28 ago
* 192.168.0.2, via eth1, weight 1
AS-Path : 65003
Communities : first 65001:2 65001:3
Large-Communities: 65001:1:1 65001:1:2 65001:1:3
Selection reason : First path received
```
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
This commit is contained in:
parent
7b3e821076
commit
1d7260a1b5
@ -8415,8 +8415,7 @@ enum bgp_display_type {
|
||||
normal_list,
|
||||
};
|
||||
|
||||
static const char *
|
||||
bgp_path_selection_reason2str(enum bgp_path_selection_reason reason)
|
||||
const char *bgp_path_selection_reason2str(enum bgp_path_selection_reason reason)
|
||||
{
|
||||
switch (reason) {
|
||||
case bgp_path_selection_none:
|
||||
|
||||
@ -90,6 +90,9 @@ enum bgp_show_adj_route_type {
|
||||
/* Maximum number of sids we can process or send with a prefix. */
|
||||
#define BGP_MAX_SIDS 6
|
||||
|
||||
/* Maximum buffer length for storing BGP best path selection reason */
|
||||
#define BGP_MAX_SELECTION_REASON_STR_BUF 32
|
||||
|
||||
/* Error codes for handling NLRI */
|
||||
#define BGP_NLRI_PARSE_OK 0
|
||||
#define BGP_NLRI_PARSE_ERROR_PREFIX_OVERFLOW -1
|
||||
@ -803,4 +806,6 @@ extern void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate,
|
||||
const struct prefix *p, afi_t afi,
|
||||
safi_t safi, bool suppress);
|
||||
extern void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr);
|
||||
const char *
|
||||
bgp_path_selection_reason2str(enum bgp_path_selection_reason reason);
|
||||
#endif /* _QUAGGA_BGP_ROUTE_H */
|
||||
|
||||
@ -1489,6 +1489,8 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||
|
||||
if (is_add && CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA)) {
|
||||
struct bgp_zebra_opaque bzo = {};
|
||||
const char *reason =
|
||||
bgp_path_selection_reason2str(dest->reason);
|
||||
|
||||
strlcpy(bzo.aspath, info->attr->aspath->str,
|
||||
sizeof(bzo.aspath));
|
||||
@ -1502,6 +1504,9 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||
strlcpy(bzo.lcommunity, info->attr->lcommunity->str,
|
||||
sizeof(bzo.lcommunity));
|
||||
|
||||
strlcpy(bzo.selection_reason, reason,
|
||||
sizeof(bzo.selection_reason));
|
||||
|
||||
SET_FLAG(api.message, ZAPI_MESSAGE_OPAQUE);
|
||||
api.opaque.length = MIN(sizeof(struct bgp_zebra_opaque),
|
||||
ZAPI_MESSAGE_OPAQUE_LENGTH);
|
||||
|
||||
@ -36,6 +36,12 @@ struct bgp_zebra_opaque {
|
||||
|
||||
/* Show at least 10 large-communities AA:BB:CC */
|
||||
char lcommunity[LCOMMUNITY_SIZE * 30];
|
||||
|
||||
/* 32 bytes seems enough because of
|
||||
* bgp_path_selection_confed_as_path which is
|
||||
* `Confederation based AS Path`.
|
||||
*/
|
||||
char selection_reason[BGP_MAX_SELECTION_REASON_STR_BUF];
|
||||
};
|
||||
|
||||
static_assert(sizeof(struct bgp_zebra_opaque) <= ZAPI_MESSAGE_OPAQUE_LENGTH,
|
||||
|
||||
@ -449,6 +449,8 @@ static void zebra_show_ip_route_opaque(struct vty *vty, struct route_entry *re,
|
||||
bzo.community);
|
||||
json_object_string_add(json, "largeCommunities",
|
||||
bzo.lcommunity);
|
||||
json_object_string_add(json, "selectionReason",
|
||||
bzo.selection_reason);
|
||||
} else {
|
||||
vty_out(vty, " AS-Path : %s\n", bzo.aspath);
|
||||
|
||||
@ -459,6 +461,9 @@ static void zebra_show_ip_route_opaque(struct vty *vty, struct route_entry *re,
|
||||
if (bzo.lcommunity[0] != '\0')
|
||||
vty_out(vty, " Large-Communities: %s\n",
|
||||
bzo.lcommunity);
|
||||
|
||||
vty_out(vty, " Selection reason : %s\n",
|
||||
bzo.selection_reason);
|
||||
}
|
||||
}
|
||||
default:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user