1 /*
2 * GPL HEADER START
3 *
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19 *
20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
22 * have any questions.
23 *
24 * GPL HEADER END
25 */
26 /*
27 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
29 *
30 * Copyright (c) 2012, Intel Corporation.
31 */
32 /*
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
35 */
36
37 #ifndef __SELFTEST_RPC_H__
38 #define __SELFTEST_RPC_H__
39
40 #include "../../include/linux/lnet/lnetst.h"
41
42 /*
43 * LST wired structures
44 *
45 * XXX: *REPLY == *REQST + 1
46 */
47 typedef enum {
48 SRPC_MSG_MKSN_REQST = 0,
49 SRPC_MSG_MKSN_REPLY = 1,
50 SRPC_MSG_RMSN_REQST = 2,
51 SRPC_MSG_RMSN_REPLY = 3,
52 SRPC_MSG_BATCH_REQST = 4,
53 SRPC_MSG_BATCH_REPLY = 5,
54 SRPC_MSG_STAT_REQST = 6,
55 SRPC_MSG_STAT_REPLY = 7,
56 SRPC_MSG_TEST_REQST = 8,
57 SRPC_MSG_TEST_REPLY = 9,
58 SRPC_MSG_DEBUG_REQST = 10,
59 SRPC_MSG_DEBUG_REPLY = 11,
60 SRPC_MSG_BRW_REQST = 12,
61 SRPC_MSG_BRW_REPLY = 13,
62 SRPC_MSG_PING_REQST = 14,
63 SRPC_MSG_PING_REPLY = 15,
64 SRPC_MSG_JOIN_REQST = 16,
65 SRPC_MSG_JOIN_REPLY = 17,
66 } srpc_msg_type_t;
67
68
69 /* CAVEAT EMPTOR:
70 * All srpc_*_reqst_t's 1st field must be matchbits of reply buffer,
71 * and 2nd field matchbits of bulk buffer if any.
72 *
73 * All srpc_*_reply_t's 1st field must be a __u32 status, and 2nd field
74 * session id if needed.
75 */
76 typedef struct {
77 __u64 rpyid; /* reply buffer matchbits */
78 __u64 bulkid; /* bulk buffer matchbits */
79 } WIRE_ATTR srpc_generic_reqst_t;
80
81 typedef struct {
82 __u32 status;
83 lst_sid_t sid;
84 } WIRE_ATTR srpc_generic_reply_t;
85
86 /* FRAMEWORK RPCs */
87 typedef struct {
88 __u64 mksn_rpyid; /* reply buffer matchbits */
89 lst_sid_t mksn_sid; /* session id */
90 __u32 mksn_force; /* use brute force */
91 char mksn_name[LST_NAME_SIZE];
92 } WIRE_ATTR srpc_mksn_reqst_t; /* make session request */
93
94 typedef struct {
95 __u32 mksn_status; /* session status */
96 lst_sid_t mksn_sid; /* session id */
97 __u32 mksn_timeout; /* session timeout */
98 char mksn_name[LST_NAME_SIZE];
99 } WIRE_ATTR srpc_mksn_reply_t; /* make session reply */
100
101 typedef struct {
102 __u64 rmsn_rpyid; /* reply buffer matchbits */
103 lst_sid_t rmsn_sid; /* session id */
104 } WIRE_ATTR srpc_rmsn_reqst_t; /* remove session request */
105
106 typedef struct {
107 __u32 rmsn_status;
108 lst_sid_t rmsn_sid; /* session id */
109 } WIRE_ATTR srpc_rmsn_reply_t; /* remove session reply */
110
111 typedef struct {
112 __u64 join_rpyid; /* reply buffer matchbits */
113 lst_sid_t join_sid; /* session id to join */
114 char join_group[LST_NAME_SIZE]; /* group name */
115 } WIRE_ATTR srpc_join_reqst_t;
116
117 typedef struct {
118 __u32 join_status; /* returned status */
119 lst_sid_t join_sid; /* session id */
120 __u32 join_timeout; /* # seconds' inactivity to expire */
121 char join_session[LST_NAME_SIZE]; /* session name */
122 } WIRE_ATTR srpc_join_reply_t;
123
124 typedef struct {
125 __u64 dbg_rpyid; /* reply buffer matchbits */
126 lst_sid_t dbg_sid; /* session id */
127 __u32 dbg_flags; /* bitmap of debug */
128 } WIRE_ATTR srpc_debug_reqst_t;
129
130 typedef struct {
131 __u32 dbg_status; /* returned code */
132 lst_sid_t dbg_sid; /* session id */
133 __u32 dbg_timeout; /* session timeout */
134 __u32 dbg_nbatch; /* # of batches in the node */
135 char dbg_name[LST_NAME_SIZE]; /* session name */
136 } WIRE_ATTR srpc_debug_reply_t;
137
138 #define SRPC_BATCH_OPC_RUN 1
139 #define SRPC_BATCH_OPC_STOP 2
140 #define SRPC_BATCH_OPC_QUERY 3
141
142 typedef struct {
143 __u64 bar_rpyid; /* reply buffer matchbits */
144 lst_sid_t bar_sid; /* session id */
145 lst_bid_t bar_bid; /* batch id */
146 __u32 bar_opc; /* create/start/stop batch */
147 __u32 bar_testidx; /* index of test */
148 __u32 bar_arg; /* parameters */
149 } WIRE_ATTR srpc_batch_reqst_t;
150
151 typedef struct {
152 __u32 bar_status; /* status of request */
153 lst_sid_t bar_sid; /* session id */
154 __u32 bar_active; /* # of active tests in batch/test */
155 __u32 bar_time; /* remained time */
156 } WIRE_ATTR srpc_batch_reply_t;
157
158 typedef struct {
159 __u64 str_rpyid; /* reply buffer matchbits */
160 lst_sid_t str_sid; /* session id */
161 __u32 str_type; /* type of stat */
162 } WIRE_ATTR srpc_stat_reqst_t;
163
164 typedef struct {
165 __u32 str_status;
166 lst_sid_t str_sid;
167 sfw_counters_t str_fw;
168 srpc_counters_t str_rpc;
169 lnet_counters_t str_lnet;
170 } WIRE_ATTR srpc_stat_reply_t;
171
172 typedef struct {
173 __u32 blk_opc; /* bulk operation code */
174 __u32 blk_npg; /* # of pages */
175 __u32 blk_flags; /* reserved flags */
176 } WIRE_ATTR test_bulk_req_t;
177
178 typedef struct {
179 /** bulk operation code */
180 __u16 blk_opc;
181 /** data check flags */
182 __u16 blk_flags;
183 /** data length */
184 __u32 blk_len;
185 /** reserved: offset */
186 __u32 blk_offset;
187 } WIRE_ATTR test_bulk_req_v1_t;
188
189 typedef struct {
190 __u32 png_size; /* size of ping message */
191 __u32 png_flags; /* reserved flags */
192 } WIRE_ATTR test_ping_req_t;
193
194 typedef struct {
195 __u64 tsr_rpyid; /* reply buffer matchbits */
196 __u64 tsr_bulkid; /* bulk buffer matchbits */
197 lst_sid_t tsr_sid; /* session id */
198 lst_bid_t tsr_bid; /* batch id */
199 __u32 tsr_service; /* test type: bulk|ping|... */
200 /* test client loop count or # server buffers needed */
201 __u32 tsr_loop;
202 __u32 tsr_concur; /* concurrency of test */
203 __u8 tsr_is_client; /* is test client or not */
204 __u8 tsr_stop_onerr; /* stop on error */
205 __u32 tsr_ndest; /* # of dest nodes */
206
207 union {
208 test_ping_req_t ping;
209 test_bulk_req_t bulk_v0;
210 test_bulk_req_v1_t bulk_v1;
211 } tsr_u;
212 } WIRE_ATTR srpc_test_reqst_t;
213
214 typedef struct {
215 __u32 tsr_status; /* returned code */
216 lst_sid_t tsr_sid;
217 } WIRE_ATTR srpc_test_reply_t;
218
219 /* TEST RPCs */
220 typedef struct {
221 __u64 pnr_rpyid;
222 __u32 pnr_magic;
223 __u32 pnr_seq;
224 __u64 pnr_time_sec;
225 __u64 pnr_time_usec;
226 } WIRE_ATTR srpc_ping_reqst_t;
227
228 typedef struct {
229 __u32 pnr_status;
230 __u32 pnr_magic;
231 __u32 pnr_seq;
232 } WIRE_ATTR srpc_ping_reply_t;
233
234 typedef struct {
235 __u64 brw_rpyid; /* reply buffer matchbits */
236 __u64 brw_bulkid; /* bulk buffer matchbits */
237 __u32 brw_rw; /* read or write */
238 __u32 brw_len; /* bulk data len */
239 __u32 brw_flags; /* bulk data patterns */
240 } WIRE_ATTR srpc_brw_reqst_t; /* bulk r/w request */
241
242 typedef struct {
243 __u32 brw_status;
244 } WIRE_ATTR srpc_brw_reply_t; /* bulk r/w reply */
245
246 #define SRPC_MSG_MAGIC 0xeeb0f00d
247 #define SRPC_MSG_VERSION 1
248
249 typedef struct srpc_msg {
250 /** magic number */
251 __u32 msg_magic;
252 /** message version number */
253 __u32 msg_version;
254 /** type of message body: srpc_msg_type_t */
255 __u32 msg_type;
256 __u32 msg_reserved0;
257 __u32 msg_reserved1;
258 /** test session features */
259 __u32 msg_ses_feats;
260 union {
261 srpc_generic_reqst_t reqst;
262 srpc_generic_reply_t reply;
263
264 srpc_mksn_reqst_t mksn_reqst;
265 srpc_mksn_reply_t mksn_reply;
266 srpc_rmsn_reqst_t rmsn_reqst;
267 srpc_rmsn_reply_t rmsn_reply;
268 srpc_debug_reqst_t dbg_reqst;
269 srpc_debug_reply_t dbg_reply;
270 srpc_batch_reqst_t bat_reqst;
271 srpc_batch_reply_t bat_reply;
272 srpc_stat_reqst_t stat_reqst;
273 srpc_stat_reply_t stat_reply;
274 srpc_test_reqst_t tes_reqst;
275 srpc_test_reply_t tes_reply;
276 srpc_join_reqst_t join_reqst;
277 srpc_join_reply_t join_reply;
278
279 srpc_ping_reqst_t ping_reqst;
280 srpc_ping_reply_t ping_reply;
281 srpc_brw_reqst_t brw_reqst;
282 srpc_brw_reply_t brw_reply;
283 } msg_body;
284 } WIRE_ATTR srpc_msg_t;
285
286 static inline void
srpc_unpack_msg_hdr(srpc_msg_t * msg)287 srpc_unpack_msg_hdr(srpc_msg_t *msg)
288 {
289 if (msg->msg_magic == SRPC_MSG_MAGIC)
290 return; /* no flipping needed */
291
292 /* We do not swap the magic number here as it is needed to
293 determine whether the body needs to be swapped. */
294 /* __swab32s(&msg->msg_magic); */
295 __swab32s(&msg->msg_type);
296 __swab32s(&msg->msg_version);
297 __swab32s(&msg->msg_ses_feats);
298 __swab32s(&msg->msg_reserved0);
299 __swab32s(&msg->msg_reserved1);
300 }
301
302 #endif /* __SELFTEST_RPC_H__ */
303