lsquic_frab_list.h revision 06b2a236
1/* Copyright (c) 2017 - 2021 LiteSpeed Technologies Inc.  See LICENSE. */
2/*
3 * lsquic_frab_list.h -- List of buffer for simple reading and writing
4 *
5 * Useful for buffering data that cannot be packetized immediately.
6 */
7
8#ifndef LSQUIC_FRAB_LIST_H
9#define LSQUIC_FRAB_LIST_H 1
10
11struct frame_buf
12{
13    TAILQ_ENTRY(frame_buf)  frab_next;
14    unsigned short          frab_size,
15                            frab_off,
16                            frab_buf_size;  /* Total bytes in frab_buf */
17    unsigned char           frab_buf[0];
18};
19
20#define frab_left_to_read(f) ((f)->frab_size - (f)->frab_off)
21#define frab_left_to_write(f) ((f)->frab_buf_size - \
22                        (unsigned short) sizeof(*(f)) - (f)->frab_size)
23#define frab_write_to(f) ((f)->frab_buf + (f)->frab_size)
24
25TAILQ_HEAD(frame_buf_head, frame_buf);
26
27struct frab_list
28{
29    struct frame_buf_head   fl_frabs;
30    void *                (*fl_alloc)(void *alloc_ctx, size_t size);
31    void                  (*fl_free)(void *alloc_ctx, void *obj);
32    void                   *fl_alloc_ctx;
33    size_t                  fl_size;        /* Size of payload in frab_list */
34    unsigned short          fl_buf_size;    /* Size of frame_buf */
35};
36
37void
38lsquic_frab_list_init (struct frab_list *, unsigned short buf_size,
39    void * (*fl_alloc)(void *alloc_ctx, size_t size),
40    void (*fl_free)(void *alloc_ctx, void *obj), void *fl_alloc_ctx);
41
42void
43lsquic_frab_list_cleanup (struct frab_list *);
44
45int
46lsquic_frab_list_write (struct frab_list *, const void *, size_t);
47
48size_t
49lsquic_frab_list_size (void *);
50
51size_t
52lsquic_frab_list_read (void *, void *, size_t);
53
54#define lsquic_frab_list_empty(fral) TAILQ_EMPTY(&(fral)->fl_frabs)
55
56size_t
57lsquic_frab_list_mem_used (const struct frab_list *);
58
59#endif
60