Date: Fri, 31 Jul 2015 20:23:07 +1000 (EST) From: Ian Smith <smithi@nimnet.asn.au> To: hiren panchasara <hiren@FreeBSD.org> Cc: freebsd-ipfw@FreeBSD.org Subject: Re: Traffic not going through dummynet Message-ID: <20150731171616.J17327@sola.nimnet.asn.au> In-Reply-To: <20150730182551.GF39365@strugglingcoder.info> References: <20150730182551.GF39365@strugglingcoder.info>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 30 Jul 2015 11:25:51 -0700, hiren panchasara wrote: > (For various reason's I didn't get/see Ian's message. Trying to do the > right thing by setting "In-Reply-To".) No problem, thanks. > On 07/27/15 at 01:07P, Ian Smith wrote: > > On Sun, 19 Jul 2015 21:05:53 -0700, hiren panchasara wrote: > > > Bah. > > > > > > So I removed ipfw and dummynet from kernconf and loaded them manually > > > after machine came up and it worked as expected. > > > > In your previous post, you'd said you were using 11-current, and: > > > > > And GENERIC has: > > > options IPFIREWALL > > > options DUMMYNET > > > options HZ=1000 > > > > Are you sure this was a 11 GENERIC kernconf? Those options haven't > > been in GENERIC for ages (if ever?), though they haven't needed to be > > since (perhaps) 8.0. I guess people just follow the handbook :( > > I modified GENERIC and added those options. I should have been more > clear here. Yeah, the handbook tends to lead one that way. I 'include GENERIC' and use no{options,device} as needed; saves me getting even more confused :) > > > Looks like some ordering issue between ipfw and dummynet. Fwiw, for > > > working setup, kldstat shows: > > > > > > 13 2 0xffffffff81e21000 21490 ipfw.ko > > > 14 1 0xffffffff81e43000 d0f6 dummynet.ko > > > > Indeed. If you load ipfw and dummynet by the usual means, being > > firewall_enable=YES and dummynet_enable=YES in rc.conf, you'll notice > > that /etc/rc.d/ipfw, in ipfw_prestart, loads dummynet if enabled, and > > natd and/or firewall_nat if enabled, in that order. > > > > The downside to doing that is that you have to have specified a type for > > rc.firewall or pointed to a custom ruleset so it's sane on startup. > > Didn't know the usual mean of rc.conf modifications. Checking /etc/defaults/rc.conf /firewall_, all you'd need for that is: firewall_enable=YES firewall_type=OPEN # permit all, regardless of default_to_accept dummynet_anable=YES which would at least load those modules in the right order, however as shown below, you didn't need to be so fussy, up to 9.3 anyway. > > Regarding the related(?) Bug 201488 - dummynet appears broken in > > 10.0-RELEASE and onwards (can't traffic shape on bridges) > > https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201488 > > it does seem likely to be the same issue as you noted. > > > > Did you ever hear back from James Rice (for whom I seem to have seen no > > other messages for an email address) as to whether your advice about > > loading these in the other order helped there? > > I haven't heard back yet. > > > > As to whether this is a regression, or it would have ever worked loading > > dummynet and then ipfw, I don't know, but I have a vague feeling that > > I've seen other issues regarding loading a module that's already in > > kernel in recent times .. sorry I can't be any more exact. Actually the other one was someone loading urtwn with it already in kernel getting bad results; I suggested trying without it in kernel, but haven't heard back either. > Yeah, good point about whether this is a regression or not. I am not > aware of any such loading issues wrt modules. In the olden days, attempting to load a module already in kernel would fail gracefully with a message early on in dmesg. I'm still wondering if there's some issue there. I'll try loading dummynet before ipfw on my 9.3 system using a similar setup to yours such as noticeable delay. > > Maybe dummynet needs a check that ipfw is loaded before starting? > > That'd be logical, imo. Will I ever learn to not suggest things I can't actually fix myself? :) Ok, here's a near-duplicate on 9.3-R of your procedure on 11.0 root@x200:~ # kldstat -v | egrep 'ipfw|dummynet' root@x200:~ # kldload dummynet root@x200:~ # kldstat -v | egrep 'ipfw|dummynet' 9 1 0xffffffff81a3b000 d910 dummynet.ko (/boot/kernel/dummynet.ko) 511 dummynet 10 1 0xffffffff81a49000 12200 ipfw.ko (/boot/kernel/ipfw.ko) 510 ipfw [ note that loading dummynet also loads ipfw - as expected I guess - and that they're here listed in that reverse order numerically, FWIW ] root@x200:~ # ipfw -t show 65535 0 0 deny ip from any to any root@x200:~ # ipfw add 65000 allow ip from any to any 65000 allow ip from any to any root@x200:~ # ipfw -t show 65000 0 0 allow ip from any to any 65535 2 560 Fri Jul 31 19:28:47 2015 deny ip from any to any [ I didn't reboot, so added the allow-all rule. I'd normally use the method of running 'kldload ipfw && ipfw add 32000 ip from any to any' from a remote ssh session, but 'kldload dummynet', since it auto-loads ipfw with default-deny rule, naturally killed my login ] root@x200:~ # ipfw add 32000 pipe 1 ip from any to any 32000 pipe 1 ip from any to any root@x200:~ # ipfw pipe 1 config delay 100ms root@x200:~ # ipfw -t show 32000 0 0 pipe 1 ip from any to any 65000 1 112 Fri Jul 31 19:28:59 2015 allow ip from any to any 65535 2 560 Fri Jul 31 19:28:47 2015 deny ip from any to any root@x200:~ # ipfw pipe show 00001: unlimited 100 ms burst 0 q131073 50 sl. 0 flows (1 buckets) sched 65537 weight 0 lmax 0 pri 0 droptail sched 65537 type FIFO flags 0x0 0 buckets 0 active root@x200:~ # sysctl kern.features | grep ipfw # not on 9.3 root@x200:~ # sysctl net.inet.ip.dummynet | grep io # if relevant net.inet.ip.dummynet.io_pkt_drop: 0 net.inet.ip.dummynet.io_pkt_fast: 0 net.inet.ip.dummynet.io_pkt: 7 net.inet.ip.dummynet.io_fast: 0 root@x200:~ # ping t23 PING t23 (192.168.7.7): 56 data bytes 64 bytes from 192.168.7.7: icmp_seq=0 ttl=64 time=198.792 ms 64 bytes from 192.168.7.7: icmp_seq=1 ttl=64 time=199.997 ms 64 bytes from 192.168.7.7: icmp_seq=2 ttl=64 time=199.884 ms ^C --- t23 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 198.792/199.558/199.997/0.543 ms root@x200:~ # ipfw disable one_pass # no diff in this context root@x200:~ # ping t23 PING t23 (192.168.7.7): 56 data bytes 64 bytes from 192.168.7.7: icmp_seq=0 ttl=64 time=198.273 ms 64 bytes from 192.168.7.7: icmp_seq=1 ttl=64 time=200.964 ms 64 bytes from 192.168.7.7: icmp_seq=2 ttl=64 time=200.041 ms ^C --- t23 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 198.273/199.759/200.964/1.117 ms root@x200:~ # ipfw pipe show 00001: unlimited 100 ms burst 0 q131073 50 sl. 0 flows (1 buckets) sched 65537 weight 0 lmax 0 pri 0 droptail sched 65537 type FIFO flags 0x0 0 buckets 0 active root@x200:~ # ipfw -t show 32000 25 4060 Fri Jul 31 19:37:59 2015 pipe 1 ip from any to any 65000 8 728 Fri Jul 31 19:37:59 2015 allow ip from any to any 65535 2 560 Fri Jul 31 19:28:47 2015 deny ip from any to any root@x200:~ # ipfw add 2000 skipto 40000 ip from any to any 02000 skipto 40000 ip from any to any root@x200:~ # ping t23 PING t23 (192.168.7.7): 56 data bytes 64 bytes from 192.168.7.7: icmp_seq=0 ttl=64 time=0.447 ms 64 bytes from 192.168.7.7: icmp_seq=1 ttl=64 time=0.392 ms 64 bytes from 192.168.7.7: icmp_seq=2 ttl=64 time=0.549 ms 64 bytes from 192.168.7.7: icmp_seq=3 ttl=64 time=0.607 ms ^C --- t23 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.392/0.499/0.607/0.084 ms [ note here I'd bypassed the pipe rule, and unloading dummynet is ok, ie it doesn't just then unload ipfw too ] root@x200:~ # kldunload dummynet root@x200:~ # ping t23 PING t23 (192.168.7.7): 56 data bytes 64 bytes from 192.168.7.7: icmp_seq=0 ttl=64 time=0.512 ms 64 bytes from 192.168.7.7: icmp_seq=1 ttl=64 time=0.392 ms ^C --- t23 ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.392/0.452/0.512/0.060 ms [ but as soon as I delete that bypass rule, it's all over .. ] root@x200:~ # ipfw delete 2000 ipfw: rule 2000: setsockopt(IP_FW_DEL): Protocol not available root@x200:~ # ipfw -t show ipfw: getsockopt(IP_FW_GET): Protocol not available root@x200:~ # kldstat -v | egrep 'ipfw|dummynet' root@x200:~ # ======= So in summary: the behaviour you demonstrated on 11.0 does not occur on 9.3 - assuming I did things in the same order that you did - so it does indeed seem to be a regression. I have no 10.x system to test. cheers, Ian
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150731171616.J17327>