]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Add ability to display in human readable format re->flags and status 7819/head
authorDonald Sharp <sharpd@nvidia.com>
Tue, 5 Jan 2021 22:21:20 +0000 (17:21 -0500)
committerDonald Sharp <sharpd@nvidia.com>
Wed, 13 Jan 2021 15:16:06 +0000 (10:16 -0500)
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>
lib/zclient.c
lib/zclient.h
zebra/zebra_rib.c

index cb4555650d2e48d680e765f41e2adc463e7d27dd..563673c6f3173c0ca14daad9f2b95ada340c40b4 100644 (file)
@@ -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;
+}
index 910a4dbae5ad53c2412d4bb768e304209e4ec6a7..44aa1fc0914471793c2354d29f3b703535c44f7e 100644 (file)
@@ -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
index 07cf0604fa3c2f4d8d0d0720757fbbddc4d72cb3..58a963fea0d69228b9c406568832d7bc4d610459 100644 (file)
@@ -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)));