mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-01-19 14:29:34 +08:00
moved definations
This commit is contained in:
parent
5d344025f1
commit
b21d1e368c
425
main.cpp
425
main.cpp
@ -182,10 +182,17 @@ const int conv_clear_ratio=10;
|
|||||||
|
|
||||||
const int hb_length=1+3*sizeof(uint32_t);
|
const int hb_length=1+3*sizeof(uint32_t);
|
||||||
|
|
||||||
int OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;
|
int VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV;
|
||||||
////////==============================variable/function divider=============================================================
|
////////==============================variable divider=============================================================
|
||||||
|
|
||||||
|
|
||||||
|
struct pseudo_header {
|
||||||
|
u_int32_t source_address;
|
||||||
|
u_int32_t dest_address;
|
||||||
|
u_int8_t placeholder;
|
||||||
|
u_int8_t protocol;
|
||||||
|
u_int16_t tcp_length;
|
||||||
|
};
|
||||||
struct icmphdr
|
struct icmphdr
|
||||||
{
|
{
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
@ -195,56 +202,6 @@ struct icmphdr
|
|||||||
uint16_t seq;
|
uint16_t seq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
////////=================================================================================
|
|
||||||
void init_random_number_fd()
|
|
||||||
{
|
|
||||||
random_number_fd=open("/dev/urandom",O_RDONLY);
|
|
||||||
if(random_number_fd==-1)
|
|
||||||
{
|
|
||||||
printf("error open /dev/urandom");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uint64_t get_true_random_number_64()
|
|
||||||
{
|
|
||||||
uint64_t ret;
|
|
||||||
read(random_number_fd,&ret,sizeof(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
uint32_t get_true_random_number_0()
|
|
||||||
{
|
|
||||||
uint32_t ret;
|
|
||||||
read(random_number_fd,&ret,sizeof(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
uint32_t get_true_random_number_nz() //nz for non-zero
|
|
||||||
{
|
|
||||||
uint32_t ret=0;
|
|
||||||
while(ret==0)
|
|
||||||
{
|
|
||||||
ret=get_true_random_number_0();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
uint64_t ntoh64(uint64_t a)
|
|
||||||
{
|
|
||||||
if(__BYTE_ORDER == __LITTLE_ENDIAN)
|
|
||||||
{
|
|
||||||
return __bswap_64( a);
|
|
||||||
}
|
|
||||||
else return a;
|
|
||||||
|
|
||||||
}
|
|
||||||
uint64_t hton64(uint64_t a)
|
|
||||||
{
|
|
||||||
if(__BYTE_ORDER == __LITTLE_ENDIAN)
|
|
||||||
{
|
|
||||||
return __bswap_64( a);
|
|
||||||
}
|
|
||||||
else return a;
|
|
||||||
|
|
||||||
}
|
|
||||||
struct anti_replay_t
|
struct anti_replay_t
|
||||||
{
|
{
|
||||||
uint64_t max_packet_received;
|
uint64_t max_packet_received;
|
||||||
@ -308,6 +265,214 @@ struct anti_replay_t
|
|||||||
}
|
}
|
||||||
}anti_replay;
|
}anti_replay;
|
||||||
|
|
||||||
|
uint32_t get_true_random_number_nz();
|
||||||
|
long long get_current_time();
|
||||||
|
struct conv_manager_t
|
||||||
|
{
|
||||||
|
map<uint64_t,uint32_t> u64_to_conv; //conv and u64 are both supposed to be uniq
|
||||||
|
map<uint32_t,uint64_t> conv_to_u64;
|
||||||
|
|
||||||
|
map<uint32_t,uint64_t> conv_last_active_time;
|
||||||
|
|
||||||
|
map<uint32_t,uint64_t>::iterator clear_it;
|
||||||
|
|
||||||
|
void (*clear_function)(uint64_t u64) ;
|
||||||
|
|
||||||
|
|
||||||
|
conv_manager_t()
|
||||||
|
{
|
||||||
|
clear_it=conv_last_active_time.begin();
|
||||||
|
clear_function=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_clear_function(void (*a)(uint64_t u64))
|
||||||
|
{
|
||||||
|
clear_function=a;
|
||||||
|
}
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
if(disable_conv_clear) return ;
|
||||||
|
|
||||||
|
if(clear_function!=0)
|
||||||
|
{
|
||||||
|
map<uint32_t,uint64_t>::iterator it;
|
||||||
|
for(it=conv_last_active_time.begin();it!=conv_last_active_time.end();it++)
|
||||||
|
{
|
||||||
|
clear_function(it->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u64_to_conv.clear();
|
||||||
|
conv_to_u64.clear();
|
||||||
|
conv_last_active_time.clear();
|
||||||
|
|
||||||
|
clear_it=conv_last_active_time.begin();
|
||||||
|
|
||||||
|
}
|
||||||
|
uint32_t get_new_conv()
|
||||||
|
{
|
||||||
|
uint32_t conv=get_true_random_number_nz();
|
||||||
|
while(conv!=0&&conv_to_u64.find(conv)!=conv_to_u64.end())
|
||||||
|
{
|
||||||
|
conv=get_true_random_number_nz();
|
||||||
|
}
|
||||||
|
return conv;
|
||||||
|
}
|
||||||
|
int is_conv_used(uint32_t conv)
|
||||||
|
{
|
||||||
|
return conv_to_u64.find(conv)!=conv_to_u64.end();
|
||||||
|
}
|
||||||
|
int is_u64_used(uint64_t u64)
|
||||||
|
{
|
||||||
|
return u64_to_conv.find(u64)!=u64_to_conv.end();
|
||||||
|
}
|
||||||
|
uint32_t find_conv_by_u64(uint64_t u64)
|
||||||
|
{
|
||||||
|
return u64_to_conv[u64];
|
||||||
|
}
|
||||||
|
uint64_t find_u64_by_conv(uint32_t conv)
|
||||||
|
{
|
||||||
|
return conv_to_u64[conv];
|
||||||
|
}
|
||||||
|
int update_active_time(uint32_t conv)
|
||||||
|
{
|
||||||
|
return conv_last_active_time[conv]=get_current_time();
|
||||||
|
}
|
||||||
|
int insert_conv(uint32_t conv,uint64_t u64)
|
||||||
|
{
|
||||||
|
u64_to_conv[u64]=conv;
|
||||||
|
conv_to_u64[conv]=u64;
|
||||||
|
conv_last_active_time[conv]=get_current_time();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int erase_conv(uint32_t conv)
|
||||||
|
{
|
||||||
|
if(disable_conv_clear) return 0;
|
||||||
|
uint64_t u64=conv_to_u64[conv];
|
||||||
|
if(clear_function!=0)
|
||||||
|
{
|
||||||
|
clear_function(u64);
|
||||||
|
}
|
||||||
|
conv_to_u64.erase(conv);
|
||||||
|
u64_to_conv.erase(u64);
|
||||||
|
conv_last_active_time.erase(conv);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int clean_inactive( )
|
||||||
|
{
|
||||||
|
if(disable_conv_clear) return 0;
|
||||||
|
|
||||||
|
map<uint32_t,uint64_t>::iterator old_it;
|
||||||
|
map<uint32_t,uint64_t>::iterator it;
|
||||||
|
int cnt=0;
|
||||||
|
it=clear_it;
|
||||||
|
int size=conv_last_active_time.size();
|
||||||
|
int num_to_clean=size/conv_clear_ratio; //clear 1/10 each time,to avoid latency glitch
|
||||||
|
|
||||||
|
uint64_t current_time=get_current_time();
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if(cnt>=num_to_clean) break;
|
||||||
|
if(conv_last_active_time.begin()==conv_last_active_time.end()) break;
|
||||||
|
|
||||||
|
if(it==conv_last_active_time.end())
|
||||||
|
{
|
||||||
|
it=conv_last_active_time.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( current_time -it->second >conv_timeout )
|
||||||
|
{
|
||||||
|
printf("inactive conv %u cleared !!!!!!!!!!!!!!!!!!!!!!!!!\n",it->first);
|
||||||
|
old_it=it;
|
||||||
|
it++;
|
||||||
|
erase_conv(old_it->first);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}conv_manager;
|
||||||
|
|
||||||
|
|
||||||
|
struct packet_info_t
|
||||||
|
{
|
||||||
|
uint8_t protocol;
|
||||||
|
//ip_part:
|
||||||
|
uint32_t src_ip;
|
||||||
|
uint16_t src_port;
|
||||||
|
|
||||||
|
uint32_t dst_ip;
|
||||||
|
uint16_t dst_port;
|
||||||
|
|
||||||
|
//tcp_part:
|
||||||
|
bool syn,ack,psh,rst;
|
||||||
|
|
||||||
|
uint32_t seq,ack_seq;
|
||||||
|
|
||||||
|
uint32_t ts,ts_ack;
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t icmp_seq;
|
||||||
|
|
||||||
|
bool has_ts;
|
||||||
|
|
||||||
|
}g_packet_info_send,g_packet_info_recv;
|
||||||
|
|
||||||
|
int TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
|
||||||
|
////////==========================type divider=======================================================
|
||||||
|
void init_random_number_fd()
|
||||||
|
{
|
||||||
|
random_number_fd=open("/dev/urandom",O_RDONLY);
|
||||||
|
if(random_number_fd==-1)
|
||||||
|
{
|
||||||
|
printf("error open /dev/urandom");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint64_t get_true_random_number_64()
|
||||||
|
{
|
||||||
|
uint64_t ret;
|
||||||
|
read(random_number_fd,&ret,sizeof(ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
uint32_t get_true_random_number_0()
|
||||||
|
{
|
||||||
|
uint32_t ret;
|
||||||
|
read(random_number_fd,&ret,sizeof(ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
uint32_t get_true_random_number_nz() //nz for non-zero
|
||||||
|
{
|
||||||
|
uint32_t ret=0;
|
||||||
|
while(ret==0)
|
||||||
|
{
|
||||||
|
ret=get_true_random_number_0();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
uint64_t ntoh64(uint64_t a)
|
||||||
|
{
|
||||||
|
if(__BYTE_ORDER == __LITTLE_ENDIAN)
|
||||||
|
{
|
||||||
|
return __bswap_64( a);
|
||||||
|
}
|
||||||
|
else return a;
|
||||||
|
|
||||||
|
}
|
||||||
|
uint64_t hton64(uint64_t a)
|
||||||
|
{
|
||||||
|
if(__BYTE_ORDER == __LITTLE_ENDIAN)
|
||||||
|
{
|
||||||
|
return __bswap_64( a);
|
||||||
|
}
|
||||||
|
else return a;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int pre_send(char * data, int &data_len)
|
int pre_send(char * data, int &data_len)
|
||||||
{
|
{
|
||||||
@ -574,135 +739,7 @@ void server_clear(uint64_t u64)
|
|||||||
printf("close fd %d failed !!!!\n",fd);
|
printf("close fd %d failed !!!!\n",fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct conv_manager_t
|
|
||||||
{
|
|
||||||
map<uint64_t,uint32_t> u64_to_conv; //conv and u64 are both supposed to be uniq
|
|
||||||
map<uint32_t,uint64_t> conv_to_u64;
|
|
||||||
|
|
||||||
map<uint32_t,uint64_t> conv_last_active_time;
|
|
||||||
|
|
||||||
map<uint32_t,uint64_t>::iterator clear_it;
|
|
||||||
|
|
||||||
void (*clear_function)(uint64_t u64) ;
|
|
||||||
|
|
||||||
|
|
||||||
conv_manager_t()
|
|
||||||
{
|
|
||||||
clear_it=conv_last_active_time.begin();
|
|
||||||
clear_function=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_clear_function(void (*a)(uint64_t u64))
|
|
||||||
{
|
|
||||||
clear_function=a;
|
|
||||||
}
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
if(disable_conv_clear) return ;
|
|
||||||
|
|
||||||
if(clear_function!=0)
|
|
||||||
{
|
|
||||||
map<uint32_t,uint64_t>::iterator it;
|
|
||||||
for(it=conv_last_active_time.begin();it!=conv_last_active_time.end();it++)
|
|
||||||
{
|
|
||||||
clear_function(it->second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
u64_to_conv.clear();
|
|
||||||
conv_to_u64.clear();
|
|
||||||
conv_last_active_time.clear();
|
|
||||||
|
|
||||||
clear_it=conv_last_active_time.begin();
|
|
||||||
|
|
||||||
}
|
|
||||||
uint32_t get_new_conv()
|
|
||||||
{
|
|
||||||
uint32_t conv=get_true_random_number_nz();
|
|
||||||
while(conv!=0&&conv_to_u64.find(conv)!=conv_to_u64.end())
|
|
||||||
{
|
|
||||||
conv=get_true_random_number_nz();
|
|
||||||
}
|
|
||||||
return conv;
|
|
||||||
}
|
|
||||||
int is_conv_used(uint32_t conv)
|
|
||||||
{
|
|
||||||
return conv_to_u64.find(conv)!=conv_to_u64.end();
|
|
||||||
}
|
|
||||||
int is_u64_used(uint64_t u64)
|
|
||||||
{
|
|
||||||
return u64_to_conv.find(u64)!=u64_to_conv.end();
|
|
||||||
}
|
|
||||||
uint32_t find_conv_by_u64(uint64_t u64)
|
|
||||||
{
|
|
||||||
return u64_to_conv[u64];
|
|
||||||
}
|
|
||||||
uint64_t find_u64_by_conv(uint32_t conv)
|
|
||||||
{
|
|
||||||
return conv_to_u64[conv];
|
|
||||||
}
|
|
||||||
int update_active_time(uint32_t conv)
|
|
||||||
{
|
|
||||||
return conv_last_active_time[conv]=get_current_time();
|
|
||||||
}
|
|
||||||
int insert_conv(uint32_t conv,uint64_t u64)
|
|
||||||
{
|
|
||||||
u64_to_conv[u64]=conv;
|
|
||||||
conv_to_u64[conv]=u64;
|
|
||||||
conv_last_active_time[conv]=get_current_time();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int erase_conv(uint32_t conv)
|
|
||||||
{
|
|
||||||
if(disable_conv_clear) return 0;
|
|
||||||
uint64_t u64=conv_to_u64[conv];
|
|
||||||
if(clear_function!=0)
|
|
||||||
{
|
|
||||||
clear_function(u64);
|
|
||||||
}
|
|
||||||
conv_to_u64.erase(conv);
|
|
||||||
u64_to_conv.erase(u64);
|
|
||||||
conv_last_active_time.erase(conv);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int clean_inactive( )
|
|
||||||
{
|
|
||||||
if(disable_conv_clear) return 0;
|
|
||||||
|
|
||||||
map<uint32_t,uint64_t>::iterator old_it;
|
|
||||||
map<uint32_t,uint64_t>::iterator it;
|
|
||||||
int cnt=0;
|
|
||||||
it=clear_it;
|
|
||||||
int size=conv_last_active_time.size();
|
|
||||||
int num_to_clean=size/conv_clear_ratio; //clear 1/10 each time,to avoid latency glitch
|
|
||||||
|
|
||||||
uint64_t current_time=get_current_time();
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if(cnt>=num_to_clean) break;
|
|
||||||
if(conv_last_active_time.begin()==conv_last_active_time.end()) break;
|
|
||||||
|
|
||||||
if(it==conv_last_active_time.end())
|
|
||||||
{
|
|
||||||
it=conv_last_active_time.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( current_time -it->second >conv_timeout )
|
|
||||||
{
|
|
||||||
printf("inactive conv %u cleared !!!!!!!!!!!!!!!!!!!!!!!!!\n",it->first);
|
|
||||||
old_it=it;
|
|
||||||
it++;
|
|
||||||
erase_conv(old_it->first);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}conv_manager;
|
|
||||||
|
|
||||||
|
|
||||||
void process_arg(int argc, char *argv[])
|
void process_arg(int argc, char *argv[])
|
||||||
@ -799,37 +836,9 @@ void process_arg(int argc, char *argv[])
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct packet_info_t
|
|
||||||
{
|
|
||||||
uint8_t protocol;
|
|
||||||
//ip_part:
|
|
||||||
uint32_t src_ip;
|
|
||||||
uint16_t src_port;
|
|
||||||
|
|
||||||
uint32_t dst_ip;
|
|
||||||
uint16_t dst_port;
|
|
||||||
|
|
||||||
//tcp_part:
|
|
||||||
bool syn,ack,psh,rst;
|
|
||||||
|
|
||||||
uint32_t seq,ack_seq;
|
|
||||||
|
|
||||||
uint32_t ts,ts_ack;
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t icmp_seq;
|
|
||||||
|
|
||||||
bool has_ts;
|
|
||||||
|
|
||||||
}g_packet_info_send,g_packet_info_recv;
|
|
||||||
|
|
||||||
struct pseudo_header {
|
|
||||||
u_int32_t source_address;
|
|
||||||
u_int32_t dest_address;
|
|
||||||
u_int8_t placeholder;
|
|
||||||
u_int8_t protocol;
|
|
||||||
u_int16_t tcp_length;
|
|
||||||
};
|
|
||||||
/*
|
/*
|
||||||
Generic checksum calculation function
|
Generic checksum calculation function
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user