root/drivers/net/bonding/bond_sysfs_slave.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. state_show
  2. mii_status_show
  3. link_failure_count_show
  4. perm_hwaddr_show
  5. queue_id_show
  6. ad_aggregator_id_show
  7. ad_actor_oper_port_state_show
  8. ad_partner_oper_port_state_show
  9. slave_show
  10. bond_sysfs_slave_add
  11. bond_sysfs_slave_del

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*      Sysfs attributes of bond slaves
   3  *
   4  *      Copyright (c) 2014 Scott Feldman <sfeldma@cumulusnetworks.com>
   5  */
   6 
   7 #include <linux/capability.h>
   8 #include <linux/kernel.h>
   9 #include <linux/netdevice.h>
  10 
  11 #include <net/bonding.h>
  12 
  13 struct slave_attribute {
  14         struct attribute attr;
  15         ssize_t (*show)(struct slave *, char *);
  16 };
  17 
  18 #define SLAVE_ATTR(_name, _mode, _show)                         \
  19 const struct slave_attribute slave_attr_##_name = {             \
  20         .attr = {.name = __stringify(_name),                    \
  21                  .mode = _mode },                               \
  22         .show   = _show,                                        \
  23 };
  24 #define SLAVE_ATTR_RO(_name)                                    \
  25         SLAVE_ATTR(_name, 0444, _name##_show)
  26 
  27 static ssize_t state_show(struct slave *slave, char *buf)
  28 {
  29         switch (bond_slave_state(slave)) {
  30         case BOND_STATE_ACTIVE:
  31                 return sprintf(buf, "active\n");
  32         case BOND_STATE_BACKUP:
  33                 return sprintf(buf, "backup\n");
  34         default:
  35                 return sprintf(buf, "UNKNOWN\n");
  36         }
  37 }
  38 static SLAVE_ATTR_RO(state);
  39 
  40 static ssize_t mii_status_show(struct slave *slave, char *buf)
  41 {
  42         return sprintf(buf, "%s\n", bond_slave_link_status(slave->link));
  43 }
  44 static SLAVE_ATTR_RO(mii_status);
  45 
  46 static ssize_t link_failure_count_show(struct slave *slave, char *buf)
  47 {
  48         return sprintf(buf, "%d\n", slave->link_failure_count);
  49 }
  50 static SLAVE_ATTR_RO(link_failure_count);
  51 
  52 static ssize_t perm_hwaddr_show(struct slave *slave, char *buf)
  53 {
  54         return sprintf(buf, "%*phC\n",
  55                        slave->dev->addr_len,
  56                        slave->perm_hwaddr);
  57 }
  58 static SLAVE_ATTR_RO(perm_hwaddr);
  59 
  60 static ssize_t queue_id_show(struct slave *slave, char *buf)
  61 {
  62         return sprintf(buf, "%d\n", slave->queue_id);
  63 }
  64 static SLAVE_ATTR_RO(queue_id);
  65 
  66 static ssize_t ad_aggregator_id_show(struct slave *slave, char *buf)
  67 {
  68         const struct aggregator *agg;
  69 
  70         if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
  71                 agg = SLAVE_AD_INFO(slave)->port.aggregator;
  72                 if (agg)
  73                         return sprintf(buf, "%d\n",
  74                                        agg->aggregator_identifier);
  75         }
  76 
  77         return sprintf(buf, "N/A\n");
  78 }
  79 static SLAVE_ATTR_RO(ad_aggregator_id);
  80 
  81 static ssize_t ad_actor_oper_port_state_show(struct slave *slave, char *buf)
  82 {
  83         const struct port *ad_port;
  84 
  85         if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
  86                 ad_port = &SLAVE_AD_INFO(slave)->port;
  87                 if (ad_port->aggregator)
  88                         return sprintf(buf, "%u\n",
  89                                        ad_port->actor_oper_port_state);
  90         }
  91 
  92         return sprintf(buf, "N/A\n");
  93 }
  94 static SLAVE_ATTR_RO(ad_actor_oper_port_state);
  95 
  96 static ssize_t ad_partner_oper_port_state_show(struct slave *slave, char *buf)
  97 {
  98         const struct port *ad_port;
  99 
 100         if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
 101                 ad_port = &SLAVE_AD_INFO(slave)->port;
 102                 if (ad_port->aggregator)
 103                         return sprintf(buf, "%u\n",
 104                                        ad_port->partner_oper.port_state);
 105         }
 106 
 107         return sprintf(buf, "N/A\n");
 108 }
 109 static SLAVE_ATTR_RO(ad_partner_oper_port_state);
 110 
 111 static const struct slave_attribute *slave_attrs[] = {
 112         &slave_attr_state,
 113         &slave_attr_mii_status,
 114         &slave_attr_link_failure_count,
 115         &slave_attr_perm_hwaddr,
 116         &slave_attr_queue_id,
 117         &slave_attr_ad_aggregator_id,
 118         &slave_attr_ad_actor_oper_port_state,
 119         &slave_attr_ad_partner_oper_port_state,
 120         NULL
 121 };
 122 
 123 #define to_slave_attr(_at) container_of(_at, struct slave_attribute, attr)
 124 #define to_slave(obj)   container_of(obj, struct slave, kobj)
 125 
 126 static ssize_t slave_show(struct kobject *kobj,
 127                           struct attribute *attr, char *buf)
 128 {
 129         struct slave_attribute *slave_attr = to_slave_attr(attr);
 130         struct slave *slave = to_slave(kobj);
 131 
 132         return slave_attr->show(slave, buf);
 133 }
 134 
 135 static const struct sysfs_ops slave_sysfs_ops = {
 136         .show = slave_show,
 137 };
 138 
 139 static struct kobj_type slave_ktype = {
 140 #ifdef CONFIG_SYSFS
 141         .sysfs_ops = &slave_sysfs_ops,
 142 #endif
 143 };
 144 
 145 int bond_sysfs_slave_add(struct slave *slave)
 146 {
 147         const struct slave_attribute **a;
 148         int err;
 149 
 150         err = kobject_init_and_add(&slave->kobj, &slave_ktype,
 151                                    &(slave->dev->dev.kobj), "bonding_slave");
 152         if (err) {
 153                 kobject_put(&slave->kobj);
 154                 return err;
 155         }
 156 
 157         for (a = slave_attrs; *a; ++a) {
 158                 err = sysfs_create_file(&slave->kobj, &((*a)->attr));
 159                 if (err) {
 160                         kobject_put(&slave->kobj);
 161                         return err;
 162                 }
 163         }
 164 
 165         return 0;
 166 }
 167 
 168 void bond_sysfs_slave_del(struct slave *slave)
 169 {
 170         const struct slave_attribute **a;
 171 
 172         for (a = slave_attrs; *a; ++a)
 173                 sysfs_remove_file(&slave->kobj, &((*a)->attr));
 174 
 175         kobject_put(&slave->kobj);
 176 }

/* [<][>][^][v][top][bottom][index][help] */