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