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__, task_pid_nr(current) , ## 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__, task_pid_nr(current), ## 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 #endif /* NET_9P_H */ 419