mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-01-19 22:39:31 +08:00
added tons of assert,fixed some small bugs
This commit is contained in:
parent
e822e244b0
commit
0b65dc2358
9
common.h
9
common.h
@ -57,7 +57,7 @@
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
@ -85,12 +85,13 @@ const uint32_t timer_interval=400;//this should be smaller than heartbeat_interv
|
|||||||
|
|
||||||
const int RETRY_TIME=3;
|
const int RETRY_TIME=3;
|
||||||
|
|
||||||
const uint32_t conv_timeout=120000; //60 second
|
//const uint32_t conv_timeout=120000; //120 second
|
||||||
|
const uint32_t conv_timeout=20000; //for test
|
||||||
|
|
||||||
const uint32_t client_conn_timeout=10000;
|
const uint32_t client_conn_timeout=10000;
|
||||||
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
|
|
||||||
|
|
||||||
|
//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
|
||||||
|
const uint32_t server_conn_timeout=conv_timeout+10000;//for test
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
129
main.cpp
129
main.cpp
@ -210,7 +210,7 @@ struct conv_manager_t //TODO change map to unordered map
|
|||||||
conv_to_u64.erase(conv);
|
conv_to_u64.erase(conv);
|
||||||
u64_to_conv.erase(u64);
|
u64_to_conv.erase(u64);
|
||||||
conv_last_active_time.erase(conv);
|
conv_last_active_time.erase(conv);
|
||||||
mylog(log_info,"conv %x cleared\n");
|
mylog(log_info,"conv %x cleared\n",conv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int clear_inactive()
|
int clear_inactive()
|
||||||
@ -280,6 +280,7 @@ struct conn_info_t
|
|||||||
oppsite_const_id=0;
|
oppsite_const_id=0;
|
||||||
conv_manager=0;
|
conv_manager=0;
|
||||||
anti_replay=0;
|
anti_replay=0;
|
||||||
|
timer_fd=0;
|
||||||
}
|
}
|
||||||
void prepare()
|
void prepare()
|
||||||
{
|
{
|
||||||
@ -386,12 +387,25 @@ struct conn_manager_t
|
|||||||
if(erase_it->second->state.server_current_state==server_ready)
|
if(erase_it->second->state.server_current_state==server_ready)
|
||||||
{
|
{
|
||||||
ready_num--;
|
ready_num--;
|
||||||
|
assert(int32_t(ready_num)!=-1);
|
||||||
|
assert(erase_it->second!=0);
|
||||||
|
assert(erase_it->second->timer_fd !=0);
|
||||||
|
assert(erase_it->second->oppsite_const_id!=0);
|
||||||
|
assert(const_id_mp.find(erase_it->second->oppsite_const_id)!=const_id_mp.end());
|
||||||
|
assert(timer_fd_mp.find(erase_it->second->timer_fd)!=timer_fd_mp.end());
|
||||||
|
|
||||||
const_id_mp.erase(erase_it->second->oppsite_const_id);
|
const_id_mp.erase(erase_it->second->oppsite_const_id);
|
||||||
timer_fd_mp.erase(erase_it->second->timer_fd);
|
timer_fd_mp.erase(erase_it->second->timer_fd);
|
||||||
close(erase_it->second->timer_fd);// close will auto delte it from epoll
|
close(erase_it->second->timer_fd);// close will auto delte it from epoll
|
||||||
delete(erase_it->second);
|
delete(erase_it->second);
|
||||||
mp.erase(erase_it->first);
|
mp.erase(erase_it->first);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(erase_it->second==0);
|
||||||
|
assert(erase_it->second->timer_fd ==0);
|
||||||
|
assert(erase_it->second->oppsite_const_id==0);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int clear_inactive()
|
int clear_inactive()
|
||||||
@ -428,16 +442,12 @@ int clear_inactive()
|
|||||||
}
|
}
|
||||||
else if(it->second->conv_manager!=0&&it->second->conv_manager->get_size() >0)
|
else if(it->second->conv_manager!=0&&it->second->conv_manager->get_size() >0)
|
||||||
{
|
{
|
||||||
if(it->second->state.server_current_state!=server_ready)
|
assert(it->second->state.server_current_state==server_ready);
|
||||||
{
|
|
||||||
mylog(log_fatal,"this shouldnt happen!\n");
|
|
||||||
myexit(-1);
|
|
||||||
}
|
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//mylog(log_info,"inactive conv %u cleared \n",it->first);
|
mylog(log_info,"[%s:%d]inactive conn cleared \n",my_ntoa(it->second->raw_info.recv_info.src_ip),it->second->raw_info.recv_info.src_port);
|
||||||
old_it=it;
|
old_it=it;
|
||||||
it++;
|
it++;
|
||||||
erase(old_it);
|
erase(old_it);
|
||||||
@ -451,12 +461,29 @@ int clear_inactive()
|
|||||||
|
|
||||||
conn_info_t::~conn_info_t()
|
conn_info_t::~conn_info_t()
|
||||||
{
|
{
|
||||||
if(oppsite_const_id!=0)
|
if(program_mode==server_mode)
|
||||||
conn_manager.const_id_mp.erase(oppsite_const_id);
|
{
|
||||||
|
if(state.server_current_state==server_ready)
|
||||||
|
{
|
||||||
|
assert(conv_manager!=0);
|
||||||
|
assert(anti_replay!=0);
|
||||||
|
assert(oppsite_const_id!=0);
|
||||||
|
//assert(conn_manager.const_id_mp.find(oppsite_const_id)!=conn_manager.const_id_mp.end()); // conn_manager 's deconstuction function erases it
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(conv_manager==0);
|
||||||
|
assert(anti_replay==0);
|
||||||
|
assert(oppsite_const_id==0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//if(oppsite_const_id!=0) //do this at conn_manager 's deconstuction function
|
||||||
|
//conn_manager.const_id_mp.erase(oppsite_const_id);
|
||||||
if(conv_manager!=0)
|
if(conv_manager!=0)
|
||||||
delete conv_manager;
|
delete conv_manager;
|
||||||
if(anti_replay!=0)
|
if(anti_replay!=0)
|
||||||
delete anti_replay;
|
delete anti_replay;
|
||||||
|
|
||||||
//send_packet_info.protocol=g_packet_info_send.protocol;
|
//send_packet_info.protocol=g_packet_info_send.protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,7 +625,7 @@ void server_clear_function(uint64_t u64)
|
|||||||
{
|
{
|
||||||
int fd=int(u64);
|
int fd=int(u64);
|
||||||
int ret;
|
int ret;
|
||||||
|
assert(fd!=0);
|
||||||
/*
|
/*
|
||||||
epoll_event ev;
|
epoll_event ev;
|
||||||
|
|
||||||
@ -619,7 +646,8 @@ void server_clear_function(uint64_t u64)
|
|||||||
myexit(-1); //this shouldnt happen
|
myexit(-1); //this shouldnt happen
|
||||||
}
|
}
|
||||||
//mylog(log_fatal,"size:%d !!!!\n",conn_manager.udp_fd_mp.size());
|
//mylog(log_fatal,"size:%d !!!!\n",conn_manager.udp_fd_mp.size());
|
||||||
conn_manager.udp_fd_mp.erase(udp_fd);
|
assert(conn_manager.udp_fd_mp.find(fd)!=conn_manager.udp_fd_mp.end());
|
||||||
|
conn_manager.udp_fd_mp.erase(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1057,6 +1085,11 @@ int keep_connection_server_multi(conn_info_t &conn_info)
|
|||||||
|
|
||||||
mylog(log_trace,"heart beat sent<%x>\n",conn_info.my_id);
|
mylog(log_trace,"heart beat sent<%x>\n",conn_info.my_id);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mylog(log_fatal,"this shouldnt happen!\n");
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1426,7 +1459,7 @@ int server_on_raw_ready(conn_info_t &conn_info)
|
|||||||
|
|
||||||
conn_info.last_hb_recv_time = current_time_rough;
|
conn_info.last_hb_recv_time = current_time_rough;
|
||||||
|
|
||||||
mylog(log_trace, "<<<<conv:%u>>>>\n", tmp_conv_id);
|
mylog(log_trace, "conv:%u\n", tmp_conv_id);
|
||||||
if (!conn_info.conv_manager->is_conv_used(tmp_conv_id)) {
|
if (!conn_info.conv_manager->is_conv_used(tmp_conv_id)) {
|
||||||
if (conn_info.conv_manager->get_size() >= max_conv_num) {
|
if (conn_info.conv_manager->get_size() >= max_conv_num) {
|
||||||
mylog(log_warn,
|
mylog(log_warn,
|
||||||
@ -1505,7 +1538,22 @@ int server_on_raw_ready(conn_info_t &conn_info)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int server_on_raw_is_syn()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int server_on_raw_reply_syn()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int server_on_raw_is_handshake()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int server_on_raw_reply_handshake()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int server_on_raw_recv_multi()
|
int server_on_raw_recv_multi()
|
||||||
{
|
{
|
||||||
uint32_t ip;uint16_t port;
|
uint32_t ip;uint16_t port;
|
||||||
@ -1530,7 +1578,11 @@ int server_on_raw_recv_multi()
|
|||||||
{
|
{
|
||||||
raw_info_t tmp_raw_info;
|
raw_info_t tmp_raw_info;
|
||||||
|
|
||||||
recv_bare(tmp_raw_info,data,data_len);
|
if(recv_bare(tmp_raw_info,data,data_len)<0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if(raw_mode==mode_faketcp)
|
if(raw_mode==mode_faketcp)
|
||||||
{
|
{
|
||||||
if (!(tmp_raw_info.recv_info.syn == 1 && tmp_raw_info.recv_info.ack == 0 && data_len == 0))
|
if (!(tmp_raw_info.recv_info.syn == 1 && tmp_raw_info.recv_info.ack == 0 && data_len == 0))
|
||||||
@ -1716,6 +1768,7 @@ int server_on_raw_recv_multi()
|
|||||||
//g_conn_info=conn_info;
|
//g_conn_info=conn_info;
|
||||||
int new_timer_fd;
|
int new_timer_fd;
|
||||||
set_timer_server(epollfd, new_timer_fd);
|
set_timer_server(epollfd, new_timer_fd);
|
||||||
|
conn_info.timer_fd=new_timer_fd;
|
||||||
conn_manager.timer_fd_mp[new_timer_fd] = &conn_info;//pack_u64(ip,port);
|
conn_manager.timer_fd_mp[new_timer_fd] = &conn_info;//pack_u64(ip,port);
|
||||||
|
|
||||||
|
|
||||||
@ -2292,16 +2345,14 @@ int server_event_loop()
|
|||||||
|
|
||||||
int i, j, k;int ret;
|
int i, j, k;int ret;
|
||||||
|
|
||||||
bind_address_uint32=local_address_uint32;
|
bind_address_uint32=local_address_uint32;//only server has bind adress,client sets it to zero
|
||||||
|
|
||||||
//g_packet_info_send.src_ip=inet_addr(local_address);
|
|
||||||
//g_packet_info_send.src_port=local_port;
|
|
||||||
|
|
||||||
if(raw_mode==mode_faketcp)
|
if(raw_mode==mode_faketcp)
|
||||||
{
|
{
|
||||||
bind_fd=socket(AF_INET,SOCK_STREAM,0);
|
bind_fd=socket(AF_INET,SOCK_STREAM,0);
|
||||||
}
|
}
|
||||||
else if(raw_mode==mode_udp||raw_mode==mode_icmp)
|
else if(raw_mode==mode_udp||raw_mode==mode_icmp)//bind an adress to avoid collision,for icmp,there is no port,just bind a udp port
|
||||||
{
|
{
|
||||||
bind_fd=socket(AF_INET,SOCK_DGRAM,0);
|
bind_fd=socket(AF_INET,SOCK_DGRAM,0);
|
||||||
}
|
}
|
||||||
@ -2318,6 +2369,7 @@ int server_event_loop()
|
|||||||
mylog(log_fatal,"bind fail\n");
|
mylog(log_fatal,"bind fail\n");
|
||||||
myexit(-1);
|
myexit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(raw_mode==mode_faketcp)
|
if(raw_mode==mode_faketcp)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -2331,7 +2383,7 @@ int server_event_loop()
|
|||||||
|
|
||||||
|
|
||||||
init_raw_socket();
|
init_raw_socket();
|
||||||
init_filter(local_port);
|
init_filter(local_port);//bpf filter
|
||||||
|
|
||||||
epollfd = epoll_create1(0);
|
epollfd = epoll_create1(0);
|
||||||
const int max_events = 4096;
|
const int max_events = 4096;
|
||||||
@ -2351,7 +2403,9 @@ int server_event_loop()
|
|||||||
myexit(-1);
|
myexit(-1);
|
||||||
}
|
}
|
||||||
int timer_fd;
|
int timer_fd;
|
||||||
|
|
||||||
set_timer(epollfd,timer_fd);
|
set_timer(epollfd,timer_fd);
|
||||||
|
|
||||||
while(1)////////////////////////
|
while(1)////////////////////////
|
||||||
{
|
{
|
||||||
int nfds = epoll_wait(epollfd, events, max_events, 180 * 1000);
|
int nfds = epoll_wait(epollfd, events, max_events, 180 * 1000);
|
||||||
@ -2371,7 +2425,11 @@ int server_event_loop()
|
|||||||
current_time_rough=get_current_time();
|
current_time_rough=get_current_time();
|
||||||
conn_manager.clear_inactive();
|
conn_manager.clear_inactive();
|
||||||
}
|
}
|
||||||
if ((events[idx].data.u64 >>32u) == 2u)
|
else if (events[idx].data.u64 == (uint64_t)raw_recv_fd)
|
||||||
|
{
|
||||||
|
server_on_raw_recv_multi();
|
||||||
|
}
|
||||||
|
else if ((events[idx].data.u64 >>32u) == 2u)
|
||||||
{
|
{
|
||||||
int fd=get_u64_l(events[idx].data.u64);
|
int fd=get_u64_l(events[idx].data.u64);
|
||||||
uint64_t dummy;
|
uint64_t dummy;
|
||||||
@ -2379,7 +2437,7 @@ int server_event_loop()
|
|||||||
|
|
||||||
if(conn_manager.timer_fd_mp.find(fd)==conn_manager.timer_fd_mp.end()) //this can happen,when fd is a just closed fd
|
if(conn_manager.timer_fd_mp.find(fd)==conn_manager.timer_fd_mp.end()) //this can happen,when fd is a just closed fd
|
||||||
{
|
{
|
||||||
mylog(log_info,"timer_fd no longer exits\n", nfds);
|
mylog(log_info,"timer_fd no longer exits\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
conn_info_t* p_conn_info=conn_manager.timer_fd_mp[fd];
|
conn_info_t* p_conn_info=conn_manager.timer_fd_mp[fd];
|
||||||
@ -2387,18 +2445,18 @@ int server_event_loop()
|
|||||||
uint32_t port=p_conn_info->raw_info.recv_info.src_port;
|
uint32_t port=p_conn_info->raw_info.recv_info.src_port;
|
||||||
if(!conn_manager.exist(ip,port))//TODO remove this for peformance
|
if(!conn_manager.exist(ip,port))//TODO remove this for peformance
|
||||||
{
|
{
|
||||||
mylog(log_fatal,"ip port no longer exits!!!this shouldnt happen\n", nfds);
|
mylog(log_fatal,"ip port no longer exits 1!!!this shouldnt happen\n");
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
if (p_conn_info->state.server_current_state != server_ready) //TODO remove this for peformance
|
||||||
|
{
|
||||||
|
mylog(log_fatal,"p_conn_info->state.server_current_state!=server_ready!!!this shouldnt happen\n");
|
||||||
myexit(-1);
|
myexit(-1);
|
||||||
}
|
}
|
||||||
//conn_info_t &conn_info=conn_manager.find(ip,port);
|
//conn_info_t &conn_info=conn_manager.find(ip,port);
|
||||||
keep_connection_server_multi(*p_conn_info);
|
keep_connection_server_multi(*p_conn_info);
|
||||||
}
|
}
|
||||||
else if (events[idx].data.u64 == (uint64_t)raw_recv_fd)
|
else if ((events[idx].data.u64 >>32u) == 1u)
|
||||||
{
|
|
||||||
server_on_raw_recv_multi();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if ((events[idx].data.u64 >>32u) == 1u)
|
|
||||||
{
|
{
|
||||||
//uint32_t conv_id=events[n].data.u64>>32u;
|
//uint32_t conv_id=events[n].data.u64>>32u;
|
||||||
|
|
||||||
@ -2416,7 +2474,7 @@ int server_event_loop()
|
|||||||
uint32_t port=p_conn_info->raw_info.recv_info.src_port;
|
uint32_t port=p_conn_info->raw_info.recv_info.src_port;
|
||||||
if(!conn_manager.exist(ip,port))//TODO remove this for peformance
|
if(!conn_manager.exist(ip,port))//TODO remove this for peformance
|
||||||
{
|
{
|
||||||
mylog(log_fatal,"ip port no longer exits!!!this shouldnt happen\n", nfds);
|
mylog(log_fatal,"ip port no longer exits 2!!!this shouldnt happen\n", nfds);
|
||||||
myexit(-1);
|
myexit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2431,32 +2489,29 @@ int server_event_loop()
|
|||||||
if(!conn_info.conv_manager->is_u64_used(fd))
|
if(!conn_info.conv_manager->is_u64_used(fd))
|
||||||
{
|
{
|
||||||
mylog(log_debug,"conv no longer exists,udp fd %d\n",fd);
|
mylog(log_debug,"conv no longer exists,udp fd %d\n",fd);
|
||||||
int recv_len=recv(fd,buf,buf_len,0); ///////////TODO ,delete this
|
int recv_len=recv(fd,0,0,0); ///////////TODO ,delete this
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t conv_id=conn_info.conv_manager->find_conv_by_u64(fd);
|
uint32_t conv_id=conn_info.conv_manager->find_conv_by_u64(fd);
|
||||||
|
|
||||||
|
|
||||||
int recv_len=recv(fd,buf,buf_len,0);
|
int recv_len=recv(fd,buf,buf_len,0);
|
||||||
|
|
||||||
mylog(log_trace,"received a packet from udp_fd,len:%d\n",recv_len);
|
mylog(log_trace,"received a packet from udp_fd,len:%d\n",recv_len);
|
||||||
|
|
||||||
if(recv_len<0)
|
if(recv_len<0)
|
||||||
{
|
{
|
||||||
mylog(log_trace,"continue\n");
|
mylog(log_debug,"udp fd,recv_len<0 continue\n");
|
||||||
//perror("wtf?");
|
|
||||||
continue;
|
continue;
|
||||||
//return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
conn_info.conv_manager->update_active_time(conv_id);
|
//conn_info.conv_manager->update_active_time(conv_id); server dosnt update from upd side,only update from raw side. (client updates at both side)
|
||||||
|
|
||||||
if(conn_info.state.server_current_state==server_ready)
|
if(conn_info.state.server_current_state==server_ready)
|
||||||
{
|
{
|
||||||
send_data_safer(conn_info,buf,recv_len,conv_id);
|
send_data_safer(conn_info,buf,recv_len,conv_id);
|
||||||
//send_data(g_packet_info_send,buf,recv_len,my_id,oppsite_id,conv_id);
|
//send_data(g_packet_info_send,buf,recv_len,my_id,oppsite_id,conv_id);
|
||||||
mylog(log_trace,"send !!\n");
|
mylog(log_trace,"send_data_safer ,sent !!\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2812,7 +2867,7 @@ void iptables_warn()
|
|||||||
}
|
}
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
//assert(0==1);
|
||||||
dup2(1, 2);//redirect stderr to stdout
|
dup2(1, 2);//redirect stderr to stdout
|
||||||
signal(SIGINT, INThandler);
|
signal(SIGINT, INThandler);
|
||||||
process_arg(argc,argv);
|
process_arg(argc,argv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user