linux/net/bridge/br_sysfs_br.c
<<
>>
Prefs
   1/*
   2 *      Sysfs attributes of bridge ports
   3 *      Linux ethernet bridge
   4 *
   5 *      Authors:
   6 *      Stephen Hemminger               <shemminger@osdl.org>
   7 *
   8 *      This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License
  10 *      as published by the Free Software Foundation; either version
  11 *      2 of the License, or (at your option) any later version.
  12 */
  13
  14#include <linux/capability.h>
  15#include <linux/kernel.h>
  16#include <linux/netdevice.h>
  17#include <linux/if_bridge.h>
  18#include <linux/rtnetlink.h>
  19#include <linux/spinlock.h>
  20#include <linux/times.h>
  21
  22#include "br_private.h"
  23
  24#define to_dev(obj)     container_of(obj, struct device, kobj)
  25#define to_bridge(cd)   ((struct net_bridge *)netdev_priv(to_net_dev(cd)))
  26
  27/*
  28 * Common code for storing bridge parameters.
  29 */
  30static ssize_t store_bridge_parm(struct device *d,
  31                                 const char *buf, size_t len,
  32                                 int (*set)(struct net_bridge *, unsigned long))
  33{
  34        struct net_bridge *br = to_bridge(d);
  35        char *endp;
  36        unsigned long val;
  37        int err;
  38
  39        if (!capable(CAP_NET_ADMIN))
  40                return -EPERM;
  41
  42        val = simple_strtoul(buf, &endp, 0);
  43        if (endp == buf)
  44                return -EINVAL;
  45
  46        spin_lock_bh(&br->lock);
  47        err = (*set)(br, val);
  48        spin_unlock_bh(&br->lock);
  49        return err ? err : len;
  50}
  51
  52
  53static ssize_t show_forward_delay(struct device *d,
  54                                  struct device_attribute *attr, char *buf)
  55{
  56        struct net_bridge *br = to_bridge(d);
  57        return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->forward_delay));
  58}
  59
  60static int set_forward_delay(struct net_bridge *br, unsigned long val)
  61{
  62        unsigned long delay = clock_t_to_jiffies(val);
  63        br->forward_delay = delay;
  64        if (br_is_root_bridge(br))
  65                br->bridge_forward_delay = delay;
  66        return 0;
  67}
  68
  69static ssize_t store_forward_delay(struct device *d,
  70                                   struct device_attribute *attr,
  71                                   const char *buf, size_t len)
  72{
  73        return store_bridge_parm(d, buf, len, set_forward_delay);
  74}
  75static DEVICE_ATTR(forward_delay, S_IRUGO | S_IWUSR,
  76                   show_forward_delay, store_forward_delay);
  77
  78static ssize_t show_hello_time(struct device *d, struct device_attribute *attr,
  79                               char *buf)
  80{
  81        return sprintf(buf, "%lu\n",
  82                       jiffies_to_clock_t(to_bridge(d)->hello_time));
  83}
  84
  85static int set_hello_time(struct net_bridge *br, unsigned long val)
  86{
  87        unsigned long t = clock_t_to_jiffies(val);
  88
  89        if (t < HZ)
  90                return -EINVAL;
  91
  92        br->hello_time = t;
  93        if (br_is_root_bridge(br))
  94                br->bridge_hello_time = t;
  95        return 0;
  96}
  97
  98static ssize_t store_hello_time(struct device *d,
  99                                struct device_attribute *attr, const char *buf,
 100                                size_t len)
 101{
 102        return store_bridge_parm(d, buf, len, set_hello_time);
 103}
 104static DEVICE_ATTR(hello_time, S_IRUGO | S_IWUSR, show_hello_time,
 105                   store_hello_time);
 106
 107static ssize_t show_max_age(struct device *d, struct device_attribute *attr,
 108                            char *buf)
 109{
 110        return sprintf(buf, "%lu\n",
 111                       jiffies_to_clock_t(to_bridge(d)->max_age));
 112}
 113
 114static int set_max_age(struct net_bridge *br, unsigned long val)
 115{
 116        unsigned long t = clock_t_to_jiffies(val);
 117        br->max_age = t;
 118        if (br_is_root_bridge(br))
 119                br->bridge_max_age = t;
 120        return 0;
 121}
 122
 123static ssize_t store_max_age(struct device *d, struct device_attribute *attr,
 124                             const char *buf, size_t len)
 125{
 126        return store_bridge_parm(d, buf, len, set_max_age);
 127}
 128static DEVICE_ATTR(max_age, S_IRUGO | S_IWUSR, show_max_age, store_max_age);
 129
 130static ssize_t show_ageing_time(struct device *d,
 131                                struct device_attribute *attr, char *buf)
 132{
 133        struct net_bridge *br = to_bridge(d);
 134        return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->ageing_time));
 135}
 136
 137static int set_ageing_time(struct net_bridge *br, unsigned long val)
 138{
 139        br->ageing_time = clock_t_to_jiffies(val);
 140        return 0;
 141}
 142
 143static ssize_t store_ageing_time(struct device *d,
 144                                 struct device_attribute *attr,
 145                                 const char *buf, size_t len)
 146{
 147        return store_bridge_parm(d, buf, len, set_ageing_time);
 148}
 149static DEVICE_ATTR(ageing_time, S_IRUGO | S_IWUSR, show_ageing_time,
 150                   store_ageing_time);
 151
 152static ssize_t show_stp_state(struct device *d,
 153                              struct device_attribute *attr, char *buf)
 154{
 155        struct net_bridge *br = to_bridge(d);
 156        return sprintf(buf, "%d\n", br->stp_enabled);
 157}
 158
 159
 160static ssize_t store_stp_state(struct device *d,
 161                               struct device_attribute *attr, const char *buf,
 162                               size_t len)
 163{
 164        struct net_bridge *br = to_bridge(d);
 165        char *endp;
 166        unsigned long val;
 167
 168        if (!capable(CAP_NET_ADMIN))
 169                return -EPERM;
 170
 171        val = simple_strtoul(buf, &endp, 0);
 172        if (endp == buf)
 173                return -EINVAL;
 174
 175        if (!rtnl_trylock())
 176                return restart_syscall();
 177        br_stp_set_enabled(br, val);
 178        rtnl_unlock();
 179
 180        return len;
 181}
 182static DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state,
 183                   store_stp_state);
 184
 185static ssize_t show_priority(struct device *d, struct device_attribute *attr,
 186                             char *buf)
 187{
 188        struct net_bridge *br = to_bridge(d);
 189        return sprintf(buf, "%d\n",
 190                       (br->bridge_id.prio[0] << 8) | br->bridge_id.prio[1]);
 191}
 192
 193static int set_priority(struct net_bridge *br, unsigned long val)
 194{
 195        br_stp_set_bridge_priority(br, (u16) val);
 196        return 0;
 197}
 198
 199static ssize_t store_priority(struct device *d, struct device_attribute *attr,
 200                               const char *buf, size_t len)
 201{
 202        return store_bridge_parm(d, buf, len, set_priority);
 203}
 204static DEVICE_ATTR(priority, S_IRUGO | S_IWUSR, show_priority, store_priority);
 205
 206static ssize_t show_root_id(struct device *d, struct device_attribute *attr,
 207                            char *buf)
 208{
 209        return br_show_bridge_id(buf, &to_bridge(d)->designated_root);
 210}
 211static DEVICE_ATTR(root_id, S_IRUGO, show_root_id, NULL);
 212
 213static ssize_t show_bridge_id(struct device *d, struct device_attribute *attr,
 214                              char *buf)
 215{
 216        return br_show_bridge_id(buf, &to_bridge(d)->bridge_id);
 217}
 218static DEVICE_ATTR(bridge_id, S_IRUGO, show_bridge_id, NULL);
 219
 220static ssize_t show_root_port(struct device *d, struct device_attribute *attr,
 221                              char *buf)
 222{
 223        return sprintf(buf, "%d\n", to_bridge(d)->root_port);
 224}
 225static DEVICE_ATTR(root_port, S_IRUGO, show_root_port, NULL);
 226
 227static ssize_t show_root_path_cost(struct device *d,
 228                                   struct device_attribute *attr, char *buf)
 229{
 230        return sprintf(buf, "%d\n", to_bridge(d)->root_path_cost);
 231}
 232static DEVICE_ATTR(root_path_cost, S_IRUGO, show_root_path_cost, NULL);
 233
 234static ssize_t show_topology_change(struct device *d,
 235                                    struct device_attribute *attr, char *buf)
 236{
 237        return sprintf(buf, "%d\n", to_bridge(d)->topology_change);
 238}
 239static DEVICE_ATTR(topology_change, S_IRUGO, show_topology_change, NULL);
 240
 241static ssize_t show_topology_change_detected(struct device *d,
 242                                             struct device_attribute *attr,
 243                                             char *buf)
 244{
 245        struct net_bridge *br = to_bridge(d);
 246        return sprintf(buf, "%d\n", br->topology_change_detected);
 247}
 248static DEVICE_ATTR(topology_change_detected, S_IRUGO,
 249                   show_topology_change_detected, NULL);
 250
 251static ssize_t show_hello_timer(struct device *d,
 252                                struct device_attribute *attr, char *buf)
 253{
 254        struct net_bridge *br = to_bridge(d);
 255        return sprintf(buf, "%ld\n", br_timer_value(&br->hello_timer));
 256}
 257static DEVICE_ATTR(hello_timer, S_IRUGO, show_hello_timer, NULL);
 258
 259static ssize_t show_tcn_timer(struct device *d, struct device_attribute *attr,
 260                              char *buf)
 261{
 262        struct net_bridge *br = to_bridge(d);
 263        return sprintf(buf, "%ld\n", br_timer_value(&br->tcn_timer));
 264}
 265static DEVICE_ATTR(tcn_timer, S_IRUGO, show_tcn_timer, NULL);
 266
 267static ssize_t show_topology_change_timer(struct device *d,
 268                                          struct device_attribute *attr,
 269                                          char *buf)
 270{
 271        struct net_bridge *br = to_bridge(d);
 272        return sprintf(buf, "%ld\n", br_timer_value(&br->topology_change_timer));
 273}
 274static DEVICE_ATTR(topology_change_timer, S_IRUGO, show_topology_change_timer,
 275                   NULL);
 276
 277static ssize_t show_gc_timer(struct device *d, struct device_attribute *attr,
 278                             char *buf)
 279{
 280        struct net_bridge *br = to_bridge(d);
 281        return sprintf(buf, "%ld\n", br_timer_value(&br->gc_timer));
 282}
 283static DEVICE_ATTR(gc_timer, S_IRUGO, show_gc_timer, NULL);
 284
 285static ssize_t show_group_addr(struct device *d,
 286                               struct device_attribute *attr, char *buf)
 287{
 288        struct net_bridge *br = to_bridge(d);
 289        return sprintf(buf, "%x:%x:%x:%x:%x:%x\n",
 290                       br->group_addr[0], br->group_addr[1],
 291                       br->group_addr[2], br->group_addr[3],
 292                       br->group_addr[4], br->group_addr[5]);
 293}
 294
 295static ssize_t store_group_addr(struct device *d,
 296                                struct device_attribute *attr,
 297                                const char *buf, size_t len)
 298{
 299        struct net_bridge *br = to_bridge(d);
 300        unsigned new_addr[6];
 301        int i;
 302
 303        if (!capable(CAP_NET_ADMIN))
 304                return -EPERM;
 305
 306        if (sscanf(buf, "%x:%x:%x:%x:%x:%x",
 307                   &new_addr[0], &new_addr[1], &new_addr[2],
 308                   &new_addr[3], &new_addr[4], &new_addr[5]) != 6)
 309                return -EINVAL;
 310
 311        /* Must be 01:80:c2:00:00:0X */
 312        for (i = 0; i < 5; i++)
 313                if (new_addr[i] != br_group_address[i])
 314                        return -EINVAL;
 315
 316        if (new_addr[5] & ~0xf)
 317                return -EINVAL;
 318
 319        if (new_addr[5] == 1 ||         /* 802.3x Pause address */
 320            new_addr[5] == 2 ||         /* 802.3ad Slow protocols */
 321            new_addr[5] == 3)           /* 802.1X PAE address */
 322                return -EINVAL;
 323
 324        spin_lock_bh(&br->lock);
 325        for (i = 0; i < 6; i++)
 326                br->group_addr[i] = new_addr[i];
 327        spin_unlock_bh(&br->lock);
 328        return len;
 329}
 330
 331static DEVICE_ATTR(group_addr, S_IRUGO | S_IWUSR,
 332                   show_group_addr, store_group_addr);
 333
 334static ssize_t store_flush(struct device *d,
 335                           struct device_attribute *attr,
 336                           const char *buf, size_t len)
 337{
 338        struct net_bridge *br = to_bridge(d);
 339
 340        if (!capable(CAP_NET_ADMIN))
 341                return -EPERM;
 342
 343        br_fdb_flush(br);
 344        return len;
 345}
 346static DEVICE_ATTR(flush, S_IWUSR, NULL, store_flush);
 347
 348#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 349static ssize_t show_multicast_router(struct device *d,
 350                                     struct device_attribute *attr, char *buf)
 351{
 352        struct net_bridge *br = to_bridge(d);
 353        return sprintf(buf, "%d\n", br->multicast_router);
 354}
 355
 356static ssize_t store_multicast_router(struct device *d,
 357                                      struct device_attribute *attr,
 358                                      const char *buf, size_t len)
 359{
 360        return store_bridge_parm(d, buf, len, br_multicast_set_router);
 361}
 362static DEVICE_ATTR(multicast_router, S_IRUGO | S_IWUSR, show_multicast_router,
 363                   store_multicast_router);
 364
 365static ssize_t show_multicast_snooping(struct device *d,
 366                                       struct device_attribute *attr,
 367                                       char *buf)
 368{
 369        struct net_bridge *br = to_bridge(d);
 370        return sprintf(buf, "%d\n", !br->multicast_disabled);
 371}
 372
 373static ssize_t store_multicast_snooping(struct device *d,
 374                                        struct device_attribute *attr,
 375                                        const char *buf, size_t len)
 376{
 377        return store_bridge_parm(d, buf, len, br_multicast_toggle);
 378}
 379static DEVICE_ATTR(multicast_snooping, S_IRUGO | S_IWUSR,
 380                   show_multicast_snooping, store_multicast_snooping);
 381
 382static ssize_t show_hash_elasticity(struct device *d,
 383                                    struct device_attribute *attr, char *buf)
 384{
 385        struct net_bridge *br = to_bridge(d);
 386        return sprintf(buf, "%u\n", br->hash_elasticity);
 387}
 388
 389static int set_elasticity(struct net_bridge *br, unsigned long val)
 390{
 391        br->hash_elasticity = val;
 392        return 0;
 393}
 394
 395static ssize_t store_hash_elasticity(struct device *d,
 396                                     struct device_attribute *attr,
 397                                     const char *buf, size_t len)
 398{
 399        return store_bridge_parm(d, buf, len, set_elasticity);
 400}
 401static DEVICE_ATTR(hash_elasticity, S_IRUGO | S_IWUSR, show_hash_elasticity,
 402                   store_hash_elasticity);
 403
 404static ssize_t show_hash_max(struct device *d, struct device_attribute *attr,
 405                             char *buf)
 406{
 407        struct net_bridge *br = to_bridge(d);
 408        return sprintf(buf, "%u\n", br->hash_max);
 409}
 410
 411static ssize_t store_hash_max(struct device *d, struct device_attribute *attr,
 412                              const char *buf, size_t len)
 413{
 414        return store_bridge_parm(d, buf, len, br_multicast_set_hash_max);
 415}
 416static DEVICE_ATTR(hash_max, S_IRUGO | S_IWUSR, show_hash_max,
 417                   store_hash_max);
 418
 419static ssize_t show_multicast_last_member_count(struct device *d,
 420                                                struct device_attribute *attr,
 421                                                char *buf)
 422{
 423        struct net_bridge *br = to_bridge(d);
 424        return sprintf(buf, "%u\n", br->multicast_last_member_count);
 425}
 426
 427static int set_last_member_count(struct net_bridge *br, unsigned long val)
 428{
 429        br->multicast_last_member_count = val;
 430        return 0;
 431}
 432
 433static ssize_t store_multicast_last_member_count(struct device *d,
 434                                                 struct device_attribute *attr,
 435                                                 const char *buf, size_t len)
 436{
 437        return store_bridge_parm(d, buf, len, set_last_member_count);
 438}
 439static DEVICE_ATTR(multicast_last_member_count, S_IRUGO | S_IWUSR,
 440                   show_multicast_last_member_count,
 441                   store_multicast_last_member_count);
 442
 443static ssize_t show_multicast_startup_query_count(
 444        struct device *d, struct device_attribute *attr, char *buf)
 445{
 446        struct net_bridge *br = to_bridge(d);
 447        return sprintf(buf, "%u\n", br->multicast_startup_query_count);
 448}
 449
 450static int set_startup_query_count(struct net_bridge *br, unsigned long val)
 451{
 452        br->multicast_startup_query_count = val;
 453        return 0;
 454}
 455
 456static ssize_t store_multicast_startup_query_count(
 457        struct device *d, struct device_attribute *attr, const char *buf,
 458        size_t len)
 459{
 460        return store_bridge_parm(d, buf, len, set_startup_query_count);
 461}
 462static DEVICE_ATTR(multicast_startup_query_count, S_IRUGO | S_IWUSR,
 463                   show_multicast_startup_query_count,
 464                   store_multicast_startup_query_count);
 465
 466static ssize_t show_multicast_last_member_interval(
 467        struct device *d, struct device_attribute *attr, char *buf)
 468{
 469        struct net_bridge *br = to_bridge(d);
 470        return sprintf(buf, "%lu\n",
 471                       jiffies_to_clock_t(br->multicast_last_member_interval));
 472}
 473
 474static int set_last_member_interval(struct net_bridge *br, unsigned long val)
 475{
 476        br->multicast_last_member_interval = clock_t_to_jiffies(val);
 477        return 0;
 478}
 479
 480static ssize_t store_multicast_last_member_interval(
 481        struct device *d, struct device_attribute *attr, const char *buf,
 482        size_t len)
 483{
 484        return store_bridge_parm(d, buf, len, set_last_member_interval);
 485}
 486static DEVICE_ATTR(multicast_last_member_interval, S_IRUGO | S_IWUSR,
 487                   show_multicast_last_member_interval,
 488                   store_multicast_last_member_interval);
 489
 490static ssize_t show_multicast_membership_interval(
 491        struct device *d, struct device_attribute *attr, char *buf)
 492{
 493        struct net_bridge *br = to_bridge(d);
 494        return sprintf(buf, "%lu\n",
 495                       jiffies_to_clock_t(br->multicast_membership_interval));
 496}
 497
 498static int set_membership_interval(struct net_bridge *br, unsigned long val)
 499{
 500        br->multicast_membership_interval = clock_t_to_jiffies(val);
 501        return 0;
 502}
 503
 504static ssize_t store_multicast_membership_interval(
 505        struct device *d, struct device_attribute *attr, const char *buf,
 506        size_t len)
 507{
 508        return store_bridge_parm(d, buf, len, set_membership_interval);
 509}
 510static DEVICE_ATTR(multicast_membership_interval, S_IRUGO | S_IWUSR,
 511                   show_multicast_membership_interval,
 512                   store_multicast_membership_interval);
 513
 514static ssize_t show_multicast_querier_interval(struct device *d,
 515                                               struct device_attribute *attr,
 516                                               char *buf)
 517{
 518        struct net_bridge *br = to_bridge(d);
 519        return sprintf(buf, "%lu\n",
 520                       jiffies_to_clock_t(br->multicast_querier_interval));
 521}
 522
 523static int set_querier_interval(struct net_bridge *br, unsigned long val)
 524{
 525        br->multicast_querier_interval = clock_t_to_jiffies(val);
 526        return 0;
 527}
 528
 529static ssize_t store_multicast_querier_interval(struct device *d,
 530                                                struct device_attribute *attr,
 531                                                const char *buf, size_t len)
 532{
 533        return store_bridge_parm(d, buf, len, set_querier_interval);
 534}
 535static DEVICE_ATTR(multicast_querier_interval, S_IRUGO | S_IWUSR,
 536                   show_multicast_querier_interval,
 537                   store_multicast_querier_interval);
 538
 539static ssize_t show_multicast_query_interval(struct device *d,
 540                                             struct device_attribute *attr,
 541                                             char *buf)
 542{
 543        struct net_bridge *br = to_bridge(d);
 544        return sprintf(buf, "%lu\n",
 545                       jiffies_to_clock_t(br->multicast_query_interval));
 546}
 547
 548static int set_query_interval(struct net_bridge *br, unsigned long val)
 549{
 550        br->multicast_query_interval = clock_t_to_jiffies(val);
 551        return 0;
 552}
 553
 554static ssize_t store_multicast_query_interval(struct device *d,
 555                                              struct device_attribute *attr,
 556                                              const char *buf, size_t len)
 557{
 558        return store_bridge_parm(d, buf, len, set_query_interval);
 559}
 560static DEVICE_ATTR(multicast_query_interval, S_IRUGO | S_IWUSR,
 561                   show_multicast_query_interval,
 562                   store_multicast_query_interval);
 563
 564static ssize_t show_multicast_query_response_interval(
 565        struct device *d, struct device_attribute *attr, char *buf)
 566{
 567        struct net_bridge *br = to_bridge(d);
 568        return sprintf(
 569                buf, "%lu\n",
 570                jiffies_to_clock_t(br->multicast_query_response_interval));
 571}
 572
 573static int set_query_response_interval(struct net_bridge *br, unsigned long val)
 574{
 575        br->multicast_query_response_interval = clock_t_to_jiffies(val);
 576        return 0;
 577}
 578
 579static ssize_t store_multicast_query_response_interval(
 580        struct device *d, struct device_attribute *attr, const char *buf,
 581        size_t len)
 582{
 583        return store_bridge_parm(d, buf, len, set_query_response_interval);
 584}
 585static DEVICE_ATTR(multicast_query_response_interval, S_IRUGO | S_IWUSR,
 586                   show_multicast_query_response_interval,
 587                   store_multicast_query_response_interval);
 588
 589static ssize_t show_multicast_startup_query_interval(
 590        struct device *d, struct device_attribute *attr, char *buf)
 591{
 592        struct net_bridge *br = to_bridge(d);
 593        return sprintf(
 594                buf, "%lu\n",
 595                jiffies_to_clock_t(br->multicast_startup_query_interval));
 596}
 597
 598static int set_startup_query_interval(struct net_bridge *br, unsigned long val)
 599{
 600        br->multicast_startup_query_interval = clock_t_to_jiffies(val);
 601        return 0;
 602}
 603
 604static ssize_t store_multicast_startup_query_interval(
 605        struct device *d, struct device_attribute *attr, const char *buf,
 606        size_t len)
 607{
 608        return store_bridge_parm(d, buf, len, set_startup_query_interval);
 609}
 610static DEVICE_ATTR(multicast_startup_query_interval, S_IRUGO | S_IWUSR,
 611                   show_multicast_startup_query_interval,
 612                   store_multicast_startup_query_interval);
 613#endif
 614#ifdef CONFIG_BRIDGE_NETFILTER
 615static ssize_t show_nf_call_iptables(
 616        struct device *d, struct device_attribute *attr, char *buf)
 617{
 618        struct net_bridge *br = to_bridge(d);
 619        return sprintf(buf, "%u\n", br->nf_call_iptables);
 620}
 621
 622static int set_nf_call_iptables(struct net_bridge *br, unsigned long val)
 623{
 624        br->nf_call_iptables = val ? true : false;
 625        return 0;
 626}
 627
 628static ssize_t store_nf_call_iptables(
 629        struct device *d, struct device_attribute *attr, const char *buf,
 630        size_t len)
 631{
 632        return store_bridge_parm(d, buf, len, set_nf_call_iptables);
 633}
 634static DEVICE_ATTR(nf_call_iptables, S_IRUGO | S_IWUSR,
 635                   show_nf_call_iptables, store_nf_call_iptables);
 636
 637static ssize_t show_nf_call_ip6tables(
 638        struct device *d, struct device_attribute *attr, char *buf)
 639{
 640        struct net_bridge *br = to_bridge(d);
 641        return sprintf(buf, "%u\n", br->nf_call_ip6tables);
 642}
 643
 644static int set_nf_call_ip6tables(struct net_bridge *br, unsigned long val)
 645{
 646        br->nf_call_ip6tables = val ? true : false;
 647        return 0;
 648}
 649
 650static ssize_t store_nf_call_ip6tables(
 651        struct device *d, struct device_attribute *attr, const char *buf,
 652        size_t len)
 653{
 654        return store_bridge_parm(d, buf, len, set_nf_call_ip6tables);
 655}
 656static DEVICE_ATTR(nf_call_ip6tables, S_IRUGO | S_IWUSR,
 657                   show_nf_call_ip6tables, store_nf_call_ip6tables);
 658
 659static ssize_t show_nf_call_arptables(
 660        struct device *d, struct device_attribute *attr, char *buf)
 661{
 662        struct net_bridge *br = to_bridge(d);
 663        return sprintf(buf, "%u\n", br->nf_call_arptables);
 664}
 665
 666static int set_nf_call_arptables(struct net_bridge *br, unsigned long val)
 667{
 668        br->nf_call_arptables = val ? true : false;
 669        return 0;
 670}
 671
 672static ssize_t store_nf_call_arptables(
 673        struct device *d, struct device_attribute *attr, const char *buf,
 674        size_t len)
 675{
 676        return store_bridge_parm(d, buf, len, set_nf_call_arptables);
 677}
 678static DEVICE_ATTR(nf_call_arptables, S_IRUGO | S_IWUSR,
 679                   show_nf_call_arptables, store_nf_call_arptables);
 680#endif
 681
 682static struct attribute *bridge_attrs[] = {
 683        &dev_attr_forward_delay.attr,
 684        &dev_attr_hello_time.attr,
 685        &dev_attr_max_age.attr,
 686        &dev_attr_ageing_time.attr,
 687        &dev_attr_stp_state.attr,
 688        &dev_attr_priority.attr,
 689        &dev_attr_bridge_id.attr,
 690        &dev_attr_root_id.attr,
 691        &dev_attr_root_path_cost.attr,
 692        &dev_attr_root_port.attr,
 693        &dev_attr_topology_change.attr,
 694        &dev_attr_topology_change_detected.attr,
 695        &dev_attr_hello_timer.attr,
 696        &dev_attr_tcn_timer.attr,
 697        &dev_attr_topology_change_timer.attr,
 698        &dev_attr_gc_timer.attr,
 699        &dev_attr_group_addr.attr,
 700        &dev_attr_flush.attr,
 701#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 702        &dev_attr_multicast_router.attr,
 703        &dev_attr_multicast_snooping.attr,
 704        &dev_attr_hash_elasticity.attr,
 705        &dev_attr_hash_max.attr,
 706        &dev_attr_multicast_last_member_count.attr,
 707        &dev_attr_multicast_startup_query_count.attr,
 708        &dev_attr_multicast_last_member_interval.attr,
 709        &dev_attr_multicast_membership_interval.attr,
 710        &dev_attr_multicast_querier_interval.attr,
 711        &dev_attr_multicast_query_interval.attr,
 712        &dev_attr_multicast_query_response_interval.attr,
 713        &dev_attr_multicast_startup_query_interval.attr,
 714#endif
 715#ifdef CONFIG_BRIDGE_NETFILTER
 716        &dev_attr_nf_call_iptables.attr,
 717        &dev_attr_nf_call_ip6tables.attr,
 718        &dev_attr_nf_call_arptables.attr,
 719#endif
 720        NULL
 721};
 722
 723static struct attribute_group bridge_group = {
 724        .name = SYSFS_BRIDGE_ATTR,
 725        .attrs = bridge_attrs,
 726};
 727
 728/*
 729 * Export the forwarding information table as a binary file
 730 * The records are struct __fdb_entry.
 731 *
 732 * Returns the number of bytes read.
 733 */
 734static ssize_t brforward_read(struct file *filp, struct kobject *kobj,
 735                              struct bin_attribute *bin_attr,
 736                              char *buf, loff_t off, size_t count)
 737{
 738        struct device *dev = to_dev(kobj);
 739        struct net_bridge *br = to_bridge(dev);
 740        int n;
 741
 742        /* must read whole records */
 743        if (off % sizeof(struct __fdb_entry) != 0)
 744                return -EINVAL;
 745
 746        n =  br_fdb_fillbuf(br, buf,
 747                            count / sizeof(struct __fdb_entry),
 748                            off / sizeof(struct __fdb_entry));
 749
 750        if (n > 0)
 751                n *= sizeof(struct __fdb_entry);
 752
 753        return n;
 754}
 755
 756static struct bin_attribute bridge_forward = {
 757        .attr = { .name = SYSFS_BRIDGE_FDB,
 758                  .mode = S_IRUGO, },
 759        .read = brforward_read,
 760};
 761
 762/*
 763 * Add entries in sysfs onto the existing network class device
 764 * for the bridge.
 765 *   Adds a attribute group "bridge" containing tuning parameters.
 766 *   Binary attribute containing the forward table
 767 *   Sub directory to hold links to interfaces.
 768 *
 769 * Note: the ifobj exists only to be a subdirectory
 770 *   to hold links.  The ifobj exists in same data structure
 771 *   as it's parent the bridge so reference counting works.
 772 */
 773int br_sysfs_addbr(struct net_device *dev)
 774{
 775        struct kobject *brobj = &dev->dev.kobj;
 776        struct net_bridge *br = netdev_priv(dev);
 777        int err;
 778
 779        err = sysfs_create_group(brobj, &bridge_group);
 780        if (err) {
 781                pr_info("%s: can't create group %s/%s\n",
 782                        __func__, dev->name, bridge_group.name);
 783                goto out1;
 784        }
 785
 786        err = sysfs_create_bin_file(brobj, &bridge_forward);
 787        if (err) {
 788                pr_info("%s: can't create attribute file %s/%s\n",
 789                        __func__, dev->name, bridge_forward.attr.name);
 790                goto out2;
 791        }
 792
 793        br->ifobj = kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR, brobj);
 794        if (!br->ifobj) {
 795                pr_info("%s: can't add kobject (directory) %s/%s\n",
 796                        __func__, dev->name, SYSFS_BRIDGE_PORT_SUBDIR);
 797                goto out3;
 798        }
 799        return 0;
 800 out3:
 801        sysfs_remove_bin_file(&dev->dev.kobj, &bridge_forward);
 802 out2:
 803        sysfs_remove_group(&dev->dev.kobj, &bridge_group);
 804 out1:
 805        return err;
 806
 807}
 808
 809void br_sysfs_delbr(struct net_device *dev)
 810{
 811        struct kobject *kobj = &dev->dev.kobj;
 812        struct net_bridge *br = netdev_priv(dev);
 813
 814        kobject_put(br->ifobj);
 815        sysfs_remove_bin_file(kobj, &bridge_forward);
 816        sysfs_remove_group(kobj, &bridge_group);
 817}
 818