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