]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/linux/genl_magic_struct.h
drbd: Remove unused GENLA_F_MAY_IGNORE flag
[mirror_ubuntu-bionic-kernel.git] / include / linux / genl_magic_struct.h
CommitLineData
ec2c35ac
LE
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 * 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 *
ec2c35ac
LE
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 */
52enum {
ec2c35ac
LE
53 GENLA_F_MANDATORY = 1 << 14,
54 GENLA_F_REQUIRED = 1 << 15,
55
f399002e
LE
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. */
ec2c35ac 62 GENLA_F_SENSITIVE = 1 << 16,
f399002e
LE
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,
ec2c35ac
LE
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) \
a5d8e1fb 83 __field(attr_nr, attr_flag, name, NLA_U8, char, \
509100e6 84 nla_get_u8, NLA_PUT_U8, false)
ec2c35ac
LE
85#define __u8_field(attr_nr, attr_flag, name) \
86 __field(attr_nr, attr_flag, name, NLA_U8, unsigned char, \
509100e6 87 nla_get_u8, NLA_PUT_U8, false)
ec2c35ac
LE
88#define __u16_field(attr_nr, attr_flag, name) \
89 __field(attr_nr, attr_flag, name, NLA_U16, __u16, \
509100e6 90 nla_get_u16, NLA_PUT_U16, false)
ec2c35ac
LE
91#define __u32_field(attr_nr, attr_flag, name) \
92 __field(attr_nr, attr_flag, name, NLA_U32, __u32, \
509100e6 93 nla_get_u32, NLA_PUT_U32, false)
563e4cf2
LE
94#define __s32_field(attr_nr, attr_flag, name) \
95 __field(attr_nr, attr_flag, name, NLA_U32, __s32, \
509100e6 96 nla_get_u32, NLA_PUT_U32, true)
ec2c35ac
LE
97#define __u64_field(attr_nr, attr_flag, name) \
98 __field(attr_nr, attr_flag, name, NLA_U64, __u64, \
509100e6 99 nla_get_u64, NLA_PUT_U64, false)
ec2c35ac
LE
100#define __str_field(attr_nr, attr_flag, name, maxlen) \
101 __array(attr_nr, attr_flag, name, NLA_NUL_STRING, char, maxlen, \
509100e6 102 nla_strlcpy, NLA_PUT, false)
ec2c35ac
LE
103#define __bin_field(attr_nr, attr_flag, name, maxlen) \
104 __array(attr_nr, attr_flag, name, NLA_BINARY, char, maxlen, \
509100e6 105 nla_memcpy, NLA_PUT, false)
ec2c35ac 106
b966b5dd
AG
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)
3a45abd5
AG
112#define __s32_field_def(attr_nr, attr_flag, name, default) \
113 __s32_field(attr_nr, attr_flag, name)
b966b5dd
AG
114#define __str_field_def(attr_nr, attr_flag, name, maxlen) \
115 __str_field(attr_nr, attr_flag, name, maxlen)
116
ec2c35ac
LE
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
146enum {
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
160enum {
161#include GENL_MAGIC_INCLUDE_FILE
162};
163
164#undef GENL_struct
165#define GENL_struct(tag_name, tag_number, s_name, s_fields) \
166enum { \
167 s_fields \
168};
169
170#undef __field
509100e6
AG
171#define __field(attr_nr, attr_flag, name, nla_type, type, \
172 __get, __put, __is_signed) \
ec2c35ac
LE
173 T_ ## name = (__u16)(attr_nr | attr_flag),
174
175#undef __array
509100e6
AG
176#define __array(attr_nr, attr_flag, name, nla_type, type, \
177 maxlen, __get, __put, __is_signed) \
ec2c35ac
LE
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
200static 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
218static 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) \
228static inline void ct_assert_unique_ ## s_name ## _attributes(void) \
229{ \
230 switch (0) { \
231 s_fields \
232 ; \
233 } \
234}
235
236#undef __field
509100e6
AG
237#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put, \
238 __is_signed) \
ec2c35ac
LE
239 case attr_nr:
240
241#undef __array
509100e6
AG
242#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, \
243 __get, __put, __is_signed) \
ec2c35ac
LE
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) \
258struct s_name { s_fields };
259
260#undef __field
509100e6
AG
261#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put, \
262 __is_signed) \
ec2c35ac
LE
263 type name;
264
265#undef __array
509100e6
AG
266#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, \
267 __get, __put, __is_signed) \
ec2c35ac
LE
268 type name[maxlen]; \
269 __u32 name ## _len;
270
271#include GENL_MAGIC_INCLUDE_FILE
272
509100e6
AG
273#undef GENL_struct
274#define GENL_struct(tag_name, tag_number, s_name, s_fields) \
275enum { \
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
ec2c35ac
LE
291/* }}}1 */
292#endif /* GENL_MAGIC_STRUCT_H */
293/* vim: set foldmethod=marker nofoldenable : */