Blame SOURCES/0034-netlink-support-u32-enumerated-types-in-pretty-print.patch

7e9df8
From 856c0c40eb221499b7326c216aaf87691062eacb Mon Sep 17 00:00:00 2001
7e9df8
From: Michal Kubecek <mkubecek@suse.cz>
7e9df8
Date: Mon, 19 Oct 2020 23:32:40 +0200
7e9df8
Subject: [PATCH 34/37] netlink: support u32 enumerated types in pretty
7e9df8
 printing
7e9df8
7e9df8
Some numeric attributes take values from a short list/range with symbolic
7e9df8
names. Showing the symbolic names instead of numeric values will make the
7e9df8
pretty printed netlink messages easier to read. If the value is too big for
7e9df8
provided names array (e.g. running on newer kernel) or the name is omitted,
7e9df8
numeric attribute value is shown.
7e9df8
7e9df8
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
7e9df8
(cherry picked from commit c7fe2f38477f5f90569f73bacd6fab3a8a739f62)
7e9df8
---
7e9df8
 netlink/prettymsg.c |  9 +++++++++
7e9df8
 netlink/prettymsg.h | 18 ++++++++++++++++--
7e9df8
 2 files changed, 25 insertions(+), 2 deletions(-)
7e9df8
7e9df8
diff --git a/netlink/prettymsg.c b/netlink/prettymsg.c
7e9df8
index f992dcaf071f..d5d999fddfbb 100644
7e9df8
--- a/netlink/prettymsg.c
7e9df8
+++ b/netlink/prettymsg.c
7e9df8
@@ -137,6 +137,15 @@ static int pretty_print_attr(const struct nlattr *attr,
7e9df8
 	case NLA_BOOL:
7e9df8
 		printf("%s", mnl_attr_get_u8(attr) ? "on" : "off");
7e9df8
 		break;
7e9df8
+	case NLA_U32_ENUM: {
7e9df8
+		uint32_t val = mnl_attr_get_u32(attr);
7e9df8
+
7e9df8
+		if (adesc && val < adesc->n_names && adesc->names[val])
7e9df8
+			printf("%s", adesc->names[val]);
7e9df8
+		else
7e9df8
+			printf("%u", val);
7e9df8
+		break;
7e9df8
+	}
7e9df8
 	default:
7e9df8
 		if (alen <= __DUMP_LINE)
7e9df8
 			__print_binary_short(adata, alen);
7e9df8
diff --git a/netlink/prettymsg.h b/netlink/prettymsg.h
7e9df8
index b5e5f735ac8a..6987c6ec5bca 100644
7e9df8
--- a/netlink/prettymsg.h
7e9df8
+++ b/netlink/prettymsg.h
7e9df8
@@ -28,13 +28,20 @@ enum pretty_nla_format {
7e9df8
 	NLA_BOOL,
7e9df8
 	NLA_NESTED,
7e9df8
 	NLA_ARRAY,
7e9df8
+	NLA_U32_ENUM,
7e9df8
 };
7e9df8
 
7e9df8
 struct pretty_nla_desc {
7e9df8
 	enum pretty_nla_format		format;
7e9df8
 	const char			*name;
7e9df8
-	const struct pretty_nla_desc	*children;
7e9df8
-	unsigned int			n_children;
7e9df8
+	union {
7e9df8
+		const struct pretty_nla_desc	*children;
7e9df8
+		const char			*const *names;
7e9df8
+	};
7e9df8
+	union {
7e9df8
+		unsigned int			n_children;
7e9df8
+		unsigned int			n_names;
7e9df8
+	};
7e9df8
 };
7e9df8
 
7e9df8
 struct pretty_nlmsg_desc {
7e9df8
@@ -81,6 +88,13 @@ struct pretty_nlmsg_desc {
7e9df8
 		.children = __ ## _children_desc ## _desc, \
7e9df8
 		.n_children = 1, \
7e9df8
 	}
7e9df8
+#define NLATTR_DESC_U32_ENUM(_name, _names_table) \
7e9df8
+	[_name] = { \
7e9df8
+		.format = NLA_U32_ENUM, \
7e9df8
+		.name = #_name, \
7e9df8
+		.names = __ ## _names_table ## _names, \
7e9df8
+		.n_children = ARRAY_SIZE(__ ## _names_table ## _names), \
7e9df8
+	}
7e9df8
 
7e9df8
 #define NLMSG_DESC(_name, _attrs) \
7e9df8
 	[_name] = { \
7e9df8
-- 
7e9df8
2.26.2
7e9df8