mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 04:01:59 +00:00
zebra: Add ability to display in human readable format re->flags and status
The re->flags and re->status in debugs were being dumped as hex values. I can never quickly decode this. Here is an idea. Let's let FRR do it for me. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
parent
1afacb94e6
commit
61e6de9d57
@ -40,6 +40,7 @@
|
||||
#include "nexthop_group.h"
|
||||
#include "lib_errors.h"
|
||||
#include "srte.h"
|
||||
#include "printfrr.h"
|
||||
|
||||
DEFINE_MTYPE_STATIC(LIB, ZCLIENT, "Zclient")
|
||||
DEFINE_MTYPE_STATIC(LIB, REDIST_INST, "Redistribution instance IDs")
|
||||
@ -4121,3 +4122,28 @@ uint32_t zclient_get_nhg_start(uint32_t proto)
|
||||
|
||||
return ZEBRA_NHG_PROTO_SPACING * proto;
|
||||
}
|
||||
|
||||
char *zclient_dump_route_flags(uint32_t flags, char *buf, size_t len)
|
||||
{
|
||||
if (flags == 0) {
|
||||
snprintfrr(buf, len, "None ");
|
||||
return buf;
|
||||
}
|
||||
|
||||
snprintfrr(
|
||||
buf, len, "%s%s%s%s%s%s%s%s%s%s",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_ALLOW_RECURSION) ? "Recursion "
|
||||
: "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_SELFROUTE) ? "Self " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_IBGP) ? "iBGP " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_SELECTED) ? "Selected " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_FIB_OVERRIDE) ? "Override " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_EVPN_ROUTE) ? "Evpn " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_RR_USE_DISTANCE) ? "RR Distance "
|
||||
: "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_TRAPPED) ? "Trapped " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_OFFLOADED) ? "Offloaded " : "",
|
||||
CHECK_FLAG(flags, ZEBRA_FLAG_OFFLOAD_FAILED) ? "Offload Failed "
|
||||
: "");
|
||||
return buf;
|
||||
}
|
||||
|
@ -479,6 +479,7 @@ struct zapi_route {
|
||||
uint8_t type;
|
||||
unsigned short instance;
|
||||
|
||||
/* If you add flags, update zclient_dump_route_flags */
|
||||
uint32_t flags;
|
||||
/*
|
||||
* Cause Zebra to consider this routes nexthops recursively
|
||||
@ -580,6 +581,8 @@ struct zapi_route {
|
||||
} opaque;
|
||||
};
|
||||
|
||||
extern char *zclient_dump_route_flags(uint32_t flags, char *buf, size_t len);
|
||||
|
||||
struct zapi_labels {
|
||||
uint8_t message;
|
||||
#define ZAPI_LABELS_FTN 0x01
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "workqueue.h"
|
||||
#include "nexthop_group_private.h"
|
||||
#include "frr_pthread.h"
|
||||
#include "printfrr.h"
|
||||
|
||||
#include "zebra/zebra_router.h"
|
||||
#include "zebra/connected.h"
|
||||
@ -148,6 +149,30 @@ _rnode_zlog(const char *_func, vrf_id_t vrf_id, struct route_node *rn,
|
||||
zlog(priority, "%s: (%u:%u):%s: %s", _func, vrf_id, table, buf, msgbuf);
|
||||
}
|
||||
|
||||
static char *_dump_re_status(const struct route_entry *re, char *buf,
|
||||
size_t len)
|
||||
{
|
||||
if (re->status == 0) {
|
||||
snprintfrr(buf, len, "None ");
|
||||
return buf;
|
||||
}
|
||||
|
||||
snprintfrr(
|
||||
buf, len, "%s%s%s%s%s%s%s",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED) ? "Removed " : "",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_CHANGED) ? "Changed " : "",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_LABELS_CHANGED)
|
||||
? "Label Changed "
|
||||
: "",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_QUEUED) ? "Queued " : "",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED) ? "Installed "
|
||||
: "",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_FAILED) ? "Failed " : "",
|
||||
CHECK_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG) ? "Fib NHG "
|
||||
: "");
|
||||
return buf;
|
||||
}
|
||||
|
||||
#define rnode_debug(node, vrf_id, ...) \
|
||||
_rnode_zlog(__func__, vrf_id, node, LOG_DEBUG, __VA_ARGS__)
|
||||
#define rnode_info(node, ...) \
|
||||
@ -1080,12 +1105,20 @@ static void rib_process(struct route_node *rn)
|
||||
}
|
||||
|
||||
RNODE_FOREACH_RE_SAFE (rn, re, next) {
|
||||
if (IS_ZEBRA_DEBUG_RIB_DETAILED)
|
||||
if (IS_ZEBRA_DEBUG_RIB_DETAILED) {
|
||||
char flags_buf[128];
|
||||
char status_buf[128];
|
||||
|
||||
zlog_debug(
|
||||
"%s(%u:%u):%s: Examine re %p (%s) status %x flags %x dist %d metric %d",
|
||||
"%s(%u:%u):%s: Examine re %p (%s) status: %sflags: %sdist %d metric %d",
|
||||
VRF_LOGNAME(vrf), vrf_id, re->table, buf, re,
|
||||
zebra_route_string(re->type), re->status,
|
||||
re->flags, re->distance, re->metric);
|
||||
zebra_route_string(re->type),
|
||||
_dump_re_status(re, status_buf,
|
||||
sizeof(status_buf)),
|
||||
zclient_dump_route_flags(re->flags, flags_buf,
|
||||
sizeof(flags_buf)),
|
||||
re->distance, re->metric);
|
||||
}
|
||||
|
||||
/* Currently selected re. */
|
||||
if (CHECK_FLAG(re->flags, ZEBRA_FLAG_SELECTED)) {
|
||||
@ -2791,6 +2824,8 @@ void _route_entry_dump(const char *func, union prefixconstptr pp,
|
||||
bool is_srcdst = src_p && src_p->prefixlen;
|
||||
char straddr[PREFIX_STRLEN];
|
||||
char srcaddr[PREFIX_STRLEN];
|
||||
char flags_buf[128];
|
||||
char status_buf[128];
|
||||
struct nexthop *nexthop;
|
||||
struct vrf *vrf = vrf_lookup_by_id(re->vrf_id);
|
||||
struct nexthop_group *nhg;
|
||||
@ -2804,9 +2839,12 @@ void _route_entry_dump(const char *func, union prefixconstptr pp,
|
||||
zlog_debug("%s: uptime == %lu, type == %u, instance == %d, table == %d",
|
||||
straddr, (unsigned long)re->uptime, re->type, re->instance,
|
||||
re->table);
|
||||
zlog_debug("%s: metric == %u, mtu == %u, distance == %u, flags == %u, status == %u",
|
||||
straddr, re->metric, re->mtu, re->distance, re->flags,
|
||||
re->status);
|
||||
zlog_debug(
|
||||
"%s: metric == %u, mtu == %u, distance == %u, flags == %sstatus == %s",
|
||||
straddr, re->metric, re->mtu, re->distance,
|
||||
zclient_dump_route_flags(re->flags, flags_buf,
|
||||
sizeof(flags_buf)),
|
||||
_dump_re_status(re, status_buf, sizeof(status_buf)));
|
||||
zlog_debug("%s: nexthop_num == %u, nexthop_active_num == %u", straddr,
|
||||
nexthop_group_nexthop_num(&(re->nhe->nhg)),
|
||||
nexthop_group_active_nexthop_num(&(re->nhe->nhg)));
|
||||
|
Loading…
Reference in New Issue
Block a user