4 * 9P protocol definitions.
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>
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.
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.
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
30 #ifdef CONFIG_NET_9P_DEBUG
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)
41 extern unsigned int p9_debug_level
;
43 #define P9_DPRINTK(level, format, arg...) \
45 if ((p9_debug_level & level) == level) \
46 printk(KERN_NOTICE "-- %s (%d): " \
47 format , __FUNCTION__, task_pid_nr(current) , ## arg); \
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:"");
55 #define P9_DPRINTK(level, format, arg...) do { } while (0)
56 #define PRINT_FCALL_ERROR(s, fcall) do { } while (0)
59 #define P9_EPRINTK(level, format, arg...) \
61 printk(level "9p: %s (%d): " \
62 format , __FUNCTION__, task_pid_nr(current), ## arg); \
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 P9_DMSETVTX
= 0x00010000,
143 #define P9_NOTAG (u16)(~0)
144 #define P9_NOFID (u32)(~0)
145 #define P9_MAXWELEM 16
147 /* ample room for Twrite/Rread header */
148 #define P9_IOHDRSZ 24
155 /* qids are the unique ID for a file (like an inode */
162 /* Plan 9 file metadata (stat) structure */
176 struct p9_str extension
; /* 9p2000.u extensions */
177 u32 n_uid
; /* 9p2000.u extensions */
178 u32 n_gid
; /* 9p2000.u extensions */
179 u32 n_muid
; /* 9p2000.u extensions */
182 /* file metadata (stat) structure used to create Twstat message
183 The is similar to p9_stat, but the strings don't point to
184 the same memory block and should be freed separately
199 char *extension
; /* 9p2000.u extensions */
200 u32 n_uid
; /* 9p2000.u extensions */
201 u32 n_gid
; /* 9p2000.u extensions */
202 u32 n_muid
; /* 9p2000.u extensions */
205 /* Structures for Protocol Operations */
208 struct p9_str version
;
213 struct p9_str version
;
220 u32 n_uname
; /* 9P2000.u extensions */
229 u32 errno
; /* 9p2000.u extension */
244 u32 n_uname
; /* 9P2000.u extensions */
255 struct p9_str wnames
[16];
260 struct p9_qid wqids
[16];
278 struct p9_str extension
;
339 * fcall is the primary packet structure
350 struct p9_tversion tversion
;
351 struct p9_rversion rversion
;
352 struct p9_tauth tauth
;
353 struct p9_rauth rauth
;
354 struct p9_rerror rerror
;
355 struct p9_tflush tflush
;
356 struct p9_rflush rflush
;
357 struct p9_tattach tattach
;
358 struct p9_rattach rattach
;
359 struct p9_twalk twalk
;
360 struct p9_rwalk rwalk
;
361 struct p9_topen topen
;
362 struct p9_ropen ropen
;
363 struct p9_tcreate tcreate
;
364 struct p9_rcreate rcreate
;
365 struct p9_tread tread
;
366 struct p9_rread rread
;
367 struct p9_twrite twrite
;
368 struct p9_rwrite rwrite
;
369 struct p9_tclunk tclunk
;
370 struct p9_rclunk rclunk
;
371 struct p9_tremove tremove
;
372 struct p9_rremove rremove
;
373 struct p9_tstat tstat
;
374 struct p9_rstat rstat
;
375 struct p9_twstat twstat
;
376 struct p9_rwstat rwstat
;
382 int p9_deserialize_stat(void *buf
, u32 buflen
, struct p9_stat
*stat
,
384 int p9_deserialize_fcall(void *buf
, u32 buflen
, struct p9_fcall
*fc
, int dotu
);
385 void p9_set_tag(struct p9_fcall
*fc
, u16 tag
);
386 struct p9_fcall
*p9_create_tversion(u32 msize
, char *version
);
387 struct p9_fcall
*p9_create_tattach(u32 fid
, u32 afid
, char *uname
,
388 char *aname
, u32 n_uname
, int dotu
);
389 struct p9_fcall
*p9_create_tauth(u32 afid
, char *uname
, char *aname
,
390 u32 n_uname
, int dotu
);
391 struct p9_fcall
*p9_create_tflush(u16 oldtag
);
392 struct p9_fcall
*p9_create_twalk(u32 fid
, u32 newfid
, u16 nwname
,
394 struct p9_fcall
*p9_create_topen(u32 fid
, u8 mode
);
395 struct p9_fcall
*p9_create_tcreate(u32 fid
, char *name
, u32 perm
, u8 mode
,
396 char *extension
, int dotu
);
397 struct p9_fcall
*p9_create_tread(u32 fid
, u64 offset
, u32 count
);
398 struct p9_fcall
*p9_create_twrite(u32 fid
, u64 offset
, u32 count
,
400 struct p9_fcall
*p9_create_twrite_u(u32 fid
, u64 offset
, u32 count
,
401 const char __user
*data
);
402 struct p9_fcall
*p9_create_tclunk(u32 fid
);
403 struct p9_fcall
*p9_create_tremove(u32 fid
);
404 struct p9_fcall
*p9_create_tstat(u32 fid
);
405 struct p9_fcall
*p9_create_twstat(u32 fid
, struct p9_wstat
*wstat
,
408 int p9_printfcall(char *buf
, int buflen
, struct p9_fcall
*fc
, int dotu
);
409 int p9_errstr2errno(char *errstr
, int len
);
411 struct p9_idpool
*p9_idpool_create(void);
412 void p9_idpool_destroy(struct p9_idpool
*);
413 int p9_idpool_get(struct p9_idpool
*p
);
414 void p9_idpool_put(int id
, struct p9_idpool
*p
);
415 int p9_idpool_check(int id
, struct p9_idpool
*p
);
417 int p9_error_init(void);
418 int p9_errstr2errno(char *, int);
419 #endif /* NET_9P_H */