bond_sysfs.c 44.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Copyright(c) 2004-2005 Intel Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 */
J
Joe Perches 已提交
22 23 24

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

25 26 27
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
28
#include <linux/sched.h>
29 30 31 32 33 34 35 36 37 38
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/in.h>
#include <linux/sysfs.h>
#include <linux/ctype.h>
#include <linux/inet.h>
#include <linux/rtnetlink.h>
39
#include <linux/etherdevice.h>
40
#include <net/net_namespace.h>
41 42
#include <net/netns/generic.h>
#include <linux/nsproxy.h>
43 44

#include "bonding.h"
45

S
Stephen Hemminger 已提交
46
#define to_dev(obj)	container_of(obj, struct device, kobj)
47
#define to_bond(cd)	((struct bonding *)(netdev_priv(to_net_dev(cd))))
48 49 50 51 52

/*
 * "show" function for the bond_masters attribute.
 * The class parameter is ignored.
 */
53 54 55
static ssize_t bonding_show_bonds(struct class *cls,
				  struct class_attribute *attr,
				  char *buf)
56
{
57 58
	struct bond_net *bn =
		container_of(attr, struct bond_net, class_attr_bonding_masters);
59 60 61
	int res = 0;
	struct bonding *bond;

62
	rtnl_lock();
63

64
	list_for_each_entry(bond, &bn->dev_list, bond_list) {
65 66 67 68
		if (res > (PAGE_SIZE - IFNAMSIZ)) {
			/* not enough space for another interface name */
			if ((PAGE_SIZE - res) > 10)
				res = PAGE_SIZE - 10;
69
			res += sprintf(buf + res, "++more++ ");
70 71
			break;
		}
72
		res += sprintf(buf + res, "%s ", bond->dev->name);
73
	}
74 75
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */
76 77

	rtnl_unlock();
78 79 80
	return res;
}

81
static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifname)
82 83 84
{
	struct bonding *bond;

85
	list_for_each_entry(bond, &bn->dev_list, bond_list) {
86 87 88 89 90 91
		if (strncmp(bond->dev->name, ifname, IFNAMSIZ) == 0)
			return bond->dev;
	}
	return NULL;
}

92 93 94 95 96 97 98 99
/*
 * "store" function for the bond_masters attribute.  This is what
 * creates and deletes entire bonds.
 *
 * The class parameter is ignored.
 *
 */

S
Stephen Hemminger 已提交
100
static ssize_t bonding_store_bonds(struct class *cls,
101
				   struct class_attribute *attr,
S
Stephen Hemminger 已提交
102
				   const char *buffer, size_t count)
103
{
104 105
	struct bond_net *bn =
		container_of(attr, struct bond_net, class_attr_bonding_masters);
106 107
	char command[IFNAMSIZ + 1] = {0, };
	char *ifname;
108
	int rv, res = count;
109 110 111 112 113 114 115 116

	sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
	ifname = command + 1;
	if ((strlen(command) <= 1) ||
	    !dev_valid_name(ifname))
		goto err_no_cmd;

	if (command[0] == '+') {
J
Joe Perches 已提交
117
		pr_info("%s is being created...\n", ifname);
118
		rv = bond_create(bn->net, ifname);
119
		if (rv) {
120 121 122 123
			if (rv == -EEXIST)
				pr_info("%s already exists.\n", ifname);
			else
				pr_info("%s creation failed.\n", ifname);
124
			res = rv;
125
		}
126 127
	} else if (command[0] == '-') {
		struct net_device *bond_dev;
128

129
		rtnl_lock();
130
		bond_dev = bond_get_by_name(bn, ifname);
131
		if (bond_dev) {
J
Joe Perches 已提交
132
			pr_info("%s is being deleted...\n", ifname);
133 134
			unregister_netdevice(bond_dev);
		} else {
J
Joe Perches 已提交
135
			pr_err("unable to delete non-existent %s\n", ifname);
136 137 138 139 140
			res = -ENODEV;
		}
		rtnl_unlock();
	} else
		goto err_no_cmd;
141

142 143 144 145
	/* Always return either count or an error.  If you return 0, you'll
	 * get called forever, which is bad.
	 */
	return res;
146 147

err_no_cmd:
J
Joe Perches 已提交
148
	pr_err("no command found in bonding_masters. Use +ifname or -ifname.\n");
149
	return -EPERM;
150
}
151

152 153 154 155 156 157 158 159
static const void *bonding_namespace(struct class *cls,
				     const struct class_attribute *attr)
{
	const struct bond_net *bn =
		container_of(attr, struct bond_net, class_attr_bonding_masters);
	return bn->net;
}

160
/* class attribute for bond_masters file.  This ends up in /sys/class/net */
161 162 163 164 165 166 167 168 169
static const struct class_attribute class_attr_bonding_masters = {
	.attr = {
		.name = "bonding_masters",
		.mode = S_IWUSR | S_IRUGO,
	},
	.show = bonding_show_bonds,
	.store = bonding_store_bonds,
	.namespace = bonding_namespace,
};
170 171 172 173

/*
 * Show the slaves in the current bond.
 */
174 175
static ssize_t bonding_show_slaves(struct device *d,
				   struct device_attribute *attr, char *buf)
176
{
177
	struct bonding *bond = to_bond(d);
178
	struct list_head *iter;
179 180
	struct slave *slave;
	int res = 0;
181

182 183 184
	if (!rtnl_trylock())
		return restart_syscall();

185
	bond_for_each_slave(bond, slave, iter) {
186 187 188 189
		if (res > (PAGE_SIZE - IFNAMSIZ)) {
			/* not enough space for another interface name */
			if ((PAGE_SIZE - res) > 10)
				res = PAGE_SIZE - 10;
190
			res += sprintf(buf + res, "++more++ ");
191 192 193 194
			break;
		}
		res += sprintf(buf + res, "%s ", slave->dev->name);
	}
195 196 197

	rtnl_unlock();

198 199
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */
200

201 202 203 204
	return res;
}

/*
205
 * Set the slaves in the current bond.
206 207
 * This is supposed to be only thin wrapper for bond_enslave and bond_release.
 * All hard work should be done there.
208
 */
209 210 211
static ssize_t bonding_store_slaves(struct device *d,
				    struct device_attribute *attr,
				    const char *buffer, size_t count)
212 213 214
{
	char command[IFNAMSIZ + 1] = { 0, };
	char *ifname;
215 216
	int res, ret = count;
	struct net_device *dev;
217
	struct bonding *bond = to_bond(d);
218

219 220
	if (!rtnl_trylock())
		return restart_syscall();
221

222 223 224 225 226 227
	sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
	ifname = command + 1;
	if ((strlen(command) <= 1) ||
	    !dev_valid_name(ifname))
		goto err_no_cmd;

228 229 230 231 232 233 234
	dev = __dev_get_by_name(dev_net(bond->dev), ifname);
	if (!dev) {
		pr_info("%s: Interface %s does not exist!\n",
			bond->dev->name, ifname);
		ret = -ENODEV;
		goto out;
	}
235

236 237 238
	switch (command[0]) {
	case '+':
		pr_info("%s: Adding slave %s.\n", bond->dev->name, dev->name);
239
		res = bond_enslave(bond->dev, dev);
240
		break;
S
Stephen Hemminger 已提交
241

242 243 244 245
	case '-':
		pr_info("%s: Removing slave %s.\n", bond->dev->name, dev->name);
		res = bond_release(bond->dev, dev);
		break;
246

247 248
	default:
		goto err_no_cmd;
249 250
	}

251 252 253 254
	if (res)
		ret = res;
	goto out;

255
err_no_cmd:
J
Joe Perches 已提交
256 257
	pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n",
	       bond->dev->name);
258 259 260
	ret = -EPERM;

out:
261
	rtnl_unlock();
262 263 264
	return ret;
}

S
Stephen Hemminger 已提交
265 266
static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves,
		   bonding_store_slaves);
267 268 269 270 271

/*
 * Show and set the bonding mode.  The bond interface must be down to
 * change the mode.
 */
272 273
static ssize_t bonding_show_mode(struct device *d,
				 struct device_attribute *attr, char *buf)
274
{
275
	struct bonding *bond = to_bond(d);
276 277 278

	return sprintf(buf, "%s %d\n",
			bond_mode_tbl[bond->params.mode].modename,
279
			bond->params.mode);
280 281
}

282 283 284
static ssize_t bonding_store_mode(struct device *d,
				  struct device_attribute *attr,
				  const char *buf, size_t count)
285
{
286
	int new_value, ret;
287
	struct bonding *bond = to_bond(d);
288

J
Jay Vosburgh 已提交
289
	new_value = bond_parse_parm(buf, bond_mode_tbl);
290
	if (new_value < 0)  {
J
Joe Perches 已提交
291 292
		pr_err("%s: Ignoring invalid mode value %.*s.\n",
		       bond->dev->name, (int)strlen(buf) - 1, buf);
293
		return -EINVAL;
294
	}
295 296 297 298 299 300 301 302 303
	if (!rtnl_trylock())
		return restart_syscall();

	ret = bond_option_mode_set(bond, new_value);
	if (!ret) {
		pr_info("%s: setting mode to %s (%d).\n",
			bond->dev->name, bond_mode_tbl[new_value].modename,
			new_value);
		ret = count;
304
	}
305

306
	rtnl_unlock();
307 308
	return ret;
}
S
Stephen Hemminger 已提交
309 310
static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
		   bonding_show_mode, bonding_store_mode);
311 312

/*
S
Stephen Hemminger 已提交
313
 * Show and set the bonding transmit hash method.
314
 */
315 316 317
static ssize_t bonding_show_xmit_hash(struct device *d,
				      struct device_attribute *attr,
				      char *buf)
318
{
319
	struct bonding *bond = to_bond(d);
320

321 322 323
	return sprintf(buf, "%s %d\n",
		       xmit_hashtype_tbl[bond->params.xmit_policy].modename,
		       bond->params.xmit_policy);
324 325
}

326 327 328
static ssize_t bonding_store_xmit_hash(struct device *d,
				       struct device_attribute *attr,
				       const char *buf, size_t count)
329 330
{
	int new_value, ret = count;
331
	struct bonding *bond = to_bond(d);
332

J
Jay Vosburgh 已提交
333
	new_value = bond_parse_parm(buf, xmit_hashtype_tbl);
334
	if (new_value < 0)  {
J
Joe Perches 已提交
335
		pr_err("%s: Ignoring invalid xmit hash policy value %.*s.\n",
336 337 338 339 340
		       bond->dev->name,
		       (int)strlen(buf) - 1, buf);
		ret = -EINVAL;
	} else {
		bond->params.xmit_policy = new_value;
J
Joe Perches 已提交
341
		pr_info("%s: setting xmit hash policy to %s (%d).\n",
S
Stephen Hemminger 已提交
342 343
			bond->dev->name,
			xmit_hashtype_tbl[new_value].modename, new_value);
344
	}
345

346 347
	return ret;
}
S
Stephen Hemminger 已提交
348 349
static DEVICE_ATTR(xmit_hash_policy, S_IRUGO | S_IWUSR,
		   bonding_show_xmit_hash, bonding_store_xmit_hash);
350

351 352 353
/*
 * Show and set arp_validate.
 */
354 355 356
static ssize_t bonding_show_arp_validate(struct device *d,
					 struct device_attribute *attr,
					 char *buf)
357
{
358
	struct bonding *bond = to_bond(d);
359 360 361

	return sprintf(buf, "%s %d\n",
		       arp_validate_tbl[bond->params.arp_validate].modename,
362
		       bond->params.arp_validate);
363 364
}

365 366 367
static ssize_t bonding_store_arp_validate(struct device *d,
					  struct device_attribute *attr,
					  const char *buf, size_t count)
368
{
369
	struct bonding *bond = to_bond(d);
370
	int new_value, ret = count;
371

372 373
	if (!rtnl_trylock())
		return restart_syscall();
J
Jay Vosburgh 已提交
374
	new_value = bond_parse_parm(buf, arp_validate_tbl);
375
	if (new_value < 0) {
J
Joe Perches 已提交
376
		pr_err("%s: Ignoring invalid arp_validate value %s\n",
377
		       bond->dev->name, buf);
378 379
		ret = -EINVAL;
		goto out;
380
	}
381
	if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
J
Joe Perches 已提交
382
		pr_err("%s: arp_validate only supported in active-backup mode.\n",
383
		       bond->dev->name);
384 385
		ret = -EINVAL;
		goto out;
386
	}
J
Joe Perches 已提交
387 388 389
	pr_info("%s: setting arp_validate to %s (%d).\n",
		bond->dev->name, arp_validate_tbl[new_value].modename,
		new_value);
390

391 392 393 394 395 396
	if (bond->dev->flags & IFF_UP) {
		if (!new_value)
			bond->recv_probe = NULL;
		else if (bond->params.arp_interval)
			bond->recv_probe = bond_arp_rcv;
	}
397
	bond->params.arp_validate = new_value;
398 399
out:
	rtnl_unlock();
400

401
	return ret;
402 403
}

S
Stephen Hemminger 已提交
404 405
static DEVICE_ATTR(arp_validate, S_IRUGO | S_IWUSR, bonding_show_arp_validate,
		   bonding_store_arp_validate);
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
/*
 * Show and set arp_all_targets.
 */
static ssize_t bonding_show_arp_all_targets(struct device *d,
					 struct device_attribute *attr,
					 char *buf)
{
	struct bonding *bond = to_bond(d);
	int value = bond->params.arp_all_targets;

	return sprintf(buf, "%s %d\n", arp_all_targets_tbl[value].modename,
		       value);
}

static ssize_t bonding_store_arp_all_targets(struct device *d,
					  struct device_attribute *attr,
					  const char *buf, size_t count)
{
	struct bonding *bond = to_bond(d);
	int new_value;

	new_value = bond_parse_parm(buf, arp_all_targets_tbl);
	if (new_value < 0) {
		pr_err("%s: Ignoring invalid arp_all_targets value %s\n",
		       bond->dev->name, buf);
		return -EINVAL;
	}
	pr_info("%s: setting arp_all_targets to %s (%d).\n",
		bond->dev->name, arp_all_targets_tbl[new_value].modename,
		new_value);

	bond->params.arp_all_targets = new_value;

	return count;
}

static DEVICE_ATTR(arp_all_targets, S_IRUGO | S_IWUSR,
		   bonding_show_arp_all_targets, bonding_store_arp_all_targets);
444

445 446 447 448
/*
 * Show and store fail_over_mac.  User only allowed to change the
 * value when there are no slaves.
 */
S
Stephen Hemminger 已提交
449 450 451
static ssize_t bonding_show_fail_over_mac(struct device *d,
					  struct device_attribute *attr,
					  char *buf)
452 453 454
{
	struct bonding *bond = to_bond(d);

455 456 457
	return sprintf(buf, "%s %d\n",
		       fail_over_mac_tbl[bond->params.fail_over_mac].modename,
		       bond->params.fail_over_mac);
458 459
}

S
Stephen Hemminger 已提交
460 461 462
static ssize_t bonding_store_fail_over_mac(struct device *d,
					   struct device_attribute *attr,
					   const char *buf, size_t count)
463
{
464
	int new_value, ret = count;
465 466
	struct bonding *bond = to_bond(d);

467 468 469
	if (!rtnl_trylock())
		return restart_syscall();

470
	if (bond_has_slaves(bond)) {
J
Joe Perches 已提交
471
		pr_err("%s: Can't alter fail_over_mac with slaves in bond.\n",
472
		       bond->dev->name);
473 474
		ret = -EPERM;
		goto out;
475 476
	}

477 478
	new_value = bond_parse_parm(buf, fail_over_mac_tbl);
	if (new_value < 0) {
J
Joe Perches 已提交
479
		pr_err("%s: Ignoring invalid fail_over_mac value %s.\n",
480
		       bond->dev->name, buf);
481 482
		ret = -EINVAL;
		goto out;
483 484
	}

485
	bond->params.fail_over_mac = new_value;
J
Joe Perches 已提交
486 487 488
	pr_info("%s: Setting fail_over_mac to %s (%d).\n",
		bond->dev->name, fail_over_mac_tbl[new_value].modename,
		new_value);
489

490 491 492
out:
	rtnl_unlock();
	return ret;
493 494
}

S
Stephen Hemminger 已提交
495 496
static DEVICE_ATTR(fail_over_mac, S_IRUGO | S_IWUSR,
		   bonding_show_fail_over_mac, bonding_store_fail_over_mac);
497

498 499 500 501 502 503
/*
 * Show and set the arp timer interval.  There are two tricky bits
 * here.  First, if ARP monitoring is activated, then we must disable
 * MII monitoring.  Second, if the ARP timer isn't running, we must
 * start it.
 */
504 505 506
static ssize_t bonding_show_arp_interval(struct device *d,
					 struct device_attribute *attr,
					 char *buf)
507
{
508
	struct bonding *bond = to_bond(d);
509

510
	return sprintf(buf, "%d\n", bond->params.arp_interval);
511 512
}

513 514 515
static ssize_t bonding_store_arp_interval(struct device *d,
					  struct device_attribute *attr,
					  const char *buf, size_t count)
516
{
517
	struct bonding *bond = to_bond(d);
518
	int new_value, ret = count;
519

520 521
	if (!rtnl_trylock())
		return restart_syscall();
522
	if (sscanf(buf, "%d", &new_value) != 1) {
J
Joe Perches 已提交
523
		pr_err("%s: no arp_interval value specified.\n",
524 525 526 527 528
		       bond->dev->name);
		ret = -EINVAL;
		goto out;
	}
	if (new_value < 0) {
529
		pr_err("%s: Invalid arp_interval value %d not in range 0-%d; rejected.\n",
530 531 532 533
		       bond->dev->name, new_value, INT_MAX);
		ret = -EINVAL;
		goto out;
	}
534 535 536 537 538 539 540
	if (bond->params.mode == BOND_MODE_ALB ||
	    bond->params.mode == BOND_MODE_TLB) {
		pr_info("%s: ARP monitoring cannot be used with ALB/TLB. Only MII monitoring is supported on %s.\n",
			bond->dev->name, bond->dev->name);
		ret = -EINVAL;
		goto out;
	}
J
Joe Perches 已提交
541 542
	pr_info("%s: Setting ARP monitoring interval to %d.\n",
		bond->dev->name, new_value);
543
	bond->params.arp_interval = new_value;
544 545 546 547 548 549 550 551 552
	if (new_value) {
		if (bond->params.miimon) {
			pr_info("%s: ARP monitoring cannot be used with MII monitoring. %s Disabling MII monitoring.\n",
				bond->dev->name, bond->dev->name);
			bond->params.miimon = 0;
		}
		if (!bond->params.arp_targets[0])
			pr_info("%s: ARP monitoring has been set up, but no ARP targets have been specified.\n",
				bond->dev->name);
553 554 555 556 557 558 559
	}
	if (bond->dev->flags & IFF_UP) {
		/* If the interface is up, we may need to fire off
		 * the ARP timer.  If the interface is down, the
		 * timer will get fired off when the open function
		 * is called.
		 */
560
		if (!new_value) {
561 562
			if (bond->params.arp_validate)
				bond->recv_probe = NULL;
563 564
			cancel_delayed_work_sync(&bond->arp_work);
		} else {
565 566 567
			/* arp_validate can be set only in active-backup mode */
			if (bond->params.arp_validate)
				bond->recv_probe = bond_arp_rcv;
568 569 570
			cancel_delayed_work_sync(&bond->mii_work);
			queue_delayed_work(bond->wq, &bond->arp_work, 0);
		}
571 572
	}
out:
573
	rtnl_unlock();
574 575
	return ret;
}
S
Stephen Hemminger 已提交
576 577
static DEVICE_ATTR(arp_interval, S_IRUGO | S_IWUSR,
		   bonding_show_arp_interval, bonding_store_arp_interval);
578 579 580 581

/*
 * Show and set the arp targets.
 */
582 583 584
static ssize_t bonding_show_arp_targets(struct device *d,
					struct device_attribute *attr,
					char *buf)
585 586
{
	int i, res = 0;
587
	struct bonding *bond = to_bond(d);
588 589 590

	for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
		if (bond->params.arp_targets[i])
H
Harvey Harrison 已提交
591 592
			res += sprintf(buf + res, "%pI4 ",
				       &bond->params.arp_targets[i]);
593
	}
594 595
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */
596 597 598
	return res;
}

599 600 601
static ssize_t bonding_store_arp_targets(struct device *d,
					 struct device_attribute *attr,
					 const char *buf, size_t count)
602
{
603
	struct bonding *bond = to_bond(d);
604
	struct list_head *iter;
605 606 607 608
	struct slave *slave;
	__be32 newtarget, *targets;
	unsigned long *targets_rx;
	int ind, i, j, ret = -EINVAL;
609

610 611 612
	if (!rtnl_trylock())
		return restart_syscall();

613 614 615 616
	targets = bond->params.arp_targets;
	newtarget = in_aton(buf + 1);
	/* look for adds */
	if (buf[0] == '+') {
617
		if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
J
Joe Perches 已提交
618
			pr_err("%s: invalid ARP target %pI4 specified for addition\n",
H
Harvey Harrison 已提交
619
			       bond->dev->name, &newtarget);
620 621
			goto out;
		}
622 623 624 625 626

		if (bond_get_targets_ip(targets, newtarget) != -1) { /* dup */
			pr_err("%s: ARP target %pI4 is already present\n",
			       bond->dev->name, &newtarget);
			goto out;
627
		}
628

629 630
		ind = bond_get_targets_ip(targets, 0); /* first free slot */
		if (ind == -1) {
J
Joe Perches 已提交
631
			pr_err("%s: ARP target table is full!\n",
632 633 634 635
			       bond->dev->name);
			goto out;
		}

636 637
		pr_info("%s: adding ARP target %pI4.\n", bond->dev->name,
			 &newtarget);
638 639
		/* not to race with bond_arp_rcv */
		write_lock_bh(&bond->lock);
640
		bond_for_each_slave(bond, slave, iter)
641 642 643
			slave->target_last_arp_rx[ind] = jiffies;
		targets[ind] = newtarget;
		write_unlock_bh(&bond->lock);
S
Stephen Hemminger 已提交
644
	} else if (buf[0] == '-')	{
645
		if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
J
Joe Perches 已提交
646
			pr_err("%s: invalid ARP target %pI4 specified for removal\n",
H
Harvey Harrison 已提交
647
			       bond->dev->name, &newtarget);
648 649 650
			goto out;
		}

651 652 653
		ind = bond_get_targets_ip(targets, newtarget);
		if (ind == -1) {
			pr_err("%s: unable to remove nonexistent ARP target %pI4.\n",
J
Joe Perches 已提交
654
				bond->dev->name, &newtarget);
655 656
			goto out;
		}
657

658 659 660 661
		if (ind == 0 && !targets[1] && bond->params.arp_interval)
			pr_warn("%s: removing last arp target with arp_interval on\n",
				bond->dev->name);

662 663
		pr_info("%s: removing ARP target %pI4.\n", bond->dev->name,
			&newtarget);
664 665

		write_lock_bh(&bond->lock);
666
		bond_for_each_slave(bond, slave, iter) {
667 668 669 670 671 672 673
			targets_rx = slave->target_last_arp_rx;
			j = ind;
			for (; (j < BOND_MAX_ARP_TARGETS-1) && targets[j+1]; j++)
				targets_rx[j] = targets_rx[j+1];
			targets_rx[j] = 0;
		}
		for (i = ind; (i < BOND_MAX_ARP_TARGETS-1) && targets[i+1]; i++)
674 675
			targets[i] = targets[i+1];
		targets[i] = 0;
676
		write_unlock_bh(&bond->lock);
S
Stephen Hemminger 已提交
677
	} else {
J
Joe Perches 已提交
678 679
		pr_err("no command found in arp_ip_targets file for bond %s. Use +<addr> or -<addr>.\n",
		       bond->dev->name);
680 681 682 683
		ret = -EPERM;
		goto out;
	}

684
	ret = count;
685
out:
686
	rtnl_unlock();
687 688
	return ret;
}
689
static DEVICE_ATTR(arp_ip_target, S_IRUGO | S_IWUSR , bonding_show_arp_targets, bonding_store_arp_targets);
690 691 692 693 694 695

/*
 * Show and set the up and down delays.  These must be multiples of the
 * MII monitoring value, and are stored internally as the multiplier.
 * Thus, we must translate to MS for the real world.
 */
696 697 698
static ssize_t bonding_show_downdelay(struct device *d,
				      struct device_attribute *attr,
				      char *buf)
699
{
700
	struct bonding *bond = to_bond(d);
701

702
	return sprintf(buf, "%d\n", bond->params.downdelay * bond->params.miimon);
703 704
}

705 706 707
static ssize_t bonding_store_downdelay(struct device *d,
				       struct device_attribute *attr,
				       const char *buf, size_t count)
708 709
{
	int new_value, ret = count;
710
	struct bonding *bond = to_bond(d);
711 712

	if (!(bond->params.miimon)) {
J
Joe Perches 已提交
713
		pr_err("%s: Unable to set down delay as MII monitoring is disabled\n",
714 715 716 717 718 719
		       bond->dev->name);
		ret = -EPERM;
		goto out;
	}

	if (sscanf(buf, "%d", &new_value) != 1) {
J
Joe Perches 已提交
720
		pr_err("%s: no down delay value specified.\n", bond->dev->name);
721 722 723 724
		ret = -EINVAL;
		goto out;
	}
	if (new_value < 0) {
J
Joe Perches 已提交
725
		pr_err("%s: Invalid down delay value %d not in range %d-%d; rejected.\n",
726
		       bond->dev->name, new_value, 0, INT_MAX);
727 728 729 730
		ret = -EINVAL;
		goto out;
	} else {
		if ((new_value % bond->params.miimon) != 0) {
J
Joe Perches 已提交
731
			pr_warning("%s: Warning: down delay (%d) is not a multiple of miimon (%d), delay rounded to %d ms\n",
J
Jiri Pirko 已提交
732 733 734 735
				   bond->dev->name, new_value,
				   bond->params.miimon,
				   (new_value / bond->params.miimon) *
				   bond->params.miimon);
736 737
		}
		bond->params.downdelay = new_value / bond->params.miimon;
J
Joe Perches 已提交
738 739 740
		pr_info("%s: Setting down delay to %d.\n",
			bond->dev->name,
			bond->params.downdelay * bond->params.miimon);
741 742 743 744 745 746

	}

out:
	return ret;
}
S
Stephen Hemminger 已提交
747 748
static DEVICE_ATTR(downdelay, S_IRUGO | S_IWUSR,
		   bonding_show_downdelay, bonding_store_downdelay);
749

750 751 752
static ssize_t bonding_show_updelay(struct device *d,
				    struct device_attribute *attr,
				    char *buf)
753
{
754
	struct bonding *bond = to_bond(d);
755

756
	return sprintf(buf, "%d\n", bond->params.updelay * bond->params.miimon);
757 758 759

}

760 761 762
static ssize_t bonding_store_updelay(struct device *d,
				     struct device_attribute *attr,
				     const char *buf, size_t count)
763 764
{
	int new_value, ret = count;
765
	struct bonding *bond = to_bond(d);
766 767

	if (!(bond->params.miimon)) {
J
Joe Perches 已提交
768
		pr_err("%s: Unable to set up delay as MII monitoring is disabled\n",
769 770 771 772 773 774
		       bond->dev->name);
		ret = -EPERM;
		goto out;
	}

	if (sscanf(buf, "%d", &new_value) != 1) {
J
Joe Perches 已提交
775
		pr_err("%s: no up delay value specified.\n",
776 777 778 779 780
		       bond->dev->name);
		ret = -EINVAL;
		goto out;
	}
	if (new_value < 0) {
781 782
		pr_err("%s: Invalid up delay value %d not in range %d-%d; rejected.\n",
		       bond->dev->name, new_value, 0, INT_MAX);
783 784 785 786
		ret = -EINVAL;
		goto out;
	} else {
		if ((new_value % bond->params.miimon) != 0) {
J
Joe Perches 已提交
787
			pr_warning("%s: Warning: up delay (%d) is not a multiple of miimon (%d), updelay rounded to %d ms\n",
J
Jiri Pirko 已提交
788 789 790 791
				   bond->dev->name, new_value,
				   bond->params.miimon,
				   (new_value / bond->params.miimon) *
				   bond->params.miimon);
792 793
		}
		bond->params.updelay = new_value / bond->params.miimon;
J
Joe Perches 已提交
794 795 796
		pr_info("%s: Setting up delay to %d.\n",
			bond->dev->name,
			bond->params.updelay * bond->params.miimon);
797 798 799 800 801
	}

out:
	return ret;
}
S
Stephen Hemminger 已提交
802 803
static DEVICE_ATTR(updelay, S_IRUGO | S_IWUSR,
		   bonding_show_updelay, bonding_store_updelay);
804 805 806 807 808

/*
 * Show and set the LACP interval.  Interface must be down, and the mode
 * must be set to 802.3ad mode.
 */
809 810 811
static ssize_t bonding_show_lacp(struct device *d,
				 struct device_attribute *attr,
				 char *buf)
812
{
813
	struct bonding *bond = to_bond(d);
814 815 816

	return sprintf(buf, "%s %d\n",
		bond_lacp_tbl[bond->params.lacp_fast].modename,
817
		bond->params.lacp_fast);
818 819
}

820 821 822
static ssize_t bonding_store_lacp(struct device *d,
				  struct device_attribute *attr,
				  const char *buf, size_t count)
823
{
824
	struct bonding *bond = to_bond(d);
825 826 827 828
	int new_value, ret = count;

	if (!rtnl_trylock())
		return restart_syscall();
829 830

	if (bond->dev->flags & IFF_UP) {
J
Joe Perches 已提交
831
		pr_err("%s: Unable to update LACP rate because interface is up.\n",
832 833 834 835 836 837
		       bond->dev->name);
		ret = -EPERM;
		goto out;
	}

	if (bond->params.mode != BOND_MODE_8023AD) {
J
Joe Perches 已提交
838
		pr_err("%s: Unable to update LACP rate because bond is not in 802.3ad mode.\n",
839 840 841 842 843
		       bond->dev->name);
		ret = -EPERM;
		goto out;
	}

J
Jay Vosburgh 已提交
844
	new_value = bond_parse_parm(buf, bond_lacp_tbl);
845 846 847

	if ((new_value == 1) || (new_value == 0)) {
		bond->params.lacp_fast = new_value;
848
		bond_3ad_update_lacp_rate(bond);
J
Joe Perches 已提交
849
		pr_info("%s: Setting LACP rate to %s (%d).\n",
S
Stephen Hemminger 已提交
850 851
			bond->dev->name, bond_lacp_tbl[new_value].modename,
			new_value);
852
	} else {
J
Joe Perches 已提交
853
		pr_err("%s: Ignoring invalid LACP rate value %.*s.\n",
S
Stephen Hemminger 已提交
854
		       bond->dev->name, (int)strlen(buf) - 1, buf);
855 856 857
		ret = -EINVAL;
	}
out:
858 859
	rtnl_unlock();

860 861
	return ret;
}
S
Stephen Hemminger 已提交
862 863
static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR,
		   bonding_show_lacp, bonding_store_lacp);
864

865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896
static ssize_t bonding_show_min_links(struct device *d,
				      struct device_attribute *attr,
				      char *buf)
{
	struct bonding *bond = to_bond(d);

	return sprintf(buf, "%d\n", bond->params.min_links);
}

static ssize_t bonding_store_min_links(struct device *d,
				       struct device_attribute *attr,
				       const char *buf, size_t count)
{
	struct bonding *bond = to_bond(d);
	int ret;
	unsigned int new_value;

	ret = kstrtouint(buf, 0, &new_value);
	if (ret < 0) {
		pr_err("%s: Ignoring invalid min links value %s.\n",
		       bond->dev->name, buf);
		return ret;
	}

	pr_info("%s: Setting min links value to %u\n",
		bond->dev->name, new_value);
	bond->params.min_links = new_value;
	return count;
}
static DEVICE_ATTR(min_links, S_IRUGO | S_IWUSR,
		   bonding_show_min_links, bonding_store_min_links);

897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916
static ssize_t bonding_show_ad_select(struct device *d,
				      struct device_attribute *attr,
				      char *buf)
{
	struct bonding *bond = to_bond(d);

	return sprintf(buf, "%s %d\n",
		ad_select_tbl[bond->params.ad_select].modename,
		bond->params.ad_select);
}


static ssize_t bonding_store_ad_select(struct device *d,
				       struct device_attribute *attr,
				       const char *buf, size_t count)
{
	int new_value, ret = count;
	struct bonding *bond = to_bond(d);

	if (bond->dev->flags & IFF_UP) {
J
Joe Perches 已提交
917 918
		pr_err("%s: Unable to update ad_select because interface is up.\n",
		       bond->dev->name);
919 920 921 922 923 924 925 926
		ret = -EPERM;
		goto out;
	}

	new_value = bond_parse_parm(buf, ad_select_tbl);

	if (new_value != -1) {
		bond->params.ad_select = new_value;
J
Joe Perches 已提交
927 928 929
		pr_info("%s: Setting ad_select to %s (%d).\n",
			bond->dev->name, ad_select_tbl[new_value].modename,
			new_value);
930
	} else {
J
Joe Perches 已提交
931
		pr_err("%s: Ignoring invalid ad_select value %.*s.\n",
932 933 934 935 936 937
		       bond->dev->name, (int)strlen(buf) - 1, buf);
		ret = -EINVAL;
	}
out:
	return ret;
}
S
Stephen Hemminger 已提交
938 939
static DEVICE_ATTR(ad_select, S_IRUGO | S_IWUSR,
		   bonding_show_ad_select, bonding_store_ad_select);
940

941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964
/*
 * Show and set the number of peer notifications to send after a failover event.
 */
static ssize_t bonding_show_num_peer_notif(struct device *d,
					   struct device_attribute *attr,
					   char *buf)
{
	struct bonding *bond = to_bond(d);
	return sprintf(buf, "%d\n", bond->params.num_peer_notif);
}

static ssize_t bonding_store_num_peer_notif(struct device *d,
					    struct device_attribute *attr,
					    const char *buf, size_t count)
{
	struct bonding *bond = to_bond(d);
	int err = kstrtou8(buf, 10, &bond->params.num_peer_notif);
	return err ? err : count;
}
static DEVICE_ATTR(num_grat_arp, S_IRUGO | S_IWUSR,
		   bonding_show_num_peer_notif, bonding_store_num_peer_notif);
static DEVICE_ATTR(num_unsol_na, S_IRUGO | S_IWUSR,
		   bonding_show_num_peer_notif, bonding_store_num_peer_notif);

965 966 967 968 969 970
/*
 * Show and set the MII monitor interval.  There are two tricky bits
 * here.  First, if MII monitoring is activated, then we must disable
 * ARP monitoring.  Second, if the timer isn't running, we must
 * start it.
 */
971 972 973
static ssize_t bonding_show_miimon(struct device *d,
				   struct device_attribute *attr,
				   char *buf)
974
{
975
	struct bonding *bond = to_bond(d);
976

977
	return sprintf(buf, "%d\n", bond->params.miimon);
978 979
}

980 981 982
static ssize_t bonding_store_miimon(struct device *d,
				    struct device_attribute *attr,
				    const char *buf, size_t count)
983 984
{
	int new_value, ret = count;
985
	struct bonding *bond = to_bond(d);
986

987 988
	if (!rtnl_trylock())
		return restart_syscall();
989
	if (sscanf(buf, "%d", &new_value) != 1) {
J
Joe Perches 已提交
990
		pr_err("%s: no miimon value specified.\n",
991 992 993 994 995
		       bond->dev->name);
		ret = -EINVAL;
		goto out;
	}
	if (new_value < 0) {
J
Joe Perches 已提交
996
		pr_err("%s: Invalid miimon value %d not in range %d-%d; rejected.\n",
997
		       bond->dev->name, new_value, 0, INT_MAX);
998 999
		ret = -EINVAL;
		goto out;
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
	}
	pr_info("%s: Setting MII monitoring interval to %d.\n",
		bond->dev->name, new_value);
	bond->params.miimon = new_value;
	if (bond->params.updelay)
		pr_info("%s: Note: Updating updelay (to %d) since it is a multiple of the miimon value.\n",
			bond->dev->name,
			bond->params.updelay * bond->params.miimon);
	if (bond->params.downdelay)
		pr_info("%s: Note: Updating downdelay (to %d) since it is a multiple of the miimon value.\n",
			bond->dev->name,
			bond->params.downdelay * bond->params.miimon);
	if (new_value && bond->params.arp_interval) {
		pr_info("%s: MII monitoring cannot be used with ARP monitoring. Disabling ARP monitoring...\n",
			bond->dev->name);
		bond->params.arp_interval = 0;
		if (bond->params.arp_validate)
			bond->params.arp_validate = BOND_ARP_VALIDATE_NONE;
	}
	if (bond->dev->flags & IFF_UP) {
		/* If the interface is up, we may need to fire off
		 * the MII timer. If the interface is down, the
		 * timer will get fired off when the open function
		 * is called.
		 */
		if (!new_value) {
			cancel_delayed_work_sync(&bond->mii_work);
		} else {
1028 1029
			cancel_delayed_work_sync(&bond->arp_work);
			queue_delayed_work(bond->wq, &bond->mii_work, 0);
1030 1031 1032
		}
	}
out:
1033
	rtnl_unlock();
1034 1035
	return ret;
}
S
Stephen Hemminger 已提交
1036 1037
static DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR,
		   bonding_show_miimon, bonding_store_miimon);
1038 1039 1040 1041 1042 1043 1044 1045

/*
 * Show and set the primary slave.  The store function is much
 * simpler than bonding_store_slaves function because it only needs to
 * handle one interface name.
 * The bond must be a mode that supports a primary for this be
 * set.
 */
1046 1047 1048
static ssize_t bonding_show_primary(struct device *d,
				    struct device_attribute *attr,
				    char *buf)
1049 1050
{
	int count = 0;
1051
	struct bonding *bond = to_bond(d);
1052 1053

	if (bond->primary_slave)
1054
		count = sprintf(buf, "%s\n", bond->primary_slave->dev->name);
1055 1056 1057 1058

	return count;
}

1059 1060 1061
static ssize_t bonding_store_primary(struct device *d,
				     struct device_attribute *attr,
				     const char *buf, size_t count)
1062
{
1063
	struct bonding *bond = to_bond(d);
1064
	struct list_head *iter;
1065
	char ifname[IFNAMSIZ];
1066
	struct slave *slave;
1067

1068 1069
	if (!rtnl_trylock())
		return restart_syscall();
1070
	block_netpoll_tx();
1071 1072 1073
	read_lock(&bond->lock);
	write_lock_bh(&bond->curr_slave_lock);

1074
	if (!USES_PRIMARY(bond->params.mode)) {
J
Joe Perches 已提交
1075 1076
		pr_info("%s: Unable to set primary slave; %s is in mode %d\n",
			bond->dev->name, bond->dev->name, bond->params.mode);
1077 1078
		goto out;
	}
1079

N
nikolay@redhat.com 已提交
1080
	sscanf(buf, "%15s", ifname); /* IFNAMSIZ */
1081

1082 1083 1084 1085 1086
	/* check to see if we are clearing primary */
	if (!strlen(ifname) || buf[0] == '\n') {
		pr_info("%s: Setting primary slave to None.\n",
			bond->dev->name);
		bond->primary_slave = NULL;
1087
		memset(bond->params.primary, 0, sizeof(bond->params.primary));
1088 1089 1090 1091
		bond_select_active_slave(bond);
		goto out;
	}

1092
	bond_for_each_slave(bond, slave, iter) {
1093 1094 1095 1096 1097 1098 1099
		if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
			pr_info("%s: Setting %s as primary slave.\n",
				bond->dev->name, slave->dev->name);
			bond->primary_slave = slave;
			strcpy(bond->params.primary, slave->dev->name);
			bond_select_active_slave(bond);
			goto out;
1100 1101
		}
	}
1102

1103 1104 1105 1106 1107 1108
	strncpy(bond->params.primary, ifname, IFNAMSIZ);
	bond->params.primary[IFNAMSIZ - 1] = 0;

	pr_info("%s: Recording %s as primary, "
		"but it has not been enslaved to %s yet.\n",
		bond->dev->name, ifname, bond->dev->name);
1109
out:
1110 1111
	write_unlock_bh(&bond->curr_slave_lock);
	read_unlock(&bond->lock);
1112
	unblock_netpoll_tx();
1113 1114
	rtnl_unlock();

1115 1116
	return count;
}
S
Stephen Hemminger 已提交
1117 1118
static DEVICE_ATTR(primary, S_IRUGO | S_IWUSR,
		   bonding_show_primary, bonding_store_primary);
1119

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
/*
 * Show and set the primary_reselect flag.
 */
static ssize_t bonding_show_primary_reselect(struct device *d,
					     struct device_attribute *attr,
					     char *buf)
{
	struct bonding *bond = to_bond(d);

	return sprintf(buf, "%s %d\n",
		       pri_reselect_tbl[bond->params.primary_reselect].modename,
		       bond->params.primary_reselect);
}

static ssize_t bonding_store_primary_reselect(struct device *d,
					      struct device_attribute *attr,
					      const char *buf, size_t count)
{
	int new_value, ret = count;
	struct bonding *bond = to_bond(d);

	if (!rtnl_trylock())
		return restart_syscall();

	new_value = bond_parse_parm(buf, pri_reselect_tbl);
	if (new_value < 0)  {
J
Joe Perches 已提交
1146
		pr_err("%s: Ignoring invalid primary_reselect value %.*s.\n",
1147 1148 1149 1150 1151 1152 1153
		       bond->dev->name,
		       (int) strlen(buf) - 1, buf);
		ret = -EINVAL;
		goto out;
	}

	bond->params.primary_reselect = new_value;
J
Joe Perches 已提交
1154
	pr_info("%s: setting primary_reselect to %s (%d).\n",
1155 1156 1157
		bond->dev->name, pri_reselect_tbl[new_value].modename,
		new_value);

1158
	block_netpoll_tx();
1159 1160 1161 1162 1163
	read_lock(&bond->lock);
	write_lock_bh(&bond->curr_slave_lock);
	bond_select_active_slave(bond);
	write_unlock_bh(&bond->curr_slave_lock);
	read_unlock(&bond->lock);
1164
	unblock_netpoll_tx();
1165 1166 1167 1168 1169 1170 1171 1172
out:
	rtnl_unlock();
	return ret;
}
static DEVICE_ATTR(primary_reselect, S_IRUGO | S_IWUSR,
		   bonding_show_primary_reselect,
		   bonding_store_primary_reselect);

1173 1174 1175
/*
 * Show and set the use_carrier flag.
 */
1176 1177 1178
static ssize_t bonding_show_carrier(struct device *d,
				    struct device_attribute *attr,
				    char *buf)
1179
{
1180
	struct bonding *bond = to_bond(d);
1181

1182
	return sprintf(buf, "%d\n", bond->params.use_carrier);
1183 1184
}

1185 1186 1187
static ssize_t bonding_store_carrier(struct device *d,
				     struct device_attribute *attr,
				     const char *buf, size_t count)
1188 1189
{
	int new_value, ret = count;
1190
	struct bonding *bond = to_bond(d);
1191 1192 1193


	if (sscanf(buf, "%d", &new_value) != 1) {
J
Joe Perches 已提交
1194
		pr_err("%s: no use_carrier value specified.\n",
1195 1196 1197 1198 1199 1200
		       bond->dev->name);
		ret = -EINVAL;
		goto out;
	}
	if ((new_value == 0) || (new_value == 1)) {
		bond->params.use_carrier = new_value;
J
Joe Perches 已提交
1201 1202
		pr_info("%s: Setting use_carrier to %d.\n",
			bond->dev->name, new_value);
1203
	} else {
J
Joe Perches 已提交
1204 1205
		pr_info("%s: Ignoring invalid use_carrier value %d.\n",
			bond->dev->name, new_value);
1206 1207
	}
out:
1208
	return ret;
1209
}
S
Stephen Hemminger 已提交
1210 1211
static DEVICE_ATTR(use_carrier, S_IRUGO | S_IWUSR,
		   bonding_show_carrier, bonding_store_carrier);
1212 1213 1214 1215 1216


/*
 * Show and set currently active_slave.
 */
1217 1218 1219
static ssize_t bonding_show_active_slave(struct device *d,
					 struct device_attribute *attr,
					 char *buf)
1220
{
1221
	struct bonding *bond = to_bond(d);
1222
	struct slave *curr;
1223
	int count = 0;
1224

1225 1226
	rcu_read_lock();
	curr = rcu_dereference(bond->curr_active_slave);
1227
	if (USES_PRIMARY(bond->params.mode) && curr)
1228
		count = sprintf(buf, "%s\n", curr->dev->name);
1229 1230
	rcu_read_unlock();

1231 1232 1233
	return count;
}

1234 1235 1236
static ssize_t bonding_store_active_slave(struct device *d,
					  struct device_attribute *attr,
					  const char *buf, size_t count)
1237
{
1238
	int ret;
1239
	struct bonding *bond = to_bond(d);
1240
	char ifname[IFNAMSIZ];
1241
	struct net_device *dev;
1242

1243 1244
	if (!rtnl_trylock())
		return restart_syscall();
1245

1246
	sscanf(buf, "%15s", ifname); /* IFNAMSIZ */
1247
	if (!strlen(ifname) || buf[0] == '\n') {
1248 1249 1250 1251 1252 1253
		dev = NULL;
	} else {
		dev = __dev_get_by_name(dev_net(bond->dev), ifname);
		if (!dev) {
			ret = -ENODEV;
			goto out;
1254 1255
		}
	}
1256

1257 1258 1259
	ret = bond_option_active_slave_set(bond, dev);
	if (!ret)
		ret = count;
1260

1261
 out:
1262 1263
	rtnl_unlock();

1264
	return ret;
1265 1266

}
S
Stephen Hemminger 已提交
1267 1268
static DEVICE_ATTR(active_slave, S_IRUGO | S_IWUSR,
		   bonding_show_active_slave, bonding_store_active_slave);
1269 1270 1271 1272 1273


/*
 * Show link status of the bond interface.
 */
1274 1275 1276
static ssize_t bonding_show_mii_status(struct device *d,
				       struct device_attribute *attr,
				       char *buf)
1277
{
1278
	struct bonding *bond = to_bond(d);
1279

1280
	return sprintf(buf, "%s\n", bond->curr_active_slave ? "up" : "down");
1281
}
1282
static DEVICE_ATTR(mii_status, S_IRUGO, bonding_show_mii_status, NULL);
1283 1284 1285 1286

/*
 * Show current 802.3ad aggregator ID.
 */
1287 1288 1289
static ssize_t bonding_show_ad_aggregator(struct device *d,
					  struct device_attribute *attr,
					  char *buf)
1290 1291
{
	int count = 0;
1292
	struct bonding *bond = to_bond(d);
1293 1294 1295

	if (bond->params.mode == BOND_MODE_8023AD) {
		struct ad_info ad_info;
S
Stephen Hemminger 已提交
1296
		count = sprintf(buf, "%d\n",
1297
				bond_3ad_get_active_agg_info(bond, &ad_info)
S
Stephen Hemminger 已提交
1298
				?  0 : ad_info.aggregator_id);
1299 1300 1301 1302
	}

	return count;
}
1303
static DEVICE_ATTR(ad_aggregator, S_IRUGO, bonding_show_ad_aggregator, NULL);
1304 1305 1306 1307 1308


/*
 * Show number of active 802.3ad ports.
 */
1309 1310 1311
static ssize_t bonding_show_ad_num_ports(struct device *d,
					 struct device_attribute *attr,
					 char *buf)
1312 1313
{
	int count = 0;
1314
	struct bonding *bond = to_bond(d);
1315 1316 1317

	if (bond->params.mode == BOND_MODE_8023AD) {
		struct ad_info ad_info;
S
Stephen Hemminger 已提交
1318
		count = sprintf(buf, "%d\n",
1319
				bond_3ad_get_active_agg_info(bond, &ad_info)
S
Stephen Hemminger 已提交
1320
				?  0 : ad_info.ports);
1321 1322 1323 1324
	}

	return count;
}
1325
static DEVICE_ATTR(ad_num_ports, S_IRUGO, bonding_show_ad_num_ports, NULL);
1326 1327 1328 1329 1330


/*
 * Show current 802.3ad actor key.
 */
1331 1332 1333
static ssize_t bonding_show_ad_actor_key(struct device *d,
					 struct device_attribute *attr,
					 char *buf)
1334 1335
{
	int count = 0;
1336
	struct bonding *bond = to_bond(d);
1337 1338 1339

	if (bond->params.mode == BOND_MODE_8023AD) {
		struct ad_info ad_info;
S
Stephen Hemminger 已提交
1340
		count = sprintf(buf, "%d\n",
1341
				bond_3ad_get_active_agg_info(bond, &ad_info)
S
Stephen Hemminger 已提交
1342
				?  0 : ad_info.actor_key);
1343 1344 1345 1346
	}

	return count;
}
1347
static DEVICE_ATTR(ad_actor_key, S_IRUGO, bonding_show_ad_actor_key, NULL);
1348 1349 1350 1351 1352


/*
 * Show current 802.3ad partner key.
 */
1353 1354 1355
static ssize_t bonding_show_ad_partner_key(struct device *d,
					   struct device_attribute *attr,
					   char *buf)
1356 1357
{
	int count = 0;
1358
	struct bonding *bond = to_bond(d);
1359 1360 1361

	if (bond->params.mode == BOND_MODE_8023AD) {
		struct ad_info ad_info;
S
Stephen Hemminger 已提交
1362
		count = sprintf(buf, "%d\n",
1363
				bond_3ad_get_active_agg_info(bond, &ad_info)
S
Stephen Hemminger 已提交
1364
				?  0 : ad_info.partner_key);
1365 1366 1367 1368
	}

	return count;
}
1369
static DEVICE_ATTR(ad_partner_key, S_IRUGO, bonding_show_ad_partner_key, NULL);
1370 1371 1372 1373 1374


/*
 * Show current 802.3ad partner mac.
 */
1375 1376 1377
static ssize_t bonding_show_ad_partner_mac(struct device *d,
					   struct device_attribute *attr,
					   char *buf)
1378 1379
{
	int count = 0;
1380
	struct bonding *bond = to_bond(d);
1381 1382 1383

	if (bond->params.mode == BOND_MODE_8023AD) {
		struct ad_info ad_info;
S
Stephen Hemminger 已提交
1384
		if (!bond_3ad_get_active_agg_info(bond, &ad_info))
J
Johannes Berg 已提交
1385
			count = sprintf(buf, "%pM\n", ad_info.partner_system);
1386 1387 1388 1389
	}

	return count;
}
1390
static DEVICE_ATTR(ad_partner_mac, S_IRUGO, bonding_show_ad_partner_mac, NULL);
1391

1392 1393 1394 1395 1396 1397 1398 1399
/*
 * Show the queue_ids of the slaves in the current bond.
 */
static ssize_t bonding_show_queue_id(struct device *d,
				     struct device_attribute *attr,
				     char *buf)
{
	struct bonding *bond = to_bond(d);
1400
	struct list_head *iter;
1401 1402
	struct slave *slave;
	int res = 0;
1403 1404 1405 1406

	if (!rtnl_trylock())
		return restart_syscall();

1407
	bond_for_each_slave(bond, slave, iter) {
1408 1409
		if (res > (PAGE_SIZE - IFNAMSIZ - 6)) {
			/* not enough space for another interface_name:queue_id pair */
1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
			if ((PAGE_SIZE - res) > 10)
				res = PAGE_SIZE - 10;
			res += sprintf(buf + res, "++more++ ");
			break;
		}
		res += sprintf(buf + res, "%s:%d ",
			       slave->dev->name, slave->queue_id);
	}
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */
1420

1421
	rtnl_unlock();
1422

1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
	return res;
}

/*
 * Set the queue_ids of the  slaves in the current bond.  The bond
 * interface must be enslaved for this to work.
 */
static ssize_t bonding_store_queue_id(struct device *d,
				      struct device_attribute *attr,
				      const char *buffer, size_t count)
{
	struct slave *slave, *update_slave;
	struct bonding *bond = to_bond(d);
1436
	struct list_head *iter;
1437
	u16 qid;
1438
	int ret = count;
1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
	char *delim;
	struct net_device *sdev = NULL;

	if (!rtnl_trylock())
		return restart_syscall();

	/* delim will point to queue id if successful */
	delim = strchr(buffer, ':');
	if (!delim)
		goto err_no_cmd;

	/*
	 * Terminate string that points to device name and bump it
	 * up one, so we can read the queue id there.
	 */
	*delim = '\0';
	if (sscanf(++delim, "%hd\n", &qid) != 1)
		goto err_no_cmd;

	/* Check buffer length, valid ifname and queue id */
	if (strlen(buffer) > IFNAMSIZ ||
	    !dev_valid_name(buffer) ||
1461
	    qid > bond->dev->real_num_tx_queues)
1462 1463 1464 1465 1466 1467 1468 1469 1470
		goto err_no_cmd;

	/* Get the pointer to that interface if it exists */
	sdev = __dev_get_by_name(dev_net(bond->dev), buffer);
	if (!sdev)
		goto err_no_cmd;

	/* Search for thes slave and check for duplicate qids */
	update_slave = NULL;
1471
	bond_for_each_slave(bond, slave, iter) {
1472 1473 1474 1475 1476 1477 1478
		if (sdev == slave->dev)
			/*
			 * We don't need to check the matching
			 * slave for dups, since we're overwriting it
			 */
			update_slave = slave;
		else if (qid && qid == slave->queue_id) {
1479
			goto err_no_cmd;
1480 1481 1482 1483
		}
	}

	if (!update_slave)
1484
		goto err_no_cmd;
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503

	/* Actually set the qids for the slave */
	update_slave->queue_id = qid;

out:
	rtnl_unlock();
	return ret;

err_no_cmd:
	pr_info("invalid input for queue_id set for %s.\n",
		bond->dev->name);
	ret = -EPERM;
	goto out;
}

static DEVICE_ATTR(queue_id, S_IRUGO | S_IWUSR, bonding_show_queue_id,
		   bonding_store_queue_id);


1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
/*
 * 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)
{
	struct bonding *bond = to_bond(d);
1521
	int new_value, ret = count;
1522
	struct list_head *iter;
1523 1524
	struct slave *slave;

1525 1526 1527
	if (!rtnl_trylock())
		return restart_syscall();

1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545
	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;
	}
1546

1547
	bond_for_each_slave(bond, slave, iter) {
J
Jiri Pirko 已提交
1548
		if (!bond_is_active_slave(slave)) {
1549
			if (new_value)
1550
				slave->inactive = 0;
1551
			else
1552
				slave->inactive = 1;
1553 1554 1555
		}
	}
out:
1556
	rtnl_unlock();
1557
	return ret;
1558 1559 1560
}
static DEVICE_ATTR(all_slaves_active, S_IRUGO | S_IWUSR,
		   bonding_show_slaves_active, bonding_store_slaves_active);
1561

1562 1563 1564 1565
/*
 * Show and set the number of IGMP membership reports to send on link failure
 */
static ssize_t bonding_show_resend_igmp(struct device *d,
1566 1567
					struct device_attribute *attr,
					char *buf)
1568 1569 1570 1571 1572 1573 1574
{
	struct bonding *bond = to_bond(d);

	return sprintf(buf, "%d\n", bond->params.resend_igmp);
}

static ssize_t bonding_store_resend_igmp(struct device *d,
1575 1576
					 struct device_attribute *attr,
					 const char *buf, size_t count)
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
{
	int new_value, ret = count;
	struct bonding *bond = to_bond(d);

	if (sscanf(buf, "%d", &new_value) != 1) {
		pr_err("%s: no resend_igmp value specified.\n",
		       bond->dev->name);
		ret = -EINVAL;
		goto out;
	}

1588
	if (new_value < 0 || new_value > 255) {
1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
		pr_err("%s: Invalid resend_igmp value %d not in range 0-255; rejected.\n",
		       bond->dev->name, new_value);
		ret = -EINVAL;
		goto out;
	}

	pr_info("%s: Setting resend_igmp to %d.\n",
		bond->dev->name, new_value);
	bond->params.resend_igmp = new_value;
out:
	return ret;
}

static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR,
		   bonding_show_resend_igmp, bonding_store_resend_igmp);

1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642

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);

1643
static struct attribute *per_bond_attrs[] = {
1644 1645
	&dev_attr_slaves.attr,
	&dev_attr_mode.attr,
1646
	&dev_attr_fail_over_mac.attr,
1647
	&dev_attr_arp_validate.attr,
1648
	&dev_attr_arp_all_targets.attr,
1649 1650 1651 1652 1653
	&dev_attr_arp_interval.attr,
	&dev_attr_arp_ip_target.attr,
	&dev_attr_downdelay.attr,
	&dev_attr_updelay.attr,
	&dev_attr_lacp_rate.attr,
1654
	&dev_attr_ad_select.attr,
1655
	&dev_attr_xmit_hash_policy.attr,
1656 1657
	&dev_attr_num_grat_arp.attr,
	&dev_attr_num_unsol_na.attr,
1658 1659
	&dev_attr_miimon.attr,
	&dev_attr_primary.attr,
1660
	&dev_attr_primary_reselect.attr,
1661 1662 1663 1664 1665 1666 1667 1668
	&dev_attr_use_carrier.attr,
	&dev_attr_active_slave.attr,
	&dev_attr_mii_status.attr,
	&dev_attr_ad_aggregator.attr,
	&dev_attr_ad_num_ports.attr,
	&dev_attr_ad_actor_key.attr,
	&dev_attr_ad_partner_key.attr,
	&dev_attr_ad_partner_mac.attr,
1669
	&dev_attr_queue_id.attr,
1670
	&dev_attr_all_slaves_active.attr,
1671
	&dev_attr_resend_igmp.attr,
1672
	&dev_attr_min_links.attr,
1673
	&dev_attr_lp_interval.attr,
1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685
	NULL,
};

static struct attribute_group bonding_group = {
	.name = "bonding",
	.attrs = per_bond_attrs,
};

/*
 * Initialize sysfs.  This sets up the bonding_masters file in
 * /sys/class/net.
 */
1686
int bond_create_sysfs(struct bond_net *bn)
1687
{
1688
	int ret;
1689

1690
	bn->class_attr_bonding_masters = class_attr_bonding_masters;
1691
	sysfs_attr_init(&bn->class_attr_bonding_masters.attr);
1692 1693

	ret = netdev_class_create_file(&bn->class_attr_bonding_masters);
1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
	/*
	 * Permit multiple loads of the module by ignoring failures to
	 * create the bonding_masters sysfs file.  Bonding devices
	 * created by second or subsequent loads of the module will
	 * not be listed in, or controllable by, bonding_masters, but
	 * will have the usual "bonding" sysfs directory.
	 *
	 * This is done to preserve backwards compatibility for
	 * initscripts/sysconfig, which load bonding multiple times to
	 * configure multiple bonding devices.
	 */
	if (ret == -EEXIST) {
1706
		/* Is someone being kinky and naming a device bonding_master? */
1707
		if (__dev_get_by_name(bn->net,
1708
				      class_attr_bonding_masters.attr.name))
J
Joe Perches 已提交
1709
			pr_err("network device named %s already exists in sysfs",
1710
			       class_attr_bonding_masters.attr.name);
1711
		ret = 0;
1712
	}
1713 1714 1715 1716 1717 1718 1719 1720

	return ret;

}

/*
 * Remove /sys/class/net/bonding_masters.
 */
1721
void bond_destroy_sysfs(struct bond_net *bn)
1722
{
1723
	netdev_class_remove_file(&bn->class_attr_bonding_masters);
1724 1725 1726 1727 1728 1729
}

/*
 * Initialize sysfs for each bond.  This sets up and registers
 * the 'bondctl' directory for each individual bond under /sys/class/net.
 */
1730
void bond_prepare_sysfs_group(struct bonding *bond)
1731
{
1732
	bond->dev->sysfs_groups[0] = &bonding_group;
1733 1734
}