1#ifndef __tailq_hash__
 2#define __tailq_hash__
 3
 4/* Must be powers of 2 */
 5#define MAX_HASH_ENTRIES 128
 6#define SEQ_BUCKET_SIZE 262144
 7/*
 8 * The max seq range that can be stored is
 9 * 64 x 262144 or 16Meg. We have one extra slot
10 * for fall-over but must keep it so we never have
11 * wrap in hashing over valid other entries.
12 */
13#define MAX_ALLOWED_SEQ_RANGE (SEQ_BUCKET_SIZE * (MAX_HASH_ENTRIES-1))
14
15struct tailq_hash {
16	struct rack_head ht[MAX_HASH_ENTRIES];
17	uint32_t min;
18	uint32_t max;
19	uint32_t count;
20};
21
22struct rack_sendmap *
23tqhash_min(struct tailq_hash *hs);
24
25struct rack_sendmap *
26tqhash_max(struct tailq_hash *hs);
27
28int
29tqhash_empty(struct tailq_hash *hs);
30
31struct rack_sendmap *
32tqhash_find(struct tailq_hash *hs, uint32_t seq);
33
34struct rack_sendmap *
35tqhash_next(struct tailq_hash *hs, struct rack_sendmap *rsm);
36
37struct rack_sendmap *
38tqhash_prev(struct tailq_hash *hs, struct rack_sendmap *rsm);
39
40#define REMOVE_TYPE_CUMACK	1	/* Cumack moved */
41#define REMOVE_TYPE_MERGE	2	/* Merging two blocks */
42#define REMOVE_TYPE_FINI	3	/* The connection is over */
43
44void
45tqhash_remove(struct tailq_hash *hs, struct rack_sendmap *rsm, int type);
46
47int
48tqhash_insert(struct tailq_hash *hs, struct rack_sendmap *rsm);
49
50void
51tqhash_init(struct tailq_hash *hs);
52
53int
54tqhash_trim(struct tailq_hash *hs, uint32_t th_ack);
55
56
57#define	TQHASH_FOREACH(var, head) \
58	for ((var) = tqhash_min((head));		\
59	     (var);					\
60	     (var) = tqhash_next((head), (var)))
61
62#define TQHASH_FOREACH_FROM(var, head, fvar)					\
63	for ((var) = ((fvar) ? (fvar) : tqhash_min((head)));		\
64	    (var);							\
65	     (var) = tqhash_next((head), (var)))
66
67#define	TQHASH_FOREACH_REVERSE_FROM(var, head)		\
68	for ((var) = ((var) ? (var) : tqhash_max((head)));		\
69	    (var);							\
70	    (var) = tqhash_prev((head), (var)))
71
72
73#endif