int all_slaves_active =
                        nla_get_u8(data[IFLA_BOND_ALL_SLAVES_ACTIVE]);
 
-               err = bond_option_all_slaves_active_set(bond,
-                                                       all_slaves_active);
+               bond_opt_initval(&newval, all_slaves_active);
+               err = __bond_opt_set(bond, BOND_OPT_ALL_SLAVES_ACTIVE, &newval);
                if (err)
                        return err;
        }
 
        { NULL,  -1, 0}
 };
 
+static struct bond_opt_value bond_all_slaves_active_tbl[] = {
+       { "off", 0,  BOND_VALFLAG_DEFAULT},
+       { "on",  1,  0},
+       { NULL,  -1, 0}
+};
+
 static struct bond_option bond_opts[] = {
        [BOND_OPT_MODE] = {
                .id = BOND_OPT_MODE,
                .flags = BOND_OPTFLAG_RAWVAL,
                .set = bond_option_queue_id_set
        },
+       [BOND_OPT_ALL_SLAVES_ACTIVE] = {
+               .id = BOND_OPT_ALL_SLAVES_ACTIVE,
+               .name = "all_slaves_active",
+               .desc = "Keep all frames received on an interface by setting active flag for all slaves",
+               .values = bond_all_slaves_active_tbl,
+               .set = bond_option_all_slaves_active_set
+       },
        { }
 };
 
 }
 
 int bond_option_all_slaves_active_set(struct bonding *bond,
-                                     int all_slaves_active)
+                                     struct bond_opt_value *newval)
 {
        struct list_head *iter;
        struct slave *slave;
 
-       if (all_slaves_active == bond->params.all_slaves_active)
+       if (newval->value == bond->params.all_slaves_active)
                return 0;
-
-       if ((all_slaves_active == 0) || (all_slaves_active == 1)) {
-               bond->params.all_slaves_active = all_slaves_active;
-       } else {
-               pr_info("%s: Ignoring invalid all_slaves_active value %d.\n",
-                       bond->dev->name, all_slaves_active);
-               return -EINVAL;
-       }
-
+       bond->params.all_slaves_active = newval->value;
        bond_for_each_slave(bond, slave, iter) {
                if (!bond_is_active_slave(slave)) {
-                       if (all_slaves_active)
+                       if (newval->value)
                                slave->inactive = 0;
                        else
                                slave->inactive = 1;
 
        BOND_OPT_USE_CARRIER,
        BOND_OPT_ACTIVE_SLAVE,
        BOND_OPT_QUEUE_ID,
+       BOND_OPT_ALL_SLAVES_ACTIVE,
        BOND_OPT_LAST
 };
 
                                 struct bond_opt_value *newval);
 int bond_option_queue_id_set(struct bonding *bond,
                             struct bond_opt_value *newval);
+int bond_option_all_slaves_active_set(struct bonding *bond,
+                                     struct bond_opt_value *newval);
 #endif /* _BOND_OPTIONS_H */
 
                                           const char *buf, size_t count)
 {
        struct bonding *bond = to_bond(d);
-       int new_value, ret;
-
-       if (sscanf(buf, "%d", &new_value) != 1) {
-               pr_err("%s: no all_slaves_active value specified.\n",
-                      bond->dev->name);
-               return -EINVAL;
-       }
-
-       if (!rtnl_trylock())
-               return restart_syscall();
+       int ret;
 
-       ret = bond_option_all_slaves_active_set(bond, new_value);
+       ret = bond_opt_tryset_rtnl(bond, BOND_OPT_ALL_SLAVES_ACTIVE,
+                                  (char *)buf);
        if (!ret)
                ret = count;
 
-       rtnl_unlock();
        return ret;
 }
 static DEVICE_ATTR(all_slaves_active, S_IRUGO | S_IWUSR,
 
 int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target);
 int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target);
 int bond_option_resend_igmp_set(struct bonding *bond, int resend_igmp);
-int bond_option_all_slaves_active_set(struct bonding *bond,
-                                     int all_slaves_active);
 int bond_option_lp_interval_set(struct bonding *bond, int min_links);
 struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond);
 struct net_device *bond_option_active_slave_get(struct bonding *bond);