xref: /plan9/sys/src/cmd/ip/ppp/thwack.h (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
17dd7cddfSDavid du Colombier typedef struct Thwack		Thwack;
27dd7cddfSDavid du Colombier typedef struct Unthwack		Unthwack;
37dd7cddfSDavid du Colombier typedef struct ThwBlock		ThwBlock;
47dd7cddfSDavid du Colombier typedef struct UnthwBlock	UnthwBlock;
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier enum
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier 	ThwStats	= 8,
97dd7cddfSDavid du Colombier 	ThwErrLen	= 64,		/* max length of error message from thwack or unthwack */
107dd7cddfSDavid du Colombier 	ThwMaxBlock	= 1600,		/* max size of compressible block */
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	HashLog		= 12,
137dd7cddfSDavid du Colombier 	HashSize	= 1<<HashLog,
147dd7cddfSDavid du Colombier 	HashMask	= HashSize - 1,
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier 	MinMatch	= 3,		/* shortest match possible */
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier 	MaxOff		= 8,
197dd7cddfSDavid du Colombier 	OffBase		= 6,
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier 	MinDecode	= 8,		/* minimum bits to decode a match or lit; >= 8 */
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier 	CompBlocks	= 10,		/* max blocks used to encode data */
24*59cc4ca5SDavid du Colombier 	EWinBlocks	= 64,		/* blocks held in encoder window */
25*59cc4ca5SDavid du Colombier 	DWinBlocks	= EWinBlocks,	/* blocks held in decoder window */
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier 	MaxSeqMask	= 8,		/* number of bits in coding block mask */
287dd7cddfSDavid du Colombier 	MaxSeqStart	= 256		/* max offset of initial coding block */
297dd7cddfSDavid du Colombier };
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier struct ThwBlock
327dd7cddfSDavid du Colombier {
337dd7cddfSDavid du Colombier 	ulong	seq;			/* sequence number for this data */
347dd7cddfSDavid du Colombier 	uchar	acked;			/* ok to use this block; the decoder has it */
357dd7cddfSDavid du Colombier 	ushort	begin;			/* time of first byte in hash */
367dd7cddfSDavid du Colombier 	uchar	*edata;			/* last byte of valid data */
377dd7cddfSDavid du Colombier 	ushort	maxoff;			/* time of last valid hash entry */
387dd7cddfSDavid du Colombier 	ushort	*hash;
397dd7cddfSDavid du Colombier 	uchar	*data;
407dd7cddfSDavid du Colombier };
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier struct Thwack
437dd7cddfSDavid du Colombier {
447dd7cddfSDavid du Colombier 	QLock		acklock;	/* locks slot, blocks[].(acked|seq) */
457dd7cddfSDavid du Colombier 	int		slot;		/* next block to use */
467dd7cddfSDavid du Colombier 	ThwBlock	blocks[EWinBlocks];
477dd7cddfSDavid du Colombier 	ushort		hash[EWinBlocks][HashSize];
487dd7cddfSDavid du Colombier 	Block		*data[EWinBlocks];
497dd7cddfSDavid du Colombier };
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier struct UnthwBlock
527dd7cddfSDavid du Colombier {
537dd7cddfSDavid du Colombier 	ulong	seq;			/* sequence number for this data */
547dd7cddfSDavid du Colombier 	ushort	maxoff;			/* valid data in each block */
557dd7cddfSDavid du Colombier 	uchar	*data;
567dd7cddfSDavid du Colombier };
577dd7cddfSDavid du Colombier 
587dd7cddfSDavid du Colombier struct Unthwack
597dd7cddfSDavid du Colombier {
607dd7cddfSDavid du Colombier 	int		slot;		/* next block to use */
61*59cc4ca5SDavid du Colombier 	char		err[ThwErrLen];
627dd7cddfSDavid du Colombier 	UnthwBlock	blocks[DWinBlocks];
637dd7cddfSDavid du Colombier 	uchar		data[DWinBlocks][ThwMaxBlock];
647dd7cddfSDavid du Colombier };
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier void	thwackinit(Thwack*);
677dd7cddfSDavid du Colombier void	thwackcleanup(Thwack *tw);
687dd7cddfSDavid du Colombier void	unthwackinit(Unthwack*);
69*59cc4ca5SDavid du Colombier int	thwack(Thwack*, int mustadd, uchar *dst, int ndst, Block *bsrc, ulong seq, ulong stats[ThwStats]);
707dd7cddfSDavid du Colombier void	thwackack(Thwack*, ulong seq, ulong mask);
717dd7cddfSDavid du Colombier int	unthwack(Unthwack*, uchar *dst, int ndst, uchar *src, int nsrc, ulong seq);
727dd7cddfSDavid du Colombier ulong	unthwackstate(Unthwack *ut, uchar *mask);
73*59cc4ca5SDavid du Colombier int	unthwackadd(Unthwack *ut, uchar *src, int nsrc, ulong seq);
74