I do the same test on a FreeBSD 4.8-p17, IP Filter: v3.4.31.
There is no lost of packets.
I change my perl script to send more slowly the snmp packets.
With 100 000 packets in 31 seconds, 82599 are received.
With 100 000 packets in 89 seconds, 99995 are received !!!
Some help ?
Here my perl script:
# script de generation de trafic
# auteur: Marc GAUTHIER
#
# pseudo package, juste pour faciliter le debug
package _Net::RawIP;
use strict;
sub new {
my($class, $name) = @_;
my $self = {
ip => {
saddr => '',
daddr => '',
},
udp => {
dest => '',
source => ''
}
};
bless($self, $class);
return $self;
}
sub set {
my $self = shift;
my $data = shift;
while( my ($k,$v ) = each(%$data) ) {
$self->{$k} = $v;
}
}
sub send {
my $self = shift;
printf("%-20s:%5s
=>%-20s:%5s\n",$self->{ip}->{saddr},$self->{udp}->{source},$self->{ip}->{daddr},$self->{udp}->{dest});
}
package main;
use strict;
use Getopt::Long;
my ( $sint,$dint,$dest,$source );
my $saddr = '192.168.3.1';
my $sport = '1024';
my $daddr = '192.168.13.5';
my $dport = '161';
my $sa_iter = '0';
my $sp_iter = '0';
my $da_iter = '0';
my $dp_iter = '0';
my $count = 0;
my $max = 200000;
my $sleep = 0;
my $boucle = 5000;
my $debug = 0;
my $hostname = (gethostbyname ("localhost"))[0];
my @ifconfig = `/sbin/ifconfig -a`;
my $interface = '';
my $ip = '';
foreach my $line (@ifconfig) {
# print "line:$line";
$interface = $1 if ( $line =~/(^\w+(?:\d)?(?:\:\d)?)/ );
if ( ($ip) = ($line =~/inet (?:addr\:)?(\d+\.\d+\.\d+\.\d+)/)) {
last;
}
}
print "interface:$interface ip:$ip\n";
$saddr = $ip;
GetOptions(
"saddr=s" => \$saddr,
"sport=s" => \$sport,
"daddr=s" => \$daddr,
"dport=s" => \$dport,
"da_iter=s" => \$da_iter,
"dp_iter=s" => \$dp_iter,
"sa_iter=s" => \$sa_iter,
"sp_iter=s" => \$sp_iter,
"sleep=s" => \$sleep,
"boucle=s" => \$boucle,
"max=s" => \$max,
"debug=s" => \$debug,
);
my $scenario = shift if ( @ARGV );
if ( $scenario =~ /intra/i ) {
$sa_iter = '19';
$saddr = '10.0.0.1';
}
if ( $scenario =~ /extra/i ) {
$da_iter = '19';
$daddr = '10.128.0.1';
}
if ( $scenario =~ /big/i ) {
if ( $da_iter > 0 ) { $da_iter = 200000 };
if ( $sa_iter > 0 ) { $sa_iter = 200000 };
}
print "max:$max boucle:$boucle\n";
my $data =
'302902010004067075626c6963a01c0204094b6a71020100020100300e300c06082b060102010101000500';
my $pdata= pack('H*',$data);
use Net::RawIP qw();
my $a = new Net::RawIP ({udp =>{}});
$dint = ip2int($daddr);
$sint = ip2int($saddr);
my $start = time;
for ( my $daddr_offset = 0; $daddr_offset <= $da_iter; $daddr_offset++ ) {
for ( my $saddr_offset = 0; $saddr_offset <= $sa_iter; $saddr_offset++ ) {
$dest= int2ip($dint+$daddr_offset);
$source = int2ip($sint+$saddr_offset);
$a->set({ip => {saddr => $source, daddr => $dest} });
for ( my $sport_offset = 0; $sport_offset <= $sp_iter; $sport_offset++ ) {
for ( my $dport_offset = 0; $dport_offset <= $dp_iter; $dport_offset++ ) {
$a->set({ udp => {
dest => $dport,
source => $sport_offset+$sport,
data => $pdata,
}} );
$a->send($sleep);
# pour ralentir
for(1..$boucle) { };
$count++;
last if ( $count >= $max );
}
last if ( $count >= $max );
}
last if ( $count >= $max );
}
last if ( $count >= $max );
}
my $stop = time;
print "count:$count duree:".($stop-$start)."\n";
sub usage {
warn "$0: @_\n" if @_;
die <<EOF;
usage: $0 [options]
les options sont:
EOF
}
sub ip2int {
my $ip =shift;
if ( $ip =~ /^\d+\.\d+\.\d+\.\d+/ ) {
$ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
my $int = (16777216*$1)+(65536*$2)+(256*$3)+$4;
return $int;
} else {
return 0;
}
}
sub ip2int_v2 {
my $ip = shift;
my $i = 0;
foreach (split(/\./, $saddr) ) { $i = $i*256+$_ };
return $i;
}
sub int2ip {
my $int = shift;
if ( ( $int > 0 ) && ( $int < 4294967295 ) ) {
my $w=($int/16777216)%256;
my $x=($int/65536)%256;
my $y=($int/256)%256;
my $z=$int%256;
my $ip = $w . "." . $x . "." . $y . "." . $z;
return $ip;
} else {
return 0;
}
}