using dummynet to simulate modem, dsl, etc
Mark Hannon
markhannon at optusnet.com.au
Sun Jul 27 03:39:50 PDT 2003
For those that are interested ... the following script and test results
were obtained. My
reasonings for the delay etc are partially included in the perl script.
/mark
#!/usr/bin/perl
#
# $Id: lnf-test.pl,v 1.1 2003/07/27 10:30:57 mark Exp $
#
# =====================================================================
# Details of all of the networks to be simulated are stored in a hash:
#
# name => "descriptive text"
# ip => "dotted ip number - will be aliased to lo0",
# mtu => "mtu in octets",
# us_bw => "upstream bandwidth in kbit/s",
# us_queue => 0,
# us_init_delay => "upstream processing delay only",
# us_total_delay => "upstream total delay - calculated",
# ds_bw => "downstream bandwidth in kbit/s",
# ds_queue => o,
# ds_init_delay => "downstream processing delay only",
# ds_total_delay => "downstream total delay - calculated",
$testnet = [
{ name => "56k modem",
ip => "127.0.0.101",
mtu => 576,
us_bw => 33,
us_queue => 0,
us_init_delay => 40, # V.90 processing, error correction etc.
us_total_delay => 0,
ds_bw => 56,
ds_queue => 0,
ds_init_delay => 40, # V.90 processing, error correction etc.
ds_total_delay => 0 },
{ name => "128k ISDN-BA",
ip => "127.0.0.102",
mtu => 576,
us_bw => 128,
us_queue => 0,
us_init_delay => 20, # guesstimate
us_total_delay => 0,
ds_bw => 128,
ds_queue => 0,
ds_init_delay => 20, # guesstimate
ds_total_delay => 0 },
{ name => "512k/64k ADSL",
ip => "127.0.0.103",
mtu => 1500,
us_bw => 64,
us_queue => 0,
us_init_delay => 15, # guesstimate
us_total_delay => 0,
ds_bw => 512,
ds_queue => 0,
ds_init_delay => 15, # guesstimate
ds_total_delay => 0 },
{ name => "1500k/256k ADSL",
ip => "127.0.0.104",
mtu => 1500,
us_bw => 256,
us_queue => 0,
us_init_delay => 15, # guesstimate
us_total_delay => 0,
ds_bw => 1500,
ds_queue => 0,
ds_init_delay => 15, # guesstimate
ds_total_delay => 0 },
{ name => "8000k/1000k ADSL",
ip => "127.0.0.105",
mtu => 1500,
us_bw => 1000,
us_queue => 0,
us_init_delay => 15, # guesstimate
us_total_delay => 0,
ds_bw => 8000,
ds_queue => 0,
ds_init_delay => 15, # guesstimate
ds_total_delay => 0 },
];
# =====================================================================
# Loop through $testnet and setup simulated networks
$set_nr = 10; # the initial ipfw set number to use
$pipe_nr = 10; # the initial ipfw pipe number to use
$rule_nr = 10; # the initial ipfw rule number to use
foreach $this (@$testnet){
# add serilization of 40 octet ACK to upsteam delay
$us_serial_delay = (40 * 8 ) / $$this{us_bw};
$$this{us_total_delay} = int($$this{us_init_delay} + $us_serial_delay);
# add serilization of MTU octet data to downstream delay
$ds_serial_delay = ($$this{mtu} * 8 ) / $$this{ds_bw};
$$this{ds_total_delay} = int($$this{ds_init_delay} + $ds_serial_delay);
printf "%s: %s kbit/s @ %s ms down and %s kbit/s @ %s ms up\n",
$$this{name},
$$this{ds_bw}, $$this{ds_total_delay},
$$this{us_bw}, $$this{us_total_delay};
# add alias to lo0 for the address
$ifconfig_command = "ifconfig lo0 alias $$this{ip}";
print $ifconfig_command, "\n";
`$ifconfig_command`;
# setup an input pipe to simulate the upstream
$ipfw_command = "ipfw -q add $rule_nr pipe $pipe_nr ip from any to
$$this{ip} in";
$pipe_command = "ipfw -q pipe $pipe_nr config bw $$this{us_bw}kbit/s " .
"queue $$this{us_queue} delay $$this{us_total_delay}ms";
print $ipfw_command, "\n";
`$ipfw_command`;
print $pipe_command, "\n";
`$pipe_command`;
$rule_nr++;
$pipe_nr++;
# setup an input pipe to simulate the downstream
$ipfw_command = "ipfw -q add $rule_nr pipe $pipe_nr ip from $$this{ip}
to any in";
$pipe_command = "ipfw -q pipe $pipe_nr config bw $$this{ds_bw}kbit/s " .
"queue $$this{ds_queue} delay $$this{ds_total_delay}ms";
print $ipfw_command, "\n";
`$ipfw_command`;
print $pipe_command, "\n";
`$pipe_command`;
$rule_nr++;
$pipe_nr++;
}
# SIGHUP inetd in order to listen on all new interfaces
`killall -HUP inetd`;
# =====================================================================
# Loop through $testnet and test performance
foreach $this (@$testnet){
# print headers etc
printf
"===================================================================\n";
printf "%s: %s kbit/s @ %s ms down and %s kbit/s @ %s ms up\n",
$$this{name},
$$this{ds_bw}, $$this{ds_total_delay},
$$this{us_bw}, $$this{us_total_delay};
printf
"===================================================================\n";
$start_time = time;
$ftp_command = "fetch ftp://$$this{ip}/pub/test_small";
printf "$ftp_command\n";
`$ftp_command`;
$finish_time = time;
$clock_time = $finish_time - $start_time;
printf "Clock time for transfer = $clock_time seconds\n";
printf "\n";
}
tbird:~/projects/lnf-test# ./lnf-test.pl
56k modem: 56 kbit/s @ 122 ms down and 33 kbit/s @ 49 ms up
ifconfig lo0 alias 127.0.0.101
ipfw -q add 10 pipe 10 ip from any to 127.0.0.101 in
ipfw -q pipe 10 config bw 33kbit/s queue 0 delay 49ms
ipfw -q add 11 pipe 11 ip from 127.0.0.101 to any in
ipfw -q pipe 11 config bw 56kbit/s queue 0 delay 122ms
128k ISDN-BA: 128 kbit/s @ 56 ms down and 128 kbit/s @ 22 ms up
ifconfig lo0 alias 127.0.0.102
ipfw -q add 12 pipe 12 ip from any to 127.0.0.102 in
ipfw -q pipe 12 config bw 128kbit/s queue 0 delay 22ms
ipfw -q add 13 pipe 13 ip from 127.0.0.102 to any in
ipfw -q pipe 13 config bw 128kbit/s queue 0 delay 56ms
512k/64k ADSL: 512 kbit/s @ 38 ms down and 64 kbit/s @ 20 ms up
ifconfig lo0 alias 127.0.0.103
ipfw -q add 14 pipe 14 ip from any to 127.0.0.103 in
ipfw -q pipe 14 config bw 64kbit/s queue 0 delay 20ms
ipfw -q add 15 pipe 15 ip from 127.0.0.103 to any in
ipfw -q pipe 15 config bw 512kbit/s queue 0 delay 38ms
1500k/256k ADSL: 1500 kbit/s @ 23 ms down and 256 kbit/s @ 16 ms up
ifconfig lo0 alias 127.0.0.104
ipfw -q add 16 pipe 16 ip from any to 127.0.0.104 in
ipfw -q pipe 16 config bw 256kbit/s queue 0 delay 16ms
ipfw -q add 17 pipe 17 ip from 127.0.0.104 to any in
ipfw -q pipe 17 config bw 1500kbit/s queue 0 delay 23ms
8000k/1000k ADSL: 8000 kbit/s @ 16 ms down and 1000 kbit/s @ 15 ms up
ifconfig lo0 alias 127.0.0.105
ipfw -q add 18 pipe 18 ip from any to 127.0.0.105 in
ipfw -q pipe 18 config bw 1000kbit/s queue 0 delay 15ms
ipfw -q add 19 pipe 19 ip from 127.0.0.105 to any in
ipfw -q pipe 19 config bw 8000kbit/s queue 0 delay 16ms
===================================================================
56k modem: 56 kbit/s @ 122 ms down and 33 kbit/s @ 49 ms up
===================================================================
fetch ftp://127.0.0.101/pub/test_small
Receiving test_small (40960 bytes): 100%
40960 bytes transferred in 6.1 seconds (6.58 kBps)
Clock time for transfer = 8 seconds
===================================================================
128k ISDN-BA: 128 kbit/s @ 56 ms down and 128 kbit/s @ 22 ms up
===================================================================
fetch ftp://127.0.0.102/pub/test_small
Receiving test_small (40960 bytes): 100%
40960 bytes transferred in 2.7 seconds (15.06 kBps)
Clock time for transfer = 4 seconds
===================================================================
512k/64k ADSL: 512 kbit/s @ 38 ms down and 64 kbit/s @ 20 ms up
===================================================================
fetch ftp://127.0.0.103/pub/test_small
Receiving test_small (40960 bytes): 100%
40960 bytes transferred in 0.7 seconds (57.42 kBps)
Clock time for transfer = 1 seconds
===================================================================
1500k/256k ADSL: 1500 kbit/s @ 23 ms down and 256 kbit/s @ 16 ms up
===================================================================
fetch ftp://127.0.0.104/pub/test_small
Receiving test_small (40960 bytes): 100%
40960 bytes transferred in 0.3 seconds (126.33 kBps)
Clock time for transfer = 1 seconds
===================================================================
8000k/1000k ADSL: 8000 kbit/s @ 16 ms down and 1000 kbit/s @ 15 ms up
===================================================================
fetch ftp://127.0.0.105/pub/test_small
Receiving test_small (40960 bytes): 100%
40960 bytes transferred in 0.2 seconds (202.97 kBps)
Clock time for transfer = 1 seconds
More information about the freebsd-ipfw
mailing list