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