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 <dsah...@gmail.com>
Signed-off-by: Sabrina Dubroca <s...@queasysnail.net>
---
 net/ipv6/addrconf.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index e89bca83e0e4..1659a6b3cf42 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -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;
-- 
2.18.0

Reply via email to