linux/net/batman-adv/sysfs.c
<<
>>
Prefs
   1/* Copyright (C) 2010-2015 B.A.T.M.A.N. contributors:
   2 *
   3 * Marek Lindner
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of version 2 of the GNU General Public
   7 * License as published by the Free Software Foundation.
   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
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12 * General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
  16 */
  17
  18#include "sysfs.h"
  19#include "main.h"
  20
  21#include <linux/atomic.h>
  22#include <linux/compiler.h>
  23#include <linux/device.h>
  24#include <linux/errno.h>
  25#include <linux/fs.h>
  26#include <linux/if.h>
  27#include <linux/if_vlan.h>
  28#include <linux/kernel.h>
  29#include <linux/netdevice.h>
  30#include <linux/printk.h>
  31#include <linux/rculist.h>
  32#include <linux/rcupdate.h>
  33#include <linux/rtnetlink.h>
  34#include <linux/slab.h>
  35#include <linux/stat.h>
  36#include <linux/stddef.h>
  37#include <linux/string.h>
  38#include <linux/stringify.h>
  39
  40#include "distributed-arp-table.h"
  41#include "gateway_client.h"
  42#include "gateway_common.h"
  43#include "hard-interface.h"
  44#include "network-coding.h"
  45#include "packet.h"
  46#include "soft-interface.h"
  47
  48static struct net_device *batadv_kobj_to_netdev(struct kobject *obj)
  49{
  50        struct device *dev = container_of(obj->parent, struct device, kobj);
  51
  52        return to_net_dev(dev);
  53}
  54
  55static struct batadv_priv *batadv_kobj_to_batpriv(struct kobject *obj)
  56{
  57        struct net_device *net_dev = batadv_kobj_to_netdev(obj);
  58
  59        return netdev_priv(net_dev);
  60}
  61
  62/**
  63 * batadv_vlan_kobj_to_batpriv - convert a vlan kobj in the associated batpriv
  64 * @obj: kobject to covert
  65 *
  66 * Returns the associated batadv_priv struct.
  67 */
  68static struct batadv_priv *batadv_vlan_kobj_to_batpriv(struct kobject *obj)
  69{
  70        /* VLAN specific attributes are located in the root sysfs folder if they
  71         * refer to the untagged VLAN..
  72         */
  73        if (!strcmp(BATADV_SYSFS_IF_MESH_SUBDIR, obj->name))
  74                return batadv_kobj_to_batpriv(obj);
  75
  76        /* ..while the attributes for the tagged vlans are located in
  77         * the in the corresponding "vlan%VID" subfolder
  78         */
  79        return batadv_kobj_to_batpriv(obj->parent);
  80}
  81
  82/**
  83 * batadv_kobj_to_vlan - convert a kobj in the associated softif_vlan struct
  84 * @obj: kobject to covert
  85 *
  86 * Returns the associated softif_vlan struct if found, NULL otherwise.
  87 */
  88static struct batadv_softif_vlan *
  89batadv_kobj_to_vlan(struct batadv_priv *bat_priv, struct kobject *obj)
  90{
  91        struct batadv_softif_vlan *vlan_tmp, *vlan = NULL;
  92
  93        rcu_read_lock();
  94        hlist_for_each_entry_rcu(vlan_tmp, &bat_priv->softif_vlan_list, list) {
  95                if (vlan_tmp->kobj != obj)
  96                        continue;
  97
  98                if (!atomic_inc_not_zero(&vlan_tmp->refcount))
  99                        continue;
 100
 101                vlan = vlan_tmp;
 102                break;
 103        }
 104        rcu_read_unlock();
 105
 106        return vlan;
 107}
 108
 109#define BATADV_UEV_TYPE_VAR     "BATTYPE="
 110#define BATADV_UEV_ACTION_VAR   "BATACTION="
 111#define BATADV_UEV_DATA_VAR     "BATDATA="
 112
 113static char *batadv_uev_action_str[] = {
 114        "add",
 115        "del",
 116        "change"
 117};
 118
 119static char *batadv_uev_type_str[] = {
 120        "gw"
 121};
 122
 123/* Use this, if you have customized show and store functions for vlan attrs */
 124#define BATADV_ATTR_VLAN(_name, _mode, _show, _store)   \
 125struct batadv_attribute batadv_attr_vlan_##_name = {    \
 126        .attr = {.name = __stringify(_name),            \
 127                 .mode = _mode },                       \
 128        .show   = _show,                                \
 129        .store  = _store,                               \
 130}
 131
 132/* Use this, if you have customized show and store functions */
 133#define BATADV_ATTR(_name, _mode, _show, _store)        \
 134struct batadv_attribute batadv_attr_##_name = {         \
 135        .attr = {.name = __stringify(_name),            \
 136                 .mode = _mode },                       \
 137        .show   = _show,                                \
 138        .store  = _store,                               \
 139}
 140
 141#define BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func)                   \
 142ssize_t batadv_store_##_name(struct kobject *kobj,                      \
 143                             struct attribute *attr, char *buff,        \
 144                             size_t count)                              \
 145{                                                                       \
 146        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);       \
 147        struct batadv_priv *bat_priv = netdev_priv(net_dev);            \
 148                                                                        \
 149        return __batadv_store_bool_attr(buff, count, _post_func, attr,  \
 150                                        &bat_priv->_name, net_dev);     \
 151}
 152
 153#define BATADV_ATTR_SIF_SHOW_BOOL(_name)                                \
 154ssize_t batadv_show_##_name(struct kobject *kobj,                       \
 155                            struct attribute *attr, char *buff)         \
 156{                                                                       \
 157        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);    \
 158                                                                        \
 159        return sprintf(buff, "%s\n",                                    \
 160                       atomic_read(&bat_priv->_name) == 0 ?             \
 161                       "disabled" : "enabled");                         \
 162}                                                                       \
 163
 164/* Use this, if you are going to turn a [name] in the soft-interface
 165 * (bat_priv) on or off
 166 */
 167#define BATADV_ATTR_SIF_BOOL(_name, _mode, _post_func)                  \
 168        static BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func)            \
 169        static BATADV_ATTR_SIF_SHOW_BOOL(_name)                         \
 170        static BATADV_ATTR(_name, _mode, batadv_show_##_name,           \
 171                           batadv_store_##_name)
 172
 173#define BATADV_ATTR_SIF_STORE_UINT(_name, _var, _min, _max, _post_func) \
 174ssize_t batadv_store_##_name(struct kobject *kobj,                      \
 175                             struct attribute *attr, char *buff,        \
 176                             size_t count)                              \
 177{                                                                       \
 178        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);       \
 179        struct batadv_priv *bat_priv = netdev_priv(net_dev);            \
 180                                                                        \
 181        return __batadv_store_uint_attr(buff, count, _min, _max,        \
 182                                        _post_func, attr,               \
 183                                        &bat_priv->_var, net_dev);      \
 184}
 185
 186#define BATADV_ATTR_SIF_SHOW_UINT(_name, _var)                          \
 187ssize_t batadv_show_##_name(struct kobject *kobj,                       \
 188                            struct attribute *attr, char *buff)         \
 189{                                                                       \
 190        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);    \
 191                                                                        \
 192        return sprintf(buff, "%i\n", atomic_read(&bat_priv->_var));     \
 193}                                                                       \
 194
 195/* Use this, if you are going to set [name] in the soft-interface
 196 * (bat_priv) to an unsigned integer value
 197 */
 198#define BATADV_ATTR_SIF_UINT(_name, _var, _mode, _min, _max, _post_func)\
 199        static BATADV_ATTR_SIF_STORE_UINT(_name, _var, _min, _max, _post_func)\
 200        static BATADV_ATTR_SIF_SHOW_UINT(_name, _var)                   \
 201        static BATADV_ATTR(_name, _mode, batadv_show_##_name,           \
 202                           batadv_store_##_name)
 203
 204#define BATADV_ATTR_VLAN_STORE_BOOL(_name, _post_func)                  \
 205ssize_t batadv_store_vlan_##_name(struct kobject *kobj,                 \
 206                                  struct attribute *attr, char *buff,   \
 207                                  size_t count)                         \
 208{                                                                       \
 209        struct batadv_priv *bat_priv = batadv_vlan_kobj_to_batpriv(kobj);\
 210        struct batadv_softif_vlan *vlan = batadv_kobj_to_vlan(bat_priv, \
 211                                                              kobj);    \
 212        size_t res = __batadv_store_bool_attr(buff, count, _post_func,  \
 213                                              attr, &vlan->_name,       \
 214                                              bat_priv->soft_iface);    \
 215                                                                        \
 216        batadv_softif_vlan_free_ref(vlan);                              \
 217        return res;                                                     \
 218}
 219
 220#define BATADV_ATTR_VLAN_SHOW_BOOL(_name)                               \
 221ssize_t batadv_show_vlan_##_name(struct kobject *kobj,                  \
 222                                 struct attribute *attr, char *buff)    \
 223{                                                                       \
 224        struct batadv_priv *bat_priv = batadv_vlan_kobj_to_batpriv(kobj);\
 225        struct batadv_softif_vlan *vlan = batadv_kobj_to_vlan(bat_priv, \
 226                                                              kobj);    \
 227        size_t res = sprintf(buff, "%s\n",                              \
 228                             atomic_read(&vlan->_name) == 0 ?           \
 229                             "disabled" : "enabled");                   \
 230                                                                        \
 231        batadv_softif_vlan_free_ref(vlan);                              \
 232        return res;                                                     \
 233}
 234
 235/* Use this, if you are going to turn a [name] in the vlan struct on or off */
 236#define BATADV_ATTR_VLAN_BOOL(_name, _mode, _post_func)                 \
 237        static BATADV_ATTR_VLAN_STORE_BOOL(_name, _post_func)           \
 238        static BATADV_ATTR_VLAN_SHOW_BOOL(_name)                        \
 239        static BATADV_ATTR_VLAN(_name, _mode, batadv_show_vlan_##_name, \
 240                                batadv_store_vlan_##_name)
 241
 242static int batadv_store_bool_attr(char *buff, size_t count,
 243                                  struct net_device *net_dev,
 244                                  const char *attr_name, atomic_t *attr)
 245{
 246        int enabled = -1;
 247
 248        if (buff[count - 1] == '\n')
 249                buff[count - 1] = '\0';
 250
 251        if ((strncmp(buff, "1", 2) == 0) ||
 252            (strncmp(buff, "enable", 7) == 0) ||
 253            (strncmp(buff, "enabled", 8) == 0))
 254                enabled = 1;
 255
 256        if ((strncmp(buff, "0", 2) == 0) ||
 257            (strncmp(buff, "disable", 8) == 0) ||
 258            (strncmp(buff, "disabled", 9) == 0))
 259                enabled = 0;
 260
 261        if (enabled < 0) {
 262                batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
 263                            attr_name, buff);
 264                return -EINVAL;
 265        }
 266
 267        if (atomic_read(attr) == enabled)
 268                return count;
 269
 270        batadv_info(net_dev, "%s: Changing from: %s to: %s\n", attr_name,
 271                    atomic_read(attr) == 1 ? "enabled" : "disabled",
 272                    enabled == 1 ? "enabled" : "disabled");
 273
 274        atomic_set(attr, (unsigned int)enabled);
 275        return count;
 276}
 277
 278static inline ssize_t
 279__batadv_store_bool_attr(char *buff, size_t count,
 280                         void (*post_func)(struct net_device *),
 281                         struct attribute *attr,
 282                         atomic_t *attr_store, struct net_device *net_dev)
 283{
 284        int ret;
 285
 286        ret = batadv_store_bool_attr(buff, count, net_dev, attr->name,
 287                                     attr_store);
 288        if (post_func && ret)
 289                post_func(net_dev);
 290
 291        return ret;
 292}
 293
 294static int batadv_store_uint_attr(const char *buff, size_t count,
 295                                  struct net_device *net_dev,
 296                                  const char *attr_name,
 297                                  unsigned int min, unsigned int max,
 298                                  atomic_t *attr)
 299{
 300        unsigned long uint_val;
 301        int ret;
 302
 303        ret = kstrtoul(buff, 10, &uint_val);
 304        if (ret) {
 305                batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
 306                            attr_name, buff);
 307                return -EINVAL;
 308        }
 309
 310        if (uint_val < min) {
 311                batadv_info(net_dev, "%s: Value is too small: %lu min: %u\n",
 312                            attr_name, uint_val, min);
 313                return -EINVAL;
 314        }
 315
 316        if (uint_val > max) {
 317                batadv_info(net_dev, "%s: Value is too big: %lu max: %u\n",
 318                            attr_name, uint_val, max);
 319                return -EINVAL;
 320        }
 321
 322        if (atomic_read(attr) == uint_val)
 323                return count;
 324
 325        batadv_info(net_dev, "%s: Changing from: %i to: %lu\n",
 326                    attr_name, atomic_read(attr), uint_val);
 327
 328        atomic_set(attr, uint_val);
 329        return count;
 330}
 331
 332static inline ssize_t
 333__batadv_store_uint_attr(const char *buff, size_t count,
 334                         int min, int max,
 335                         void (*post_func)(struct net_device *),
 336                         const struct attribute *attr,
 337                         atomic_t *attr_store, struct net_device *net_dev)
 338{
 339        int ret;
 340
 341        ret = batadv_store_uint_attr(buff, count, net_dev, attr->name, min, max,
 342                                     attr_store);
 343        if (post_func && ret)
 344                post_func(net_dev);
 345
 346        return ret;
 347}
 348
 349static ssize_t batadv_show_bat_algo(struct kobject *kobj,
 350                                    struct attribute *attr, char *buff)
 351{
 352        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 353
 354        return sprintf(buff, "%s\n", bat_priv->bat_algo_ops->name);
 355}
 356
 357static void batadv_post_gw_reselect(struct net_device *net_dev)
 358{
 359        struct batadv_priv *bat_priv = netdev_priv(net_dev);
 360
 361        batadv_gw_reselect(bat_priv);
 362}
 363
 364static ssize_t batadv_show_gw_mode(struct kobject *kobj, struct attribute *attr,
 365                                   char *buff)
 366{
 367        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 368        int bytes_written;
 369
 370        switch (atomic_read(&bat_priv->gw_mode)) {
 371        case BATADV_GW_MODE_CLIENT:
 372                bytes_written = sprintf(buff, "%s\n",
 373                                        BATADV_GW_MODE_CLIENT_NAME);
 374                break;
 375        case BATADV_GW_MODE_SERVER:
 376                bytes_written = sprintf(buff, "%s\n",
 377                                        BATADV_GW_MODE_SERVER_NAME);
 378                break;
 379        default:
 380                bytes_written = sprintf(buff, "%s\n",
 381                                        BATADV_GW_MODE_OFF_NAME);
 382                break;
 383        }
 384
 385        return bytes_written;
 386}
 387
 388static ssize_t batadv_store_gw_mode(struct kobject *kobj,
 389                                    struct attribute *attr, char *buff,
 390                                    size_t count)
 391{
 392        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
 393        struct batadv_priv *bat_priv = netdev_priv(net_dev);
 394        char *curr_gw_mode_str;
 395        int gw_mode_tmp = -1;
 396
 397        if (buff[count - 1] == '\n')
 398                buff[count - 1] = '\0';
 399
 400        if (strncmp(buff, BATADV_GW_MODE_OFF_NAME,
 401                    strlen(BATADV_GW_MODE_OFF_NAME)) == 0)
 402                gw_mode_tmp = BATADV_GW_MODE_OFF;
 403
 404        if (strncmp(buff, BATADV_GW_MODE_CLIENT_NAME,
 405                    strlen(BATADV_GW_MODE_CLIENT_NAME)) == 0)
 406                gw_mode_tmp = BATADV_GW_MODE_CLIENT;
 407
 408        if (strncmp(buff, BATADV_GW_MODE_SERVER_NAME,
 409                    strlen(BATADV_GW_MODE_SERVER_NAME)) == 0)
 410                gw_mode_tmp = BATADV_GW_MODE_SERVER;
 411
 412        if (gw_mode_tmp < 0) {
 413                batadv_info(net_dev,
 414                            "Invalid parameter for 'gw mode' setting received: %s\n",
 415                            buff);
 416                return -EINVAL;
 417        }
 418
 419        if (atomic_read(&bat_priv->gw_mode) == gw_mode_tmp)
 420                return count;
 421
 422        switch (atomic_read(&bat_priv->gw_mode)) {
 423        case BATADV_GW_MODE_CLIENT:
 424                curr_gw_mode_str = BATADV_GW_MODE_CLIENT_NAME;
 425                break;
 426        case BATADV_GW_MODE_SERVER:
 427                curr_gw_mode_str = BATADV_GW_MODE_SERVER_NAME;
 428                break;
 429        default:
 430                curr_gw_mode_str = BATADV_GW_MODE_OFF_NAME;
 431                break;
 432        }
 433
 434        batadv_info(net_dev, "Changing gw mode from: %s to: %s\n",
 435                    curr_gw_mode_str, buff);
 436
 437        /* Invoking batadv_gw_reselect() is not enough to really de-select the
 438         * current GW. It will only instruct the gateway client code to perform
 439         * a re-election the next time that this is needed.
 440         *
 441         * When gw client mode is being switched off the current GW must be
 442         * de-selected explicitly otherwise no GW_ADD uevent is thrown on
 443         * client mode re-activation. This is operation is performed in
 444         * batadv_gw_check_client_stop().
 445         */
 446        batadv_gw_reselect(bat_priv);
 447        /* always call batadv_gw_check_client_stop() before changing the gateway
 448         * state
 449         */
 450        batadv_gw_check_client_stop(bat_priv);
 451        atomic_set(&bat_priv->gw_mode, (unsigned int)gw_mode_tmp);
 452        batadv_gw_tvlv_container_update(bat_priv);
 453        return count;
 454}
 455
 456static ssize_t batadv_show_gw_bwidth(struct kobject *kobj,
 457                                     struct attribute *attr, char *buff)
 458{
 459        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 460        u32 down, up;
 461
 462        down = atomic_read(&bat_priv->gw.bandwidth_down);
 463        up = atomic_read(&bat_priv->gw.bandwidth_up);
 464
 465        return sprintf(buff, "%u.%u/%u.%u MBit\n", down / 10,
 466                       down % 10, up / 10, up % 10);
 467}
 468
 469static ssize_t batadv_store_gw_bwidth(struct kobject *kobj,
 470                                      struct attribute *attr, char *buff,
 471                                      size_t count)
 472{
 473        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
 474
 475        if (buff[count - 1] == '\n')
 476                buff[count - 1] = '\0';
 477
 478        return batadv_gw_bandwidth_set(net_dev, buff, count);
 479}
 480
 481/**
 482 * batadv_show_isolation_mark - print the current isolation mark/mask
 483 * @kobj: kobject representing the private mesh sysfs directory
 484 * @attr: the batman-adv attribute the user is interacting with
 485 * @buff: the buffer that will contain the data to send back to the user
 486 *
 487 * Returns the number of bytes written into 'buff' on success or a negative
 488 * error code in case of failure
 489 */
 490static ssize_t batadv_show_isolation_mark(struct kobject *kobj,
 491                                          struct attribute *attr, char *buff)
 492{
 493        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 494
 495        return sprintf(buff, "%#.8x/%#.8x\n", bat_priv->isolation_mark,
 496                       bat_priv->isolation_mark_mask);
 497}
 498
 499/**
 500 * batadv_store_isolation_mark - parse and store the isolation mark/mask entered
 501 *  by the user
 502 * @kobj: kobject representing the private mesh sysfs directory
 503 * @attr: the batman-adv attribute the user is interacting with
 504 * @buff: the buffer containing the user data
 505 * @count: number of bytes in the buffer
 506 *
 507 * Returns 'count' on success or a negative error code in case of failure
 508 */
 509static ssize_t batadv_store_isolation_mark(struct kobject *kobj,
 510                                           struct attribute *attr, char *buff,
 511                                           size_t count)
 512{
 513        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
 514        struct batadv_priv *bat_priv = netdev_priv(net_dev);
 515        u32 mark, mask;
 516        char *mask_ptr;
 517
 518        /* parse the mask if it has been specified, otherwise assume the mask is
 519         * the biggest possible
 520         */
 521        mask = 0xFFFFFFFF;
 522        mask_ptr = strchr(buff, '/');
 523        if (mask_ptr) {
 524                *mask_ptr = '\0';
 525                mask_ptr++;
 526
 527                /* the mask must be entered in hex base as it is going to be a
 528                 * bitmask and not a prefix length
 529                 */
 530                if (kstrtou32(mask_ptr, 16, &mask) < 0)
 531                        return -EINVAL;
 532        }
 533
 534        /* the mark can be entered in any base */
 535        if (kstrtou32(buff, 0, &mark) < 0)
 536                return -EINVAL;
 537
 538        bat_priv->isolation_mark_mask = mask;
 539        /* erase bits not covered by the mask */
 540        bat_priv->isolation_mark = mark & bat_priv->isolation_mark_mask;
 541
 542        batadv_info(net_dev,
 543                    "New skb mark for extended isolation: %#.8x/%#.8x\n",
 544                    bat_priv->isolation_mark, bat_priv->isolation_mark_mask);
 545
 546        return count;
 547}
 548
 549BATADV_ATTR_SIF_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
 550BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
 551#ifdef CONFIG_BATMAN_ADV_BLA
 552BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
 553#endif
 554#ifdef CONFIG_BATMAN_ADV_DAT
 555BATADV_ATTR_SIF_BOOL(distributed_arp_table, S_IRUGO | S_IWUSR,
 556                     batadv_dat_status_update);
 557#endif
 558BATADV_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
 559static BATADV_ATTR(routing_algo, S_IRUGO, batadv_show_bat_algo, NULL);
 560static BATADV_ATTR(gw_mode, S_IRUGO | S_IWUSR, batadv_show_gw_mode,
 561                   batadv_store_gw_mode);
 562BATADV_ATTR_SIF_UINT(orig_interval, orig_interval, S_IRUGO | S_IWUSR,
 563                     2 * BATADV_JITTER, INT_MAX, NULL);
 564BATADV_ATTR_SIF_UINT(hop_penalty, hop_penalty, S_IRUGO | S_IWUSR, 0,
 565                     BATADV_TQ_MAX_VALUE, NULL);
 566BATADV_ATTR_SIF_UINT(gw_sel_class, gw_sel_class, S_IRUGO | S_IWUSR, 1,
 567                     BATADV_TQ_MAX_VALUE, batadv_post_gw_reselect);
 568static BATADV_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth,
 569                   batadv_store_gw_bwidth);
 570#ifdef CONFIG_BATMAN_ADV_MCAST
 571BATADV_ATTR_SIF_BOOL(multicast_mode, S_IRUGO | S_IWUSR, NULL);
 572#endif
 573#ifdef CONFIG_BATMAN_ADV_DEBUG
 574BATADV_ATTR_SIF_UINT(log_level, log_level, S_IRUGO | S_IWUSR, 0,
 575                     BATADV_DBG_ALL, NULL);
 576#endif
 577#ifdef CONFIG_BATMAN_ADV_NC
 578BATADV_ATTR_SIF_BOOL(network_coding, S_IRUGO | S_IWUSR,
 579                     batadv_nc_status_update);
 580#endif
 581static BATADV_ATTR(isolation_mark, S_IRUGO | S_IWUSR,
 582                   batadv_show_isolation_mark, batadv_store_isolation_mark);
 583
 584static struct batadv_attribute *batadv_mesh_attrs[] = {
 585        &batadv_attr_aggregated_ogms,
 586        &batadv_attr_bonding,
 587#ifdef CONFIG_BATMAN_ADV_BLA
 588        &batadv_attr_bridge_loop_avoidance,
 589#endif
 590#ifdef CONFIG_BATMAN_ADV_DAT
 591        &batadv_attr_distributed_arp_table,
 592#endif
 593#ifdef CONFIG_BATMAN_ADV_MCAST
 594        &batadv_attr_multicast_mode,
 595#endif
 596        &batadv_attr_fragmentation,
 597        &batadv_attr_routing_algo,
 598        &batadv_attr_gw_mode,
 599        &batadv_attr_orig_interval,
 600        &batadv_attr_hop_penalty,
 601        &batadv_attr_gw_sel_class,
 602        &batadv_attr_gw_bandwidth,
 603#ifdef CONFIG_BATMAN_ADV_DEBUG
 604        &batadv_attr_log_level,
 605#endif
 606#ifdef CONFIG_BATMAN_ADV_NC
 607        &batadv_attr_network_coding,
 608#endif
 609        &batadv_attr_isolation_mark,
 610        NULL,
 611};
 612
 613BATADV_ATTR_VLAN_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
 614
 615/**
 616 * batadv_vlan_attrs - array of vlan specific sysfs attributes
 617 */
 618static struct batadv_attribute *batadv_vlan_attrs[] = {
 619        &batadv_attr_vlan_ap_isolation,
 620        NULL,
 621};
 622
 623int batadv_sysfs_add_meshif(struct net_device *dev)
 624{
 625        struct kobject *batif_kobject = &dev->dev.kobj;
 626        struct batadv_priv *bat_priv = netdev_priv(dev);
 627        struct batadv_attribute **bat_attr;
 628        int err;
 629
 630        bat_priv->mesh_obj = kobject_create_and_add(BATADV_SYSFS_IF_MESH_SUBDIR,
 631                                                    batif_kobject);
 632        if (!bat_priv->mesh_obj) {
 633                batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
 634                           BATADV_SYSFS_IF_MESH_SUBDIR);
 635                goto out;
 636        }
 637
 638        for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr) {
 639                err = sysfs_create_file(bat_priv->mesh_obj,
 640                                        &((*bat_attr)->attr));
 641                if (err) {
 642                        batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
 643                                   dev->name, BATADV_SYSFS_IF_MESH_SUBDIR,
 644                                   ((*bat_attr)->attr).name);
 645                        goto rem_attr;
 646                }
 647        }
 648
 649        return 0;
 650
 651rem_attr:
 652        for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
 653                sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
 654
 655        kobject_put(bat_priv->mesh_obj);
 656        bat_priv->mesh_obj = NULL;
 657out:
 658        return -ENOMEM;
 659}
 660
 661void batadv_sysfs_del_meshif(struct net_device *dev)
 662{
 663        struct batadv_priv *bat_priv = netdev_priv(dev);
 664        struct batadv_attribute **bat_attr;
 665
 666        for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
 667                sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
 668
 669        kobject_put(bat_priv->mesh_obj);
 670        bat_priv->mesh_obj = NULL;
 671}
 672
 673/**
 674 * batadv_sysfs_add_vlan - add all the needed sysfs objects for the new vlan
 675 * @dev: netdev of the mesh interface
 676 * @vlan: private data of the newly added VLAN interface
 677 *
 678 * Returns 0 on success and -ENOMEM if any of the structure allocations fails.
 679 */
 680int batadv_sysfs_add_vlan(struct net_device *dev,
 681                          struct batadv_softif_vlan *vlan)
 682{
 683        char vlan_subdir[sizeof(BATADV_SYSFS_VLAN_SUBDIR_PREFIX) + 5];
 684        struct batadv_priv *bat_priv = netdev_priv(dev);
 685        struct batadv_attribute **bat_attr;
 686        int err;
 687
 688        if (vlan->vid & BATADV_VLAN_HAS_TAG) {
 689                sprintf(vlan_subdir, BATADV_SYSFS_VLAN_SUBDIR_PREFIX "%hu",
 690                        vlan->vid & VLAN_VID_MASK);
 691
 692                vlan->kobj = kobject_create_and_add(vlan_subdir,
 693                                                    bat_priv->mesh_obj);
 694                if (!vlan->kobj) {
 695                        batadv_err(dev, "Can't add sysfs directory: %s/%s\n",
 696                                   dev->name, vlan_subdir);
 697                        goto out;
 698                }
 699        } else {
 700                /* the untagged LAN uses the root folder to store its "VLAN
 701                 * specific attributes"
 702                 */
 703                vlan->kobj = bat_priv->mesh_obj;
 704                kobject_get(bat_priv->mesh_obj);
 705        }
 706
 707        for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr) {
 708                err = sysfs_create_file(vlan->kobj,
 709                                        &((*bat_attr)->attr));
 710                if (err) {
 711                        batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
 712                                   dev->name, vlan_subdir,
 713                                   ((*bat_attr)->attr).name);
 714                        goto rem_attr;
 715                }
 716        }
 717
 718        return 0;
 719
 720rem_attr:
 721        for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr)
 722                sysfs_remove_file(vlan->kobj, &((*bat_attr)->attr));
 723
 724        kobject_put(vlan->kobj);
 725        vlan->kobj = NULL;
 726out:
 727        return -ENOMEM;
 728}
 729
 730/**
 731 * batadv_sysfs_del_vlan - remove all the sysfs objects for a given VLAN
 732 * @bat_priv: the bat priv with all the soft interface information
 733 * @vlan: the private data of the VLAN to destroy
 734 */
 735void batadv_sysfs_del_vlan(struct batadv_priv *bat_priv,
 736                           struct batadv_softif_vlan *vlan)
 737{
 738        struct batadv_attribute **bat_attr;
 739
 740        for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr)
 741                sysfs_remove_file(vlan->kobj, &((*bat_attr)->attr));
 742
 743        kobject_put(vlan->kobj);
 744        vlan->kobj = NULL;
 745}
 746
 747static ssize_t batadv_show_mesh_iface(struct kobject *kobj,
 748                                      struct attribute *attr, char *buff)
 749{
 750        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
 751        struct batadv_hard_iface *hard_iface;
 752        ssize_t length;
 753        const char *ifname;
 754
 755        hard_iface = batadv_hardif_get_by_netdev(net_dev);
 756        if (!hard_iface)
 757                return 0;
 758
 759        if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
 760                ifname =  "none";
 761        else
 762                ifname = hard_iface->soft_iface->name;
 763
 764        length = sprintf(buff, "%s\n", ifname);
 765
 766        batadv_hardif_free_ref(hard_iface);
 767
 768        return length;
 769}
 770
 771static ssize_t batadv_store_mesh_iface(struct kobject *kobj,
 772                                       struct attribute *attr, char *buff,
 773                                       size_t count)
 774{
 775        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
 776        struct batadv_hard_iface *hard_iface;
 777        int status_tmp = -1;
 778        int ret = count;
 779
 780        hard_iface = batadv_hardif_get_by_netdev(net_dev);
 781        if (!hard_iface)
 782                return count;
 783
 784        if (buff[count - 1] == '\n')
 785                buff[count - 1] = '\0';
 786
 787        if (strlen(buff) >= IFNAMSIZ) {
 788                pr_err("Invalid parameter for 'mesh_iface' setting received: interface name too long '%s'\n",
 789                       buff);
 790                batadv_hardif_free_ref(hard_iface);
 791                return -EINVAL;
 792        }
 793
 794        if (strncmp(buff, "none", 4) == 0)
 795                status_tmp = BATADV_IF_NOT_IN_USE;
 796        else
 797                status_tmp = BATADV_IF_I_WANT_YOU;
 798
 799        if (hard_iface->if_status == status_tmp)
 800                goto out;
 801
 802        if ((hard_iface->soft_iface) &&
 803            (strncmp(hard_iface->soft_iface->name, buff, IFNAMSIZ) == 0))
 804                goto out;
 805
 806        rtnl_lock();
 807
 808        if (status_tmp == BATADV_IF_NOT_IN_USE) {
 809                batadv_hardif_disable_interface(hard_iface,
 810                                                BATADV_IF_CLEANUP_AUTO);
 811                goto unlock;
 812        }
 813
 814        /* if the interface already is in use */
 815        if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
 816                batadv_hardif_disable_interface(hard_iface,
 817                                                BATADV_IF_CLEANUP_AUTO);
 818
 819        ret = batadv_hardif_enable_interface(hard_iface, buff);
 820
 821unlock:
 822        rtnl_unlock();
 823out:
 824        batadv_hardif_free_ref(hard_iface);
 825        return ret;
 826}
 827
 828static ssize_t batadv_show_iface_status(struct kobject *kobj,
 829                                        struct attribute *attr, char *buff)
 830{
 831        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
 832        struct batadv_hard_iface *hard_iface;
 833        ssize_t length;
 834
 835        hard_iface = batadv_hardif_get_by_netdev(net_dev);
 836        if (!hard_iface)
 837                return 0;
 838
 839        switch (hard_iface->if_status) {
 840        case BATADV_IF_TO_BE_REMOVED:
 841                length = sprintf(buff, "disabling\n");
 842                break;
 843        case BATADV_IF_INACTIVE:
 844                length = sprintf(buff, "inactive\n");
 845                break;
 846        case BATADV_IF_ACTIVE:
 847                length = sprintf(buff, "active\n");
 848                break;
 849        case BATADV_IF_TO_BE_ACTIVATED:
 850                length = sprintf(buff, "enabling\n");
 851                break;
 852        case BATADV_IF_NOT_IN_USE:
 853        default:
 854                length = sprintf(buff, "not in use\n");
 855                break;
 856        }
 857
 858        batadv_hardif_free_ref(hard_iface);
 859
 860        return length;
 861}
 862
 863static BATADV_ATTR(mesh_iface, S_IRUGO | S_IWUSR, batadv_show_mesh_iface,
 864                   batadv_store_mesh_iface);
 865static BATADV_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL);
 866
 867static struct batadv_attribute *batadv_batman_attrs[] = {
 868        &batadv_attr_mesh_iface,
 869        &batadv_attr_iface_status,
 870        NULL,
 871};
 872
 873int batadv_sysfs_add_hardif(struct kobject **hardif_obj, struct net_device *dev)
 874{
 875        struct kobject *hardif_kobject = &dev->dev.kobj;
 876        struct batadv_attribute **bat_attr;
 877        int err;
 878
 879        *hardif_obj = kobject_create_and_add(BATADV_SYSFS_IF_BAT_SUBDIR,
 880                                             hardif_kobject);
 881
 882        if (!*hardif_obj) {
 883                batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
 884                           BATADV_SYSFS_IF_BAT_SUBDIR);
 885                goto out;
 886        }
 887
 888        for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr) {
 889                err = sysfs_create_file(*hardif_obj, &((*bat_attr)->attr));
 890                if (err) {
 891                        batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
 892                                   dev->name, BATADV_SYSFS_IF_BAT_SUBDIR,
 893                                   ((*bat_attr)->attr).name);
 894                        goto rem_attr;
 895                }
 896        }
 897
 898        return 0;
 899
 900rem_attr:
 901        for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr)
 902                sysfs_remove_file(*hardif_obj, &((*bat_attr)->attr));
 903out:
 904        return -ENOMEM;
 905}
 906
 907void batadv_sysfs_del_hardif(struct kobject **hardif_obj)
 908{
 909        kobject_put(*hardif_obj);
 910        *hardif_obj = NULL;
 911}
 912
 913int batadv_throw_uevent(struct batadv_priv *bat_priv, enum batadv_uev_type type,
 914                        enum batadv_uev_action action, const char *data)
 915{
 916        int ret = -ENOMEM;
 917        struct kobject *bat_kobj;
 918        char *uevent_env[4] = { NULL, NULL, NULL, NULL };
 919
 920        bat_kobj = &bat_priv->soft_iface->dev.kobj;
 921
 922        uevent_env[0] = kasprintf(GFP_ATOMIC,
 923                                  "%s%s", BATADV_UEV_TYPE_VAR,
 924                                  batadv_uev_type_str[type]);
 925        if (!uevent_env[0])
 926                goto out;
 927
 928        uevent_env[1] = kasprintf(GFP_ATOMIC,
 929                                  "%s%s", BATADV_UEV_ACTION_VAR,
 930                                  batadv_uev_action_str[action]);
 931        if (!uevent_env[1])
 932                goto out;
 933
 934        /* If the event is DEL, ignore the data field */
 935        if (action != BATADV_UEV_DEL) {
 936                uevent_env[2] = kasprintf(GFP_ATOMIC,
 937                                          "%s%s", BATADV_UEV_DATA_VAR, data);
 938                if (!uevent_env[2])
 939                        goto out;
 940        }
 941
 942        ret = kobject_uevent_env(bat_kobj, KOBJ_CHANGE, uevent_env);
 943out:
 944        kfree(uevent_env[0]);
 945        kfree(uevent_env[1]);
 946        kfree(uevent_env[2]);
 947
 948        if (ret)
 949                batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
 950                           "Impossible to send uevent for (%s,%s,%s) event (err: %d)\n",
 951                           batadv_uev_type_str[type],
 952                           batadv_uev_action_str[action],
 953                           (action == BATADV_UEV_DEL ? "NULL" : data), ret);
 954        return ret;
 955}
 956