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