Linux Audio

Check our new training course

Loading...
v3.15
 
  1#ifndef GENL_MAGIC_STRUCT_H
  2#define GENL_MAGIC_STRUCT_H
  3
  4#ifndef GENL_MAGIC_FAMILY
  5# error "you need to define GENL_MAGIC_FAMILY before inclusion"
  6#endif
  7
  8#ifndef GENL_MAGIC_VERSION
  9# error "you need to define GENL_MAGIC_VERSION before inclusion"
 10#endif
 11
 12#ifndef GENL_MAGIC_INCLUDE_FILE
 13# error "you need to define GENL_MAGIC_INCLUDE_FILE before inclusion"
 14#endif
 15
 16#include <linux/genetlink.h>
 17#include <linux/types.h>
 18
 19#define CONCAT__(a,b)	a ## b
 20#define CONCAT_(a,b)	CONCAT__(a,b)
 21
 22extern int CONCAT_(GENL_MAGIC_FAMILY, _genl_register)(void);
 23extern void CONCAT_(GENL_MAGIC_FAMILY, _genl_unregister)(void);
 24
 25/*
 26 * Extension of genl attribute validation policies			{{{2
 27 */
 28
 29/*
 30 * @DRBD_GENLA_F_MANDATORY: By default, netlink ignores attributes it does not
 31 * know about.  This flag can be set in nlattr->nla_type to indicate that this
 32 * attribute must not be ignored.
 33 *
 34 * We check and remove this flag in drbd_nla_check_mandatory() before
 35 * validating the attribute types and lengths via nla_parse_nested().
 36 */
 37#define DRBD_GENLA_F_MANDATORY (1 << 14)
 38
 39/*
 40 * Flags specific to drbd and not visible at the netlink layer, used in
 41 * <struct>_from_attrs and <struct>_to_skb:
 42 *
 43 * @DRBD_F_REQUIRED: Attribute is required; a request without this attribute is
 44 * invalid.
 45 *
 46 * @DRBD_F_SENSITIVE: Attribute includes sensitive information and must not be
 47 * included in unpriviledged get requests or broadcasts.
 48 *
 49 * @DRBD_F_INVARIANT: Attribute is set when an object is initially created, but
 50 * cannot subsequently be changed.
 51 */
 52#define DRBD_F_REQUIRED (1 << 0)
 53#define DRBD_F_SENSITIVE (1 << 1)
 54#define DRBD_F_INVARIANT (1 << 2)
 55
 56#define __nla_type(x)	((__u16)((x) & NLA_TYPE_MASK & ~DRBD_GENLA_F_MANDATORY))
 57
 58/*									}}}1
 59 * MAGIC
 60 * multi-include macro expansion magic starts here
 61 */
 62
 63/* MAGIC helpers							{{{2 */
 64
 
 
 
 
 
 65/* possible field types */
 66#define __flg_field(attr_nr, attr_flag, name) \
 67	__field(attr_nr, attr_flag, name, NLA_U8, char, \
 68			nla_get_u8, nla_put_u8, false)
 69#define __u8_field(attr_nr, attr_flag, name)	\
 70	__field(attr_nr, attr_flag, name, NLA_U8, unsigned char, \
 71			nla_get_u8, nla_put_u8, false)
 72#define __u16_field(attr_nr, attr_flag, name)	\
 73	__field(attr_nr, attr_flag, name, NLA_U16, __u16, \
 74			nla_get_u16, nla_put_u16, false)
 75#define __u32_field(attr_nr, attr_flag, name)	\
 76	__field(attr_nr, attr_flag, name, NLA_U32, __u32, \
 77			nla_get_u32, nla_put_u32, false)
 78#define __s32_field(attr_nr, attr_flag, name)	\
 79	__field(attr_nr, attr_flag, name, NLA_U32, __s32, \
 80			nla_get_u32, nla_put_u32, true)
 81#define __u64_field(attr_nr, attr_flag, name)	\
 82	__field(attr_nr, attr_flag, name, NLA_U64, __u64, \
 83			nla_get_u64, nla_put_u64, false)
 84#define __str_field(attr_nr, attr_flag, name, maxlen) \
 85	__array(attr_nr, attr_flag, name, NLA_NUL_STRING, char, maxlen, \
 86			nla_strlcpy, nla_put, false)
 87#define __bin_field(attr_nr, attr_flag, name, maxlen) \
 88	__array(attr_nr, attr_flag, name, NLA_BINARY, char, maxlen, \
 89			nla_memcpy, nla_put, false)
 90
 91/* fields with default values */
 92#define __flg_field_def(attr_nr, attr_flag, name, default) \
 93	__flg_field(attr_nr, attr_flag, name)
 94#define __u32_field_def(attr_nr, attr_flag, name, default) \
 95	__u32_field(attr_nr, attr_flag, name)
 96#define __s32_field_def(attr_nr, attr_flag, name, default) \
 97	__s32_field(attr_nr, attr_flag, name)
 98#define __str_field_def(attr_nr, attr_flag, name, maxlen) \
 99	__str_field(attr_nr, attr_flag, name, maxlen)
100
101#define GENL_op_init(args...)	args
102#define GENL_doit(handler)		\
103	.doit = handler,		\
104	.flags = GENL_ADMIN_PERM,
105#define GENL_dumpit(handler)		\
106	.dumpit = handler,		\
107	.flags = GENL_ADMIN_PERM,
108
109/*									}}}1
110 * Magic: define the enum symbols for genl_ops
111 * Magic: define the enum symbols for top level attributes
112 * Magic: define the enum symbols for nested attributes
113 *									{{{2
114 */
115
116#undef GENL_struct
117#define GENL_struct(tag_name, tag_number, s_name, s_fields)
118
119#undef GENL_mc_group
120#define GENL_mc_group(group)
121
122#undef GENL_notification
123#define GENL_notification(op_name, op_num, mcast_group, tla_list)	\
124	op_name = op_num,
125
126#undef GENL_op
127#define GENL_op(op_name, op_num, handler, tla_list)			\
128	op_name = op_num,
129
130enum {
131#include GENL_MAGIC_INCLUDE_FILE
132};
133
134#undef GENL_notification
135#define GENL_notification(op_name, op_num, mcast_group, tla_list)
136
137#undef GENL_op
138#define GENL_op(op_name, op_num, handler, attr_list)
139
140#undef GENL_struct
141#define GENL_struct(tag_name, tag_number, s_name, s_fields) \
142		tag_name = tag_number,
143
144enum {
145#include GENL_MAGIC_INCLUDE_FILE
146};
147
148#undef GENL_struct
149#define GENL_struct(tag_name, tag_number, s_name, s_fields)	\
150enum {								\
151	s_fields						\
152};
153
154#undef __field
155#define __field(attr_nr, attr_flag, name, nla_type, type,	\
156		__get, __put, __is_signed)			\
157	T_ ## name = (__u16)(attr_nr | ((attr_flag) & DRBD_GENLA_F_MANDATORY)),
158
159#undef __array
160#define __array(attr_nr, attr_flag, name, nla_type, type,	\
161		maxlen, __get, __put, __is_signed)		\
162	T_ ## name = (__u16)(attr_nr | ((attr_flag) & DRBD_GENLA_F_MANDATORY)),
163
164#include GENL_MAGIC_INCLUDE_FILE
165
166/*									}}}1
167 * Magic: compile time assert unique numbers for operations
168 * Magic: -"- unique numbers for top level attributes
169 * Magic: -"- unique numbers for nested attributes
170 *									{{{2
171 */
172
173#undef GENL_struct
174#define GENL_struct(tag_name, tag_number, s_name, s_fields)
175
176#undef GENL_op
177#define GENL_op(op_name, op_num, handler, attr_list)	\
178	case op_name:
179
180#undef GENL_notification
181#define GENL_notification(op_name, op_num, mcast_group, tla_list)	\
182	case op_name:
183
184static inline void ct_assert_unique_operations(void)
185{
186	switch (0) {
187#include GENL_MAGIC_INCLUDE_FILE
188		;
189	}
190}
191
192#undef GENL_op
193#define GENL_op(op_name, op_num, handler, attr_list)
194
195#undef GENL_notification
196#define GENL_notification(op_name, op_num, mcast_group, tla_list)
197
198#undef GENL_struct
199#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
200		case tag_number:
201
202static inline void ct_assert_unique_top_level_attributes(void)
203{
204	switch (0) {
205#include GENL_MAGIC_INCLUDE_FILE
206		;
207	}
208}
209
210#undef GENL_struct
211#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
212static inline void ct_assert_unique_ ## s_name ## _attributes(void)	\
213{									\
214	switch (0) {							\
215		s_fields						\
216			;						\
217	}								\
218}
219
220#undef __field
221#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
222		__is_signed)						\
223	case attr_nr:
224
225#undef __array
226#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
227		__get, __put, __is_signed)				\
228	case attr_nr:
229
230#include GENL_MAGIC_INCLUDE_FILE
231
232/*									}}}1
233 * Magic: declare structs
234 * struct <name> {
235 *	fields
236 * };
237 *									{{{2
238 */
239
240#undef GENL_struct
241#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
242struct s_name { s_fields };
243
244#undef __field
245#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
246		__is_signed)						\
247	type name;
248
249#undef __array
250#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
251		__get, __put, __is_signed)				\
252	type name[maxlen];	\
253	__u32 name ## _len;
254
255#include GENL_MAGIC_INCLUDE_FILE
256
257#undef GENL_struct
258#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
259enum {									\
260	s_fields							\
261};
262
263#undef __field
264#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
265		is_signed)						\
266	F_ ## name ## _IS_SIGNED = is_signed,
267
268#undef __array
269#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
270		__get, __put, is_signed)				\
271	F_ ## name ## _IS_SIGNED = is_signed,
272
273#include GENL_MAGIC_INCLUDE_FILE
274
275/* }}}1 */
276#endif /* GENL_MAGIC_STRUCT_H */
277/* vim: set foldmethod=marker nofoldenable : */
v4.17
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef GENL_MAGIC_STRUCT_H
  3#define GENL_MAGIC_STRUCT_H
  4
  5#ifndef GENL_MAGIC_FAMILY
  6# error "you need to define GENL_MAGIC_FAMILY before inclusion"
  7#endif
  8
  9#ifndef GENL_MAGIC_VERSION
 10# error "you need to define GENL_MAGIC_VERSION before inclusion"
 11#endif
 12
 13#ifndef GENL_MAGIC_INCLUDE_FILE
 14# error "you need to define GENL_MAGIC_INCLUDE_FILE before inclusion"
 15#endif
 16
 17#include <linux/genetlink.h>
 18#include <linux/types.h>
 19
 20#define CONCAT__(a,b)	a ## b
 21#define CONCAT_(a,b)	CONCAT__(a,b)
 22
 23extern int CONCAT_(GENL_MAGIC_FAMILY, _genl_register)(void);
 24extern void CONCAT_(GENL_MAGIC_FAMILY, _genl_unregister)(void);
 25
 26/*
 27 * Extension of genl attribute validation policies			{{{2
 28 */
 29
 30/*
 31 * @DRBD_GENLA_F_MANDATORY: By default, netlink ignores attributes it does not
 32 * know about.  This flag can be set in nlattr->nla_type to indicate that this
 33 * attribute must not be ignored.
 34 *
 35 * We check and remove this flag in drbd_nla_check_mandatory() before
 36 * validating the attribute types and lengths via nla_parse_nested().
 37 */
 38#define DRBD_GENLA_F_MANDATORY (1 << 14)
 39
 40/*
 41 * Flags specific to drbd and not visible at the netlink layer, used in
 42 * <struct>_from_attrs and <struct>_to_skb:
 43 *
 44 * @DRBD_F_REQUIRED: Attribute is required; a request without this attribute is
 45 * invalid.
 46 *
 47 * @DRBD_F_SENSITIVE: Attribute includes sensitive information and must not be
 48 * included in unpriviledged get requests or broadcasts.
 49 *
 50 * @DRBD_F_INVARIANT: Attribute is set when an object is initially created, but
 51 * cannot subsequently be changed.
 52 */
 53#define DRBD_F_REQUIRED (1 << 0)
 54#define DRBD_F_SENSITIVE (1 << 1)
 55#define DRBD_F_INVARIANT (1 << 2)
 56
 57#define __nla_type(x)	((__u16)((x) & NLA_TYPE_MASK & ~DRBD_GENLA_F_MANDATORY))
 58
 59/*									}}}1
 60 * MAGIC
 61 * multi-include macro expansion magic starts here
 62 */
 63
 64/* MAGIC helpers							{{{2 */
 65
 66static inline int nla_put_u64_0pad(struct sk_buff *skb, int attrtype, u64 value)
 67{
 68	return nla_put_64bit(skb, attrtype, sizeof(u64), &value, 0);
 69}
 70
 71/* possible field types */
 72#define __flg_field(attr_nr, attr_flag, name) \
 73	__field(attr_nr, attr_flag, name, NLA_U8, char, \
 74			nla_get_u8, nla_put_u8, false)
 75#define __u8_field(attr_nr, attr_flag, name)	\
 76	__field(attr_nr, attr_flag, name, NLA_U8, unsigned char, \
 77			nla_get_u8, nla_put_u8, false)
 78#define __u16_field(attr_nr, attr_flag, name)	\
 79	__field(attr_nr, attr_flag, name, NLA_U16, __u16, \
 80			nla_get_u16, nla_put_u16, false)
 81#define __u32_field(attr_nr, attr_flag, name)	\
 82	__field(attr_nr, attr_flag, name, NLA_U32, __u32, \
 83			nla_get_u32, nla_put_u32, false)
 84#define __s32_field(attr_nr, attr_flag, name)	\
 85	__field(attr_nr, attr_flag, name, NLA_U32, __s32, \
 86			nla_get_u32, nla_put_u32, true)
 87#define __u64_field(attr_nr, attr_flag, name)	\
 88	__field(attr_nr, attr_flag, name, NLA_U64, __u64, \
 89			nla_get_u64, nla_put_u64_0pad, false)
 90#define __str_field(attr_nr, attr_flag, name, maxlen) \
 91	__array(attr_nr, attr_flag, name, NLA_NUL_STRING, char, maxlen, \
 92			nla_strlcpy, nla_put, false)
 93#define __bin_field(attr_nr, attr_flag, name, maxlen) \
 94	__array(attr_nr, attr_flag, name, NLA_BINARY, char, maxlen, \
 95			nla_memcpy, nla_put, false)
 96
 97/* fields with default values */
 98#define __flg_field_def(attr_nr, attr_flag, name, default) \
 99	__flg_field(attr_nr, attr_flag, name)
100#define __u32_field_def(attr_nr, attr_flag, name, default) \
101	__u32_field(attr_nr, attr_flag, name)
102#define __s32_field_def(attr_nr, attr_flag, name, default) \
103	__s32_field(attr_nr, attr_flag, name)
104#define __str_field_def(attr_nr, attr_flag, name, maxlen) \
105	__str_field(attr_nr, attr_flag, name, maxlen)
106
107#define GENL_op_init(args...)	args
108#define GENL_doit(handler)		\
109	.doit = handler,		\
110	.flags = GENL_ADMIN_PERM,
111#define GENL_dumpit(handler)		\
112	.dumpit = handler,		\
113	.flags = GENL_ADMIN_PERM,
114
115/*									}}}1
116 * Magic: define the enum symbols for genl_ops
117 * Magic: define the enum symbols for top level attributes
118 * Magic: define the enum symbols for nested attributes
119 *									{{{2
120 */
121
122#undef GENL_struct
123#define GENL_struct(tag_name, tag_number, s_name, s_fields)
124
125#undef GENL_mc_group
126#define GENL_mc_group(group)
127
128#undef GENL_notification
129#define GENL_notification(op_name, op_num, mcast_group, tla_list)	\
130	op_name = op_num,
131
132#undef GENL_op
133#define GENL_op(op_name, op_num, handler, tla_list)			\
134	op_name = op_num,
135
136enum {
137#include GENL_MAGIC_INCLUDE_FILE
138};
139
140#undef GENL_notification
141#define GENL_notification(op_name, op_num, mcast_group, tla_list)
142
143#undef GENL_op
144#define GENL_op(op_name, op_num, handler, attr_list)
145
146#undef GENL_struct
147#define GENL_struct(tag_name, tag_number, s_name, s_fields) \
148		tag_name = tag_number,
149
150enum {
151#include GENL_MAGIC_INCLUDE_FILE
152};
153
154#undef GENL_struct
155#define GENL_struct(tag_name, tag_number, s_name, s_fields)	\
156enum {								\
157	s_fields						\
158};
159
160#undef __field
161#define __field(attr_nr, attr_flag, name, nla_type, type,	\
162		__get, __put, __is_signed)			\
163	T_ ## name = (__u16)(attr_nr | ((attr_flag) & DRBD_GENLA_F_MANDATORY)),
164
165#undef __array
166#define __array(attr_nr, attr_flag, name, nla_type, type,	\
167		maxlen, __get, __put, __is_signed)		\
168	T_ ## name = (__u16)(attr_nr | ((attr_flag) & DRBD_GENLA_F_MANDATORY)),
169
170#include GENL_MAGIC_INCLUDE_FILE
171
172/*									}}}1
173 * Magic: compile time assert unique numbers for operations
174 * Magic: -"- unique numbers for top level attributes
175 * Magic: -"- unique numbers for nested attributes
176 *									{{{2
177 */
178
179#undef GENL_struct
180#define GENL_struct(tag_name, tag_number, s_name, s_fields)
181
182#undef GENL_op
183#define GENL_op(op_name, op_num, handler, attr_list)	\
184	case op_name:
185
186#undef GENL_notification
187#define GENL_notification(op_name, op_num, mcast_group, tla_list)	\
188	case op_name:
189
190static inline void ct_assert_unique_operations(void)
191{
192	switch (0) {
193#include GENL_MAGIC_INCLUDE_FILE
194		;
195	}
196}
197
198#undef GENL_op
199#define GENL_op(op_name, op_num, handler, attr_list)
200
201#undef GENL_notification
202#define GENL_notification(op_name, op_num, mcast_group, tla_list)
203
204#undef GENL_struct
205#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
206		case tag_number:
207
208static inline void ct_assert_unique_top_level_attributes(void)
209{
210	switch (0) {
211#include GENL_MAGIC_INCLUDE_FILE
212		;
213	}
214}
215
216#undef GENL_struct
217#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
218static inline void ct_assert_unique_ ## s_name ## _attributes(void)	\
219{									\
220	switch (0) {							\
221		s_fields						\
222			;						\
223	}								\
224}
225
226#undef __field
227#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
228		__is_signed)						\
229	case attr_nr:
230
231#undef __array
232#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
233		__get, __put, __is_signed)				\
234	case attr_nr:
235
236#include GENL_MAGIC_INCLUDE_FILE
237
238/*									}}}1
239 * Magic: declare structs
240 * struct <name> {
241 *	fields
242 * };
243 *									{{{2
244 */
245
246#undef GENL_struct
247#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
248struct s_name { s_fields };
249
250#undef __field
251#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
252		__is_signed)						\
253	type name;
254
255#undef __array
256#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
257		__get, __put, __is_signed)				\
258	type name[maxlen];	\
259	__u32 name ## _len;
260
261#include GENL_MAGIC_INCLUDE_FILE
262
263#undef GENL_struct
264#define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
265enum {									\
266	s_fields							\
267};
268
269#undef __field
270#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
271		is_signed)						\
272	F_ ## name ## _IS_SIGNED = is_signed,
273
274#undef __array
275#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
276		__get, __put, is_signed)				\
277	F_ ## name ## _IS_SIGNED = is_signed,
278
279#include GENL_MAGIC_INCLUDE_FILE
280
281/* }}}1 */
282#endif /* GENL_MAGIC_STRUCT_H */
283/* vim: set foldmethod=marker nofoldenable : */