]> git.ipfire.org Git - thirdparty/linux.git/blame - net/bridge/br_sysfs_br.c
net: bridge: add support for per-port vlan stats
[thirdparty/linux.git] / net / bridge / br_sysfs_br.c
CommitLineData
1da177e4 1/*
15401946 2 * Sysfs attributes of bridge
1da177e4
LT
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
4fc268d2 14#include <linux/capability.h>
1da177e4
LT
15#include <linux/kernel.h>
16#include <linux/netdevice.h>
b3343a2a 17#include <linux/etherdevice.h>
1da177e4
LT
18#include <linux/if_bridge.h>
19#include <linux/rtnetlink.h>
20#include <linux/spinlock.h>
21#include <linux/times.h>
174cd4b1 22#include <linux/sched/signal.h>
1da177e4
LT
23
24#include "br_private.h"
25
524ad0a7 26#define to_bridge(cd) ((struct net_bridge *)netdev_priv(to_net_dev(cd)))
1da177e4
LT
27
28/*
29 * Common code for storing bridge parameters.
30 */
43cb76d9 31static ssize_t store_bridge_parm(struct device *d,
1da177e4 32 const char *buf, size_t len,
8d4698f7 33 int (*set)(struct net_bridge *, unsigned long))
1da177e4 34{
43cb76d9 35 struct net_bridge *br = to_bridge(d);
1da177e4
LT
36 char *endp;
37 unsigned long val;
8d4698f7 38 int err;
1da177e4 39
cb990503 40 if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
1da177e4
LT
41 return -EPERM;
42
43 val = simple_strtoul(buf, &endp, 0);
44 if (endp == buf)
45 return -EINVAL;
46
047831a9
XL
47 if (!rtnl_trylock())
48 return restart_syscall();
49
8d4698f7 50 err = (*set)(br, val);
047831a9
XL
51 if (!err)
52 netdev_state_change(br->dev);
53 rtnl_unlock();
54
8d4698f7 55 return err ? err : len;
1da177e4
LT
56}
57
58
fbf2671b 59static ssize_t forward_delay_show(struct device *d,
43cb76d9 60 struct device_attribute *attr, char *buf)
1da177e4 61{
43cb76d9 62 struct net_bridge *br = to_bridge(d);
1da177e4
LT
63 return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->forward_delay));
64}
65
fbf2671b 66static ssize_t forward_delay_store(struct device *d,
43cb76d9
GKH
67 struct device_attribute *attr,
68 const char *buf, size_t len)
1da177e4 69{
14f98f25 70 return store_bridge_parm(d, buf, len, br_set_forward_delay);
1da177e4 71}
fbf2671b 72static DEVICE_ATTR_RW(forward_delay);
1da177e4 73
fbf2671b 74static ssize_t hello_time_show(struct device *d, struct device_attribute *attr,
43cb76d9 75 char *buf)
1da177e4
LT
76{
77 return sprintf(buf, "%lu\n",
43cb76d9 78 jiffies_to_clock_t(to_bridge(d)->hello_time));
1da177e4
LT
79}
80
fbf2671b 81static ssize_t hello_time_store(struct device *d,
43cb76d9 82 struct device_attribute *attr, const char *buf,
1da177e4
LT
83 size_t len)
84{
14f98f25 85 return store_bridge_parm(d, buf, len, br_set_hello_time);
1da177e4 86}
fbf2671b 87static DEVICE_ATTR_RW(hello_time);
1da177e4 88
fbf2671b 89static ssize_t max_age_show(struct device *d, struct device_attribute *attr,
43cb76d9 90 char *buf)
1da177e4
LT
91{
92 return sprintf(buf, "%lu\n",
43cb76d9 93 jiffies_to_clock_t(to_bridge(d)->max_age));
1da177e4
LT
94}
95
fbf2671b 96static ssize_t max_age_store(struct device *d, struct device_attribute *attr,
43cb76d9 97 const char *buf, size_t len)
1da177e4 98{
14f98f25 99 return store_bridge_parm(d, buf, len, br_set_max_age);
1da177e4 100}
fbf2671b 101static DEVICE_ATTR_RW(max_age);
1da177e4 102
fbf2671b 103static ssize_t ageing_time_show(struct device *d,
43cb76d9 104 struct device_attribute *attr, char *buf)
1da177e4 105{
43cb76d9 106 struct net_bridge *br = to_bridge(d);
1da177e4
LT
107 return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->ageing_time));
108}
109
8d4698f7 110static int set_ageing_time(struct net_bridge *br, unsigned long val)
1da177e4 111{
047831a9 112 return br_set_ageing_time(br, val);
1da177e4
LT
113}
114
fbf2671b 115static ssize_t ageing_time_store(struct device *d,
43cb76d9
GKH
116 struct device_attribute *attr,
117 const char *buf, size_t len)
1da177e4 118{
43cb76d9 119 return store_bridge_parm(d, buf, len, set_ageing_time);
1da177e4 120}
fbf2671b 121static DEVICE_ATTR_RW(ageing_time);
1da177e4 122
fbf2671b 123static ssize_t stp_state_show(struct device *d,
43cb76d9 124 struct device_attribute *attr, char *buf)
1da177e4 125{
43cb76d9 126 struct net_bridge *br = to_bridge(d);
1da177e4
LT
127 return sprintf(buf, "%d\n", br->stp_enabled);
128}
129
1da177e4 130
4436156b 131static int set_stp_state(struct net_bridge *br, unsigned long val)
1da177e4 132{
17120889 133 br_stp_set_enabled(br, val);
17120889 134
4436156b
XL
135 return 0;
136}
137
138static ssize_t stp_state_store(struct device *d,
139 struct device_attribute *attr, const char *buf,
140 size_t len)
141{
142 return store_bridge_parm(d, buf, len, set_stp_state);
1da177e4 143}
fbf2671b 144static DEVICE_ATTR_RW(stp_state);
1da177e4 145
fbf2671b 146static ssize_t group_fwd_mask_show(struct device *d,
147 struct device_attribute *attr,
148 char *buf)
515853cc 149{
150 struct net_bridge *br = to_bridge(d);
151 return sprintf(buf, "%#x\n", br->group_fwd_mask);
152}
153
347db6b4 154static int set_group_fwd_mask(struct net_bridge *br, unsigned long val)
515853cc 155{
515853cc 156 if (val & BR_GROUPFWD_RESTRICTED)
157 return -EINVAL;
158
159 br->group_fwd_mask = val;
160
347db6b4
XL
161 return 0;
162}
163
164static ssize_t group_fwd_mask_store(struct device *d,
165 struct device_attribute *attr,
166 const char *buf,
167 size_t len)
168{
169 return store_bridge_parm(d, buf, len, set_group_fwd_mask);
515853cc 170}
fbf2671b 171static DEVICE_ATTR_RW(group_fwd_mask);
515853cc 172
fbf2671b 173static ssize_t priority_show(struct device *d, struct device_attribute *attr,
43cb76d9 174 char *buf)
1da177e4 175{
43cb76d9 176 struct net_bridge *br = to_bridge(d);
1da177e4
LT
177 return sprintf(buf, "%d\n",
178 (br->bridge_id.prio[0] << 8) | br->bridge_id.prio[1]);
179}
180
8d4698f7 181static int set_priority(struct net_bridge *br, unsigned long val)
1da177e4
LT
182{
183 br_stp_set_bridge_priority(br, (u16) val);
8d4698f7 184 return 0;
1da177e4
LT
185}
186
fbf2671b 187static ssize_t priority_store(struct device *d, struct device_attribute *attr,
188 const char *buf, size_t len)
1da177e4 189{
43cb76d9 190 return store_bridge_parm(d, buf, len, set_priority);
1da177e4 191}
fbf2671b 192static DEVICE_ATTR_RW(priority);
1da177e4 193
fbf2671b 194static ssize_t root_id_show(struct device *d, struct device_attribute *attr,
43cb76d9 195 char *buf)
1da177e4 196{
43cb76d9 197 return br_show_bridge_id(buf, &to_bridge(d)->designated_root);
1da177e4 198}
fbf2671b 199static DEVICE_ATTR_RO(root_id);
1da177e4 200
fbf2671b 201static ssize_t bridge_id_show(struct device *d, struct device_attribute *attr,
43cb76d9 202 char *buf)
1da177e4 203{
43cb76d9 204 return br_show_bridge_id(buf, &to_bridge(d)->bridge_id);
1da177e4 205}
fbf2671b 206static DEVICE_ATTR_RO(bridge_id);
1da177e4 207
fbf2671b 208static ssize_t root_port_show(struct device *d, struct device_attribute *attr,
43cb76d9 209 char *buf)
1da177e4 210{
43cb76d9 211 return sprintf(buf, "%d\n", to_bridge(d)->root_port);
1da177e4 212}
fbf2671b 213static DEVICE_ATTR_RO(root_port);
1da177e4 214
fbf2671b 215static ssize_t root_path_cost_show(struct device *d,
43cb76d9 216 struct device_attribute *attr, char *buf)
1da177e4 217{
43cb76d9 218 return sprintf(buf, "%d\n", to_bridge(d)->root_path_cost);
1da177e4 219}
fbf2671b 220static DEVICE_ATTR_RO(root_path_cost);
1da177e4 221
fbf2671b 222static ssize_t topology_change_show(struct device *d,
43cb76d9 223 struct device_attribute *attr, char *buf)
1da177e4 224{
43cb76d9 225 return sprintf(buf, "%d\n", to_bridge(d)->topology_change);
1da177e4 226}
fbf2671b 227static DEVICE_ATTR_RO(topology_change);
1da177e4 228
fbf2671b 229static ssize_t topology_change_detected_show(struct device *d,
43cb76d9
GKH
230 struct device_attribute *attr,
231 char *buf)
1da177e4 232{
43cb76d9 233 struct net_bridge *br = to_bridge(d);
1da177e4
LT
234 return sprintf(buf, "%d\n", br->topology_change_detected);
235}
fbf2671b 236static DEVICE_ATTR_RO(topology_change_detected);
1da177e4 237
fbf2671b 238static ssize_t hello_timer_show(struct device *d,
43cb76d9 239 struct device_attribute *attr, char *buf)
1da177e4 240{
43cb76d9 241 struct net_bridge *br = to_bridge(d);
1da177e4
LT
242 return sprintf(buf, "%ld\n", br_timer_value(&br->hello_timer));
243}
fbf2671b 244static DEVICE_ATTR_RO(hello_timer);
1da177e4 245
fbf2671b 246static ssize_t tcn_timer_show(struct device *d, struct device_attribute *attr,
43cb76d9 247 char *buf)
1da177e4 248{
43cb76d9 249 struct net_bridge *br = to_bridge(d);
1da177e4
LT
250 return sprintf(buf, "%ld\n", br_timer_value(&br->tcn_timer));
251}
fbf2671b 252static DEVICE_ATTR_RO(tcn_timer);
1da177e4 253
fbf2671b 254static ssize_t topology_change_timer_show(struct device *d,
43cb76d9
GKH
255 struct device_attribute *attr,
256 char *buf)
1da177e4 257{
43cb76d9 258 struct net_bridge *br = to_bridge(d);
1da177e4
LT
259 return sprintf(buf, "%ld\n", br_timer_value(&br->topology_change_timer));
260}
fbf2671b 261static DEVICE_ATTR_RO(topology_change_timer);
1da177e4 262
fbf2671b 263static ssize_t gc_timer_show(struct device *d, struct device_attribute *attr,
43cb76d9 264 char *buf)
1da177e4 265{
43cb76d9 266 struct net_bridge *br = to_bridge(d);
f7cdee8a 267 return sprintf(buf, "%ld\n", br_timer_value(&br->gc_work.timer));
1da177e4 268}
fbf2671b 269static DEVICE_ATTR_RO(gc_timer);
1da177e4 270
fbf2671b 271static ssize_t group_addr_show(struct device *d,
43cb76d9 272 struct device_attribute *attr, char *buf)
fda93d92 273{
43cb76d9 274 struct net_bridge *br = to_bridge(d);
223b229b 275 return sprintf(buf, "%pM\n", br->group_addr);
fda93d92
SH
276}
277
fbf2671b 278static ssize_t group_addr_store(struct device *d,
43cb76d9
GKH
279 struct device_attribute *attr,
280 const char *buf, size_t len)
fda93d92 281{
43cb76d9 282 struct net_bridge *br = to_bridge(d);
4197f24b 283 u8 new_addr[6];
fda93d92 284
cb990503 285 if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
fda93d92
SH
286 return -EPERM;
287
223b229b 288 if (!mac_pton(buf, new_addr))
fda93d92
SH
289 return -EINVAL;
290
46acc460 291 if (!is_link_local_ether_addr(new_addr))
fda93d92
SH
292 return -EINVAL;
293
f64f9e71
JP
294 if (new_addr[5] == 1 || /* 802.3x Pause address */
295 new_addr[5] == 2 || /* 802.3ad Slow protocols */
296 new_addr[5] == 3) /* 802.1X PAE address */
fda93d92
SH
297 return -EINVAL;
298
204177f3
TM
299 if (!rtnl_trylock())
300 return restart_syscall();
301
fda93d92 302 spin_lock_bh(&br->lock);
223b229b 303 ether_addr_copy(br->group_addr, new_addr);
fda93d92 304 spin_unlock_bh(&br->lock);
204177f3 305
be3664a0 306 br_opt_toggle(br, BROPT_GROUP_ADDR_SET, true);
204177f3 307 br_recalculate_fwd_mask(br);
047831a9 308 netdev_state_change(br->dev);
204177f3
TM
309
310 rtnl_unlock();
311
fda93d92
SH
312 return len;
313}
314
fbf2671b 315static DEVICE_ATTR_RW(group_addr);
fda93d92 316
14f31bb3
XL
317static int set_flush(struct net_bridge *br, unsigned long val)
318{
319 br_fdb_flush(br);
320 return 0;
321}
322
fbf2671b 323static ssize_t flush_store(struct device *d,
9cf63747
SH
324 struct device_attribute *attr,
325 const char *buf, size_t len)
326{
14f31bb3 327 return store_bridge_parm(d, buf, len, set_flush);
9cf63747 328}
fbf2671b 329static DEVICE_ATTR_WO(flush);
fda93d92 330
0909e117 331#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
fbf2671b 332static ssize_t multicast_router_show(struct device *d,
0909e117
HX
333 struct device_attribute *attr, char *buf)
334{
335 struct net_bridge *br = to_bridge(d);
336 return sprintf(buf, "%d\n", br->multicast_router);
337}
338
fbf2671b 339static ssize_t multicast_router_store(struct device *d,
0909e117
HX
340 struct device_attribute *attr,
341 const char *buf, size_t len)
342{
343 return store_bridge_parm(d, buf, len, br_multicast_set_router);
344}
fbf2671b 345static DEVICE_ATTR_RW(multicast_router);
561f1103 346
fbf2671b 347static ssize_t multicast_snooping_show(struct device *d,
561f1103
HX
348 struct device_attribute *attr,
349 char *buf)
350{
351 struct net_bridge *br = to_bridge(d);
13cefad2 352 return sprintf(buf, "%d\n", br_opt_get(br, BROPT_MULTICAST_ENABLED));
561f1103
HX
353}
354
fbf2671b 355static ssize_t multicast_snooping_store(struct device *d,
561f1103
HX
356 struct device_attribute *attr,
357 const char *buf, size_t len)
358{
359 return store_bridge_parm(d, buf, len, br_multicast_toggle);
360}
fbf2671b 361static DEVICE_ATTR_RW(multicast_snooping);
b195167f 362
fbf2671b 363static ssize_t multicast_query_use_ifaddr_show(struct device *d,
364 struct device_attribute *attr,
365 char *buf)
1c8ad5bf
CW
366{
367 struct net_bridge *br = to_bridge(d);
675779ad
NA
368 return sprintf(buf, "%d\n",
369 br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR));
1c8ad5bf
CW
370}
371
372static int set_query_use_ifaddr(struct net_bridge *br, unsigned long val)
373{
675779ad 374 br_opt_toggle(br, BROPT_MULTICAST_QUERY_USE_IFADDR, !!val);
1c8ad5bf
CW
375 return 0;
376}
377
378static ssize_t
fbf2671b 379multicast_query_use_ifaddr_store(struct device *d,
1c8ad5bf
CW
380 struct device_attribute *attr,
381 const char *buf, size_t len)
382{
383 return store_bridge_parm(d, buf, len, set_query_use_ifaddr);
384}
fbf2671b 385static DEVICE_ATTR_RW(multicast_query_use_ifaddr);
1c8ad5bf 386
fbf2671b 387static ssize_t multicast_querier_show(struct device *d,
c5c23260
HX
388 struct device_attribute *attr,
389 char *buf)
390{
391 struct net_bridge *br = to_bridge(d);
675779ad 392 return sprintf(buf, "%d\n", br_opt_get(br, BROPT_MULTICAST_QUERIER));
c5c23260
HX
393}
394
fbf2671b 395static ssize_t multicast_querier_store(struct device *d,
c5c23260
HX
396 struct device_attribute *attr,
397 const char *buf, size_t len)
398{
399 return store_bridge_parm(d, buf, len, br_multicast_set_querier);
400}
fbf2671b 401static DEVICE_ATTR_RW(multicast_querier);
c5c23260 402
fbf2671b 403static ssize_t hash_elasticity_show(struct device *d,
b195167f
HX
404 struct device_attribute *attr, char *buf)
405{
406 struct net_bridge *br = to_bridge(d);
407 return sprintf(buf, "%u\n", br->hash_elasticity);
408}
409
410static int set_elasticity(struct net_bridge *br, unsigned long val)
411{
412 br->hash_elasticity = val;
413 return 0;
414}
415
fbf2671b 416static ssize_t hash_elasticity_store(struct device *d,
b195167f
HX
417 struct device_attribute *attr,
418 const char *buf, size_t len)
419{
420 return store_bridge_parm(d, buf, len, set_elasticity);
421}
fbf2671b 422static DEVICE_ATTR_RW(hash_elasticity);
b195167f 423
fbf2671b 424static ssize_t hash_max_show(struct device *d, struct device_attribute *attr,
b195167f
HX
425 char *buf)
426{
427 struct net_bridge *br = to_bridge(d);
428 return sprintf(buf, "%u\n", br->hash_max);
429}
430
fbf2671b 431static ssize_t hash_max_store(struct device *d, struct device_attribute *attr,
b195167f
HX
432 const char *buf, size_t len)
433{
434 return store_bridge_parm(d, buf, len, br_multicast_set_hash_max);
435}
fbf2671b 436static DEVICE_ATTR_RW(hash_max);
d902eee4 437
5e923585
NA
438static ssize_t multicast_igmp_version_show(struct device *d,
439 struct device_attribute *attr,
440 char *buf)
441{
442 struct net_bridge *br = to_bridge(d);
443
444 return sprintf(buf, "%u\n", br->multicast_igmp_version);
445}
446
447static ssize_t multicast_igmp_version_store(struct device *d,
448 struct device_attribute *attr,
449 const char *buf, size_t len)
450{
451 return store_bridge_parm(d, buf, len, br_multicast_set_igmp_version);
452}
453static DEVICE_ATTR_RW(multicast_igmp_version);
454
fbf2671b 455static ssize_t multicast_last_member_count_show(struct device *d,
d902eee4
HX
456 struct device_attribute *attr,
457 char *buf)
458{
459 struct net_bridge *br = to_bridge(d);
460 return sprintf(buf, "%u\n", br->multicast_last_member_count);
461}
462
463static int set_last_member_count(struct net_bridge *br, unsigned long val)
464{
465 br->multicast_last_member_count = val;
466 return 0;
467}
468
fbf2671b 469static ssize_t multicast_last_member_count_store(struct device *d,
d902eee4
HX
470 struct device_attribute *attr,
471 const char *buf, size_t len)
472{
473 return store_bridge_parm(d, buf, len, set_last_member_count);
474}
fbf2671b 475static DEVICE_ATTR_RW(multicast_last_member_count);
d902eee4 476
fbf2671b 477static ssize_t multicast_startup_query_count_show(
d902eee4
HX
478 struct device *d, struct device_attribute *attr, char *buf)
479{
480 struct net_bridge *br = to_bridge(d);
481 return sprintf(buf, "%u\n", br->multicast_startup_query_count);
482}
483
484static int set_startup_query_count(struct net_bridge *br, unsigned long val)
485{
486 br->multicast_startup_query_count = val;
487 return 0;
488}
489
fbf2671b 490static ssize_t multicast_startup_query_count_store(
d902eee4
HX
491 struct device *d, struct device_attribute *attr, const char *buf,
492 size_t len)
493{
494 return store_bridge_parm(d, buf, len, set_startup_query_count);
495}
fbf2671b 496static DEVICE_ATTR_RW(multicast_startup_query_count);
d902eee4 497
fbf2671b 498static ssize_t multicast_last_member_interval_show(
d902eee4
HX
499 struct device *d, struct device_attribute *attr, char *buf)
500{
501 struct net_bridge *br = to_bridge(d);
502 return sprintf(buf, "%lu\n",
503 jiffies_to_clock_t(br->multicast_last_member_interval));
504}
505
506static int set_last_member_interval(struct net_bridge *br, unsigned long val)
507{
508 br->multicast_last_member_interval = clock_t_to_jiffies(val);
509 return 0;
510}
511
fbf2671b 512static ssize_t multicast_last_member_interval_store(
d902eee4
HX
513 struct device *d, struct device_attribute *attr, const char *buf,
514 size_t len)
515{
516 return store_bridge_parm(d, buf, len, set_last_member_interval);
517}
fbf2671b 518static DEVICE_ATTR_RW(multicast_last_member_interval);
d902eee4 519
fbf2671b 520static ssize_t multicast_membership_interval_show(
d902eee4
HX
521 struct device *d, struct device_attribute *attr, char *buf)
522{
523 struct net_bridge *br = to_bridge(d);
524 return sprintf(buf, "%lu\n",
525 jiffies_to_clock_t(br->multicast_membership_interval));
526}
527
528static int set_membership_interval(struct net_bridge *br, unsigned long val)
529{
530 br->multicast_membership_interval = clock_t_to_jiffies(val);
531 return 0;
532}
533
fbf2671b 534static ssize_t multicast_membership_interval_store(
d902eee4
HX
535 struct device *d, struct device_attribute *attr, const char *buf,
536 size_t len)
537{
538 return store_bridge_parm(d, buf, len, set_membership_interval);
539}
fbf2671b 540static DEVICE_ATTR_RW(multicast_membership_interval);
d902eee4 541
fbf2671b 542static ssize_t multicast_querier_interval_show(struct device *d,
d902eee4
HX
543 struct device_attribute *attr,
544 char *buf)
545{
546 struct net_bridge *br = to_bridge(d);
547 return sprintf(buf, "%lu\n",
548 jiffies_to_clock_t(br->multicast_querier_interval));
549}
550
551static int set_querier_interval(struct net_bridge *br, unsigned long val)
552{
553 br->multicast_querier_interval = clock_t_to_jiffies(val);
554 return 0;
555}
556
fbf2671b 557static ssize_t multicast_querier_interval_store(struct device *d,
d902eee4
HX
558 struct device_attribute *attr,
559 const char *buf, size_t len)
560{
561 return store_bridge_parm(d, buf, len, set_querier_interval);
562}
fbf2671b 563static DEVICE_ATTR_RW(multicast_querier_interval);
d902eee4 564
fbf2671b 565static ssize_t multicast_query_interval_show(struct device *d,
d902eee4
HX
566 struct device_attribute *attr,
567 char *buf)
568{
569 struct net_bridge *br = to_bridge(d);
570 return sprintf(buf, "%lu\n",
571 jiffies_to_clock_t(br->multicast_query_interval));
572}
573
574static int set_query_interval(struct net_bridge *br, unsigned long val)
575{
576 br->multicast_query_interval = clock_t_to_jiffies(val);
577 return 0;
578}
579
fbf2671b 580static ssize_t multicast_query_interval_store(struct device *d,
d902eee4
HX
581 struct device_attribute *attr,
582 const char *buf, size_t len)
583{
584 return store_bridge_parm(d, buf, len, set_query_interval);
585}
fbf2671b 586static DEVICE_ATTR_RW(multicast_query_interval);
d902eee4 587
fbf2671b 588static ssize_t multicast_query_response_interval_show(
d902eee4
HX
589 struct device *d, struct device_attribute *attr, char *buf)
590{
591 struct net_bridge *br = to_bridge(d);
592 return sprintf(
593 buf, "%lu\n",
594 jiffies_to_clock_t(br->multicast_query_response_interval));
595}
596
597static int set_query_response_interval(struct net_bridge *br, unsigned long val)
598{
599 br->multicast_query_response_interval = clock_t_to_jiffies(val);
600 return 0;
601}
602
fbf2671b 603static ssize_t multicast_query_response_interval_store(
d902eee4
HX
604 struct device *d, struct device_attribute *attr, const char *buf,
605 size_t len)
606{
607 return store_bridge_parm(d, buf, len, set_query_response_interval);
608}
fbf2671b 609static DEVICE_ATTR_RW(multicast_query_response_interval);
d902eee4 610
fbf2671b 611static ssize_t multicast_startup_query_interval_show(
d902eee4
HX
612 struct device *d, struct device_attribute *attr, char *buf)
613{
614 struct net_bridge *br = to_bridge(d);
615 return sprintf(
616 buf, "%lu\n",
617 jiffies_to_clock_t(br->multicast_startup_query_interval));
618}
619
620static int set_startup_query_interval(struct net_bridge *br, unsigned long val)
621{
622 br->multicast_startup_query_interval = clock_t_to_jiffies(val);
623 return 0;
624}
625
fbf2671b 626static ssize_t multicast_startup_query_interval_store(
d902eee4
HX
627 struct device *d, struct device_attribute *attr, const char *buf,
628 size_t len)
629{
630 return store_bridge_parm(d, buf, len, set_startup_query_interval);
631}
fbf2671b 632static DEVICE_ATTR_RW(multicast_startup_query_interval);
1080ab95
NA
633
634static ssize_t multicast_stats_enabled_show(struct device *d,
635 struct device_attribute *attr,
636 char *buf)
637{
638 struct net_bridge *br = to_bridge(d);
639
675779ad
NA
640 return sprintf(buf, "%d\n",
641 br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED));
1080ab95
NA
642}
643
644static int set_stats_enabled(struct net_bridge *br, unsigned long val)
645{
675779ad 646 br_opt_toggle(br, BROPT_MULTICAST_STATS_ENABLED, !!val);
1080ab95
NA
647 return 0;
648}
649
650static ssize_t multicast_stats_enabled_store(struct device *d,
651 struct device_attribute *attr,
652 const char *buf,
653 size_t len)
654{
655 return store_bridge_parm(d, buf, len, set_stats_enabled);
656}
657static DEVICE_ATTR_RW(multicast_stats_enabled);
aa2ae3e7
NA
658
659#if IS_ENABLED(CONFIG_IPV6)
660static ssize_t multicast_mld_version_show(struct device *d,
661 struct device_attribute *attr,
662 char *buf)
663{
664 struct net_bridge *br = to_bridge(d);
665
666 return sprintf(buf, "%u\n", br->multicast_mld_version);
667}
668
669static ssize_t multicast_mld_version_store(struct device *d,
670 struct device_attribute *attr,
671 const char *buf, size_t len)
672{
673 return store_bridge_parm(d, buf, len, br_multicast_set_mld_version);
674}
675static DEVICE_ATTR_RW(multicast_mld_version);
676#endif
0909e117 677#endif
34666d46 678#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
fbf2671b 679static ssize_t nf_call_iptables_show(
4df53d8b
PM
680 struct device *d, struct device_attribute *attr, char *buf)
681{
682 struct net_bridge *br = to_bridge(d);
8df3510f 683 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_NF_CALL_IPTABLES));
4df53d8b
PM
684}
685
686static int set_nf_call_iptables(struct net_bridge *br, unsigned long val)
687{
8df3510f 688 br_opt_toggle(br, BROPT_NF_CALL_IPTABLES, !!val);
4df53d8b
PM
689 return 0;
690}
691
fbf2671b 692static ssize_t nf_call_iptables_store(
4df53d8b
PM
693 struct device *d, struct device_attribute *attr, const char *buf,
694 size_t len)
695{
696 return store_bridge_parm(d, buf, len, set_nf_call_iptables);
697}
fbf2671b 698static DEVICE_ATTR_RW(nf_call_iptables);
4df53d8b 699
fbf2671b 700static ssize_t nf_call_ip6tables_show(
4df53d8b
PM
701 struct device *d, struct device_attribute *attr, char *buf)
702{
703 struct net_bridge *br = to_bridge(d);
8df3510f 704 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_NF_CALL_IP6TABLES));
4df53d8b
PM
705}
706
707static int set_nf_call_ip6tables(struct net_bridge *br, unsigned long val)
708{
8df3510f 709 br_opt_toggle(br, BROPT_NF_CALL_IP6TABLES, !!val);
4df53d8b
PM
710 return 0;
711}
712
fbf2671b 713static ssize_t nf_call_ip6tables_store(
4df53d8b
PM
714 struct device *d, struct device_attribute *attr, const char *buf,
715 size_t len)
716{
717 return store_bridge_parm(d, buf, len, set_nf_call_ip6tables);
718}
fbf2671b 719static DEVICE_ATTR_RW(nf_call_ip6tables);
4df53d8b 720
fbf2671b 721static ssize_t nf_call_arptables_show(
4df53d8b
PM
722 struct device *d, struct device_attribute *attr, char *buf)
723{
724 struct net_bridge *br = to_bridge(d);
8df3510f 725 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_NF_CALL_ARPTABLES));
4df53d8b
PM
726}
727
728static int set_nf_call_arptables(struct net_bridge *br, unsigned long val)
729{
8df3510f 730 br_opt_toggle(br, BROPT_NF_CALL_ARPTABLES, !!val);
4df53d8b
PM
731 return 0;
732}
733
fbf2671b 734static ssize_t nf_call_arptables_store(
4df53d8b
PM
735 struct device *d, struct device_attribute *attr, const char *buf,
736 size_t len)
737{
738 return store_bridge_parm(d, buf, len, set_nf_call_arptables);
739}
fbf2671b 740static DEVICE_ATTR_RW(nf_call_arptables);
4df53d8b 741#endif
243a2e63 742#ifdef CONFIG_BRIDGE_VLAN_FILTERING
fbf2671b 743static ssize_t vlan_filtering_show(struct device *d,
243a2e63
VY
744 struct device_attribute *attr,
745 char *buf)
746{
747 struct net_bridge *br = to_bridge(d);
ae75767e 748 return sprintf(buf, "%d\n", br_opt_get(br, BROPT_VLAN_ENABLED));
243a2e63
VY
749}
750
fbf2671b 751static ssize_t vlan_filtering_store(struct device *d,
243a2e63
VY
752 struct device_attribute *attr,
753 const char *buf, size_t len)
754{
755 return store_bridge_parm(d, buf, len, br_vlan_filter_toggle);
756}
fbf2671b 757static DEVICE_ATTR_RW(vlan_filtering);
204177f3
TM
758
759static ssize_t vlan_protocol_show(struct device *d,
760 struct device_attribute *attr,
761 char *buf)
762{
763 struct net_bridge *br = to_bridge(d);
764 return sprintf(buf, "%#06x\n", ntohs(br->vlan_proto));
765}
766
767static ssize_t vlan_protocol_store(struct device *d,
768 struct device_attribute *attr,
769 const char *buf, size_t len)
770{
771 return store_bridge_parm(d, buf, len, br_vlan_set_proto);
772}
773static DEVICE_ATTR_RW(vlan_protocol);
96a20d9d
VY
774
775static ssize_t default_pvid_show(struct device *d,
776 struct device_attribute *attr,
777 char *buf)
778{
779 struct net_bridge *br = to_bridge(d);
780 return sprintf(buf, "%d\n", br->default_pvid);
781}
782
783static ssize_t default_pvid_store(struct device *d,
784 struct device_attribute *attr,
785 const char *buf, size_t len)
786{
787 return store_bridge_parm(d, buf, len, br_vlan_set_default_pvid);
788}
789static DEVICE_ATTR_RW(default_pvid);
6dada9b1
NA
790
791static ssize_t vlan_stats_enabled_show(struct device *d,
792 struct device_attribute *attr,
793 char *buf)
794{
795 struct net_bridge *br = to_bridge(d);
ae75767e 796 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_VLAN_STATS_ENABLED));
6dada9b1
NA
797}
798
799static ssize_t vlan_stats_enabled_store(struct device *d,
800 struct device_attribute *attr,
801 const char *buf, size_t len)
802{
803 return store_bridge_parm(d, buf, len, br_vlan_set_stats);
804}
805static DEVICE_ATTR_RW(vlan_stats_enabled);
9163a0fc
NA
806
807static ssize_t vlan_stats_per_port_show(struct device *d,
808 struct device_attribute *attr,
809 char *buf)
810{
811 struct net_bridge *br = to_bridge(d);
812 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_VLAN_STATS_PER_PORT));
813}
814
815static ssize_t vlan_stats_per_port_store(struct device *d,
816 struct device_attribute *attr,
817 const char *buf, size_t len)
818{
819 return store_bridge_parm(d, buf, len, br_vlan_set_stats_per_port);
820}
821static DEVICE_ATTR_RW(vlan_stats_per_port);
243a2e63 822#endif
0909e117 823
1da177e4 824static struct attribute *bridge_attrs[] = {
43cb76d9
GKH
825 &dev_attr_forward_delay.attr,
826 &dev_attr_hello_time.attr,
827 &dev_attr_max_age.attr,
828 &dev_attr_ageing_time.attr,
829 &dev_attr_stp_state.attr,
515853cc 830 &dev_attr_group_fwd_mask.attr,
43cb76d9
GKH
831 &dev_attr_priority.attr,
832 &dev_attr_bridge_id.attr,
833 &dev_attr_root_id.attr,
834 &dev_attr_root_path_cost.attr,
835 &dev_attr_root_port.attr,
836 &dev_attr_topology_change.attr,
837 &dev_attr_topology_change_detected.attr,
838 &dev_attr_hello_timer.attr,
839 &dev_attr_tcn_timer.attr,
840 &dev_attr_topology_change_timer.attr,
841 &dev_attr_gc_timer.attr,
842 &dev_attr_group_addr.attr,
9cf63747 843 &dev_attr_flush.attr,
0909e117
HX
844#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
845 &dev_attr_multicast_router.attr,
561f1103 846 &dev_attr_multicast_snooping.attr,
c5c23260 847 &dev_attr_multicast_querier.attr,
1c8ad5bf 848 &dev_attr_multicast_query_use_ifaddr.attr,
b195167f
HX
849 &dev_attr_hash_elasticity.attr,
850 &dev_attr_hash_max.attr,
d902eee4
HX
851 &dev_attr_multicast_last_member_count.attr,
852 &dev_attr_multicast_startup_query_count.attr,
853 &dev_attr_multicast_last_member_interval.attr,
854 &dev_attr_multicast_membership_interval.attr,
855 &dev_attr_multicast_querier_interval.attr,
856 &dev_attr_multicast_query_interval.attr,
857 &dev_attr_multicast_query_response_interval.attr,
858 &dev_attr_multicast_startup_query_interval.attr,
1080ab95 859 &dev_attr_multicast_stats_enabled.attr,
5e923585 860 &dev_attr_multicast_igmp_version.attr,
aa2ae3e7
NA
861#if IS_ENABLED(CONFIG_IPV6)
862 &dev_attr_multicast_mld_version.attr,
863#endif
4df53d8b 864#endif
34666d46 865#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
4df53d8b
PM
866 &dev_attr_nf_call_iptables.attr,
867 &dev_attr_nf_call_ip6tables.attr,
868 &dev_attr_nf_call_arptables.attr,
243a2e63
VY
869#endif
870#ifdef CONFIG_BRIDGE_VLAN_FILTERING
871 &dev_attr_vlan_filtering.attr,
204177f3 872 &dev_attr_vlan_protocol.attr,
96a20d9d 873 &dev_attr_default_pvid.attr,
6dada9b1 874 &dev_attr_vlan_stats_enabled.attr,
9163a0fc 875 &dev_attr_vlan_stats_per_port.attr,
0909e117 876#endif
1da177e4
LT
877 NULL
878};
879
cddbb79f 880static const struct attribute_group bridge_group = {
1da177e4
LT
881 .name = SYSFS_BRIDGE_ATTR,
882 .attrs = bridge_attrs,
883};
884
885/*
886 * Export the forwarding information table as a binary file
887 * The records are struct __fdb_entry.
888 *
889 * Returns the number of bytes read.
890 */
2c3c8bea 891static ssize_t brforward_read(struct file *filp, struct kobject *kobj,
91a69029
ZR
892 struct bin_attribute *bin_attr,
893 char *buf, loff_t off, size_t count)
1da177e4 894{
aeb7ed14 895 struct device *dev = kobj_to_dev(kobj);
43cb76d9 896 struct net_bridge *br = to_bridge(dev);
1da177e4
LT
897 int n;
898
899 /* must read whole records */
900 if (off % sizeof(struct __fdb_entry) != 0)
901 return -EINVAL;
902
9d6f229f 903 n = br_fdb_fillbuf(br, buf,
1da177e4
LT
904 count / sizeof(struct __fdb_entry),
905 off / sizeof(struct __fdb_entry));
906
907 if (n > 0)
908 n *= sizeof(struct __fdb_entry);
9d6f229f 909
1da177e4
LT
910 return n;
911}
912
913static struct bin_attribute bridge_forward = {
914 .attr = { .name = SYSFS_BRIDGE_FDB,
d6444062 915 .mode = 0444, },
1da177e4
LT
916 .read = brforward_read,
917};
918
919/*
920 * Add entries in sysfs onto the existing network class device
921 * for the bridge.
922 * Adds a attribute group "bridge" containing tuning parameters.
923 * Binary attribute containing the forward table
924 * Sub directory to hold links to interfaces.
925 *
926 * Note: the ifobj exists only to be a subdirectory
927 * to hold links. The ifobj exists in same data structure
928 * as it's parent the bridge so reference counting works.
929 */
930int br_sysfs_addbr(struct net_device *dev)
931{
43cb76d9 932 struct kobject *brobj = &dev->dev.kobj;
1da177e4
LT
933 struct net_bridge *br = netdev_priv(dev);
934 int err;
935
936 err = sysfs_create_group(brobj, &bridge_group);
937 if (err) {
938 pr_info("%s: can't create group %s/%s\n",
0dc47877 939 __func__, dev->name, bridge_group.name);
1da177e4
LT
940 goto out1;
941 }
942
943 err = sysfs_create_bin_file(brobj, &bridge_forward);
944 if (err) {
1842c4be 945 pr_info("%s: can't create attribute file %s/%s\n",
0dc47877 946 __func__, dev->name, bridge_forward.attr.name);
1da177e4
LT
947 goto out2;
948 }
949
43b98c4a
GKH
950 br->ifobj = kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR, brobj);
951 if (!br->ifobj) {
1da177e4 952 pr_info("%s: can't add kobject (directory) %s/%s\n",
0dc47877 953 __func__, dev->name, SYSFS_BRIDGE_PORT_SUBDIR);
b5958963 954 err = -ENOMEM;
1da177e4
LT
955 goto out3;
956 }
957 return 0;
958 out3:
43cb76d9 959 sysfs_remove_bin_file(&dev->dev.kobj, &bridge_forward);
1da177e4 960 out2:
43cb76d9 961 sysfs_remove_group(&dev->dev.kobj, &bridge_group);
1da177e4
LT
962 out1:
963 return err;
964
965}
966
967void br_sysfs_delbr(struct net_device *dev)
968{
43cb76d9 969 struct kobject *kobj = &dev->dev.kobj;
1da177e4
LT
970 struct net_bridge *br = netdev_priv(dev);
971
78a2d906 972 kobject_put(br->ifobj);
1da177e4
LT
973 sysfs_remove_bin_file(kobj, &bridge_forward);
974 sysfs_remove_group(kobj, &bridge_group);
975}