1*76404edcSAsim Jamshed 2*76404edcSAsim Jamshed /* 3*76404edcSAsim Jamshed * 2010.12.10 Shinae Woo 4*76404edcSAsim Jamshed * Ring buffer structure for managing dynamically allocating ring buffer 5*76404edcSAsim Jamshed * 6*76404edcSAsim Jamshed * put data to the tail 7*76404edcSAsim Jamshed * get/pop/remove data from the head 8*76404edcSAsim Jamshed * 9*76404edcSAsim Jamshed * always garantee physically continuous ready in-memory data from data_offset to the data_offset+len 10*76404edcSAsim Jamshed * automatically increase total buffer size when buffer is full 11*76404edcSAsim Jamshed * for efficiently managing packet payload and chunking 12*76404edcSAsim Jamshed * 13*76404edcSAsim Jamshed */ 14*76404edcSAsim Jamshed 15*76404edcSAsim Jamshed #ifndef __MOS_RING_BUFFER_ 16*76404edcSAsim Jamshed #define __MOS_RING_BUFFER_ 17*76404edcSAsim Jamshed 18*76404edcSAsim Jamshed #include <stdint.h> 19*76404edcSAsim Jamshed #include <sys/types.h> 20*76404edcSAsim Jamshed 21*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 22*76404edcSAsim Jamshed enum rb_caller 23*76404edcSAsim Jamshed { 24*76404edcSAsim Jamshed AT_APP, 25*76404edcSAsim Jamshed AT_MTCP 26*76404edcSAsim Jamshed }; 27*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 28*76404edcSAsim Jamshed struct tcp_stream; 29*76404edcSAsim Jamshed typedef struct rb_manager* rb_manager_t; 30*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 31*76404edcSAsim Jamshed struct fragment_ctx 32*76404edcSAsim Jamshed { 33*76404edcSAsim Jamshed uint32_t seq; 34*76404edcSAsim Jamshed uint32_t len : 31, 35*76404edcSAsim Jamshed is_calloc : 1; 36*76404edcSAsim Jamshed struct fragment_ctx *next; 37*76404edcSAsim Jamshed }; 38*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 39*76404edcSAsim Jamshed struct tcp_ring_buffer 40*76404edcSAsim Jamshed { 41*76404edcSAsim Jamshed u_char* data; /* buffered data */ 42*76404edcSAsim Jamshed u_char* head; /* pointer to the head */ 43*76404edcSAsim Jamshed 44*76404edcSAsim Jamshed uint32_t head_offset; /* offset for the head (head - data) */ 45*76404edcSAsim Jamshed uint32_t tail_offset; /* offset fot the last byte (null byte) */ 46*76404edcSAsim Jamshed /* 47*76404edcSAsim Jamshed * offset that points to the tail-end of the monitoring stream offset. 48*76404edcSAsim Jamshed */ 49*76404edcSAsim Jamshed uint32_t monitor_read_tail_offset; 50*76404edcSAsim Jamshed 51*76404edcSAsim Jamshed int merged_len; /* contiguously merged length */ 52*76404edcSAsim Jamshed uint64_t cum_len; /* cummulatively merged length */ 53*76404edcSAsim Jamshed int last_len; /* currently saved data length */ 54*76404edcSAsim Jamshed int size; /* total ring buffer size */ 55*76404edcSAsim Jamshed 56*76404edcSAsim Jamshed /* TCP payload features */ 57*76404edcSAsim Jamshed uint32_t head_seq; 58*76404edcSAsim Jamshed uint32_t init_seq; 59*76404edcSAsim Jamshed 60*76404edcSAsim Jamshed struct fragment_ctx* fctx; 61*76404edcSAsim Jamshed }; 62*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 63*76404edcSAsim Jamshed uint32_t RBGetCurnum(rb_manager_t rbm); 64*76404edcSAsim Jamshed void RBPrintInfo(struct tcp_ring_buffer* buff); 65*76404edcSAsim Jamshed void RBPrintStr(struct tcp_ring_buffer* buff); 66*76404edcSAsim Jamshed void RBPrintHex(struct tcp_ring_buffer* buff); 67*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 68*76404edcSAsim Jamshed rb_manager_t RBManagerCreate(size_t chunk_size, uint8_t disable_rings, uint32_t concurrency); 69*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 70*76404edcSAsim Jamshed struct tcp_ring_buffer* RBInit(rb_manager_t rbm, uint32_t init_seq, uint8_t buffer_mgmt); 71*76404edcSAsim Jamshed void RBFree(rb_manager_t rbm, struct tcp_ring_buffer* buff, uint8_t buffer_mgmt); 72*76404edcSAsim Jamshed uint32_t RBIsDanger(rb_manager_t rbm); 73*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 74*76404edcSAsim Jamshed /* data manupulation functions */ 75*76404edcSAsim Jamshed int RBPut(rb_manager_t rbm, struct tcp_stream *cur_stream, void *data, 76*76404edcSAsim Jamshed uint32_t len, uint32_t seq); 77*76404edcSAsim Jamshed size_t RBGet(rb_manager_t rbm, struct tcp_ring_buffer* buff, size_t len); 78*76404edcSAsim Jamshed size_t RBRemove(rb_manager_t rbm, struct tcp_ring_buffer* buff, 79*76404edcSAsim Jamshed size_t len, int option, uint8_t buffer_mgmt); 80*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 81*76404edcSAsim Jamshed extern inline int 82*76404edcSAsim Jamshed RBDoesOverlap(rb_manager_t rbm, struct tcp_ring_buffer *rcvbuf, 83*76404edcSAsim Jamshed uint32_t cur_seq, uint32_t len); 84*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 85*76404edcSAsim Jamshed 86*76404edcSAsim Jamshed #endif /* !MOS_RING_BUFFER */ 87