Commit | Line | Data |
---|---|---|
bd238fb4 LI |
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): " \ | |
ba25f9dc | 47 | format , __FUNCTION__, task_pid_nr(current) , ## arg); \ |
bd238fb4 LI |
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): " \ | |
ba25f9dc | 62 | format , __FUNCTION__, task_pid_nr(current), ## arg); \ |
bd238fb4 LI |
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; | |
ba17674f | 219 | u32 n_uname; /* 9P2000.u extensions */ |
bd238fb4 LI |
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; | |
ba17674f | 243 | u32 n_uname; /* 9P2000.u extensions */ |
bd238fb4 LI |
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, | |
ba17674f LI |
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); | |
bd238fb4 LI |
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); | |
bd238fb4 | 418 | #endif /* NET_9P_H */ |