raw2xg
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. eval 'exec perl -S $0 ${1+"$@"}' # -*-perl-*-
  2.     if 0;
  3. require 5.001;
  4. ($progname) = ($0 =~ m!([^/]+)$!);
  5. sub usage {
  6.     print STDERR <<END;
  7. usage: $progname [options] [trace files...]
  8. options:
  9.     -a plot acks
  10.     -s SCALE    scale TCP sequence numbers by SCALE
  11.     -n FACTOR scale flow number by FACTOR
  12.     -m MODULUS  treat TCP sequence numbers as mod MODULUS
  13.     -q show queueing delay by connecting lines
  14.     -l show packet length
  15.     -t TITLE    title of test
  16.     -e plot ecn flags
  17.     -d plot only drops and ECN marks
  18.     -v          plot events
  19.     -c          leave out empty lists
  20.     -x          really leave out ALL of the empty lists
  21.     -f          plot acks from tcp-full
  22.     -g for plotting acks from tcp-full, one direction has source 0
  23.     -p          don't add the x-graph preface
  24.     -y fix the y-axis when there are no drops
  25.     -r plot arrivals only
  26. Traditional ``wrapping'' ns plots (as called from the test scripts)
  27. can be generated with -s 0.01 -m 90.
  28. END
  29.     exit 1;
  30. };
  31. $usage = "usage: $progname [-a] [trace files...]n";
  32. require 'getopts.pl';
  33. &Getopts('acefgds:m:n:qrplvt:xy') || usage;
  34. $c = 0;
  35. @p = @pc = @pg = @a = @ac = @ae = @d = @lu = @ld = ();
  36. @vto = @vss = @vfr = @vrfr = @vnrfr = @vfc = ();
  37. %q_time_seg = ();
  38. $scale = defined($opt_s) ? $opt_s : 1;
  39. $modulus = defined($opt_m) ? $opt_m : 2 ** 31;
  40. $flow_factor = defined($opt_n) ? $opt_n : 1;
  41. $plot_acks = defined($opt_a);
  42. $plot_ecn = defined($opt_e);
  43. $plot_drops = defined($opt_d);
  44. $plot_event = defined($opt_v);
  45. $no_padding = defined($opt_c);
  46. $really_no_padding = defined($opt_x);
  47. $plot_full = defined($opt_f);
  48. $source_zero = defined($opt_g);
  49. $no_title = defined($opt_p);
  50. $last_line = defined($opt_y);
  51. $plot_arrivals = defined($opt_r);
  52. $file = $acks = '';
  53. sub translate_point {
  54.     my($time, $seq, $flow) = @_;
  55.     if ($seq == -1) {$seq = 0;}
  56.     $plotted = $flow * $flow_factor + ($seq % $modulus) * $scale;
  57.     $plotted =~ s/.e/e/g; # to ensure Cygwin compatibility, 
  58.     return ($time, $plotted); 
  59. }
  60. while (<>) {
  61.     $dfile = $ARGV;
  62.     @F = split;
  63.     /testName/ && ($file = $F[2], next);
  64.     /^[+-] / && do {
  65. $c = $F[7] if ($c < $F[7]);
  66. $is_ack = ($F[4] eq 'ack' || $F[4] eq 'tcpFriendCtl');
  67. $is_ecn = ($F[6] =~ /E/);
  68. $is_cong = ($F[6] =~ /A/);
  69. $is_echo = ($F[6] =~ /C/); 
  70. $is_tcp = ($F[4] eq 'tcp'); 
  71. $source_0 = ($F[8] eq '0.0'); 
  72. $large_pkt = ($F[5] > 40);
  73. next if ($is_ack && !$plot_acks);
  74. next if (($F[0] eq "-") && $plot_arrivals);
  75. ### if ($large_pkt) { print("Large");} else {print("Small");}
  76. $use_full = 0;
  77. if ($plot_full){ $use_full = 1;}
  78. ## if ($plot_full){if ($large_pkt) { $use_full = 1;}}
  79. ##if (!$source_zero) { $use_full = 1;  
  80. ##   } else { if ($source_0) { if ($is_tcp) { $use_full = 1; }
  81. ##   }}}
  82. if ($use_full == 1){
  83.     ## ($plot_full && (!$source_zero || ($source_0 && $is_tcp)))
  84.        ## F[10]: seq. no.; F[12]: ack no.; 
  85.        ($x, $y) = translate_point(@F[1, 12, 7]);
  86. } else {
  87.     ($x, $y) = translate_point(@F[1, 10, 7]);
  88. }
  89. if (defined($opt_q)) {
  90.     if (/^+/) {
  91. $statement = undef;
  92. $q_time_seg{$is_ack,$y} = $x;
  93.     };
  94.     $statement = "move $q_time_seg{$is_ack,$y} $yndraw $x $yn"
  95. if (/^-/);
  96. } else {
  97.     $statement = "$x $yn";
  98. };
  99. if (defined($statement)) {
  100.     if ($plot_drops) { 
  101. if ($is_ecn) {
  102.     push(@pc, $statement);
  103. };
  104.     } else {
  105.                 if ($is_ack) { 
  106.                     if ($is_ecn) {
  107.                         push(@ac, $statement);
  108.                     } else {
  109.                         push(@a, $statement);
  110.                     };
  111.                     if ($is_echo) {
  112.                         push(@ae, $statement);
  113.                     };
  114.                 } else {
  115.                     if ($is_ecn) {
  116.                         push(@pc, $statement);
  117.                         } else {
  118.                             push(@p, $statement);
  119.                     };
  120.                     if ($is_cong) {
  121.                         push(@pg, $statement);
  122.                         }
  123.                 };
  124.     };
  125. };
  126. next;
  127.     };
  128.     /^d / && do {
  129. ($x, $y) = translate_point(@F[1, 10, 7]);
  130. push(@d, "$x $yn");
  131. next;
  132.     };
  133.     /link-down/ && (push(@ld, $F[1]), next);
  134.     /link-up/ && (push(@lu, $F[1]), next);
  135.     if ($plot_event) {
  136. /^E / && do {
  137.     ($x, $y) = translate_point(@F[1, 7, 6]);
  138.     if ($F[5] eq 'TCP_TIMEOUT') {
  139. push(@vto, "$x $yn");
  140. next;
  141.     }
  142.     if ($F[5] eq 'SLOW_START') {
  143. push(@vss, "$x $yn");
  144. next;
  145.     }
  146.     if ($F[5] eq 'FAST_RETX') {
  147. push(@vfr, "$x $yn");
  148. next;
  149.     }
  150.     if ($F[5] eq 'RENO_FAST_RETX') {
  151. push(@vrfr, "$x $yn");
  152. next;
  153.     }
  154.     if ($F[5] eq 'NEWRENO_FAST_RETX') {
  155. push(@vnrfr, "$x $yn");
  156. next;
  157.     }
  158.     if ($F[5] eq 'FAST_RECOVERY') {
  159. push(@vfc, "$x $yn");
  160. next;
  161.     }
  162. };
  163.     }
  164. }
  165. if ($file eq '') {
  166. ($file) = ($dfile =~ m!([^/]+)$!);
  167. }
  168. if (!$no_title) {
  169.     $title  = defined($opt_t) ? $opt_t : $file;
  170.     print "TitleText: $titlen" .
  171.         "Device: Postscriptn" .
  172.         "BoundBox: truen" .
  173.         "Ticks: truen" .
  174.         (defined($opt_q) ? "" : "NoLines: truen") .
  175.     
  176.         "Markers: truen" .
  177.         "XUnitText: timen" .
  178.         "YUnitText: packetsn";
  179. }
  180. print "n"packetsn", @p;
  181. if (defined($pc[0])) {
  182.     @sorted_pc = sort (@pc);
  183.     print "n"ecn_packetsn", @pc[0..3], @sorted_pc;
  184. } else {
  185.     if (!$no_padding) {
  186.         printf "n"skip-1n0 1n";
  187.     }
  188. }
  189. # insert dummy data sets so we get X's for marks in data-set 4
  190. if (!$really_no_padding && !defined($a[0])) {
  191.     push(@a, "0 1n");
  192. }
  193. if ($plot_acks) {
  194.     @sorted_a = sort (@a);
  195.     print "n"acksn", @sorted_a;
  196.     if ($plot_ecn && defined($ac[0])) {
  197. @sorted_ac = sort (@ac);
  198. print "n"ecn-acksn", @sorted_ac;
  199.     }
  200.     if ($plot_ecn && defined($ae[0])) {
  201. @sorted_ae = sort (@ae);
  202. print "n"echo-acksn", @sorted_ae;
  203.     }
  204. } else {
  205.     if (!$no_padding) {
  206.         printf "n"skip-2n0 1n";
  207.     }
  208. }
  209. #
  210. # Repeat the first line twice in the drops file because often we have only
  211. # one drop and xgraph won't print marks for data sets with only one point.
  212. #
  213. @sorted_d = sort (@d);
  214. print "n"dropsn", @d[0..3], @sorted_d;
  215. if ($plot_event) {
  216. # Event tracing
  217.     print "n"eventsn";
  218.     @sorted_vto = sort (@vto);
  219.     print "n"event_timeoutn", @vto[0..3], @sorted_vto;
  220.     @sorted_vss = sort (@vss);
  221.     print "n"event_slowstartn", @vss[0..3], @sorted_vss;
  222.     @sorted_vfr = sort (@vfr);
  223.     print "n"event_fastretxn", @vfr[0..3], @sorted_vfr;
  224.     @sorted_vrfr = sort (@vrfr);
  225.     print "n"event_renofastretxn", @vrfr[0..3], @sorted_vrfr;
  226.     @sorted_vnrfr = sort (@vnrfr);
  227.     print "n"event_nrenofastretxn", @vnrfr[0..3], @sorted_vnrfr;
  228.     @sorted_vfc = sort (@vfc);
  229.     print "n"event_fastrecoveryn", @vfc[0..3], @sorted_vfc;
  230. }
  231. $c++;
  232. print "n";
  233. foreach $i (@ld) {
  234. print ""link-downn$i 0n$i $cn";
  235. }
  236. foreach $i (@lu) {
  237. print ""link-upn$i 0n$i $cn";
  238. }
  239. if ($plot_ecn && defined($pg[0])) {
  240.     if (!$really_no_padding && !defined($d[0])) {
  241. printf "n"skip-3n0 1n";
  242.     }
  243.     @sorted_pg = sort (@pg);
  244.     print "n"cong_act_packetsn", @pg[0..3], @sorted_pg;
  245. if ($last_line) {
  246.     # To bring the y-axis up to 2.0
  247.     if (!$plot_full) {
  248.         printf "n"skipn0 2n";
  249.     } else {
  250.         printf "n"skipn0 1024n";
  251.     }
  252. }
  253. exit 0;