1
0

client.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  1. #include "common.h"
  2. #include "network.h"
  3. #include "connection.h"
  4. #include "misc.h"
  5. #include "log.h"
  6. #include "lib/md5.h"
  7. #include "encrypt.h"
  8. #include "fd_manager.h"
  9. #ifdef UDP2RAW_MP
  10. u32_t detect_interval=1500;
  11. u64_t laste_detect_time=0;
  12. int use_udp_for_detection=0;
  13. int use_tcp_for_detection=1;
  14. extern pcap_t *pcap_handle;
  15. extern int pcap_captured_full_len;
  16. #endif
  17. int client_on_timer(conn_info_t &conn_info) //for client. called when a timer is ready in epoll
  18. {
  19. packet_info_t &send_info=conn_info.raw_info.send_info;
  20. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  21. raw_info_t &raw_info=conn_info.raw_info;
  22. conn_info.blob->conv_manager.c.clear_inactive();
  23. mylog(log_trace,"timer!\n");
  24. mylog(log_trace,"roller my %d,oppsite %d,%lld\n",int(conn_info.my_roller),int(conn_info.oppsite_roller),conn_info.last_oppsite_roller_time);
  25. mylog(log_trace,"<client_on_timer,send_info.ts_ack= %u>\n",send_info.ts_ack);
  26. #ifdef UDP2RAW_MP
  27. //mylog(log_debug,"pcap cnt :%d\n",pcap_cnt);
  28. if(send_with_pcap&&!pcap_header_captured)
  29. {
  30. if(get_current_time()-laste_detect_time>detect_interval)
  31. {
  32. laste_detect_time=get_current_time();
  33. }
  34. else
  35. {
  36. return 0;
  37. }
  38. /*
  39. struct sockaddr_in remote_addr_in={0};
  40. socklen_t slen = sizeof(sockaddr_in);
  41. int port=get_true_random_number()%65534+1;
  42. remote_addr_in.sin_family = AF_INET;
  43. remote_addr_in.sin_port = htons(port);
  44. remote_addr_in.sin_addr.s_addr = remote_ip_uint32;*/
  45. int port=get_true_random_number()%65534+1;
  46. address_t tmp_addr=remote_addr;
  47. tmp_addr.set_port(port);
  48. if(use_udp_for_detection)
  49. {
  50. int new_udp_fd=socket(tmp_addr.get_type(), SOCK_DGRAM, IPPROTO_UDP);
  51. if(new_udp_fd<0)
  52. {
  53. mylog(log_warn,"create new_udp_fd error\n");
  54. return -1;
  55. }
  56. setnonblocking(new_udp_fd);
  57. u64_t tmp=get_true_random_number();
  58. int ret=sendto(new_udp_fd,(char*)(&tmp),sizeof(tmp),0,(struct sockaddr *)&tmp_addr.inner,tmp_addr.get_len());
  59. if(ret==-1)
  60. {
  61. mylog(log_warn,"sendto() failed\n");
  62. }
  63. sock_close(new_udp_fd);
  64. }
  65. if(use_tcp_for_detection)
  66. {
  67. static int last_tcp_fd=-1;
  68. int new_tcp_fd=socket(tmp_addr.get_type(), SOCK_STREAM, IPPROTO_TCP);
  69. if(new_tcp_fd<0)
  70. {
  71. mylog(log_warn,"create new_tcp_fd error\n");
  72. return -1;
  73. }
  74. setnonblocking(new_tcp_fd);
  75. connect(new_tcp_fd,(struct sockaddr *)&tmp_addr.inner,tmp_addr.get_len());
  76. if(last_tcp_fd!=-1)
  77. sock_close(last_tcp_fd);
  78. last_tcp_fd=new_tcp_fd;
  79. //close(new_tcp_fd);
  80. }
  81. mylog(log_info,"waiting for a use-able packet to be captured\n");
  82. return 0;
  83. }
  84. #endif
  85. if(raw_info.disabled)
  86. {
  87. conn_info.state.client_current_state=client_idle;
  88. conn_info.my_id=get_true_random_number_nz();
  89. mylog(log_info,"state back to client_idle\n");
  90. }
  91. if(conn_info.state.client_current_state==client_idle)
  92. {
  93. raw_info.rst_received=0;
  94. raw_info.disabled=0;
  95. fail_time_counter++;
  96. if(max_fail_time>0&&fail_time_counter>max_fail_time)
  97. {
  98. mylog(log_fatal,"max_fail_time exceed\n");
  99. myexit(-1);
  100. }
  101. conn_info.blob->anti_replay.re_init();
  102. conn_info.my_id = get_true_random_number_nz(); ///todo no need to do this everytime
  103. address_t tmp_addr;
  104. //u32_t new_ip=0;
  105. if(!force_source_ip)
  106. {
  107. if(get_src_adress2(tmp_addr,remote_addr)!=0)
  108. {
  109. mylog(log_warn,"get_src_adress() failed\n");
  110. return -1;
  111. }
  112. //source_addr=new_addr;
  113. //source_addr.set_port(0);
  114. mylog(log_info,"source_addr is now %s\n",tmp_addr.get_ip());
  115. /*
  116. if(new_ip!=source_ip_uint32)
  117. {
  118. mylog(log_info,"source ip changed from %s to ",my_ntoa(source_ip_uint32));
  119. log_bare(log_info,"%s\n",my_ntoa(new_ip));
  120. source_ip_uint32=new_ip;
  121. send_info.src_ip=new_ip;
  122. }*/
  123. }
  124. else
  125. {
  126. tmp_addr=source_addr;
  127. }
  128. send_info.new_src_ip.from_address_t(tmp_addr);
  129. if (force_source_port == 0)
  130. {
  131. send_info.src_port = client_bind_to_a_new_port2(bind_fd,tmp_addr);
  132. }
  133. else
  134. {
  135. send_info.src_port = source_port;
  136. }
  137. if (raw_mode == mode_icmp)
  138. {
  139. send_info.dst_port = send_info.src_port;
  140. }
  141. mylog(log_info, "using port %d\n", send_info.src_port);
  142. init_filter(send_info.src_port);
  143. if(raw_mode==mode_icmp||raw_mode==mode_udp)
  144. {
  145. conn_info.state.client_current_state=client_handshake1;
  146. mylog(log_info,"state changed from client_idle to client_pre_handshake\n");
  147. }
  148. if(raw_mode==mode_faketcp)
  149. {
  150. if(use_tcp_dummy_socket)
  151. {
  152. setnonblocking(bind_fd);
  153. int ret=connect(bind_fd,(struct sockaddr *)&remote_addr.inner,remote_addr.get_len());
  154. mylog(log_debug,"ret=%d,errno=%s, %d %s\n",ret,get_sock_error(),bind_fd,remote_addr.get_str());
  155. //mylog(log_info,"ret=%d,errno=,%d %s\n",ret,bind_fd,remote_addr.get_str());
  156. conn_info.state.client_current_state=client_tcp_handshake_dummy;
  157. mylog(log_info,"state changed from client_idle to client_tcp_handshake_dummy\n");
  158. }
  159. else
  160. {
  161. conn_info.state.client_current_state=client_tcp_handshake;
  162. mylog(log_info,"state changed from client_idle to client_tcp_handshake\n");
  163. }
  164. }
  165. conn_info.last_state_time=get_current_time();
  166. conn_info.last_hb_sent_time=0;
  167. //dont return;
  168. }
  169. if(conn_info.state.client_current_state==client_tcp_handshake) //send and resend syn
  170. {
  171. assert(raw_mode==mode_faketcp);
  172. if (get_current_time() - conn_info.last_state_time > client_handshake_timeout)
  173. {
  174. conn_info.state.client_current_state = client_idle;
  175. mylog(log_info, "state back to client_idle from client_tcp_handshake\n");
  176. return 0;
  177. }
  178. else if (get_current_time() - conn_info.last_hb_sent_time > client_retry_interval)
  179. {
  180. if (raw_mode == mode_faketcp)
  181. {
  182. if (conn_info.last_hb_sent_time == 0)
  183. {
  184. send_info.psh = 0;
  185. send_info.syn = 1;
  186. send_info.ack = 0;
  187. send_info.ts_ack =0;
  188. send_info.seq=get_true_random_number();
  189. send_info.ack_seq=get_true_random_number();
  190. }
  191. }
  192. send_raw0(raw_info, 0, 0);
  193. conn_info.last_hb_sent_time = get_current_time();
  194. mylog(log_info, "(re)sent tcp syn\n");
  195. return 0;
  196. }
  197. else
  198. {
  199. return 0;
  200. }
  201. return 0;
  202. }
  203. else if(conn_info.state.client_current_state==client_tcp_handshake_dummy)
  204. {
  205. assert(raw_mode==mode_faketcp);
  206. if (get_current_time() - conn_info.last_state_time > client_handshake_timeout)
  207. {
  208. conn_info.state.client_current_state = client_idle;
  209. mylog(log_info, "state back to client_idle from client_tcp_handshake_dummy\n");
  210. return 0;
  211. }
  212. }
  213. else if(conn_info.state.client_current_state==client_handshake1)//send and resend handshake1
  214. {
  215. if(get_current_time()-conn_info.last_state_time>client_handshake_timeout)
  216. {
  217. conn_info.state.client_current_state=client_idle;
  218. mylog(log_info,"state back to client_idle from client_handshake1\n");
  219. return 0;
  220. }
  221. else if(get_current_time()-conn_info.last_hb_sent_time>client_retry_interval)
  222. {
  223. if(raw_mode==mode_faketcp)
  224. {
  225. if(conn_info.last_hb_sent_time==0)
  226. {
  227. send_info.seq++;
  228. send_info.ack_seq=recv_info.seq+1;
  229. send_info.ts_ack=recv_info.ts;
  230. raw_info.reserved_send_seq=send_info.seq;
  231. }
  232. send_info.seq=raw_info.reserved_send_seq;
  233. send_info.psh = 0;
  234. send_info.syn = 0;
  235. send_info.ack = 1;
  236. if(!use_tcp_dummy_socket)
  237. send_raw0(raw_info, 0, 0);
  238. send_handshake(raw_info,conn_info.my_id,0,const_id);
  239. send_info.seq+=raw_info.send_info.data_len;
  240. }
  241. else
  242. {
  243. send_handshake(raw_info,conn_info.my_id,0,const_id);
  244. if(raw_mode==mode_icmp)
  245. send_info.my_icmp_seq++;
  246. }
  247. conn_info.last_hb_sent_time=get_current_time();
  248. mylog(log_info,"(re)sent handshake1\n");
  249. return 0;
  250. }
  251. else
  252. {
  253. return 0;
  254. }
  255. return 0;
  256. }
  257. else if(conn_info.state.client_current_state==client_handshake2)
  258. {
  259. if(get_current_time()-conn_info.last_state_time>client_handshake_timeout)
  260. {
  261. conn_info.state.client_current_state=client_idle;
  262. mylog(log_info,"state back to client_idle from client_handshake2\n");
  263. return 0;
  264. }
  265. else if(get_current_time()-conn_info.last_hb_sent_time>client_retry_interval)
  266. {
  267. if(raw_mode==mode_faketcp)
  268. {
  269. if(conn_info.last_hb_sent_time==0)
  270. {
  271. send_info.ack_seq=recv_info.seq+raw_info.recv_info.data_len;
  272. send_info.ts_ack=recv_info.ts;
  273. raw_info.reserved_send_seq=send_info.seq;
  274. }
  275. send_info.seq=raw_info.reserved_send_seq;
  276. send_handshake(raw_info,conn_info.my_id,conn_info.oppsite_id,const_id);
  277. send_info.seq+=raw_info.send_info.data_len;
  278. }
  279. else
  280. {
  281. send_handshake(raw_info,conn_info.my_id,conn_info.oppsite_id,const_id);
  282. if(raw_mode==mode_icmp)
  283. send_info.my_icmp_seq++;
  284. }
  285. conn_info.last_hb_sent_time=get_current_time();
  286. mylog(log_info,"(re)sent handshake2\n");
  287. return 0;
  288. }
  289. else
  290. {
  291. return 0;
  292. }
  293. return 0;
  294. }
  295. else if(conn_info.state.client_current_state==client_ready)
  296. {
  297. fail_time_counter=0;
  298. mylog(log_trace,"time %llu,%llu\n",get_current_time(),conn_info.last_state_time);
  299. if(get_current_time()-conn_info.last_hb_recv_time>client_conn_timeout)
  300. {
  301. conn_info.state.client_current_state=client_idle;
  302. conn_info.my_id=get_true_random_number_nz();
  303. mylog(log_info,"state back to client_idle from client_ready bc of server-->client direction timeout\n");
  304. return 0;
  305. }
  306. if(get_current_time()- conn_info.last_oppsite_roller_time>client_conn_uplink_timeout)
  307. {
  308. conn_info.state.client_current_state=client_idle;
  309. conn_info.my_id=get_true_random_number_nz();
  310. mylog(log_info,"state back to client_idle from client_ready bc of client-->server direction timeout\n");
  311. }
  312. if(get_current_time()-conn_info.last_hb_sent_time<heartbeat_interval)
  313. {
  314. return 0;
  315. }
  316. mylog(log_debug,"heartbeat sent <%x,%x>\n",conn_info.oppsite_id,conn_info.my_id);
  317. if(hb_mode==0)
  318. send_safer(conn_info,'h',hb_buf,0);/////////////send
  319. else
  320. send_safer(conn_info,'h',hb_buf,hb_len);
  321. conn_info.last_hb_sent_time=get_current_time();
  322. return 0;
  323. }
  324. else
  325. {
  326. mylog(log_fatal,"unknown state,this shouldnt happen.\n");
  327. myexit(-1);
  328. }
  329. return 0;
  330. }
  331. int client_on_raw_recv_hs2_or_ready(conn_info_t &conn_info,char type,char *data,int data_len)
  332. {
  333. packet_info_t &send_info=conn_info.raw_info.send_info;
  334. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  335. if(!recv_info.new_src_ip.equal(send_info.new_dst_ip)||recv_info.src_port!=send_info.dst_port)
  336. {
  337. mylog(log_warn,"unexpected adress %s %s %d %d,this shouldnt happen.\n",recv_info.new_src_ip.get_str1(),send_info.new_dst_ip.get_str2(),recv_info.src_port,send_info.dst_port);
  338. return -1;
  339. }
  340. if(conn_info.state.client_current_state==client_handshake2)
  341. {
  342. mylog(log_info,"changed state from to client_handshake2 to client_ready\n");
  343. conn_info.state.client_current_state=client_ready;
  344. conn_info.last_hb_sent_time=0;
  345. conn_info.last_hb_recv_time=get_current_time();
  346. conn_info.last_oppsite_roller_time=conn_info.last_hb_recv_time;
  347. client_on_timer(conn_info);
  348. }
  349. if(data_len>=0&&type=='h')
  350. {
  351. mylog(log_debug,"[hb]heart beat received,oppsite_roller=%d\n",int(conn_info.oppsite_roller));
  352. conn_info.last_hb_recv_time=get_current_time();
  353. return 0;
  354. }
  355. else if(data_len>= int( sizeof(u32_t))&&type=='d')
  356. {
  357. mylog(log_trace,"received a data from fake tcp,len:%d\n",data_len);
  358. if(hb_mode==0)
  359. conn_info.last_hb_recv_time=get_current_time();
  360. u32_t tmp_conv_id;
  361. memcpy(&tmp_conv_id,&data[0],sizeof(tmp_conv_id));
  362. tmp_conv_id=ntohl(tmp_conv_id);
  363. if(!conn_info.blob->conv_manager.c.is_conv_used(tmp_conv_id))
  364. {
  365. mylog(log_info,"unknow conv %d,ignore\n",tmp_conv_id);
  366. return 0;
  367. }
  368. conn_info.blob->conv_manager.c.update_active_time(tmp_conv_id);
  369. //u64_t u64=conn_info.blob->conv_manager.c.find_data_by_conv(tmp_conv_id);
  370. address_t tmp_addr=conn_info.blob->conv_manager.c.find_data_by_conv(tmp_conv_id);
  371. //sockaddr_in tmp_sockaddr={0};
  372. //tmp_sockaddr.sin_family = AF_INET;
  373. //tmp_sockaddr.sin_addr.s_addr=(u64>>32u);
  374. //tmp_sockaddr.sin_port= htons(uint16_t((u64<<32u)>>32u));
  375. int ret=sendto(udp_fd,data+sizeof(u32_t),data_len -(sizeof(u32_t)),0,(struct sockaddr *)&tmp_addr.inner,tmp_addr.get_len());
  376. if(ret<0)
  377. {
  378. mylog(log_warn,"sento returned %d,%s,%02x,%s\n",ret,get_sock_error(),int(tmp_addr.get_type()),tmp_addr.get_str());
  379. //perror("ret<0");
  380. }
  381. }
  382. else
  383. {
  384. mylog(log_warn,"unknown packet,this shouldnt happen.\n");
  385. return -1;
  386. }
  387. return 0;
  388. }
  389. int client_on_raw_recv(conn_info_t &conn_info) //called when raw fd received a packet.
  390. {
  391. char* data;int data_len;
  392. packet_info_t &send_info=conn_info.raw_info.send_info;
  393. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  394. raw_info_t &raw_info=conn_info.raw_info;
  395. mylog(log_trace,"<client_on_raw_recv,send_info.ts_ack= %u>\n",send_info.ts_ack);
  396. #ifdef UDP2RAW_LINUX
  397. if(pre_recv_raw_packet()<0) return -1;
  398. #endif
  399. if(conn_info.state.client_current_state==client_idle )
  400. {
  401. discard_raw_packet();
  402. //recv(raw_recv_fd, 0,0, 0 );
  403. }
  404. else if(conn_info.state.client_current_state==client_tcp_handshake||conn_info.state.client_current_state==client_tcp_handshake_dummy)//received syn ack
  405. {
  406. assert(raw_mode==mode_faketcp);
  407. if(recv_raw0(raw_info,data,data_len)<0)
  408. {
  409. return -1;
  410. }
  411. if(!recv_info.new_src_ip.equal(send_info.new_dst_ip)||recv_info.src_port!=send_info.dst_port)
  412. {
  413. mylog(log_debug,"unexpected adress %s %s %d %d\n",recv_info.new_src_ip.get_str1(),send_info.new_dst_ip.get_str2(),recv_info.src_port,send_info.dst_port);
  414. return -1;
  415. }
  416. if(data_len==0&&raw_info.recv_info.syn==1&&raw_info.recv_info.ack==1)
  417. {
  418. if(conn_info.state.client_current_state==client_tcp_handshake)
  419. {
  420. if(recv_info.ack_seq!=send_info.seq+1)
  421. {
  422. mylog(log_debug,"seq ack_seq mis match\n");
  423. return -1;
  424. }
  425. mylog(log_info,"state changed from client_tcp_handshake to client_handshake1\n");
  426. }
  427. else
  428. {
  429. send_info.seq=recv_info.ack_seq-1;
  430. mylog(log_info,"state changed from client_tcp_dummy to client_handshake1\n");
  431. //send_info.ack_seq=recv_info.seq+1;
  432. }
  433. conn_info.state.client_current_state = client_handshake1;
  434. conn_info.last_state_time = get_current_time();
  435. conn_info.last_hb_sent_time=0;
  436. client_on_timer(conn_info);
  437. return 0;
  438. }
  439. else
  440. {
  441. mylog(log_debug,"unexpected packet type,expected:syn ack\n");
  442. return -1;
  443. }
  444. }
  445. else if(conn_info.state.client_current_state==client_handshake1)//recevied respond of handshake1
  446. {
  447. if(recv_bare(raw_info,data,data_len)!=0)
  448. {
  449. mylog(log_debug,"recv_bare failed!\n");
  450. return -1;
  451. }
  452. if(!recv_info.new_src_ip.equal(send_info.new_dst_ip)||recv_info.src_port!=send_info.dst_port)
  453. {
  454. mylog(log_debug,"unexpected adress %s %s %d %d\n",recv_info.new_src_ip.get_str1(),send_info.new_dst_ip.get_str2(),recv_info.src_port,send_info.dst_port);
  455. return -1;
  456. }
  457. if(data_len<int( 3*sizeof(my_id_t)))
  458. {
  459. mylog(log_debug,"too short to be a handshake\n");
  460. return -1;
  461. }
  462. my_id_t tmp_oppsite_id;
  463. memcpy(&tmp_oppsite_id,&data[0],sizeof(tmp_oppsite_id));
  464. tmp_oppsite_id=ntohl(tmp_oppsite_id);
  465. my_id_t tmp_my_id;
  466. memcpy(&tmp_my_id,&data[sizeof(my_id_t)],sizeof(tmp_my_id));
  467. tmp_my_id=ntohl(tmp_my_id);
  468. my_id_t tmp_oppsite_const_id;
  469. memcpy(&tmp_oppsite_const_id,&data[sizeof(my_id_t)*2],sizeof(tmp_oppsite_const_id));
  470. tmp_oppsite_const_id=ntohl(tmp_oppsite_const_id);
  471. if(tmp_my_id!=conn_info.my_id)
  472. {
  473. mylog(log_debug,"tmp_my_id doesnt match\n");
  474. return -1;
  475. }
  476. if(raw_mode==mode_faketcp)
  477. {
  478. if(recv_info.ack_seq!=send_info.seq)
  479. {
  480. mylog(log_debug,"seq ack_seq mis match\n");
  481. return -1;
  482. }
  483. if(recv_info.seq!=send_info.ack_seq)
  484. {
  485. mylog(log_debug,"seq ack_seq mis match\n");
  486. return -1;
  487. }
  488. }
  489. conn_info.oppsite_id=tmp_oppsite_id;
  490. mylog(log_info,"changed state from to client_handshake1 to client_handshake2,my_id is %x,oppsite id is %x\n",conn_info.my_id,conn_info.oppsite_id);
  491. conn_info.state.client_current_state = client_handshake2;
  492. conn_info.last_state_time = get_current_time();
  493. conn_info.last_hb_sent_time=0;
  494. client_on_timer(conn_info);
  495. return 0;
  496. }
  497. else if(conn_info.state.client_current_state==client_handshake2||conn_info.state.client_current_state==client_ready)//received heartbeat or data
  498. {
  499. vector<char> type_vec;
  500. vector<string> data_vec;
  501. recv_safer_multi(conn_info,type_vec,data_vec);
  502. if(data_vec.empty())
  503. {
  504. mylog(log_debug,"recv_safer failed!\n");
  505. return -1;
  506. }
  507. for(int i=0;i<(int)type_vec.size();i++)
  508. {
  509. char type=type_vec[i];
  510. char *data=(char *)data_vec[i].c_str(); //be careful, do not append data to it
  511. int data_len=data_vec[i].length();
  512. client_on_raw_recv_hs2_or_ready(conn_info, type, data,data_len);
  513. }
  514. return 0;
  515. }
  516. else
  517. {
  518. mylog(log_fatal,"unknown state,this shouldnt happen.\n");
  519. myexit(-1);
  520. }
  521. return 0;
  522. }
  523. int client_on_udp_recv(conn_info_t &conn_info)
  524. {
  525. int recv_len;
  526. char buf[buf_len];
  527. address_t::storage_t udp_new_addr_in={{0}};
  528. socklen_t udp_new_addr_len = sizeof(address_t::storage_t);
  529. if ((recv_len = recvfrom(udp_fd, buf, max_data_len+1, 0,
  530. (struct sockaddr *) &udp_new_addr_in, &udp_new_addr_len)) == -1) {
  531. mylog(log_debug,"recv_from error,%s\n",get_sock_error());
  532. return -1;
  533. //myexit(1);
  534. };
  535. if(recv_len==max_data_len+1)
  536. {
  537. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  538. return -1;
  539. }
  540. if(recv_len>=mtu_warn)
  541. {
  542. mylog(log_warn,"huge packet,data len=%d (>=%d).strongly suggested to set a smaller mtu at upper level,to get rid of this warn\n ",recv_len,mtu_warn);
  543. }
  544. address_t tmp_addr;
  545. tmp_addr.from_sockaddr((sockaddr *)&udp_new_addr_in,udp_new_addr_len);
  546. u32_t conv;
  547. if(!conn_info.blob->conv_manager.c.is_data_used(tmp_addr))
  548. {
  549. if(conn_info.blob->conv_manager.c.get_size() >=max_conv_num)
  550. {
  551. mylog(log_warn,"ignored new udp connect bc max_conv_num exceed\n");
  552. return -1;
  553. }
  554. conv=conn_info.blob->conv_manager.c.get_new_conv();
  555. conn_info.blob->conv_manager.c.insert_conv(conv,tmp_addr);
  556. mylog(log_info,"new packet from %s,conv_id=%x\n",tmp_addr.get_str(),conv);
  557. }
  558. else
  559. {
  560. conv=conn_info.blob->conv_manager.c.find_conv_by_data(tmp_addr);
  561. }
  562. conn_info.blob->conv_manager.c.update_active_time(conv);
  563. if(conn_info.state.client_current_state==client_ready)
  564. {
  565. send_data_safer(conn_info,buf,recv_len,conv);
  566. }
  567. return 0;
  568. }
  569. void udp_accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
  570. {
  571. conn_info_t & conn_info= *((conn_info_t*)watcher->data);
  572. client_on_udp_recv(conn_info);
  573. }
  574. void raw_recv_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
  575. {
  576. if(is_udp2raw_mp)assert(0==1);
  577. conn_info_t & conn_info= *((conn_info_t*)watcher->data);
  578. client_on_raw_recv(conn_info);
  579. }
  580. #ifdef UDP2RAW_MP
  581. void async_cb(struct ev_loop *loop, struct ev_async *watcher, int revents)
  582. {
  583. conn_info_t & conn_info= *((conn_info_t*)watcher->data);
  584. if(send_with_pcap&&!pcap_header_captured)
  585. {
  586. int empty=0;char *p;int len;
  587. pthread_mutex_lock(&queue_mutex);
  588. empty=my_queue.empty();
  589. if(!empty)
  590. {
  591. my_queue.peek_front(p,len);
  592. my_queue.pop_front();
  593. }
  594. pthread_mutex_unlock(&queue_mutex);
  595. if(empty) return;
  596. pcap_header_captured=1;
  597. assert(pcap_link_header_len!=-1);
  598. memcpy(pcap_header_buf,p,max_data_len);
  599. log_bare(log_info,"link level header captured:\n");
  600. unsigned char *tmp=(unsigned char*)pcap_header_buf;
  601. pcap_captured_full_len=len;
  602. for(int i=0;i<pcap_link_header_len;i++)
  603. log_bare(log_info,"<%x>",(u32_t)tmp[i]);
  604. log_bare(log_info,"\n");
  605. return ;
  606. }
  607. //mylog(log_info,"async_cb called\n");
  608. while(1)
  609. {
  610. int empty=0;char *p;int len;
  611. pthread_mutex_lock(&queue_mutex);
  612. empty=my_queue.empty();
  613. if(!empty)
  614. {
  615. my_queue.peek_front(p,len);
  616. my_queue.pop_front();
  617. }
  618. pthread_mutex_unlock(&queue_mutex);
  619. if(empty) break;
  620. if(g_fix_gro==0&&len>max_data_len)
  621. {
  622. mylog(log_warn,"huge packet %d > %d, dropped\n",len,max_data_len);
  623. break;
  624. }
  625. int new_len=len-pcap_link_header_len;
  626. memcpy(g_packet_buf,p+pcap_link_header_len,new_len);
  627. g_packet_buf_len=new_len;
  628. assert(g_packet_buf_cnt==0);
  629. g_packet_buf_cnt++;
  630. client_on_raw_recv(conn_info);
  631. }
  632. }
  633. #endif
  634. void clear_timer_cb(struct ev_loop *loop, struct ev_timer *watcher, int revents)
  635. {
  636. conn_info_t & conn_info= *((conn_info_t*)watcher->data);
  637. client_on_timer(conn_info);
  638. }
  639. void fifo_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
  640. {
  641. conn_info_t & conn_info= *((conn_info_t*)watcher->data);
  642. char buf[buf_len];
  643. int fifo_fd=watcher->fd;
  644. int len=read (fifo_fd, buf, sizeof (buf));
  645. if(len<0)
  646. {
  647. mylog(log_warn,"fifo read failed len=%d,errno=%s\n",len,get_sock_error());
  648. return;
  649. }
  650. buf[len]=0;
  651. while(len>=1&&buf[len-1]=='\n')
  652. buf[len-1]=0;
  653. mylog(log_info,"got data from fifo,len=%d,s=[%s]\n",len,buf);
  654. if(strcmp(buf,"reconnect")==0)
  655. {
  656. mylog(log_info,"received command: reconnect\n");
  657. conn_info.state.client_current_state=client_idle;
  658. conn_info.my_id=get_true_random_number_nz();
  659. }
  660. else
  661. {
  662. mylog(log_info,"unknown command\n");
  663. }
  664. }
  665. int client_event_loop()
  666. {
  667. char buf[buf_len];
  668. conn_info_t conn_info;
  669. conn_info.my_id=get_true_random_number_nz();
  670. conn_info.prepare();
  671. packet_info_t &send_info=conn_info.raw_info.send_info;
  672. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  673. #ifdef UDP2RAW_LINUX
  674. if(lower_level)
  675. {
  676. if(lower_level_manual)
  677. {
  678. int index;
  679. init_ifindex(if_name,raw_send_fd,index);
  680. //init_ifindex(if_name);
  681. memset(&send_info.addr_ll, 0, sizeof(send_info.addr_ll));
  682. send_info.addr_ll.sll_family = AF_PACKET;
  683. send_info.addr_ll.sll_ifindex =index;
  684. send_info.addr_ll.sll_halen = ETHER_ADDR_LEN;
  685. send_info.addr_ll.sll_protocol = htons(ETH_P_IP);
  686. memcpy(&send_info.addr_ll.sll_addr, dest_hw_addr, ETHER_ADDR_LEN);
  687. mylog(log_info,"we are running at lower-level (manual) mode\n");
  688. }
  689. else
  690. {
  691. u32_t dest_ip;
  692. string if_name_string;
  693. string hw_string;
  694. assert(remote_addr.get_type()==AF_INET);
  695. if(retry_on_error==0)
  696. {
  697. if(find_lower_level_info(remote_addr.inner.ipv4.sin_addr.s_addr,dest_ip,if_name_string,hw_string)!=0)
  698. {
  699. mylog(log_fatal,"auto detect lower-level info failed for %s,specific it manually\n",remote_addr.get_ip());
  700. myexit(-1);
  701. }
  702. }
  703. else
  704. {
  705. int ok=0;
  706. while(!ok)
  707. {
  708. if(find_lower_level_info(remote_addr.inner.ipv4.sin_addr.s_addr,dest_ip,if_name_string,hw_string)!=0)
  709. {
  710. mylog(log_warn,"auto detect lower-level info failed for %s,retry in %d seconds\n",remote_addr.get_ip(),retry_on_error_interval);
  711. sleep(retry_on_error_interval);
  712. }
  713. else
  714. {
  715. ok=1;
  716. }
  717. }
  718. }
  719. mylog(log_info,"we are running at lower-level (auto) mode,%s %s %s\n",my_ntoa(dest_ip),if_name_string.c_str(),hw_string.c_str());
  720. u32_t hw[6];
  721. memset(hw, 0, sizeof(hw));
  722. sscanf(hw_string.c_str(), "%x:%x:%x:%x:%x:%x",&hw[0], &hw[1], &hw[2],
  723. &hw[3], &hw[4], &hw[5]);
  724. mylog(log_warn,
  725. "make sure this is correct: if_name=<%s> dest_mac_adress=<%02x:%02x:%02x:%02x:%02x:%02x> \n",
  726. if_name_string.c_str(), hw[0], hw[1], hw[2], hw[3], hw[4], hw[5]);
  727. for (int i = 0; i < 6; i++) {
  728. dest_hw_addr[i] = uint8_t(hw[i]);
  729. }
  730. //mylog(log_fatal,"--lower-level auto for client hasnt been implemented\n");
  731. int index;
  732. init_ifindex(if_name_string.c_str(),raw_send_fd,index);
  733. memset(&send_info.addr_ll, 0, sizeof(send_info.addr_ll));
  734. send_info.addr_ll.sll_family = AF_PACKET;
  735. send_info.addr_ll.sll_ifindex = index;
  736. send_info.addr_ll.sll_halen = ETHER_ADDR_LEN;
  737. send_info.addr_ll.sll_protocol = htons(ETH_P_IP);
  738. memcpy(&send_info.addr_ll.sll_addr, dest_hw_addr, ETHER_ADDR_LEN);
  739. //mylog(log_info,"we are running at lower-level (manual) mode\n");
  740. }
  741. }
  742. #endif
  743. #ifdef UDP2RAW_MP
  744. address_t tmp_addr;
  745. if(get_src_adress2(tmp_addr,remote_addr)!=0)
  746. {
  747. mylog(log_error,"get_src_adress() failed\n");
  748. myexit(-1);
  749. }
  750. if(strcmp(dev,"")==0)
  751. {
  752. mylog(log_info,"--dev have not been set, trying to detect automatically, available devices:\n");
  753. mylog(log_info,"available device(device name: ip address ; description):\n");
  754. char errbuf[PCAP_ERRBUF_SIZE];
  755. int found=0;
  756. pcap_if_t *interfaces,*d;
  757. if(pcap_findalldevs(&interfaces,errbuf)==-1)
  758. {
  759. mylog(log_fatal,"error in pcap_findalldevs(),%s\n",errbuf);
  760. myexit(-1);
  761. }
  762. for(pcap_if_t *d=interfaces; d!=NULL; d=d->next) {
  763. log_bare(log_warn,"%s:", d->name);
  764. int cnt=0;
  765. for(pcap_addr_t *a=d->addresses; a!=NULL; a=a->next) {
  766. if(a->addr==NULL)
  767. {
  768. log_bare(log_debug," [a->addr==NULL]");
  769. continue;
  770. }
  771. if(a->addr->sa_family == AF_INET||a->addr->sa_family == AF_INET6)
  772. {
  773. cnt++;
  774. if(a->addr->sa_family ==AF_INET)
  775. {
  776. char s[max_addr_len];
  777. inet_ntop(AF_INET, &((struct sockaddr_in*)a->addr)->sin_addr, s,max_addr_len);
  778. log_bare(log_warn," [%s]", s);
  779. if(a->addr->sa_family==raw_ip_version)
  780. {
  781. if(((struct sockaddr_in*)a->addr)->sin_addr.s_addr ==tmp_addr.inner.ipv4.sin_addr.s_addr)
  782. {
  783. found++;
  784. strcpy(dev,d->name);
  785. }
  786. }
  787. }
  788. else
  789. {
  790. assert(a->addr->sa_family ==AF_INET6);
  791. char s[max_addr_len];
  792. inet_ntop(AF_INET6, &((struct sockaddr_in6*)a->addr)->sin6_addr, s,max_addr_len);
  793. log_bare(log_warn," [%s]", s);
  794. if(a->addr->sa_family==raw_ip_version)
  795. {
  796. if( memcmp( &((struct sockaddr_in6*)a->addr)->sin6_addr,&tmp_addr.inner.ipv6.sin6_addr,sizeof(struct in6_addr))==0 )
  797. {
  798. found++;
  799. strcpy(dev,d->name);
  800. }
  801. }
  802. }
  803. }
  804. else
  805. {
  806. log_bare(log_debug," [unknow:%d]",int(a->addr->sa_family));
  807. }
  808. }
  809. if(cnt==0) log_bare(log_warn," [no ip found]");
  810. if(d->description==0)
  811. {
  812. log_bare(log_warn,"; (no description available)");
  813. }
  814. else
  815. {
  816. log_bare(log_warn,"; %s", d->description);
  817. }
  818. log_bare(log_warn,"\n");
  819. }
  820. if(found==0)
  821. {
  822. mylog(log_fatal,"no matched device found for ip: [%s]\n",tmp_addr.get_ip());
  823. myexit(-1);
  824. }
  825. else if(found==1)
  826. {
  827. mylog(log_info,"using device:[%s], ip: [%s]\n",dev,tmp_addr.get_ip());
  828. }
  829. else
  830. {
  831. mylog(log_fatal,"more than one devices found for ip: [%s] , you need to use --dev manually\n",tmp_addr.get_ip());
  832. myexit(-1);
  833. }
  834. }
  835. else
  836. {
  837. mylog(log_info,"--dev has been manually set, using device:[%s]\n",dev);
  838. }
  839. #endif
  840. send_info.src_port=0;
  841. memset(&send_info.new_src_ip,0,sizeof(send_info.new_src_ip));
  842. int i, j, k;int ret;
  843. send_info.new_dst_ip.from_address_t(remote_addr);
  844. send_info.dst_port=remote_addr.get_port();
  845. udp_fd=socket(local_addr.get_type(), SOCK_DGRAM, IPPROTO_UDP);
  846. set_buf_size(udp_fd,socket_buf_size);
  847. if (::bind(udp_fd, (struct sockaddr*) &local_addr.inner, local_addr.get_len()) == -1) {
  848. mylog(log_fatal,"socket bind error\n");
  849. //perror("socket bind error");
  850. myexit(1);
  851. }
  852. setnonblocking(udp_fd);
  853. //epollfd = epoll_create1(0);
  854. //const int max_events = 4096;
  855. //struct epoll_event ev, events[max_events];
  856. //if (epollfd < 0) {
  857. // mylog(log_fatal,"epoll return %d\n", epollfd);
  858. // myexit(-1);
  859. //}
  860. struct ev_loop * loop= ev_default_loop(0);
  861. assert(loop != NULL);
  862. //ev.events = EPOLLIN;
  863. //ev.data.u64 = udp_fd;
  864. //ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, udp_fd, &ev);
  865. //if (ret!=0) {
  866. // mylog(log_fatal,"add udp_listen_fd error\n");
  867. // myexit(-1);
  868. //}
  869. struct ev_io udp_accept_watcher;
  870. udp_accept_watcher.data=&conn_info;
  871. ev_io_init(&udp_accept_watcher, udp_accept_cb, udp_fd, EV_READ);
  872. ev_io_start(loop, &udp_accept_watcher);
  873. //ev.events = EPOLLIN;
  874. //ev.data.u64 = raw_recv_fd;
  875. //ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev);
  876. //if (ret!= 0) {
  877. // mylog(log_fatal,"add raw_fd error\n");
  878. // myexit(-1);
  879. //}
  880. #ifdef UDP2RAW_LINUX
  881. struct ev_io raw_recv_watcher;
  882. raw_recv_watcher.data=&conn_info;
  883. ev_io_init(&raw_recv_watcher, raw_recv_cb, raw_recv_fd, EV_READ);
  884. ev_io_start(loop, &raw_recv_watcher);
  885. #endif
  886. #ifdef UDP2RAW_MP
  887. g_default_loop=loop;
  888. async_watcher.data=&conn_info;
  889. ev_async_init(&async_watcher,async_cb);
  890. ev_async_start(loop,&async_watcher);
  891. init_raw_socket();//must be put after dev detection
  892. #endif
  893. //set_timer(epollfd,timer_fd);
  894. struct ev_timer clear_timer;
  895. clear_timer.data=&conn_info;
  896. ev_timer_init(&clear_timer, clear_timer_cb, 0, timer_interval/1000.0);
  897. ev_timer_start(loop, &clear_timer);
  898. mylog(log_debug,"send_raw : from %s %d to %s %d\n",send_info.new_src_ip.get_str1(),send_info.src_port,send_info.new_dst_ip.get_str2(),send_info.dst_port);
  899. int fifo_fd=-1;
  900. struct ev_io fifo_watcher;
  901. fifo_watcher.data=&conn_info;
  902. if(fifo_file[0]!=0)
  903. {
  904. fifo_fd=create_fifo(fifo_file);
  905. ev_io_init(&fifo_watcher, fifo_cb, fifo_fd, EV_READ);
  906. ev_io_start(loop, &fifo_watcher);
  907. mylog(log_info,"fifo_file=%s\n",fifo_file);
  908. }
  909. ev_run(loop, 0);
  910. return 0;
  911. }