• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
22 extern int CONCAT_(GENL_MAGIC_FAMILY, _genl_register)(void);
23 extern 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 
130 enum {
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 
144 enum {
145 #include GENL_MAGIC_INCLUDE_FILE
146 };
147 
148 #undef GENL_struct
149 #define GENL_struct(tag_name, tag_number, s_name, s_fields)	\
150 enum {								\
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 
ct_assert_unique_operations(void)184 static inline void ct_assert_unique_operations(void)
185 {
186 	switch (0) {
187 #include GENL_MAGIC_INCLUDE_FILE
188 	case 0:
189 		;
190 	}
191 }
192 
193 #undef GENL_op
194 #define GENL_op(op_name, op_num, handler, attr_list)
195 
196 #undef GENL_notification
197 #define GENL_notification(op_name, op_num, mcast_group, tla_list)
198 
199 #undef GENL_struct
200 #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
201 		case tag_number:
202 
ct_assert_unique_top_level_attributes(void)203 static inline void ct_assert_unique_top_level_attributes(void)
204 {
205 	switch (0) {
206 #include GENL_MAGIC_INCLUDE_FILE
207 	case 0:
208 		;
209 	}
210 }
211 
212 #undef GENL_struct
213 #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
214 static inline void ct_assert_unique_ ## s_name ## _attributes(void)	\
215 {									\
216 	switch (0) {							\
217 	s_fields							\
218 	case 0:								\
219 			;						\
220 	}								\
221 }
222 
223 #undef __field
224 #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
225 		__is_signed)						\
226 	case attr_nr:
227 
228 #undef __array
229 #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
230 		__get, __put, __is_signed)				\
231 	case attr_nr:
232 
233 #include GENL_MAGIC_INCLUDE_FILE
234 
235 /*									}}}1
236  * Magic: declare structs
237  * struct <name> {
238  *	fields
239  * };
240  *									{{{2
241  */
242 
243 #undef GENL_struct
244 #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
245 struct s_name { s_fields };
246 
247 #undef __field
248 #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
249 		__is_signed)						\
250 	type name;
251 
252 #undef __array
253 #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
254 		__get, __put, __is_signed)				\
255 	type name[maxlen];	\
256 	__u32 name ## _len;
257 
258 #include GENL_MAGIC_INCLUDE_FILE
259 
260 #undef GENL_struct
261 #define GENL_struct(tag_name, tag_number, s_name, s_fields)		\
262 enum {									\
263 	s_fields							\
264 };
265 
266 #undef __field
267 #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put,	\
268 		is_signed)						\
269 	F_ ## name ## _IS_SIGNED = is_signed,
270 
271 #undef __array
272 #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen,	\
273 		__get, __put, is_signed)				\
274 	F_ ## name ## _IS_SIGNED = is_signed,
275 
276 #include GENL_MAGIC_INCLUDE_FILE
277 
278 /* }}}1 */
279 #endif /* GENL_MAGIC_STRUCT_H */
280 /* vim: set foldmethod=marker nofoldenable : */
281