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