>Ну так покажите скрипт, поможем :)ну, давайте попробуем, спасибо :) приведу основной кусок. исходные:
трафик делится на две категории: внешний и локальный
@nonlocalhosts - ip-адреса хостов, трафик на которые считается внешним
@local_nets_dec - ip-адреса локальных подсетей в десятичном представлении, префиксы, маски локальных подсетей в десятичном представлении (соответствующие префиксам)
@client_nets_dec - тоже самое, но только клиентские подсети. плюс - id клиента
@pre_mul_256_... - массивы для быстрого перевода ip-адресов из октетного вида в десятичный
while ( <IN> ) {
next if (/^$/);
( $ip1, $ip2, $bytes1, $bytes2 ) = split;
$H1proxy = grep $ip1 eq $_, @nonlocalhosts;
$H2proxy = grep $ip2 eq $_, @nonlocalhosts;
# какой из хостов принадлежит нашим сетям?
$H1loc = 0; $H2loc = 0;
@ips = split(/\./, $ip1);
#-- convert ips to dec
$ip1_dec = $pre_mul_256_3[$ips[0]] + $pre_mul_256_2[$ips[1]] + $pre_mul_256_1[$ips[2]] + $ips[3];
@ips = split(/\./, $ip2);
#-- convert ip to dec
$ip2_dec = $pre_mul_256_3[$ips[0]] + $pre_mul_256_2[$ips[1]] + $pre_mul_256_1[$ips[2]] + $ips[3];
foreach (@local_nets_dec) {
($net_dec, $prefix, $mask_dec) = @{$_};
#-- apply mask
my $ip1_net = $ip1_dec & $mask_dec;
my $ip2_net = $ip2_dec & $mask_dec;
$H1loc = 1 if ($ip1_net == $net_dec && !$H1proxy && !$H1loc);
$H2loc = 1 if ($ip2_net == $net_dec && !$H2proxy && !$H2loc);
#-- exit from the loop if we made all checks
last if ($H1loc && $H2loc);
}
#-- вот это самый долгий кусок
foreach (@client_nets_dec) {
($net_dec, $prefix, $mask_dec, $cid) = @{$_};
$ip1_net = $ip1_dec & $mask_dec;
$ip2_net = $ip2_dec & $mask_dec;
#-- хост1 - клиент?
$C1 = ($ip1_net == $net_dec);
#-- хост2 - клиент?
$C2 = ($ip2_net == $net_dec);
unless( $C1 or $C2 ) { next; } # оба хоста не принадлежат %client_nets
if( $C1 and $C2 ) { # оба хоста принадлежат %client_nets -> лок трафик
if( ($H1loc and $H2loc) || ($H1loc and $H2proxy) || ($H1proxy and $H2loc) ) { # и входят в лок сеть
$bytes_in_loc{$cid} += $bytes1;
$bytes_out_loc{$cid} += $bytes2;
next;
}
}
if( !$C1 and $C2 ) { #$ip1 не принадлежат сети $net, $ip2 принадлежат сети $net
if( (!$H1loc and $H2loc) || (!$H1loc and $H2proxy) ) { # $ip1 внешний хост -> внеш трафик
$bytes_in{$cid} += $bytes2; # переворачиваем
$bytes_out{$cid} += $bytes1;
next;
}
if( ($H1loc and $H2loc) || ($H1loc and $H2proxy) || ($H1proxy and $H2loc) ) { # $ip1 наш хост -> лок трафик
$bytes_in_loc{$cid} += $bytes2; # переворачиваем
$bytes_out_loc{$cid} += $bytes1;
next;
}
}
if( $C1 and !$C2 ) { #$ip1 принадлежат сети $net, $ip2 не принадлежат сети $net
if( ($H1loc and !$H2loc) || ($H1proxy and !$H2loc) ) { # $ip2 внешний хост -> внеш трафик
$bytes_in{$cid} += $bytes1;
$bytes_out{$cid} += $bytes2;
next;
}
if( ($H1loc and $H2loc) || ($H1loc and $H2proxy) || ($H1proxy and $H2loc) ) { # $ip2 наш хост -> лок трафик
$bytes_in_loc{$cid} += $bytes1;
$bytes_out_loc{$cid} += $bytes2;
next;
}
}
}
}