main.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  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. using namespace std;
  11. int get_tun_fd(char * dev_name)
  12. {
  13. int tun_fd=open("/dev/net/tun",O_RDWR);
  14. if(tun_fd <0)
  15. {
  16. mylog(log_fatal,"open /dev/net/tun failed");
  17. myexit(-1);
  18. }
  19. struct ifreq ifr;
  20. memset(&ifr, 0, sizeof(ifr));
  21. ifr.ifr_flags = IFF_TUN|IFF_NO_PI;
  22. strncpy(ifr.ifr_name, dev_name, IFNAMSIZ);
  23. if(ioctl(tun_fd, TUNSETIFF, (void *)&ifr) != 0)
  24. {
  25. mylog(log_fatal,"open /dev/net/tun failed");
  26. myexit(-1);
  27. }
  28. return tun_fd;
  29. }
  30. int set_if(char *if_name,u32_t local_ip,u32_t remote_ip,int mtu)
  31. {
  32. //printf("i m here1\n");
  33. struct ifreq ifr;
  34. struct sockaddr_in sai;
  35. memset(&ifr,0,sizeof(ifr));
  36. memset(&sai, 0, sizeof(struct sockaddr));
  37. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  38. strncpy(ifr.ifr_name, if_name, IFNAMSIZ);
  39. sai.sin_family = AF_INET;
  40. sai.sin_port = 0;
  41. sai.sin_addr.s_addr = local_ip;
  42. memcpy(&ifr.ifr_addr,&sai, sizeof(struct sockaddr));
  43. assert(ioctl(sockfd, SIOCSIFADDR, &ifr)==0); //set source ip
  44. sai.sin_addr.s_addr = remote_ip;
  45. memcpy(&ifr.ifr_addr,&sai, sizeof(struct sockaddr));
  46. assert(ioctl(sockfd, SIOCSIFDSTADDR, &ifr)==0);//set dest ip
  47. ifr.ifr_mtu=mtu;
  48. assert(ioctl(sockfd, SIOCSIFMTU, &ifr)==0);//set mtu
  49. assert(ioctl(sockfd, SIOCGIFFLAGS, &ifr)==0);
  50. // ifr.ifr_flags |= ( IFF_UP|IFF_POINTOPOINT|IFF_RUNNING|IFF_NOARP|IFF_MULTICAST );
  51. ifr.ifr_flags = ( IFF_UP|IFF_POINTOPOINT|IFF_RUNNING|IFF_NOARP|IFF_MULTICAST );//set interface flags
  52. assert(ioctl(sockfd, SIOCSIFFLAGS, &ifr)==0);
  53. //printf("i m here2\n");
  54. return 0;
  55. }
  56. const char header_normal=1;
  57. const char header_new_connect=2;
  58. const char header_reject=3;
  59. int put_header(char header,char * data,int &len)
  60. {
  61. assert(len>=0);
  62. data[len]=header;
  63. len+=1;
  64. return 0;
  65. }
  66. int get_header(char &header,char * data,int &len)
  67. {
  68. assert(len>=0);
  69. if(len<1) return -1;
  70. len-=1;
  71. header=data[len];
  72. return 0;
  73. }
  74. int from_normal_to_fec2(conn_info_t & conn_info,dest_t &dest,char * data,int len,char header)
  75. {
  76. int out_n;char **out_arr;int *out_len;my_time_t *out_delay;
  77. from_normal_to_fec(conn_info,data,len,out_n,out_arr,out_len,out_delay);
  78. for(int i=0;i<out_n;i++)
  79. {
  80. char tmp_buf[buf_len];
  81. int tmp_len=out_len[i];
  82. memcpy(tmp_buf,out_arr[i],out_len[i]);
  83. put_header(header,tmp_buf,tmp_len);
  84. delay_send(out_delay[i],dest,tmp_buf,tmp_len);//this is slow but safer.just use this one
  85. //put_header(header,out_arr[i],out_len[i]);//modify in place
  86. //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
  87. }
  88. return 0;
  89. }
  90. int from_fec_to_normal2(conn_info_t & conn_info,dest_t &dest,char * data,int len)
  91. {
  92. int out_n;char **out_arr;int *out_len;my_time_t *out_delay;
  93. from_fec_to_normal(conn_info,data,len,out_n,out_arr,out_len,out_delay);
  94. for(int i=0;i<out_n;i++)
  95. {
  96. delay_send(out_delay[i],dest,out_arr[i],out_len[i]);
  97. }
  98. return 0;
  99. }
  100. int tun_dev_client_event_loop()
  101. {
  102. char data[buf_len];
  103. int len;
  104. int i,j,k,ret;
  105. int epoll_fd,tun_fd;
  106. int remote_fd;
  107. fd64_t remote_fd64;
  108. tun_fd=get_tun_fd(tun_dev);
  109. assert(tun_fd>0);
  110. assert(new_connected_socket(remote_fd,remote_ip_uint32,remote_port)==0);
  111. remote_fd64=fd_manager.create(remote_fd);
  112. assert(set_if(tun_dev,htonl((ntohl(sub_net_uint32)&0xFFFFFF00)|2),htonl((ntohl(sub_net_uint32)&0xFFFFFF00 )|1),g_fec_mtu)==0);
  113. epoll_fd = epoll_create1(0);
  114. assert(epoll_fd>0);
  115. const int max_events = 4096;
  116. struct epoll_event ev, events[max_events];
  117. if (epoll_fd < 0) {
  118. mylog(log_fatal,"epoll return %d\n", epoll_fd);
  119. myexit(-1);
  120. }
  121. ev.events = EPOLLIN;
  122. ev.data.u64 = remote_fd64;
  123. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, remote_fd, &ev);
  124. if (ret!=0) {
  125. mylog(log_fatal,"add remote_fd64 error\n");
  126. myexit(-1);
  127. }
  128. ev.events = EPOLLIN;
  129. ev.data.u64 = tun_fd;
  130. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, tun_fd, &ev);
  131. if (ret!=0) {
  132. mylog(log_fatal,"add tun_fd error\n");
  133. myexit(-1);
  134. }
  135. ev.events = EPOLLIN;
  136. ev.data.u64 = delay_manager.get_timer_fd();
  137. mylog(log_debug,"delay_manager.get_timer_fd()=%d\n",delay_manager.get_timer_fd());
  138. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, delay_manager.get_timer_fd(), &ev);
  139. if (ret!= 0) {
  140. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  141. myexit(-1);
  142. }
  143. conn_info_t *conn_info_p=new conn_info_t;
  144. conn_info_t &conn_info=*conn_info_p; //huge size of conn_info,do not allocate on stack
  145. u64_t tmp_timer_fd64=conn_info.fec_encode_manager.get_timer_fd64();
  146. ev.events = EPOLLIN;
  147. ev.data.u64 = tmp_timer_fd64;
  148. mylog(log_debug,"conn_info.fec_encode_manager.get_timer_fd64()=%llu\n",conn_info.fec_encode_manager.get_timer_fd64());
  149. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_manager.to_fd(tmp_timer_fd64), &ev);
  150. if (ret!= 0) {
  151. mylog(log_fatal,"add fec_encode_manager.get_timer_fd64() error\n");
  152. myexit(-1);
  153. }
  154. conn_info.timer.add_fd_to_epoll(epoll_fd);
  155. conn_info.timer.set_timer_repeat_us(timer_interval*1000);
  156. int fifo_fd=-1;
  157. if(fifo_file[0]!=0)
  158. {
  159. fifo_fd=create_fifo(fifo_file);
  160. ev.events = EPOLLIN;
  161. ev.data.u64 = fifo_fd;
  162. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev);
  163. if (ret!= 0) {
  164. mylog(log_fatal,"add fifo_fd to epoll error %s\n",strerror(errno));
  165. myexit(-1);
  166. }
  167. mylog(log_info,"fifo_file=%s\n",fifo_file);
  168. }
  169. dest_t udp_dest;
  170. udp_dest.cook=1;
  171. udp_dest.type=type_fd64;
  172. udp_dest.inner.fd64=remote_fd64;
  173. dest_t tun_dest;
  174. tun_dest.type=type_write_fd;
  175. tun_dest.inner.fd=tun_fd;
  176. int got_feed_back=0;
  177. while(1)////////////////////////
  178. {
  179. if(about_to_exit) myexit(0);
  180. int nfds = epoll_wait(epoll_fd, events, max_events, 180 * 1000);
  181. if (nfds < 0) { //allow zero
  182. if(errno==EINTR )
  183. {
  184. mylog(log_info,"epoll interrupted by signal\n");
  185. myexit(0);
  186. }
  187. else
  188. {
  189. mylog(log_fatal,"epoll_wait return %d\n", nfds);
  190. myexit(-1);
  191. }
  192. }
  193. int idx;
  194. for (idx = 0; idx < nfds; ++idx)
  195. {
  196. if(events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd())
  197. {
  198. uint64_t value;
  199. read(conn_info.timer.get_timer_fd(), &value, 8);
  200. mylog(log_trace,"events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd()\n");
  201. conn_info.stat.report_as_client();
  202. }
  203. else if(events[idx].data.u64==conn_info.fec_encode_manager.get_timer_fd64())
  204. {
  205. fd64_t fd64=events[idx].data.u64;
  206. mylog(log_trace,"events[idx].data.u64 == conn_info.fec_encode_manager.get_timer_fd64()\n");
  207. uint64_t value;
  208. if(!fd_manager.exist(fd64)) //fd64 has been closed
  209. {
  210. mylog(log_trace,"!fd_manager.exist(fd64)");
  211. continue;
  212. }
  213. if((ret=read(fd_manager.to_fd(fd64), &value, 8))!=8)
  214. {
  215. mylog(log_trace,"(ret=read(fd_manager.to_fd(fd64), &value, 8))!=8,ret=%d\n",ret);
  216. continue;
  217. }
  218. if(value==0)
  219. {
  220. mylog(log_debug,"value==0\n");
  221. continue;
  222. }
  223. assert(value==1);
  224. char header=(got_feed_back==0?header_new_connect:header_normal);
  225. from_normal_to_fec2(conn_info,udp_dest,0,0,header);
  226. }
  227. else if(events[idx].data.u64==(u64_t)tun_fd)
  228. {
  229. len=read(tun_fd,data,max_data_len);
  230. if(len<0)
  231. {
  232. mylog(log_warn,"read from tun_fd return %d,errno=%s\n",len,strerror(errno));
  233. continue;
  234. }
  235. if(len>=20)
  236. {
  237. u32_t dest_ip=htonl(read_u32(data+16));
  238. if( ( ntohl(sub_net_uint32)&0xFFFFFF00 ) != ( ntohl (dest_ip) &0xFFFFFF00) )
  239. {
  240. string sub=my_ntoa(dest_ip);
  241. string dst=my_ntoa( htonl( ntohl (dest_ip) &0xFFFFFF00) );
  242. mylog(log_warn,"packet's dest ip [%s] not in subnet [%s],dropped\n", sub.c_str(), dst.c_str());
  243. continue;
  244. }
  245. }
  246. mylog(log_trace,"Received packet from tun,len: %d\n",len);
  247. char header=(got_feed_back==0?header_new_connect:header_normal);
  248. from_normal_to_fec2(conn_info,udp_dest,data,len,header);
  249. }
  250. else if(events[idx].data.u64==(u64_t)remote_fd64)
  251. {
  252. fd64_t fd64=events[idx].data.u64;
  253. int fd=fd_manager.to_fd(fd64);
  254. len=recv(fd,data,max_data_len,0);
  255. if(len<0)
  256. {
  257. mylog(log_warn,"recv return %d,errno=%s\n",len,strerror(errno));
  258. continue;
  259. }
  260. if(de_cook(data,len)<0)
  261. {
  262. mylog(log_warn,"de_cook(data,len)failed \n");
  263. continue;
  264. }
  265. char header=0;
  266. if(get_header(header,data,len)!=0)
  267. {
  268. mylog(log_warn,"get_header failed\n");
  269. continue;
  270. }
  271. if(header==header_reject)
  272. {
  273. mylog(log_fatal,"server restarted or switched to handle another client,exited\n");
  274. myexit(-1);
  275. continue;
  276. }
  277. else if(header==header_normal)
  278. {
  279. if(got_feed_back==0)
  280. mylog(log_info,"connection accepted by server\n");
  281. got_feed_back=1;
  282. }
  283. else
  284. {
  285. mylog(log_warn,"invalid header %d %d\n",int(header),len);
  286. continue;
  287. }
  288. mylog(log_trace,"Received packet from udp,len: %d\n",len);
  289. from_fec_to_normal2(conn_info,tun_dest,data,len);
  290. }
  291. else if (events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd())
  292. {
  293. uint64_t value;
  294. read(delay_manager.get_timer_fd(), &value, 8);
  295. mylog(log_trace,"events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd()\n");
  296. }
  297. else if (events[idx].data.u64 == (u64_t)fifo_fd)
  298. {
  299. char buf[buf_len];
  300. int len=read (fifo_fd, buf, sizeof (buf));
  301. if(len<0)
  302. {
  303. mylog(log_warn,"fifo read failed len=%d,errno=%s\n",len,strerror(errno));
  304. continue;
  305. }
  306. buf[len]=0;
  307. handle_command(buf);
  308. }
  309. else
  310. {
  311. assert(0==1);
  312. }
  313. }
  314. delay_manager.check();
  315. }
  316. return 0;
  317. }
  318. int tun_dev_server_event_loop()
  319. {
  320. char data[buf_len];
  321. int len;
  322. int i,j,k,ret;
  323. int epoll_fd,tun_fd;
  324. int local_listen_fd;
  325. tun_fd=get_tun_fd(tun_dev);
  326. assert(tun_fd>0);
  327. assert(new_listen_socket(local_listen_fd,local_ip_uint32,local_port)==0);
  328. assert(set_if(tun_dev,htonl((ntohl(sub_net_uint32)&0xFFFFFF00)|1),htonl((ntohl(sub_net_uint32)&0xFFFFFF00 )|2),g_fec_mtu)==0);
  329. epoll_fd = epoll_create1(0);
  330. assert(epoll_fd>0);
  331. const int max_events = 4096;
  332. struct epoll_event ev, events[max_events];
  333. if (epoll_fd < 0) {
  334. mylog(log_fatal,"epoll return %d\n", epoll_fd);
  335. myexit(-1);
  336. }
  337. ev.events = EPOLLIN;
  338. ev.data.u64 = local_listen_fd;
  339. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, local_listen_fd, &ev);
  340. if (ret!=0) {
  341. mylog(log_fatal,"add udp_listen_fd error\n");
  342. myexit(-1);
  343. }
  344. ev.events = EPOLLIN;
  345. ev.data.u64 = tun_fd;
  346. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, tun_fd, &ev);
  347. if (ret!=0) {
  348. mylog(log_fatal,"add tun_fd error\n");
  349. myexit(-1);
  350. }
  351. ev.events = EPOLLIN;
  352. ev.data.u64 = delay_manager.get_timer_fd();
  353. mylog(log_debug,"delay_manager.get_timer_fd()=%d\n",delay_manager.get_timer_fd());
  354. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, delay_manager.get_timer_fd(), &ev);
  355. if (ret!= 0) {
  356. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  357. myexit(-1);
  358. }
  359. conn_info_t *conn_info_p=new conn_info_t;
  360. conn_info_t &conn_info=*conn_info_p; //huge size of conn_info,do not allocate on stack
  361. u64_t tmp_timer_fd64=conn_info.fec_encode_manager.get_timer_fd64();
  362. ev.events = EPOLLIN;
  363. ev.data.u64 = tmp_timer_fd64;
  364. mylog(log_debug,"conn_info.fec_encode_manager.get_timer_fd64()=%llu\n",conn_info.fec_encode_manager.get_timer_fd64());
  365. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_manager.to_fd(tmp_timer_fd64), &ev);
  366. if (ret!= 0) {
  367. mylog(log_fatal,"add fec_encode_manager.get_timer_fd64() error\n");
  368. myexit(-1);
  369. }
  370. conn_info.timer.add_fd_to_epoll(epoll_fd);
  371. conn_info.timer.set_timer_repeat_us(timer_interval*1000);
  372. int fifo_fd=-1;
  373. if(fifo_file[0]!=0)
  374. {
  375. fifo_fd=create_fifo(fifo_file);
  376. ev.events = EPOLLIN;
  377. ev.data.u64 = fifo_fd;
  378. ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev);
  379. if (ret!= 0) {
  380. mylog(log_fatal,"add fifo_fd to epoll error %s\n",strerror(errno));
  381. myexit(-1);
  382. }
  383. mylog(log_info,"fifo_file=%s\n",fifo_file);
  384. }
  385. dest_t udp_dest;
  386. udp_dest.cook=1;
  387. udp_dest.type=type_fd_ip_port;
  388. udp_dest.inner.fd_ip_port.fd=local_listen_fd;
  389. udp_dest.inner.fd_ip_port.ip_port.ip=0;
  390. udp_dest.inner.fd_ip_port.ip_port.port=0;
  391. dest_t tun_dest;
  392. tun_dest.type=type_write_fd;
  393. tun_dest.inner.fd=tun_fd;
  394. while(1)////////////////////////
  395. {
  396. if(about_to_exit) myexit(0);
  397. int nfds = epoll_wait(epoll_fd, events, max_events, 180 * 1000);
  398. if (nfds < 0) { //allow zero
  399. if(errno==EINTR )
  400. {
  401. mylog(log_info,"epoll interrupted by signal\n");
  402. myexit(0);
  403. }
  404. else
  405. {
  406. mylog(log_fatal,"epoll_wait return %d\n", nfds);
  407. myexit(-1);
  408. }
  409. }
  410. int idx;
  411. for (idx = 0; idx < nfds; ++idx)
  412. {
  413. if(events[idx].data.u64==(u64_t)conn_info.timer.get_timer_fd())
  414. {
  415. uint64_t value;
  416. read(conn_info.timer.get_timer_fd(), &value, 8);
  417. if(udp_dest.inner.fd64_ip_port.ip_port.to_u64()==0)
  418. {
  419. continue;
  420. }
  421. conn_info.stat.report_as_server(udp_dest.inner.fd_ip_port.ip_port);
  422. }
  423. else if(events[idx].data.u64==conn_info.fec_encode_manager.get_timer_fd64())
  424. {
  425. assert(udp_dest.inner.fd64_ip_port.ip_port.to_u64()!=0);
  426. mylog(log_trace,"events[idx].data.u64 == conn_info.fec_encode_manager.get_timer_fd64()\n");
  427. uint64_t fd64=events[idx].data.u64;
  428. //mylog(log_info,"timer!!!\n");
  429. uint64_t value;
  430. if(!fd_manager.exist(fd64)) //fd64 has been closed
  431. {
  432. mylog(log_trace,"!fd_manager.exist(fd64)");
  433. continue;
  434. }
  435. if((ret=read(fd_manager.to_fd(fd64), &value, 8))!=8)
  436. {
  437. mylog(log_trace,"(ret=read(fd_manager.to_fd(fd64), &value, 8))!=8,ret=%d\n",ret);
  438. continue;
  439. }
  440. if(value==0)
  441. {
  442. mylog(log_debug,"value==0\n");
  443. continue;
  444. }
  445. assert(value==1);
  446. from_normal_to_fec2(conn_info,udp_dest,0,0,header_normal);
  447. }
  448. else if(events[idx].data.u64==(u64_t)local_listen_fd)
  449. {
  450. struct sockaddr_in udp_new_addr_in={0};
  451. socklen_t udp_new_addr_len = sizeof(sockaddr_in);
  452. if ((len = recvfrom(local_listen_fd, data, max_data_len, 0,
  453. (struct sockaddr *) &udp_new_addr_in, &udp_new_addr_len)) < 0) {
  454. mylog(log_error,"recv_from error,this shouldnt happen,err=%s,but we can try to continue\n",strerror(errno));
  455. continue;
  456. //myexit(1);
  457. };
  458. if(de_cook(data,len)<0)
  459. {
  460. mylog(log_warn,"de_cook(data,len)failed \n");
  461. continue;
  462. }
  463. char header=0;
  464. if(get_header(header,data,len)!=0)
  465. {
  466. mylog(log_warn,"get_header failed\n");
  467. continue;
  468. }
  469. 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)))
  470. {
  471. if(header!=header_new_connect&& header!=header_normal)
  472. {
  473. mylog(log_warn,"invalid header\n");
  474. continue;
  475. }
  476. }
  477. else
  478. {
  479. if(header==header_new_connect)
  480. {
  481. mylog(log_info,"new connection from %s:%d \n", inet_ntoa(udp_new_addr_in.sin_addr),
  482. ntohs(udp_new_addr_in.sin_port));
  483. udp_dest.inner.fd_ip_port.ip_port.ip=udp_new_addr_in.sin_addr.s_addr;
  484. udp_dest.inner.fd_ip_port.ip_port.port=ntohs(udp_new_addr_in.sin_port);
  485. conn_info.fec_decode_manager.clear();
  486. conn_info.fec_encode_manager.clear();
  487. memset(&conn_info.stat,0,sizeof(conn_info.stat));
  488. }
  489. else if(header==header_normal)
  490. {
  491. mylog(log_info,"rejected connection from %s:%d\n", inet_ntoa(udp_new_addr_in.sin_addr),ntohs(udp_new_addr_in.sin_port));
  492. len=1;
  493. data[0]=header_reject;
  494. do_cook(data,len);
  495. dest_t tmp_dest;
  496. tmp_dest.type=type_fd_ip_port;
  497. tmp_dest.inner.fd_ip_port.fd=local_listen_fd;
  498. tmp_dest.inner.fd_ip_port.ip_port.ip=udp_new_addr_in.sin_addr.s_addr;
  499. tmp_dest.inner.fd_ip_port.ip_port.port=ntohs(udp_new_addr_in.sin_port);
  500. delay_manager.add(0,tmp_dest,data,len);;
  501. continue;
  502. }
  503. else
  504. {
  505. mylog(log_warn,"invalid header\n");
  506. }
  507. }
  508. mylog(log_trace,"Received packet from %s:%d,len: %d\n", inet_ntoa(udp_new_addr_in.sin_addr),
  509. ntohs(udp_new_addr_in.sin_port),len);
  510. from_fec_to_normal2(conn_info,tun_dest,data,len);
  511. }
  512. else if(events[idx].data.u64==(u64_t)tun_fd)
  513. {
  514. len=read(tun_fd,data,max_data_len);
  515. if(len<0)
  516. {
  517. mylog(log_warn,"read from tun_fd return %d,errno=%s\n",len,strerror(errno));
  518. continue;
  519. }
  520. mylog(log_trace,"Received packet from tun,len: %d\n",len);
  521. if(udp_dest.inner.fd64_ip_port.ip_port.to_u64()==0)
  522. {
  523. mylog(log_debug,"received packet from tun,but there is no client yet,dropped packet\n");
  524. continue;
  525. }
  526. from_normal_to_fec2(conn_info,udp_dest,data,len,header_normal);
  527. }
  528. else if (events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd())
  529. {
  530. uint64_t value;
  531. read(delay_manager.get_timer_fd(), &value, 8);
  532. mylog(log_trace,"events[idx].data.u64 == (u64_t)delay_manager.get_timer_fd()\n");
  533. }
  534. else if (events[idx].data.u64 == (u64_t)fifo_fd)
  535. {
  536. char buf[buf_len];
  537. int len=read (fifo_fd, buf, sizeof (buf));
  538. if(len<0)
  539. {
  540. mylog(log_warn,"fifo read failed len=%d,errno=%s\n",len,strerror(errno));
  541. continue;
  542. }
  543. buf[len]=0;
  544. handle_command(buf);
  545. }
  546. else
  547. {
  548. assert(0==1);
  549. }
  550. }
  551. delay_manager.check();
  552. }
  553. return 0;
  554. }
  555. static void print_help()
  556. {
  557. char git_version_buf[100]={0};
  558. strncpy(git_version_buf,gitversion,10);
  559. printf("UDPspeeder V2\n");
  560. printf("git version: %s ",git_version_buf);
  561. printf("build date: %s %s\n",__DATE__,__TIME__);
  562. printf("repository: https://github.com/wangyu-/UDPspeeder\n");
  563. printf("\n");
  564. printf("usage:\n");
  565. printf(" run as client: ./this_program -c -l local_listen_ip:local_port -r server_ip:server_port [options]\n");
  566. printf(" run as server: ./this_program -s -l server_listen_ip:server_port -r remote_ip:remote_port [options]\n");
  567. printf("\n");
  568. printf("common options, must be same on both sides:\n");
  569. printf(" -k,--key <string> key for simple xor encryption. if not set, xor is disabled\n");
  570. printf("main options:\n");
  571. printf(" -f,--fec x:y forward error correction, send y redundant packets for every x packets\n");
  572. printf(" --timeout <number> how long could a packet be held in queue before doing fec, unit: ms, default: 8ms\n");
  573. printf(" --mode <number> fec-mode,available values: 0, 1; 0 cost less bandwidth, 1 cost less latency(default)\n");
  574. printf(" --report <number> turn on send/recv report, and set a period for reporting, unit: s\n");
  575. printf("advanced options:\n");
  576. printf(" --mtu <number> mtu. for mode 0, the program will split packet to segment smaller than mtu_value.\n");
  577. printf(" for mode 1, no packet will be split, the program just check if the mtu is exceed.\n");
  578. printf(" default value: 1250\n");
  579. printf(" -j,--jitter <number> simulated jitter. randomly delay first packet for 0~<number> ms, default value: 0.\n");
  580. printf(" do not use if you dont know what it means.\n");
  581. printf(" -i,--interval <number> scatter each fec group to a interval of <number> ms, to protect burst packet loss.\n");
  582. printf(" default value: 0. do not use if you dont know what it means.\n");
  583. printf(" --random-drop <number> simulate packet loss, unit: 0.01%%. default value: 0\n");
  584. printf(" --disable-obscure <number> disable obscure, to save a bit bandwidth and cpu\n");
  585. // printf(" --disable-xor <number> disable xor\n");
  586. printf("developer options:\n");
  587. printf(" --fifo <string> use a fifo(named pipe) for sending commands to the running program, so that you\n");
  588. printf(" can change fec encode parameters dynamically, check readme.md in repository for\n");
  589. printf(" supported commands.\n");
  590. printf(" -j ,--jitter jmin:jmax similiar to -j above, but create jitter randomly between jmin and jmax\n");
  591. printf(" -i,--interval imin:imax similiar to -i above, but scatter randomly between imin and imax\n");
  592. printf(" -q,--queue-len <number> max fec queue len, only for mode 0\n");
  593. printf(" --decode-buf <number> size of buffer of fec decoder,u nit: packet, default: 2000\n");
  594. printf(" --fix-latency <number> try to stabilize latency, only for mode 0\n");
  595. printf(" --delay-capacity <number> max number of delayed packets\n");
  596. printf(" --disable-fec <number> completely disable fec, turn the program into a normal udp tunnel\n");
  597. printf(" --sock-buf <number> buf size for socket, >=10 and <=10240, unit: kbyte, default: 1024\n");
  598. printf("log and help options:\n");
  599. printf(" --log-level <number> 0: never 1: fatal 2: error 3: warn \n");
  600. printf(" 4: info (default) 5: debug 6: trace\n");
  601. printf(" --log-position enable file name, function name, line number in log\n");
  602. printf(" --disable-color disable log color\n");
  603. printf(" -h,--help print this help message\n");
  604. //printf("common options,these options must be same on both side\n");
  605. }
  606. int main(int argc, char *argv[])
  607. {
  608. //working_mode=tunnel_mode;
  609. assert(sizeof(u64_t)==8);
  610. assert(sizeof(i64_t)==8);
  611. assert(sizeof(u32_t)==4);
  612. assert(sizeof(i32_t)==4);
  613. assert(sizeof(u16_t)==2);
  614. assert(sizeof(i16_t)==2);
  615. dup2(1, 2); //redirect stderr to stdout
  616. int i, j, k;
  617. if (argc == 1)
  618. {
  619. print_help();
  620. myexit( -1);
  621. }
  622. for (i = 0; i < argc; i++)
  623. {
  624. if(strcmp(argv[i],"-h")==0||strcmp(argv[i],"--help")==0)
  625. {
  626. print_help();
  627. myexit(0);
  628. }
  629. }
  630. process_arg(argc,argv);
  631. delay_manager.set_capacity(delay_capacity);
  632. local_ip_uint32=inet_addr(local_ip);
  633. remote_ip_uint32=inet_addr(remote_ip);
  634. sub_net_uint32=inet_addr(sub_net);
  635. if(strlen(tun_dev)==0)
  636. {
  637. sprintf(tun_dev,"tun%u",get_true_random_number()%1000);
  638. }
  639. if(client_or_server==client_mode)
  640. {
  641. tun_dev_client_event_loop();
  642. }
  643. else
  644. {
  645. tun_dev_server_event_loop();
  646. }
  647. return 0;
  648. }