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