Odpověď jsem našel při psaní otázky. Rozhodl jsem se to přesto zveřejnit, protože to ostatní mohou považovat za poučné a pak na to odpovím sám; Doufám, že to nebude odsuzováno :)
Uživatel Philipp Matthias Hahn z mailing listu linux-kernel na to alespoň částečně přišel:
As far as I researched for IPv4 some time ago, the "default" value gets
copied to newly created interfaces only once.
"all" on the other hand allways gets applied in addition to the current
setting, but it depends on the exact setting, if its ORed, ANDed, or
whatevered:
log_martians OR
accept_redirects AND
forwarding ?
mc_forwarding AND
medium_id
proxy_arp OR
shared_media OR
secure_redirects OR
send_redirects OR
bootp_relay AND
accept_source_route AND
rp_filter AND
arp_filter OR
arp_announce MAX
arp_ignore MAX
arp_accept
app_solicit
disable_policy
disable_xfrm
tag
(see include/linux/inetdevice.h:83 for IN_DEV_{AND,OR,MAX}CONF)
Putting a new value in "all" doesn't change the value you read from
"$interface", but it only gets computed and used internally.
Nezahrnuje accept_ra
ale aspoň je teď jasné, jak all
a default
fungují, nebo spíše, jak nefungují tak, jak bych očekával.
Obslužná rutina pro accept_ra
v net/ipv6/addrconf.c
je proc_dointvec
. Takže generický kód rozhraní dříve vygeneroval pole all
a položky specifické pro rozhraní a zápis do nich pomocí sysctl
nebo procfs pouze vloží vámi zadanou hodnotu do pole.
Zajímá nás, jak se pak tyto hodnoty používají
Uvidíte od volajících na číslo ipv6_accept_ra()
funkce v include/net/ipv6.h
že každý volající používá k volání této funkce specifické rozhraní.
Takže nikde v jádře není net.ipv6.conf.all.accept_ra
se vždy používá kromě uložení záznamu procfs, pokud vidím.
Pokud chcete změnit accept_ra
z každého rozhraní jedním příkazem můžete provést toto:
for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
sysctl -w "$TUNABLE=0"
done
Mám asi 4 roky zpoždění, ale tohle je správná odpověď :P