drbd: Introduce protocol version 100 headers
[firefly-linux-kernel-4.4.55.git] / include / linux / drbd_genl.h
1 /*
2  * General overview:
3  * full generic netlink message:
4  * |nlmsghdr|genlmsghdr|<payload>
5  *
6  * payload:
7  * |optional fixed size family header|<sequence of netlink attributes>
8  *
9  * sequence of netlink attributes:
10  * I chose to have all "top level" attributes NLA_NESTED,
11  * corresponding to some real struct.
12  * So we have a sequence of |tla, len|<nested nla sequence>
13  *
14  * nested nla sequence:
15  * may be empty, or contain a sequence of netlink attributes
16  * representing the struct fields.
17  *
18  * The tag number of any field (regardless of containing struct)
19  * will be available as T_ ## field_name,
20  * so you cannot have the same field name in two differnt structs.
21  *
22  * The tag numbers themselves are per struct, though,
23  * so should always begin at 1 (not 0, that is the special "NLA_UNSPEC" type,
24  * which we won't use here).
25  * The tag numbers are used as index in the respective nla_policy array.
26  *
27  * GENL_struct(tag_name, tag_number, struct name, struct fields) - struct and policy
28  *      genl_magic_struct.h
29  *              generates the struct declaration,
30  *              generates an entry in the tla enum,
31  *      genl_magic_func.h
32  *              generates an entry in the static tla policy
33  *              with .type = NLA_NESTED
34  *              generates the static <struct_name>_nl_policy definition,
35  *              and static conversion functions
36  *
37  *      genl_magic_func.h
38  *
39  * GENL_mc_group(group)
40  *      genl_magic_struct.h
41  *              does nothing
42  *      genl_magic_func.h
43  *              defines and registers the mcast group,
44  *              and provides a send helper
45  *
46  * GENL_notification(op_name, op_num, mcast_group, tla list)
47  *      These are notifications to userspace.
48  *
49  *      genl_magic_struct.h
50  *              generates an entry in the genl_ops enum,
51  *      genl_magic_func.h
52  *              does nothing
53  *
54  *      mcast group: the name of the mcast group this notification should be
55  *      expected on
56  *      tla list: the list of expected top level attributes,
57  *      for documentation and sanity checking.
58  *
59  * GENL_op(op_name, op_num, flags and handler, tla list) - "genl operations"
60  *      These are requests from userspace.
61  *
62  *      _op and _notification share the same "number space",
63  *      op_nr will be assigned to "genlmsghdr->cmd"
64  *
65  *      genl_magic_struct.h
66  *              generates an entry in the genl_ops enum,
67  *      genl_magic_func.h
68  *              generates an entry in the static genl_ops array,
69  *              and static register/unregister functions to
70  *              genl_register_family_with_ops().
71  *
72  *      flags and handler:
73  *              GENL_op_init( .doit = x, .dumpit = y, .flags = something)
74  *              GENL_doit(x) => .dumpit = NULL, .flags = GENL_ADMIN_PERM
75  *      tla list: the list of expected top level attributes,
76  *      for documentation and sanity checking.
77  */
78
79 /*
80  * STRUCTS
81  */
82
83 /* this is sent kernel -> userland on various error conditions, and contains
84  * informational textual info, which is supposedly human readable.
85  * The computer relevant return code is in the drbd_genlmsghdr.
86  */
87 GENL_struct(DRBD_NLA_CFG_REPLY, 1, drbd_cfg_reply,
88                 /* "arbitrary" size strings, nla_policy.len = 0 */
89         __str_field(1, GENLA_F_MANDATORY,       info_text, 0)
90 )
91
92 /* Configuration requests typically need a context to operate on.
93  * Possible keys are device minor (fits in the drbd_genlmsghdr),
94  * the replication link (aka connection) name,
95  * and/or the replication group (aka resource) name,
96  * and the volume id within the resource. */
97 GENL_struct(DRBD_NLA_CFG_CONTEXT, 2, drbd_cfg_context,
98         __u32_field(1, GENLA_F_MANDATORY,       ctx_volume)
99         __str_field(2, GENLA_F_MANDATORY,       ctx_conn_name, 128)
100 )
101
102 GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
103         __str_field(1, GENLA_F_REQUIRED | GENLA_F_INVARIANT,    backing_dev,    128)
104         __str_field(2, GENLA_F_REQUIRED | GENLA_F_INVARIANT,    meta_dev,       128)
105         __u32_field(3, GENLA_F_REQUIRED | GENLA_F_INVARIANT,    meta_dev_idx)
106
107         /* use the resize command to try and change the disk_size */
108         __u64_field(4, GENLA_F_MANDATORY | GENLA_F_INVARIANT,   disk_size)
109         /* we could change the max_bio_bvecs,
110          * but it won't propagate through the stack */
111         __u32_field(5, GENLA_F_MANDATORY | GENLA_F_INVARIANT,   max_bio_bvecs)
112
113         __u32_field(6, GENLA_F_MANDATORY,       on_io_error)
114         __u32_field(7, GENLA_F_MANDATORY,       fencing)
115
116         __u32_field(8,  GENLA_F_MANDATORY,      resync_rate)
117         __u32_field(9,  GENLA_F_MANDATORY,      resync_after)
118         __u32_field(10, GENLA_F_MANDATORY,      al_extents)
119         __u32_field(11, GENLA_F_MANDATORY,      c_plan_ahead)
120         __u32_field(12, GENLA_F_MANDATORY,      c_delay_target)
121         __u32_field(13, GENLA_F_MANDATORY,      c_fill_target)
122         __u32_field(14, GENLA_F_MANDATORY,      c_max_rate)
123         __u32_field(15, GENLA_F_MANDATORY,      c_min_rate)
124
125         __flg_field(16, GENLA_F_MANDATORY,      no_disk_barrier)
126         __flg_field(17, GENLA_F_MANDATORY,      no_disk_flush)
127         __flg_field(18, GENLA_F_MANDATORY,      no_disk_drain)
128         __flg_field(19, GENLA_F_MANDATORY,      no_md_flush)
129
130 )
131
132 GENL_struct(DRBD_NLA_RESOURCE_OPTS, 4, res_opts,
133         __str_field(1,  GENLA_F_MANDATORY,      cpu_mask,       32)
134         __u32_field(2,  GENLA_F_MANDATORY,      on_no_data)
135 )
136
137 GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf,
138         __bin_field(1,  GENLA_F_REQUIRED | GENLA_F_INVARIANT,   my_addr,        128)
139         __bin_field(2,  GENLA_F_REQUIRED | GENLA_F_INVARIANT,   peer_addr,      128)
140         __str_field(3,  GENLA_F_MANDATORY | GENLA_F_SENSITIVE,
141                                                 shared_secret,  SHARED_SECRET_MAX)
142         __str_field(4,  GENLA_F_MANDATORY,      cram_hmac_alg,  SHARED_SECRET_MAX)
143         __str_field(5,  GENLA_F_MANDATORY,      integrity_alg,  SHARED_SECRET_MAX)
144         __str_field(6,  GENLA_F_MANDATORY,      verify_alg,     SHARED_SECRET_MAX)
145         __str_field(7,  GENLA_F_MANDATORY,      csums_alg,      SHARED_SECRET_MAX)
146         __u32_field(8,  GENLA_F_MANDATORY,      wire_protocol)
147         __u32_field(9,  GENLA_F_MANDATORY,      try_connect_int)
148         __u32_field(10, GENLA_F_MANDATORY,      timeout)
149         __u32_field(11, GENLA_F_MANDATORY,      ping_int)
150         __u32_field(12, GENLA_F_MANDATORY,      ping_timeo)
151         __u32_field(13, GENLA_F_MANDATORY,      sndbuf_size)
152         __u32_field(14, GENLA_F_MANDATORY,      rcvbuf_size)
153         __u32_field(15, GENLA_F_MANDATORY,      ko_count)
154         __u32_field(16, GENLA_F_MANDATORY,      max_buffers)
155         __u32_field(17, GENLA_F_MANDATORY,      max_epoch_size)
156         __u32_field(18, GENLA_F_MANDATORY,      unplug_watermark)
157         __u32_field(19, GENLA_F_MANDATORY,      after_sb_0p)
158         __u32_field(20, GENLA_F_MANDATORY,      after_sb_1p)
159         __u32_field(21, GENLA_F_MANDATORY,      after_sb_2p)
160         __u32_field(22, GENLA_F_MANDATORY,      rr_conflict)
161         __u32_field(23, GENLA_F_MANDATORY,      on_congestion)
162         __u32_field(24, GENLA_F_MANDATORY,      cong_fill)
163         __u32_field(25, GENLA_F_MANDATORY,      cong_extents)
164         __flg_field(26, GENLA_F_MANDATORY,      two_primaries)
165         __flg_field(27, GENLA_F_MANDATORY | GENLA_F_INVARIANT,  want_lose)
166         __flg_field(28, GENLA_F_MANDATORY,      no_cork)
167         __flg_field(29, GENLA_F_MANDATORY,      always_asbp)
168         __flg_field(30, GENLA_F_MANDATORY | GENLA_F_INVARIANT,  dry_run)
169         __flg_field(31, GENLA_F_MANDATORY,      use_rle)
170 )
171
172 GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms,
173         __flg_field(1, GENLA_F_MANDATORY,       assume_uptodate)
174 )
175
176 GENL_struct(DRBD_NLA_RESIZE_PARMS, 7, resize_parms,
177         __u64_field(1, GENLA_F_MANDATORY,       resize_size)
178         __flg_field(2, GENLA_F_MANDATORY,       resize_force)
179         __flg_field(3, GENLA_F_MANDATORY,       no_resync)
180 )
181
182 GENL_struct(DRBD_NLA_STATE_INFO, 8, state_info,
183         /* the reason of the broadcast,
184          * if this is an event triggered broadcast. */
185         __u32_field(1, GENLA_F_MANDATORY,       sib_reason)
186         __u32_field(2, GENLA_F_REQUIRED,        current_state)
187         __u64_field(3, GENLA_F_MANDATORY,       capacity)
188         __u64_field(4, GENLA_F_MANDATORY,       ed_uuid)
189
190         /* These are for broadcast from after state change work.
191          * prev_state and new_state are from the moment the state change took
192          * place, new_state is not neccessarily the same as current_state,
193          * there may have been more state changes since.  Which will be
194          * broadcasted soon, in their respective after state change work.  */
195         __u32_field(5, GENLA_F_MANDATORY,       prev_state)
196         __u32_field(6, GENLA_F_MANDATORY,       new_state)
197
198         /* if we have a local disk: */
199         __bin_field(7, GENLA_F_MANDATORY,       uuids, (UI_SIZE*sizeof(__u64)))
200         __u32_field(8, GENLA_F_MANDATORY,       disk_flags)
201         __u64_field(9, GENLA_F_MANDATORY,       bits_total)
202         __u64_field(10, GENLA_F_MANDATORY,      bits_oos)
203         /* and in case resync or online verify is active */
204         __u64_field(11, GENLA_F_MANDATORY,      bits_rs_total)
205         __u64_field(12, GENLA_F_MANDATORY,      bits_rs_failed)
206
207         /* for pre and post notifications of helper execution */
208         __str_field(13, GENLA_F_MANDATORY,      helper, 32)
209         __u32_field(14, GENLA_F_MANDATORY,      helper_exit_code)
210 )
211
212 GENL_struct(DRBD_NLA_START_OV_PARMS, 9, start_ov_parms,
213         __u64_field(1, GENLA_F_MANDATORY,       ov_start_sector)
214 )
215
216 GENL_struct(DRBD_NLA_NEW_C_UUID_PARMS, 10, new_c_uuid_parms,
217         __flg_field(1, GENLA_F_MANDATORY, clear_bm)
218 )
219
220 GENL_struct(DRBD_NLA_TIMEOUT_PARMS, 11, timeout_parms,
221         __u32_field(1,  GENLA_F_REQUIRED,       timeout_type)
222 )
223
224 GENL_struct(DRBD_NLA_DISCONNECT_PARMS, 12, disconnect_parms,
225         __flg_field(1, GENLA_F_MANDATORY,       force_disconnect)
226 )
227
228 /*
229  * Notifications and commands (genlmsghdr->cmd)
230  */
231 GENL_mc_group(events)
232
233         /* kernel -> userspace announcement of changes */
234 GENL_notification(
235         DRBD_EVENT, 1, events,
236         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
237         GENL_tla_expected(DRBD_NLA_STATE_INFO, GENLA_F_REQUIRED)
238         GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_MANDATORY)
239         GENL_tla_expected(DRBD_NLA_DISK_CONF, GENLA_F_MANDATORY)
240         GENL_tla_expected(DRBD_NLA_SYNCER_CONF, GENLA_F_MANDATORY)
241 )
242
243         /* query kernel for specific or all info */
244 GENL_op(
245         DRBD_ADM_GET_STATUS, 2,
246         GENL_op_init(
247                 .doit = drbd_adm_get_status,
248                 .dumpit = drbd_adm_get_status_all,
249                 /* anyone may ask for the status,
250                  * it is broadcasted anyways */
251         ),
252         /* To select the object .doit.
253          * Or a subset of objects in .dumpit. */
254         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_MANDATORY)
255 )
256
257 #if 0
258         /* TO BE DONE */
259         /* create or destroy resources, aka replication groups */
260 GENL_op(DRBD_ADM_CREATE_RESOURCE, 3, GENL_doit(drbd_adm_create_resource),
261         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
262 GENL_op(DRBD_ADM_DELETE_RESOURCE, 4, GENL_doit(drbd_adm_delete_resource),
263         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
264 #endif
265
266         /* add DRBD minor devices as volumes to resources */
267 GENL_op(DRBD_ADM_ADD_MINOR, 5, GENL_doit(drbd_adm_add_minor),
268         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
269 GENL_op(DRBD_ADM_DEL_MINOR, 6, GENL_doit(drbd_adm_delete_minor),
270         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
271
272         /* add or delete replication links to resources */
273 GENL_op(DRBD_ADM_ADD_LINK, 7, GENL_doit(drbd_adm_create_connection),
274         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
275 GENL_op(DRBD_ADM_DEL_LINK, 8, GENL_doit(drbd_adm_delete_connection),
276         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
277
278 GENL_op(DRBD_ADM_RESOURCE_OPTS, 9,
279         GENL_doit(drbd_adm_resource_opts),
280         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
281         GENL_tla_expected(DRBD_NLA_RESOURCE_OPTS, GENLA_F_MANDATORY)
282 )
283
284 GENL_op(
285         DRBD_ADM_CONNECT, 10,
286         GENL_doit(drbd_adm_connect),
287         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
288         GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_REQUIRED)
289 )
290
291 GENL_op(
292         DRBD_ADM_CHG_NET_OPTS, 29,
293         GENL_doit(drbd_adm_net_opts),
294         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
295         GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_REQUIRED)
296 )
297
298 GENL_op(DRBD_ADM_DISCONNECT, 11, GENL_doit(drbd_adm_disconnect),
299         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
300
301 GENL_op(DRBD_ADM_ATTACH, 12,
302         GENL_doit(drbd_adm_attach),
303         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
304         GENL_tla_expected(DRBD_NLA_DISK_CONF, GENLA_F_REQUIRED)
305 )
306
307 GENL_op(DRBD_ADM_CHG_DISK_OPTS, 28,
308         GENL_doit(drbd_adm_disk_opts),
309         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
310         GENL_tla_expected(DRBD_NLA_DISK_OPTS, GENLA_F_REQUIRED)
311 )
312
313 GENL_op(
314         DRBD_ADM_RESIZE, 13,
315         GENL_doit(drbd_adm_resize),
316         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
317         GENL_tla_expected(DRBD_NLA_RESIZE_PARMS, GENLA_F_MANDATORY)
318 )
319
320 GENL_op(
321         DRBD_ADM_PRIMARY, 14,
322         GENL_doit(drbd_adm_set_role),
323         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
324         GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, GENLA_F_REQUIRED)
325 )
326
327 GENL_op(
328         DRBD_ADM_SECONDARY, 15,
329         GENL_doit(drbd_adm_set_role),
330         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
331         GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, GENLA_F_REQUIRED)
332 )
333
334 GENL_op(
335         DRBD_ADM_NEW_C_UUID, 16,
336         GENL_doit(drbd_adm_new_c_uuid),
337         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
338         GENL_tla_expected(DRBD_NLA_NEW_C_UUID_PARMS, GENLA_F_MANDATORY)
339 )
340
341 GENL_op(
342         DRBD_ADM_START_OV, 17,
343         GENL_doit(drbd_adm_start_ov),
344         GENL_tla_expected(DRBD_NLA_START_OV_PARMS, GENLA_F_MANDATORY)
345 )
346
347 GENL_op(DRBD_ADM_DETACH,        18, GENL_doit(drbd_adm_detach),
348         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
349 GENL_op(DRBD_ADM_INVALIDATE,    19, GENL_doit(drbd_adm_invalidate),
350         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
351 GENL_op(DRBD_ADM_INVAL_PEER,    20, GENL_doit(drbd_adm_invalidate_peer),
352         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
353 GENL_op(DRBD_ADM_PAUSE_SYNC,    21, GENL_doit(drbd_adm_pause_sync),
354         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
355 GENL_op(DRBD_ADM_RESUME_SYNC,   22, GENL_doit(drbd_adm_resume_sync),
356         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
357 GENL_op(DRBD_ADM_SUSPEND_IO,    23, GENL_doit(drbd_adm_suspend_io),
358         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
359 GENL_op(DRBD_ADM_RESUME_IO,     24, GENL_doit(drbd_adm_resume_io),
360         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
361 GENL_op(DRBD_ADM_OUTDATE,       25, GENL_doit(drbd_adm_outdate),
362         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
363 GENL_op(DRBD_ADM_GET_TIMEOUT_TYPE, 26, GENL_doit(drbd_adm_get_timeout_type),
364         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
365 GENL_op(DRBD_ADM_DOWN,          27, GENL_doit(drbd_adm_down),
366         GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))