aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/lustre/lnet/selftest/rpc.h
blob: 465b5b534423d296a9624121e2dd49f5e1c5fe64 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
// SPDX-License-Identifier: GPL-2.0
/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License version 2 for more details (a copy is included
 * in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU General Public License
 * version 2 along with this program; If not, see
 * http://www.gnu.org/licenses/gpl-2.0.html
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 */

#ifndef __SELFTEST_RPC_H__
#define __SELFTEST_RPC_H__

#include <uapi/linux/lnet/lnetst.h>

/*
 * LST wired structures
 *
 * XXX: *REPLY == *REQST + 1
 */
enum srpc_msg_type {
	SRPC_MSG_MKSN_REQST	= 0,
	SRPC_MSG_MKSN_REPLY	= 1,
	SRPC_MSG_RMSN_REQST	= 2,
	SRPC_MSG_RMSN_REPLY	= 3,
	SRPC_MSG_BATCH_REQST	= 4,
	SRPC_MSG_BATCH_REPLY	= 5,
	SRPC_MSG_STAT_REQST	= 6,
	SRPC_MSG_STAT_REPLY	= 7,
	SRPC_MSG_TEST_REQST	= 8,
	SRPC_MSG_TEST_REPLY	= 9,
	SRPC_MSG_DEBUG_REQST	= 10,
	SRPC_MSG_DEBUG_REPLY	= 11,
	SRPC_MSG_BRW_REQST	= 12,
	SRPC_MSG_BRW_REPLY	= 13,
	SRPC_MSG_PING_REQST	= 14,
	SRPC_MSG_PING_REPLY	= 15,
	SRPC_MSG_JOIN_REQST	= 16,
	SRPC_MSG_JOIN_REPLY	= 17,
};

/* CAVEAT EMPTOR:
 * All srpc_*_reqst_t's 1st field must be matchbits of reply buffer,
 * and 2nd field matchbits of bulk buffer if any.
 *
 * All srpc_*_reply_t's 1st field must be a __u32 status, and 2nd field
 * session id if needed.
 */
struct srpc_generic_reqst {
	__u64			rpyid;		/* reply buffer matchbits */
	__u64			bulkid;		/* bulk buffer matchbits */
} WIRE_ATTR;

struct srpc_generic_reply {
	__u32			status;
	struct lst_sid		sid;
} WIRE_ATTR;

/* FRAMEWORK RPCs */
struct srpc_mksn_reqst {
	__u64			mksn_rpyid;	/* reply buffer matchbits */
	struct lst_sid		mksn_sid;	/* session id */
	__u32			mksn_force;	/* use brute force */
	char			mksn_name[LST_NAME_SIZE];
} WIRE_ATTR; /* make session request */

struct srpc_mksn_reply {
	__u32			mksn_status;	/* session status */
	struct lst_sid		mksn_sid;	/* session id */
	__u32			mksn_timeout;	/* session timeout */
	char			mksn_name[LST_NAME_SIZE];
} WIRE_ATTR; /* make session reply */

struct srpc_rmsn_reqst {
	__u64			rmsn_rpyid;	/* reply buffer matchbits */
	struct lst_sid		rmsn_sid;	/* session id */
} WIRE_ATTR; /* remove session request */

struct srpc_rmsn_reply {
	__u32			rmsn_status;
	struct lst_sid		rmsn_sid;	/* session id */
} WIRE_ATTR; /* remove session reply */

struct srpc_join_reqst {
	__u64			join_rpyid;	/* reply buffer matchbits */
	struct lst_sid		join_sid;	/* session id to join */
	char			join_group[LST_NAME_SIZE]; /* group name */
} WIRE_ATTR;

struct srpc_join_reply {
	__u32			join_status;	/* returned status */
	struct lst_sid		join_sid;	/* session id */
	__u32			join_timeout;	/* # seconds' inactivity to
						 * expire
						 */
	char			join_session[LST_NAME_SIZE]; /* session name */
} WIRE_ATTR;

struct srpc_debug_reqst {
	__u64			dbg_rpyid;	/* reply buffer matchbits */
	struct lst_sid		dbg_sid;	/* session id */
	__u32			dbg_flags;	/* bitmap of debug */
} WIRE_ATTR;

struct srpc_debug_reply {
	__u32			dbg_status;	/* returned code */
	struct lst_sid		dbg_sid;	/* session id */
	__u32			dbg_timeout;	/* session timeout */
	__u32			dbg_nbatch;	/* # of batches in the node */
	char			dbg_name[LST_NAME_SIZE]; /* session name */
} WIRE_ATTR;

#define SRPC_BATCH_OPC_RUN	1
#define SRPC_BATCH_OPC_STOP	2
#define SRPC_BATCH_OPC_QUERY	3

struct srpc_batch_reqst {
	__u64		   bar_rpyid;	   /* reply buffer matchbits */
	struct lst_sid	   bar_sid;	   /* session id */
	struct lst_bid	   bar_bid;	   /* batch id */
	__u32		   bar_opc;	   /* create/start/stop batch */
	__u32		   bar_testidx;    /* index of test */
	__u32		   bar_arg;	   /* parameters */
} WIRE_ATTR;

struct srpc_batch_reply {
	__u32		   bar_status;	   /* status of request */
	struct lst_sid	   bar_sid;	   /* session id */
	__u32		   bar_active;	   /* # of active tests in batch/test */
	__u32		   bar_time;	   /* remained time */
} WIRE_ATTR;

struct srpc_stat_reqst {
	__u64		   str_rpyid;	   /* reply buffer matchbits */
	struct lst_sid	   str_sid;	   /* session id */
	__u32		   str_type;	   /* type of stat */
} WIRE_ATTR;

struct srpc_stat_reply {
	__u32		   str_status;
	struct lst_sid	   str_sid;
	struct sfw_counters	str_fw;
	struct srpc_counters	str_rpc;
	struct lnet_counters    str_lnet;
} WIRE_ATTR;

struct test_bulk_req {
	__u32		   blk_opc;	   /* bulk operation code */
	__u32		   blk_npg;	   /* # of pages */
	__u32		   blk_flags;	   /* reserved flags */
} WIRE_ATTR;

struct test_bulk_req_v1 {
	__u16		   blk_opc;	   /* bulk operation code */
	__u16		   blk_flags;	   /* data check flags */
	__u32		   blk_len;	   /* data length */
	__u32		   blk_offset;	   /* offset */
} WIRE_ATTR;

struct test_ping_req {
	__u32		   png_size;	   /* size of ping message */
	__u32		   png_flags;	   /* reserved flags */
} WIRE_ATTR;

struct srpc_test_reqst {
	__u64			tsr_rpyid;	/* reply buffer matchbits */
	__u64			tsr_bulkid;	/* bulk buffer matchbits */
	struct lst_sid		tsr_sid;	/* session id */
	struct lst_bid		tsr_bid;	/* batch id */
	__u32			tsr_service;	/* test type: bulk|ping|... */
	__u32			tsr_loop;	/* test client loop count or
						 * # server buffers needed
						 */
	__u32			tsr_concur;	/* concurrency of test */
	__u8			tsr_is_client;	/* is test client or not */
	__u8			tsr_stop_onerr; /* stop on error */
	__u32			tsr_ndest;	/* # of dest nodes */

	union {
		struct test_ping_req	ping;
		struct test_bulk_req	bulk_v0;
		struct test_bulk_req_v1	bulk_v1;
	} tsr_u;
} WIRE_ATTR;

struct srpc_test_reply {
	__u32			tsr_status;	/* returned code */
	struct lst_sid		tsr_sid;
} WIRE_ATTR;

/* TEST RPCs */
struct srpc_ping_reqst {
	__u64		   pnr_rpyid;
	__u32		   pnr_magic;
	__u32		   pnr_seq;
	__u64		   pnr_time_sec;
	__u64		   pnr_time_usec;
} WIRE_ATTR;

struct srpc_ping_reply {
	__u32		   pnr_status;
	__u32		   pnr_magic;
	__u32		   pnr_seq;
} WIRE_ATTR;

struct srpc_brw_reqst {
	__u64		   brw_rpyid;	   /* reply buffer matchbits */
	__u64		   brw_bulkid;	   /* bulk buffer matchbits */
	__u32		   brw_rw;	   /* read or write */
	__u32		   brw_len;	   /* bulk data len */
	__u32		   brw_flags;	   /* bulk data patterns */
} WIRE_ATTR; /* bulk r/w request */

struct srpc_brw_reply {
	__u32		   brw_status;
} WIRE_ATTR; /* bulk r/w reply */

#define SRPC_MSG_MAGIC		0xeeb0f00d
#define SRPC_MSG_VERSION	1

struct srpc_msg {
	__u32	msg_magic;     /* magic number */
	__u32	msg_version;   /* message version number */
	__u32	msg_type;      /* type of message body: srpc_msg_type */
	__u32	msg_reserved0;
	__u32	msg_reserved1;
	__u32	msg_ses_feats; /* test session features */
	union {
		struct srpc_generic_reqst	reqst;
		struct srpc_generic_reply	reply;

		struct srpc_mksn_reqst		mksn_reqst;
		struct srpc_mksn_reply		mksn_reply;
		struct srpc_rmsn_reqst		rmsn_reqst;
		struct srpc_rmsn_reply		rmsn_reply;
		struct srpc_debug_reqst		dbg_reqst;
		struct srpc_debug_reply		dbg_reply;
		struct srpc_batch_reqst		bat_reqst;
		struct srpc_batch_reply		bat_reply;
		struct srpc_stat_reqst		stat_reqst;
		struct srpc_stat_reply		stat_reply;
		struct srpc_test_reqst		tes_reqst;
		struct srpc_test_reply		tes_reply;
		struct srpc_join_reqst		join_reqst;
		struct srpc_join_reply		join_reply;

		struct srpc_ping_reqst		ping_reqst;
		struct srpc_ping_reply		ping_reply;
		struct srpc_brw_reqst		brw_reqst;
		struct srpc_brw_reply		brw_reply;
	}     msg_body;
} WIRE_ATTR;

static inline void
srpc_unpack_msg_hdr(struct srpc_msg *msg)
{
	if (msg->msg_magic == SRPC_MSG_MAGIC)
		return; /* no flipping needed */

	/*
	 * We do not swap the magic number here as it is needed to
	 * determine whether the body needs to be swapped.
	 */
	/* __swab32s(&msg->msg_magic); */
	__swab32s(&msg->msg_type);
	__swab32s(&msg->msg_version);
	__swab32s(&msg->msg_ses_feats);
	__swab32s(&msg->msg_reserved0);
	__swab32s(&msg->msg_reserved1);
}

#endif /* __SELFTEST_RPC_H__ */