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