tun_dev_client.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #include "tun_dev.h"
  2. int tun_dev_client_event_loop()
  3. {
  4. char data[buf_len];
  5. int len;
  6. int i,j,k,ret;
  7. int tun_fd;
  8. int remote_fd;
  9. fd64_t remote_fd64;
  10. tun_fd=get_tun_fd(tun_dev);
  11. assert(tun_fd>0);
  12. assert(new_connected_socket2(remote_fd,remote_addr)==0);
  13. remote_fd64=fd_manager.create(remote_fd);
  14. assert(set_tun(tun_dev,htonl((ntohl(sub_net_uint32)&0xFFFFFF00)|2),htonl((ntohl(sub_net_uint32)&0xFFFFFF00 )|1),tun_mtu)==0);
  15. ///epoll_fd = epoll_create1(0);
  16. ///assert(epoll_fd>0);
  17. ///const int max_events = 4096;
  18. ///struct epoll_event ev, events[max_events];
  19. ///if (epoll_fd < 0) {
  20. /// mylog(log_fatal,"epoll return %d\n", epoll_fd);
  21. /// myexit(-1);
  22. ///}
  23. struct ev_loop * loop= ev_default_loop(0);
  24. assert(loop != NULL);
  25. ev.events = EPOLLIN;
  26. ev.data.u64 = remote_fd64;
  27. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, remote_fd, &ev);
  28. if (ret!=0) {
  29. mylog(log_fatal,"add remote_fd64 error\n");
  30. myexit(-1);
  31. }
  32. ev.events = EPOLLIN;
  33. ev.data.u64 = tun_fd;
  34. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, tun_fd, &ev);
  35. if (ret!=0) {
  36. mylog(log_fatal,"add tun_fd error\n");
  37. myexit(-1);
  38. }
  39. ev.events = EPOLLIN;
  40. ev.data.u64 = delay_manager.get_timer_fd();
  41. mylog(log_debug,"delay_manager.get_timer_fd()=%d\n",delay_manager.get_timer_fd());
  42. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, delay_manager.get_timer_fd(), &ev);
  43. if (ret!= 0) {
  44. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  45. myexit(-1);
  46. }
  47. conn_info_t *conn_info_p=new conn_info_t;
  48. conn_info_t &conn_info=*conn_info_p; //huge size of conn_info,do not allocate on stack
  49. u64_t tmp_timer_fd64=conn_info.fec_encode_manager.get_timer_fd64();
  50. ev.events = EPOLLIN;
  51. ev.data.u64 = tmp_timer_fd64;
  52. mylog(log_debug,"conn_info.fec_encode_manager.get_timer_fd64()=%llu\n",conn_info.fec_encode_manager.get_timer_fd64());
  53. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_manager.to_fd(tmp_timer_fd64), &ev);
  54. if (ret!= 0) {
  55. mylog(log_fatal,"add fec_encode_manager.get_timer_fd64() error\n");
  56. myexit(-1);
  57. }
  58. conn_info.timer.add_fd_to_epoll(epoll_fd);
  59. conn_info.timer.set_timer_repeat_us(timer_interval*1000);
  60. int fifo_fd=-1;
  61. if(fifo_file[0]!=0)
  62. {
  63. fifo_fd=create_fifo(fifo_file);
  64. ev.events = EPOLLIN;
  65. ev.data.u64 = fifo_fd;
  66. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev);
  67. if (ret!= 0) {
  68. mylog(log_fatal,"add fifo_fd to epoll error %s\n",strerror(errno));
  69. myexit(-1);
  70. }
  71. mylog(log_info,"fifo_file=%s\n",fifo_file);
  72. }
  73. dest_t udp_dest;
  74. udp_dest.cook=1;
  75. udp_dest.type=type_fd64;
  76. udp_dest.inner.fd64=remote_fd64;
  77. dest_t tun_dest;
  78. tun_dest.type=type_write_fd;
  79. tun_dest.inner.fd=tun_fd;
  80. int got_feed_back=0;
  81. while(1)////////////////////////
  82. {
  83. if(about_to_exit) myexit(0);
  84. int nfds = epoll_wait(epoll_fd, events, max_events, 180 * 1000);
  85. if (nfds < 0) { //allow zero
  86. if(errno==EINTR )
  87. {
  88. mylog(log_info,"epoll interrupted by signal,continue\n");
  89. //myexit(0);
  90. }
  91. else
  92. {
  93. mylog(log_fatal,"epoll_wait return %d,%s\n", nfds,strerror(errno));
  94. myexit(-1);
  95. }
  96. }
  97. int idx;
  98. for (idx = 0; idx < nfds; ++idx)
  99. {
  100. if(events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd())
  101. {
  102. uint64_t value;
  103. read(conn_info.timer.get_timer_fd(), &value, 8);
  104. mylog(log_trace,"events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd()\n");
  105. conn_info.stat.report_as_client();
  106. if(got_feed_back) do_keep_alive(udp_dest);
  107. }
  108. else if(events[idx].data.u64==conn_info.fec_encode_manager.get_timer_fd64())
  109. {
  110. fd64_t fd64=events[idx].data.u64;
  111. mylog(log_trace,"events[idx].data.u64 == conn_info.fec_encode_manager.get_timer_fd64()\n");
  112. uint64_t value;
  113. if(!fd_manager.exist(fd64)) //fd64 has been closed
  114. {
  115. mylog(log_trace,"!fd_manager.exist(fd64)");
  116. continue;
  117. }
  118. if((ret=read(fd_manager.to_fd(fd64), &value, 8))!=8)
  119. {
  120. mylog(log_trace,"(ret=read(fd_manager.to_fd(fd64), &value, 8))!=8,ret=%d\n",ret);
  121. continue;
  122. }
  123. if(value==0)
  124. {
  125. mylog(log_debug,"value==0\n");
  126. continue;
  127. }
  128. assert(value==1);
  129. char header=(got_feed_back==0?header_new_connect:header_normal);
  130. from_normal_to_fec2(conn_info,udp_dest,0,0,header);
  131. }
  132. else if(events[idx].data.u64==(u64_t)tun_fd)
  133. {
  134. len=read(tun_fd,data,max_data_len+1);
  135. if(len==max_data_len+1)
  136. {
  137. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  138. continue;
  139. }
  140. if(len<0)
  141. {
  142. mylog(log_warn,"read from tun_fd return %d,errno=%s\n",len,strerror(errno));
  143. continue;
  144. }
  145. do_mssfix(data,len);
  146. mylog(log_trace,"Received packet from tun,len: %d\n",len);
  147. char header=(got_feed_back==0?header_new_connect:header_normal);
  148. from_normal_to_fec2(conn_info,udp_dest,data,len,header);
  149. }
  150. else if(events[idx].data.u64==(u64_t)remote_fd64)
  151. {
  152. fd64_t fd64=events[idx].data.u64;
  153. int fd=fd_manager.to_fd(fd64);
  154. len=recv(fd,data,max_data_len+1,0);
  155. if(len==max_data_len+1)
  156. {
  157. mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len);
  158. continue;
  159. }
  160. if(len<0)
  161. {
  162. mylog(log_warn,"recv return %d,errno=%s\n",len,strerror(errno));
  163. continue;
  164. }
  165. if(de_cook(data,len)<0)
  166. {
  167. mylog(log_warn,"de_cook(data,len)failed \n");
  168. continue;
  169. }
  170. char header=0;
  171. if(get_header(header,data,len)!=0)
  172. {
  173. mylog(log_warn,"get_header failed\n");
  174. continue;
  175. }
  176. if(header==header_keep_alive)
  177. {
  178. mylog(log_trace,"got keep_alive packet\n");
  179. continue;
  180. }
  181. if(header==header_reject)
  182. {
  183. if(keep_reconnect==0)
  184. {
  185. mylog(log_fatal,"server restarted or switched to handle another client,exited\n");
  186. myexit(-1);
  187. }
  188. else
  189. {
  190. if(got_feed_back==1)
  191. mylog(log_warn,"server restarted or switched to handle another client,but keep-reconnect enabled,trying to reconnect\n");
  192. got_feed_back=0;
  193. }
  194. continue;
  195. }
  196. else if(header==header_normal)
  197. {
  198. if(got_feed_back==0)
  199. mylog(log_info,"connection accepted by server\n");
  200. got_feed_back=1;
  201. }
  202. else
  203. {
  204. mylog(log_warn,"invalid header %d %d\n",int(header),len);
  205. continue;
  206. }
  207. mylog(log_trace,"Received packet from udp,len: %d\n",len);
  208. from_fec_to_normal2(conn_info,tun_dest,data,len);
  209. }
  210. else if (events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd())
  211. {
  212. uint64_t value;
  213. read(delay_manager.get_timer_fd(), &value, 8);
  214. mylog(log_trace,"events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd()\n");
  215. }
  216. else if (events[idx].data.u64 == (u64_t)fifo_fd)
  217. {
  218. char buf[buf_len];
  219. int len=read (fifo_fd, buf, sizeof (buf));
  220. if(len<0)
  221. {
  222. mylog(log_warn,"fifo read failed len=%d,errno=%s\n",len,strerror(errno));
  223. continue;
  224. }
  225. buf[len]=0;
  226. handle_command(buf);
  227. }
  228. else
  229. {
  230. assert(0==1);
  231. }
  232. }
  233. delay_manager.check();
  234. }
  235. return 0;
  236. }