1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */ 25392f7a3SLiteSpeed Tech/* 35392f7a3SLiteSpeed Tech * lsquic_frab_list.h -- List of buffer for simple reading and writing 45392f7a3SLiteSpeed Tech * 55392f7a3SLiteSpeed Tech * Useful for buffering data that cannot be packetized immediately. 65392f7a3SLiteSpeed Tech */ 75392f7a3SLiteSpeed Tech 85392f7a3SLiteSpeed Tech#ifndef LSQUIC_FRAB_LIST_H 95392f7a3SLiteSpeed Tech#define LSQUIC_FRAB_LIST_H 1 105392f7a3SLiteSpeed Tech 115392f7a3SLiteSpeed Techstruct frame_buf 125392f7a3SLiteSpeed Tech{ 135392f7a3SLiteSpeed Tech TAILQ_ENTRY(frame_buf) frab_next; 145392f7a3SLiteSpeed Tech unsigned short frab_size, 155392f7a3SLiteSpeed Tech frab_off, 165392f7a3SLiteSpeed Tech frab_buf_size; /* Total bytes in frab_buf */ 175392f7a3SLiteSpeed Tech unsigned char frab_buf[0]; 185392f7a3SLiteSpeed Tech}; 195392f7a3SLiteSpeed Tech 205392f7a3SLiteSpeed Tech#define frab_left_to_read(f) ((f)->frab_size - (f)->frab_off) 215392f7a3SLiteSpeed Tech#define frab_left_to_write(f) ((f)->frab_buf_size - \ 225392f7a3SLiteSpeed Tech (unsigned short) sizeof(*(f)) - (f)->frab_size) 235392f7a3SLiteSpeed Tech#define frab_write_to(f) ((f)->frab_buf + (f)->frab_size) 245392f7a3SLiteSpeed Tech 255392f7a3SLiteSpeed TechTAILQ_HEAD(frame_buf_head, frame_buf); 265392f7a3SLiteSpeed Tech 275392f7a3SLiteSpeed Techstruct frab_list 285392f7a3SLiteSpeed Tech{ 295392f7a3SLiteSpeed Tech struct frame_buf_head fl_frabs; 305392f7a3SLiteSpeed Tech void * (*fl_alloc)(void *alloc_ctx, size_t size); 315392f7a3SLiteSpeed Tech void (*fl_free)(void *alloc_ctx, void *obj); 325392f7a3SLiteSpeed Tech void *fl_alloc_ctx; 335392f7a3SLiteSpeed Tech size_t fl_size; /* Size of payload in frab_list */ 345392f7a3SLiteSpeed Tech unsigned short fl_buf_size; /* Size of frame_buf */ 355392f7a3SLiteSpeed Tech}; 365392f7a3SLiteSpeed Tech 375392f7a3SLiteSpeed Techvoid 385392f7a3SLiteSpeed Techlsquic_frab_list_init (struct frab_list *, unsigned short buf_size, 395392f7a3SLiteSpeed Tech void * (*fl_alloc)(void *alloc_ctx, size_t size), 405392f7a3SLiteSpeed Tech void (*fl_free)(void *alloc_ctx, void *obj), void *fl_alloc_ctx); 415392f7a3SLiteSpeed Tech 425392f7a3SLiteSpeed Techvoid 435392f7a3SLiteSpeed Techlsquic_frab_list_cleanup (struct frab_list *); 445392f7a3SLiteSpeed Tech 455392f7a3SLiteSpeed Techint 465392f7a3SLiteSpeed Techlsquic_frab_list_write (struct frab_list *, const void *, size_t); 475392f7a3SLiteSpeed Tech 485392f7a3SLiteSpeed Techsize_t 495392f7a3SLiteSpeed Techlsquic_frab_list_size (void *); 505392f7a3SLiteSpeed Tech 515392f7a3SLiteSpeed Techsize_t 525392f7a3SLiteSpeed Techlsquic_frab_list_read (void *, void *, size_t); 535392f7a3SLiteSpeed Tech 545392f7a3SLiteSpeed Tech#define lsquic_frab_list_empty(fral) TAILQ_EMPTY(&(fral)->fl_frabs) 555392f7a3SLiteSpeed Tech 565392f7a3SLiteSpeed Techsize_t 575392f7a3SLiteSpeed Techlsquic_frab_list_mem_used (const struct frab_list *); 585392f7a3SLiteSpeed Tech 595392f7a3SLiteSpeed Tech#endif 60