tun_dev_client.cpp 7.9 KB

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