tun_dev.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. /*
  2. * tun.cpp
  3. *
  4. * Created on: Oct 26, 2017
  5. * Author: root
  6. */
  7. #include "common.h"
  8. #include "log.h"
  9. #include "misc.h"
  10. #include <netinet/tcp.h> //Provides declarations for tcp header
  11. #include <netinet/udp.h>
  12. #include <netinet/ip.h> //Provides declarations for ip header
  13. #include <netinet/if_ether.h>
  14. my_time_t last_keep_alive_time=0;
  15. int keep_alive_interval=1000;//1000ms
  16. int get_tun_fd(char * dev_name)
  17. {
  18. int tun_fd=open("/dev/net/tun",O_RDWR);
  19. if(tun_fd <0)
  20. {
  21. mylog(log_fatal,"open /dev/net/tun failed");
  22. myexit(-1);
  23. }
  24. struct ifreq ifr;
  25. memset(&ifr, 0, sizeof(ifr));
  26. ifr.ifr_flags = IFF_TUN|IFF_NO_PI;
  27. strncpy(ifr.ifr_name, dev_name, IFNAMSIZ);
  28. if(ioctl(tun_fd, TUNSETIFF, (void *)&ifr) != 0)
  29. {
  30. mylog(log_fatal,"open /dev/net/tun failed");
  31. myexit(-1);
  32. }
  33. return tun_fd;
  34. }
  35. int set_if(char *if_name,u32_t local_ip,u32_t remote_ip,int mtu)
  36. {
  37. //printf("i m here1\n");
  38. struct ifreq ifr;
  39. struct sockaddr_in sai;
  40. memset(&ifr,0,sizeof(ifr));
  41. memset(&sai, 0, sizeof(struct sockaddr));
  42. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  43. strncpy(ifr.ifr_name, if_name, IFNAMSIZ);
  44. sai.sin_family = AF_INET;
  45. sai.sin_port = 0;
  46. sai.sin_addr.s_addr = local_ip;
  47. memcpy(&ifr.ifr_addr,&sai, sizeof(struct sockaddr));
  48. assert(ioctl(sockfd, SIOCSIFADDR, &ifr)==0); //set source ip
  49. sai.sin_addr.s_addr = remote_ip;
  50. memcpy(&ifr.ifr_addr,&sai, sizeof(struct sockaddr));
  51. assert(ioctl(sockfd, SIOCSIFDSTADDR, &ifr)==0);//set dest ip
  52. ifr.ifr_mtu=mtu;
  53. assert(ioctl(sockfd, SIOCSIFMTU, &ifr)==0);//set mtu
  54. assert(ioctl(sockfd, SIOCGIFFLAGS, &ifr)==0);
  55. // ifr.ifr_flags |= ( IFF_UP|IFF_POINTOPOINT|IFF_RUNNING|IFF_NOARP|IFF_MULTICAST );
  56. ifr.ifr_flags = ( IFF_UP|IFF_POINTOPOINT|IFF_RUNNING|IFF_NOARP|IFF_MULTICAST );//set interface flags
  57. assert(ioctl(sockfd, SIOCSIFFLAGS, &ifr)==0);
  58. //printf("i m here2\n");
  59. return 0;
  60. }
  61. const char header_normal=1;
  62. const char header_new_connect=2;
  63. const char header_reject=3;
  64. const char header_keep_alive=4;
  65. int put_header(char header,char * data,int &len)
  66. {
  67. assert(len>=0);
  68. data[len]=header;
  69. len+=1;
  70. return 0;
  71. }
  72. int get_header(char &header,char * data,int &len)
  73. {
  74. assert(len>=0);
  75. if(len<1) return -1;
  76. len-=1;
  77. header=data[len];
  78. return 0;
  79. }
  80. int from_normal_to_fec2(conn_info_t & conn_info,dest_t &dest,char * data,int len,char header)
  81. {
  82. int out_n;char **out_arr;int *out_len;my_time_t *out_delay;
  83. from_normal_to_fec(conn_info,data,len,out_n,out_arr,out_len,out_delay);
  84. for(int i=0;i<out_n;i++)
  85. {
  86. char tmp_buf[buf_len];
  87. int tmp_len=out_len[i];
  88. memcpy(tmp_buf,out_arr[i],out_len[i]);
  89. put_header(header,tmp_buf,tmp_len);
  90. delay_send(out_delay[i],dest,tmp_buf,tmp_len);//this is slow but safer.just use this one
  91. //put_header(header,out_arr[i],out_len[i]);//modify in place
  92. //delay_send(out_delay[i],dest,out_arr[i],out_len[i]);//warning this is currently okay,but if you modified fec encoder,you may have to use the above code
  93. }
  94. return 0;
  95. }
  96. int from_fec_to_normal2(conn_info_t & conn_info,dest_t &dest,char * data,int len)
  97. {
  98. int out_n;char **out_arr;int *out_len;my_time_t *out_delay;
  99. from_fec_to_normal(conn_info,data,len,out_n,out_arr,out_len,out_delay);
  100. for(int i=0;i<out_n;i++)
  101. {
  102. #ifndef NOLIMIT
  103. if(client_or_server==server_mode)
  104. {
  105. char * tmp_data=out_arr[i];
  106. int tmp_len=out_len[i];
  107. iphdr * iph;
  108. iph = (struct iphdr *) tmp_data;
  109. if(tmp_len>=int(sizeof(iphdr))&&iph->version==4)
  110. {
  111. u32_t dest_ip=iph->daddr;
  112. //printf("%s\n",my_ntoa(dest_ip));
  113. if( ( ntohl(sub_net_uint32)&0xFFFFFF00 ) != ( ntohl (dest_ip) &0xFFFFFF00) )
  114. {
  115. string sub=my_ntoa(dest_ip);
  116. string dst=my_ntoa( htonl( ntohl (sub_net_uint32) &0xFFFFFF00) );
  117. mylog(log_warn,"[restriction]packet's dest ip [%s] not in subnet [%s],dropped\n", sub.c_str(), dst.c_str());
  118. continue;
  119. }
  120. }
  121. }
  122. #endif
  123. delay_send(out_delay[i],dest,out_arr[i],out_len[i]);
  124. }
  125. return 0;
  126. }
  127. int do_mssfix(char * s,int len)
  128. {
  129. if(mssfix==0)
  130. {
  131. return 0;
  132. }
  133. if(len<int(sizeof(iphdr)))
  134. {
  135. mylog(log_debug,"packet from tun len=%d <20\n",len);
  136. return -1;
  137. }
  138. iphdr * iph;
  139. iph = (struct iphdr *) s;
  140. if(iph->version!=4)
  141. {
  142. //mylog(log_trace,"not ipv4");
  143. return 0;
  144. }
  145. if(iph->protocol!=IPPROTO_TCP)
  146. {
  147. //mylog(log_trace,"not tcp");
  148. return 0;
  149. }
  150. int ip_len=ntohs(iph->tot_len);
  151. int ip_hdr_len=iph->ihl*4;
  152. if(len<ip_hdr_len)
  153. {
  154. mylog(log_debug,"len<ip_hdr_len,%d %d\n",len,ip_hdr_len);
  155. return -1;
  156. }
  157. if(len<ip_len)
  158. {
  159. mylog(log_debug,"len<ip_len,%d %d\n",len,ip_len);
  160. return -1;
  161. }
  162. if(ip_hdr_len>ip_len)
  163. {
  164. mylog(log_debug,"ip_hdr_len<ip_len,%d %d\n",ip_hdr_len,ip_len);
  165. return -1;
  166. }
  167. if( ( ntohs(iph->frag_off) &(short)(0x1FFF) ) !=0 )
  168. {
  169. //not first segment
  170. //printf("line=%d %x %x \n",__LINE__,(u32_t)ntohs(iph->frag_off),u32_t( ntohs(iph->frag_off) &0xFFF8));
  171. return 0;
  172. }
  173. if( ( ntohs(iph->frag_off) &(short)(0x80FF) ) !=0 )
  174. {
  175. //not whole segment
  176. //printf("line=%d \n",__LINE__);
  177. return 0;
  178. }
  179. char * tcp_begin=s+ip_hdr_len;
  180. int tcp_len=ip_len-ip_hdr_len;
  181. if(tcp_len<20)
  182. {
  183. mylog(log_debug,"tcp_len<20,%d\n",tcp_len);
  184. return -1;
  185. }
  186. tcphdr * tcph=(struct tcphdr*)tcp_begin;
  187. if(int(tcph->syn)==0) //fast fail
  188. {
  189. mylog(log_trace,"tcph->syn==0\n");
  190. return 0;
  191. }
  192. int tcp_hdr_len = tcph->doff*4;
  193. if(tcp_len<tcp_hdr_len)
  194. {
  195. mylog(log_debug,"tcp_len <tcp_hdr_len, %d %d\n",tcp_len,tcp_hdr_len);
  196. return -1;
  197. }
  198. /*
  199. if(tcp_hdr_len==20)
  200. {
  201. //printf("line=%d\n",__LINE__);
  202. mylog(log_trace,"no tcp option\n");
  203. return 0;
  204. }*/
  205. char *ptr=tcp_begin+20;
  206. char *option_end=tcp_begin+tcp_hdr_len;
  207. while(ptr<option_end)
  208. {
  209. if(*ptr==0)
  210. {
  211. return 0;
  212. }
  213. else if(*ptr==1)
  214. {
  215. ptr++;
  216. }
  217. else if(*ptr==2)
  218. {
  219. if(ptr+1>=option_end)
  220. {
  221. mylog(log_debug,"invaild option ptr+1==option_end,for mss\n");
  222. return -1;
  223. }
  224. if(*(ptr+1)!=4)
  225. {
  226. mylog(log_debug,"invaild mss len\n");
  227. return -1;
  228. }
  229. if(ptr+3>=option_end)
  230. {
  231. mylog(log_debug,"ptr+4>option_end for mss\n");
  232. return -1;
  233. }
  234. int mss= read_u16(ptr+2);//uint8_t(ptr[2])*256+uint8_t(ptr[3]);
  235. int new_mss=mss;
  236. if(new_mss>g_fec_mtu-40-10) //minus extra 10 for safe
  237. {
  238. new_mss=g_fec_mtu-40-10;
  239. }
  240. write_u16(ptr+2,(unsigned short)new_mss);
  241. pseudo_header psh;
  242. psh.source_address =iph->saddr;
  243. psh.dest_address = iph->daddr;
  244. psh.placeholder = 0;
  245. psh.protocol = iph->protocol;
  246. psh.tcp_length = htons(tcp_len);
  247. tcph->check=0;
  248. tcph->check=tcp_csum(psh,(unsigned short *)tcph,tcp_len);
  249. mylog(log_trace,"mss=%d syn=%d ack=%d, changed mss to %d \n",mss,(int)tcph->syn,(int)tcph->ack,new_mss);
  250. //printf("test=%x\n",u32_t(1));
  251. //printf("frag=%x\n",u32_t( ntohs(iph->frag_off) ));
  252. return 0;
  253. }
  254. else
  255. {
  256. if(ptr+1>=option_end)
  257. {
  258. mylog(log_debug,"invaild option ptr+1==option_end\n");
  259. return -1;
  260. }
  261. else
  262. {
  263. int len=(unsigned char)*(ptr+1);
  264. if(len<=1)
  265. {
  266. mylog(log_debug,"invaild option len %d\n",len);
  267. return -1;
  268. }
  269. ptr+=len;
  270. }
  271. }
  272. }
  273. return 0;
  274. }
  275. int do_keep_alive(dest_t & dest)
  276. {
  277. if(get_current_time()-last_keep_alive_time>u64_t(keep_alive_interval))
  278. {
  279. last_keep_alive_time=get_current_time();
  280. char data[buf_len];int len;
  281. data[0]=header_keep_alive;
  282. len=1;
  283. assert(dest.cook==1);
  284. //do_cook(data,len);
  285. delay_send(0,dest,data,len);
  286. }
  287. return 0;
  288. }
  289. int tun_dev_client_event_loop()
  290. {
  291. char data[buf_len];
  292. int len;
  293. int i,j,k,ret;
  294. int epoll_fd,tun_fd;
  295. int remote_fd;
  296. fd64_t remote_fd64;
  297. tun_fd=get_tun_fd(tun_dev);
  298. assert(tun_fd>0);
  299. assert(new_connected_socket(remote_fd,remote_ip_uint32,remote_port)==0);
  300. remote_fd64=fd_manager.create(remote_fd);
  301. assert(set_if(tun_dev,htonl((ntohl(sub_net_uint32)&0xFFFFFF00)|2),htonl((ntohl(sub_net_uint32)&0xFFFFFF00 )|1),tun_mtu)==0);
  302. epoll_fd = epoll_create1(0);
  303. assert(epoll_fd>0);
  304. const int max_events = 4096;
  305. struct epoll_event ev, events[max_events];
  306. if (epoll_fd < 0) {
  307. mylog(log_fatal,"epoll return %d\n", epoll_fd);
  308. myexit(-1);
  309. }
  310. ev.events = EPOLLIN;
  311. ev.data.u64 = remote_fd64;
  312. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, remote_fd, &ev);
  313. if (ret!=0) {
  314. mylog(log_fatal,"add remote_fd64 error\n");
  315. myexit(-1);
  316. }
  317. ev.events = EPOLLIN;
  318. ev.data.u64 = tun_fd;
  319. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, tun_fd, &ev);
  320. if (ret!=0) {
  321. mylog(log_fatal,"add tun_fd error\n");
  322. myexit(-1);
  323. }
  324. ev.events = EPOLLIN;
  325. ev.data.u64 = delay_manager.get_timer_fd();
  326. mylog(log_debug,"delay_manager.get_timer_fd()=%d\n",delay_manager.get_timer_fd());
  327. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, delay_manager.get_timer_fd(), &ev);
  328. if (ret!= 0) {
  329. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  330. myexit(-1);
  331. }
  332. conn_info_t *conn_info_p=new conn_info_t;
  333. conn_info_t &conn_info=*conn_info_p; //huge size of conn_info,do not allocate on stack
  334. u64_t tmp_timer_fd64=conn_info.fec_encode_manager.get_timer_fd64();
  335. ev.events = EPOLLIN;
  336. ev.data.u64 = tmp_timer_fd64;
  337. mylog(log_debug,"conn_info.fec_encode_manager.get_timer_fd64()=%llu\n",conn_info.fec_encode_manager.get_timer_fd64());
  338. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_manager.to_fd(tmp_timer_fd64), &ev);
  339. if (ret!= 0) {
  340. mylog(log_fatal,"add fec_encode_manager.get_timer_fd64() error\n");
  341. myexit(-1);
  342. }
  343. conn_info.timer.add_fd_to_epoll(epoll_fd);
  344. conn_info.timer.set_timer_repeat_us(timer_interval*1000);
  345. int fifo_fd=-1;
  346. if(fifo_file[0]!=0)
  347. {
  348. fifo_fd=create_fifo(fifo_file);
  349. ev.events = EPOLLIN;
  350. ev.data.u64 = fifo_fd;
  351. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev);
  352. if (ret!= 0) {
  353. mylog(log_fatal,"add fifo_fd to epoll error %s\n",strerror(errno));
  354. myexit(-1);
  355. }
  356. mylog(log_info,"fifo_file=%s\n",fifo_file);
  357. }
  358. dest_t udp_dest;
  359. udp_dest.cook=1;
  360. udp_dest.type=type_fd64;
  361. udp_dest.inner.fd64=remote_fd64;
  362. dest_t tun_dest;
  363. tun_dest.type=type_write_fd;
  364. tun_dest.inner.fd=tun_fd;
  365. int got_feed_back=0;
  366. while(1)////////////////////////
  367. {
  368. if(about_to_exit) myexit(0);
  369. int nfds = epoll_wait(epoll_fd, events, max_events, 180 * 1000);
  370. if (nfds < 0) { //allow zero
  371. if(errno==EINTR )
  372. {
  373. mylog(log_info,"epoll interrupted by signal,continue\n");
  374. //myexit(0);
  375. }
  376. else
  377. {
  378. mylog(log_fatal,"epoll_wait return %d,%s\n", nfds,strerror(errno));
  379. myexit(-1);
  380. }
  381. }
  382. int idx;
  383. for (idx = 0; idx < nfds; ++idx)
  384. {
  385. if(events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd())
  386. {
  387. uint64_t value;
  388. read(conn_info.timer.get_timer_fd(), &value, 8);
  389. mylog(log_trace,"events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd()\n");
  390. conn_info.stat.report_as_client();
  391. if(got_feed_back) do_keep_alive(udp_dest);
  392. }
  393. else if(events[idx].data.u64==conn_info.fec_encode_manager.get_timer_fd64())
  394. {
  395. fd64_t fd64=events[idx].data.u64;
  396. mylog(log_trace,"events[idx].data.u64 == conn_info.fec_encode_manager.get_timer_fd64()\n");
  397. uint64_t value;
  398. if(!fd_manager.exist(fd64)) //fd64 has been closed
  399. {
  400. mylog(log_trace,"!fd_manager.exist(fd64)");
  401. continue;
  402. }
  403. if((ret=read(fd_manager.to_fd(fd64), &value, 8))!=8)
  404. {
  405. mylog(log_trace,"(ret=read(fd_manager.to_fd(fd64), &value, 8))!=8,ret=%d\n",ret);
  406. continue;
  407. }
  408. if(value==0)
  409. {
  410. mylog(log_debug,"value==0\n");
  411. continue;
  412. }
  413. assert(value==1);
  414. char header=(got_feed_back==0?header_new_connect:header_normal);
  415. from_normal_to_fec2(conn_info,udp_dest,0,0,header);
  416. }
  417. else if(events[idx].data.u64==(u64_t)tun_fd)
  418. {
  419. len=read(tun_fd,data,max_data_len+1);
  420. if(len==max_data_len+1)
  421. {
  422. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  423. continue;
  424. }
  425. if(len<0)
  426. {
  427. mylog(log_warn,"read from tun_fd return %d,errno=%s\n",len,strerror(errno));
  428. continue;
  429. }
  430. do_mssfix(data,len);
  431. mylog(log_trace,"Received packet from tun,len: %d\n",len);
  432. char header=(got_feed_back==0?header_new_connect:header_normal);
  433. from_normal_to_fec2(conn_info,udp_dest,data,len,header);
  434. }
  435. else if(events[idx].data.u64==(u64_t)remote_fd64)
  436. {
  437. fd64_t fd64=events[idx].data.u64;
  438. int fd=fd_manager.to_fd(fd64);
  439. len=recv(fd,data,max_data_len+1,0);
  440. if(len==max_data_len+1)
  441. {
  442. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  443. continue;
  444. }
  445. if(len<0)
  446. {
  447. mylog(log_warn,"recv return %d,errno=%s\n",len,strerror(errno));
  448. continue;
  449. }
  450. if(de_cook(data,len)<0)
  451. {
  452. mylog(log_warn,"de_cook(data,len)failed \n");
  453. continue;
  454. }
  455. char header=0;
  456. if(get_header(header,data,len)!=0)
  457. {
  458. mylog(log_warn,"get_header failed\n");
  459. continue;
  460. }
  461. if(header==header_keep_alive)
  462. {
  463. mylog(log_trace,"got keep_alive packet\n");
  464. continue;
  465. }
  466. if(header==header_reject)
  467. {
  468. if(keep_reconnect==0)
  469. {
  470. mylog(log_fatal,"server restarted or switched to handle another client,exited\n");
  471. myexit(-1);
  472. }
  473. else
  474. {
  475. if(got_feed_back==1)
  476. mylog(log_warn,"server restarted or switched to handle another client,but keep-reconnect enabled,trying to reconnect\n");
  477. got_feed_back=0;
  478. }
  479. continue;
  480. }
  481. else if(header==header_normal)
  482. {
  483. if(got_feed_back==0)
  484. mylog(log_info,"connection accepted by server\n");
  485. got_feed_back=1;
  486. }
  487. else
  488. {
  489. mylog(log_warn,"invalid header %d %d\n",int(header),len);
  490. continue;
  491. }
  492. mylog(log_trace,"Received packet from udp,len: %d\n",len);
  493. from_fec_to_normal2(conn_info,tun_dest,data,len);
  494. }
  495. else if (events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd())
  496. {
  497. uint64_t value;
  498. read(delay_manager.get_timer_fd(), &value, 8);
  499. mylog(log_trace,"events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd()\n");
  500. }
  501. else if (events[idx].data.u64 == (u64_t)fifo_fd)
  502. {
  503. char buf[buf_len];
  504. int len=read (fifo_fd, buf, sizeof (buf));
  505. if(len<0)
  506. {
  507. mylog(log_warn,"fifo read failed len=%d,errno=%s\n",len,strerror(errno));
  508. continue;
  509. }
  510. buf[len]=0;
  511. handle_command(buf);
  512. }
  513. else
  514. {
  515. assert(0==1);
  516. }
  517. }
  518. delay_manager.check();
  519. }
  520. return 0;
  521. }
  522. int tun_dev_server_event_loop()
  523. {
  524. char data[buf_len];
  525. int len;
  526. int i,j,k,ret;
  527. int epoll_fd,tun_fd;
  528. int local_listen_fd;
  529. tun_fd=get_tun_fd(tun_dev);
  530. assert(tun_fd>0);
  531. assert(new_listen_socket(local_listen_fd,local_ip_uint32,local_port)==0);
  532. assert(set_if(tun_dev,htonl((ntohl(sub_net_uint32)&0xFFFFFF00)|1),htonl((ntohl(sub_net_uint32)&0xFFFFFF00 )|2),tun_mtu)==0);
  533. epoll_fd = epoll_create1(0);
  534. assert(epoll_fd>0);
  535. const int max_events = 4096;
  536. struct epoll_event ev, events[max_events];
  537. if (epoll_fd < 0) {
  538. mylog(log_fatal,"epoll return %d\n", epoll_fd);
  539. myexit(-1);
  540. }
  541. ev.events = EPOLLIN;
  542. ev.data.u64 = local_listen_fd;
  543. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, local_listen_fd, &ev);
  544. if (ret!=0) {
  545. mylog(log_fatal,"add udp_listen_fd error\n");
  546. myexit(-1);
  547. }
  548. ev.events = EPOLLIN;
  549. ev.data.u64 = tun_fd;
  550. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, tun_fd, &ev);
  551. if (ret!=0) {
  552. mylog(log_fatal,"add tun_fd error\n");
  553. myexit(-1);
  554. }
  555. ev.events = EPOLLIN;
  556. ev.data.u64 = delay_manager.get_timer_fd();
  557. mylog(log_debug,"delay_manager.get_timer_fd()=%d\n",delay_manager.get_timer_fd());
  558. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, delay_manager.get_timer_fd(), &ev);
  559. if (ret!= 0) {
  560. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  561. myexit(-1);
  562. }
  563. conn_info_t *conn_info_p=new conn_info_t;
  564. conn_info_t &conn_info=*conn_info_p; //huge size of conn_info,do not allocate on stack
  565. u64_t tmp_timer_fd64=conn_info.fec_encode_manager.get_timer_fd64();
  566. ev.events = EPOLLIN;
  567. ev.data.u64 = tmp_timer_fd64;
  568. mylog(log_debug,"conn_info.fec_encode_manager.get_timer_fd64()=%llu\n",conn_info.fec_encode_manager.get_timer_fd64());
  569. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_manager.to_fd(tmp_timer_fd64), &ev);
  570. if (ret!= 0) {
  571. mylog(log_fatal,"add fec_encode_manager.get_timer_fd64() error\n");
  572. myexit(-1);
  573. }
  574. conn_info.timer.add_fd_to_epoll(epoll_fd);
  575. conn_info.timer.set_timer_repeat_us(timer_interval*1000);
  576. int fifo_fd=-1;
  577. if(fifo_file[0]!=0)
  578. {
  579. fifo_fd=create_fifo(fifo_file);
  580. ev.events = EPOLLIN;
  581. ev.data.u64 = fifo_fd;
  582. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev);
  583. if (ret!= 0) {
  584. mylog(log_fatal,"add fifo_fd to epoll error %s\n",strerror(errno));
  585. myexit(-1);
  586. }
  587. mylog(log_info,"fifo_file=%s\n",fifo_file);
  588. }
  589. dest_t udp_dest;
  590. udp_dest.cook=1;
  591. udp_dest.type=type_fd_ip_port;
  592. udp_dest.inner.fd_ip_port.fd=local_listen_fd;
  593. udp_dest.inner.fd_ip_port.ip_port.ip=0;
  594. udp_dest.inner.fd_ip_port.ip_port.port=0;
  595. dest_t tun_dest;
  596. tun_dest.type=type_write_fd;
  597. tun_dest.inner.fd=tun_fd;
  598. while(1)////////////////////////
  599. {
  600. if(about_to_exit) myexit(0);
  601. int nfds = epoll_wait(epoll_fd, events, max_events, 180 * 1000);
  602. if (nfds < 0) { //allow zero
  603. if(errno==EINTR )
  604. {
  605. mylog(log_info,"epoll interrupted by signal,continue\n");
  606. //myexit(0);
  607. }
  608. else
  609. {
  610. mylog(log_fatal,"epoll_wait return %d,%s\n", nfds,strerror(errno));
  611. myexit(-1);
  612. }
  613. }
  614. int idx;
  615. for (idx = 0; idx < nfds; ++idx)
  616. {
  617. if(events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd())
  618. {
  619. uint64_t value;
  620. read(conn_info.timer.get_timer_fd(), &value, 8);
  621. if(udp_dest.inner.fd64_ip_port.ip_port.to_u64()==0)
  622. {
  623. continue;
  624. }
  625. conn_info.stat.report_as_server(udp_dest.inner.fd_ip_port.ip_port);
  626. do_keep_alive(udp_dest);
  627. }
  628. else if(events[idx].data.u64==conn_info.fec_encode_manager.get_timer_fd64())
  629. {
  630. assert(udp_dest.inner.fd64_ip_port.ip_port.to_u64()!=0);
  631. mylog(log_trace,"events[idx].data.u64 == conn_info.fec_encode_manager.get_timer_fd64()\n");
  632. uint64_t fd64=events[idx].data.u64;
  633. //mylog(log_info,"timer!!!\n");
  634. uint64_t value;
  635. if(!fd_manager.exist(fd64)) //fd64 has been closed
  636. {
  637. mylog(log_trace,"!fd_manager.exist(fd64)");
  638. continue;
  639. }
  640. if((ret=read(fd_manager.to_fd(fd64), &value, 8))!=8)
  641. {
  642. mylog(log_trace,"(ret=read(fd_manager.to_fd(fd64), &value, 8))!=8,ret=%d\n",ret);
  643. continue;
  644. }
  645. if(value==0)
  646. {
  647. mylog(log_debug,"value==0\n");
  648. continue;
  649. }
  650. assert(value==1);
  651. from_normal_to_fec2(conn_info,udp_dest,0,0,header_normal);
  652. }
  653. else if(events[idx].data.u64==(u64_t)local_listen_fd)
  654. {
  655. struct sockaddr_in udp_new_addr_in={0};
  656. socklen_t udp_new_addr_len = sizeof(sockaddr_in);
  657. if ((len = recvfrom(local_listen_fd, data, max_data_len+1, 0,
  658. (struct sockaddr *) &udp_new_addr_in, &udp_new_addr_len)) < 0) {
  659. mylog(log_error,"recv_from error,this shouldnt happen,err=%s,but we can try to continue\n",strerror(errno));
  660. continue;
  661. //myexit(1);
  662. };
  663. if(len==max_data_len+1)
  664. {
  665. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  666. continue;
  667. }
  668. if(de_cook(data,len)<0)
  669. {
  670. mylog(log_warn,"de_cook(data,len)failed \n");
  671. continue;
  672. }
  673. char header=0;
  674. if(get_header(header,data,len)!=0)
  675. {
  676. mylog(log_warn,"get_header failed\n");
  677. continue;
  678. }
  679. if((udp_dest.inner.fd_ip_port.ip_port.ip==udp_new_addr_in.sin_addr.s_addr) && (udp_dest.inner.fd_ip_port.ip_port.port==ntohs(udp_new_addr_in.sin_port)))
  680. {
  681. if(header==header_keep_alive)
  682. {
  683. mylog(log_trace,"got keep_alive packet\n");
  684. continue;
  685. }
  686. if(header!=header_new_connect&& header!=header_normal)
  687. {
  688. mylog(log_warn,"invalid header\n");
  689. continue;
  690. }
  691. }
  692. else
  693. {
  694. if(header==header_keep_alive)
  695. {
  696. mylog(log_debug,"got keep_alive packet from unexpected client\n");
  697. continue;
  698. }
  699. if(header==header_new_connect)
  700. {
  701. mylog(log_info,"new connection from %s:%d \n", inet_ntoa(udp_new_addr_in.sin_addr),
  702. ntohs(udp_new_addr_in.sin_port));
  703. udp_dest.inner.fd_ip_port.ip_port.ip=udp_new_addr_in.sin_addr.s_addr;
  704. udp_dest.inner.fd_ip_port.ip_port.port=ntohs(udp_new_addr_in.sin_port);
  705. conn_info.fec_decode_manager.clear();
  706. conn_info.fec_encode_manager.clear();
  707. memset(&conn_info.stat,0,sizeof(conn_info.stat));
  708. }
  709. else if(header==header_normal)
  710. {
  711. mylog(log_debug,"rejected connection from %s:%d\n", inet_ntoa(udp_new_addr_in.sin_addr),ntohs(udp_new_addr_in.sin_port));
  712. len=1;
  713. data[0]=header_reject;
  714. do_cook(data,len);
  715. dest_t tmp_dest;
  716. tmp_dest.type=type_fd_ip_port;
  717. tmp_dest.inner.fd_ip_port.fd=local_listen_fd;
  718. tmp_dest.inner.fd_ip_port.ip_port.ip=udp_new_addr_in.sin_addr.s_addr;
  719. tmp_dest.inner.fd_ip_port.ip_port.port=ntohs(udp_new_addr_in.sin_port);
  720. delay_manager.add(0,tmp_dest,data,len);;
  721. continue;
  722. }
  723. else
  724. {
  725. mylog(log_warn,"invalid header\n");
  726. }
  727. }
  728. mylog(log_trace,"Received packet from %s:%d,len: %d\n", inet_ntoa(udp_new_addr_in.sin_addr),
  729. ntohs(udp_new_addr_in.sin_port),len);
  730. from_fec_to_normal2(conn_info,tun_dest,data,len);
  731. }
  732. else if(events[idx].data.u64==(u64_t)tun_fd)
  733. {
  734. len=read(tun_fd,data,max_data_len+1);
  735. if(len==max_data_len+1)
  736. {
  737. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  738. continue;
  739. }
  740. if(len<0)
  741. {
  742. mylog(log_warn,"read from tun_fd return %d,errno=%s\n",len,strerror(errno));
  743. continue;
  744. }
  745. do_mssfix(data,len);
  746. mylog(log_trace,"Received packet from tun,len: %d\n",len);
  747. if(udp_dest.inner.fd64_ip_port.ip_port.to_u64()==0)
  748. {
  749. mylog(log_debug,"received packet from tun,but there is no client yet,dropped packet\n");
  750. continue;
  751. }
  752. from_normal_to_fec2(conn_info,udp_dest,data,len,header_normal);
  753. }
  754. else if (events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd())
  755. {
  756. uint64_t value;
  757. read(delay_manager.get_timer_fd(), &value, 8);
  758. mylog(log_trace,"events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd()\n");
  759. }
  760. else if (events[idx].data.u64 == (u64_t)fifo_fd)
  761. {
  762. char buf[buf_len];
  763. int len=read (fifo_fd, buf, sizeof (buf));
  764. if(len<0)
  765. {
  766. mylog(log_warn,"fifo read failed len=%d,errno=%s\n",len,strerror(errno));
  767. continue;
  768. }
  769. buf[len]=0;
  770. handle_command(buf);
  771. }
  772. else
  773. {
  774. assert(0==1);
  775. }
  776. }
  777. delay_manager.check();
  778. }
  779. return 0;
  780. }