memcpy(buf, &naddr, sizeof(naddr));
 }
 
-#if IS_MODULE(CONFIG_IPV6)
-#define EXPORT_IPV6_MOD(X) EXPORT_SYMBOL(X)
-#define EXPORT_IPV6_MOD_GPL(X) EXPORT_SYMBOL_GPL(X)
-#else
-#define EXPORT_IPV6_MOD(X)
-#define EXPORT_IPV6_MOD_GPL(X)
-#endif
-
 #if IS_ENABLED(CONFIG_IPV6)
 #include <linux/ipv6.h>
 #endif
 
 #endif
 
+#if IS_MODULE(CONFIG_IPV6)
+#define EXPORT_IPV6_MOD(X) EXPORT_SYMBOL(X)
+#define EXPORT_IPV6_MOD_GPL(X) EXPORT_SYMBOL_GPL(X)
+#else
+#define EXPORT_IPV6_MOD(X)
+#define EXPORT_IPV6_MOD_GPL(X)
+#endif
+
 static inline unsigned int ipv4_addr_hash(__be32 ip)
 {
        return (__force unsigned int) ip;
 
 #include <net/netlink.h>
 #include <net/pkt_sched.h>
 #include <net/l3mdev.h>
+#include <net/netdev_lock.h>
 #include <linux/if_tunnel.h>
 #include <linux/rtnetlink.h>
 #include <linux/netconf.h>
        int err = -ENOMEM;
 
        ASSERT_RTNL();
+       netdev_ops_assert_locked(dev);
 
        if (dev->mtu < IPV6_MIN_MTU && dev != blackhole_netdev)
                return ERR_PTR(-EINVAL);
                return ERR_PTR(err);
        }
        if (ndev->cnf.forwarding)
-               dev_disable_lro(dev);
+               netif_disable_lro(dev);
        /* We refer to the device */
        netdev_hold(dev, &ndev->dev_tracker, GFP_KERNEL);
 
 
        rtnl_net_lock(net);
        dev = __dev_get_by_index(net, ireq.ifr6_ifindex);
+       netdev_lock_ops(dev);
        if (dev)
                err = inet6_addr_add(net, dev, &cfg, 0, 0, NULL);
        else
                err = -ENODEV;
+       netdev_unlock_ops(dev);
        rtnl_net_unlock(net);
        return err;
 }
        if (!dev) {
                NL_SET_ERR_MSG_MOD(extack, "Unable to find the interface");
                err = -ENODEV;
-               goto unlock;
+               goto unlock_rtnl;
        }
 
+       netdev_lock_ops(dev);
        idev = ipv6_find_idev(dev);
        if (IS_ERR(idev)) {
                err = PTR_ERR(idev);
 
        in6_ifa_put(ifa);
 unlock:
+       netdev_unlock_ops(dev);
+unlock_rtnl:
        rtnl_net_unlock(net);
 
        return err;
 
                        if (idev->cnf.addr_gen_mode != new_val) {
                                WRITE_ONCE(idev->cnf.addr_gen_mode, new_val);
+                               netdev_lock_ops(idev->dev);
                                addrconf_init_auto_addrs(idev->dev);
+                               netdev_unlock_ops(idev->dev);
                        }
                } else if (&net->ipv6.devconf_all->addr_gen_mode == ctl->data) {
                        struct net_device *dev;
                                    idev->cnf.addr_gen_mode != new_val) {
                                        WRITE_ONCE(idev->cnf.addr_gen_mode,
                                                  new_val);
+                                       netdev_lock_ops(idev->dev);
                                        addrconf_init_auto_addrs(idev->dev);
+                                       netdev_unlock_ops(idev->dev);
                                }
                        }
                }