1/*
2 * linux/fs/9p/9p.h
3 *
4 * 9P protocol definitions.
5 *
6 *  Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net>
7 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
8 *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
9 *
10 *  This program is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 2
12 *  as published by the Free Software Foundation.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program; if not, write to:
21 *  Free Software Foundation
22 *  51 Franklin Street, Fifth Floor
23 *  Boston, MA  02111-1301  USA
24 *
25 */
26
27/* Message Types */
28enum {
29	TVERSION = 100,
30	RVERSION,
31	TAUTH = 102,
32	RAUTH,
33	TATTACH = 104,
34	RATTACH,
35	TERROR = 106,
36	RERROR,
37	TFLUSH = 108,
38	RFLUSH,
39	TWALK = 110,
40	RWALK,
41	TOPEN = 112,
42	ROPEN,
43	TCREATE = 114,
44	RCREATE,
45	TREAD = 116,
46	RREAD,
47	TWRITE = 118,
48	RWRITE,
49	TCLUNK = 120,
50	RCLUNK,
51	TREMOVE = 122,
52	RREMOVE,
53	TSTAT = 124,
54	RSTAT,
55	TWSTAT = 126,
56	RWSTAT,
57};
58
59/* modes */
60enum {
61	V9FS_OREAD = 0x00,
62	V9FS_OWRITE = 0x01,
63	V9FS_ORDWR = 0x02,
64	V9FS_OEXEC = 0x03,
65	V9FS_OEXCL = 0x04,
66	V9FS_OTRUNC = 0x10,
67	V9FS_OREXEC = 0x20,
68	V9FS_ORCLOSE = 0x40,
69	V9FS_OAPPEND = 0x80,
70};
71
72/* permissions */
73enum {
74	V9FS_DMDIR = 0x80000000,
75	V9FS_DMAPPEND = 0x40000000,
76	V9FS_DMEXCL = 0x20000000,
77	V9FS_DMMOUNT = 0x10000000,
78	V9FS_DMAUTH = 0x08000000,
79	V9FS_DMTMP = 0x04000000,
80	V9FS_DMSYMLINK = 0x02000000,
81	V9FS_DMLINK = 0x01000000,
82	/* 9P2000.u extensions */
83	V9FS_DMDEVICE = 0x00800000,
84	V9FS_DMNAMEDPIPE = 0x00200000,
85	V9FS_DMSOCKET = 0x00100000,
86	V9FS_DMSETUID = 0x00080000,
87	V9FS_DMSETGID = 0x00040000,
88};
89
90/* qid.types */
91enum {
92	V9FS_QTDIR = 0x80,
93	V9FS_QTAPPEND = 0x40,
94	V9FS_QTEXCL = 0x20,
95	V9FS_QTMOUNT = 0x10,
96	V9FS_QTAUTH = 0x08,
97	V9FS_QTTMP = 0x04,
98	V9FS_QTSYMLINK = 0x02,
99	V9FS_QTLINK = 0x01,
100	V9FS_QTFILE = 0x00,
101};
102
103#define V9FS_NOTAG	(u16)(~0)
104#define V9FS_NOFID	(u32)(~0)
105#define V9FS_MAXWELEM	16
106
107/* ample room for Twrite/Rread header (iounit) */
108#define V9FS_IOHDRSZ	24
109
110struct v9fs_str {
111	u16 len;
112	char *str;
113};
114
115/* qids are the unique ID for a file (like an inode */
116struct v9fs_qid {
117	u8 type;
118	u32 version;
119	u64 path;
120};
121
122/* Plan 9 file metadata (stat) structure */
123struct v9fs_stat {
124	u16 size;
125	u16 type;
126	u32 dev;
127	struct v9fs_qid qid;
128	u32 mode;
129	u32 atime;
130	u32 mtime;
131	u64 length;
132	struct v9fs_str name;
133	struct v9fs_str uid;
134	struct v9fs_str gid;
135	struct v9fs_str muid;
136	struct v9fs_str extension;	/* 9p2000.u extensions */
137	u32 n_uid;		/* 9p2000.u extensions */
138	u32 n_gid;		/* 9p2000.u extensions */
139	u32 n_muid;		/* 9p2000.u extensions */
140};
141
142/* file metadata (stat) structure used to create Twstat message
143   The is similar to v9fs_stat, but the strings don't point to
144   the same memory block and should be freed separately
145*/
146struct v9fs_wstat {
147	u16 size;
148	u16 type;
149	u32 dev;
150	struct v9fs_qid qid;
151	u32 mode;
152	u32 atime;
153	u32 mtime;
154	u64 length;
155	char *name;
156	char *uid;
157	char *gid;
158	char *muid;
159	char *extension;	/* 9p2000.u extensions */
160	u32 n_uid;		/* 9p2000.u extensions */
161	u32 n_gid;		/* 9p2000.u extensions */
162	u32 n_muid;		/* 9p2000.u extensions */
163};
164
165/* Structures for Protocol Operations */
166
167struct Tversion {
168	u32 msize;
169	struct v9fs_str version;
170};
171
172struct Rversion {
173	u32 msize;
174	struct v9fs_str version;
175};
176
177struct Tauth {
178	u32 afid;
179	struct v9fs_str uname;
180	struct v9fs_str aname;
181};
182
183struct Rauth {
184	struct v9fs_qid qid;
185};
186
187struct Rerror {
188	struct v9fs_str error;
189	u32 errno;		/* 9p2000.u extension */
190};
191
192struct Tflush {
193	u16 oldtag;
194};
195
196struct Rflush {
197};
198
199struct Tattach {
200	u32 fid;
201	u32 afid;
202	struct v9fs_str uname;
203	struct v9fs_str aname;
204};
205
206struct Rattach {
207	struct v9fs_qid qid;
208};
209
210struct Twalk {
211	u32 fid;
212	u32 newfid;
213	u16 nwname;
214	struct v9fs_str wnames[16];
215};
216
217struct Rwalk {
218	u16 nwqid;
219	struct v9fs_qid wqids[16];
220};
221
222struct Topen {
223	u32 fid;
224	u8 mode;
225};
226
227struct Ropen {
228	struct v9fs_qid qid;
229	u32 iounit;
230};
231
232struct Tcreate {
233	u32 fid;
234	struct v9fs_str name;
235	u32 perm;
236	u8 mode;
237	struct v9fs_str extension;
238};
239
240struct Rcreate {
241	struct v9fs_qid qid;
242	u32 iounit;
243};
244
245struct Tread {
246	u32 fid;
247	u64 offset;
248	u32 count;
249};
250
251struct Rread {
252	u32 count;
253	u8 *data;
254};
255
256struct Twrite {
257	u32 fid;
258	u64 offset;
259	u32 count;
260	u8 *data;
261};
262
263struct Rwrite {
264	u32 count;
265};
266
267struct Tclunk {
268	u32 fid;
269};
270
271struct Rclunk {
272};
273
274struct Tremove {
275	u32 fid;
276};
277
278struct Rremove {
279};
280
281struct Tstat {
282	u32 fid;
283};
284
285struct Rstat {
286	struct v9fs_stat stat;
287};
288
289struct Twstat {
290	u32 fid;
291	struct v9fs_stat stat;
292};
293
294struct Rwstat {
295};
296
297/*
298  * fcall is the primary packet structure
299  *
300  */
301
302struct v9fs_fcall {
303	u32 size;
304	u8 id;
305	u16 tag;
306	void *sdata;
307
308	union {
309		struct Tversion tversion;
310		struct Rversion rversion;
311		struct Tauth tauth;
312		struct Rauth rauth;
313		struct Rerror rerror;
314		struct Tflush tflush;
315		struct Rflush rflush;
316		struct Tattach tattach;
317		struct Rattach rattach;
318		struct Twalk twalk;
319		struct Rwalk rwalk;
320		struct Topen topen;
321		struct Ropen ropen;
322		struct Tcreate tcreate;
323		struct Rcreate rcreate;
324		struct Tread tread;
325		struct Rread rread;
326		struct Twrite twrite;
327		struct Rwrite rwrite;
328		struct Tclunk tclunk;
329		struct Rclunk rclunk;
330		struct Tremove tremove;
331		struct Rremove rremove;
332		struct Tstat tstat;
333		struct Rstat rstat;
334		struct Twstat twstat;
335		struct Rwstat rwstat;
336	} params;
337};
338
339#define PRINT_FCALL_ERROR(s, fcall) dprintk(DEBUG_ERROR, "%s: %.*s\n", s, \
340	fcall?fcall->params.rerror.error.len:0, \
341	fcall?fcall->params.rerror.error.str:"");
342
343int v9fs_t_version(struct v9fs_session_info *v9ses, u32 msize,
344		   char *version, struct v9fs_fcall **rcall);
345
346int v9fs_t_attach(struct v9fs_session_info *v9ses, char *uname, char *aname,
347		  u32 fid, u32 afid, struct v9fs_fcall **rcall);
348
349int v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid);
350
351int v9fs_t_stat(struct v9fs_session_info *v9ses, u32 fid,
352		struct v9fs_fcall **rcall);
353
354int v9fs_t_wstat(struct v9fs_session_info *v9ses, u32 fid,
355		 struct v9fs_wstat *wstat, struct v9fs_fcall **rcall);
356
357int v9fs_t_walk(struct v9fs_session_info *v9ses, u32 fid, u32 newfid,
358		char *name, struct v9fs_fcall **rcall);
359
360int v9fs_t_open(struct v9fs_session_info *v9ses, u32 fid, u8 mode,
361		struct v9fs_fcall **rcall);
362
363int v9fs_t_remove(struct v9fs_session_info *v9ses, u32 fid,
364		  struct v9fs_fcall **rcall);
365
366int v9fs_t_create(struct v9fs_session_info *v9ses, u32 fid, char *name,
367	u32 perm, u8 mode, char *extension, struct v9fs_fcall **rcall);
368
369int v9fs_t_read(struct v9fs_session_info *v9ses, u32 fid,
370		u64 offset, u32 count, struct v9fs_fcall **rcall);
371
372int v9fs_t_write(struct v9fs_session_info *v9ses, u32 fid, u64 offset,
373		 u32 count, const char __user * data,
374		 struct v9fs_fcall **rcall);
375int v9fs_printfcall(char *, int, struct v9fs_fcall *, int);
376