[IFLA_INET6_TOKEN]              = { .len = sizeof(struct in6_addr) },
 };
 
-static int inet6_validate_link_af(const struct net_device *dev,
-                                 const struct nlattr *nla)
-{
-       struct nlattr *tb[IFLA_INET6_MAX + 1];
-
-       if (dev && !__in6_dev_get(dev))
-               return -EAFNOSUPPORT;
-
-       return nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla,
-                                          inet6_af_policy, NULL);
-}
-
 static int check_addr_gen_mode(int mode)
 {
        if (mode != IN6_ADDR_GEN_MODE_EUI64 &&
        return 1;
 }
 
+static int inet6_validate_link_af(const struct net_device *dev,
+                                 const struct nlattr *nla)
+{
+       struct nlattr *tb[IFLA_INET6_MAX + 1];
+       struct inet6_dev *idev = NULL;
+       int err;
+
+       if (dev) {
+               idev = __in6_dev_get(dev);
+               if (!idev)
+                       return -EAFNOSUPPORT;
+       }
+
+       err = nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla,
+                                         inet6_af_policy, NULL);
+       if (err)
+               return err;
+
+       if (!tb[IFLA_INET6_TOKEN] && !tb[IFLA_INET6_ADDR_GEN_MODE])
+               return -EINVAL;
+
+       if (tb[IFLA_INET6_ADDR_GEN_MODE]) {
+               u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]);
+
+               if (check_addr_gen_mode(mode) < 0)
+                       return -EINVAL;
+               if (dev && check_stable_privacy(idev, dev_net(dev), mode) < 0)
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int inet6_set_link_af(struct net_device *dev, const struct nlattr *nla)
 {
-       int err = -EINVAL;
        struct inet6_dev *idev = __in6_dev_get(dev);
        struct nlattr *tb[IFLA_INET6_MAX + 1];
-
-       if (!idev)
-               return -EAFNOSUPPORT;
+       int err;
 
        if (nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla, NULL, NULL) < 0)
                BUG();
        if (tb[IFLA_INET6_ADDR_GEN_MODE]) {
                u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]);
 
-               if (check_addr_gen_mode(mode) < 0 ||
-                   check_stable_privacy(idev, dev_net(dev), mode) < 0)
-                       return -EINVAL;
-
                idev->cnf.addr_gen_mode = mode;
-               err = 0;
        }
 
-       return err;
+       return 0;
 }
 
 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,