Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.9-rc7 1729 lines 46 kB view raw
1/* 2 * Copyright(c) 2004-2005 Intel Corporation. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License as published by the 6 * Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * for more details. 13 * 14 * You should have received a copy of the GNU General Public License along 15 * with this program; if not, write to the Free Software Foundation, Inc., 16 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 * 18 * The full GNU General Public License is included in this distribution in the 19 * file called LICENSE. 20 * 21 */ 22 23#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 24 25#include <linux/kernel.h> 26#include <linux/module.h> 27#include <linux/device.h> 28#include <linux/sched.h> 29#include <linux/fs.h> 30#include <linux/types.h> 31#include <linux/string.h> 32#include <linux/netdevice.h> 33#include <linux/inetdevice.h> 34#include <linux/in.h> 35#include <linux/sysfs.h> 36#include <linux/ctype.h> 37#include <linux/inet.h> 38#include <linux/rtnetlink.h> 39#include <linux/etherdevice.h> 40#include <net/net_namespace.h> 41#include <net/netns/generic.h> 42#include <linux/nsproxy.h> 43 44#include "bonding.h" 45 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 * "show" function for the bond_masters attribute. 51 * The class parameter is ignored. 52 */ 53static ssize_t bonding_show_bonds(struct class *cls, 54 struct class_attribute *attr, 55 char *buf) 56{ 57 struct bond_net *bn = 58 container_of(attr, struct bond_net, class_attr_bonding_masters); 59 int res = 0; 60 struct bonding *bond; 61 62 rtnl_lock(); 63 64 list_for_each_entry(bond, &bn->dev_list, bond_list) { 65 if (res > (PAGE_SIZE - IFNAMSIZ)) { 66 /* not enough space for another interface name */ 67 if ((PAGE_SIZE - res) > 10) 68 res = PAGE_SIZE - 10; 69 res += sprintf(buf + res, "++more++ "); 70 break; 71 } 72 res += sprintf(buf + res, "%s ", bond->dev->name); 73 } 74 if (res) 75 buf[res-1] = '\n'; /* eat the leftover space */ 76 77 rtnl_unlock(); 78 return res; 79} 80 81static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifname) 82{ 83 struct bonding *bond; 84 85 list_for_each_entry(bond, &bn->dev_list, bond_list) { 86 if (strncmp(bond->dev->name, ifname, IFNAMSIZ) == 0) 87 return bond->dev; 88 } 89 return NULL; 90} 91 92/* 93 * "store" function for the bond_masters attribute. This is what 94 * creates and deletes entire bonds. 95 * 96 * The class parameter is ignored. 97 * 98 */ 99 100static ssize_t bonding_store_bonds(struct class *cls, 101 struct class_attribute *attr, 102 const char *buffer, size_t count) 103{ 104 struct bond_net *bn = 105 container_of(attr, struct bond_net, class_attr_bonding_masters); 106 char command[IFNAMSIZ + 1] = {0, }; 107 char *ifname; 108 int rv, res = count; 109 110 sscanf(buffer, "%16s", command); /* IFNAMSIZ*/ 111 ifname = command + 1; 112 if ((strlen(command) <= 1) || 113 !dev_valid_name(ifname)) 114 goto err_no_cmd; 115 116 if (command[0] == '+') { 117 pr_info("%s is being created...\n", ifname); 118 rv = bond_create(bn->net, ifname); 119 if (rv) { 120 if (rv == -EEXIST) 121 pr_info("%s already exists.\n", ifname); 122 else 123 pr_info("%s creation failed.\n", ifname); 124 res = rv; 125 } 126 } else if (command[0] == '-') { 127 struct net_device *bond_dev; 128 129 rtnl_lock(); 130 bond_dev = bond_get_by_name(bn, ifname); 131 if (bond_dev) { 132 pr_info("%s is being deleted...\n", ifname); 133 unregister_netdevice(bond_dev); 134 } else { 135 pr_err("unable to delete non-existent %s\n", ifname); 136 res = -ENODEV; 137 } 138 rtnl_unlock(); 139 } else 140 goto err_no_cmd; 141 142 /* Always return either count or an error. If you return 0, you'll 143 * get called forever, which is bad. 144 */ 145 return res; 146 147err_no_cmd: 148 pr_err("no command found in bonding_masters. Use +ifname or -ifname.\n"); 149 return -EPERM; 150} 151 152static const void *bonding_namespace(struct class *cls, 153 const struct class_attribute *attr) 154{ 155 const struct bond_net *bn = 156 container_of(attr, struct bond_net, class_attr_bonding_masters); 157 return bn->net; 158} 159 160/* class attribute for bond_masters file. This ends up in /sys/class/net */ 161static const struct class_attribute class_attr_bonding_masters = { 162 .attr = { 163 .name = "bonding_masters", 164 .mode = S_IWUSR | S_IRUGO, 165 }, 166 .show = bonding_show_bonds, 167 .store = bonding_store_bonds, 168 .namespace = bonding_namespace, 169}; 170 171int bond_create_slave_symlinks(struct net_device *master, 172 struct net_device *slave) 173{ 174 char linkname[IFNAMSIZ+7]; 175 int ret = 0; 176 177 /* first, create a link from the slave back to the master */ 178 ret = sysfs_create_link(&(slave->dev.kobj), &(master->dev.kobj), 179 "master"); 180 if (ret) 181 return ret; 182 /* next, create a link from the master to the slave */ 183 sprintf(linkname, "slave_%s", slave->name); 184 ret = sysfs_create_link(&(master->dev.kobj), &(slave->dev.kobj), 185 linkname); 186 187 /* free the master link created earlier in case of error */ 188 if (ret) 189 sysfs_remove_link(&(slave->dev.kobj), "master"); 190 191 return ret; 192 193} 194 195void bond_destroy_slave_symlinks(struct net_device *master, 196 struct net_device *slave) 197{ 198 char linkname[IFNAMSIZ+7]; 199 200 sysfs_remove_link(&(slave->dev.kobj), "master"); 201 sprintf(linkname, "slave_%s", slave->name); 202 sysfs_remove_link(&(master->dev.kobj), linkname); 203} 204 205 206/* 207 * Show the slaves in the current bond. 208 */ 209static ssize_t bonding_show_slaves(struct device *d, 210 struct device_attribute *attr, char *buf) 211{ 212 struct slave *slave; 213 int i, res = 0; 214 struct bonding *bond = to_bond(d); 215 216 read_lock(&bond->lock); 217 bond_for_each_slave(bond, slave, i) { 218 if (res > (PAGE_SIZE - IFNAMSIZ)) { 219 /* not enough space for another interface name */ 220 if ((PAGE_SIZE - res) > 10) 221 res = PAGE_SIZE - 10; 222 res += sprintf(buf + res, "++more++ "); 223 break; 224 } 225 res += sprintf(buf + res, "%s ", slave->dev->name); 226 } 227 read_unlock(&bond->lock); 228 if (res) 229 buf[res-1] = '\n'; /* eat the leftover space */ 230 return res; 231} 232 233/* 234 * Set the slaves in the current bond. The bond interface must be 235 * up for this to succeed. 236 * This is supposed to be only thin wrapper for bond_enslave and bond_release. 237 * All hard work should be done there. 238 */ 239static ssize_t bonding_store_slaves(struct device *d, 240 struct device_attribute *attr, 241 const char *buffer, size_t count) 242{ 243 char command[IFNAMSIZ + 1] = { 0, }; 244 char *ifname; 245 int res, ret = count; 246 struct net_device *dev; 247 struct bonding *bond = to_bond(d); 248 249 if (!rtnl_trylock()) 250 return restart_syscall(); 251 252 sscanf(buffer, "%16s", command); /* IFNAMSIZ*/ 253 ifname = command + 1; 254 if ((strlen(command) <= 1) || 255 !dev_valid_name(ifname)) 256 goto err_no_cmd; 257 258 dev = __dev_get_by_name(dev_net(bond->dev), ifname); 259 if (!dev) { 260 pr_info("%s: Interface %s does not exist!\n", 261 bond->dev->name, ifname); 262 ret = -ENODEV; 263 goto out; 264 } 265 266 switch (command[0]) { 267 case '+': 268 pr_info("%s: Adding slave %s.\n", bond->dev->name, dev->name); 269 res = bond_enslave(bond->dev, dev); 270 break; 271 272 case '-': 273 pr_info("%s: Removing slave %s.\n", bond->dev->name, dev->name); 274 res = bond_release(bond->dev, dev); 275 break; 276 277 default: 278 goto err_no_cmd; 279 } 280 281 if (res) 282 ret = res; 283 goto out; 284 285err_no_cmd: 286 pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n", 287 bond->dev->name); 288 ret = -EPERM; 289 290out: 291 rtnl_unlock(); 292 return ret; 293} 294 295static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves, 296 bonding_store_slaves); 297 298/* 299 * Show and set the bonding mode. The bond interface must be down to 300 * change the mode. 301 */ 302static ssize_t bonding_show_mode(struct device *d, 303 struct device_attribute *attr, char *buf) 304{ 305 struct bonding *bond = to_bond(d); 306 307 return sprintf(buf, "%s %d\n", 308 bond_mode_tbl[bond->params.mode].modename, 309 bond->params.mode); 310} 311 312static ssize_t bonding_store_mode(struct device *d, 313 struct device_attribute *attr, 314 const char *buf, size_t count) 315{ 316 int new_value, ret = count; 317 struct bonding *bond = to_bond(d); 318 319 if (bond->dev->flags & IFF_UP) { 320 pr_err("unable to update mode of %s because interface is up.\n", 321 bond->dev->name); 322 ret = -EPERM; 323 goto out; 324 } 325 326 if (bond->slave_cnt > 0) { 327 pr_err("unable to update mode of %s because it has slaves.\n", 328 bond->dev->name); 329 ret = -EPERM; 330 goto out; 331 } 332 333 new_value = bond_parse_parm(buf, bond_mode_tbl); 334 if (new_value < 0) { 335 pr_err("%s: Ignoring invalid mode value %.*s.\n", 336 bond->dev->name, (int)strlen(buf) - 1, buf); 337 ret = -EINVAL; 338 goto out; 339 } 340 if ((new_value == BOND_MODE_ALB || 341 new_value == BOND_MODE_TLB) && 342 bond->params.arp_interval) { 343 pr_err("%s: %s mode is incompatible with arp monitoring.\n", 344 bond->dev->name, bond_mode_tbl[new_value].modename); 345 ret = -EINVAL; 346 goto out; 347 } 348 349 bond->params.mode = new_value; 350 bond_set_mode_ops(bond, bond->params.mode); 351 pr_info("%s: setting mode to %s (%d).\n", 352 bond->dev->name, bond_mode_tbl[new_value].modename, 353 new_value); 354out: 355 return ret; 356} 357static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR, 358 bonding_show_mode, bonding_store_mode); 359 360/* 361 * Show and set the bonding transmit hash method. 362 * The bond interface must be down to change the xmit hash policy. 363 */ 364static ssize_t bonding_show_xmit_hash(struct device *d, 365 struct device_attribute *attr, 366 char *buf) 367{ 368 struct bonding *bond = to_bond(d); 369 370 return sprintf(buf, "%s %d\n", 371 xmit_hashtype_tbl[bond->params.xmit_policy].modename, 372 bond->params.xmit_policy); 373} 374 375static ssize_t bonding_store_xmit_hash(struct device *d, 376 struct device_attribute *attr, 377 const char *buf, size_t count) 378{ 379 int new_value, ret = count; 380 struct bonding *bond = to_bond(d); 381 382 if (bond->dev->flags & IFF_UP) { 383 pr_err("%s: Interface is up. Unable to update xmit policy.\n", 384 bond->dev->name); 385 ret = -EPERM; 386 goto out; 387 } 388 389 new_value = bond_parse_parm(buf, xmit_hashtype_tbl); 390 if (new_value < 0) { 391 pr_err("%s: Ignoring invalid xmit hash policy value %.*s.\n", 392 bond->dev->name, 393 (int)strlen(buf) - 1, buf); 394 ret = -EINVAL; 395 goto out; 396 } else { 397 bond->params.xmit_policy = new_value; 398 bond_set_mode_ops(bond, bond->params.mode); 399 pr_info("%s: setting xmit hash policy to %s (%d).\n", 400 bond->dev->name, 401 xmit_hashtype_tbl[new_value].modename, new_value); 402 } 403out: 404 return ret; 405} 406static DEVICE_ATTR(xmit_hash_policy, S_IRUGO | S_IWUSR, 407 bonding_show_xmit_hash, bonding_store_xmit_hash); 408 409/* 410 * Show and set arp_validate. 411 */ 412static ssize_t bonding_show_arp_validate(struct device *d, 413 struct device_attribute *attr, 414 char *buf) 415{ 416 struct bonding *bond = to_bond(d); 417 418 return sprintf(buf, "%s %d\n", 419 arp_validate_tbl[bond->params.arp_validate].modename, 420 bond->params.arp_validate); 421} 422 423static ssize_t bonding_store_arp_validate(struct device *d, 424 struct device_attribute *attr, 425 const char *buf, size_t count) 426{ 427 int new_value; 428 struct bonding *bond = to_bond(d); 429 430 new_value = bond_parse_parm(buf, arp_validate_tbl); 431 if (new_value < 0) { 432 pr_err("%s: Ignoring invalid arp_validate value %s\n", 433 bond->dev->name, buf); 434 return -EINVAL; 435 } 436 if (new_value && (bond->params.mode != BOND_MODE_ACTIVEBACKUP)) { 437 pr_err("%s: arp_validate only supported in active-backup mode.\n", 438 bond->dev->name); 439 return -EINVAL; 440 } 441 pr_info("%s: setting arp_validate to %s (%d).\n", 442 bond->dev->name, arp_validate_tbl[new_value].modename, 443 new_value); 444 445 bond->params.arp_validate = new_value; 446 447 return count; 448} 449 450static DEVICE_ATTR(arp_validate, S_IRUGO | S_IWUSR, bonding_show_arp_validate, 451 bonding_store_arp_validate); 452 453/* 454 * Show and store fail_over_mac. User only allowed to change the 455 * value when there are no slaves. 456 */ 457static ssize_t bonding_show_fail_over_mac(struct device *d, 458 struct device_attribute *attr, 459 char *buf) 460{ 461 struct bonding *bond = to_bond(d); 462 463 return sprintf(buf, "%s %d\n", 464 fail_over_mac_tbl[bond->params.fail_over_mac].modename, 465 bond->params.fail_over_mac); 466} 467 468static ssize_t bonding_store_fail_over_mac(struct device *d, 469 struct device_attribute *attr, 470 const char *buf, size_t count) 471{ 472 int new_value; 473 struct bonding *bond = to_bond(d); 474 475 if (bond->slave_cnt != 0) { 476 pr_err("%s: Can't alter fail_over_mac with slaves in bond.\n", 477 bond->dev->name); 478 return -EPERM; 479 } 480 481 new_value = bond_parse_parm(buf, fail_over_mac_tbl); 482 if (new_value < 0) { 483 pr_err("%s: Ignoring invalid fail_over_mac value %s.\n", 484 bond->dev->name, buf); 485 return -EINVAL; 486 } 487 488 bond->params.fail_over_mac = new_value; 489 pr_info("%s: Setting fail_over_mac to %s (%d).\n", 490 bond->dev->name, fail_over_mac_tbl[new_value].modename, 491 new_value); 492 493 return count; 494} 495 496static DEVICE_ATTR(fail_over_mac, S_IRUGO | S_IWUSR, 497 bonding_show_fail_over_mac, bonding_store_fail_over_mac); 498 499/* 500 * Show and set the arp timer interval. There are two tricky bits 501 * here. First, if ARP monitoring is activated, then we must disable 502 * MII monitoring. Second, if the ARP timer isn't running, we must 503 * start it. 504 */ 505static ssize_t bonding_show_arp_interval(struct device *d, 506 struct device_attribute *attr, 507 char *buf) 508{ 509 struct bonding *bond = to_bond(d); 510 511 return sprintf(buf, "%d\n", bond->params.arp_interval); 512} 513 514static ssize_t bonding_store_arp_interval(struct device *d, 515 struct device_attribute *attr, 516 const char *buf, size_t count) 517{ 518 int new_value, ret = count; 519 struct bonding *bond = to_bond(d); 520 521 if (!rtnl_trylock()) 522 return restart_syscall(); 523 if (sscanf(buf, "%d", &new_value) != 1) { 524 pr_err("%s: no arp_interval value specified.\n", 525 bond->dev->name); 526 ret = -EINVAL; 527 goto out; 528 } 529 if (new_value < 0) { 530 pr_err("%s: Invalid arp_interval value %d not in range 0-%d; rejected.\n", 531 bond->dev->name, new_value, INT_MAX); 532 ret = -EINVAL; 533 goto out; 534 } 535 if (bond->params.mode == BOND_MODE_ALB || 536 bond->params.mode == BOND_MODE_TLB) { 537 pr_info("%s: ARP monitoring cannot be used with ALB/TLB. Only MII monitoring is supported on %s.\n", 538 bond->dev->name, bond->dev->name); 539 ret = -EINVAL; 540 goto out; 541 } 542 pr_info("%s: Setting ARP monitoring interval to %d.\n", 543 bond->dev->name, new_value); 544 bond->params.arp_interval = new_value; 545 if (new_value) { 546 if (bond->params.miimon) { 547 pr_info("%s: ARP monitoring cannot be used with MII monitoring. %s Disabling MII monitoring.\n", 548 bond->dev->name, bond->dev->name); 549 bond->params.miimon = 0; 550 } 551 if (!bond->params.arp_targets[0]) 552 pr_info("%s: ARP monitoring has been set up, but no ARP targets have been specified.\n", 553 bond->dev->name); 554 } 555 if (bond->dev->flags & IFF_UP) { 556 /* If the interface is up, we may need to fire off 557 * the ARP timer. If the interface is down, the 558 * timer will get fired off when the open function 559 * is called. 560 */ 561 if (!new_value) { 562 cancel_delayed_work_sync(&bond->arp_work); 563 } else { 564 cancel_delayed_work_sync(&bond->mii_work); 565 queue_delayed_work(bond->wq, &bond->arp_work, 0); 566 } 567 } 568out: 569 rtnl_unlock(); 570 return ret; 571} 572static DEVICE_ATTR(arp_interval, S_IRUGO | S_IWUSR, 573 bonding_show_arp_interval, bonding_store_arp_interval); 574 575/* 576 * Show and set the arp targets. 577 */ 578static ssize_t bonding_show_arp_targets(struct device *d, 579 struct device_attribute *attr, 580 char *buf) 581{ 582 int i, res = 0; 583 struct bonding *bond = to_bond(d); 584 585 for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) { 586 if (bond->params.arp_targets[i]) 587 res += sprintf(buf + res, "%pI4 ", 588 &bond->params.arp_targets[i]); 589 } 590 if (res) 591 buf[res-1] = '\n'; /* eat the leftover space */ 592 return res; 593} 594 595static ssize_t bonding_store_arp_targets(struct device *d, 596 struct device_attribute *attr, 597 const char *buf, size_t count) 598{ 599 __be32 newtarget; 600 int i = 0, done = 0, ret = count; 601 struct bonding *bond = to_bond(d); 602 __be32 *targets; 603 604 targets = bond->params.arp_targets; 605 newtarget = in_aton(buf + 1); 606 /* look for adds */ 607 if (buf[0] == '+') { 608 if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) { 609 pr_err("%s: invalid ARP target %pI4 specified for addition\n", 610 bond->dev->name, &newtarget); 611 ret = -EINVAL; 612 goto out; 613 } 614 /* look for an empty slot to put the target in, and check for dupes */ 615 for (i = 0; (i < BOND_MAX_ARP_TARGETS) && !done; i++) { 616 if (targets[i] == newtarget) { /* duplicate */ 617 pr_err("%s: ARP target %pI4 is already present\n", 618 bond->dev->name, &newtarget); 619 ret = -EINVAL; 620 goto out; 621 } 622 if (targets[i] == 0) { 623 pr_info("%s: adding ARP target %pI4.\n", 624 bond->dev->name, &newtarget); 625 done = 1; 626 targets[i] = newtarget; 627 } 628 } 629 if (!done) { 630 pr_err("%s: ARP target table is full!\n", 631 bond->dev->name); 632 ret = -EINVAL; 633 goto out; 634 } 635 636 } else if (buf[0] == '-') { 637 if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) { 638 pr_err("%s: invalid ARP target %pI4 specified for removal\n", 639 bond->dev->name, &newtarget); 640 ret = -EINVAL; 641 goto out; 642 } 643 644 for (i = 0; (i < BOND_MAX_ARP_TARGETS) && !done; i++) { 645 if (targets[i] == newtarget) { 646 int j; 647 pr_info("%s: removing ARP target %pI4.\n", 648 bond->dev->name, &newtarget); 649 for (j = i; (j < (BOND_MAX_ARP_TARGETS-1)) && targets[j+1]; j++) 650 targets[j] = targets[j+1]; 651 652 targets[j] = 0; 653 done = 1; 654 } 655 } 656 if (!done) { 657 pr_info("%s: unable to remove nonexistent ARP target %pI4.\n", 658 bond->dev->name, &newtarget); 659 ret = -EINVAL; 660 goto out; 661 } 662 } else { 663 pr_err("no command found in arp_ip_targets file for bond %s. Use +<addr> or -<addr>.\n", 664 bond->dev->name); 665 ret = -EPERM; 666 goto out; 667 } 668 669out: 670 return ret; 671} 672static DEVICE_ATTR(arp_ip_target, S_IRUGO | S_IWUSR , bonding_show_arp_targets, bonding_store_arp_targets); 673 674/* 675 * Show and set the up and down delays. These must be multiples of the 676 * MII monitoring value, and are stored internally as the multiplier. 677 * Thus, we must translate to MS for the real world. 678 */ 679static ssize_t bonding_show_downdelay(struct device *d, 680 struct device_attribute *attr, 681 char *buf) 682{ 683 struct bonding *bond = to_bond(d); 684 685 return sprintf(buf, "%d\n", bond->params.downdelay * bond->params.miimon); 686} 687 688static ssize_t bonding_store_downdelay(struct device *d, 689 struct device_attribute *attr, 690 const char *buf, size_t count) 691{ 692 int new_value, ret = count; 693 struct bonding *bond = to_bond(d); 694 695 if (!(bond->params.miimon)) { 696 pr_err("%s: Unable to set down delay as MII monitoring is disabled\n", 697 bond->dev->name); 698 ret = -EPERM; 699 goto out; 700 } 701 702 if (sscanf(buf, "%d", &new_value) != 1) { 703 pr_err("%s: no down delay value specified.\n", bond->dev->name); 704 ret = -EINVAL; 705 goto out; 706 } 707 if (new_value < 0) { 708 pr_err("%s: Invalid down delay value %d not in range %d-%d; rejected.\n", 709 bond->dev->name, new_value, 0, INT_MAX); 710 ret = -EINVAL; 711 goto out; 712 } else { 713 if ((new_value % bond->params.miimon) != 0) { 714 pr_warning("%s: Warning: down delay (%d) is not a multiple of miimon (%d), delay rounded to %d ms\n", 715 bond->dev->name, new_value, 716 bond->params.miimon, 717 (new_value / bond->params.miimon) * 718 bond->params.miimon); 719 } 720 bond->params.downdelay = new_value / bond->params.miimon; 721 pr_info("%s: Setting down delay to %d.\n", 722 bond->dev->name, 723 bond->params.downdelay * bond->params.miimon); 724 725 } 726 727out: 728 return ret; 729} 730static DEVICE_ATTR(downdelay, S_IRUGO | S_IWUSR, 731 bonding_show_downdelay, bonding_store_downdelay); 732 733static ssize_t bonding_show_updelay(struct device *d, 734 struct device_attribute *attr, 735 char *buf) 736{ 737 struct bonding *bond = to_bond(d); 738 739 return sprintf(buf, "%d\n", bond->params.updelay * bond->params.miimon); 740 741} 742 743static ssize_t bonding_store_updelay(struct device *d, 744 struct device_attribute *attr, 745 const char *buf, size_t count) 746{ 747 int new_value, ret = count; 748 struct bonding *bond = to_bond(d); 749 750 if (!(bond->params.miimon)) { 751 pr_err("%s: Unable to set up delay as MII monitoring is disabled\n", 752 bond->dev->name); 753 ret = -EPERM; 754 goto out; 755 } 756 757 if (sscanf(buf, "%d", &new_value) != 1) { 758 pr_err("%s: no up delay value specified.\n", 759 bond->dev->name); 760 ret = -EINVAL; 761 goto out; 762 } 763 if (new_value < 0) { 764 pr_err("%s: Invalid up delay value %d not in range %d-%d; rejected.\n", 765 bond->dev->name, new_value, 0, INT_MAX); 766 ret = -EINVAL; 767 goto out; 768 } else { 769 if ((new_value % bond->params.miimon) != 0) { 770 pr_warning("%s: Warning: up delay (%d) is not a multiple of miimon (%d), updelay rounded to %d ms\n", 771 bond->dev->name, new_value, 772 bond->params.miimon, 773 (new_value / bond->params.miimon) * 774 bond->params.miimon); 775 } 776 bond->params.updelay = new_value / bond->params.miimon; 777 pr_info("%s: Setting up delay to %d.\n", 778 bond->dev->name, 779 bond->params.updelay * bond->params.miimon); 780 } 781 782out: 783 return ret; 784} 785static DEVICE_ATTR(updelay, S_IRUGO | S_IWUSR, 786 bonding_show_updelay, bonding_store_updelay); 787 788/* 789 * Show and set the LACP interval. Interface must be down, and the mode 790 * must be set to 802.3ad mode. 791 */ 792static ssize_t bonding_show_lacp(struct device *d, 793 struct device_attribute *attr, 794 char *buf) 795{ 796 struct bonding *bond = to_bond(d); 797 798 return sprintf(buf, "%s %d\n", 799 bond_lacp_tbl[bond->params.lacp_fast].modename, 800 bond->params.lacp_fast); 801} 802 803static ssize_t bonding_store_lacp(struct device *d, 804 struct device_attribute *attr, 805 const char *buf, size_t count) 806{ 807 int new_value, ret = count; 808 struct bonding *bond = to_bond(d); 809 810 if (bond->dev->flags & IFF_UP) { 811 pr_err("%s: Unable to update LACP rate because interface is up.\n", 812 bond->dev->name); 813 ret = -EPERM; 814 goto out; 815 } 816 817 if (bond->params.mode != BOND_MODE_8023AD) { 818 pr_err("%s: Unable to update LACP rate because bond is not in 802.3ad mode.\n", 819 bond->dev->name); 820 ret = -EPERM; 821 goto out; 822 } 823 824 new_value = bond_parse_parm(buf, bond_lacp_tbl); 825 826 if ((new_value == 1) || (new_value == 0)) { 827 bond->params.lacp_fast = new_value; 828 bond_3ad_update_lacp_rate(bond); 829 pr_info("%s: Setting LACP rate to %s (%d).\n", 830 bond->dev->name, bond_lacp_tbl[new_value].modename, 831 new_value); 832 } else { 833 pr_err("%s: Ignoring invalid LACP rate value %.*s.\n", 834 bond->dev->name, (int)strlen(buf) - 1, buf); 835 ret = -EINVAL; 836 } 837out: 838 return ret; 839} 840static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR, 841 bonding_show_lacp, bonding_store_lacp); 842 843static ssize_t bonding_show_min_links(struct device *d, 844 struct device_attribute *attr, 845 char *buf) 846{ 847 struct bonding *bond = to_bond(d); 848 849 return sprintf(buf, "%d\n", bond->params.min_links); 850} 851 852static ssize_t bonding_store_min_links(struct device *d, 853 struct device_attribute *attr, 854 const char *buf, size_t count) 855{ 856 struct bonding *bond = to_bond(d); 857 int ret; 858 unsigned int new_value; 859 860 ret = kstrtouint(buf, 0, &new_value); 861 if (ret < 0) { 862 pr_err("%s: Ignoring invalid min links value %s.\n", 863 bond->dev->name, buf); 864 return ret; 865 } 866 867 pr_info("%s: Setting min links value to %u\n", 868 bond->dev->name, new_value); 869 bond->params.min_links = new_value; 870 return count; 871} 872static DEVICE_ATTR(min_links, S_IRUGO | S_IWUSR, 873 bonding_show_min_links, bonding_store_min_links); 874 875static ssize_t bonding_show_ad_select(struct device *d, 876 struct device_attribute *attr, 877 char *buf) 878{ 879 struct bonding *bond = to_bond(d); 880 881 return sprintf(buf, "%s %d\n", 882 ad_select_tbl[bond->params.ad_select].modename, 883 bond->params.ad_select); 884} 885 886 887static ssize_t bonding_store_ad_select(struct device *d, 888 struct device_attribute *attr, 889 const char *buf, size_t count) 890{ 891 int new_value, ret = count; 892 struct bonding *bond = to_bond(d); 893 894 if (bond->dev->flags & IFF_UP) { 895 pr_err("%s: Unable to update ad_select because interface is up.\n", 896 bond->dev->name); 897 ret = -EPERM; 898 goto out; 899 } 900 901 new_value = bond_parse_parm(buf, ad_select_tbl); 902 903 if (new_value != -1) { 904 bond->params.ad_select = new_value; 905 pr_info("%s: Setting ad_select to %s (%d).\n", 906 bond->dev->name, ad_select_tbl[new_value].modename, 907 new_value); 908 } else { 909 pr_err("%s: Ignoring invalid ad_select value %.*s.\n", 910 bond->dev->name, (int)strlen(buf) - 1, buf); 911 ret = -EINVAL; 912 } 913out: 914 return ret; 915} 916static DEVICE_ATTR(ad_select, S_IRUGO | S_IWUSR, 917 bonding_show_ad_select, bonding_store_ad_select); 918 919/* 920 * Show and set the number of peer notifications to send after a failover event. 921 */ 922static ssize_t bonding_show_num_peer_notif(struct device *d, 923 struct device_attribute *attr, 924 char *buf) 925{ 926 struct bonding *bond = to_bond(d); 927 return sprintf(buf, "%d\n", bond->params.num_peer_notif); 928} 929 930static ssize_t bonding_store_num_peer_notif(struct device *d, 931 struct device_attribute *attr, 932 const char *buf, size_t count) 933{ 934 struct bonding *bond = to_bond(d); 935 int err = kstrtou8(buf, 10, &bond->params.num_peer_notif); 936 return err ? err : count; 937} 938static DEVICE_ATTR(num_grat_arp, S_IRUGO | S_IWUSR, 939 bonding_show_num_peer_notif, bonding_store_num_peer_notif); 940static DEVICE_ATTR(num_unsol_na, S_IRUGO | S_IWUSR, 941 bonding_show_num_peer_notif, bonding_store_num_peer_notif); 942 943/* 944 * Show and set the MII monitor interval. There are two tricky bits 945 * here. First, if MII monitoring is activated, then we must disable 946 * ARP monitoring. Second, if the timer isn't running, we must 947 * start it. 948 */ 949static ssize_t bonding_show_miimon(struct device *d, 950 struct device_attribute *attr, 951 char *buf) 952{ 953 struct bonding *bond = to_bond(d); 954 955 return sprintf(buf, "%d\n", bond->params.miimon); 956} 957 958static ssize_t bonding_store_miimon(struct device *d, 959 struct device_attribute *attr, 960 const char *buf, size_t count) 961{ 962 int new_value, ret = count; 963 struct bonding *bond = to_bond(d); 964 965 if (!rtnl_trylock()) 966 return restart_syscall(); 967 if (sscanf(buf, "%d", &new_value) != 1) { 968 pr_err("%s: no miimon value specified.\n", 969 bond->dev->name); 970 ret = -EINVAL; 971 goto out; 972 } 973 if (new_value < 0) { 974 pr_err("%s: Invalid miimon value %d not in range %d-%d; rejected.\n", 975 bond->dev->name, new_value, 0, INT_MAX); 976 ret = -EINVAL; 977 goto out; 978 } 979 pr_info("%s: Setting MII monitoring interval to %d.\n", 980 bond->dev->name, new_value); 981 bond->params.miimon = new_value; 982 if (bond->params.updelay) 983 pr_info("%s: Note: Updating updelay (to %d) since it is a multiple of the miimon value.\n", 984 bond->dev->name, 985 bond->params.updelay * bond->params.miimon); 986 if (bond->params.downdelay) 987 pr_info("%s: Note: Updating downdelay (to %d) since it is a multiple of the miimon value.\n", 988 bond->dev->name, 989 bond->params.downdelay * bond->params.miimon); 990 if (new_value && bond->params.arp_interval) { 991 pr_info("%s: MII monitoring cannot be used with ARP monitoring. Disabling ARP monitoring...\n", 992 bond->dev->name); 993 bond->params.arp_interval = 0; 994 if (bond->params.arp_validate) 995 bond->params.arp_validate = BOND_ARP_VALIDATE_NONE; 996 } 997 if (bond->dev->flags & IFF_UP) { 998 /* If the interface is up, we may need to fire off 999 * the MII timer. If the interface is down, the 1000 * timer will get fired off when the open function 1001 * is called. 1002 */ 1003 if (!new_value) { 1004 cancel_delayed_work_sync(&bond->mii_work); 1005 } else { 1006 cancel_delayed_work_sync(&bond->arp_work); 1007 queue_delayed_work(bond->wq, &bond->mii_work, 0); 1008 } 1009 } 1010out: 1011 rtnl_unlock(); 1012 return ret; 1013} 1014static DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR, 1015 bonding_show_miimon, bonding_store_miimon); 1016 1017/* 1018 * Show and set the primary slave. The store function is much 1019 * simpler than bonding_store_slaves function because it only needs to 1020 * handle one interface name. 1021 * The bond must be a mode that supports a primary for this be 1022 * set. 1023 */ 1024static ssize_t bonding_show_primary(struct device *d, 1025 struct device_attribute *attr, 1026 char *buf) 1027{ 1028 int count = 0; 1029 struct bonding *bond = to_bond(d); 1030 1031 if (bond->primary_slave) 1032 count = sprintf(buf, "%s\n", bond->primary_slave->dev->name); 1033 1034 return count; 1035} 1036 1037static ssize_t bonding_store_primary(struct device *d, 1038 struct device_attribute *attr, 1039 const char *buf, size_t count) 1040{ 1041 int i; 1042 struct slave *slave; 1043 struct bonding *bond = to_bond(d); 1044 char ifname[IFNAMSIZ]; 1045 1046 if (!rtnl_trylock()) 1047 return restart_syscall(); 1048 block_netpoll_tx(); 1049 read_lock(&bond->lock); 1050 write_lock_bh(&bond->curr_slave_lock); 1051 1052 if (!USES_PRIMARY(bond->params.mode)) { 1053 pr_info("%s: Unable to set primary slave; %s is in mode %d\n", 1054 bond->dev->name, bond->dev->name, bond->params.mode); 1055 goto out; 1056 } 1057 1058 sscanf(buf, "%15s", ifname); /* IFNAMSIZ */ 1059 1060 /* check to see if we are clearing primary */ 1061 if (!strlen(ifname) || buf[0] == '\n') { 1062 pr_info("%s: Setting primary slave to None.\n", 1063 bond->dev->name); 1064 bond->primary_slave = NULL; 1065 memset(bond->params.primary, 0, sizeof(bond->params.primary)); 1066 bond_select_active_slave(bond); 1067 goto out; 1068 } 1069 1070 bond_for_each_slave(bond, slave, i) { 1071 if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { 1072 pr_info("%s: Setting %s as primary slave.\n", 1073 bond->dev->name, slave->dev->name); 1074 bond->primary_slave = slave; 1075 strcpy(bond->params.primary, slave->dev->name); 1076 bond_select_active_slave(bond); 1077 goto out; 1078 } 1079 } 1080 1081 strncpy(bond->params.primary, ifname, IFNAMSIZ); 1082 bond->params.primary[IFNAMSIZ - 1] = 0; 1083 1084 pr_info("%s: Recording %s as primary, " 1085 "but it has not been enslaved to %s yet.\n", 1086 bond->dev->name, ifname, bond->dev->name); 1087out: 1088 write_unlock_bh(&bond->curr_slave_lock); 1089 read_unlock(&bond->lock); 1090 unblock_netpoll_tx(); 1091 rtnl_unlock(); 1092 1093 return count; 1094} 1095static DEVICE_ATTR(primary, S_IRUGO | S_IWUSR, 1096 bonding_show_primary, bonding_store_primary); 1097 1098/* 1099 * Show and set the primary_reselect flag. 1100 */ 1101static ssize_t bonding_show_primary_reselect(struct device *d, 1102 struct device_attribute *attr, 1103 char *buf) 1104{ 1105 struct bonding *bond = to_bond(d); 1106 1107 return sprintf(buf, "%s %d\n", 1108 pri_reselect_tbl[bond->params.primary_reselect].modename, 1109 bond->params.primary_reselect); 1110} 1111 1112static ssize_t bonding_store_primary_reselect(struct device *d, 1113 struct device_attribute *attr, 1114 const char *buf, size_t count) 1115{ 1116 int new_value, ret = count; 1117 struct bonding *bond = to_bond(d); 1118 1119 if (!rtnl_trylock()) 1120 return restart_syscall(); 1121 1122 new_value = bond_parse_parm(buf, pri_reselect_tbl); 1123 if (new_value < 0) { 1124 pr_err("%s: Ignoring invalid primary_reselect value %.*s.\n", 1125 bond->dev->name, 1126 (int) strlen(buf) - 1, buf); 1127 ret = -EINVAL; 1128 goto out; 1129 } 1130 1131 bond->params.primary_reselect = new_value; 1132 pr_info("%s: setting primary_reselect to %s (%d).\n", 1133 bond->dev->name, pri_reselect_tbl[new_value].modename, 1134 new_value); 1135 1136 block_netpoll_tx(); 1137 read_lock(&bond->lock); 1138 write_lock_bh(&bond->curr_slave_lock); 1139 bond_select_active_slave(bond); 1140 write_unlock_bh(&bond->curr_slave_lock); 1141 read_unlock(&bond->lock); 1142 unblock_netpoll_tx(); 1143out: 1144 rtnl_unlock(); 1145 return ret; 1146} 1147static DEVICE_ATTR(primary_reselect, S_IRUGO | S_IWUSR, 1148 bonding_show_primary_reselect, 1149 bonding_store_primary_reselect); 1150 1151/* 1152 * Show and set the use_carrier flag. 1153 */ 1154static ssize_t bonding_show_carrier(struct device *d, 1155 struct device_attribute *attr, 1156 char *buf) 1157{ 1158 struct bonding *bond = to_bond(d); 1159 1160 return sprintf(buf, "%d\n", bond->params.use_carrier); 1161} 1162 1163static ssize_t bonding_store_carrier(struct device *d, 1164 struct device_attribute *attr, 1165 const char *buf, size_t count) 1166{ 1167 int new_value, ret = count; 1168 struct bonding *bond = to_bond(d); 1169 1170 1171 if (sscanf(buf, "%d", &new_value) != 1) { 1172 pr_err("%s: no use_carrier value specified.\n", 1173 bond->dev->name); 1174 ret = -EINVAL; 1175 goto out; 1176 } 1177 if ((new_value == 0) || (new_value == 1)) { 1178 bond->params.use_carrier = new_value; 1179 pr_info("%s: Setting use_carrier to %d.\n", 1180 bond->dev->name, new_value); 1181 } else { 1182 pr_info("%s: Ignoring invalid use_carrier value %d.\n", 1183 bond->dev->name, new_value); 1184 } 1185out: 1186 return ret; 1187} 1188static DEVICE_ATTR(use_carrier, S_IRUGO | S_IWUSR, 1189 bonding_show_carrier, bonding_store_carrier); 1190 1191 1192/* 1193 * Show and set currently active_slave. 1194 */ 1195static ssize_t bonding_show_active_slave(struct device *d, 1196 struct device_attribute *attr, 1197 char *buf) 1198{ 1199 struct slave *curr; 1200 struct bonding *bond = to_bond(d); 1201 int count = 0; 1202 1203 read_lock(&bond->curr_slave_lock); 1204 curr = bond->curr_active_slave; 1205 read_unlock(&bond->curr_slave_lock); 1206 1207 if (USES_PRIMARY(bond->params.mode) && curr) 1208 count = sprintf(buf, "%s\n", curr->dev->name); 1209 return count; 1210} 1211 1212static ssize_t bonding_store_active_slave(struct device *d, 1213 struct device_attribute *attr, 1214 const char *buf, size_t count) 1215{ 1216 int i; 1217 struct slave *slave; 1218 struct slave *old_active = NULL; 1219 struct slave *new_active = NULL; 1220 struct bonding *bond = to_bond(d); 1221 char ifname[IFNAMSIZ]; 1222 1223 if (!rtnl_trylock()) 1224 return restart_syscall(); 1225 1226 block_netpoll_tx(); 1227 read_lock(&bond->lock); 1228 write_lock_bh(&bond->curr_slave_lock); 1229 1230 if (!USES_PRIMARY(bond->params.mode)) { 1231 pr_info("%s: Unable to change active slave; %s is in mode %d\n", 1232 bond->dev->name, bond->dev->name, bond->params.mode); 1233 goto out; 1234 } 1235 1236 sscanf(buf, "%15s", ifname); /* IFNAMSIZ */ 1237 1238 /* check to see if we are clearing active */ 1239 if (!strlen(ifname) || buf[0] == '\n') { 1240 pr_info("%s: Clearing current active slave.\n", 1241 bond->dev->name); 1242 bond->curr_active_slave = NULL; 1243 bond_select_active_slave(bond); 1244 goto out; 1245 } 1246 1247 bond_for_each_slave(bond, slave, i) { 1248 if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { 1249 old_active = bond->curr_active_slave; 1250 new_active = slave; 1251 if (new_active == old_active) { 1252 /* do nothing */ 1253 pr_info("%s: %s is already the current" 1254 " active slave.\n", 1255 bond->dev->name, 1256 slave->dev->name); 1257 goto out; 1258 } 1259 else { 1260 if ((new_active) && 1261 (old_active) && 1262 (new_active->link == BOND_LINK_UP) && 1263 IS_UP(new_active->dev)) { 1264 pr_info("%s: Setting %s as active" 1265 " slave.\n", 1266 bond->dev->name, 1267 slave->dev->name); 1268 bond_change_active_slave(bond, 1269 new_active); 1270 } 1271 else { 1272 pr_info("%s: Could not set %s as" 1273 " active slave; either %s is" 1274 " down or the link is down.\n", 1275 bond->dev->name, 1276 slave->dev->name, 1277 slave->dev->name); 1278 } 1279 goto out; 1280 } 1281 } 1282 } 1283 1284 pr_info("%s: Unable to set %.*s as active slave.\n", 1285 bond->dev->name, (int)strlen(buf) - 1, buf); 1286 out: 1287 write_unlock_bh(&bond->curr_slave_lock); 1288 read_unlock(&bond->lock); 1289 unblock_netpoll_tx(); 1290 1291 rtnl_unlock(); 1292 1293 return count; 1294 1295} 1296static DEVICE_ATTR(active_slave, S_IRUGO | S_IWUSR, 1297 bonding_show_active_slave, bonding_store_active_slave); 1298 1299 1300/* 1301 * Show link status of the bond interface. 1302 */ 1303static ssize_t bonding_show_mii_status(struct device *d, 1304 struct device_attribute *attr, 1305 char *buf) 1306{ 1307 struct slave *curr; 1308 struct bonding *bond = to_bond(d); 1309 1310 read_lock(&bond->curr_slave_lock); 1311 curr = bond->curr_active_slave; 1312 read_unlock(&bond->curr_slave_lock); 1313 1314 return sprintf(buf, "%s\n", curr ? "up" : "down"); 1315} 1316static DEVICE_ATTR(mii_status, S_IRUGO, bonding_show_mii_status, NULL); 1317 1318 1319/* 1320 * Show current 802.3ad aggregator ID. 1321 */ 1322static ssize_t bonding_show_ad_aggregator(struct device *d, 1323 struct device_attribute *attr, 1324 char *buf) 1325{ 1326 int count = 0; 1327 struct bonding *bond = to_bond(d); 1328 1329 if (bond->params.mode == BOND_MODE_8023AD) { 1330 struct ad_info ad_info; 1331 count = sprintf(buf, "%d\n", 1332 (bond_3ad_get_active_agg_info(bond, &ad_info)) 1333 ? 0 : ad_info.aggregator_id); 1334 } 1335 1336 return count; 1337} 1338static DEVICE_ATTR(ad_aggregator, S_IRUGO, bonding_show_ad_aggregator, NULL); 1339 1340 1341/* 1342 * Show number of active 802.3ad ports. 1343 */ 1344static ssize_t bonding_show_ad_num_ports(struct device *d, 1345 struct device_attribute *attr, 1346 char *buf) 1347{ 1348 int count = 0; 1349 struct bonding *bond = to_bond(d); 1350 1351 if (bond->params.mode == BOND_MODE_8023AD) { 1352 struct ad_info ad_info; 1353 count = sprintf(buf, "%d\n", 1354 (bond_3ad_get_active_agg_info(bond, &ad_info)) 1355 ? 0 : ad_info.ports); 1356 } 1357 1358 return count; 1359} 1360static DEVICE_ATTR(ad_num_ports, S_IRUGO, bonding_show_ad_num_ports, NULL); 1361 1362 1363/* 1364 * Show current 802.3ad actor key. 1365 */ 1366static ssize_t bonding_show_ad_actor_key(struct device *d, 1367 struct device_attribute *attr, 1368 char *buf) 1369{ 1370 int count = 0; 1371 struct bonding *bond = to_bond(d); 1372 1373 if (bond->params.mode == BOND_MODE_8023AD) { 1374 struct ad_info ad_info; 1375 count = sprintf(buf, "%d\n", 1376 (bond_3ad_get_active_agg_info(bond, &ad_info)) 1377 ? 0 : ad_info.actor_key); 1378 } 1379 1380 return count; 1381} 1382static DEVICE_ATTR(ad_actor_key, S_IRUGO, bonding_show_ad_actor_key, NULL); 1383 1384 1385/* 1386 * Show current 802.3ad partner key. 1387 */ 1388static ssize_t bonding_show_ad_partner_key(struct device *d, 1389 struct device_attribute *attr, 1390 char *buf) 1391{ 1392 int count = 0; 1393 struct bonding *bond = to_bond(d); 1394 1395 if (bond->params.mode == BOND_MODE_8023AD) { 1396 struct ad_info ad_info; 1397 count = sprintf(buf, "%d\n", 1398 (bond_3ad_get_active_agg_info(bond, &ad_info)) 1399 ? 0 : ad_info.partner_key); 1400 } 1401 1402 return count; 1403} 1404static DEVICE_ATTR(ad_partner_key, S_IRUGO, bonding_show_ad_partner_key, NULL); 1405 1406 1407/* 1408 * Show current 802.3ad partner mac. 1409 */ 1410static ssize_t bonding_show_ad_partner_mac(struct device *d, 1411 struct device_attribute *attr, 1412 char *buf) 1413{ 1414 int count = 0; 1415 struct bonding *bond = to_bond(d); 1416 1417 if (bond->params.mode == BOND_MODE_8023AD) { 1418 struct ad_info ad_info; 1419 if (!bond_3ad_get_active_agg_info(bond, &ad_info)) 1420 count = sprintf(buf, "%pM\n", ad_info.partner_system); 1421 } 1422 1423 return count; 1424} 1425static DEVICE_ATTR(ad_partner_mac, S_IRUGO, bonding_show_ad_partner_mac, NULL); 1426 1427/* 1428 * Show the queue_ids of the slaves in the current bond. 1429 */ 1430static ssize_t bonding_show_queue_id(struct device *d, 1431 struct device_attribute *attr, 1432 char *buf) 1433{ 1434 struct slave *slave; 1435 int i, res = 0; 1436 struct bonding *bond = to_bond(d); 1437 1438 if (!rtnl_trylock()) 1439 return restart_syscall(); 1440 1441 read_lock(&bond->lock); 1442 bond_for_each_slave(bond, slave, i) { 1443 if (res > (PAGE_SIZE - IFNAMSIZ - 6)) { 1444 /* not enough space for another interface_name:queue_id pair */ 1445 if ((PAGE_SIZE - res) > 10) 1446 res = PAGE_SIZE - 10; 1447 res += sprintf(buf + res, "++more++ "); 1448 break; 1449 } 1450 res += sprintf(buf + res, "%s:%d ", 1451 slave->dev->name, slave->queue_id); 1452 } 1453 read_unlock(&bond->lock); 1454 if (res) 1455 buf[res-1] = '\n'; /* eat the leftover space */ 1456 rtnl_unlock(); 1457 return res; 1458} 1459 1460/* 1461 * Set the queue_ids of the slaves in the current bond. The bond 1462 * interface must be enslaved for this to work. 1463 */ 1464static ssize_t bonding_store_queue_id(struct device *d, 1465 struct device_attribute *attr, 1466 const char *buffer, size_t count) 1467{ 1468 struct slave *slave, *update_slave; 1469 struct bonding *bond = to_bond(d); 1470 u16 qid; 1471 int i, ret = count; 1472 char *delim; 1473 struct net_device *sdev = NULL; 1474 1475 if (!rtnl_trylock()) 1476 return restart_syscall(); 1477 1478 /* delim will point to queue id if successful */ 1479 delim = strchr(buffer, ':'); 1480 if (!delim) 1481 goto err_no_cmd; 1482 1483 /* 1484 * Terminate string that points to device name and bump it 1485 * up one, so we can read the queue id there. 1486 */ 1487 *delim = '\0'; 1488 if (sscanf(++delim, "%hd\n", &qid) != 1) 1489 goto err_no_cmd; 1490 1491 /* Check buffer length, valid ifname and queue id */ 1492 if (strlen(buffer) > IFNAMSIZ || 1493 !dev_valid_name(buffer) || 1494 qid > bond->dev->real_num_tx_queues) 1495 goto err_no_cmd; 1496 1497 /* Get the pointer to that interface if it exists */ 1498 sdev = __dev_get_by_name(dev_net(bond->dev), buffer); 1499 if (!sdev) 1500 goto err_no_cmd; 1501 1502 read_lock(&bond->lock); 1503 1504 /* Search for thes slave and check for duplicate qids */ 1505 update_slave = NULL; 1506 bond_for_each_slave(bond, slave, i) { 1507 if (sdev == slave->dev) 1508 /* 1509 * We don't need to check the matching 1510 * slave for dups, since we're overwriting it 1511 */ 1512 update_slave = slave; 1513 else if (qid && qid == slave->queue_id) { 1514 goto err_no_cmd_unlock; 1515 } 1516 } 1517 1518 if (!update_slave) 1519 goto err_no_cmd_unlock; 1520 1521 /* Actually set the qids for the slave */ 1522 update_slave->queue_id = qid; 1523 1524 read_unlock(&bond->lock); 1525out: 1526 rtnl_unlock(); 1527 return ret; 1528 1529err_no_cmd_unlock: 1530 read_unlock(&bond->lock); 1531err_no_cmd: 1532 pr_info("invalid input for queue_id set for %s.\n", 1533 bond->dev->name); 1534 ret = -EPERM; 1535 goto out; 1536} 1537 1538static DEVICE_ATTR(queue_id, S_IRUGO | S_IWUSR, bonding_show_queue_id, 1539 bonding_store_queue_id); 1540 1541 1542/* 1543 * Show and set the all_slaves_active flag. 1544 */ 1545static ssize_t bonding_show_slaves_active(struct device *d, 1546 struct device_attribute *attr, 1547 char *buf) 1548{ 1549 struct bonding *bond = to_bond(d); 1550 1551 return sprintf(buf, "%d\n", bond->params.all_slaves_active); 1552} 1553 1554static ssize_t bonding_store_slaves_active(struct device *d, 1555 struct device_attribute *attr, 1556 const char *buf, size_t count) 1557{ 1558 int i, new_value, ret = count; 1559 struct bonding *bond = to_bond(d); 1560 struct slave *slave; 1561 1562 if (sscanf(buf, "%d", &new_value) != 1) { 1563 pr_err("%s: no all_slaves_active value specified.\n", 1564 bond->dev->name); 1565 ret = -EINVAL; 1566 goto out; 1567 } 1568 1569 if (new_value == bond->params.all_slaves_active) 1570 goto out; 1571 1572 if ((new_value == 0) || (new_value == 1)) { 1573 bond->params.all_slaves_active = new_value; 1574 } else { 1575 pr_info("%s: Ignoring invalid all_slaves_active value %d.\n", 1576 bond->dev->name, new_value); 1577 ret = -EINVAL; 1578 goto out; 1579 } 1580 1581 read_lock(&bond->lock); 1582 bond_for_each_slave(bond, slave, i) { 1583 if (!bond_is_active_slave(slave)) { 1584 if (new_value) 1585 slave->inactive = 0; 1586 else 1587 slave->inactive = 1; 1588 } 1589 } 1590 read_unlock(&bond->lock); 1591out: 1592 return ret; 1593} 1594static DEVICE_ATTR(all_slaves_active, S_IRUGO | S_IWUSR, 1595 bonding_show_slaves_active, bonding_store_slaves_active); 1596 1597/* 1598 * Show and set the number of IGMP membership reports to send on link failure 1599 */ 1600static ssize_t bonding_show_resend_igmp(struct device *d, 1601 struct device_attribute *attr, 1602 char *buf) 1603{ 1604 struct bonding *bond = to_bond(d); 1605 1606 return sprintf(buf, "%d\n", bond->params.resend_igmp); 1607} 1608 1609static ssize_t bonding_store_resend_igmp(struct device *d, 1610 struct device_attribute *attr, 1611 const char *buf, size_t count) 1612{ 1613 int new_value, ret = count; 1614 struct bonding *bond = to_bond(d); 1615 1616 if (sscanf(buf, "%d", &new_value) != 1) { 1617 pr_err("%s: no resend_igmp value specified.\n", 1618 bond->dev->name); 1619 ret = -EINVAL; 1620 goto out; 1621 } 1622 1623 if (new_value < 0 || new_value > 255) { 1624 pr_err("%s: Invalid resend_igmp value %d not in range 0-255; rejected.\n", 1625 bond->dev->name, new_value); 1626 ret = -EINVAL; 1627 goto out; 1628 } 1629 1630 pr_info("%s: Setting resend_igmp to %d.\n", 1631 bond->dev->name, new_value); 1632 bond->params.resend_igmp = new_value; 1633out: 1634 return ret; 1635} 1636 1637static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR, 1638 bonding_show_resend_igmp, bonding_store_resend_igmp); 1639 1640static struct attribute *per_bond_attrs[] = { 1641 &dev_attr_slaves.attr, 1642 &dev_attr_mode.attr, 1643 &dev_attr_fail_over_mac.attr, 1644 &dev_attr_arp_validate.attr, 1645 &dev_attr_arp_interval.attr, 1646 &dev_attr_arp_ip_target.attr, 1647 &dev_attr_downdelay.attr, 1648 &dev_attr_updelay.attr, 1649 &dev_attr_lacp_rate.attr, 1650 &dev_attr_ad_select.attr, 1651 &dev_attr_xmit_hash_policy.attr, 1652 &dev_attr_num_grat_arp.attr, 1653 &dev_attr_num_unsol_na.attr, 1654 &dev_attr_miimon.attr, 1655 &dev_attr_primary.attr, 1656 &dev_attr_primary_reselect.attr, 1657 &dev_attr_use_carrier.attr, 1658 &dev_attr_active_slave.attr, 1659 &dev_attr_mii_status.attr, 1660 &dev_attr_ad_aggregator.attr, 1661 &dev_attr_ad_num_ports.attr, 1662 &dev_attr_ad_actor_key.attr, 1663 &dev_attr_ad_partner_key.attr, 1664 &dev_attr_ad_partner_mac.attr, 1665 &dev_attr_queue_id.attr, 1666 &dev_attr_all_slaves_active.attr, 1667 &dev_attr_resend_igmp.attr, 1668 &dev_attr_min_links.attr, 1669 NULL, 1670}; 1671 1672static struct attribute_group bonding_group = { 1673 .name = "bonding", 1674 .attrs = per_bond_attrs, 1675}; 1676 1677/* 1678 * Initialize sysfs. This sets up the bonding_masters file in 1679 * /sys/class/net. 1680 */ 1681int bond_create_sysfs(struct bond_net *bn) 1682{ 1683 int ret; 1684 1685 bn->class_attr_bonding_masters = class_attr_bonding_masters; 1686 sysfs_attr_init(&bn->class_attr_bonding_masters.attr); 1687 1688 ret = netdev_class_create_file(&bn->class_attr_bonding_masters); 1689 /* 1690 * Permit multiple loads of the module by ignoring failures to 1691 * create the bonding_masters sysfs file. Bonding devices 1692 * created by second or subsequent loads of the module will 1693 * not be listed in, or controllable by, bonding_masters, but 1694 * will have the usual "bonding" sysfs directory. 1695 * 1696 * This is done to preserve backwards compatibility for 1697 * initscripts/sysconfig, which load bonding multiple times to 1698 * configure multiple bonding devices. 1699 */ 1700 if (ret == -EEXIST) { 1701 /* Is someone being kinky and naming a device bonding_master? */ 1702 if (__dev_get_by_name(bn->net, 1703 class_attr_bonding_masters.attr.name)) 1704 pr_err("network device named %s already exists in sysfs", 1705 class_attr_bonding_masters.attr.name); 1706 ret = 0; 1707 } 1708 1709 return ret; 1710 1711} 1712 1713/* 1714 * Remove /sys/class/net/bonding_masters. 1715 */ 1716void bond_destroy_sysfs(struct bond_net *bn) 1717{ 1718 netdev_class_remove_file(&bn->class_attr_bonding_masters); 1719} 1720 1721/* 1722 * Initialize sysfs for each bond. This sets up and registers 1723 * the 'bondctl' directory for each individual bond under /sys/class/net. 1724 */ 1725void bond_prepare_sysfs_group(struct bonding *bond) 1726{ 1727 bond->dev->sysfs_groups[0] = &bonding_group; 1728} 1729