misc.cpp 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. /*
  2. * misc.cpp
  3. *
  4. * Created on: Oct 26, 2017
  5. * Author: root
  6. */
  7. #include "misc.h"
  8. char fifo_file[1000]="";
  9. int mtu_warn=1350;
  10. int disable_mtu_warn=1;
  11. int disable_fec=0;
  12. int debug_force_flush_fec=0;
  13. int jitter_min=0*1000;
  14. int jitter_max=0*1000;
  15. int output_interval_min=0*1000;
  16. int output_interval_max=0*1000;
  17. int fix_latency=0;
  18. u32_t local_ip_uint32,remote_ip_uint32=0;
  19. char local_ip[100], remote_ip[100];
  20. int local_port = -1, remote_port = -1;
  21. conn_manager_t conn_manager;
  22. delay_manager_t delay_manager;
  23. fd_manager_t fd_manager;
  24. int time_mono_test=0;
  25. int delay_capacity=0;
  26. char sub_net[100]="10.0.0.0";
  27. u32_t sub_net_uint32=0;
  28. char tun_dev[100]="";
  29. int from_normal_to_fec(conn_info_t & conn_info,char *data,int len,int & out_n,char **&out_arr,int *&out_len,my_time_t *&out_delay)
  30. {
  31. static my_time_t out_delay_buf[max_fec_packet_num+100]={0};
  32. //static int out_len_buf[max_fec_packet_num+100]={0};
  33. //static int counter=0;
  34. out_delay=out_delay_buf;
  35. //out_len=out_len_buf;
  36. inner_stat_t &inner_stat=conn_info.stat.normal_to_fec;
  37. if(disable_fec)
  38. {
  39. if(data==0)
  40. {
  41. out_n=0;
  42. return 0;
  43. }
  44. //assert(data!=0);
  45. inner_stat.input_packet_num++;
  46. inner_stat.input_packet_size+=len;
  47. inner_stat.output_packet_num++;
  48. inner_stat.output_packet_size+=len;
  49. out_n=1;
  50. static char *data_static;
  51. data_static=data;
  52. static int len_static;
  53. len_static=len;
  54. out_arr=&data_static;
  55. out_len=&len_static;
  56. out_delay[0]=0;
  57. }
  58. else
  59. {
  60. if(data!=0)
  61. {
  62. inner_stat.input_packet_num++;
  63. inner_stat.input_packet_size+=len;
  64. }
  65. //counter++;
  66. conn_info.fec_encode_manager.input(data,len);
  67. //if(counter%5==0)
  68. //conn_info.fec_encode_manager.input(0,0);
  69. //int n;
  70. //char **s_arr;
  71. //int s_len;
  72. conn_info.fec_encode_manager.output(out_n,out_arr,out_len);
  73. if(out_n>0)
  74. {
  75. my_time_t common_latency=0;
  76. my_time_t first_packet_time=conn_info.fec_encode_manager.get_first_packet_time();
  77. if(fix_latency==1&&conn_info.fec_encode_manager.get_type()==0)
  78. {
  79. my_time_t current_time=get_current_time_us();
  80. my_time_t tmp;
  81. assert(first_packet_time!=0);
  82. //mylog(log_info,"current_time=%llu first_packlet_time=%llu fec_pending_time=%llu\n",current_time,first_packet_time,(my_time_t)fec_pending_time);
  83. if((my_time_t)conn_info.fec_encode_manager.get_pending_time() >=(current_time - first_packet_time))
  84. {
  85. tmp=(my_time_t)conn_info.fec_encode_manager.get_pending_time()-(current_time - first_packet_time);
  86. //mylog(log_info,"tmp=%llu\n",tmp);
  87. }
  88. else
  89. {
  90. tmp=0;
  91. //mylog(log_info,"0\n");
  92. }
  93. common_latency+=tmp;
  94. }
  95. common_latency+=random_between(jitter_min,jitter_max);
  96. out_delay_buf[0]=common_latency;
  97. for(int i=1;i<out_n;i++)
  98. {
  99. out_delay_buf[i]=out_delay_buf[i-1]+ (my_time_t)( random_between(output_interval_min,output_interval_max)/(out_n-1) );
  100. }
  101. }
  102. }
  103. mylog(log_trace,"from_normal_to_fec input_len=%d,output_n=%d\n",len,out_n);
  104. if(out_n>0)
  105. {
  106. log_bare(log_trace,"seq= %u ",read_u32(out_arr[0]));
  107. }
  108. for(int i=0;i<out_n;i++)
  109. {
  110. inner_stat.output_packet_num++;
  111. inner_stat.output_packet_size+=out_len[i];
  112. log_bare(log_trace,"%d ",out_len[i]);
  113. }
  114. log_bare(log_trace,"\n");
  115. //for(int i=0;i<n;i++)
  116. //{
  117. //delay_send(0,dest,s_arr[i],s_len);
  118. //}
  119. //delay_send(0,dest,data,len);
  120. //delay_send(1000*1000,dest,data,len);
  121. return 0;
  122. }
  123. int from_fec_to_normal(conn_info_t & conn_info,char *data,int len,int & out_n,char **&out_arr,int *&out_len,my_time_t *&out_delay)
  124. {
  125. static my_time_t out_delay_buf[max_blob_packet_num+100]={0};
  126. out_delay=out_delay_buf;
  127. inner_stat_t &inner_stat=conn_info.stat.fec_to_normal;
  128. if(disable_fec)
  129. {
  130. assert(data!=0);
  131. inner_stat.input_packet_num++;
  132. inner_stat.input_packet_size+=len;
  133. inner_stat.output_packet_num++;
  134. inner_stat.output_packet_size+=len;
  135. if(data==0) return 0;
  136. out_n=1;
  137. static char *data_static;
  138. data_static=data;
  139. static int len_static;
  140. len_static=len;
  141. out_arr=&data_static;
  142. out_len=&len_static;
  143. out_delay[0]=0;
  144. }
  145. else
  146. {
  147. if(data!=0)
  148. {
  149. inner_stat.input_packet_num++;
  150. inner_stat.input_packet_size+=len;
  151. }
  152. conn_info.fec_decode_manager.input(data,len);
  153. //int n;char ** s_arr;int* len_arr;
  154. conn_info.fec_decode_manager.output(out_n,out_arr,out_len);
  155. for(int i=0;i<out_n;i++)
  156. {
  157. out_delay_buf[i]=0;
  158. inner_stat.output_packet_num++;
  159. inner_stat.output_packet_size+=out_len[i];
  160. }
  161. }
  162. mylog(log_trace,"from_fec_to_normal input_len=%d,output_n=%d,input_seq=%u\n",len,out_n,read_u32(data));
  163. // printf("<n:%d>",n);
  164. /*
  165. for(int i=0;i<n;i++)
  166. {
  167. delay_send(0,dest,s_arr[i],len_arr[i]);
  168. //s_arr[i][len_arr[i]]=0;
  169. //printf("<%s>\n",s_arr[i]);
  170. }*/
  171. //my_send(dest,data,len);
  172. return 0;
  173. }
  174. int delay_send(my_time_t delay,const dest_t &dest,char *data,int len)
  175. {
  176. //int rand=random()%100;
  177. //mylog(log_info,"rand = %d\n",rand);
  178. if (dest.cook&&random_drop != 0) {
  179. if (get_true_random_number() % 10000 < (u32_t) random_drop) {
  180. return 0;
  181. }
  182. }
  183. return delay_manager.add(delay,dest,data,len);;
  184. }
  185. int print_parameter()
  186. {
  187. mylog(log_info,"jitter_min=%d jitter_max=%d output_interval_min=%d output_interval_max=%d fec_timeout=%d fec_data_num=%d fec_redundant_num=%d fec_mtu=%d fec_queue_len=%d fec_mode=%d\n",
  188. jitter_min/1000,jitter_max/1000,output_interval_min/1000,output_interval_max/1000,g_fec_timeout/1000,
  189. g_fec_data_num,g_fec_redundant_num,g_fec_mtu,g_fec_queue_len,g_fec_mode);
  190. return 0;
  191. }
  192. int handle_command(char *s)
  193. {
  194. int len=strlen(s);
  195. while(len>=1&&s[len-1]=='\n')
  196. s[len-1]=0;
  197. mylog(log_info,"got data from fifo,len=%d,s=[%s]\n",len,s);
  198. int a=-1,b=-1;
  199. if(strncmp(s,"fec",strlen("fec"))==0)
  200. {
  201. mylog(log_info,"got command [fec]\n");
  202. sscanf(s,"fec %d:%d",&a,&b);
  203. if(a<1||b<0||a+b>254)
  204. {
  205. mylog(log_warn,"invaild value\n");
  206. return -1;
  207. }
  208. g_fec_data_num=a;
  209. g_fec_redundant_num=b;
  210. }
  211. else if(strncmp(s,"mtu",strlen("mtu"))==0)
  212. {
  213. mylog(log_info,"got command [mtu]\n");
  214. sscanf(s,"mtu %d",&a);
  215. if(a<100||a>2000)
  216. {
  217. mylog(log_warn,"invaild value\n");
  218. return -1;
  219. }
  220. g_fec_mtu=a;
  221. }
  222. else if(strncmp(s,"queue-len",strlen("queue-len"))==0)
  223. {
  224. mylog(log_info,"got command [queue-len]\n");
  225. sscanf(s,"queue-len %d",&a);
  226. if(a<1||a>10000)
  227. {
  228. mylog(log_warn,"invaild value\n");
  229. return -1;
  230. }
  231. g_fec_queue_len=a;
  232. }
  233. else if(strncmp(s,"mode",strlen("mode"))==0)
  234. {
  235. mylog(log_info,"got command [mode]\n");
  236. sscanf(s,"mode %d",&a);
  237. if(a!=0&&a!=1)
  238. {
  239. mylog(log_warn,"invaild value\n");
  240. return -1;
  241. }
  242. g_fec_mode=a;
  243. }
  244. else if(strncmp(s,"timeout",strlen("timeout"))==0)
  245. {
  246. mylog(log_info,"got command [timeout]\n");
  247. sscanf(s,"timeout %d",&a);
  248. if(a<0||a>1000)
  249. {
  250. mylog(log_warn,"invaild value\n");
  251. return -1;
  252. }
  253. g_fec_timeout=a*1000;
  254. }
  255. else
  256. {
  257. mylog(log_info,"unknown command\n");
  258. }
  259. print_parameter();
  260. return 0;
  261. }
  262. int unit_test()
  263. {
  264. int i,j,k;
  265. void *code=fec_new(3,6);
  266. char arr[6][100]=
  267. {
  268. "aaa","bbb","ccc"
  269. ,"ddd","eee","fff"
  270. };
  271. char *data[6];
  272. for(i=0;i<6;i++)
  273. {
  274. data[i]=arr[i];
  275. }
  276. rs_encode2(3,6,data,3);
  277. //printf("%d %d",(int)(unsigned char)arr[5][0],(int)('a'^'b'^'c'^'d'^'e'));
  278. for(i=0;i<6;i++)
  279. {
  280. printf("<%s>",data[i]);
  281. }
  282. data[0]=0;
  283. //data[1]=0;
  284. //data[5]=0;
  285. int ret=rs_decode2(3,6,data,3);
  286. printf("ret:%d\n",ret);
  287. for(i=0;i<6;i++)
  288. {
  289. printf("<%s>",data[i]);
  290. }
  291. fec_free(code);
  292. char arr2[6][100]=
  293. {
  294. "aaa11111","","ccc333333333"
  295. ,"ddd444","eee5555","ff6666"
  296. };
  297. blob_encode_t blob_encode;
  298. for(int i=0;i<6;i++)
  299. blob_encode.input(arr2[i],strlen(arr2[i]));
  300. char **output;
  301. int shard_len;
  302. blob_encode.output(7,output,shard_len);
  303. printf("<shard_len:%d>",shard_len);
  304. blob_decode_t blob_decode;
  305. for(int i=0;i<7;i++)
  306. {
  307. blob_decode.input(output[i],shard_len);
  308. }
  309. char **decode_output;
  310. int * len_arr;
  311. int num;
  312. ret=blob_decode.output(num,decode_output,len_arr);
  313. printf("<num:%d,ret:%d>\n",num,ret);
  314. for(int i=0;i<num;i++)
  315. {
  316. char buf[1000]={0};
  317. memcpy(buf,decode_output[i],len_arr[i]);
  318. printf("<%d:%s>",len_arr[i],buf);
  319. }
  320. printf("\n");
  321. static fec_encode_manager_t fec_encode_manager;
  322. static fec_decode_manager_t fec_decode_manager;
  323. {
  324. string a = "11111";
  325. string b = "22";
  326. string c = "33333333";
  327. fec_encode_manager.input((char *) a.c_str(), a.length());
  328. fec_encode_manager.input((char *) b.c_str(), b.length());
  329. fec_encode_manager.input((char *) c.c_str(), c.length());
  330. fec_encode_manager.input(0, 0);
  331. int n;
  332. char **s_arr;
  333. int *len;
  334. fec_encode_manager.output(n,s_arr,len);
  335. printf("<n:%d,len:%d>",n,len[0]);
  336. for(int i=0;i<n;i++)
  337. {
  338. fec_decode_manager.input(s_arr[i],len[i]);
  339. }
  340. {
  341. int n;char ** s_arr;int* len_arr;
  342. fec_decode_manager.output(n,s_arr,len_arr);
  343. printf("<n:%d>",n);
  344. for(int i=0;i<n;i++)
  345. {
  346. s_arr[i][len_arr[i]]=0;
  347. printf("<%s>\n",s_arr[i]);
  348. }
  349. }
  350. }
  351. {
  352. string a = "aaaaaaa";
  353. string b = "bbbbbbbbbbbbb";
  354. string c = "ccc";
  355. fec_encode_manager.input((char *) a.c_str(), a.length());
  356. fec_encode_manager.input((char *) b.c_str(), b.length());
  357. fec_encode_manager.input((char *) c.c_str(), c.length());
  358. fec_encode_manager.input(0, 0);
  359. int n;
  360. char **s_arr;
  361. int * len;
  362. fec_encode_manager.output(n,s_arr,len);
  363. printf("<n:%d,len:%d>",n,len[0]);
  364. for(int i=0;i<n;i++)
  365. {
  366. if(i==1||i==3||i==5||i==0)
  367. fec_decode_manager.input(s_arr[i],len[i]);
  368. }
  369. {
  370. int n;char ** s_arr;int* len_arr;
  371. fec_decode_manager.output(n,s_arr,len_arr);
  372. printf("<n:%d>",n);
  373. for(int i=0;i<n;i++)
  374. {
  375. s_arr[i][len_arr[i]]=0;
  376. printf("<%s>\n",s_arr[i]);
  377. }
  378. }
  379. }
  380. for(int i=0;i<10;i++)
  381. {
  382. string a = "aaaaaaaaaaaaaaaaaaaaaaa";
  383. string b = "bbbbbbbbbbbbb";
  384. string c = "cccccccccccccccccc";
  385. printf("======\n");
  386. int n;
  387. char **s_arr;
  388. int * len;
  389. fec_decode_manager.output(n,s_arr,len);
  390. fec_encode_manager.reset_fec_parameter(3,2,g_fec_mtu,g_fec_queue_len,g_fec_timeout,1);
  391. fec_encode_manager.input((char *) a.c_str(), a.length());
  392. fec_encode_manager.output(n,s_arr,len);
  393. assert(n==1);
  394. fec_decode_manager.input(s_arr[0],len[0]);
  395. fec_decode_manager.output(n,s_arr,len);
  396. assert(n==1);
  397. printf("%s\n",s_arr[0]);
  398. fec_encode_manager.input((char *) b.c_str(), b.length());
  399. fec_encode_manager.output(n,s_arr,len);
  400. assert(n==1);
  401. //fec_decode_manager.input(s_arr[0],len[0]);
  402. fec_encode_manager.input((char *) c.c_str(), c.length());
  403. fec_encode_manager.output(n,s_arr,len);
  404. assert(n==3);
  405. fec_decode_manager.input(s_arr[0],len[0]);
  406. //printf("n=%d\n",n);
  407. {
  408. int n;
  409. char **s_arr;
  410. int * len;
  411. fec_decode_manager.output(n,s_arr,len);
  412. assert(n==1);
  413. printf("%s\n",s_arr[0]);
  414. }
  415. fec_decode_manager.input(s_arr[1],len[1]);
  416. {
  417. int n;
  418. char **s_arr;
  419. int * len;
  420. fec_decode_manager.output(n,s_arr,len);
  421. assert(n==1);
  422. printf("n=%d\n",n);
  423. s_arr[0][len[0]]=0;
  424. printf("%s\n",s_arr[0]);
  425. }
  426. }
  427. return 0;
  428. }
  429. void process_arg(int argc, char *argv[])
  430. {
  431. int is_client=0,is_server=0;
  432. int i, j, k;
  433. int opt;
  434. static struct option long_options[] =
  435. {
  436. {"log-level", required_argument, 0, 1},
  437. {"log-position", no_argument, 0, 1},
  438. {"disable-color", no_argument, 0, 1},
  439. {"disable-filter", no_argument, 0, 1},
  440. {"disable-fec", no_argument, 0, 1},
  441. {"disable-obscure", no_argument, 0, 1},
  442. {"disable-xor", no_argument, 0, 1},
  443. {"fix-latency", no_argument, 0, 1},
  444. {"sock-buf", required_argument, 0, 1},
  445. {"random-drop", required_argument, 0, 1},
  446. {"report", required_argument, 0, 1},
  447. {"delay-capacity", required_argument, 0, 1},
  448. {"mtu", required_argument, 0, 1},
  449. {"mode", required_argument, 0,1},
  450. {"timeout", required_argument, 0,1},
  451. {"decode-buf", required_argument, 0,1},
  452. {"queue-len", required_argument, 0,'q'},
  453. {"fec", required_argument, 0,'f'},
  454. {"jitter", required_argument, 0,'j'},
  455. {"fifo", required_argument, 0, 1},
  456. {"sub-net", required_argument, 0, 1},
  457. {"tun-dev", optional_argument, 0, 1},
  458. {NULL, 0, 0, 0}
  459. };
  460. int option_index = 0;
  461. if (argc == 1)
  462. {
  463. print_help();
  464. myexit( -1);
  465. }
  466. for (i = 0; i < argc; i++)
  467. {
  468. if(strcmp(argv[i],"--unit-test")==0)
  469. {
  470. unit_test();
  471. myexit(0);
  472. }
  473. }
  474. for (i = 0; i < argc; i++)
  475. {
  476. if(strcmp(argv[i],"-h")==0||strcmp(argv[i],"--help")==0)
  477. {
  478. print_help();
  479. myexit(0);
  480. }
  481. }
  482. for (i = 0; i < argc; i++)
  483. {
  484. if(strcmp(argv[i],"--log-level")==0)
  485. {
  486. if(i<argc -1)
  487. {
  488. sscanf(argv[i+1],"%d",&log_level);
  489. if(0<=log_level&&log_level<log_end)
  490. {
  491. }
  492. else
  493. {
  494. log_bare(log_fatal,"invalid log_level\n");
  495. myexit(-1);
  496. }
  497. }
  498. }
  499. if(strcmp(argv[i],"--disable-color")==0)
  500. {
  501. enable_log_color=0;
  502. }
  503. }
  504. mylog(log_info,"argc=%d ", argc);
  505. for (i = 0; i < argc; i++) {
  506. log_bare(log_info, "%s ", argv[i]);
  507. }
  508. log_bare(log_info, "\n");
  509. if (argc == 1)
  510. {
  511. print_help();
  512. myexit(-1);
  513. }
  514. int no_l = 1, no_r = 1;
  515. while ((opt = getopt_long(argc, argv, "l:r:hcsk:j:f:p:n:i:q:",long_options,&option_index)) != -1)
  516. {
  517. //string opt_key;
  518. //opt_key+=opt;
  519. switch (opt)
  520. {
  521. case 'k':
  522. sscanf(optarg,"%s\n",key_string);
  523. mylog(log_debug,"key=%s\n",key_string);
  524. if(strlen(key_string)==0)
  525. {
  526. mylog(log_fatal,"key len=0??\n");
  527. myexit(-1);
  528. }
  529. break;
  530. case 'j':
  531. if (strchr(optarg, ':') == 0)
  532. {
  533. int jitter;
  534. sscanf(optarg,"%d\n",&jitter);
  535. if(jitter<0 ||jitter>1000*10)
  536. {
  537. mylog(log_fatal,"jitter must be between 0 and 10,000(10 second)\n");
  538. myexit(-1);
  539. }
  540. jitter_min=0;
  541. jitter_max=jitter;
  542. }
  543. else
  544. {
  545. sscanf(optarg,"%d:%d\n",&jitter_min,&jitter_max);
  546. if(jitter_min<0 ||jitter_max<0||jitter_min>jitter_max)
  547. {
  548. mylog(log_fatal," must satisfy 0<=jmin<=jmax\n");
  549. myexit(-1);
  550. }
  551. }
  552. jitter_min*=1000;
  553. jitter_max*=1000;
  554. break;
  555. case 'i':
  556. if (strchr(optarg, ':') == 0)
  557. {
  558. int output_interval=-1;
  559. sscanf(optarg,"%d\n",&output_interval);
  560. if(output_interval<0||output_interval>1000*10)
  561. {
  562. mylog(log_fatal,"output_interval must be between 0 and 10,000(10 second)\n");
  563. myexit(-1);
  564. }
  565. output_interval_min=output_interval_max=output_interval;
  566. }
  567. else
  568. {
  569. sscanf(optarg,"%d:%d\n",&output_interval_min,&output_interval_max);
  570. if(output_interval_min<0 ||output_interval_max<0||output_interval_min>output_interval_max)
  571. {
  572. mylog(log_fatal," must satisfy 0<=output_interval_min<=output_interval_max\n");
  573. myexit(-1);
  574. }
  575. }
  576. output_interval_min*=1000;
  577. output_interval_max*=1000;
  578. break;
  579. case 'f':
  580. if (strchr(optarg, ':') == 0)
  581. {
  582. mylog(log_fatal,"invalid format for f");
  583. myexit(-1);
  584. }
  585. else
  586. {
  587. sscanf(optarg,"%d:%d\n",&g_fec_data_num,&g_fec_redundant_num);
  588. if(g_fec_data_num<1 ||g_fec_redundant_num<0||g_fec_data_num+g_fec_redundant_num>254)
  589. {
  590. mylog(log_fatal,"fec_data_num<1 ||fec_redundant_num<0||fec_data_num+fec_redundant_num>254\n");
  591. myexit(-1);
  592. }
  593. }
  594. break;
  595. case 'q':
  596. sscanf(optarg,"%d",&g_fec_queue_len);
  597. if(g_fec_queue_len<1||g_fec_queue_len>10000)
  598. {
  599. mylog(log_fatal,"fec_pending_num should be between 1 and 10000\n");
  600. myexit(-1);
  601. }
  602. break;
  603. case 'c':
  604. is_client = 1;
  605. break;
  606. case 's':
  607. is_server = 1;
  608. break;
  609. case 'l':
  610. no_l = 0;
  611. if (strchr(optarg, ':') != 0)
  612. {
  613. sscanf(optarg, "%[^:]:%d", local_ip, &local_port);
  614. }
  615. else
  616. {
  617. mylog(log_fatal," -r ip:port\n");
  618. myexit(1);
  619. strcpy(local_ip, "127.0.0.1");
  620. sscanf(optarg, "%d", &local_port);
  621. }
  622. break;
  623. case 'r':
  624. no_r = 0;
  625. if (strchr(optarg, ':') != 0)
  626. {
  627. //printf("in :\n");
  628. //printf("%s\n",optarg);
  629. sscanf(optarg, "%[^:]:%d", remote_ip, &remote_port);
  630. //printf("%d\n",remote_port);
  631. }
  632. else
  633. {
  634. mylog(log_fatal," -r ip:port\n");
  635. myexit(1);
  636. strcpy(remote_ip, "127.0.0.1");
  637. sscanf(optarg, "%d", &remote_port);
  638. }
  639. break;
  640. case 'h':
  641. break;
  642. case 1:
  643. if(strcmp(long_options[option_index].name,"log-level")==0)
  644. {
  645. }
  646. else if(strcmp(long_options[option_index].name,"disable-filter")==0)
  647. {
  648. disable_replay_filter=1;
  649. //enable_log_color=0;
  650. }
  651. else if(strcmp(long_options[option_index].name,"disable-color")==0)
  652. {
  653. //enable_log_color=0;
  654. }
  655. else if(strcmp(long_options[option_index].name,"disable-fec")==0)
  656. {
  657. disable_fec=1;
  658. }
  659. else if(strcmp(long_options[option_index].name,"disable-obscure")==0)
  660. {
  661. mylog(log_info,"obscure disabled\n");
  662. disable_obscure=1;
  663. }
  664. else if(strcmp(long_options[option_index].name,"disable-xor")==0)
  665. {
  666. mylog(log_info,"xor disabled\n");
  667. disable_xor=1;
  668. }
  669. else if(strcmp(long_options[option_index].name,"fix-latency")==0)
  670. {
  671. mylog(log_info,"fix-latency enabled\n");
  672. fix_latency=1;
  673. }
  674. else if(strcmp(long_options[option_index].name,"log-position")==0)
  675. {
  676. enable_log_position=1;
  677. }
  678. else if(strcmp(long_options[option_index].name,"random-drop")==0)
  679. {
  680. sscanf(optarg,"%d",&random_drop);
  681. if(random_drop<0||random_drop>10000)
  682. {
  683. mylog(log_fatal,"random_drop must be between 0 10000 \n");
  684. myexit(-1);
  685. }
  686. mylog(log_info,"random_drop=%d\n",random_drop);
  687. }
  688. else if(strcmp(long_options[option_index].name,"delay-capacity")==0)
  689. {
  690. sscanf(optarg,"%d",&delay_capacity);
  691. if(delay_capacity<0)
  692. {
  693. mylog(log_fatal,"delay_capacity must be >=0 \n");
  694. myexit(-1);
  695. }
  696. }
  697. else if(strcmp(long_options[option_index].name,"report")==0)
  698. {
  699. sscanf(optarg,"%d",&report_interval);
  700. if(report_interval<=0)
  701. {
  702. mylog(log_fatal,"report_interval must be >0 \n");
  703. myexit(-1);
  704. }
  705. }
  706. else if(strcmp(long_options[option_index].name,"sock-buf")==0)
  707. {
  708. int tmp=-1;
  709. sscanf(optarg,"%d",&tmp);
  710. if(10<=tmp&&tmp<=10*1024)
  711. {
  712. socket_buf_size=tmp*1024;
  713. }
  714. else
  715. {
  716. mylog(log_fatal,"sock-buf value must be between 1 and 10240 (kbyte) \n");
  717. myexit(-1);
  718. }
  719. }
  720. else if(strcmp(long_options[option_index].name,"decode-buf")==0)
  721. {
  722. sscanf(optarg,"%d",&fec_buff_num);
  723. if(fec_buff_num<300 || fec_buff_num>20000)
  724. {
  725. mylog(log_fatal,"decode-buf value must be between 300 and 20000 (kbyte) \n");
  726. myexit(-1);
  727. }
  728. mylog(log_info,"decode-buf=%d\n",fec_buff_num);
  729. }
  730. else if(strcmp(long_options[option_index].name,"mode")==0)
  731. {
  732. sscanf(optarg,"%d",&g_fec_mode);
  733. if(g_fec_mode!=0&&g_fec_mode!=1)
  734. {
  735. mylog(log_fatal,"mode should be 0 or 1\n");
  736. myexit(-1);
  737. }
  738. }
  739. else if(strcmp(long_options[option_index].name,"mtu")==0)
  740. {
  741. sscanf(optarg,"%d",&g_fec_mtu);
  742. if(g_fec_mtu<100||g_fec_mtu>2000)
  743. {
  744. mylog(log_fatal,"fec_mtu should be between 100 and 2000\n");
  745. myexit(-1);
  746. }
  747. }
  748. else if(strcmp(long_options[option_index].name,"timeout")==0)
  749. {
  750. sscanf(optarg,"%d",&g_fec_timeout);
  751. if(g_fec_timeout<0||g_fec_timeout>1000)
  752. {
  753. mylog(log_fatal,"fec_pending_time should be between 0 and 1000(1s)\n");
  754. myexit(-1);
  755. }
  756. g_fec_timeout*=1000;
  757. }
  758. else if(strcmp(long_options[option_index].name,"fifo")==0)
  759. {
  760. sscanf(optarg,"%s",fifo_file);
  761. mylog(log_info,"fifo_file =%s \n",fifo_file);
  762. }
  763. else if(strcmp(long_options[option_index].name,"tun-dev")==0)
  764. {
  765. //sscanf(optarg,"%s",fifo_file);
  766. mylog(log_info,"enabled tun-dev mode\n");
  767. working_mode=tun_dev_mode;
  768. }
  769. else if(strcmp(long_options[option_index].name,"tun-dev")==0)
  770. {
  771. if(optarg!=0)
  772. {
  773. sscanf(optarg,"%s",tun_dev);
  774. mylog(log_info,"tun_dev =%s \n",tun_dev);
  775. }
  776. mylog(log_info,"running at tun-dev mode\n");
  777. }
  778. else
  779. {
  780. mylog(log_fatal,"unknown option\n");
  781. myexit(-1);
  782. }
  783. break;
  784. default:
  785. mylog(log_fatal,"unknown option <%x>", opt);
  786. myexit(-1);
  787. }
  788. }
  789. if (is_client == 0 && is_server == 0)
  790. {
  791. mylog(log_fatal,"-s -c hasnt been set\n");
  792. myexit(-1);
  793. }
  794. if (is_client == 1 && is_server == 1)
  795. {
  796. mylog(log_fatal,"-s -c cant be both set\n");
  797. myexit(-1);
  798. }
  799. if(is_client==1)
  800. {
  801. client_or_server=client_mode;
  802. }
  803. else
  804. {
  805. client_or_server=server_mode;
  806. }
  807. if(working_mode==tunnel_mode)
  808. {
  809. if (no_l)
  810. mylog(log_fatal,"error: -l not found\n");
  811. if (no_r)
  812. mylog(log_fatal,"error: -r not found\n");
  813. if (no_l || no_r)
  814. myexit(-1);
  815. }
  816. else if(working_mode==tun_dev_mode)
  817. {
  818. if(client_or_server==client_mode&&no_r)
  819. {
  820. mylog(log_fatal,"error: -r not found\n");
  821. myexit(-1);
  822. }
  823. else if(client_or_server==server_mode&&no_l)
  824. {
  825. mylog(log_fatal,"error: -l not found\n");
  826. myexit(-1);
  827. }
  828. }
  829. print_parameter();
  830. }
  831. void print_help()
  832. {
  833. char git_version_buf[100]={0};
  834. strncpy(git_version_buf,gitversion,10);
  835. printf("UDPspeeder V2\n");
  836. printf("git version: %s ",git_version_buf);
  837. printf("build date: %s %s\n",__DATE__,__TIME__);
  838. printf("repository: https://github.com/wangyu-/UDPspeeder\n");
  839. printf("\n");
  840. printf("usage:\n");
  841. printf(" run as client: ./this_program -c -l local_listen_ip:local_port -r server_ip:server_port [options]\n");
  842. printf(" run as server: ./this_program -s -l server_listen_ip:server_port -r remote_ip:remote_port [options]\n");
  843. printf("\n");
  844. printf("common options, must be same on both sides:\n");
  845. printf(" -k,--key <string> key for simple xor encryption. if not set, xor is disabled\n");
  846. printf("main options:\n");
  847. printf(" -f,--fec x:y forward error correction, send y redundant packets for every x packets\n");
  848. printf(" --timeout <number> how long could a packet be held in queue before doing fec, unit: ms, default: 8ms\n");
  849. printf(" --mode <number> fec-mode,available values: 0, 1; 0 cost less bandwidth, 1 cost less latency(default)\n");
  850. printf(" --report <number> turn on send/recv report, and set a period for reporting, unit: s\n");
  851. printf("advanced options:\n");
  852. printf(" --mtu <number> mtu. for mode 0, the program will split packet to segment smaller than mtu_value.\n");
  853. printf(" for mode 1, no packet will be split, the program just check if the mtu is exceed.\n");
  854. printf(" default value: 1250\n");
  855. printf(" -j,--jitter <number> simulated jitter. randomly delay first packet for 0~<number> ms, default value: 0.\n");
  856. printf(" do not use if you dont know what it means.\n");
  857. printf(" -i,--interval <number> scatter each fec group to a interval of <number> ms, to protect burst packet loss.\n");
  858. printf(" default value: 0. do not use if you dont know what it means.\n");
  859. printf(" --random-drop <number> simulate packet loss, unit: 0.01%%. default value: 0\n");
  860. printf(" --disable-obscure <number> disable obscure, to save a bit bandwidth and cpu\n");
  861. // printf(" --disable-xor <number> disable xor\n");
  862. printf("developer options:\n");
  863. printf(" --fifo <string> use a fifo(named pipe) for sending commands to the running program, so that you\n");
  864. printf(" can change fec encode parameters dynamically, check readme.md in repository for\n");
  865. printf(" supported commands.\n");
  866. printf(" -j ,--jitter jmin:jmax similiar to -j above, but create jitter randomly between jmin and jmax\n");
  867. printf(" -i,--interval imin:imax similiar to -i above, but scatter randomly between imin and imax\n");
  868. printf(" -q,--queue-len <number> max fec queue len, only for mode 0\n");
  869. printf(" --decode-buf <number> size of buffer of fec decoder,u nit: packet, default: 2000\n");
  870. printf(" --fix-latency <number> try to stabilize latency, only for mode 0\n");
  871. printf(" --delay-capacity <number> max number of delayed packets\n");
  872. printf(" --disable-fec <number> completely disable fec, turn the program into a normal udp tunnel\n");
  873. printf(" --sock-buf <number> buf size for socket, >=10 and <=10240, unit: kbyte, default: 1024\n");
  874. printf("log and help options:\n");
  875. printf(" --log-level <number> 0: never 1: fatal 2: error 3: warn \n");
  876. printf(" 4: info (default) 5: debug 6: trace\n");
  877. printf(" --log-position enable file name, function name, line number in log\n");
  878. printf(" --disable-color disable log color\n");
  879. printf(" -h,--help print this help message\n");
  880. //printf("common options,these options must be same on both side\n");
  881. }