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