Re: dummynet configuration for automated tests
- In reply to: Kristof Provost: "dummynet configuration for automated tests"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 25 Jul 2021 15:57:59 UTC
Perhaps a different question would also be helpful: Can anyone share a functional example configuration using dummynet to prioritise traffic? Thanks, Kristof On 20 Jul 2021, at 9:15, Kristof Provost wrote: > Hi, > > I’ve been trying (and failing) to write a few basic test cases for > dummynet (with ipfw for now). > > The full test script can be found here: > https://people.freebsd.org/~kp/dummynet.sh but the relevant bit is > this: > > queue_v6_body() > { > fw=$1 > firewall_init $fw > dummynet_init $fw > > epair=$(vnet_mkepair) > epair_link=$(vnet_mkepair) > vnet_mkjail alcatraz ${epair}b ${epair_link}a > vnet_mkjail srv ${epair_link}b > > set -x > > ifconfig ${epair}a inet6 2001:db8:42::1/64 no_dad up > route add -6 2001:db8:43::/64 2001:db8:42::2 > > jexec alcatraz ifconfig ${epair}b inet6 2001:db8:42::2 no_dad > up > jexec alcatraz ifconfig ${epair_link}a inet6 2001:db8:43::2 > no_dad up > jexec alcatraz sysctl net.inet6.ip6.forwarding=1 > > jexec srv ifconfig ${epair_link}b inet6 2001:db8:43::1 no_dad > up > jexec srv route add -6 default 2001:db8:43::2 > jexec srv /usr/sbin/inetd -p inetd-alcatraz.pid \ > $(atf_get_srcdir)/../pf/echo_inetd.conf > > # Sanity check > atf_check -s exit:0 -o ignore ping6 -i .1 -c 3 -s 1200 > 2001:db8:42::2 > atf_check -s exit:0 -o ignore ping6 -i .1 -c 3 -s 1200 > 2001:db8:43::2 > atf_check -s exit:0 -o ignore ping6 -i .1 -c 3 -s 1200 > 2001:db8:43::1 > > reply=$(echo "foo" | nc -w 5 -N 2001:db8:43::1 7) > if [ "$reply" != "foo" ]; > then > atf_fail "Echo sanity check failed" > fi > > jexec alcatraz dnctl pipe 1 config bw 300Byte/s queue 5 mask > proto 0xff > jexec alcatraz dnctl sched 1 config pipe 1 type wf2q+ mask > proto 0xff > jexec alcatraz dnctl queue 1 config sched 1 weight 99 queue 5 > mask proto 0xff > jexec alcatraz dnctl queue 2 config sched 1 weight 1 queue 5 > mask proto 0xff > > firewall_config alcatraz ${fw} \ > "ipfw" \ > "ipfw add queue 2 ipv6-icmp from any to any > icmp6types 128,129" \ > "ipfw add queue 1 tcp from any to any" > > # Single ping succeeds > atf_check -s exit:0 -o ignore ping6 -c 3 2001:db8:43::1 > # Unsaturated TCP succeeds > reply=$(echo "foo" | nc -w 5 -N 2001:db8:43::1 7) > if [ "$reply" != "foo" ]; > then > atf_fail "Unsaturated echo failed" > fi > > # Saturate the link > ping6 -i .01 -s 1200 2001:db8:43::1 & > > # Give that a chance to fill the queue & pipe > sleep 1 > > jexec alcatraz ipfw show > > # We should now be hitting the limits and get this packet > dropped. > atf_check -s exit:2 -o ignore ping6 -c 1 -W 1 -s 1200 > 2001:db8:43::1 > > # TCP should still just pass > for i in `seq 0 4` > do > reply=$(echo "foo $i" | nc -w 10 -N 2001:db8:43::1 7) > if [ "$reply" != "foo $i" ]; > then > atf_fail "Failed to prioritise traffic on > interation $i" > fi > sleep 1 > done > > jexec alcatraz ipfw flush > # This will fail if we don't differentiate the traffic > firewall_config alcatraz ${fw} \ > "ipfw" \ > "ipfw add queue 1 ipv6-icmp from any to any > icmp6types 128,129" \ > "ipfw add queue 2 tcp from any to any" > > # Carry over state? > killall ping6 > ping6 -i .01 -s 1200 2001:db8:43::1 & > sleep 1 > > reply=$(echo "baz" | nc -w 10 -N 2001:db8:43::1 7) > if [ "$reply" == "baz" ]; > then > jexec alcatraz ipfw show > atf_fail "TCP still made it through, even when not > prioritised" > fi > } > > The idea is to set up a very slow link (using a pipe), and then to > send both ICMP echo and TCP traffic through it. There’s vastly more > ICMP traffic than TCP, and the expectation is that without > prioritisation the ICMP traffic will drown out TCP and cause the > connection to fail. > We then try to use dummynet to give TCP priority over ICMP, so that > the TCP connections do succeed. > > However, I simply cannot get it to behave in any sort of predictable > or consistent way. Sometimes the TCP connection succeeds, despite > attempts to prioritise ICMP, or vice versa. > > Clearly I’m misconfiguring something, but at this point I do not > understand what. Does anyone see my mistake, or have any relevant > configuration examples to share? > > Thanks, > Kristof