]> git.lizzy.rs Git - plan9front.git/blob - sys/include/venti.h
snoopy(8): avoid extra spaces in dhcp filter output
[plan9front.git] / sys / include / venti.h
1 #pragma lib "libventi.a"
2 #pragma src "/sys/src/libventi"
3
4
5 /* XXX should be own library? */
6 /*
7  * Packets
8  */
9 enum
10 {
11         MaxFragSize = 9*1024
12 };
13
14 typedef struct Packet Packet;
15 #pragma incomplete Packet
16
17 Packet* packetalloc(void);
18 void    packetappend(Packet*, uchar *buf, int n);
19 uint    packetasize(Packet*);
20 int     packetcmp(Packet*, Packet*);
21 int     packetcompact(Packet*);
22 void    packetconcat(Packet*, Packet*);
23 int     packetconsume(Packet*, uchar *buf, int n);
24 int     packetcopy(Packet*, uchar *buf, int offset, int n);
25 Packet* packetdup(Packet*, int offset, int n);
26 Packet* packetforeign(uchar *buf, int n, void (*free)(void *a), void *a);
27 int     packetfragments(Packet*, IOchunk*, int nio, int offset);
28 void    packetfree(Packet*);
29 uchar*  packetheader(Packet*, int n);
30 uchar*  packetpeek(Packet*, uchar *buf, int offset, int n);
31 void    packetprefix(Packet*, uchar *buf, int n);
32 void    packetsha1(Packet*, uchar sha1[20]);
33 uint    packetsize(Packet*);
34 Packet* packetsplit(Packet*, int n);
35 void    packetstats(void);
36 uchar*  packettrailer(Packet*, int n);
37 int     packettrim(Packet*, int offset, int n);
38
39 /* XXX should be own library? */
40 /*
41  * Logging
42  */
43 typedef struct VtLog VtLog;
44 typedef struct VtLogChunk VtLogChunk;
45
46 struct VtLog
47 {
48         VtLog   *next;          /* in hash table */
49         char    *name;
50         VtLogChunk *chunk;
51         uint    nchunk;
52         VtLogChunk *w;
53         QLock   lk;
54         int     ref;
55 };
56
57 struct VtLogChunk
58 {
59         char    *p;
60         char    *ep;
61         char    *wp;
62 };
63
64 VtLog*  vtlogopen(char *name, uint size);
65 void    vtlogprint(VtLog *log, char *fmt, ...);
66 void    vtlog(char *name, char *fmt, ...);
67 void    vtlogclose(VtLog*);
68 void    vtlogremove(char *name);
69 char**  vtlognames(int*);
70 void    vtlogdump(int fd, VtLog*);
71
72 /* XXX begin actual venti.h */
73
74 typedef struct VtFcall VtFcall;
75 typedef struct VtConn VtConn;
76 typedef struct VtEntry VtEntry;
77 typedef struct VtRoot VtRoot;
78
79 /*
80  * Fundamental constants.
81  */
82 enum
83 {
84         VtScoreSize     = 20,
85         VtMaxStringSize = 1024,
86         VtMaxLumpSize   = 56*1024,
87         VtPointerDepth  = 7
88 };
89 #define VtMaxFileSize ((1ULL<<48)-1)
90
91
92 /* 
93  * Strings in packets.
94  */
95 int vtputstring(Packet*, char*);
96 int vtgetstring(Packet*, char**);
97
98 /*
99  * Block types.
100  * 
101  * The initial Venti protocol had a much
102  * less regular list of block types.
103  * VtToDiskType converts from new to old.
104  */
105 enum
106 {
107         VtDataType      = 0<<3,
108         /* VtDataType+1, ... */
109         VtDirType       = 1<<3,
110         /* VtDirType+1, ... */
111         VtRootType      = 2<<3,
112         VtMaxType,
113         VtCorruptType = 0xFF,
114
115         VtTypeDepthMask = 7,
116         VtTypeBaseMask = ~VtTypeDepthMask
117 };
118
119 /* convert to/from on-disk type numbers */
120 uint vttodisktype(uint);
121 uint vtfromdisktype(uint);
122
123 /*
124  * VtEntry describes a Venti stream
125  *
126  * The _ enums are only used on the wire.
127  * They are not present in the VtEntry structure
128  * and should not be used by client programs.
129  * (The info is in the type field.)
130  */
131 enum
132 {
133         VtEntryActive = 1<<0,           /* entry is in use */
134         _VtEntryDir = 1<<1,             /* a directory */
135         _VtEntryDepthShift = 2,         /* shift for pointer depth */
136         _VtEntryDepthMask = 7<<2,       /* mask for pointer depth */
137         VtEntryLocal = 1<<5             /* for local storage only */
138 };
139 enum
140 {
141         VtEntrySize = 40
142 };
143 struct VtEntry
144 {
145         ulong   gen;                    /* generation number */
146         ushort  psize;                  /* pointer block size */
147         ushort  dsize;                  /* data block size */
148         uchar   type;
149         uchar   flags;
150         uvlong  size;
151         uchar   score[VtScoreSize];
152 };
153
154 void vtentrypack(VtEntry*, uchar*, int index);
155 int vtentryunpack(VtEntry*, uchar*, int index);
156
157 struct VtRoot
158 {
159         char    name[128];
160         char    type[128];
161         uchar   score[VtScoreSize];     /* to a Dir block */
162         ushort  blocksize;              /* maximum block size */
163         uchar   prev[VtScoreSize];      /* last root block */
164 };
165
166 enum
167 {
168         VtRootSize = 300,
169         VtRootVersion = 2
170 };
171
172 void vtrootpack(VtRoot*, uchar*);
173 int vtrootunpack(VtRoot*, uchar*);
174
175 /*
176  * score of zero length block
177  */
178 extern uchar vtzeroscore[VtScoreSize];
179
180 /*
181  * zero extend and truncate blocks
182  */
183 void vtzeroextend(int type, uchar *buf, uint n, uint nn);
184 uint vtzerotruncate(int type, uchar *buf, uint n);
185
186 /*
187  * parse score: mungs s
188  */
189 int vtparsescore(char *s, char **prefix, uchar[VtScoreSize]);
190
191 /*
192  * formatting
193  * other than noted, these formats all ignore
194  * the width and precision arguments, and all flags
195  *
196  * V    a venti score
197  */
198 #pragma varargck        type    "V"     uchar*
199 #pragma varargck        type    "F"     VtFcall*
200 #pragma varargck        type    "T"     void
201 #pragma varargck        type    "lT"    void
202
203 int vtscorefmt(Fmt*);
204
205 /*
206  * error-checking malloc et al.
207  */
208 void    vtfree(void *);
209 void*   vtmalloc(int);
210 void*   vtmallocz(int);
211 void*   vtrealloc(void *p, int);
212 void*   vtbrk(int n);
213 char*   vtstrdup(char *);
214
215 /*
216  * Venti protocol
217  */
218
219 /*
220  * Crypto strengths
221  */
222 enum
223 {
224         VtCryptoStrengthNone,
225         VtCryptoStrengthAuth,
226         VtCryptoStrengthWeak,
227         VtCryptoStrengthStrong
228 };
229
230 /*
231  * Crypto suites
232  */
233 enum
234 {
235         VtCryptoNone,
236         VtCryptoSSL3,
237         VtCryptoTLS1,
238         VtCryptoMax
239 };
240
241 /* 
242  * Codecs
243  */
244 enum
245 {
246         VtCodecNone,
247         VtCodecDeflate,
248         VtCodecThwack,
249         VtCodecMax
250 };
251
252 enum
253 {
254         VtRerror        = 1,
255         VtTping         = 2,
256         VtRping,
257         VtThello        = 4,
258         VtRhello,
259         VtTgoodbye      = 6,
260         VtRgoodbye,     /* not used */
261         VtTauth0        = 8,
262         VtRauth0,
263         VtTauth1        = 10,
264         VtRauth1,
265         VtTread         = 12,
266         VtRread,
267         VtTwrite        = 14,
268         VtRwrite,
269         VtTsync         = 16,
270         VtRsync,
271
272         VtTmax
273 };
274
275 struct VtFcall
276 {
277         uchar   msgtype;
278         uchar   tag;
279
280         char    *error;         /* Rerror */
281
282         char    *version;       /* Thello */
283         char    *uid;           /* Thello */
284         uchar   strength;       /* Thello */
285         uchar   *crypto;        /* Thello */
286         uint    ncrypto;        /* Thello */
287         uchar   *codec;         /* Thello */
288         uint    ncodec;         /* Thello */
289         char    *sid;           /* Rhello */
290         uchar   rcrypto;        /* Rhello */
291         uchar   rcodec;         /* Rhello */
292         uchar   *auth;          /* TauthX, RauthX */
293         uint    nauth;          /* TauthX, RauthX */
294         uchar   score[VtScoreSize];     /* Tread, Rwrite */
295         uchar   blocktype;      /* Tread, Twrite */
296         ushort  count;          /* Tread */
297         Packet  *data;          /* Rread, Twrite */
298 };
299
300 Packet* vtfcallpack(VtFcall*);
301 int     vtfcallunpack(VtFcall*, Packet*);
302 void    vtfcallclear(VtFcall*);
303 int     vtfcallfmt(Fmt*);
304
305 enum
306 {
307         VtStateAlloc,
308         VtStateConnected,
309         VtStateClosed
310 };
311
312 struct VtConn
313 {
314         QLock   lk;
315         QLock   inlk;
316         QLock   outlk;
317         int     debug;
318         int     infd;
319         int     outfd;
320         int     muxer;
321         void    *writeq;
322         void    *readq;
323         int     state;
324         void    *wait[256];
325         uint    ntag;
326         uint    nsleep;
327         Packet  *part;
328         Rendez  tagrend;
329         Rendez  rpcfork;
330         char    *version;
331         char    *uid;
332         char    *sid;
333         char    addr[256];      /* address of other side */
334 };
335
336 VtConn* vtconn(int infd, int outfd);
337 VtConn* vtdial(char*);
338 void    vtfreeconn(VtConn*);
339 int     vtsend(VtConn*, Packet*);
340 Packet* vtrecv(VtConn*);
341 int     vtversion(VtConn* z);
342 void    vtdebug(VtConn* z, char*, ...);
343 void    vthangup(VtConn* z);
344 int     vtgoodbye(VtConn* z);
345
346 /* #pragma varargck argpos vtdebug 2 */
347
348 /* server */
349 typedef struct VtSrv VtSrv;
350 #pragma incomplete VtSrv
351 typedef struct VtReq VtReq;
352 struct VtReq
353 {
354         VtFcall tx;
355         VtFcall rx;
356 /* private */
357         VtSrv   *srv;
358         void    *sc;
359 };
360
361 int     vtsrvhello(VtConn*);
362 VtSrv*  vtlisten(char *addr);
363 VtReq*  vtgetreq(VtSrv*);
364 void    vtrespond(VtReq*);
365
366 /* client */
367 Packet* vtrpc(VtConn*, Packet*);
368 Packet* _vtrpc(VtConn*, Packet*, VtFcall*);
369 void    vtrecvproc(void*);      /* VtConn */
370 void    vtsendproc(void*);      /* VtConn */
371
372 int     vtconnect(VtConn*);
373 int     vthello(VtConn*);
374 int     vtread(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
375 int     vtwrite(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
376 Packet* vtreadpacket(VtConn*, uchar score[VtScoreSize], uint type, int n);
377 int     vtwritepacket(VtConn*, uchar score[VtScoreSize], uint type, Packet *p);
378 int     vtsync(VtConn*);
379 int     vtping(VtConn*);
380
381 /*
382  * Data blocks and block cache.
383  */
384 enum
385 {
386         NilBlock = ~0
387 };
388
389 typedef struct VtBlock VtBlock;
390 typedef struct VtCache VtCache;
391 #pragma incomplete VtCache
392
393 struct VtBlock
394 {
395         VtCache *c;
396         QLock   lk;
397
398         uchar   *data;
399         uchar   score[VtScoreSize];
400         uchar   type;                   /* BtXXX */
401
402         /* internal to cache */
403         int     nlock;
404         int     iostate;
405         int     ref;
406         u32int  heap;
407         VtBlock *next;
408         VtBlock **prev;
409         u32int  used;
410         u32int  used2;
411         u32int  addr;
412         uintptr pc;
413 };
414
415 u32int  vtglobaltolocal(uchar[VtScoreSize]);
416 void    vtlocaltoglobal(u32int, uchar[VtScoreSize]);
417
418 VtCache*vtcachealloc(VtConn*, int blocksize, ulong nblocks);
419 void    vtcachefree(VtCache*);
420 VtBlock*vtcachelocal(VtCache*, u32int addr, int type);
421 VtBlock*vtcacheglobal(VtCache*, uchar[VtScoreSize], int type);
422 VtBlock*vtcacheallocblock(VtCache*, int type);
423 void    vtcachesetwrite(VtCache*,
424         int(*)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
425 void    vtblockput(VtBlock*);
426 u32int  vtcacheblocksize(VtCache*);
427 int     vtblockwrite(VtBlock*);
428 VtBlock*vtblockcopy(VtBlock*);
429 void    vtblockduplock(VtBlock*);
430
431 extern int vtcachencopy, vtcachenread, vtcachenwrite;
432 extern int vttracelevel;
433
434 /*
435  * Hash tree file tree.
436  */
437 typedef struct VtFile VtFile;
438 struct VtFile
439 {
440         QLock   lk;
441         int     ref;
442         int     local;
443         VtBlock *b;                     /* block containing this file */
444         uchar   score[VtScoreSize];     /* score of block containing this file */
445
446 /* immutable */
447         VtCache *c;
448         int     mode;
449         u32int  gen;
450         int     dsize;
451         int     psize;
452         int     dir;
453         VtFile  *parent;
454         int     epb;                    /* entries per block in parent */
455         u32int  offset;                 /* entry offset in parent */
456 };
457
458 enum
459 {
460         VtOREAD,
461         VtOWRITE,
462         VtORDWR
463 };
464
465 VtBlock*vtfileblock(VtFile*, u32int, int mode);
466 int     vtfileblockscore(VtFile*, u32int, uchar[VtScoreSize]);
467 void    vtfileclose(VtFile*);
468 VtFile* _vtfilecreate(VtFile*, int offset, int psize, int dsize, int dir);
469 VtFile* vtfilecreate(VtFile*, int psize, int dsize, int dir);
470 VtFile* vtfilecreateroot(VtCache*, int psize, int dsize, int type);
471 int     vtfileflush(VtFile*);
472 int     vtfileflushbefore(VtFile*, u64int);
473 u32int  vtfilegetdirsize(VtFile*);
474 int     vtfilegetentry(VtFile*, VtEntry*);
475 uvlong  vtfilegetsize(VtFile*);
476 void    vtfileincref(VtFile*);
477 int     vtfilelock2(VtFile*, VtFile*, int);
478 int     vtfilelock(VtFile*, int);
479 VtFile* vtfileopen(VtFile*, u32int, int);
480 VtFile* vtfileopenroot(VtCache*, VtEntry*);
481 long    vtfileread(VtFile*, void*, long, vlong);
482 int     vtfileremove(VtFile*);
483 int     vtfilesetdirsize(VtFile*, u32int);
484 int     vtfilesetentry(VtFile*, VtEntry*);
485 int     vtfilesetsize(VtFile*, u64int);
486 int     vtfiletruncate(VtFile*);
487 void    vtfileunlock(VtFile*);
488 long    vtfilewrite(VtFile*, void*, long, vlong);
489
490 int     vttimefmt(Fmt*);
491
492 extern int chattyventi;
493 extern int ventidoublechecksha1;
494 extern int ventilogging;
495
496 extern char *VtServerLog;