]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - include/linux/genl_magic_struct.h
f3c3425ac30ffc85ee14c07c271b375fa5f6f849
[mirror_ubuntu-bionic-kernel.git] / include / linux / genl_magic_struct.h
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 * GENLA_F_FLAGS - policy type flags to ease compatible ABI evolvement
31 *
32 * @GENLA_F_REQUIRED: attribute has to be present, or message is considered invalid.
33 * Adding new REQUIRED attributes breaks ABI compatibility, so don't do that.
34 *
35 * @GENLA_F_MANDATORY: if present, receiver _must_ understand it.
36 * Without this, unknown attributes (> maxtype) are _silently_ ignored
37 * by validate_nla().
38 *
39 * To be used for API extensions, so older kernel can reject requests for not
40 * yet implemented features, if newer userland tries to use them even though
41 * the genl_family version clearly indicates they are not available.
42 *
43 * NOTE: These flags overload
44 * NLA_F_NESTED (1 << 15)
45 * NLA_F_NET_BYTEORDER (1 << 14)
46 * from linux/netlink.h, which are not useful for validate_nla():
47 * NET_BYTEORDER is not used anywhere, and NESTED would be specified by setting
48 * .type = NLA_NESTED in the appropriate policy.
49 *
50 * See also: nla_type()
51 */
52 enum {
53 GENLA_F_MANDATORY = 1 << 14,
54 GENLA_F_REQUIRED = 1 << 15,
55
56 /* Below will not be present in the __u16 .nla_type, but can be
57 * triggered on in <struct>_to_skb resp. <struct>_from_attrs */
58
59 /* To exclude "sensitive" information from broadcasts, or on
60 * unpriviledged get requests. This is useful because genetlink
61 * multicast groups can be listened in on by anyone. */
62 GENLA_F_SENSITIVE = 1 << 16,
63
64 /* INVARIAN options cannot be changed at runtime.
65 * Useful to share an attribute policy and struct definition,
66 * between some "create" and "change" commands,
67 * but disallow certain fields to be changed online.
68 */
69 GENLA_F_INVARIANT = 1 << 17,
70 };
71
72 #define __nla_type(x) ((__u16)((__u16)(x) & (__u16)NLA_TYPE_MASK))
73
74 /* }}}1
75 * MAGIC
76 * multi-include macro expansion magic starts here
77 */
78
79 /* MAGIC helpers {{{2 */
80
81 /* possible field types */
82 #define __flg_field(attr_nr, attr_flag, name) \
83 __field(attr_nr, attr_flag, name, NLA_U8, char, \
84 nla_get_u8, NLA_PUT_U8, false)
85 #define __u8_field(attr_nr, attr_flag, name) \
86 __field(attr_nr, attr_flag, name, NLA_U8, unsigned char, \
87 nla_get_u8, NLA_PUT_U8, false)
88 #define __u16_field(attr_nr, attr_flag, name) \
89 __field(attr_nr, attr_flag, name, NLA_U16, __u16, \
90 nla_get_u16, NLA_PUT_U16, false)
91 #define __u32_field(attr_nr, attr_flag, name) \
92 __field(attr_nr, attr_flag, name, NLA_U32, __u32, \
93 nla_get_u32, NLA_PUT_U32, false)
94 #define __s32_field(attr_nr, attr_flag, name) \
95 __field(attr_nr, attr_flag, name, NLA_U32, __s32, \
96 nla_get_u32, NLA_PUT_U32, true)
97 #define __u64_field(attr_nr, attr_flag, name) \
98 __field(attr_nr, attr_flag, name, NLA_U64, __u64, \
99 nla_get_u64, NLA_PUT_U64, false)
100 #define __str_field(attr_nr, attr_flag, name, maxlen) \
101 __array(attr_nr, attr_flag, name, NLA_NUL_STRING, char, maxlen, \
102 nla_strlcpy, NLA_PUT, false)
103 #define __bin_field(attr_nr, attr_flag, name, maxlen) \
104 __array(attr_nr, attr_flag, name, NLA_BINARY, char, maxlen, \
105 nla_memcpy, NLA_PUT, false)
106
107 /* fields with default values */
108 #define __flg_field_def(attr_nr, attr_flag, name, default) \
109 __flg_field(attr_nr, attr_flag, name)
110 #define __u32_field_def(attr_nr, attr_flag, name, default) \
111 __u32_field(attr_nr, attr_flag, name)
112 #define __s32_field_def(attr_nr, attr_flag, name, default) \
113 __s32_field(attr_nr, attr_flag, name)
114 #define __str_field_def(attr_nr, attr_flag, name, maxlen) \
115 __str_field(attr_nr, attr_flag, name, maxlen)
116
117 #define GENL_op_init(args...) args
118 #define GENL_doit(handler) \
119 .doit = handler, \
120 .flags = GENL_ADMIN_PERM,
121 #define GENL_dumpit(handler) \
122 .dumpit = handler, \
123 .flags = GENL_ADMIN_PERM,
124
125 /* }}}1
126 * Magic: define the enum symbols for genl_ops
127 * Magic: define the enum symbols for top level attributes
128 * Magic: define the enum symbols for nested attributes
129 * {{{2
130 */
131
132 #undef GENL_struct
133 #define GENL_struct(tag_name, tag_number, s_name, s_fields)
134
135 #undef GENL_mc_group
136 #define GENL_mc_group(group)
137
138 #undef GENL_notification
139 #define GENL_notification(op_name, op_num, mcast_group, tla_list) \
140 op_name = op_num,
141
142 #undef GENL_op
143 #define GENL_op(op_name, op_num, handler, tla_list) \
144 op_name = op_num,
145
146 enum {
147 #include GENL_MAGIC_INCLUDE_FILE
148 };
149
150 #undef GENL_notification
151 #define GENL_notification(op_name, op_num, mcast_group, tla_list)
152
153 #undef GENL_op
154 #define GENL_op(op_name, op_num, handler, attr_list)
155
156 #undef GENL_struct
157 #define GENL_struct(tag_name, tag_number, s_name, s_fields) \
158 tag_name = tag_number,
159
160 enum {
161 #include GENL_MAGIC_INCLUDE_FILE
162 };
163
164 #undef GENL_struct
165 #define GENL_struct(tag_name, tag_number, s_name, s_fields) \
166 enum { \
167 s_fields \
168 };
169
170 #undef __field
171 #define __field(attr_nr, attr_flag, name, nla_type, type, \
172 __get, __put, __is_signed) \
173 T_ ## name = (__u16)(attr_nr | attr_flag),
174
175 #undef __array
176 #define __array(attr_nr, attr_flag, name, nla_type, type, \
177 maxlen, __get, __put, __is_signed) \
178 T_ ## name = (__u16)(attr_nr | attr_flag),
179
180 #include GENL_MAGIC_INCLUDE_FILE
181
182 /* }}}1
183 * Magic: compile time assert unique numbers for operations
184 * Magic: -"- unique numbers for top level attributes
185 * Magic: -"- unique numbers for nested attributes
186 * {{{2
187 */
188
189 #undef GENL_struct
190 #define GENL_struct(tag_name, tag_number, s_name, s_fields)
191
192 #undef GENL_op
193 #define GENL_op(op_name, op_num, handler, attr_list) \
194 case op_name:
195
196 #undef GENL_notification
197 #define GENL_notification(op_name, op_num, mcast_group, tla_list) \
198 case op_name:
199
200 static inline void ct_assert_unique_operations(void)
201 {
202 switch (0) {
203 #include GENL_MAGIC_INCLUDE_FILE
204 ;
205 }
206 }
207
208 #undef GENL_op
209 #define GENL_op(op_name, op_num, handler, attr_list)
210
211 #undef GENL_notification
212 #define GENL_notification(op_name, op_num, mcast_group, tla_list)
213
214 #undef GENL_struct
215 #define GENL_struct(tag_name, tag_number, s_name, s_fields) \
216 case tag_number:
217
218 static inline void ct_assert_unique_top_level_attributes(void)
219 {
220 switch (0) {
221 #include GENL_MAGIC_INCLUDE_FILE
222 ;
223 }
224 }
225
226 #undef GENL_struct
227 #define GENL_struct(tag_name, tag_number, s_name, s_fields) \
228 static inline void ct_assert_unique_ ## s_name ## _attributes(void) \
229 { \
230 switch (0) { \
231 s_fields \
232 ; \
233 } \
234 }
235
236 #undef __field
237 #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put, \
238 __is_signed) \
239 case attr_nr:
240
241 #undef __array
242 #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, \
243 __get, __put, __is_signed) \
244 case attr_nr:
245
246 #include GENL_MAGIC_INCLUDE_FILE
247
248 /* }}}1
249 * Magic: declare structs
250 * struct <name> {
251 * fields
252 * };
253 * {{{2
254 */
255
256 #undef GENL_struct
257 #define GENL_struct(tag_name, tag_number, s_name, s_fields) \
258 struct s_name { s_fields };
259
260 #undef __field
261 #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put, \
262 __is_signed) \
263 type name;
264
265 #undef __array
266 #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, \
267 __get, __put, __is_signed) \
268 type name[maxlen]; \
269 __u32 name ## _len;
270
271 #include GENL_MAGIC_INCLUDE_FILE
272
273 #undef GENL_struct
274 #define GENL_struct(tag_name, tag_number, s_name, s_fields) \
275 enum { \
276 s_fields \
277 };
278
279 #undef __field
280 #define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put, \
281 is_signed) \
282 F_ ## name ## _IS_SIGNED = is_signed,
283
284 #undef __array
285 #define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, \
286 __get, __put, is_signed) \
287 F_ ## name ## _IS_SIGNED = is_signed,
288
289 #include GENL_MAGIC_INCLUDE_FILE
290
291 /* }}}1 */
292 #endif /* GENL_MAGIC_STRUCT_H */
293 /* vim: set foldmethod=marker nofoldenable : */