• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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