176404edcSAsim Jamshed #ifndef __MTCP_H_ 276404edcSAsim Jamshed #define __MTCP_H_ 376404edcSAsim Jamshed 476404edcSAsim Jamshed #include <stdio.h> 576404edcSAsim Jamshed #include <stdlib.h> 676404edcSAsim Jamshed #include <sys/time.h> 776404edcSAsim Jamshed #include <sys/queue.h> 876404edcSAsim Jamshed #include <pthread.h> 976404edcSAsim Jamshed 1076404edcSAsim Jamshed #include "memory_mgt.h" 1176404edcSAsim Jamshed #include "tcp_ring_buffer.h" 1276404edcSAsim Jamshed #include "tcp_send_buffer.h" 1376404edcSAsim Jamshed #include "tcp_stream_queue.h" 1476404edcSAsim Jamshed #include "socket.h" 1576404edcSAsim Jamshed #include "mtcp_api.h" 1676404edcSAsim Jamshed #include "eventpoll.h" 1776404edcSAsim Jamshed #include "addr_pool.h" 1876404edcSAsim Jamshed #include "logger.h" 1976404edcSAsim Jamshed #include "stat.h" 2076404edcSAsim Jamshed #include "io_module.h" 2176404edcSAsim Jamshed #include "key_value_store.h" 2276404edcSAsim Jamshed 2376404edcSAsim Jamshed #ifndef TRUE 2476404edcSAsim Jamshed #define TRUE (1) 2576404edcSAsim Jamshed #endif 2676404edcSAsim Jamshed 2776404edcSAsim Jamshed #ifndef FALSE 2876404edcSAsim Jamshed #define FALSE (0) 2976404edcSAsim Jamshed #endif 3076404edcSAsim Jamshed 3176404edcSAsim Jamshed #ifndef ERROR 3276404edcSAsim Jamshed #define ERROR (-1) 3376404edcSAsim Jamshed #endif 3476404edcSAsim Jamshed 3576404edcSAsim Jamshed #ifndef likely 3676404edcSAsim Jamshed #define likely(x) __builtin_expect((x),1) 3776404edcSAsim Jamshed #endif 3876404edcSAsim Jamshed #ifndef unlikely 3976404edcSAsim Jamshed #define unlikely(x) __builtin_expect((x),0) 4076404edcSAsim Jamshed #endif 4176404edcSAsim Jamshed 4276404edcSAsim Jamshed #ifdef ENABLE_DEBUG_EVENT 4376404edcSAsim Jamshed #define DBG_BUF_LEN 2048 4476404edcSAsim Jamshed #endif 4576404edcSAsim Jamshed 461c9bc629SAsim Jamshed #ifndef MAX_CPUS 4776404edcSAsim Jamshed #define MAX_CPUS 16 481c9bc629SAsim Jamshed #endif 4976404edcSAsim Jamshed 50a834ea89SAsim Jamshed /* 51a834ea89SAsim Jamshed * Ethernet frame overhead 52a834ea89SAsim Jamshed */ 53a834ea89SAsim Jamshed #ifndef ETHER_CRC_LEN 54a834ea89SAsim Jamshed #define ETHER_CRC_LEN 4 55a834ea89SAsim Jamshed #endif 56a834ea89SAsim Jamshed #define ETHER_IFG 12 57a834ea89SAsim Jamshed #define ETHER_PREAMBLE 8 58a834ea89SAsim Jamshed #define ETHER_OVR (ETHER_CRC_LEN + ETHER_PREAMBLE + ETHER_IFG) 59a834ea89SAsim Jamshed 6076404edcSAsim Jamshed #ifndef ETH_ALEN 6176404edcSAsim Jamshed #define ETH_ALEN 6 6276404edcSAsim Jamshed #endif 6376404edcSAsim Jamshed #define ETHERNET_HEADER_LEN 14 // sizeof(struct ethhdr) 6476404edcSAsim Jamshed #ifdef ENABLE_PCAP 6576404edcSAsim Jamshed #define ETHERNET_FRAME_LEN 4096 6676404edcSAsim Jamshed #else 6776404edcSAsim Jamshed #define ETHERNET_FRAME_LEN 1514 // max possible frame len 6876404edcSAsim Jamshed #endif 6976404edcSAsim Jamshed #define IP_HEADER_LEN 20 // sizeof(struct iphdr) 7076404edcSAsim Jamshed #define TCP_HEADER_LEN 20 // sizeof(struct tcphdr) 7176404edcSAsim Jamshed #define TOTAL_TCP_HEADER_LEN 54 // total header length 7276404edcSAsim Jamshed 7376404edcSAsim Jamshed /* configrations */ 7476404edcSAsim Jamshed #define BACKLOG_SIZE (10*1024) 7576404edcSAsim Jamshed #define MAX_PKT_SIZE (2*1024) 7676404edcSAsim Jamshed #define ETH_NUM 16 7776404edcSAsim Jamshed #define LOGFLD_NAME_LEN 1024 7876404edcSAsim Jamshed #define APP_NAME_LEN 40 7976404edcSAsim Jamshed #define MOS_APP 20 8076404edcSAsim Jamshed 8176404edcSAsim Jamshed #define TCP_OPT_TIMESTAMP_ENABLED TRUE 8276404edcSAsim Jamshed #define TCP_OPT_SACK_ENABLED FALSE 8376404edcSAsim Jamshed 8476404edcSAsim Jamshed //#define USE_TIMER_POOL 8576404edcSAsim Jamshed 8676404edcSAsim Jamshed #ifdef DARWIN 8776404edcSAsim Jamshed #define USE_SPIN_LOCK FALSE 8876404edcSAsim Jamshed #else 8976404edcSAsim Jamshed #define USE_SPIN_LOCK TRUE 9076404edcSAsim Jamshed #endif 9176404edcSAsim Jamshed #define LOCK_STREAM_QUEUE FALSE 9276404edcSAsim Jamshed #define INTR_SLEEPING_MTCP TRUE 9376404edcSAsim Jamshed #define PROMISCUOUS_MODE TRUE 9476404edcSAsim Jamshed 9576404edcSAsim Jamshed #define MTCP_SET(a, x) (a |= x) 9676404edcSAsim Jamshed #define MTCP_ISSET(a, x) (a & x) 9776404edcSAsim Jamshed #define MTCP_CLR(a) (a = 0) 9876404edcSAsim Jamshed 9976404edcSAsim Jamshed #define CB_SET(a, x) MTCP_SET(a, x) 10076404edcSAsim Jamshed #define CB_ISSET(a, x) MTCP_ISSET(a, x) 10176404edcSAsim Jamshed #define CB_CLR(a) MTCP_CLR(a) 10276404edcSAsim Jamshed 10376404edcSAsim Jamshed #define ACTION_SET(a,x) MTCP_SET(a, x) 10476404edcSAsim Jamshed #define ACTION_ISSET(a, x) MTCP_ISSET(a, x) 10576404edcSAsim Jamshed #define ACTION_CLR(a) MTCP_CLR(a) 10676404edcSAsim Jamshed 10776404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 10876404edcSAsim Jamshed /* Statistics */ 10976404edcSAsim Jamshed #ifdef NETSTAT 11076404edcSAsim Jamshed #define NETSTAT_PERTHREAD TRUE 11176404edcSAsim Jamshed #define NETSTAT_TOTAL TRUE 11276404edcSAsim Jamshed #endif /* NETSTAT */ 11376404edcSAsim Jamshed #define RTM_STAT FALSE 11476404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 11576404edcSAsim Jamshed /* Lock definitions for socket buffer */ 11676404edcSAsim Jamshed #if USE_SPIN_LOCK 11776404edcSAsim Jamshed #define SBUF_LOCK_INIT(lock, errmsg, action); \ 11876404edcSAsim Jamshed if (pthread_spin_init(lock, PTHREAD_PROCESS_PRIVATE)) { \ 11976404edcSAsim Jamshed perror("pthread_spin_init" errmsg); \ 12076404edcSAsim Jamshed action; \ 12176404edcSAsim Jamshed } 12276404edcSAsim Jamshed #define SBUF_LOCK_DESTROY(lock) pthread_spin_destroy(lock) 12376404edcSAsim Jamshed #define SBUF_LOCK(lock) pthread_spin_lock(lock) 12476404edcSAsim Jamshed #define SBUF_UNLOCK(lock) pthread_spin_unlock(lock) 12576404edcSAsim Jamshed #else 12676404edcSAsim Jamshed #define SBUF_LOCK_INIT(lock, errmsg, action); \ 12776404edcSAsim Jamshed if (pthread_mutex_init(lock, NULL)) { \ 12876404edcSAsim Jamshed perror("pthread_mutex_init" errmsg); \ 12976404edcSAsim Jamshed action; \ 13076404edcSAsim Jamshed } 13176404edcSAsim Jamshed #define SBUF_LOCK_DESTROY(lock) pthread_mutex_destroy(lock) 13276404edcSAsim Jamshed #define SBUF_LOCK(lock) pthread_mutex_lock(lock) 13376404edcSAsim Jamshed #define SBUF_UNLOCK(lock) pthread_mutex_unlock(lock) 13476404edcSAsim Jamshed #endif /* USE_SPIN_LOCK */ 1358a941c7eSAsim Jamshed 1368a941c7eSAsim Jamshed /* add macro if it is not defined in /usr/include/sys/queue.h */ 1378a941c7eSAsim Jamshed #ifndef TAILQ_FOREACH_SAFE 1388a941c7eSAsim Jamshed #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ 1398a941c7eSAsim Jamshed for ((var) = TAILQ_FIRST((head)); \ 1408a941c7eSAsim Jamshed (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ 1418a941c7eSAsim Jamshed (var) = (tvar)) 1428a941c7eSAsim Jamshed #endif 14376404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 14476404edcSAsim Jamshed struct timer; 14576404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 14676404edcSAsim Jamshed struct eth_table 14776404edcSAsim Jamshed { 14876404edcSAsim Jamshed char dev_name[128]; 14976404edcSAsim Jamshed int ifindex; 15076404edcSAsim Jamshed int stat_print; 15176404edcSAsim Jamshed unsigned char haddr[ETH_ALEN]; 15276404edcSAsim Jamshed uint32_t netmask; 15376404edcSAsim Jamshed uint32_t ip_addr; 15476404edcSAsim Jamshed uint64_t cpu_mask; 15576404edcSAsim Jamshed }; 15676404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 15776404edcSAsim Jamshed struct route_table 15876404edcSAsim Jamshed { 15976404edcSAsim Jamshed uint32_t daddr; 16076404edcSAsim Jamshed uint32_t mask; 16176404edcSAsim Jamshed uint32_t masked; 16276404edcSAsim Jamshed int prefix; 16376404edcSAsim Jamshed int nif; 16476404edcSAsim Jamshed }; 16576404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 16676404edcSAsim Jamshed struct arp_entry 16776404edcSAsim Jamshed { 16876404edcSAsim Jamshed uint32_t ip; 16976404edcSAsim Jamshed int8_t prefix; 17076404edcSAsim Jamshed uint32_t ip_mask; 17176404edcSAsim Jamshed uint32_t ip_masked; 17276404edcSAsim Jamshed unsigned char haddr[ETH_ALEN]; 17376404edcSAsim Jamshed }; 17476404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 17576404edcSAsim Jamshed struct arp_table 17676404edcSAsim Jamshed { 17776404edcSAsim Jamshed struct arp_entry *entry; 17876404edcSAsim Jamshed int entries; 17976404edcSAsim Jamshed }; 18076404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 18176404edcSAsim Jamshed struct mtcp_sender 18276404edcSAsim Jamshed { 18376404edcSAsim Jamshed int ifidx; 18476404edcSAsim Jamshed 18576404edcSAsim Jamshed TAILQ_HEAD (control_head, tcp_stream) control_list; 18676404edcSAsim Jamshed TAILQ_HEAD (send_head, tcp_stream) send_list; 18776404edcSAsim Jamshed TAILQ_HEAD (ack_head, tcp_stream) ack_list; 18876404edcSAsim Jamshed 18976404edcSAsim Jamshed int control_list_cnt; 19076404edcSAsim Jamshed int send_list_cnt; 19176404edcSAsim Jamshed int ack_list_cnt; 19276404edcSAsim Jamshed }; 19376404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 19476404edcSAsim Jamshed struct mtcp_manager 19576404edcSAsim Jamshed { 19676404edcSAsim Jamshed mem_pool_t bufseg_pool; 19776404edcSAsim Jamshed mem_pool_t sockent_pool; /* memory pool for msock list entry */ 19876404edcSAsim Jamshed #ifdef USE_TIMER_POOL 19976404edcSAsim Jamshed mem_pool_t timer_pool; /* memory pool for struct timer */ 20076404edcSAsim Jamshed #endif 20176404edcSAsim Jamshed mem_pool_t evt_pool; /* memory pool for struct ev_table */ 20276404edcSAsim Jamshed mem_pool_t flow_pool; /* memory pool for tcp_stream */ 20376404edcSAsim Jamshed mem_pool_t rv_pool; /* memory pool for recv variables */ 20476404edcSAsim Jamshed mem_pool_t sv_pool; /* memory pool for send variables */ 20576404edcSAsim Jamshed mem_pool_t mv_pool; /* memory pool for monitor variables */ 20676404edcSAsim Jamshed 20776404edcSAsim Jamshed kvs_t *ev_store; 20876404edcSAsim Jamshed 20976404edcSAsim Jamshed //mem_pool_t socket_pool; 21076404edcSAsim Jamshed sb_manager_t rbm_snd; 211152f7c19SAsim Jamshed 21276404edcSAsim Jamshed struct hashtable *tcp_flow_table; 21376404edcSAsim Jamshed 21476404edcSAsim Jamshed uint32_t s_index; /* stream index */ 21576404edcSAsim Jamshed /* ptr to smaps for end applications */ 21676404edcSAsim Jamshed socket_map_t smap; 21776404edcSAsim Jamshed /* ptr to smaps for monitor applications */ 21876404edcSAsim Jamshed socket_map_t msmap; 21976404edcSAsim Jamshed /* free socket map */ 22076404edcSAsim Jamshed TAILQ_HEAD (, socket_map) free_smap; 22176404edcSAsim Jamshed /* free monitor socket map */ 22276404edcSAsim Jamshed TAILQ_HEAD (, socket_map) free_msmap; 22376404edcSAsim Jamshed 22476404edcSAsim Jamshed addr_pool_t ap; /* address pool */ 22576404edcSAsim Jamshed 22676404edcSAsim Jamshed uint32_t g_id; /* id space in a thread */ 22776404edcSAsim Jamshed uint32_t flow_cnt; /* number of concurrent flows */ 22876404edcSAsim Jamshed 22976404edcSAsim Jamshed struct mtcp_thread_context* ctx; 23076404edcSAsim Jamshed 23176404edcSAsim Jamshed /* variables related to logger */ 23276404edcSAsim Jamshed int sp_fd; 23376404edcSAsim Jamshed log_thread_context* logger; 23476404edcSAsim Jamshed log_buff* w_buffer; 23576404edcSAsim Jamshed FILE *log_fp; 23676404edcSAsim Jamshed 23776404edcSAsim Jamshed /* variables related to event */ 23876404edcSAsim Jamshed struct mtcp_epoll *ep; 23976404edcSAsim Jamshed uint32_t ts_last_event; 24076404edcSAsim Jamshed 24176404edcSAsim Jamshed struct tcp_listener *listener; 24276404edcSAsim Jamshed TAILQ_HEAD(, mon_listener) monitors; 243*05e3289cSYoungGyoun uint32_t num_msp; /* # of MOS_SOCK_MONITOR_STREAM */ 244*05e3289cSYoungGyoun uint32_t num_esp; /* # of MOS_SOCK_STREAM */ 24576404edcSAsim Jamshed struct pkt_ctx *pctx; /* current pkt context */ 24676404edcSAsim Jamshed 24776404edcSAsim Jamshed stream_queue_t connectq; /* streams need to connect */ 24876404edcSAsim Jamshed stream_queue_t sendq; /* streams need to send data */ 24976404edcSAsim Jamshed stream_queue_t ackq; /* streams need to send ack */ 25076404edcSAsim Jamshed 25176404edcSAsim Jamshed stream_queue_t closeq; /* streams need to close */ 25276404edcSAsim Jamshed stream_queue_int *closeq_int; /* internally maintained closeq */ 25376404edcSAsim Jamshed stream_queue_t resetq; /* streams need to reset */ 25476404edcSAsim Jamshed stream_queue_int *resetq_int; /* internally maintained resetq */ 25576404edcSAsim Jamshed 25676404edcSAsim Jamshed stream_queue_t destroyq; /* streams need to be destroyed */ 25776404edcSAsim Jamshed 25876404edcSAsim Jamshed struct mtcp_sender *g_sender; 25976404edcSAsim Jamshed struct mtcp_sender *n_sender[ETH_NUM]; 26076404edcSAsim Jamshed 26176404edcSAsim Jamshed /* lists related to timeout */ 26276404edcSAsim Jamshed struct rto_hashstore* rto_store; 26376404edcSAsim Jamshed TAILQ_HEAD (timewait_head, tcp_stream) timewait_list; 26476404edcSAsim Jamshed TAILQ_HEAD (timeout_head, tcp_stream) timeout_list; 26576404edcSAsim Jamshed TAILQ_HEAD (timer_head, timer) timer_list; 26676404edcSAsim Jamshed 26776404edcSAsim Jamshed int rto_list_cnt; 26876404edcSAsim Jamshed int timewait_list_cnt; 26976404edcSAsim Jamshed int timeout_list_cnt; 27076404edcSAsim Jamshed 27176404edcSAsim Jamshed uint32_t cur_ts; 27276404edcSAsim Jamshed 27376404edcSAsim Jamshed int wakeup_flag; 27476404edcSAsim Jamshed int is_sleeping; 27576404edcSAsim Jamshed 27676404edcSAsim Jamshed /* statistics */ 27776404edcSAsim Jamshed struct bcast_stat bstat; 27876404edcSAsim Jamshed struct timeout_stat tstat; 27976404edcSAsim Jamshed #ifdef NETSTAT 28076404edcSAsim Jamshed struct net_stat nstat; 28176404edcSAsim Jamshed struct net_stat p_nstat; 28276404edcSAsim Jamshed uint32_t p_nstat_ts; 28376404edcSAsim Jamshed 28476404edcSAsim Jamshed struct run_stat runstat; 28576404edcSAsim Jamshed struct run_stat p_runstat; 28676404edcSAsim Jamshed 28776404edcSAsim Jamshed struct time_stat rtstat; 28876404edcSAsim Jamshed #endif /* NETSTAT */ 28976404edcSAsim Jamshed struct io_module_func *iom; 29076404edcSAsim Jamshed 29176404edcSAsim Jamshed #ifdef ENABLE_DEBUG_EVENT 29276404edcSAsim Jamshed char dbg_buf[DBG_BUF_LEN]; 29376404edcSAsim Jamshed #endif 29476404edcSAsim Jamshed }; 29576404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 29676404edcSAsim Jamshed #ifndef __MTCP_MANAGER 29776404edcSAsim Jamshed #define __MTCP_MANAGER 29876404edcSAsim Jamshed typedef struct mtcp_manager* mtcp_manager_t; 29976404edcSAsim Jamshed #endif 30076404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 30176404edcSAsim Jamshed mtcp_manager_t 30276404edcSAsim Jamshed GetMTCPManager(mctx_t mctx); 30376404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 30476404edcSAsim Jamshed struct mtcp_thread_context 30576404edcSAsim Jamshed { 30676404edcSAsim Jamshed int cpu; 30776404edcSAsim Jamshed pthread_t thread; 30876404edcSAsim Jamshed uint8_t done:1, 30976404edcSAsim Jamshed exit:1, 31076404edcSAsim Jamshed interrupt:1; 31176404edcSAsim Jamshed 31276404edcSAsim Jamshed struct mtcp_manager* mtcp_manager; 31376404edcSAsim Jamshed 31476404edcSAsim Jamshed void *io_private_context; 31576404edcSAsim Jamshed 31676404edcSAsim Jamshed pthread_mutex_t flow_pool_lock; 31776404edcSAsim Jamshed pthread_mutex_t socket_pool_lock; 31876404edcSAsim Jamshed 31976404edcSAsim Jamshed #if LOCK_STREAM_QUEUE 32076404edcSAsim Jamshed #if USE_SPIN_LOCK 32176404edcSAsim Jamshed pthread_spinlock_t connect_lock; 32276404edcSAsim Jamshed pthread_spinlock_t close_lock; 32376404edcSAsim Jamshed pthread_spinlock_t reset_lock; 32476404edcSAsim Jamshed pthread_spinlock_t sendq_lock; 32576404edcSAsim Jamshed pthread_spinlock_t ackq_lock; 32676404edcSAsim Jamshed pthread_spinlock_t destroyq_lock; 32776404edcSAsim Jamshed #else 32876404edcSAsim Jamshed pthread_mutex_t connect_lock; 32976404edcSAsim Jamshed pthread_mutex_t close_lock; 33076404edcSAsim Jamshed pthread_mutex_t reset_lock; 33176404edcSAsim Jamshed pthread_mutex_t sendq_lock; 33276404edcSAsim Jamshed pthread_mutex_t ackq_lock; 33376404edcSAsim Jamshed pthread_mutex_t destroyq_lock; 33476404edcSAsim Jamshed #endif /* USE_SPIN_LOCK */ 33576404edcSAsim Jamshed #endif /* LOCK_STREAM_QUEUE */ 33676404edcSAsim Jamshed }; 33776404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 33876404edcSAsim Jamshed typedef struct mtcp_thread_context* mtcp_thread_context_t; 33976404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 34076404edcSAsim Jamshed struct mtcp_manager *g_mtcp[MAX_CPUS]; 34176404edcSAsim Jamshed struct mtcp_context *g_ctx[MAX_CPUS]; 342a5e1a556SAsim Jamshed extern addr_pool_t ap[ETH_NUM]; 34376404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 34476404edcSAsim Jamshed void 34576404edcSAsim Jamshed RunPassiveLoop(mtcp_manager_t mtcp); 34676404edcSAsim Jamshed /*----------------------------------------------------------------------------*/ 34776404edcSAsim Jamshed #endif /* __MTCP_H_ */ 348