use strict; use warnings; # todo: calc rate for every 200ms interval # i0=0; i1=0; # while t1=200) # { # n -= n[i0++]; # } print " :IN msecs bytes bps bits:OUT msecs bytes bps bits\n"; # script determining data rate from gsmbufmon.log my %c; while (<>) { if (/\+CBST=(\d.*\d)/ || /\+CRING: ([A-Z ]+)/) { my $cbst=$1; if ($c{cbst}) { dumpcall(); } %c=( cbst=>$cbst ); } elsif (/\@(\w+)\(.*\) \w+ data:(\w)\w+\s+\S+\s+: (\w+) bytes/) { my ($t, $dir, $n)= (hex($1), $2, hex($3)); push @{$c{$dir}{data}}, {t=>$t, n=>$n}; } } dumpcall(); sub calcratelist { my $list= shift; return if !$list || !@$list; my ($i0, $i1)= (0,1); my @rate; my $n=0; while ($i1<@$list) { while ($i1<@$list && ($list->[$i1]{t}-$list->[$i0]{t})<200) { $n += $list->[$i1]{n}; $i1++; } push @rate, 1000*$n/($list->[$i1]{t}-$list->[$i0]{t}); while ($i0<$i1 && ($list->[$i1]{t}-$list->[$i0]{t})>=200) { $n -= $list->[++$i0]{n}; } } return \@rate; } sub calcrate { my $list= shift; return 0 if !$list || !@$list; my $n= shift; return 0 if (@$list<3+$n*2); my $i0= $n; my $i1= $#{$list}-$n; my $t= $list->[$i1]{t} - $list->[$i0]{t}; my $bytes= 0; for (my $i= $i0+1 ; $i<=$i1 ; $i++) { $bytes += $list->[$i]{n}; } return $bytes/$t*1000; } sub calctotals { my $list= shift; return (0,0) if !$list || !@$list; my $i0= 0; my $i1= $#{$list}; my $t= $list->[$i1]{t} - $list->[$i0]{t}; my $n= 0; for (my $i= $i0+1 ; $i<=$i1 ; $i++) { $n += $list->[$i]{n}; } return ($t, $n); } sub dumpcall { for my $dir ('g', 'w') { printf("%-10s %s", $c{cbst}, $dir); my $r0= calcrate($c{$dir}{data}, 0); my $r4= calcrate($c{$dir}{data}, 4); my $rl= []; # calcratelist($c{$dir}{data}); my ($t, $n)= calctotals($c{$dir}{data}); printf(": %8d %8d %6.1f %6.1f : %s\n", $t, $n, $r0, $r4, join("", map { sprintf(" %6.1f", $_) } @$rl)); } }