|
|
@@ -1699,6 +1699,44 @@ static ssize_t bonding_store_resend_igmp(struct device *d,
|
|
|
static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR,
|
|
|
bonding_show_resend_igmp, bonding_store_resend_igmp);
|
|
|
|
|
|
+
|
|
|
+static ssize_t bonding_show_lp_interval(struct device *d,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct bonding *bond = to_bond(d);
|
|
|
+ return sprintf(buf, "%d\n", bond->params.lp_interval);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t bonding_store_lp_interval(struct device *d,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct bonding *bond = to_bond(d);
|
|
|
+ int new_value, ret = count;
|
|
|
+
|
|
|
+ if (sscanf(buf, "%d", &new_value) != 1) {
|
|
|
+ pr_err("%s: no lp interval value specified.\n",
|
|
|
+ bond->dev->name);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (new_value <= 0) {
|
|
|
+ pr_err ("%s: lp_interval must be between 1 and %d\n",
|
|
|
+ bond->dev->name, INT_MAX);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ bond->params.lp_interval = new_value;
|
|
|
+out:
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static DEVICE_ATTR(lp_interval, S_IRUGO | S_IWUSR,
|
|
|
+ bonding_show_lp_interval, bonding_store_lp_interval);
|
|
|
+
|
|
|
static struct attribute *per_bond_attrs[] = {
|
|
|
&dev_attr_slaves.attr,
|
|
|
&dev_attr_mode.attr,
|
|
|
@@ -1729,6 +1767,7 @@ static struct attribute *per_bond_attrs[] = {
|
|
|
&dev_attr_all_slaves_active.attr,
|
|
|
&dev_attr_resend_igmp.attr,
|
|
|
&dev_attr_min_links.attr,
|
|
|
+ &dev_attr_lp_interval.attr,
|
|
|
NULL,
|
|
|
};
|
|
|
|