7a448a30e39b53f2f481dfc98196148a3c92b7fb
[linux-2.6.git] / include / net / 9p / 9p.h
1 /*
2  * include/net/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 #ifndef NET_9P_H
28 #define NET_9P_H
29
30 #ifdef CONFIG_NET_9P_DEBUG
31
32 #define P9_DEBUG_ERROR          (1<<0)
33 #define P9_DEBUG_9P             (1<<2)
34 #define P9_DEBUG_VFS            (1<<3)
35 #define P9_DEBUG_CONV           (1<<4)
36 #define P9_DEBUG_MUX            (1<<5)
37 #define P9_DEBUG_TRANS          (1<<6)
38 #define P9_DEBUG_SLABS          (1<<7)
39 #define P9_DEBUG_FCALL          (1<<8)
40
41 extern unsigned int p9_debug_level;
42
43 #define P9_DPRINTK(level, format, arg...) \
44 do {  \
45         if ((p9_debug_level & level) == level) \
46                 printk(KERN_NOTICE "-- %s (%d): " \
47                 format , __FUNCTION__, current->pid , ## arg); \
48 } while (0)
49
50 #define PRINT_FCALL_ERROR(s, fcall) P9_DPRINTK(P9_DEBUG_ERROR,   \
51         "%s: %.*s\n", s, fcall?fcall->params.rerror.error.len:0, \
52         fcall?fcall->params.rerror.error.str:"");
53
54 #else
55 #define P9_DPRINTK(level, format, arg...)  do { } while (0)
56 #define PRINT_FCALL_ERROR(s, fcall) do { } while (0)
57 #endif
58
59 #define P9_EPRINTK(level, format, arg...) \
60 do { \
61         printk(level "9p: %s (%d): " \
62                 format , __FUNCTION__, current->pid , ## arg); \
63 } while (0)
64
65
66 /* Message Types */
67 enum {
68         P9_TVERSION = 100,
69         P9_RVERSION,
70         P9_TAUTH = 102,
71         P9_RAUTH,
72         P9_TATTACH = 104,
73         P9_RATTACH,
74         P9_TERROR = 106,
75         P9_RERROR,
76         P9_TFLUSH = 108,
77         P9_RFLUSH,
78         P9_TWALK = 110,
79         P9_RWALK,
80         P9_TOPEN = 112,
81         P9_ROPEN,
82         P9_TCREATE = 114,
83         P9_RCREATE,
84         P9_TREAD = 116,
85         P9_RREAD,
86         P9_TWRITE = 118,
87         P9_RWRITE,
88         P9_TCLUNK = 120,
89         P9_RCLUNK,
90         P9_TREMOVE = 122,
91         P9_RREMOVE,
92         P9_TSTAT = 124,
93         P9_RSTAT,
94         P9_TWSTAT = 126,
95         P9_RWSTAT,
96 };
97
98 /* open modes */
99 enum {
100         P9_OREAD = 0x00,
101         P9_OWRITE = 0x01,
102         P9_ORDWR = 0x02,
103         P9_OEXEC = 0x03,
104         P9_OEXCL = 0x04,
105         P9_OTRUNC = 0x10,
106         P9_OREXEC = 0x20,
107         P9_ORCLOSE = 0x40,
108         P9_OAPPEND = 0x80,
109 };
110
111 /* permissions */
112 enum {
113         P9_DMDIR = 0x80000000,
114         P9_DMAPPEND = 0x40000000,
115         P9_DMEXCL = 0x20000000,
116         P9_DMMOUNT = 0x10000000,
117         P9_DMAUTH = 0x08000000,
118         P9_DMTMP = 0x04000000,
119         P9_DMSYMLINK = 0x02000000,
120         P9_DMLINK = 0x01000000,
121         /* 9P2000.u extensions */
122         P9_DMDEVICE = 0x00800000,
123         P9_DMNAMEDPIPE = 0x00200000,
124         P9_DMSOCKET = 0x00100000,
125         P9_DMSETUID = 0x00080000,
126         P9_DMSETGID = 0x00040000,
127 };
128
129 /* qid.types */
130 enum {
131         P9_QTDIR = 0x80,
132         P9_QTAPPEND = 0x40,
133         P9_QTEXCL = 0x20,
134         P9_QTMOUNT = 0x10,
135         P9_QTAUTH = 0x08,
136         P9_QTTMP = 0x04,
137         P9_QTSYMLINK = 0x02,
138         P9_QTLINK = 0x01,
139         P9_QTFILE = 0x00,
140 };
141
142 #define P9_NOTAG        (u16)(~0)
143 #define P9_NOFID        (u32)(~0)
144 #define P9_MAXWELEM     16
145
146 /* ample room for Twrite/Rread header */
147 #define P9_IOHDRSZ      24
148
149 struct p9_str {
150         u16 len;
151         char *str;
152 };
153
154 /* qids are the unique ID for a file (like an inode */
155 struct p9_qid {
156         u8 type;
157         u32 version;
158         u64 path;
159 };
160
161 /* Plan 9 file metadata (stat) structure */
162 struct p9_stat {
163         u16 size;
164         u16 type;
165         u32 dev;
166         struct p9_qid qid;
167         u32 mode;
168         u32 atime;
169         u32 mtime;
170         u64 length;
171         struct p9_str name;
172         struct p9_str uid;
173         struct p9_str gid;
174         struct p9_str muid;
175         struct p9_str extension;        /* 9p2000.u extensions */
176         u32 n_uid;                      /* 9p2000.u extensions */
177         u32 n_gid;                      /* 9p2000.u extensions */
178         u32 n_muid;                     /* 9p2000.u extensions */
179 };
180
181 /* file metadata (stat) structure used to create Twstat message
182    The is similar to p9_stat, but the strings don't point to
183    the same memory block and should be freed separately
184 */
185 struct p9_wstat {
186         u16 size;
187         u16 type;
188         u32 dev;
189         struct p9_qid qid;
190         u32 mode;
191         u32 atime;
192         u32 mtime;
193         u64 length;
194         char *name;
195         char *uid;
196         char *gid;
197         char *muid;
198         char *extension;        /* 9p2000.u extensions */
199         u32 n_uid;              /* 9p2000.u extensions */
200         u32 n_gid;              /* 9p2000.u extensions */
201         u32 n_muid;             /* 9p2000.u extensions */
202 };
203
204 /* Structures for Protocol Operations */
205 struct p9_tversion {
206         u32 msize;
207         struct p9_str version;
208 };
209
210 struct p9_rversion {
211         u32 msize;
212         struct p9_str version;
213 };
214
215 struct p9_tauth {
216         u32 afid;
217         struct p9_str uname;
218         struct p9_str aname;
219         u32 n_uname;            /* 9P2000.u extensions */
220 };
221
222 struct p9_rauth {
223         struct p9_qid qid;
224 };
225
226 struct p9_rerror {
227         struct p9_str error;
228         u32 errno;              /* 9p2000.u extension */
229 };
230
231 struct p9_tflush {
232         u16 oldtag;
233 };
234
235 struct p9_rflush {
236 };
237
238 struct p9_tattach {
239         u32 fid;
240         u32 afid;
241         struct p9_str uname;
242         struct p9_str aname;
243         u32 n_uname;            /* 9P2000.u extensions */
244 };
245
246 struct p9_rattach {
247         struct p9_qid qid;
248 };
249
250 struct p9_twalk {
251         u32 fid;
252         u32 newfid;
253         u16 nwname;
254         struct p9_str wnames[16];
255 };
256
257 struct p9_rwalk {
258         u16 nwqid;
259         struct p9_qid wqids[16];
260 };
261
262 struct p9_topen {
263         u32 fid;
264         u8 mode;
265 };
266
267 struct p9_ropen {
268         struct p9_qid qid;
269         u32 iounit;
270 };
271
272 struct p9_tcreate {
273         u32 fid;
274         struct p9_str name;
275         u32 perm;
276         u8 mode;
277         struct p9_str extension;
278 };
279
280 struct p9_rcreate {
281         struct p9_qid qid;
282         u32 iounit;
283 };
284
285 struct p9_tread {
286         u32 fid;
287         u64 offset;
288         u32 count;
289 };
290
291 struct p9_rread {
292         u32 count;
293         u8 *data;
294 };
295
296 struct p9_twrite {
297         u32 fid;
298         u64 offset;
299         u32 count;
300         u8 *data;
301 };
302
303 struct p9_rwrite {
304         u32 count;
305 };
306
307 struct p9_tclunk {
308         u32 fid;
309 };
310
311 struct p9_rclunk {
312 };
313
314 struct p9_tremove {
315         u32 fid;
316 };
317
318 struct p9_rremove {
319 };
320
321 struct p9_tstat {
322         u32 fid;
323 };
324
325 struct p9_rstat {
326         struct p9_stat stat;
327 };
328
329 struct p9_twstat {
330         u32 fid;
331         struct p9_stat stat;
332 };
333
334 struct p9_rwstat {
335 };
336
337 /*
338   * fcall is the primary packet structure
339   *
340   */
341
342 struct p9_fcall {
343         u32 size;
344         u8 id;
345         u16 tag;
346         void *sdata;
347
348         union {
349                 struct p9_tversion tversion;
350                 struct p9_rversion rversion;
351                 struct p9_tauth tauth;
352                 struct p9_rauth rauth;
353                 struct p9_rerror rerror;
354                 struct p9_tflush tflush;
355                 struct p9_rflush rflush;
356                 struct p9_tattach tattach;
357                 struct p9_rattach rattach;
358                 struct p9_twalk twalk;
359                 struct p9_rwalk rwalk;
360                 struct p9_topen topen;
361                 struct p9_ropen ropen;
362                 struct p9_tcreate tcreate;
363                 struct p9_rcreate rcreate;
364                 struct p9_tread tread;
365                 struct p9_rread rread;
366                 struct p9_twrite twrite;
367                 struct p9_rwrite rwrite;
368                 struct p9_tclunk tclunk;
369                 struct p9_rclunk rclunk;
370                 struct p9_tremove tremove;
371                 struct p9_rremove rremove;
372                 struct p9_tstat tstat;
373                 struct p9_rstat rstat;
374                 struct p9_twstat twstat;
375                 struct p9_rwstat rwstat;
376         } params;
377 };
378
379 struct p9_idpool;
380
381 int p9_deserialize_stat(void *buf, u32 buflen, struct p9_stat *stat,
382         int dotu);
383 int p9_deserialize_fcall(void *buf, u32 buflen, struct p9_fcall *fc, int dotu);
384 void p9_set_tag(struct p9_fcall *fc, u16 tag);
385 struct p9_fcall *p9_create_tversion(u32 msize, char *version);
386 struct p9_fcall *p9_create_tattach(u32 fid, u32 afid, char *uname,
387         char *aname, u32 n_uname, int dotu);
388 struct p9_fcall *p9_create_tauth(u32 afid, char *uname, char *aname,
389         u32 n_uname, int dotu);
390 struct p9_fcall *p9_create_tflush(u16 oldtag);
391 struct p9_fcall *p9_create_twalk(u32 fid, u32 newfid, u16 nwname,
392         char **wnames);
393 struct p9_fcall *p9_create_topen(u32 fid, u8 mode);
394 struct p9_fcall *p9_create_tcreate(u32 fid, char *name, u32 perm, u8 mode,
395         char *extension, int dotu);
396 struct p9_fcall *p9_create_tread(u32 fid, u64 offset, u32 count);
397 struct p9_fcall *p9_create_twrite(u32 fid, u64 offset, u32 count,
398         const char *data);
399 struct p9_fcall *p9_create_twrite_u(u32 fid, u64 offset, u32 count,
400         const char __user *data);
401 struct p9_fcall *p9_create_tclunk(u32 fid);
402 struct p9_fcall *p9_create_tremove(u32 fid);
403 struct p9_fcall *p9_create_tstat(u32 fid);
404 struct p9_fcall *p9_create_twstat(u32 fid, struct p9_wstat *wstat,
405         int dotu);
406
407 int p9_printfcall(char *buf, int buflen, struct p9_fcall *fc, int dotu);
408 int p9_errstr2errno(char *errstr, int len);
409
410 struct p9_idpool *p9_idpool_create(void);
411 void p9_idpool_destroy(struct p9_idpool *);
412 int p9_idpool_get(struct p9_idpool *p);
413 void p9_idpool_put(int id, struct p9_idpool *p);
414 int p9_idpool_check(int id, struct p9_idpool *p);
415
416 int p9_error_init(void);
417 int p9_errstr2errno(char *, int);
418
419 #ifdef CONFIG_SYSCTL
420 int __init p9_sysctl_register(void);
421 void __exit p9_sysctl_unregister(void);
422 #else
423 static inline int p9_sysctl_register(void)
424 {
425         return 0;
426 }
427 static inline void p9_sysctl_unregister(void)
428 {
429 }
430 #endif
431
432 #endif /* NET_9P_H */