net/ipv6: propagate net.ipv6.conf.all.addr_gen_mode to devices
authorSabrina Dubroca <sd@queasysnail.net>
Mon, 9 Jul 2018 10:25:17 +0000 (12:25 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Jul 2018 05:50:45 +0000 (22:50 -0700)
This aligns the addr_gen_mode sysctl with the expected behavior of the
"all" variant.

Fixes: d35a00b8e33d ("net/ipv6: allow sysctl to change link-local address generation mode")
Suggested-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c

index e89bca83e0e4bd13d85de5643cb396b165a5f966..1659a6b3cf4220f59048561239e379b4d234ba1e 100644 (file)
@@ -5926,6 +5926,18 @@ static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write,
                                idev->cnf.addr_gen_mode = new_val;
                                addrconf_dev_config(idev->dev);
                        }
+               } else if (&net->ipv6.devconf_all->addr_gen_mode == ctl->data) {
+                       struct net_device *dev;
+
+                       net->ipv6.devconf_dflt->addr_gen_mode = new_val;
+                       for_each_netdev(net, dev) {
+                               idev = __in6_dev_get(dev);
+                               if (idev &&
+                                   idev->cnf.addr_gen_mode != new_val) {
+                                       idev->cnf.addr_gen_mode = new_val;
+                                       addrconf_dev_config(idev->dev);
+                               }
+                       }
                }
 
                *((u32 *)ctl->data) = new_val;