ontime.pl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. # get arguments ontime.pl <duration> <filename> <#i> <retries>
  3. $simtime = shift;  # length of simulation run
  4. $filename = shift; # file to write into
  5. $i = shift;        # run #
  6. $retries = shift;  # number of retries (0,1,..5)
  7. print "$i, $simtime, $filename $retriesn";
  8. $linkrate = 10000000;
  9. $pktsize = 1040;  #TCP
  10. #$pktsize = 512; #CBR
  11. #get the totalpackets and numrexmit'ed packets number
  12. # this method is inaccurate compared to getting pkt num from ns trace outfile
  13. #$ndatapack = 0;
  14. #$nrexmitpack = 0;
  15. # for tracing seqno and cwnd values
  16. open(SEQ, ">seqno.$filename.$i") || die "Can't open seqno.$filename.$retries.$in";
  17. #open(CWND, ">cwnd.$filename.$i") || die "Can't open seqno.$filename.$retries.$in";
  18. #open file for writing/appending
  19. open(LOG1, ">>$filename") || die "Can't open $filenamen";
  20. open(LOG2, ">>$filename.stat") || die "Can't open $filename.statn";
  21. open(NSTRACE, "case0.tcp_trace.$i") || die "Can't open case0.tcp_trace.$in";
  22. while ($temp = <NSTRACE>) {
  23.     chomp($temp);
  24.     @line = split " ", $temp;
  25.     $var = @line[5];
  26.     $val = @line[6];
  27.     #if ($var eq "ndatapack_") {
  28. #$ndatapack = $val;
  29.     #}
  30.     #elsif ($var eq "nrexmitpack_") {
  31. #$nrexmitpack = $val;
  32.     #}
  33.     if ($var eq "t_seqno_") {
  34. print SEQ "@line[0] $valn";
  35.     }
  36.     #elsif ($var eq "cwnd_") {
  37. #print CWND "@line[0] $valn";
  38.     #}
  39. }
  40. #print ("ndatapack= $ndatapack, nrexmitpack = $nrexmitpackn");
  41. #$pktrecvd = $ndatapack - $nrexmitpack;
  42. #print ("pktrecvd = $pktrecvdn");
  43. #$datarecvd = $pktrecvd * $pktsize ;  # in bytes
  44. #print("datarecvd = $datarecvdn");
  45. # find total num of pkts recvd at sink from tracefile
  46. # this doesn't work as the tracefile doesn't seem to be tracing recvs at the agent layer (TCP)
  47. $bytenum = 0;
  48. open(TRFILE, "case0.tr") || die "Can't open case0.trn";
  49. while ($temp = <TRFILE>) {
  50.     chomp($temp);
  51.     @line = split " ", $temp;
  52.     $op = @line[0];
  53.     $s = @line[2];
  54.     $d = @line[3];
  55.     if ($op eq "r") {
  56. if ($s == 0 && $d == 1 ) {
  57.     $p = @line[4];
  58.     if (($p eq "tcp") || ($p eq "cbr")) {
  59.     #if ($s == 0 && $d == 1 ) {
  60. $tcppkts = @line[10];
  61.     }
  62.     #if (($op eq "r") || ($op eq "e")) {
  63.     #if ($s == 0 && $d == 1 ) {
  64.     $bytenum = $bytenum + @line[5];
  65. }
  66.     }
  67. }
  68. print "total tcp pkts recvd = $tcppktsn";
  69. $datarecvd = $tcppkts * $pktsize ;  # in bytes
  70. print("total tcp bytes recvd = $datarecvdn");
  71. print "total link bytes recvd = $bytenumn";
  72. # calculate on and off times from timer state output
  73. # first get the ON/OFF timestamps from tracefile
  74. #for ontime distribution
  75. $a1 = 0;  # less than 1
  76. $a2 = 0;
  77. $a3 = 0;
  78. $a4 = 0;  # between 1 and 5
  79. $a5 = 0;  # between 5 and 10
  80. $a6 = 0;  # between 10 and 50
  81. $a7 = 0;  # more than 50
  82. $a8 = 0;
  83. $a9 = 0;
  84. $a10 = 0;  # less than 1
  85. $a11 = 0;
  86. $a12 = 0;
  87. $a13 = 0;  # between 1 and 5
  88. $a14 = 0;  # between 5 and 10
  89. $a15 = 0;  # between 10 and 50
  90. $a16 = 0;  # more than 50
  91. $a17 = 0;
  92. $a18 = 0;
  93. $a19 = 0;
  94. $a20 = 0;
  95. $a21 = 0;
  96. $a22 = 0;
  97. $a23 = 0;
  98. $a24 = 0;
  99. $a25 = 0;
  100. $a26 = 0;
  101. #for offtime distribution
  102. $p1 = 0;  # less than 1
  103. $p2 = 0;
  104. $p3 = 0;
  105. $p4 = 0;  # between 1 and 5
  106. $p5 = 0;  # between 5 and 10
  107. $p6 = 0;  # between 10 and 50
  108. $p7 = 0;  # more than 50
  109. $p8 = 0;
  110. $p9 = 0;
  111. $p10 = 0;  # less than 1
  112. $p11 = 0;
  113. $p12 = 0;
  114. $p13 = 0;  # between 1 and 5
  115. $p14 = 0;  # between 5 and 10
  116. $p15 = 0;  # between 10 and 50
  117. $p16 = 0;  # more than 50
  118. $p17 = 0;
  119. $p18 = 0;  # between 1 and 5
  120. $p19 = 0;  # between 5 and 10
  121. $p20 = 0;  # between 10 and 50
  122. $p21 = 0;
  123. open(STATES, "+< states.tr") || die "Can't open states.trn";
  124. $offtime = 0;
  125. $ontime = 0;
  126. $temp = <STATES>;
  127. chomp($temp);
  128. @line = split " ", $temp;
  129. $t1 = @line[1];
  130. $d1 = @line[7];
  131. $timer1 = @line[3];
  132. $max = 0;
  133. $num = 0;
  134. if ($d1 > $max) {
  135.     $max = $d1;
  136. }
  137. while ($temp = <STATES>) {
  138.     chomp($temp);
  139.     @line = split " ", $temp;
  140.     $t2 = @line[1];
  141.     $d2 = @line[7];
  142.     $timer2 = @line[3];
  143.     
  144.     if ($d2 > $max) {
  145. $max = $d2;
  146.     }
  147.     
  148.     $old_ontime = $ontime;
  149.     $old_offtime = $offtime;
  150.     #print "old_ontime = $ontime; old_offtime = $offtimen";
  151.     #compare_OR_onoff_times($t1, $d1, $timer1, $t2, $d2, $timer2, $ontime, $offtime);
  152.     # state is on if either timer1 or timer2 is on
  153.     if ($timer1 eq $timer2) { #same timer
  154. $ontime += $d1;
  155. $offtime += $t2 - ($t1 + $d1);
  156. $t1 = $t2;
  157. $d1 = $d2;
  158. $timer1 = $timer2;
  159. $num++;
  160.     }  
  161.     else { # different timer
  162. if ($t2 >= ($t1 + $d1)) {
  163.     $ontime += $d1;
  164.     $offtime += $t2 - ($t1 + $d1);
  165.     $t1 = $t2;
  166.     $d1 = $d2;
  167.     $timer1 = $timer2;
  168.     $num++;
  169. }
  170. else { # t2 < ($t1+$d1)
  171.     if ( $t1+$d1 >= $t2+$d2 ) {
  172.     } 
  173.     else { # t1+d1 < t2+d2
  174. $ontime += $t2 - $t1;
  175. $t1 = $t2;
  176. $d1 = $d2;
  177. $timer1 = $timer2;
  178. $num++;
  179.     }
  180. }
  181.     }
  182.     #print "ontime = $ontime; offtime = $offtimen";
  183.     $delta_ontime = $ontime - $old_ontime;
  184.     $delta_offtime = $offtime - $old_offtime;
  185.     # creating distributions for on and off time
  186.     if ($delta_ontime > 0) {
  187. if ($delta_ontime < 2) {
  188.     $a1++;
  189. } elsif ($delta_ontime >= 2 && $delta_ontime < 4) {
  190.     $a2++;
  191. } elsif ($delta_ontime >= 4 && $delta_ontime < 6) {
  192.     $a3++;
  193. } elsif ($delta_ontime >= 6 && $delta_ontime < 8) {
  194.     $a4++;
  195. } elsif ($delta_ontime >= 8 && $delta_ontime < 10) {
  196.     $a5++;
  197. } elsif ($delta_ontime >= 10 && $delta_ontime < 12) {
  198.     $a6++;
  199. } elsif ( $delta_ontime >= 12 && $delta_ontime < 14) {
  200.     $a7++;
  201. } elsif ($delta_ontime >= 14 && $delta_ontime < 16) {
  202.     $a8++;
  203. } elsif ( $delta_ontime >= 16 && $delta_ontime < 18) {
  204.     $a9++;
  205. } elsif ($delta_ontime >= 18 && $delta_ontime < 20) {
  206.     $a10++;
  207. } elsif ($delta_ontime >= 20 && $delta_ontime < 22) {
  208.     $a11++;
  209. } elsif ($delta_ontime >= 22 && $delta_ontime < 24) {
  210.     $a12++;
  211. } elsif ($delta_ontime >= 24 && $delta_ontime < 26) {
  212.     $a13++;
  213. } elsif ($delta_ontime >= 26 && $delta_ontime < 28) {
  214.     $a14++;
  215. } elsif ($delta_ontime >= 28 && $delta_ontime < 30) {
  216.     $a15++;
  217. } elsif ( $delta_ontime >= 30 && $delta_ontime < 32) {
  218.     $a16++;
  219. } elsif ($delta_ontime >= 32 && $delta_ontime < 34) {
  220.     $a17++;
  221. } elsif ( $delta_ontime >= 34 && $delta_ontime < 36) {
  222.     $a18++;
  223. } elsif ($delta_ontime >= 36 && $delta_ontime < 38) {
  224.     $a19++;    
  225. } elsif ( $delta_ontime >= 38 && $delta_ontime < 40) {
  226.     $a20++;
  227. } elsif ($delta_ontime >= 40 && $delta_ontime < 42) {
  228.     $a21++;
  229. } elsif ( $delta_ontime >= 42 && $delta_ontime < 44) {
  230.     $a22++;
  231. } elsif ($delta_ontime >= 44 && $delta_ontime < 46) {
  232.     $a23++;
  233. } elsif ($delta_ontime >= 46 && $delta_ontime < 48) {
  234.     $a24++;
  235. } elsif ($delta_ontime >= 48 && $delta_ontime < 50) {
  236.     $a25++;    
  237. } elsif ($delta_ontime >= 50) {
  238.     $a26++;
  239. }
  240.     }
  241.     
  242.     #print "delta_ontime=$delta_ontime a1=$a1 a2=$a2 a3=$a3 b=$b c=$c d=$d e=$en";
  243.     #now for distribution for offtimes
  244.     if ($delta_offtime > 0) {
  245. if ($delta_ontime < 0.2) {
  246.     $p1++;
  247. } elsif ($delta_ontime >= 0.2 && $delta_ontime < 0.4) {
  248.     $p2++;
  249. } elsif ($delta_ontime >= 0.4 && $delta_ontime < 0.6) {
  250.     $p3++;
  251. } elsif ($delta_ontime >= 0.6 && $delta_ontime < 0.8) {
  252.     $p4++;
  253. } elsif ($delta_ontime >= 0.8 && $delta_ontime < 1.0) {
  254.     $p5++;
  255. } elsif ($delta_ontime >= 1.0 && $delta_ontime < 1.2) {
  256.     $p6++;
  257. } elsif ( $delta_ontime >= 1.2 && $delta_ontime < 1.4) {
  258.     $p7++;
  259. } elsif ($delta_ontime >= 1.4 && $delta_ontime < 1.6) {
  260.     $p8++;
  261. } elsif ( $delta_ontime >= 1.6 && $delta_ontime < 1.8) {
  262.     $p9++;
  263. } elsif ($delta_ontime >= 1.8 && $delta_ontime < 2.0) {
  264.     $p10++;
  265. } elsif ($delta_ontime >= 2.0 && $delta_ontime < 2.2) {
  266.     $p11++;
  267. } elsif ($delta_ontime >= 2.2 && $delta_ontime < 2.4) {
  268.     $p12++;
  269. } elsif ($delta_ontime >= 2.4 && $delta_ontime < 2.6) {
  270.     $p13++;
  271. } elsif ($delta_ontime >= 2.6 && $delta_ontime < 2.8) {
  272.     $p14++;
  273. } elsif ($delta_ontime >= 2.8 && $delta_ontime < 3.0) {
  274.     $p15++;
  275.         } elsif ( $delta_ontime >= 3.0 && $delta_ontime < 3.2) {
  276.     $p16++;
  277. } elsif ($delta_ontime >= 3.2 && $delta_ontime < 3.4) {
  278.     $p17++;
  279. } elsif ( $delta_ontime >= 3.4 && $delta_ontime < 3.6) {
  280.     $p18++;
  281. } elsif ($delta_ontime >= 3.6 && $delta_ontime < 3.8) {
  282.     $p19++;    
  283. } elsif ( $delta_ontime >= 3.8 && $delta_ontime < 4.0) {
  284.     $p20++;
  285.         } elsif ($delta_ontime >= 4.0) {
  286.     $p21++;
  287. }
  288.     }
  289.     #print "delta_offtime=$delta_offtime p1=$p1 p2=$p2 p3=$p3 q=$q r=$r s=$s t=$tn";
  290.     
  291. }
  292. # check for end of sim cases
  293. if (($t1+$d1) > $simtime) {
  294.     $ontime += $simtime - $t1;
  295. } else {
  296.     $ontime += $d1;
  297. }
  298. $num++;
  299. # creating distributions for on and off time
  300. if ($delta_ontime < 2) {
  301.     $a1++;
  302. } elsif ($delta_ontime >= 2 && $delta_ontime < 4) {
  303.     $a2++;
  304. } elsif ($delta_ontime >= 4 && $delta_ontime < 6) {
  305.     $a3++;
  306. } elsif ($delta_ontime >= 6 && $delta_ontime < 8) {
  307.     $a4++;
  308. } elsif ($delta_ontime >= 8 && $delta_ontime < 10) {
  309.     $a5++;
  310. } elsif ($delta_ontime >= 10 && $delta_ontime < 12) {
  311.     $a6++;
  312. } elsif ( $delta_ontime >= 12 && $delta_ontime < 14) {
  313.     $a7++;
  314. } elsif ($delta_ontime >= 14 && $delta_ontime < 16) {
  315.     $a8++;
  316. } elsif ( $delta_ontime >= 16 && $delta_ontime < 18) {
  317.     $a9++;
  318. } elsif ($delta_ontime >= 18 && $delta_ontime < 20) {
  319.     $a10++;
  320. } elsif ($delta_ontime >= 20 && $delta_ontime < 22) {
  321.     $a11++;
  322. } elsif ($delta_ontime >= 22 && $delta_ontime < 24) {
  323.     $a12++;
  324. } elsif ($delta_ontime >= 24 && $delta_ontime < 26) {
  325.     $a13++;
  326. } elsif ($delta_ontime >= 26 && $delta_ontime < 28) {
  327.     $a14++;
  328. } elsif ($delta_ontime >= 28 && $delta_ontime < 30) {
  329.     $a15++;
  330. } elsif ( $delta_ontime >= 30 && $delta_ontime < 32) {
  331.     $a16++;
  332. } elsif ($delta_ontime >= 32 && $delta_ontime < 34) {
  333.     $a17++;
  334. } elsif ( $delta_ontime >= 34 && $delta_ontime < 36) {
  335.     $a18++;
  336. } elsif ($delta_ontime >= 36 && $delta_ontime < 38) {
  337.     $a19++;    
  338. } elsif ( $delta_ontime >= 38 && $delta_ontime < 40) {
  339.     $a20++;
  340. } elsif ($delta_ontime >= 40 && $delta_ontime < 42) {
  341.     $a21++;
  342. } elsif ( $delta_ontime >= 42 && $delta_ontime < 44) {
  343.     $a22++;
  344. } elsif ($delta_ontime >= 44 && $delta_ontime < 46) {
  345.     $a23++;
  346. } elsif ($delta_ontime >= 46 && $delta_ontime < 48) {
  347.     $a24++;
  348. } elsif ($delta_ontime >= 48 && $delta_ontime < 50) {
  349.     $a25++;    
  350. } elsif ($delta_ontime >= 50) {
  351.     $a26++;
  352. }
  353. close(STATES);
  354. print LOG2 "$a1 $a2 $a3 $a4 $a5 $a6 $a7 $a8 $a9 $a10 $a11 $a12 $a13 $a14 $a15 $a16 $a17 $a18 $a19 $a20 $a21 $a22 $a23 $a24 $a25 $a26 $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8 $p9 $p10 $p11 $p12 $p13 $p14 $p15 $p16 $p17 $p18 $p19 $p20 $p21 $numn";
  355. close(LOG2);
  356. print("Ontime: $ontimen");
  357. print ("Offtime: $offtimen");
  358. #calculate the goodput
  359. $tcpgoodput1 = ($datarecvd * 8) / $simtime ;
  360. $tcpgoodput2 = ($datarecvd * 8) / $ontime ;
  361. $linkthruput1 = ($bytenum * 8) / $simtime;
  362. $linkthruput2 = ($bytenum * 8) / $ontime;
  363. $idealput = $linkrate * ($ontime/$simtime);
  364. #print LOG "Run$i(in bps)
  365. #tOntime: $ontime Offtime: $offtime Linkrate(bps): $linkrate
  366. #tTotalPktsRecvd: $pktrecvd TotalBytesRecvd: $datarecvd 
  367. #tGoodput1: (total_bytes*8)/simtime = $goodput1 (in bps)
  368. #tGoodput2: (total_bytes*8)/ONtime = $goodput2 (in bps)
  369. #tidealput: linkrate * ONtime/simtime = $idealput (in bps)nn";
  370. printf LOG1 "%.4f %.4f %.4f %.4f %.4f %.4fn", $ontime,$tcpgoodput1,$tcpgoodput2,$linkthruput1,$linkthruput2,$idealput;
  371. close(LOG1);
  372. sub put_in_bin () {
  373.     $dur2 = shift;
  374.     $a1 = shift;
  375.     $a2 = shift;
  376.     $a3 = shift;
  377.     $b = shift;
  378.     $c = shift;
  379.     $d = shift;
  380.     $e = shift;
  381.     
  382.     if ($dur2 < 0.25) {
  383. $a1++;
  384.     } elsif ($dur2 >= 0.25 && $dur2 < 0.5) {
  385. $a2++;
  386.     } elsif ($dur2 >= 0.5 && $dur2 < 1) {
  387. $a3++;
  388.     } elsif ( $dur2 >= 1 && $dur2 < 5) {
  389. $b++;
  390.     } elsif ($dur2 >= 5 && $dur2 < 10) {
  391. $c++;
  392.     } elsif ($dur2 >= 10 && $dur2 < 50) {
  393. $d++;
  394.     } elsif ($dur2 >=50) {
  395. $e++;
  396.     }
  397. }
  398. # state is ON when either timer1 or timer2 is ON
  399. sub compare_OR_onoff_times () {
  400.     $t1 = shift;
  401.     $d1 = shift;
  402.     $timer1 = shift;
  403.     $t2 = shift;
  404.     $d2 = shift;
  405.     $timer2 = shift;
  406.     $ontime = shift;
  407.     $offtime = shift;
  408.     
  409.     if ($timer1 eq $timer2) { #same timer
  410. $ontime += $d1;
  411. $offtime += $t2 - ($t1 + $d1);
  412. $t1 = $t2;
  413. $d1 = $d2;
  414. $timer1 = $timer2;
  415. print "type1n";
  416. return;
  417.     } 
  418.     else { # different timer
  419. if ($t2 >= ($t1 + $d1)) {
  420.     $ontime += $d1;
  421.     $offtime += $t2 - ($t1 + $d1);
  422.     $t1 = $t2;
  423.     $d1 = $d2;
  424.     $timer1 = $timer2;
  425.     print "type2n";
  426.     return;
  427. }
  428. else { # t2 < ($t1+$d1)
  429.     if ( $t1+$d1 >= $t2+$d2 ) {
  430. print "type3n";
  431. return;
  432.     } 
  433.     else { # t1+d1 < t2+d2
  434. $ontime += $t2 - $t1;
  435. $t1 = $t2;
  436. $d1 = $d2;
  437. $timer1 = $timer2;
  438. print "type4n";
  439. return;
  440.     }
  441. }
  442.     }
  443. }
  444. # state is on only when both timer1 and timer2 is ON
  445. sub compare_AND_onoff_times {
  446.     
  447. #calculate the ontime by first calculating the offtime
  448.     # same timer
  449.     if ($timer1 eq $timer2) {
  450. #$offtime += $dur1;
  451. $start1 = $start2;
  452. $dur1 = $dur2;
  453. $end1 = $end2;
  454. $timer1 = $timer2;
  455. print("Case1: Offtime = $offtimen");
  456.     }
  457.     else {
  458. #if ($end1 > $end2) {
  459. #   continue;
  460. #}
  461. if ($end1 <= $start2) {
  462.     $offtime += $dur1;
  463.     $start1 = $start2;
  464.     $dur1 = $dur2;
  465.     $end1 = $end2;
  466.     $timer1 = $timer2;
  467.     print("Case2: Offtime = $offtimen");
  468. }
  469. elsif (($end1 > $start2) && ($end1 <= $end2)) {
  470.     $offtime += $start2 - $start1;
  471.     $start1 = $start2;
  472.     $dur1 = $dur2;
  473.     $end1 = $end2;
  474.     $timer1 = $timer2;
  475.     print("Case3: Offtime = $offtimen");
  476. }
  477. else {
  478.     # $end1 > $end2
  479.     $flag = 1;
  480.   }
  481.     }
  482.     print("Offtime = $offtimen");
  483. }
  484. if ($flag == 1) {
  485.     if ($end1 > $simtime) {
  486. $offtime += $simtime - $start1;
  487.     } else {
  488. $offtime += $dur1;
  489.     }
  490.  }     
  491. else {
  492.     # we have to add the remaining off duration now
  493.     if (($start2 + $dur2) > $simtime) {
  494. $offtime += $simtime - $start2;
  495.     } else {
  496. $offtime += $dur2;
  497.     }
  498. }