176404edcSAsim Jamshed #pragma once
276404edcSAsim Jamshed 
376404edcSAsim Jamshed #include <stdio.h>
476404edcSAsim Jamshed #include <stdint.h>
576404edcSAsim Jamshed #include <stdbool.h>
676404edcSAsim Jamshed #include <sys/queue.h>
776404edcSAsim Jamshed #include <memory_mgt.h>
8a834ea89SAsim Jamshed #include "mos_api.h"
976404edcSAsim Jamshed 
1076404edcSAsim Jamshed /* Abstract ring buffer as an infinite but windowed buffer */
1176404edcSAsim Jamshed /* Keep in mind about inc/dec buffer */
1276404edcSAsim Jamshed /* FYI, I hate current tcp ring buffer implementation with memmove() */
1376404edcSAsim Jamshed 
1476404edcSAsim Jamshed #define UNITBUFSIZE 1024
1576404edcSAsim Jamshed #if UNITBUFSIZE < 2
1676404edcSAsim Jamshed #error UNITBUFSIZE cannot be smaller than 2
1776404edcSAsim Jamshed #endif
1876404edcSAsim Jamshed 
1976404edcSAsim Jamshed #define BUFMGMT_FULL    2
2076404edcSAsim Jamshed #define BUFMGMT_FRAGS   1
2176404edcSAsim Jamshed #define BUFMGMT_OFF     0
2276404edcSAsim Jamshed 
2376404edcSAsim Jamshed #define DISABLE_DYN_RESIZE
2476404edcSAsim Jamshed 
25a834ea89SAsim Jamshed #if 0
26a834ea89SAsim Jamshed typedef enum {
27a834ea89SAsim Jamshed 	MOS_OVERLAP_POLICY_FIRST=0,
28a834ea89SAsim Jamshed 	MOS_OVERLAP_POLICY_LAST,
29a834ea89SAsim Jamshed 	MOS_OVERLAP_CNT
30a834ea89SAsim Jamshed } MOS_OVERLAP_POLICY;
31a834ea89SAsim Jamshed #endif
32a834ea89SAsim Jamshed 
3376404edcSAsim Jamshed enum tcprb_mode {
3476404edcSAsim Jamshed 	__RB_NO_FRAG = 1,
3576404edcSAsim Jamshed 	__RB_NO_BUF  = 2,
3676404edcSAsim Jamshed };
3776404edcSAsim Jamshed 
3876404edcSAsim Jamshed typedef int      boff_t; /* buffer offset space */
3976404edcSAsim Jamshed typedef int64_t  loff_t; /* logical offset space */
4076404edcSAsim Jamshed 
4176404edcSAsim Jamshed typedef struct _tcpbufseg_t {
4276404edcSAsim Jamshed 	uint8_t buf[UNITBUFSIZE];
4376404edcSAsim Jamshed 
4476404edcSAsim Jamshed 	int id;
4576404edcSAsim Jamshed 	TAILQ_ENTRY(_tcpbufseg_t) link;
4676404edcSAsim Jamshed } tcpbufseg_t;
4776404edcSAsim Jamshed 
4876404edcSAsim Jamshed typedef struct _tcpfrag_t {
4976404edcSAsim Jamshed 	bool empty;  /* true if this fragment does not have actual data */
5076404edcSAsim Jamshed 
5176404edcSAsim Jamshed 	loff_t head; /* head of this fragment */
5276404edcSAsim Jamshed 	loff_t tail; /* tail of this fragment */
5376404edcSAsim Jamshed 
5476404edcSAsim Jamshed 	TAILQ_ENTRY(_tcpfrag_t) link;
5576404edcSAsim Jamshed } tcpfrag_t;
5676404edcSAsim Jamshed 
5776404edcSAsim Jamshed typedef struct _tcprb_t {
5876404edcSAsim Jamshed 	mem_pool_t mp;
5976404edcSAsim Jamshed 
6076404edcSAsim Jamshed 	unsigned mode:4,
61a834ea89SAsim Jamshed 		buf_mgmt:2,
62a834ea89SAsim Jamshed 		overlap:2;
6376404edcSAsim Jamshed 	int corr;
6476404edcSAsim Jamshed 
6576404edcSAsim Jamshed 	int metalen;
6676404edcSAsim Jamshed 
6776404edcSAsim Jamshed 	TAILQ_HEAD(blist, _tcpbufseg_t) bufsegs;
6876404edcSAsim Jamshed 	int lbufsegs;
6976404edcSAsim Jamshed 	int len;
7076404edcSAsim Jamshed 
7176404edcSAsim Jamshed 	loff_t head; /* head of this window (inf space) */
7276404edcSAsim Jamshed 	loff_t pile; /* maximum head. tcprb_ffhead() cannot move hseq further
7376404edcSAsim Jamshed 					than cseq. (sequence space) */
7476404edcSAsim Jamshed 
7576404edcSAsim Jamshed 	TAILQ_HEAD(flist, _tcpfrag_t) frags;
7676404edcSAsim Jamshed 
7776404edcSAsim Jamshed 	TAILQ_ENTRY(_tcprb_t) link;
7876404edcSAsim Jamshed } tcprb_t;
7976404edcSAsim Jamshed 
8076404edcSAsim Jamshed extern inline tcprb_t *
8176404edcSAsim Jamshed tcprb_new(mem_pool_t mp, int len, unsigned buf_mgmt);
8276404edcSAsim Jamshed 
8376404edcSAsim Jamshed extern inline int
8476404edcSAsim Jamshed tcprb_del(tcprb_t *rb);
8576404edcSAsim Jamshed 
8676404edcSAsim Jamshed extern inline int
8776404edcSAsim Jamshed tcprb_setpile(tcprb_t *rb, loff_t new);
8876404edcSAsim Jamshed 
8976404edcSAsim Jamshed extern inline int
9076404edcSAsim Jamshed tcprb_cflen(tcprb_t *rb);
9176404edcSAsim Jamshed 
9276404edcSAsim Jamshed extern inline int
9376404edcSAsim Jamshed tcprb_resize_meta(tcprb_t *rb, int len);
9476404edcSAsim Jamshed 
9576404edcSAsim Jamshed extern inline int
9676404edcSAsim Jamshed tcprb_resize(tcprb_t *rb, int len);
9776404edcSAsim Jamshed 
9876404edcSAsim Jamshed extern inline int
9976404edcSAsim Jamshed tcprb_ffhead(tcprb_t *rb, int len);
10076404edcSAsim Jamshed 
101*05e3289cSYoungGyoun inline int
102*05e3289cSYoungGyoun tcprb_fflen(tcprb_t *rb, uint8_t *buf, int len, loff_t off);
103*05e3289cSYoungGyoun 
10476404edcSAsim Jamshed extern inline int
10576404edcSAsim Jamshed tcprb_ppeek(tcprb_t *rb, uint8_t *buf, int len, loff_t off);
10676404edcSAsim Jamshed 
10776404edcSAsim Jamshed extern inline int
10876404edcSAsim Jamshed tcprb_pwrite(tcprb_t *rb, uint8_t *buf, int len, loff_t off);
10976404edcSAsim Jamshed 
11076404edcSAsim Jamshed extern inline void
11176404edcSAsim Jamshed tcprb_printfrags(struct _tcprb_t *rb);
11276404edcSAsim Jamshed 
11376404edcSAsim Jamshed extern inline void
11476404edcSAsim Jamshed tcprb_printrb(struct _tcprb_t *rb);
11576404edcSAsim Jamshed 
11676404edcSAsim Jamshed extern inline loff_t
11776404edcSAsim Jamshed seq2loff(tcprb_t *rb, uint32_t seq, uint32_t isn);
118a834ea89SAsim Jamshed 
119a834ea89SAsim Jamshed extern inline void
120a834ea89SAsim Jamshed tcp_rb_overlapchk(mtcp_manager_t mtcp, struct pkt_ctx *pctx,
121a834ea89SAsim Jamshed 		  struct tcp_stream *recvside_stream);
122a834ea89SAsim Jamshed 
123a834ea89SAsim Jamshed extern inline int
124a834ea89SAsim Jamshed tcprb_setpolicy(tcprb_t *rb, uint8_t policy);
125