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