static char *arp_ip_target[BOND_MAX_ARP_TARGETS];
 static char *arp_validate;
 static char *fail_over_mac;
+static int all_slaves_active = 0;
 static struct bond_params bonding_defaults;
 
 module_param(max_bonds, int, 0);
 MODULE_PARM_DESC(arp_validate, "validate src/dst of ARP probes: none (default), active, backup or all");
 module_param(fail_over_mac, charp, 0);
 MODULE_PARM_DESC(fail_over_mac, "For active-backup, do not set all slaves to the same MAC.  none (default), active or follow");
+module_param(all_slaves_active, int, 0);
+MODULE_PARM_DESC(all_slaves_active, "Keep all frames received on an interface"
+                                    "by setting active flag for all slaves.  "
+                                    "0 for never (default), 1 for always.");
 
 /*----------------------------- Global variables ----------------------------*/
 
                }
        }
 
+       if ((all_slaves_active != 0) && (all_slaves_active != 1)) {
+               pr_warning("Warning: all_slaves_active module parameter (%d), "
+                          "not of valid value (0/1), so it was set to "
+                          "0\n", all_slaves_active);
+               all_slaves_active = 0;
+       }
+
        /* reset values for TLB/ALB */
        if ((bond_mode == BOND_MODE_TLB) ||
            (bond_mode == BOND_MODE_ALB)) {
        params->primary[0] = 0;
        params->primary_reselect = primary_reselect_value;
        params->fail_over_mac = fail_over_mac_value;
+       params->all_slaves_active = all_slaves_active;
 
        if (primary) {
                strncpy(params->primary, primary, IFNAMSIZ);
 
 }
 static DEVICE_ATTR(ad_partner_mac, S_IRUGO, bonding_show_ad_partner_mac, NULL);
 
+/*
+ * Show and set the all_slaves_active flag.
+ */
+static ssize_t bonding_show_slaves_active(struct device *d,
+                                         struct device_attribute *attr,
+                                         char *buf)
+{
+       struct bonding *bond = to_bond(d);
+
+       return sprintf(buf, "%d\n", bond->params.all_slaves_active);
+}
+
+static ssize_t bonding_store_slaves_active(struct device *d,
+                                          struct device_attribute *attr,
+                                          const char *buf, size_t count)
+{
+       int i, new_value, ret = count;
+       struct bonding *bond = to_bond(d);
+       struct slave *slave;
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               pr_err("%s: no all_slaves_active value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (new_value == bond->params.all_slaves_active)
+               goto out;
+
+       if ((new_value == 0) || (new_value == 1)) {
+               bond->params.all_slaves_active = new_value;
+       } else {
+               pr_info("%s: Ignoring invalid all_slaves_active value %d.\n",
+                       bond->dev->name, new_value);
+               ret = -EINVAL;
+               goto out;
+       }
 
+       bond_for_each_slave(bond, slave, i) {
+               if (slave->state == BOND_STATE_BACKUP) {
+                       if (new_value)
+                               slave->dev->priv_flags &= ~IFF_SLAVE_INACTIVE;
+                       else
+                               slave->dev->priv_flags |= IFF_SLAVE_INACTIVE;
+               }
+       }
+out:
+       return count;
+}
+static DEVICE_ATTR(all_slaves_active, S_IRUGO | S_IWUSR,
+                  bonding_show_slaves_active, bonding_store_slaves_active);
 
 static struct attribute *per_bond_attrs[] = {
        &dev_attr_slaves.attr,
        &dev_attr_ad_actor_key.attr,
        &dev_attr_ad_partner_key.attr,
        &dev_attr_ad_partner_mac.attr,
+       &dev_attr_all_slaves_active.attr,
        NULL,
 };
 
 
        char primary[IFNAMSIZ];
        int primary_reselect;
        __be32 arp_targets[BOND_MAX_ARP_TARGETS];
+       int all_slaves_active;
 };
 
 struct bond_parm_tbl {
        struct bonding *bond = netdev_priv(slave->dev->master);
        if (!bond_is_lb(bond))
                slave->state = BOND_STATE_BACKUP;
-       slave->dev->priv_flags |= IFF_SLAVE_INACTIVE;
+       if (!bond->params.all_slaves_active)
+               slave->dev->priv_flags |= IFF_SLAVE_INACTIVE;
        if (slave_do_arp_validate(bond, slave))
                slave->dev->priv_flags |= IFF_SLAVE_NEEDARP;
 }