Re: sysctls below net.ipv[46].conf.all not working as expected
From: Uwe Kleine-König <hidden>
Date: 2011-02-22 10:41:31
Hello David, On Thu, Dec 30, 2010 at 09:43:19PM +0100, Uwe Kleine-König wrote:
On Thu, Dec 30, 2010 at 12:30:23PM -0800, David Miller wrote:quoted
From: Uwe Kleine-König <redacted> Date: Wed, 29 Dec 2010 17:06:07 +0100quoted
I did the following: cassiopeia:~# sysctl net.ipv6.conf.all.use_tempaddr net.ipv6.conf.all.use_tempaddr = 0 cassiopeia:~# sysctl net.ipv6.conf.eth0.use_tempaddr net.ipv6.conf.eth0.use_tempaddr = 0 cassiopeia:~# sysctl -w net.ipv6.conf.all.use_tempaddr=1 net.ipv6.conf.all.use_tempaddr = 1 cassiopeia:~# sysctl net.ipv6.conf.all.use_tempaddr net.ipv6.conf.all.use_tempaddr = 1 cassiopeia:~# sysctl net.ipv6.conf.eth0.use_tempaddr net.ipv6.conf.eth0.use_tempaddr = 0 Here I would have expected that eth0's use_tempaddr is 1, too. The problem is not that this entry isn't writeable:The "all" value is propagated at the first moment that the ipv6 device private is created, usually that is when the device is first brought up which means it can happen as early as the exact moment the device is registered. Therefore, if you want "all" to apply to "eth0", you must make sure the sysctl is set properly before the device is registered.I thought this is what "default" was used for?!
I took the time now to dig into the source for ipv4/{all,default}.
Unless I'm mistaken I found:
- inetdev_init copies dev_net(dev)->ipv4.devconf_dflt to &in_dev->cnf
That's called from inetdev_event if there is no in_dev.
- devinet_copy_dflt_conf copies to all devices that have !test_bit(i,
in_dev->cnf.state)
devinet_copy_dflt_conf is called when /proc/sys/net/ipv4/conf/default
is written to. I didn't found where the in_dev->cnf.state bits are
set.
- net->ipv4.devconf_all is never propagated to the devices.
- The data behind /proc/sys/net/ipv4/conf/all is used in registering
net->ipv4.forw_hdr and seems only have to do with ip_forward
So I think that it's really "default" that propagates to a new device as
I expected and the documentation suggests.
So IMHO a better name for "all" would be "global" ...
If you are really right, the documentation is (IMHO) misleading. e.g. Documentation/networking/ip-sysctl.txt tells: conf/default/*: Change the interface-specific default settings. conf/all/*: Change all the interface-specific settings.
... and this is misleading. I wonder if it would be considered OK, to create a new config directory called "global" that acts like "all" now and let "all" propagate all changes to all devices, "default" and "global". If not the documentation needs clearification. I guess for ipv6 it's similar, though I didn't check that. Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |