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

通讯编程

开发平台:

Visual C++

  1. #!/usr/bin/perl -w
  2. ###########################################################
  3. # ns-color.pl 
  4. # haldar@isi.edu
  5. # Takes event/color pairs and colors pkts in nam output files
  6. # Is used to color pkts to identify events in nam
  7. ############################################################
  8. use warnings;
  9. # some global declarations
  10. local (@events, %colors, %pkt_ids);
  11. local ($INFILE, $OUTFILE);
  12. local (@buffer, $line);
  13. local ($BUFFER_SIZE) = 1000;
  14. # location of fields in nam output files as generated by ns
  15. # change these values accordingly if nam output format is changed
  16. local ($EVENT_FIELD) = 0;        # position event column
  17. local ($EVENT_TYPE_FIELD) = 6;   # event-type column
  18. local ($COLOR_FIELD) = 16;       # position of pkt color
  19. local ($PID_FIELD) = 14;         # position of pkt-id
  20. local ($ESRC_FIELD) = 18;
  21. local ($EDST_FIELD) = 19;
  22. local ($SEQNUM_FIELD) = 20;
  23. %event_offset_table = (
  24.     
  25.     'TIMEOUT'        => '+1',     # timeout is followed by slowstart, same event
  26.     'SLOW_START'     => '+1',
  27.     'FAST_RECOVERY'  => '+1',
  28.     'FAST_RETX'      => '-1',
  29.     'RENO_FAST_RETX' => '-1',
  30. );
  31. # default colors (IN FUTURE) 
  32. #%event_color_table = ();
  33.     
  34.     
  35. sub usage 
  36. {
  37.     print "Usage: ns-color.pl <inputfile> <outputfile> <event-type 1> <color 1> .. <events-type N> <color N>" ;
  38.     exit 0;
  39. }
  40. sub getOptions 
  41. {
  42.     # read command line options and save them into arrays/hashes
  43.     my ($n);
  44.     %colors = () ;
  45.     
  46.     $n = scalar @ARGV;
  47.     #assuming event/color pair
  48.     if ($n <= 2 || ($n > 2 && ($n % 2 != 0)) ) {
  49. usage();
  50.     }
  51.     # create events and colors arrays/hashes resp.
  52.     for (my $i=2; $i < $n; $i++) {
  53. push(@events, $ARGV[$i]);
  54. push (@{$colors{"$ARGV[$i]"}}, $ARGV[$i+=1]) ;
  55.     }
  56.     
  57.     find_event();
  58. }
  59. # find the event and color pkts
  60. sub find_event {
  61.     
  62.     $INFILE = $ARGV[0];
  63.     $OUTFILE = $ARGV[1];
  64.     
  65.     open (INPUT, "<", $INFILE) or die "can't open $INFILEn";
  66.     open (OUTPUT, ">", $OUTFILE) or die "can't open $OUTFILEn";
  67.     
  68.     first_pass_for_pkt_id();
  69.     second_pass_for_coloring_pkt();
  70.     
  71.     close(INPUT);
  72.     close(OUTPUT);
  73. }
  74. # The first pass thru the input file for grabbing 
  75. # the pkt-ids related to the specific events
  76. sub first_pass_for_pkt_id {
  77.     %pkt_ids = ();
  78.     my (@field, $et, $etype);
  79.     my ( $pid, $offset, $pos);
  80.     
  81.     # Reading input file
  82.     while ($line = <INPUT>) {
  83.         # maintain a buffer of n previous lines
  84. # skipping lines not starting with +/-/h/r (non-pkt event lines)
  85. @field = split (" ", $line);
  86. $et = $field[$EVENT_FIELD];
  87. # interested only in packet level nam traces
  88. if ($et eq 'E' || $et eq '+' || $et eq '-' || $et eq 'h' || $et eq 'r' || $et eq 'd') { 
  89.     
  90.     $pos = push_b (@buffer, $line);
  91.     
  92.     # if it is a EVENT line
  93.     if ($field[$EVENT_FIELD] eq 'E') {
  94. $etype = $field[$EVENT_TYPE_FIELD];
  95. foreach my $key (@events) {
  96.     
  97.     # and if an (exact) matching event is found
  98.     if ($key =~ $etype) {
  99. # First get the events offset value
  100. $offset = get_offset ($key);
  101. # Next get pktid using offset from buffered lines
  102. $pid = pid_from_offset ($offset, $pos);
  103. #print "pid for ***pkt***: $pidn";
  104. store_color_pid ($key, $pid);  
  105. # if fast-retx, mark tcp pkts as well
  106. if ($key =~ /FAST_RETX/) {
  107.     
  108.     # mark 3rd tcp pkt after pkt drop
  109.     # that triggers fast-retx
  110.     $pid = pid_for_third_TCP ($pos);
  111.     #print "pid for TCP pkt: $pidn";
  112.     store_color_pid ($key, $pid);
  113.     # also mark the pkt that is fast-retx'ed
  114.     $pid = pid_from_offset(+1, $pos);
  115.     #print "pid for FAST-RETX'ED TCP pkt: $pidn";
  116.     store_color_pid ($key, $pid);
  117.     
  118.     }
  119. }
  120.     }
  121. }
  122.     }
  123. }
  124. # second pass for coloring pkts using pkt-ids
  125. sub second_pass_for_coloring_pkt {
  126.     
  127.     # go back to start of input file
  128.     seek (INPUT, 0, 0);
  129.     while ($line = <INPUT>) {
  130. my @field = split (" ", $line);
  131. my $et = $field[$EVENT_FIELD];
  132. # skip for all lines not starting with d/+/-/h/r
  133. if ($et eq 'd' || $et eq '+' || $et eq '-' || $et eq 'h' || $et eq 'r') {
  134.     
  135.     my $id = $field[$PID_FIELD];
  136.     # for matching pkt-ids
  137.     foreach my $pid (keys %pkt_ids) {
  138. if ($pid == $id) {
  139.     #color the pkt 
  140.     my @color = @{$pkt_ids{$pid}};
  141.     $field[$COLOR_FIELD] = $color[0];
  142. }
  143.     }
  144. }
  145. # join back the line
  146. $line = join (" ", @field);
  147. #print line in output file;
  148. print OUTPUT $line,"n";
  149.     }
  150. }
  151. # save pkt ids as pid/color pair
  152. sub store_color_pid {
  153.     my $key = shift;
  154.     my $pid = shift;
  155.     # Now need to get color for this event type
  156.     my @color = @{$colors{$key}};
  157.     # create a hash of pkt-ids using pid/color pairs 
  158.     push (@{$pkt_ids{"$pid"}}, $color[0]);
  159. }
  160. sub pid_for_third_TCP {
  161.     
  162.     my $pos = shift;
  163.     
  164.     # get seq num/src/dst-id from 3rd ack
  165.     my @list = get_seq_num (-1, $pos);
  166.     
  167.     # switch src and dst for ack as now we look for 
  168.     # TCP pkts
  169.     my $sid = $list[0];
  170.     $list[0] = $list[1];
  171.     $list[1] = $sid;
  172.     
  173.     # get seq num for 3rd tcp pkt after drop
  174.     $list[2] += 4; 
  175.     # get pkt-id for TCP pkt
  176.     my $pid = pid_from_seq_num ( @list );
  177.     if ($pid == -1) {
  178. print "match for seqnum not foundn";
  179. exit 1;
  180.     } else {
  181. return ($pid);
  182.     }
  183. }
  184. # returns sequence no and src/dest pair for pkt with given offset
  185. sub get_seq_num {
  186.     my $offset = shift; # offset wrt current line pos
  187.     my $pos = shift;    # cuurent line position
  188.     my ($seq, $srcid, $dstid, @vlist);
  189.     # if offset is -ve, read from buffer
  190.     if ($offset < 0) {
  191. my $line = $buffer[$pos + $offset];
  192. my @fields = split(" ", $line);
  193. $seq = $fields[$SEQNUM_FIELD];
  194. my @tmp = split ("{", $fields[$ESRC_FIELD]); 
  195. $srcid = $tmp[1];
  196. $dstid = $fields[$EDST_FIELD];
  197. @vlist = ($srcid, $dstid, $seq);
  198. # if offset is +ve, read from input file
  199.     } else {
  200. @vlist = seq_from_infile ($offset);
  201.     }
  202.     return @vlist;
  203. }
  204. sub seq_from_infile {
  205.     my $offset = shift;
  206.     my $i = 0;
  207.     my ($et, $line, @fields);
  208.     my ($vlist, $seq, $srcid, $dstid);
  209.     
  210.     while (($i < $offset) && ($line = <INPUT>)) {
  211. # read line and place in buffer
  212. @fields = split(" ", $line);
  213. $et = $fields[$EVENT_FIELD];
  214. # interested only in packet level nam traces
  215. if ($et eq '+' || $et eq '-' || $et eq 'h' || $et eq 'r' || $et eq 'd') { 
  216.     push_b (@buffer, $line);
  217.     $i++;
  218. }
  219.     }
  220.     
  221.     $seq = $fields[$SEQ_FIELD];
  222.     $srcid = $fields[$SRCID_FIELD];
  223.     $dstid = $fields[$DSTID_FIELD];
  224.     $vlist = ($srcid, $dstid, $seq);
  225.     return ($vlist);
  226. }
  227. #returns offset value for the given key (event type)    
  228. sub get_offset {
  229.     
  230.     # return offset from event/offset pair
  231.     my $key = shift;
  232.     my $offset = $event_offset_table{$key};
  233.     return ($event_offset_table{$key});
  234. }
  235. # returns pid for pkt with given seqnum/srcid/dstid value
  236. sub pid_from_seq_num {
  237.     my ($sid, $did, $seq) = @_;
  238.     
  239.     for (my $n=0; $n < $BUFFER_SIZE; $n++) {
  240.         #look for seqnum match
  241. my @cols = split (" ", $buffer[$n]);
  242. my @src = split ("{", $cols[$ESRC_FIELD]);
  243. if ($cols[$SEQNUM_FIELD] == $seq && $src[1] == $sid 
  244.     && $cols[$EDST_FIELD] == $did) {
  245.     #return pid if match found
  246.     return $cols[$PID_FIELD];
  247. }
  248.     }
  249.     
  250.     # didn't find the seqnum/src/dst match
  251.     return (-1);
  252. }
  253. #returns pkt-id for the given offset and current line value
  254. sub pid_from_offset {
  255.     
  256.     #return packet-id using offset value
  257.     my $offset = shift; # offset wrt current line pos
  258.     my $pos = shift;    # cuurent line position
  259.     my $pid;
  260.     # if offset is -ve, read from buffer
  261.     if ($offset < 0) {
  262. my $line = $buffer[$pos + $offset];
  263. my @fields = split(" ", $line);
  264. $pid = $fields[$PID_FIELD];
  265.     
  266.     # if offset is +ve, read from input file
  267.     } else {
  268. $pid = pid_from_infile ($offset);
  269.     }
  270.     return $pid;
  271. }
  272.     
  273. sub pid_from_infile {
  274.     my $offset = shift;
  275.     my $i = 0;
  276.     my ($et, $line, @fields, $pid);
  277.     
  278.     while (($i < $offset) && ($line = <INPUT>)) {
  279. # read line and place in buffer
  280. @fields = split(" ", $line);
  281. $et = $fields[$EVENT_FIELD];
  282. # interested only in packet level nam traces
  283. if ($et eq '+' || $et eq '-' || $et eq 'h' || $et eq 'r' || $et eq 'd') { 
  284.     push_b (@buffer, $line);
  285.     $i++;
  286. }
  287.     }
  288.     
  289.     return ($pid = $fields[$PID_FIELD]);
  290. }
  291. sub push_b {
  292.     
  293.     # pop first line out (from left hand side) 
  294.     # if buffer size greater than BUFFER_SIZE
  295.     my $size = scalar @buffer;
  296.     if ($size >= $BUFFER_SIZE) {
  297. shift @buffer;
  298.     }
  299.     
  300.     # then push current line into buffer
  301.     return (push (@buffer, $line)-1);
  302.     
  303. }
  304. getOptions();