aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Kubecek <mkubecek@suse.cz>2020-10-19 23:32:40 +0200
committerMichal Kubecek <mkubecek@suse.cz>2020-10-21 11:39:00 +0200
commitc7fe2f38477f5f90569f73bacd6fab3a8a739f62 (patch)
treebc22f066365541bc0426bb1f41aa16b4e5a7b2db
parent5da1e8ed6067ec700fe0d0e2653968677155a1f1 (diff)
downloadethtool-c7fe2f38477f5f90569f73bacd6fab3a8a739f62.tar.gz
netlink: support u32 enumerated types in pretty printing
Some numeric attributes take values from a short list/range with symbolic names. Showing the symbolic names instead of numeric values will make the pretty printed netlink messages easier to read. If the value is too big for provided names array (e.g. running on newer kernel) or the name is omitted, numeric attribute value is shown. Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
-rw-r--r--netlink/prettymsg.c9
-rw-r--r--netlink/prettymsg.h18
2 files changed, 25 insertions, 2 deletions
diff --git a/netlink/prettymsg.c b/netlink/prettymsg.c
index f992dca..d5d999f 100644
--- a/netlink/prettymsg.c
+++ b/netlink/prettymsg.c
@@ -137,6 +137,15 @@ static int pretty_print_attr(const struct nlattr *attr,
case NLA_BOOL:
printf("%s", mnl_attr_get_u8(attr) ? "on" : "off");
break;
+ case NLA_U32_ENUM: {
+ uint32_t val = mnl_attr_get_u32(attr);
+
+ if (adesc && val < adesc->n_names && adesc->names[val])
+ printf("%s", adesc->names[val]);
+ else
+ printf("%u", val);
+ break;
+ }
default:
if (alen <= __DUMP_LINE)
__print_binary_short(adata, alen);
diff --git a/netlink/prettymsg.h b/netlink/prettymsg.h
index b5e5f73..6987c6e 100644
--- a/netlink/prettymsg.h
+++ b/netlink/prettymsg.h
@@ -28,13 +28,20 @@ enum pretty_nla_format {
NLA_BOOL,
NLA_NESTED,
NLA_ARRAY,
+ NLA_U32_ENUM,
};
struct pretty_nla_desc {
enum pretty_nla_format format;
const char *name;
- const struct pretty_nla_desc *children;
- unsigned int n_children;
+ union {
+ const struct pretty_nla_desc *children;
+ const char *const *names;
+ };
+ union {
+ unsigned int n_children;
+ unsigned int n_names;
+ };
};
struct pretty_nlmsg_desc {
@@ -81,6 +88,13 @@ struct pretty_nlmsg_desc {
.children = __ ## _children_desc ## _desc, \
.n_children = 1, \
}
+#define NLATTR_DESC_U32_ENUM(_name, _names_table) \
+ [_name] = { \
+ .format = NLA_U32_ENUM, \
+ .name = #_name, \
+ .names = __ ## _names_table ## _names, \
+ .n_children = ARRAY_SIZE(__ ## _names_table ## _names), \
+ }
#define NLMSG_DESC(_name, _attrs) \
[_name] = { \