From 32166d65aea9f924ae2f551a1e98d9644848e7ec Mon Sep 17 00:00:00 2001 From: wangyu Date: Sun, 13 Aug 2017 08:18:23 +0800 Subject: [PATCH] bug fix --- main.cpp | 13 ++++++++++--- makefile | 8 +++++--- network.cpp | 31 ++++++++++++++++++++----------- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/main.cpp b/main.cpp index 427299e..3158452 100755 --- a/main.cpp +++ b/main.cpp @@ -1417,10 +1417,13 @@ int server_on_raw_recv_multi() { recv(raw_recv_fd, 0,0, 0 );// //struct sockaddr saddr; - //socklen_t saddr_size; + //socklen_t saddr_size=sizeof(saddr); ///recvfrom(raw_recv_fd, 0,0, 0 ,&saddr , &saddr_size);// mylog(log_trace,"peek_raw failed\n"); return -1; + }else + { + mylog(log_trace,"peek_raw success\n"); } u32_t ip=peek_info.src_ip;uint16_t port=peek_info.src_port; @@ -1544,9 +1547,11 @@ int server_on_raw_recv_multi() if(conn_info.state.server_current_state==server_ready) { char type; + //mylog(log_info,"before recv_safer\n"); if (recv_safer(conn_info,type, data, data_len) != 0) { return -1; } + //mylog(log_info,"after recv_safer\n"); return server_on_raw_recv_ready(conn_info,ip_port,type,data,data_len); } return 0; @@ -2034,8 +2039,9 @@ int client_event_loop() int recv_len; struct sockaddr_in udp_new_addr_in; + socklen_t udp_new_addr_len = sizeof(sockaddr_in); if ((recv_len = recvfrom(udp_fd, buf, max_data_len, 0, - (struct sockaddr *) &udp_new_addr_in, &slen)) == -1) { + (struct sockaddr *) &udp_new_addr_in, &udp_new_addr_len)) == -1) { mylog(log_error,"recv_from error,this shouldnt happen at client\n"); myexit(1); }; @@ -2313,7 +2319,8 @@ int server_event_loop() if(recv_len<0) { - mylog(log_debug,"udp fd,recv_len<0 continue\n"); + mylog(log_debug,"udp fd,recv_len<0 continue,%s\n",strerror(errno)); + continue; } diff --git a/makefile b/makefile index ecab5a5..28e476b 100755 --- a/makefile +++ b/makefile @@ -20,6 +20,10 @@ ar71xx: ${cc_ar71xx} -o udp2raw_ar71xx -I. ${SOURCES} ${FLAGS} -lrt -lgcc_eh -static -O3 bcm2708: ${cc_bcm2708} -o udp2raw_bcm2708 -I. ${SOURCES} ${FLAGS} -lrt -static -O3 +amd64: + ${cc_local} -o udp2raw_amd64 -I. ${SOURCES} ${FLAGS} -lrt -static -O3 +x86: + ${cc_local} -o udp2raw_x86 -I. ${SOURCES} ${FLAGS} -lrt -m32 -static -O3 cross: ${cc_cross} -o udp2raw_cross -I. ${SOURCES} ${FLAGS} -lrt -static -lgcc_eh -O3 @@ -27,9 +31,7 @@ cross: cross2: ${cc_cross} -o udp2raw_cross -I. ${SOURCES} ${FLAGS} -lrt -O3 -release: ar71xx bcm2708 - ${cc_local} -o udp2raw_amd64 -I. ${SOURCES} ${FLAGS} -lrt -static -O3 - ${cc_local} -o udp2raw_x86 -I. ${SOURCES} ${FLAGS} -lrt -m32 -static -O3 +release: amd64 x86 ar71xx bcm2708 tar -zcvf ${TAR} clean: diff --git a/network.cpp b/network.cpp index 189d249..dafc355 100644 --- a/network.cpp +++ b/network.cpp @@ -24,6 +24,8 @@ int lower_level=0; int ifindex=-1; char if_name[100]=""; +unsigned short g_ip_id_counter=0; + unsigned char oppsite_hw_addr[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; //{0x00,0x23,0x45,0x67,0x89,0xb9}; @@ -162,6 +164,7 @@ packet_info_t::packet_info_t() int init_raw_socket() { + g_ip_id_counter=get_true_random_number()%65535; if(lower_level==0) { raw_send_fd = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); @@ -306,7 +309,6 @@ int init_ifindex(char * if_name) return 0; } - int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) { const packet_info_t &send_info=raw_info.send_info; @@ -316,19 +318,18 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) struct iphdr *iph = (struct iphdr *) send_raw_ip_buf; memset(iph,0,sizeof(iphdr)); - static unsigned short ip_id=1; - iph->ihl = sizeof(iphdr)/4; //we dont use ip options,so the length is just sizeof(iphdr) iph->version = 4; iph->tos = 0; if(lower_level) { - iph->id=0; - //iph->id = htons (ip_id++); //Id of this packet + //iph->id=0; + iph->id = htons (g_ip_id_counter++); //Id of this packet } else - iph->id = 0; //Id of this packet ,kernel will auto fill this if id is zero ,or really?????// todo //seems like there is a problem + iph->id = htons (g_ip_id_counter++); //Id of this packet + //iph->id = 0; //Id of this packet ,kernel will auto fill this if id is zero ,or really?????// todo //seems like there is a problem iph->frag_off = htons(0x4000); //DF set,others are zero // iph->frag_off = htons(0x0000); //DF set,others are zero @@ -390,12 +391,14 @@ int peek_raw(packet_info_t &peek_info) { static char peek_raw_buf[buf_len]; char *ip_begin=peek_raw_buf+link_level_header_len; struct sockaddr saddr; - socklen_t saddr_size; + socklen_t saddr_size=sizeof(saddr); int recv_len = recvfrom(raw_recv_fd, peek_raw_buf,max_data_len, MSG_PEEK ,&saddr , &saddr_size);//change max_data_len to something smaller,we only need header here iphdr * iph = (struct iphdr *) (ip_begin); //mylog(log_info,"recv_len %d\n",recv_len); if(recv_lensaddr; @@ -407,10 +410,17 @@ int peek_raw(packet_info_t &peek_info) { case mode_faketcp: { - if(iph->protocol!=IPPROTO_TCP) return -1; + if(iph->protocol!=IPPROTO_TCP) + { + mylog(log_trace,"failed here"); + return -1; + } struct tcphdr *tcph=(tcphdr *)payload; if(recv_lensource); peek_info.syn=tcph->syn; break; @@ -446,10 +456,8 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) iphdr * iph; struct sockaddr saddr; - socklen_t saddr_size; - saddr_size = sizeof(saddr); + socklen_t saddr_size = sizeof(saddr); int flag=0; - int recv_len = recvfrom(raw_recv_fd, recv_raw_ip_buf, max_data_len, flag ,&saddr , &saddr_size); if(recv_len<0) @@ -481,6 +489,7 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) if(bind_address_uint32!=0 &&recv_info.dst_ip!=bind_address_uint32) { + mylog(log_trace,"bind adress doenst match, dropped\n"); //printf(" bind adress doenst match, dropped\n"); return -1; }