xref: /openbmc/linux/include/net/9p/9p.h (revision c21b37f6)
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 };
220 
221 struct p9_rauth {
222 	struct p9_qid qid;
223 };
224 
225 struct p9_rerror {
226 	struct p9_str error;
227 	u32 errno;		/* 9p2000.u extension */
228 };
229 
230 struct p9_tflush {
231 	u16 oldtag;
232 };
233 
234 struct p9_rflush {
235 };
236 
237 struct p9_tattach {
238 	u32 fid;
239 	u32 afid;
240 	struct p9_str uname;
241 	struct p9_str aname;
242 };
243 
244 struct p9_rattach {
245 	struct p9_qid qid;
246 };
247 
248 struct p9_twalk {
249 	u32 fid;
250 	u32 newfid;
251 	u16 nwname;
252 	struct p9_str wnames[16];
253 };
254 
255 struct p9_rwalk {
256 	u16 nwqid;
257 	struct p9_qid wqids[16];
258 };
259 
260 struct p9_topen {
261 	u32 fid;
262 	u8 mode;
263 };
264 
265 struct p9_ropen {
266 	struct p9_qid qid;
267 	u32 iounit;
268 };
269 
270 struct p9_tcreate {
271 	u32 fid;
272 	struct p9_str name;
273 	u32 perm;
274 	u8 mode;
275 	struct p9_str extension;
276 };
277 
278 struct p9_rcreate {
279 	struct p9_qid qid;
280 	u32 iounit;
281 };
282 
283 struct p9_tread {
284 	u32 fid;
285 	u64 offset;
286 	u32 count;
287 };
288 
289 struct p9_rread {
290 	u32 count;
291 	u8 *data;
292 };
293 
294 struct p9_twrite {
295 	u32 fid;
296 	u64 offset;
297 	u32 count;
298 	u8 *data;
299 };
300 
301 struct p9_rwrite {
302 	u32 count;
303 };
304 
305 struct p9_tclunk {
306 	u32 fid;
307 };
308 
309 struct p9_rclunk {
310 };
311 
312 struct p9_tremove {
313 	u32 fid;
314 };
315 
316 struct p9_rremove {
317 };
318 
319 struct p9_tstat {
320 	u32 fid;
321 };
322 
323 struct p9_rstat {
324 	struct p9_stat stat;
325 };
326 
327 struct p9_twstat {
328 	u32 fid;
329 	struct p9_stat stat;
330 };
331 
332 struct p9_rwstat {
333 };
334 
335 /*
336   * fcall is the primary packet structure
337   *
338   */
339 
340 struct p9_fcall {
341 	u32 size;
342 	u8 id;
343 	u16 tag;
344 	void *sdata;
345 
346 	union {
347 		struct p9_tversion tversion;
348 		struct p9_rversion rversion;
349 		struct p9_tauth tauth;
350 		struct p9_rauth rauth;
351 		struct p9_rerror rerror;
352 		struct p9_tflush tflush;
353 		struct p9_rflush rflush;
354 		struct p9_tattach tattach;
355 		struct p9_rattach rattach;
356 		struct p9_twalk twalk;
357 		struct p9_rwalk rwalk;
358 		struct p9_topen topen;
359 		struct p9_ropen ropen;
360 		struct p9_tcreate tcreate;
361 		struct p9_rcreate rcreate;
362 		struct p9_tread tread;
363 		struct p9_rread rread;
364 		struct p9_twrite twrite;
365 		struct p9_rwrite rwrite;
366 		struct p9_tclunk tclunk;
367 		struct p9_rclunk rclunk;
368 		struct p9_tremove tremove;
369 		struct p9_rremove rremove;
370 		struct p9_tstat tstat;
371 		struct p9_rstat rstat;
372 		struct p9_twstat twstat;
373 		struct p9_rwstat rwstat;
374 	} params;
375 };
376 
377 struct p9_idpool;
378 
379 int p9_deserialize_stat(void *buf, u32 buflen, struct p9_stat *stat,
380 	int dotu);
381 int p9_deserialize_fcall(void *buf, u32 buflen, struct p9_fcall *fc, int dotu);
382 void p9_set_tag(struct p9_fcall *fc, u16 tag);
383 struct p9_fcall *p9_create_tversion(u32 msize, char *version);
384 struct p9_fcall *p9_create_tattach(u32 fid, u32 afid, char *uname,
385 	char *aname);
386 struct p9_fcall *p9_create_tauth(u32 afid, char *uname, char *aname);
387 struct p9_fcall *p9_create_tflush(u16 oldtag);
388 struct p9_fcall *p9_create_twalk(u32 fid, u32 newfid, u16 nwname,
389 	char **wnames);
390 struct p9_fcall *p9_create_topen(u32 fid, u8 mode);
391 struct p9_fcall *p9_create_tcreate(u32 fid, char *name, u32 perm, u8 mode,
392 	char *extension, int dotu);
393 struct p9_fcall *p9_create_tread(u32 fid, u64 offset, u32 count);
394 struct p9_fcall *p9_create_twrite(u32 fid, u64 offset, u32 count,
395 	const char *data);
396 struct p9_fcall *p9_create_twrite_u(u32 fid, u64 offset, u32 count,
397 	const char __user *data);
398 struct p9_fcall *p9_create_tclunk(u32 fid);
399 struct p9_fcall *p9_create_tremove(u32 fid);
400 struct p9_fcall *p9_create_tstat(u32 fid);
401 struct p9_fcall *p9_create_twstat(u32 fid, struct p9_wstat *wstat,
402 	int dotu);
403 
404 int p9_printfcall(char *buf, int buflen, struct p9_fcall *fc, int dotu);
405 int p9_errstr2errno(char *errstr, int len);
406 
407 struct p9_idpool *p9_idpool_create(void);
408 void p9_idpool_destroy(struct p9_idpool *);
409 int p9_idpool_get(struct p9_idpool *p);
410 void p9_idpool_put(int id, struct p9_idpool *p);
411 int p9_idpool_check(int id, struct p9_idpool *p);
412 
413 int p9_error_init(void);
414 int p9_errstr2errno(char *, int);
415 int __init p9_sysctl_register(void);
416 void __exit p9_sysctl_unregister(void);
417 #endif /* NET_9P_H */
418