Release 4.11 drivers/net/bonding/bond_sysfs.c
/*
* Copyright(c) 2004-2005 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see <http://www.gnu.org/licenses/>.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/sched/signal.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/in.h>
#include <linux/sysfs.h>
#include <linux/ctype.h>
#include <linux/inet.h>
#include <linux/rtnetlink.h>
#include <linux/etherdevice.h>
#include <net/net_namespace.h>
#include <net/netns/generic.h>
#include <linux/nsproxy.h>
#include <net/bonding.h>
#define to_bond(cd) ((struct bonding *)(netdev_priv(to_net_dev(cd))))
/* "show" function for the bond_masters attribute.
* The class parameter is ignored.
*/
static ssize_t bonding_show_bonds(struct class *cls,
struct class_attribute *attr,
char *buf)
{
struct bond_net *bn =
container_of(attr, struct bond_net, class_attr_bonding_masters);
int res = 0;
struct bonding *bond;
rtnl_lock();
list_for_each_entry(bond, &bn->dev_list, bond_list) {
if (res > (PAGE_SIZE - IFNAMSIZ)) {
/* not enough space for another interface name */
if ((PAGE_SIZE - res) > 10)
res = PAGE_SIZE - 10;
res += sprintf(buf + res, "++more++ ");
break;
}
res += sprintf(buf + res, "%s ", bond->dev->name);
}
if (res)
buf[res-1] = '\n'; /* eat the leftover space */
rtnl_unlock();
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 96 | 70.59% | 1 | 14.29% |
Eric W. Biedermann | 16 | 11.76% | 2 | 28.57% |
Wagner Ferenc | 15 | 11.03% | 2 | 28.57% |
Andi Kleen | 5 | 3.68% | 1 | 14.29% |
Stephen Hemminger | 4 | 2.94% | 1 | 14.29% |
Total | 136 | 100.00% | 7 | 100.00% |
static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifname)
{
struct bonding *bond;
list_for_each_entry(bond, &bn->dev_list, bond_list) {
if (strncmp(bond->dev->name, ifname, IFNAMSIZ) == 0)
return bond->dev;
}
return NULL;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Stephen Hemminger | 52 | 89.66% | 1 | 33.33% |
Eric W. Biedermann | 6 | 10.34% | 2 | 66.67% |
Total | 58 | 100.00% | 3 | 100.00% |
/* "store" function for the bond_masters attribute. This is what
* creates and deletes entire bonds.
*
* The class parameter is ignored.
*/
static ssize_t bonding_store_bonds(struct class *cls,
struct class_attribute *attr,
const char *buffer, size_t count)
{
struct bond_net *bn =
container_of(attr, struct bond_net, class_attr_bonding_masters);
char command[IFNAMSIZ + 1] = {0, };
char *ifname;
int rv, res = count;
sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
ifname = command + 1;
if ((strlen(command) <= 1) ||
!dev_valid_name(ifname))
goto err_no_cmd;
if (command[0] == '+') {
pr_info("%s is being created...\n", ifname);
rv = bond_create(bn->net, ifname);
if (rv) {
if (rv == -EEXIST)
pr_info("%s already exists\n", ifname);
else
pr_info("%s creation failed\n", ifname);
res = rv;
}
} else if (command[0] == '-') {
struct net_device *bond_dev;
rtnl_lock();
bond_dev = bond_get_by_name(bn, ifname);
if (bond_dev) {
pr_info("%s is being deleted...\n", ifname);
unregister_netdevice(bond_dev);
} else {
pr_err("unable to delete non-existent %s\n", ifname);
res = -ENODEV;
}
rtnl_unlock();
} else
goto err_no_cmd;
/* Always return either count or an error. If you return 0, you'll
* get called forever, which is bad.
*/
return res;
err_no_cmd:
pr_err("no command found in bonding_masters - use +ifname or -ifname\n");
return -EPERM;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 141 | 58.02% | 1 | 8.33% |
Stephen Hemminger | 40 | 16.46% | 3 | 25.00% |
Eric W. Biedermann | 21 | 8.64% | 2 | 16.67% |
Phil Oester | 16 | 6.58% | 1 | 8.33% |
Jay Vosburgh | 14 | 5.76% | 2 | 16.67% |
Joe Perches | 6 | 2.47% | 2 | 16.67% |
Andi Kleen | 5 | 2.06% | 1 | 8.33% |
Total | 243 | 100.00% | 12 | 100.00% |
/* class attribute for bond_masters file. This ends up in /sys/class/net */
static const struct class_attribute class_attr_bonding_masters = {
.attr = {
.name = "bonding_masters",
.mode = S_IWUSR | S_IRUGO,
},
.show = bonding_show_bonds,
.store = bonding_store_bonds,
};
/* Generic "store" method for bonding sysfs option setting */
static ssize_t bonding_sysfs_store_option(struct device *d,
struct device_attribute *attr,
const char *buffer, size_t count)
{
struct bonding *bond = to_bond(d);
const struct bond_option *opt;
int ret;
opt = bond_opt_get_by_name(attr->attr.name);
if (WARN_ON(!opt))
return -ENOENT;
ret = bond_opt_tryset_rtnl(bond, opt->id, (char *)buffer);
if (!ret)
ret = count;
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 95 | 100.00% | 1 | 100.00% |
Total | 95 | 100.00% | 1 | 100.00% |
/* Show the slaves in the current bond. */
static ssize_t bonding_show_slaves(struct device *d,
struct device_attribute *attr, char *buf)
{
struct bonding *bond = to_bond(d);
struct list_head *iter;
struct slave *slave;
int res = 0;
if (!rtnl_trylock())
return restart_syscall();
bond_for_each_slave(bond, slave, iter) {
if (res > (PAGE_SIZE - IFNAMSIZ)) {
/* not enough space for another interface name */
if ((PAGE_SIZE - res) > 10)
res = PAGE_SIZE - 10;
res += sprintf(buf + res, "++more++ ");
break;
}
res += sprintf(buf + res, "%s ", slave->dev->name);
}
rtnl_unlock();
if (res)
buf[res-1] = '\n'; /* eat the leftover space */
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 95 | 66.43% | 1 | 16.67% |
Ding Tianhong | 12 | 8.39% | 1 | 16.67% |
Wagner Ferenc | 11 | 7.69% | 1 | 16.67% |
Nikolay Aleksandrov | 10 | 6.99% | 1 | 16.67% |
Greg Kroah-Hartman | 8 | 5.59% | 1 | 16.67% |
Veaceslav Falico | 7 | 4.90% | 1 | 16.67% |
Total | 143 | 100.00% | 6 | 100.00% |
static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves,
bonding_sysfs_store_option);
/* Show the bonding mode. */
static ssize_t bonding_show_mode(struct device *d,
struct device_attribute *attr, char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_MODE, BOND_MODE(bond));
return sprintf(buf, "%s %d\n", val->string, BOND_MODE(bond));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 34 | 52.31% | 1 | 20.00% |
Nikolay Aleksandrov | 16 | 24.62% | 1 | 20.00% |
Greg Kroah-Hartman | 8 | 12.31% | 1 | 20.00% |
Veaceslav Falico | 6 | 9.23% | 1 | 20.00% |
Stephen Hemminger | 1 | 1.54% | 1 | 20.00% |
Total | 65 | 100.00% | 5 | 100.00% |
static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
bonding_show_mode, bonding_sysfs_store_option);
/* Show the bonding transmit hash method. */
static ssize_t bonding_show_xmit_hash(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_XMIT_HASH, bond->params.xmit_policy);
return sprintf(buf, "%s %d\n", val->string, bond->params.xmit_policy);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 37 | 55.22% | 1 | 20.00% |
Nikolay Aleksandrov | 20 | 29.85% | 1 | 20.00% |
Greg Kroah-Hartman | 8 | 11.94% | 1 | 20.00% |
Stephen Hemminger | 1 | 1.49% | 1 | 20.00% |
Wagner Ferenc | 1 | 1.49% | 1 | 20.00% |
Total | 67 | 100.00% | 5 | 100.00% |
static DEVICE_ATTR(xmit_hash_policy, S_IRUGO | S_IWUSR,
bonding_show_xmit_hash, bonding_sysfs_store_option);
/* Show arp_validate. */
static ssize_t bonding_show_arp_validate(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_ARP_VALIDATE,
bond->params.arp_validate);
return sprintf(buf, "%s %d\n", val->string, bond->params.arp_validate);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 32 | 47.76% | 2 | 40.00% |
Mitch A Williams | 26 | 38.81% | 1 | 20.00% |
Greg Kroah-Hartman | 8 | 11.94% | 1 | 20.00% |
Stephen Hemminger | 1 | 1.49% | 1 | 20.00% |
Total | 67 | 100.00% | 5 | 100.00% |
static DEVICE_ATTR(arp_validate, S_IRUGO | S_IWUSR, bonding_show_arp_validate,
bonding_sysfs_store_option);
/* Show arp_all_targets. */
static ssize_t bonding_show_arp_all_targets(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_ARP_ALL_TARGETS,
bond->params.arp_all_targets);
return sprintf(buf, "%s %d\n",
val->string, bond->params.arp_all_targets);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jay Vosburgh | 36 | 53.73% | 1 | 20.00% |
Nikolay Aleksandrov | 22 | 32.84% | 2 | 40.00% |
Greg Kroah-Hartman | 8 | 11.94% | 1 | 20.00% |
Stephen Hemminger | 1 | 1.49% | 1 | 20.00% |
Total | 67 | 100.00% | 5 | 100.00% |
static DEVICE_ATTR(arp_all_targets, S_IRUGO | S_IWUSR,
bonding_show_arp_all_targets, bonding_sysfs_store_option);
/* Show fail_over_mac. */
static ssize_t bonding_show_fail_over_mac(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_FAIL_OVER_MAC,
bond->params.fail_over_mac);
return sprintf(buf, "%s %d\n", val->string, bond->params.fail_over_mac);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Veaceslav Falico | 43 | 64.18% | 1 | 25.00% |
Nikolay Aleksandrov | 23 | 34.33% | 2 | 50.00% |
Stephen Hemminger | 1 | 1.49% | 1 | 25.00% |
Total | 67 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(fail_over_mac, S_IRUGO | S_IWUSR,
bonding_show_fail_over_mac, bonding_sysfs_store_option);
/* Show the arp timer interval. */
static ssize_t bonding_show_arp_interval(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.arp_interval);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Veaceslav Falico | 33 | 75.00% | 1 | 33.33% |
Nikolay Aleksandrov | 11 | 25.00% | 2 | 66.67% |
Total | 44 | 100.00% | 3 | 100.00% |
static DEVICE_ATTR(arp_interval, S_IRUGO | S_IWUSR,
bonding_show_arp_interval, bonding_sysfs_store_option);
/* Show the arp targets. */
static ssize_t bonding_show_arp_targets(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
int i, res = 0;
for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
if (bond->params.arp_targets[i])
res += sprintf(buf + res, "%pI4 ",
&bond->params.arp_targets[i]);
}
if (res)
buf[res-1] = '\n'; /* eat the leftover space */
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 53 | 52.48% | 2 | 28.57% |
Jay Vosburgh | 42 | 41.58% | 2 | 28.57% |
sfeldma@cumulusnetworks.com | 5 | 4.95% | 2 | 28.57% |
Stephen Hemminger | 1 | 0.99% | 1 | 14.29% |
Total | 101 | 100.00% | 7 | 100.00% |
static DEVICE_ATTR(arp_ip_target, S_IRUGO | S_IWUSR,
bonding_show_arp_targets, bonding_sysfs_store_option);
/* Show the up and down delays. */
static ssize_t bonding_show_downdelay(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.downdelay * bond->params.miimon);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Ben Hutchings | 28 | 56.00% | 1 | 25.00% |
Nikolay Aleksandrov | 17 | 34.00% | 2 | 50.00% |
sfeldma@cumulusnetworks.com | 5 | 10.00% | 1 | 25.00% |
Total | 50 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(downdelay, S_IRUGO | S_IWUSR,
bonding_show_downdelay, bonding_sysfs_store_option);
static ssize_t bonding_show_updelay(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.updelay * bond->params.miimon);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 35 | 70.00% | 1 | 33.33% |
Greg Kroah-Hartman | 8 | 16.00% | 1 | 33.33% |
Nikolay Aleksandrov | 7 | 14.00% | 1 | 33.33% |
Total | 50 | 100.00% | 3 | 100.00% |
static DEVICE_ATTR(updelay, S_IRUGO | S_IWUSR,
bonding_show_updelay, bonding_sysfs_store_option);
/* Show the LACP interval. */
static ssize_t bonding_show_lacp(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_LACP_RATE, bond->params.lacp_fast);
return sprintf(buf, "%s %d\n", val->string, bond->params.lacp_fast);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 32 | 47.76% | 2 | 40.00% |
Mitch A Williams | 26 | 38.81% | 1 | 20.00% |
Greg Kroah-Hartman | 8 | 11.94% | 1 | 20.00% |
Stephen Hemminger | 1 | 1.49% | 1 | 20.00% |
Total | 67 | 100.00% | 5 | 100.00% |
static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR,
bonding_show_lacp, bonding_sysfs_store_option);
static ssize_t bonding_show_min_links(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%u\n", bond->params.min_links);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 30 | 68.18% | 1 | 25.00% |
Greg Kroah-Hartman | 8 | 18.18% | 1 | 25.00% |
Nikolay Aleksandrov | 5 | 11.36% | 1 | 25.00% |
David S. Miller | 1 | 2.27% | 1 | 25.00% |
Total | 44 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(min_links, S_IRUGO | S_IWUSR,
bonding_show_min_links, bonding_sysfs_store_option);
static ssize_t bonding_show_ad_select(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_AD_SELECT, bond->params.ad_select);
return sprintf(buf, "%s %d\n", val->string, bond->params.ad_select);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 32 | 47.76% | 3 | 50.00% |
Mitch A Williams | 24 | 35.82% | 1 | 16.67% |
Greg Kroah-Hartman | 8 | 11.94% | 1 | 16.67% |
Weiping Pan (潘卫平) | 3 | 4.48% | 1 | 16.67% |
Total | 67 | 100.00% | 6 | 100.00% |
static DEVICE_ATTR(ad_select, S_IRUGO | S_IWUSR,
bonding_show_ad_select, bonding_sysfs_store_option);
/* Show the number of peer notifications to send after a failover event. */
static ssize_t bonding_show_num_peer_notif(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.num_peer_notif);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jiri Pirko | 41 | 93.18% | 1 | 50.00% |
Nikolay Aleksandrov | 3 | 6.82% | 1 | 50.00% |
Total | 44 | 100.00% | 2 | 100.00% |
static DEVICE_ATTR(num_grat_arp, S_IRUGO | S_IWUSR,
bonding_show_num_peer_notif, bonding_sysfs_store_option);
static DEVICE_ATTR(num_unsol_na, S_IRUGO | S_IWUSR,
bonding_show_num_peer_notif, bonding_sysfs_store_option);
/* Show the MII monitor interval. */
static ssize_t bonding_show_miimon(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.miimon);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 34 | 77.27% | 1 | 33.33% |
Greg Kroah-Hartman | 8 | 18.18% | 1 | 33.33% |
Nikolay Aleksandrov | 2 | 4.55% | 1 | 33.33% |
Total | 44 | 100.00% | 3 | 100.00% |
static DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR,
bonding_show_miimon, bonding_sysfs_store_option);
/* Show the primary slave. */
static ssize_t bonding_show_primary(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
struct slave *primary;
int count = 0;
rcu_read_lock();
primary = rcu_dereference(bond->primary_slave);
if (primary)
count = sprintf(buf, "%s\n", primary->dev->name);
rcu_read_unlock();
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 41 | 53.25% | 3 | 50.00% |
Mitch A Williams | 27 | 35.06% | 1 | 16.67% |
Greg Kroah-Hartman | 8 | 10.39% | 1 | 16.67% |
Stephen Hemminger | 1 | 1.30% | 1 | 16.67% |
Total | 77 | 100.00% | 6 | 100.00% |
static DEVICE_ATTR(primary, S_IRUGO | S_IWUSR,
bonding_show_primary, bonding_sysfs_store_option);
/* Show the primary_reselect flag. */
static ssize_t bonding_show_primary_reselect(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
const struct bond_opt_value *val;
val = bond_opt_get_val(BOND_OPT_PRIMARY_RESELECT,
bond->params.primary_reselect);
return sprintf(buf, "%s %d\n",
val->string, bond->params.primary_reselect);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 32 | 47.76% | 1 | 25.00% |
Nikolay Aleksandrov | 27 | 40.30% | 2 | 50.00% |
Greg Kroah-Hartman | 8 | 11.94% | 1 | 25.00% |
Total | 67 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(primary_reselect, S_IRUGO | S_IWUSR,
bonding_show_primary_reselect, bonding_sysfs_store_option);
/* Show the use_carrier flag. */
static ssize_t bonding_show_carrier(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.use_carrier);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 44 | 100.00% | 1 | 100.00% |
Total | 44 | 100.00% | 1 | 100.00% |
static DEVICE_ATTR(use_carrier, S_IRUGO | S_IWUSR,
bonding_show_carrier, bonding_sysfs_store_option);
/* Show currently active_slave. */
static ssize_t bonding_show_active_slave(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
struct net_device *slave_dev;
int count = 0;
rcu_read_lock();
slave_dev = bond_option_active_slave_get_rcu(bond);
if (slave_dev)
count = sprintf(buf, "%s\n", slave_dev->name);
rcu_read_unlock();
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 32 | 43.84% | 2 | 28.57% |
Mitch A Williams | 29 | 39.73% | 1 | 14.29% |
Greg Kroah-Hartman | 8 | 10.96% | 1 | 14.29% |
Jiri Pirko | 3 | 4.11% | 2 | 28.57% |
Stephen Hemminger | 1 | 1.37% | 1 | 14.29% |
Total | 73 | 100.00% | 7 | 100.00% |
static DEVICE_ATTR(active_slave, S_IRUGO | S_IWUSR,
bonding_show_active_slave, bonding_sysfs_store_option);
/* Show link status of the bond interface. */
static ssize_t bonding_show_mii_status(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
bool active = netif_carrier_ok(bond->dev);
return sprintf(buf, "%s\n", active ? "up" : "down");
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 35 | 64.81% | 1 | 25.00% |
Eric Dumazet | 9 | 16.67% | 1 | 25.00% |
Greg Kroah-Hartman | 8 | 14.81% | 1 | 25.00% |
Jarod Wilson | 2 | 3.70% | 1 | 25.00% |
Total | 54 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(mii_status, S_IRUGO, bonding_show_mii_status, NULL);
/* Show current 802.3ad aggregator ID. */
static ssize_t bonding_show_ad_aggregator(struct device *d,
struct device_attribute *attr,
char *buf)
{
int count = 0;
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
struct ad_info ad_info;
count = sprintf(buf, "%d\n",
bond_3ad_get_active_agg_info(bond, &ad_info)
? 0 : ad_info.aggregator_id);
}
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 65 | 85.53% | 1 | 33.33% |
Greg Kroah-Hartman | 8 | 10.53% | 1 | 33.33% |
Veaceslav Falico | 3 | 3.95% | 1 | 33.33% |
Total | 76 | 100.00% | 3 | 100.00% |
static DEVICE_ATTR(ad_aggregator, S_IRUGO, bonding_show_ad_aggregator, NULL);
/* Show number of active 802.3ad ports. */
static ssize_t bonding_show_ad_num_ports(struct device *d,
struct device_attribute *attr,
char *buf)
{
int count = 0;
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
struct ad_info ad_info;
count = sprintf(buf, "%d\n",
bond_3ad_get_active_agg_info(bond, &ad_info)
? 0 : ad_info.ports);
}
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 65 | 85.53% | 1 | 33.33% |
Greg Kroah-Hartman | 8 | 10.53% | 1 | 33.33% |
Veaceslav Falico | 3 | 3.95% | 1 | 33.33% |
Total | 76 | 100.00% | 3 | 100.00% |
static DEVICE_ATTR(ad_num_ports, S_IRUGO, bonding_show_ad_num_ports, NULL);
/* Show current 802.3ad actor key. */
static ssize_t bonding_show_ad_actor_key(struct device *d,
struct device_attribute *attr,
char *buf)
{
int count = 0;
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD && capable(CAP_NET_ADMIN)) {
struct ad_info ad_info;
count = sprintf(buf, "%d\n",
bond_3ad_get_active_agg_info(bond, &ad_info)
? 0 : ad_info.actor_key);
}
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 65 | 80.25% | 1 | 25.00% |
Greg Kroah-Hartman | 8 | 9.88% | 1 | 25.00% |
Mahesh Bandewar | 5 | 6.17% | 1 | 25.00% |
Veaceslav Falico | 3 | 3.70% | 1 | 25.00% |
Total | 81 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(ad_actor_key, S_IRUGO, bonding_show_ad_actor_key, NULL);
/* Show current 802.3ad partner key. */
static ssize_t bonding_show_ad_partner_key(struct device *d,
struct device_attribute *attr,
char *buf)
{
int count = 0;
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD && capable(CAP_NET_ADMIN)) {
struct ad_info ad_info;
count = sprintf(buf, "%d\n",
bond_3ad_get_active_agg_info(bond, &ad_info)
? 0 : ad_info.partner_key);
}
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 65 | 80.25% | 1 | 25.00% |
Greg Kroah-Hartman | 8 | 9.88% | 1 | 25.00% |
Mahesh Bandewar | 5 | 6.17% | 1 | 25.00% |
Veaceslav Falico | 3 | 3.70% | 1 | 25.00% |
Total | 81 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(ad_partner_key, S_IRUGO, bonding_show_ad_partner_key, NULL);
/* Show current 802.3ad partner mac. */
static ssize_t bonding_show_ad_partner_mac(struct device *d,
struct device_attribute *attr,
char *buf)
{
int count = 0;
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD && capable(CAP_NET_ADMIN)) {
struct ad_info ad_info;
if (!bond_3ad_get_active_agg_info(bond, &ad_info))
count = sprintf(buf, "%pM\n", ad_info.partner_system);
}
return count;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 64 | 78.05% | 1 | 16.67% |
Greg Kroah-Hartman | 8 | 9.76% | 1 | 16.67% |
Mahesh Bandewar | 5 | 6.10% | 1 | 16.67% |
Veaceslav Falico | 3 | 3.66% | 1 | 16.67% |
Joe Perches | 1 | 1.22% | 1 | 16.67% |
Johannes Berg | 1 | 1.22% | 1 | 16.67% |
Total | 82 | 100.00% | 6 | 100.00% |
static DEVICE_ATTR(ad_partner_mac, S_IRUGO, bonding_show_ad_partner_mac, NULL);
/* Show the queue_ids of the slaves in the current bond. */
static ssize_t bonding_show_queue_id(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
struct list_head *iter;
struct slave *slave;
int res = 0;
if (!rtnl_trylock())
return restart_syscall();
bond_for_each_slave(bond, slave, iter) {
if (res > (PAGE_SIZE - IFNAMSIZ - 6)) {
/* not enough space for another interface_name:queue_id pair */
if ((PAGE_SIZE - res) > 10)
res = PAGE_SIZE - 10;
res += sprintf(buf + res, "++more++ ");
break;
}
res += sprintf(buf + res, "%s:%d ",
slave->dev->name, slave->queue_id);
}
if (res)
buf[res-1] = '\n'; /* eat the leftover space */
rtnl_unlock();
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andy Gospodarek | 129 | 86.58% | 1 | 25.00% |
Nikolay Aleksandrov | 10 | 6.71% | 1 | 25.00% |
Veaceslav Falico | 7 | 4.70% | 1 | 25.00% |
Nicolas de Pesloüan | 3 | 2.01% | 1 | 25.00% |
Total | 149 | 100.00% | 4 | 100.00% |
static DEVICE_ATTR(queue_id, S_IRUGO | S_IWUSR, bonding_show_queue_id,
bonding_sysfs_store_option);
/* Show the all_slaves_active flag. */
static ssize_t bonding_show_slaves_active(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.all_slaves_active);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Flavio Leitner | 42 | 95.45% | 1 | 50.00% |
Nikolay Aleksandrov | 2 | 4.55% | 1 | 50.00% |
Total | 44 | 100.00% | 2 | 100.00% |
static DEVICE_ATTR(all_slaves_active, S_IRUGO | S_IWUSR,
bonding_show_slaves_active, bonding_sysfs_store_option);
/* Show the number of IGMP membership reports to send on link failure */
static ssize_t bonding_show_resend_igmp(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.resend_igmp);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Flavio Leitner | 33 | 75.00% | 1 | 33.33% |
Nikolay Aleksandrov | 11 | 25.00% | 2 | 66.67% |
Total | 44 | 100.00% | 3 | 100.00% |
static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR,
bonding_show_resend_igmp, bonding_sysfs_store_option);
static ssize_t bonding_show_lp_interval(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.lp_interval);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Neil Horman | 44 | 100.00% | 1 | 100.00% |
Total | 44 | 100.00% | 1 | 100.00% |
static DEVICE_ATTR(lp_interval, S_IRUGO | S_IWUSR,
bonding_show_lp_interval, bonding_sysfs_store_option);
static ssize_t bonding_show_tlb_dynamic_lb(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.tlb_dynamic_lb);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mahesh Bandewar | 44 | 100.00% | 1 | 100.00% |
Total | 44 | 100.00% | 1 | 100.00% |
static DEVICE_ATTR(tlb_dynamic_lb, S_IRUGO | S_IWUSR,
bonding_show_tlb_dynamic_lb, bonding_sysfs_store_option);
static ssize_t bonding_show_packets_per_slave(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
unsigned int packets_per_slave = bond->params.packets_per_slave;
return sprintf(buf, "%u\n", packets_per_slave);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Nikolay Aleksandrov | 50 | 100.00% | 2 | 100.00% |
Total | 50 | 100.00% | 2 | 100.00% |
static DEVICE_ATTR(packets_per_slave, S_IRUGO | S_IWUSR,
bonding_show_packets_per_slave, bonding_sysfs_store_option);
static ssize_t bonding_show_ad_actor_sys_prio(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD && capable(CAP_NET_ADMIN))
return sprintf(buf, "%hu\n", bond->params.ad_actor_sys_prio);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mahesh Bandewar | 61 | 100.00% | 2 | 100.00% |
Total | 61 | 100.00% | 2 | 100.00% |
static DEVICE_ATTR(ad_actor_sys_prio, S_IRUGO | S_IWUSR,
bonding_show_ad_actor_sys_prio, bonding_sysfs_store_option);
static ssize_t bonding_show_ad_actor_system(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD && capable(CAP_NET_ADMIN))
return sprintf(buf, "%pM\n", bond->params.ad_actor_system);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mahesh Bandewar | 61 | 100.00% | 2 | 100.00% |
Total | 61 | 100.00% | 2 | 100.00% |
static DEVICE_ATTR(ad_actor_system, S_IRUGO | S_IWUSR,
bonding_show_ad_actor_system, bonding_sysfs_store_option);
static ssize_t bonding_show_ad_user_port_key(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
if (BOND_MODE(bond) == BOND_MODE_8023AD && capable(CAP_NET_ADMIN))
return sprintf(buf, "%hu\n", bond->params.ad_user_port_key);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mahesh Bandewar | 61 | 100.00% | 2 | 100.00% |
Total | 61 | 100.00% | 2 | 100.00% |
static DEVICE_ATTR(ad_user_port_key, S_IRUGO | S_IWUSR,
bonding_show_ad_user_port_key, bonding_sysfs_store_option);
static struct attribute *per_bond_attrs[] = {
&dev_attr_slaves.attr,
&dev_attr_mode.attr,
&dev_attr_fail_over_mac.attr,
&dev_attr_arp_validate.attr,
&dev_attr_arp_all_targets.attr,
&dev_attr_arp_interval.attr,
&dev_attr_arp_ip_target.attr,
&dev_attr_downdelay.attr,
&dev_attr_updelay.attr,
&dev_attr_lacp_rate.attr,
&dev_attr_ad_select.attr,
&dev_attr_xmit_hash_policy.attr,
&dev_attr_num_grat_arp.attr,
&dev_attr_num_unsol_na.attr,
&dev_attr_miimon.attr,
&dev_attr_primary.attr,
&dev_attr_primary_reselect.attr,
&dev_attr_use_carrier.attr,
&dev_attr_active_slave.attr,
&dev_attr_mii_status.attr,
&dev_attr_ad_aggregator.attr,
&dev_attr_ad_num_ports.attr,
&dev_attr_ad_actor_key.attr,
&dev_attr_ad_partner_key.attr,
&dev_attr_ad_partner_mac.attr,
&dev_attr_queue_id.attr,
&dev_attr_all_slaves_active.attr,
&dev_attr_resend_igmp.attr,
&dev_attr_min_links.attr,
&dev_attr_lp_interval.attr,
&dev_attr_packets_per_slave.attr,
&dev_attr_tlb_dynamic_lb.attr,
&dev_attr_ad_actor_sys_prio.attr,
&dev_attr_ad_actor_system.attr,
&dev_attr_ad_user_port_key.attr,
NULL,
};
static struct attribute_group bonding_group = {
.name = "bonding",
.attrs = per_bond_attrs,
};
/* Initialize sysfs. This sets up the bonding_masters file in
* /sys/class/net.
*/
int bond_create_sysfs(struct bond_net *bn)
{
int ret;
bn->class_attr_bonding_masters = class_attr_bonding_masters;
sysfs_attr_init(&bn->class_attr_bonding_masters.attr);
ret = netdev_class_create_file_ns(&bn->class_attr_bonding_masters,
bn->net);
/* Permit multiple loads of the module by ignoring failures to
* create the bonding_masters sysfs file. Bonding devices
* created by second or subsequent loads of the module will
* not be listed in, or controllable by, bonding_masters, but
* will have the usual "bonding" sysfs directory.
*
* This is done to preserve backwards compatibility for
* initscripts/sysconfig, which load bonding multiple times to
* configure multiple bonding devices.
*/
if (ret == -EEXIST) {
/* Is someone being kinky and naming a device bonding_master? */
if (__dev_get_by_name(bn->net,
class_attr_bonding_masters.attr.name))
pr_err("network device named %s already exists in sysfs\n",
class_attr_bonding_masters.attr.name);
ret = 0;
}
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Stephen Hemminger | 27 | 31.03% | 2 | 20.00% |
Eric W. Biedermann | 25 | 28.74% | 2 | 20.00% |
Mitch A Williams | 19 | 21.84% | 1 | 10.00% |
Jay Vosburgh | 8 | 9.20% | 1 | 10.00% |
Tejun Heo | 5 | 5.75% | 1 | 10.00% |
Jiri Pirko | 1 | 1.15% | 1 | 10.00% |
Nikolay Aleksandrov | 1 | 1.15% | 1 | 10.00% |
Joe Perches | 1 | 1.15% | 1 | 10.00% |
Total | 87 | 100.00% | 10 | 100.00% |
/* Remove /sys/class/net/bonding_masters. */
void bond_destroy_sysfs(struct bond_net *bn)
{
netdev_class_remove_file_ns(&bn->class_attr_bonding_masters, bn->net);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 11 | 50.00% | 1 | 33.33% |
Eric W. Biedermann | 6 | 27.27% | 1 | 33.33% |
Tejun Heo | 5 | 22.73% | 1 | 33.33% |
Total | 22 | 100.00% | 3 | 100.00% |
/* Initialize sysfs for each bond. This sets up and registers
* the 'bondctl' directory for each individual bond under /sys/class/net.
*/
void bond_prepare_sysfs_group(struct bonding *bond)
{
bond->dev->sysfs_groups[0] = &bonding_group;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 16 | 72.73% | 1 | 50.00% |
Eric W. Biedermann | 6 | 27.27% | 1 | 50.00% |
Total | 22 | 100.00% | 2 | 100.00% |
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mitch A Williams | 1369 | 36.61% | 1 | 1.23% |
Nikolay Aleksandrov | 807 | 21.58% | 19 | 23.46% |
Mahesh Bandewar | 317 | 8.48% | 5 | 6.17% |
Greg Kroah-Hartman | 185 | 4.95% | 1 | 1.23% |
Andy Gospodarek | 151 | 4.04% | 2 | 2.47% |
Stephen Hemminger | 140 | 3.74% | 9 | 11.11% |
Jay Vosburgh | 135 | 3.61% | 6 | 7.41% |
Veaceslav Falico | 127 | 3.40% | 3 | 3.70% |
Eric W. Biedermann | 118 | 3.16% | 5 | 6.17% |
Flavio Leitner | 93 | 2.49% | 1 | 1.23% |
Neil Horman | 62 | 1.66% | 1 | 1.23% |
Jiri Pirko | 61 | 1.63% | 3 | 3.70% |
Ben Hutchings | 49 | 1.31% | 1 | 1.23% |
Wagner Ferenc | 27 | 0.72% | 3 | 3.70% |
Phil Oester | 16 | 0.43% | 1 | 1.23% |
Joe Perches | 15 | 0.40% | 3 | 3.70% |
Ding Tianhong | 12 | 0.32% | 1 | 1.23% |
sfeldma@cumulusnetworks.com | 10 | 0.27% | 3 | 3.70% |
Andi Kleen | 10 | 0.27% | 1 | 1.23% |
Tejun Heo | 10 | 0.27% | 1 | 1.23% |
Eric Dumazet | 9 | 0.24% | 1 | 1.23% |
Nicolas de Pesloüan | 3 | 0.08% | 1 | 1.23% |
Weiping Pan (潘卫平) | 3 | 0.08% | 1 | 1.23% |
David S. Miller | 2 | 0.05% | 2 | 2.47% |
Jarod Wilson | 2 | 0.05% | 1 | 1.23% |
Alexey Dobriyan | 2 | 0.05% | 1 | 1.23% |
Ingo Molnar | 1 | 0.03% | 1 | 1.23% |
Johannes Berg | 1 | 0.03% | 1 | 1.23% |
Jeff Kirsher | 1 | 0.03% | 1 | 1.23% |
Wang Chen | 1 | 0.03% | 1 | 1.23% |
Total | 3739 | 100.00% | 81 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.