2017-08-09 09:29:32 +08:00
/*
* common . h
*
* Created on : Jul 29 , 2017
* Author : wangyu
*/
# ifndef COMMON_H_
# define COMMON_H_
2017-09-25 12:50:43 -05:00
//#define __STDC_FORMAT_MACROS 1
2017-08-09 09:29:32 +08:00
# include <inttypes.h>
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <getopt.h>
# include <unistd.h>
# include <errno.h>
# include <sys/epoll.h>
# include <sys/wait.h>
# include <sys/socket.h> //for socket ofcourse
# include <sys/types.h>
2017-10-24 14:16:17 -05:00
# include <sys/stat.h>
2017-08-09 09:29:32 +08:00
# include <stdlib.h> //for exit(0);
# include <errno.h> //For errno - the error number
# include <netinet/tcp.h> //Provides declarations for tcp header
# include <netinet/udp.h>
# include <netinet/ip.h> //Provides declarations for ip header
# include <netinet/if_ether.h>
# include <arpa/inet.h>
# include <fcntl.h>
# include <byteswap.h>
# include <arpa/inet.h>
# include <linux/if_ether.h>
# include <linux/filter.h>
# include <sys/time.h>
# include <time.h>
# include <sys/timerfd.h>
# include <sys/ioctl.h>
# include <netinet/in.h>
# include <net/if.h>
# include <arpa/inet.h>
# include <stdarg.h>
# include <assert.h>
# include <linux/if_packet.h>
# include <unordered_map>
# include <unordered_set>
2017-09-15 22:45:13 -05:00
# include <map>
2017-08-09 17:15:35 +08:00
# include <list>
2017-08-09 09:29:32 +08:00
using namespace std ;
typedef unsigned long long u64_t ; //this works on most platform,avoid using the PRId64
typedef long long i64_t ;
typedef unsigned int u32_t ;
typedef int i32_t ;
2017-10-05 12:21:06 -05:00
typedef unsigned short u16_t ;
typedef short i16_t ;
2017-09-15 22:45:13 -05:00
typedef u64_t my_time_t ;
2017-08-09 09:29:32 +08:00
2017-10-17 12:35:03 -05:00
const int max_data_len = 2200 ;
2017-08-09 09:29:32 +08:00
const int buf_len = max_data_len + 200 ;
2017-08-09 17:15:35 +08:00
const u32_t conv_clear_interval = 200 ;
2017-09-25 12:50:43 -05:00
//const u32_t timer_interval=400;
2017-09-23 02:00:44 -05:00
////const u32_t conv_timeout=180000;
const u32_t conv_timeout = 40000 ; //for test
2017-08-09 17:15:35 +08:00
const int max_conv_num = 10000 ;
2017-10-13 07:56:53 -05:00
const int max_conn_num = 200 ;
2017-08-09 17:15:35 +08:00
/*
2017-08-09 09:29:32 +08:00
const u32_t max_handshake_conn_num = 10000 ;
const u32_t max_ready_conn_num = 1000 ;
//const u32_t anti_replay_window_size=1000;
2017-08-09 17:15:35 +08:00
2017-08-09 09:29:32 +08:00
const u32_t client_handshake_timeout = 5000 ;
const u32_t client_retry_interval = 1000 ;
2017-09-25 12:50:43 -05:00
const u32_t server_handshake_timeout = 10000 ; // this should be much longer than clients. client retry initially ,server retry passtively*/
2017-08-09 09:29:32 +08:00
const int conv_clear_ratio = 10 ; //conv grabage collecter check 1/10 of all conv one time
const int conn_clear_ratio = 10 ;
const int conv_clear_min = 5 ;
const int conn_clear_min = 1 ;
2017-08-09 17:15:35 +08:00
2017-08-09 09:29:32 +08:00
const u32_t conn_clear_interval = 1000 ;
const i32_t max_fail_time = 0 ; //disable
const u32_t heartbeat_interval = 1000 ;
2017-10-13 07:56:53 -05:00
const u32_t timer_interval = 500 ; //this should be smaller than heartbeat_interval and retry interval;
2017-08-09 09:29:32 +08:00
//const uint32_t conv_timeout=120000; //120 second
2017-09-25 12:50:43 -05:00
//const u32_t conv_timeout=120000; //for test
2017-08-09 09:29:32 +08:00
const u32_t client_conn_timeout = 10000 ;
const u32_t client_conn_uplink_timeout = client_conn_timeout + 2000 ;
//const uint32_t server_conn_timeout=conv_timeout+60000;//this should be 60s+ longer than conv_timeout,so that conv_manager can destruct convs gradually,to avoid latency glicth
2017-10-11 11:33:56 -05:00
const u32_t server_conn_timeout = conv_timeout + 20000 ; //for test
2017-09-25 12:50:43 -05:00
2017-08-09 09:29:32 +08:00
extern int about_to_exit ;
enum raw_mode_t { mode_faketcp = 0 , mode_udp , mode_icmp , mode_end } ;
extern raw_mode_t raw_mode ;
enum program_mode_t { unset_mode = 0 , client_mode , server_mode } ;
extern program_mode_t program_mode ;
extern unordered_map < int , const char * > raw_mode_tostring ;
2017-09-25 10:38:39 -05:00
2017-10-17 12:35:03 -05:00
extern int delay_capacity ;
2017-09-15 22:45:13 -05:00
2017-08-09 09:29:32 +08:00
typedef u32_t id_t ;
typedef u64_t iv_t ;
typedef u64_t padding_t ;
typedef u64_t anti_replay_seq_t ;
2017-09-26 04:33:48 -05:00
typedef u64_t fd64_t ;
2017-09-26 10:51:10 -05:00
enum dest_type { none = 0 , type_ip_port , type_fd64 , type_ip_port_conv , type_fd64_conv /*,type_fd*/ } ;
2017-09-26 04:33:48 -05:00
struct ip_port_t
{
u32_t ip ;
int port ;
void from_u64 ( u64_t u64 ) ;
u64_t to_u64 ( ) ;
2017-09-26 10:51:10 -05:00
char * to_s ( ) ;
2017-09-26 04:33:48 -05:00
} ;
union inner_t
{
ip_port_t ip_port ;
2017-09-26 10:51:10 -05:00
//int fd;
2017-09-26 04:33:48 -05:00
fd64_t fd64 ;
} ;
struct dest_t
{
dest_type type ;
inner_t inner ;
2017-09-26 10:51:10 -05:00
u32_t conv ;
2017-10-08 01:50:48 -05:00
int cook = 0 ;
2017-09-26 04:33:48 -05:00
} ;
struct fd_info_t
{
ip_port_t ip_port ;
} ;
2017-08-09 09:29:32 +08:00
u64_t get_current_time ( ) ;
u64_t get_current_time_us ( ) ;
u64_t pack_u64 ( u32_t a , u32_t b ) ;
u32_t get_u64_h ( u64_t a ) ;
u32_t get_u64_l ( u64_t a ) ;
2017-10-05 12:21:06 -05:00
void write_u16 ( char * , u16_t a ) ;
u16_t read_u16 ( char * ) ;
void write_u32 ( char * , u32_t a ) ;
u32_t read_u32 ( char * ) ;
void write_u64 ( char * , u64_t a ) ;
u64_t read_uu64 ( char * ) ;
2017-08-09 09:29:32 +08:00
char * my_ntoa ( u32_t ip ) ;
void myexit ( int a ) ;
void init_random_number_fd ( ) ;
u64_t get_true_random_number_64 ( ) ;
u32_t get_true_random_number ( ) ;
u32_t get_true_random_number_nz ( ) ;
u64_t ntoh64 ( u64_t a ) ;
u64_t hton64 ( u64_t a ) ;
bool larger_than_u16 ( uint16_t a , uint16_t b ) ;
bool larger_than_u32 ( u32_t a , u32_t b ) ;
void setnonblocking ( int sock ) ;
2017-09-25 10:38:39 -05:00
int set_buf_size ( int fd , int socket_buf_size , int force_socket_buf = 0 ) ;
2017-08-09 09:29:32 +08:00
unsigned short csum ( const unsigned short * ptr , int nbytes ) ;
void signal_handler ( int sig ) ;
int numbers_to_char ( id_t id1 , id_t id2 , id_t id3 , char * & data , int & len ) ;
int char_to_numbers ( const char * data , int len , id_t & id1 , id_t & id2 , id_t & id3 ) ;
void myexit ( int a ) ;
int add_iptables_rule ( char * ) ;
int clear_iptables_rule ( ) ;
void get_true_random_chars ( char * s , int len ) ;
2017-09-15 03:34:29 -05:00
int random_between ( u32_t a , u32_t b ) ;
int set_timer_ms ( int epollfd , int & timer_fd , u32_t timer_interval ) ;
2017-10-05 12:21:06 -05:00
int round_up_div ( int a , int b ) ;
2017-10-24 14:16:17 -05:00
int create_fifo ( char * file ) ;
2017-09-25 10:38:39 -05:00
/*
2017-09-15 03:34:29 -05:00
int create_new_udp ( int & new_udp_fd , int remote_address_uint32 , int remote_port ) ;
2017-09-25 10:38:39 -05:00
*/
2017-08-09 09:29:32 +08:00
# endif /* COMMON_H_ */