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