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