xref: /aosp_15_r20/external/ethtool/netlink/prettymsg.h (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1 /*
2  * prettymsg.h - human readable message dump
3  *
4  * Support for pretty print of an ethtool netlink message
5  */
6 
7 #ifndef ETHTOOL_NETLINK_PRETTYMSG_H__
8 #define ETHTOOL_NETLINK_PRETTYMSG_H__
9 
10 #include <linux/netlink.h>
11 
12 /* data structures for message format descriptions */
13 
14 enum pretty_nla_format {
15 	NLA_INVALID,
16 	NLA_BINARY,
17 	NLA_U8,
18 	NLA_U16,
19 	NLA_U32,
20 	NLA_U64,
21 	NLA_X8,
22 	NLA_X16,
23 	NLA_X32,
24 	NLA_X64,
25 	NLA_S8,
26 	NLA_S16,
27 	NLA_S32,
28 	NLA_S64,
29 	NLA_STRING,
30 	NLA_FLAG,
31 	NLA_BOOL,
32 	NLA_NESTED,
33 	NLA_ARRAY,
34 	NLA_U8_ENUM,
35 	NLA_U32_ENUM,
36 };
37 
38 struct pretty_nla_desc {
39 	enum pretty_nla_format		format;
40 	const char			*name;
41 	union {
42 		const struct pretty_nla_desc	*children;
43 		const char			*const *names;
44 	};
45 	union {
46 		unsigned int			n_children;
47 		unsigned int			n_names;
48 	};
49 };
50 
51 struct pretty_nlmsg_desc {
52 	const char			*name;
53 	const struct pretty_nla_desc	*attrs;
54 	unsigned int			n_attrs;
55 };
56 
57 /* helper macros for message format descriptions */
58 
59 #define NLATTR_DESC(_name, _fmt) \
60 	[_name] = { \
61 		.format = _fmt, \
62 		.name = #_name, \
63 	}
64 
65 #define NLATTR_DESC_INVALID(_name)	NLATTR_DESC(_name, NLA_INVALID)
66 #define NLATTR_DESC_U8(_name)		NLATTR_DESC(_name, NLA_U8)
67 #define NLATTR_DESC_U16(_name)		NLATTR_DESC(_name, NLA_U16)
68 #define NLATTR_DESC_U32(_name)		NLATTR_DESC(_name, NLA_U32)
69 #define NLATTR_DESC_U64(_name)		NLATTR_DESC(_name, NLA_U64)
70 #define NLATTR_DESC_X8(_name)		NLATTR_DESC(_name, NLA_X8)
71 #define NLATTR_DESC_X16(_name)		NLATTR_DESC(_name, NLA_X16)
72 #define NLATTR_DESC_X32(_name)		NLATTR_DESC(_name, NLA_X32)
73 #define NLATTR_DESC_X64(_name)		NLATTR_DESC(_name, NLA_X64)
74 #define NLATTR_DESC_S8(_name)		NLATTR_DESC(_name, NLA_U8)
75 #define NLATTR_DESC_S16(_name)		NLATTR_DESC(_name, NLA_U16)
76 #define NLATTR_DESC_S32(_name)		NLATTR_DESC(_name, NLA_U32)
77 #define NLATTR_DESC_S64(_name)		NLATTR_DESC(_name, NLA_S64)
78 #define NLATTR_DESC_STRING(_name)	NLATTR_DESC(_name, NLA_STRING)
79 #define NLATTR_DESC_FLAG(_name)		NLATTR_DESC(_name, NLA_FLAG)
80 #define NLATTR_DESC_BOOL(_name)		NLATTR_DESC(_name, NLA_BOOL)
81 #define NLATTR_DESC_BINARY(_name)	NLATTR_DESC(_name, NLA_BINARY)
82 
83 #define NLATTR_DESC_NESTED(_name, _children_desc) \
84 	[_name] = { \
85 		.format = NLA_NESTED, \
86 		.name = #_name, \
87 		.children = __ ## _children_desc ## _desc, \
88 		.n_children = ARRAY_SIZE(__ ## _children_desc ## _desc), \
89 	}
90 #define NLATTR_DESC_NESTED_NODESC(_name) NLATTR_DESC(_name, NLA_NESTED)
91 #define NLATTR_DESC_ARRAY(_name, _children_desc) \
92 	[_name] = { \
93 		.format = NLA_ARRAY, \
94 		.name = #_name, \
95 		.children = __ ## _children_desc ## _desc, \
96 		.n_children = 1, \
97 	}
98 #define NLATTR_DESC_U8_ENUM(_name, _names_table) \
99 	[_name] = { \
100 		.format = NLA_U8_ENUM, \
101 		.name = #_name, \
102 		.names = __ ## _names_table ## _names, \
103 		.n_children = ARRAY_SIZE(__ ## _names_table ## _names), \
104 	}
105 #define NLATTR_DESC_U32_ENUM(_name, _names_table) \
106 	[_name] = { \
107 		.format = NLA_U32_ENUM, \
108 		.name = #_name, \
109 		.names = __ ## _names_table ## _names, \
110 		.n_children = ARRAY_SIZE(__ ## _names_table ## _names), \
111 	}
112 
113 #define NLMSG_DESC(_name, _attrs) \
114 	[_name] = { \
115 		.name = #_name, \
116 		.attrs = __ ## _attrs ## _desc, \
117 		.n_attrs = ARRAY_SIZE(__ ## _attrs ## _desc), \
118 	}
119 
120 #define NLMSG_DESC_INVALID(_name) \
121 	[_name] = { \
122 		.name = #_name, \
123 	}
124 
125 /* function to pretty print a genetlink message */
126 int pretty_print_genlmsg(const struct nlmsghdr *nlhdr,
127 			 const struct pretty_nlmsg_desc *desc,
128 			 unsigned int ndesc, unsigned int err_offset);
129 int pretty_print_rtnlmsg(const struct nlmsghdr *nlhdr, unsigned int err_offset);
130 
131 /* message descriptions */
132 
133 extern const struct pretty_nlmsg_desc ethnl_umsg_desc[];
134 extern const unsigned int ethnl_umsg_n_desc;
135 extern const struct pretty_nlmsg_desc ethnl_kmsg_desc[];
136 extern const unsigned int ethnl_kmsg_n_desc;
137 
138 extern const struct pretty_nlmsg_desc genlctrl_msg_desc[];
139 extern const unsigned int genlctrl_msg_n_desc;
140 
141 extern const struct pretty_nlmsg_desc rtnl_msg_desc[];
142 extern const unsigned int rtnl_msg_n_desc;
143 extern const unsigned short rtnl_msghdr_lengths[];
144 extern const unsigned int rtnl_msghdr_n_len;
145 
146 #endif /* ETHTOOL_NETLINK_PRETTYMSG_H__ */
147