4 /* Must be powers of 2 */
5 #define MAX_HASH_ENTRIES 128
6 #define SEQ_BUCKET_SIZE 262144
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.
13 #define MAX_ALLOWED_SEQ_RANGE (SEQ_BUCKET_SIZE * (MAX_HASH_ENTRIES-1))
19 struct rack_sendmap
*rsm_min
;
20 struct rack_sendmap
*rsm_max
;
21 struct rack_head ht
[MAX_HASH_ENTRIES
];
25 tqhash_min(struct tailq_hash
*hs
);
28 tqhash_max(struct tailq_hash
*hs
);
31 tqhash_empty(struct tailq_hash
*hs
);
34 tqhash_find(struct tailq_hash
*hs
, uint32_t seq
);
37 tqhash_next(struct tailq_hash
*hs
, struct rack_sendmap
*rsm
);
40 tqhash_prev(struct tailq_hash
*hs
, struct rack_sendmap
*rsm
);
42 #define REMOVE_TYPE_CUMACK 1 /* Cumack moved */
43 #define REMOVE_TYPE_MERGE 2 /* Merging two blocks */
44 #define REMOVE_TYPE_FINI 3 /* The connection is over */
47 tqhash_remove(struct tailq_hash
*hs
, struct rack_sendmap
*rsm
, int type
);
50 tqhash_insert(struct tailq_hash
*hs
, struct rack_sendmap
*rsm
);
53 tqhash_init(struct tailq_hash
*hs
);
56 tqhash_trim(struct tailq_hash
*hs
, uint32_t th_ack
);
59 tqhash_update_end(struct tailq_hash
*hs
, struct rack_sendmap
*rsm
,
63 #define TQHASH_FOREACH(var, head) \
64 for ((var) = tqhash_min((head)); \
66 (var) = tqhash_next((head), (var)))
68 #define TQHASH_FOREACH_FROM(var, head, fvar) \
69 for ((var) = ((fvar) ? (fvar) : tqhash_min((head))); \
71 (var) = tqhash_next((head), (var)))
73 #define TQHASH_FOREACH_REVERSE_FROM(var, head) \
74 for ((var) = ((var) ? (var) : tqhash_max((head))); \
76 (var) = tqhash_prev((head), (var)))