1*14414594SDavid du Colombier #ifndef _9FS_9P_H_ 2*14414594SDavid du Colombier #define _9FS_9P_H_ 3*14414594SDavid du Colombier 4*14414594SDavid du Colombier 5*14414594SDavid du Colombier #define U9FS_AUTHLEN 13 6*14414594SDavid du Colombier #define U9FS_NAMELEN 28 7*14414594SDavid du Colombier #define U9FS_TICKETLEN 72 8*14414594SDavid du Colombier #define U9FS_ERRLEN 64 9*14414594SDavid du Colombier #define U9FS_DOMLEN 48 10*14414594SDavid du Colombier #define U9FS_CHALLEN 8 11*14414594SDavid du Colombier #define U9FS_DIRLEN 116 12*14414594SDavid du Colombier #define U9FS_MAXFDATA 8192 13*14414594SDavid du Colombier #define U9FS_MAXDDATA (((int)U9FS_MAXFDATA/U9FS_DIRLEN)*U9FS_DIRLEN) 14*14414594SDavid du Colombier 15*14414594SDavid du Colombier #define U9P_MODE_RD 0x0 16*14414594SDavid du Colombier #define U9P_MODE_WR 0x1 17*14414594SDavid du Colombier #define U9P_MODE_RDWR 0x2 18*14414594SDavid du Colombier #define U9P_MODE_EX 0x3 19*14414594SDavid du Colombier #define U9P_MODE_TRUNC 0x10 20*14414594SDavid du Colombier #define U9P_MODE_CLOSE 0x40 21*14414594SDavid du Colombier 22*14414594SDavid du Colombier #define U9P_PERM_CHDIR(m) (0x80000000&(m)) 23*14414594SDavid du Colombier #define U9P_PERM_OWNER(m) ((m)&0x7) 24*14414594SDavid du Colombier #define U9P_PERM_GROUP(m) (((m)>>3)&0x7) 25*14414594SDavid du Colombier #define U9P_PERM_OTHER(m) (((m)>>6)&0x7) 26*14414594SDavid du Colombier #define U9P_PERM_ALL(m) ((m)&0777) 27*14414594SDavid du Colombier 28*14414594SDavid du Colombier /* this is too small */ 29*14414594SDavid du Colombier typedef u_int32_t u9fsfh_t; 30*14414594SDavid du Colombier 31*14414594SDavid du Colombier struct u9fd_qid { 32*14414594SDavid du Colombier u9fsfh_t path; 33*14414594SDavid du Colombier u_int32_t vers; 34*14414594SDavid du Colombier }; 35*14414594SDavid du Colombier 36*14414594SDavid du Colombier struct u9fsreq { 37*14414594SDavid du Colombier TAILQ_ENTRY(u9fsreq) r_chain; 38*14414594SDavid du Colombier struct u9fsreq * r_rep; 39*14414594SDavid du Colombier struct mbuf * r_mrep; 40*14414594SDavid du Colombier struct proc *r_procp; /* Proc that did I/O system call */ 41*14414594SDavid du Colombier struct u9fsmount *r_nmp; 42*14414594SDavid du Colombier 43*14414594SDavid du Colombier /* actual content of the 9P message */ 44*14414594SDavid du Colombier char r_type; 45*14414594SDavid du Colombier short r_fid; 46*14414594SDavid du Colombier u_short r_tag; 47*14414594SDavid du Colombier union { 48*14414594SDavid du Colombier struct { 49*14414594SDavid du Colombier u_short oldtag; /* Tflush */ 50*14414594SDavid du Colombier struct u9fd_qid qid; /* Rattach, Rwalk, Ropen, Rcreate */ 51*14414594SDavid du Colombier char rauth[U9FS_AUTHLEN]; /* Rattach */ 52*14414594SDavid du Colombier } u1; 53*14414594SDavid du Colombier struct { 54*14414594SDavid du Colombier char uname[U9FS_NAMELEN]; /* Tattach */ 55*14414594SDavid du Colombier char aname[U9FS_NAMELEN]; /* Tattach */ 56*14414594SDavid du Colombier char ticket[U9FS_TICKETLEN]; /* Tattach */ 57*14414594SDavid du Colombier char auth[U9FS_AUTHLEN]; /* Tattach */ 58*14414594SDavid du Colombier } u2; 59*14414594SDavid du Colombier struct { 60*14414594SDavid du Colombier char ename[U9FS_ERRLEN]; /* Rerror */ 61*14414594SDavid du Colombier char authid[U9FS_NAMELEN]; /* Rsession */ 62*14414594SDavid du Colombier char authdom[U9FS_DOMLEN]; /* Rsession */ 63*14414594SDavid du Colombier char chal[U9FS_CHALLEN]; /* Tsession/Rsession */ 64*14414594SDavid du Colombier } u3; 65*14414594SDavid du Colombier struct { 66*14414594SDavid du Colombier u_int32_t perm; /* Tcreate */ 67*14414594SDavid du Colombier short newfid; /* Tclone, Tclwalk */ 68*14414594SDavid du Colombier char name[U9FS_NAMELEN]; /* Twalk, Tclwalk, Tcreate */ 69*14414594SDavid du Colombier char mode; /* Tcreate, Topen */ 70*14414594SDavid du Colombier } u4; 71*14414594SDavid du Colombier struct { 72*14414594SDavid du Colombier u_int64_t offset; /* Tread, Twrite */ 73*14414594SDavid du Colombier u_short count; /* Tread, Twrite, Rread */ 74*14414594SDavid du Colombier char *data; /* Twrite, Rread */ 75*14414594SDavid du Colombier } u5; 76*14414594SDavid du Colombier char stat[U9FS_DIRLEN]; /* Twstat, Rstat */ 77*14414594SDavid du Colombier } u; 78*14414594SDavid du Colombier }; 79*14414594SDavid du Colombier 80*14414594SDavid du Colombier #define r_oldtag u.u1.oldtag 81*14414594SDavid du Colombier #define r_qid u.u1.qid 82*14414594SDavid du Colombier #define r_rauth u.u1.rauth 83*14414594SDavid du Colombier #define r_uname u.u2.uname 84*14414594SDavid du Colombier #define r_aname u.u2.aname 85*14414594SDavid du Colombier #define r_ticket u.u2.ticket 86*14414594SDavid du Colombier #define r_auth u.u2.auth 87*14414594SDavid du Colombier #define r_ename u.u3.ename 88*14414594SDavid du Colombier #define r_authid u.u3.authid 89*14414594SDavid du Colombier #define r_authdom u.u3.authdom 90*14414594SDavid du Colombier #define r_chal u.u3.chal 91*14414594SDavid du Colombier #define r_perm u.u4.perm 92*14414594SDavid du Colombier #define r_newfid u.u4.newfid 93*14414594SDavid du Colombier #define r_name u.u4.name 94*14414594SDavid du Colombier #define r_mode u.u4.mode 95*14414594SDavid du Colombier #define r_offset u.u5.offset 96*14414594SDavid du Colombier #define r_count u.u5.count 97*14414594SDavid du Colombier #define r_data u.u5.data 98*14414594SDavid du Colombier #define r_stat u.stat 99*14414594SDavid du Colombier 100*14414594SDavid du Colombier extern TAILQ_HEAD(u9fs_reqq, u9fsreq) u9fs_reqq; 101*14414594SDavid du Colombier 102*14414594SDavid du Colombier struct u9fsdir { 103*14414594SDavid du Colombier char dir_name[U9FS_NAMELEN]; 104*14414594SDavid du Colombier char dir_uid[U9FS_NAMELEN]; 105*14414594SDavid du Colombier char dir_gid[U9FS_NAMELEN]; 106*14414594SDavid du Colombier struct u9fd_qid dir_qid; 107*14414594SDavid du Colombier u_int32_t dir_mode; 108*14414594SDavid du Colombier u_int32_t dir_atime; 109*14414594SDavid du Colombier u_int32_t dir_mtime; 110*14414594SDavid du Colombier union { 111*14414594SDavid du Colombier u_int64_t length; 112*14414594SDavid du Colombier struct { /* little endian */ 113*14414594SDavid du Colombier u_int32_t llength; 114*14414594SDavid du Colombier u_int32_t hlength; 115*14414594SDavid du Colombier } l; 116*14414594SDavid du Colombier } u; 117*14414594SDavid du Colombier u_short dir_type; 118*14414594SDavid du Colombier u_short dir_dev; 119*14414594SDavid du Colombier }; 120*14414594SDavid du Colombier 121*14414594SDavid du Colombier #define dir_length u.length 122*14414594SDavid du Colombier #define dir_llength u.l.llength 123*14414594SDavid du Colombier #define dir_hlength u.l.hlength 124*14414594SDavid du Colombier 125*14414594SDavid du Colombier enum 126*14414594SDavid du Colombier { 127*14414594SDavid du Colombier Tnop = 50, 128*14414594SDavid du Colombier Rnop, 129*14414594SDavid du Colombier Tosession = 52, /* illegal */ 130*14414594SDavid du Colombier Rosession, /* illegal */ 131*14414594SDavid du Colombier Terror = 54, /* illegal */ 132*14414594SDavid du Colombier Rerror, 133*14414594SDavid du Colombier Tflush = 56, 134*14414594SDavid du Colombier Rflush, 135*14414594SDavid du Colombier Toattach = 58, /* illegal */ 136*14414594SDavid du Colombier Roattach, /* illegal */ 137*14414594SDavid du Colombier Tclone = 60, 138*14414594SDavid du Colombier Rclone, 139*14414594SDavid du Colombier Twalk = 62, 140*14414594SDavid du Colombier Rwalk, 141*14414594SDavid du Colombier Topen = 64, 142*14414594SDavid du Colombier Ropen, 143*14414594SDavid du Colombier Tcreate = 66, 144*14414594SDavid du Colombier Rcreate, 145*14414594SDavid du Colombier Tread = 68, 146*14414594SDavid du Colombier Rread, 147*14414594SDavid du Colombier Twrite = 70, 148*14414594SDavid du Colombier Rwrite, 149*14414594SDavid du Colombier Tclunk = 72, 150*14414594SDavid du Colombier Rclunk, 151*14414594SDavid du Colombier Tremove = 74, 152*14414594SDavid du Colombier Rremove, 153*14414594SDavid du Colombier Tstat = 76, 154*14414594SDavid du Colombier Rstat, 155*14414594SDavid du Colombier Twstat = 78, 156*14414594SDavid du Colombier Rwstat, 157*14414594SDavid du Colombier Tclwalk = 80, 158*14414594SDavid du Colombier Rclwalk, 159*14414594SDavid du Colombier Tauth = 82, /* illegal */ 160*14414594SDavid du Colombier Rauth, /* illegal */ 161*14414594SDavid du Colombier Tsession = 84, 162*14414594SDavid du Colombier Rsession, 163*14414594SDavid du Colombier Tattach = 86, 164*14414594SDavid du Colombier Rattach, 165*14414594SDavid du Colombier Ttunnel = 88, 166*14414594SDavid du Colombier Rtunnel, 167*14414594SDavid du Colombier Tmax 168*14414594SDavid du Colombier }; 169*14414594SDavid du Colombier 170*14414594SDavid du Colombier static char * u9p_types[] = { 171*14414594SDavid du Colombier "Tnop", 172*14414594SDavid du Colombier "Rnop", 173*14414594SDavid du Colombier "Tosession", 174*14414594SDavid du Colombier "Rosession", 175*14414594SDavid du Colombier "Terror", 176*14414594SDavid du Colombier "Rerror", 177*14414594SDavid du Colombier "Tflush", 178*14414594SDavid du Colombier "Rflush", 179*14414594SDavid du Colombier "Toattach", 180*14414594SDavid du Colombier "Roattach", 181*14414594SDavid du Colombier "Tclone", 182*14414594SDavid du Colombier "Rclone", 183*14414594SDavid du Colombier "Twalk", 184*14414594SDavid du Colombier "Rwalk", 185*14414594SDavid du Colombier "Topen", 186*14414594SDavid du Colombier "Ropen", 187*14414594SDavid du Colombier "Tcreate", 188*14414594SDavid du Colombier "Rcreate", 189*14414594SDavid du Colombier "Tread", 190*14414594SDavid du Colombier "Rread", 191*14414594SDavid du Colombier "Twrite", 192*14414594SDavid du Colombier "Rwrite", 193*14414594SDavid du Colombier "Tclunk", 194*14414594SDavid du Colombier "Rclunk", 195*14414594SDavid du Colombier "Tremove", 196*14414594SDavid du Colombier "Rremove", 197*14414594SDavid du Colombier "Tstat", 198*14414594SDavid du Colombier "Rstat", 199*14414594SDavid du Colombier "Twstat", 200*14414594SDavid du Colombier "Rwstat", 201*14414594SDavid du Colombier "Tclwalk", 202*14414594SDavid du Colombier "Rclwalk", 203*14414594SDavid du Colombier "Tauth", 204*14414594SDavid du Colombier "Rauth", 205*14414594SDavid du Colombier "Tsession", 206*14414594SDavid du Colombier "Rsession", 207*14414594SDavid du Colombier "Tattach", 208*14414594SDavid du Colombier "Rattach", 209*14414594SDavid du Colombier "Ttunnel", 210*14414594SDavid du Colombier "Rtunnel", 211*14414594SDavid du Colombier "Tmax" 212*14414594SDavid du Colombier }; 213*14414594SDavid du Colombier 214*14414594SDavid du Colombier int u9p_m2s __P((char *ap, int n, struct u9fsreq *f)); 215*14414594SDavid du Colombier int u9p_s2m __P((struct u9fsreq *f, char *ap, int copydata)); 216*14414594SDavid du Colombier int u9p_m2d __P((char *ap, struct u9fsdir *f)); 217*14414594SDavid du Colombier int u9p_d2m __P((struct u9fsdir *f, char *ap)); 218*14414594SDavid du Colombier int u9p_type __P((char * t)); 219*14414594SDavid du Colombier 220*14414594SDavid du Colombier int u9p_m_m2s __P((struct mbuf **m, struct u9fsreq *f)); 221*14414594SDavid du Colombier struct mbuf * u9p_m_s2m __P((struct u9fsreq *f)); 222*14414594SDavid du Colombier int u9p_m_m2d __P((struct mbuf **m, struct u9fsdir *f)); 223*14414594SDavid du Colombier struct mbuf * u9p_m_d2m __P((struct u9fsdir *f)); 224*14414594SDavid du Colombier u_short u9p_m_tag __P((struct mbuf **m)); 225*14414594SDavid du Colombier 226*14414594SDavid du Colombier #endif 227