|  | #ifndef GENL_MAGIC_STRUCT_H | 
|  | #define GENL_MAGIC_STRUCT_H | 
|  |  | 
|  | #ifndef GENL_MAGIC_FAMILY | 
|  | # error "you need to define GENL_MAGIC_FAMILY before inclusion" | 
|  | #endif | 
|  |  | 
|  | #ifndef GENL_MAGIC_VERSION | 
|  | # error "you need to define GENL_MAGIC_VERSION before inclusion" | 
|  | #endif | 
|  |  | 
|  | #ifndef GENL_MAGIC_INCLUDE_FILE | 
|  | # error "you need to define GENL_MAGIC_INCLUDE_FILE before inclusion" | 
|  | #endif | 
|  |  | 
|  | #include <linux/genetlink.h> | 
|  | #include <linux/types.h> | 
|  |  | 
|  | #define CONCAT__(a,b)	a ## b | 
|  | #define CONCAT_(a,b)	CONCAT__(a,b) | 
|  |  | 
|  | extern int CONCAT_(GENL_MAGIC_FAMILY, _genl_register)(void); | 
|  | extern void CONCAT_(GENL_MAGIC_FAMILY, _genl_unregister)(void); | 
|  |  | 
|  | /* | 
|  | * Extension of genl attribute validation policies			{{{2 | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * @DRBD_GENLA_F_MANDATORY: By default, netlink ignores attributes it does not | 
|  | * know about.  This flag can be set in nlattr->nla_type to indicate that this | 
|  | * attribute must not be ignored. | 
|  | * | 
|  | * We check and remove this flag in drbd_nla_check_mandatory() before | 
|  | * validating the attribute types and lengths via nla_parse_nested(). | 
|  | */ | 
|  | #define DRBD_GENLA_F_MANDATORY (1 << 14) | 
|  |  | 
|  | /* | 
|  | * Flags specific to drbd and not visible at the netlink layer, used in | 
|  | * <struct>_from_attrs and <struct>_to_skb: | 
|  | * | 
|  | * @DRBD_F_REQUIRED: Attribute is required; a request without this attribute is | 
|  | * invalid. | 
|  | * | 
|  | * @DRBD_F_SENSITIVE: Attribute includes sensitive information and must not be | 
|  | * included in unpriviledged get requests or broadcasts. | 
|  | * | 
|  | * @DRBD_F_INVARIANT: Attribute is set when an object is initially created, but | 
|  | * cannot subsequently be changed. | 
|  | */ | 
|  | #define DRBD_F_REQUIRED (1 << 0) | 
|  | #define DRBD_F_SENSITIVE (1 << 1) | 
|  | #define DRBD_F_INVARIANT (1 << 2) | 
|  |  | 
|  | #define __nla_type(x)	((__u16)((x) & NLA_TYPE_MASK & ~DRBD_GENLA_F_MANDATORY)) | 
|  |  | 
|  | /*									}}}1 | 
|  | * MAGIC | 
|  | * multi-include macro expansion magic starts here | 
|  | */ | 
|  |  | 
|  | /* MAGIC helpers							{{{2 */ | 
|  |  | 
|  | /* possible field types */ | 
|  | #define __flg_field(attr_nr, attr_flag, name) \ | 
|  | __field(attr_nr, attr_flag, name, NLA_U8, char, \ | 
|  | nla_get_u8, nla_put_u8, false) | 
|  | #define __u8_field(attr_nr, attr_flag, name)	\ | 
|  | __field(attr_nr, attr_flag, name, NLA_U8, unsigned char, \ | 
|  | nla_get_u8, nla_put_u8, false) | 
|  | #define __u16_field(attr_nr, attr_flag, name)	\ | 
|  | __field(attr_nr, attr_flag, name, NLA_U16, __u16, \ | 
|  | nla_get_u16, nla_put_u16, false) | 
|  | #define __u32_field(attr_nr, attr_flag, name)	\ | 
|  | __field(attr_nr, attr_flag, name, NLA_U32, __u32, \ | 
|  | nla_get_u32, nla_put_u32, false) | 
|  | #define __s32_field(attr_nr, attr_flag, name)	\ | 
|  | __field(attr_nr, attr_flag, name, NLA_U32, __s32, \ | 
|  | nla_get_u32, nla_put_u32, true) | 
|  | #define __u64_field(attr_nr, attr_flag, name)	\ | 
|  | __field(attr_nr, attr_flag, name, NLA_U64, __u64, \ | 
|  | nla_get_u64, nla_put_u64, false) | 
|  | #define __str_field(attr_nr, attr_flag, name, maxlen) \ | 
|  | __array(attr_nr, attr_flag, name, NLA_NUL_STRING, char, maxlen, \ | 
|  | nla_strlcpy, nla_put, false) | 
|  | #define __bin_field(attr_nr, attr_flag, name, maxlen) \ | 
|  | __array(attr_nr, attr_flag, name, NLA_BINARY, char, maxlen, \ | 
|  | nla_memcpy, nla_put, false) | 
|  |  | 
|  | /* fields with default values */ | 
|  | #define __flg_field_def(attr_nr, attr_flag, name, default) \ | 
|  | __flg_field(attr_nr, attr_flag, name) | 
|  | #define __u32_field_def(attr_nr, attr_flag, name, default) \ | 
|  | __u32_field(attr_nr, attr_flag, name) | 
|  | #define __s32_field_def(attr_nr, attr_flag, name, default) \ | 
|  | __s32_field(attr_nr, attr_flag, name) | 
|  | #define __str_field_def(attr_nr, attr_flag, name, maxlen) \ | 
|  | __str_field(attr_nr, attr_flag, name, maxlen) | 
|  |  | 
|  | #define GENL_op_init(args...)	args | 
|  | #define GENL_doit(handler)		\ | 
|  | .doit = handler,		\ | 
|  | .flags = GENL_ADMIN_PERM, | 
|  | #define GENL_dumpit(handler)		\ | 
|  | .dumpit = handler,		\ | 
|  | .flags = GENL_ADMIN_PERM, | 
|  |  | 
|  | /*									}}}1 | 
|  | * Magic: define the enum symbols for genl_ops | 
|  | * Magic: define the enum symbols for top level attributes | 
|  | * Magic: define the enum symbols for nested attributes | 
|  | *									{{{2 | 
|  | */ | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields) | 
|  |  | 
|  | #undef GENL_mc_group | 
|  | #define GENL_mc_group(group) | 
|  |  | 
|  | #undef GENL_notification | 
|  | #define GENL_notification(op_name, op_num, mcast_group, tla_list)	\ | 
|  | op_name = op_num, | 
|  |  | 
|  | #undef GENL_op | 
|  | #define GENL_op(op_name, op_num, handler, tla_list)			\ | 
|  | op_name = op_num, | 
|  |  | 
|  | enum { | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  | }; | 
|  |  | 
|  | #undef GENL_notification | 
|  | #define GENL_notification(op_name, op_num, mcast_group, tla_list) | 
|  |  | 
|  | #undef GENL_op | 
|  | #define GENL_op(op_name, op_num, handler, attr_list) | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields) \ | 
|  | tag_name = tag_number, | 
|  |  | 
|  | enum { | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  | }; | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields)	\ | 
|  | enum {								\ | 
|  | s_fields						\ | 
|  | }; | 
|  |  | 
|  | #undef __field | 
|  | #define __field(attr_nr, attr_flag, name, nla_type, type,	\ | 
|  | __get, __put, __is_signed)			\ | 
|  | T_ ## name = (__u16)(attr_nr | ((attr_flag) & DRBD_GENLA_F_MANDATORY)), | 
|  |  | 
|  | #undef __array | 
|  | #define __array(attr_nr, attr_flag, name, nla_type, type,	\ | 
|  | maxlen, __get, __put, __is_signed)		\ | 
|  | T_ ## name = (__u16)(attr_nr | ((attr_flag) & DRBD_GENLA_F_MANDATORY)), | 
|  |  | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  |  | 
|  | /*									}}}1 | 
|  | * Magic: compile time assert unique numbers for operations | 
|  | * Magic: -"- unique numbers for top level attributes | 
|  | * Magic: -"- unique numbers for nested attributes | 
|  | *									{{{2 | 
|  | */ | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields) | 
|  |  | 
|  | #undef GENL_op | 
|  | #define GENL_op(op_name, op_num, handler, attr_list)	\ | 
|  | case op_name: | 
|  |  | 
|  | #undef GENL_notification | 
|  | #define GENL_notification(op_name, op_num, mcast_group, tla_list)	\ | 
|  | case op_name: | 
|  |  | 
|  | static inline void ct_assert_unique_operations(void) | 
|  | { | 
|  | switch (0) { | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  | ; | 
|  | } | 
|  | } | 
|  |  | 
|  | #undef GENL_op | 
|  | #define GENL_op(op_name, op_num, handler, attr_list) | 
|  |  | 
|  | #undef GENL_notification | 
|  | #define GENL_notification(op_name, op_num, mcast_group, tla_list) | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\ | 
|  | case tag_number: | 
|  |  | 
|  | static inline void ct_assert_unique_top_level_attributes(void) | 
|  | { | 
|  | switch (0) { | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  | ; | 
|  | } | 
|  | } | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\ | 
|  | static inline void ct_assert_unique_ ## s_name ## _attributes(void)	\ | 
|  | {									\ | 
|  | switch (0) {							\ | 
|  | s_fields						\ | 
|  | ;						\ | 
|  | }								\ | 
|  | } | 
|  |  | 
|  | #undef __field | 
|  | #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\ | 
|  | __is_signed)						\ | 
|  | case attr_nr: | 
|  |  | 
|  | #undef __array | 
|  | #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\ | 
|  | __get, __put, __is_signed)				\ | 
|  | case attr_nr: | 
|  |  | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  |  | 
|  | /*									}}}1 | 
|  | * Magic: declare structs | 
|  | * struct <name> { | 
|  | *	fields | 
|  | * }; | 
|  | *									{{{2 | 
|  | */ | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\ | 
|  | struct s_name { s_fields }; | 
|  |  | 
|  | #undef __field | 
|  | #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\ | 
|  | __is_signed)						\ | 
|  | type name; | 
|  |  | 
|  | #undef __array | 
|  | #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\ | 
|  | __get, __put, __is_signed)				\ | 
|  | type name[maxlen];	\ | 
|  | __u32 name ## _len; | 
|  |  | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  |  | 
|  | #undef GENL_struct | 
|  | #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\ | 
|  | enum {									\ | 
|  | s_fields							\ | 
|  | }; | 
|  |  | 
|  | #undef __field | 
|  | #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\ | 
|  | is_signed)						\ | 
|  | F_ ## name ## _IS_SIGNED = is_signed, | 
|  |  | 
|  | #undef __array | 
|  | #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\ | 
|  | __get, __put, is_signed)				\ | 
|  | F_ ## name ## _IS_SIGNED = is_signed, | 
|  |  | 
|  | #include GENL_MAGIC_INCLUDE_FILE | 
|  |  | 
|  | /* }}}1 */ | 
|  | #endif /* GENL_MAGIC_STRUCT_H */ | 
|  | /* vim: set foldmethod=marker nofoldenable : */ |