]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/bridge/br_sysfs_br.c
netfilter: bridge: prevent UAF in brnf_exit_net()
[mirror_ubuntu-bionic-kernel.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);
fda93d92
SH
275 return sprintf(buf, "%x:%x:%x:%x:%x:%x\n",
276 br->group_addr[0], br->group_addr[1],
277 br->group_addr[2], br->group_addr[3],
278 br->group_addr[4], br->group_addr[5]);
279}
280
fbf2671b 281static ssize_t group_addr_store(struct device *d,
43cb76d9
GKH
282 struct device_attribute *attr,
283 const char *buf, size_t len)
fda93d92 284{
43cb76d9 285 struct net_bridge *br = to_bridge(d);
4197f24b 286 u8 new_addr[6];
fda93d92
SH
287 int i;
288
cb990503 289 if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
fda93d92
SH
290 return -EPERM;
291
4197f24b 292 if (sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
fda93d92
SH
293 &new_addr[0], &new_addr[1], &new_addr[2],
294 &new_addr[3], &new_addr[4], &new_addr[5]) != 6)
295 return -EINVAL;
296
46acc460 297 if (!is_link_local_ether_addr(new_addr))
fda93d92
SH
298 return -EINVAL;
299
f64f9e71
JP
300 if (new_addr[5] == 1 || /* 802.3x Pause address */
301 new_addr[5] == 2 || /* 802.3ad Slow protocols */
302 new_addr[5] == 3) /* 802.1X PAE address */
fda93d92
SH
303 return -EINVAL;
304
204177f3
TM
305 if (!rtnl_trylock())
306 return restart_syscall();
307
fda93d92
SH
308 spin_lock_bh(&br->lock);
309 for (i = 0; i < 6; i++)
310 br->group_addr[i] = new_addr[i];
311 spin_unlock_bh(&br->lock);
204177f3
TM
312
313 br->group_addr_set = true;
314 br_recalculate_fwd_mask(br);
047831a9 315 netdev_state_change(br->dev);
204177f3
TM
316
317 rtnl_unlock();
318
fda93d92
SH
319 return len;
320}
321
fbf2671b 322static DEVICE_ATTR_RW(group_addr);
fda93d92 323
14f31bb3
XL
324static int set_flush(struct net_bridge *br, unsigned long val)
325{
326 br_fdb_flush(br);
327 return 0;
328}
329
fbf2671b 330static ssize_t flush_store(struct device *d,
9cf63747
SH
331 struct device_attribute *attr,
332 const char *buf, size_t len)
333{
14f31bb3 334 return store_bridge_parm(d, buf, len, set_flush);
9cf63747 335}
fbf2671b 336static DEVICE_ATTR_WO(flush);
fda93d92 337
0909e117 338#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
fbf2671b 339static ssize_t multicast_router_show(struct device *d,
0909e117
HX
340 struct device_attribute *attr, char *buf)
341{
342 struct net_bridge *br = to_bridge(d);
343 return sprintf(buf, "%d\n", br->multicast_router);
344}
345
fbf2671b 346static ssize_t multicast_router_store(struct device *d,
0909e117
HX
347 struct device_attribute *attr,
348 const char *buf, size_t len)
349{
350 return store_bridge_parm(d, buf, len, br_multicast_set_router);
351}
fbf2671b 352static DEVICE_ATTR_RW(multicast_router);
561f1103 353
fbf2671b 354static ssize_t multicast_snooping_show(struct device *d,
561f1103
HX
355 struct device_attribute *attr,
356 char *buf)
357{
358 struct net_bridge *br = to_bridge(d);
359 return sprintf(buf, "%d\n", !br->multicast_disabled);
360}
361
fbf2671b 362static ssize_t multicast_snooping_store(struct device *d,
561f1103
HX
363 struct device_attribute *attr,
364 const char *buf, size_t len)
365{
366 return store_bridge_parm(d, buf, len, br_multicast_toggle);
367}
fbf2671b 368static DEVICE_ATTR_RW(multicast_snooping);
b195167f 369
fbf2671b 370static ssize_t multicast_query_use_ifaddr_show(struct device *d,
371 struct device_attribute *attr,
372 char *buf)
1c8ad5bf
CW
373{
374 struct net_bridge *br = to_bridge(d);
375 return sprintf(buf, "%d\n", br->multicast_query_use_ifaddr);
376}
377
378static int set_query_use_ifaddr(struct net_bridge *br, unsigned long val)
379{
380 br->multicast_query_use_ifaddr = !!val;
381 return 0;
382}
383
384static ssize_t
fbf2671b 385multicast_query_use_ifaddr_store(struct device *d,
1c8ad5bf
CW
386 struct device_attribute *attr,
387 const char *buf, size_t len)
388{
389 return store_bridge_parm(d, buf, len, set_query_use_ifaddr);
390}
fbf2671b 391static DEVICE_ATTR_RW(multicast_query_use_ifaddr);
1c8ad5bf 392
fbf2671b 393static ssize_t multicast_querier_show(struct device *d,
c5c23260
HX
394 struct device_attribute *attr,
395 char *buf)
396{
397 struct net_bridge *br = to_bridge(d);
398 return sprintf(buf, "%d\n", br->multicast_querier);
399}
400
fbf2671b 401static ssize_t multicast_querier_store(struct device *d,
c5c23260
HX
402 struct device_attribute *attr,
403 const char *buf, size_t len)
404{
405 return store_bridge_parm(d, buf, len, br_multicast_set_querier);
406}
fbf2671b 407static DEVICE_ATTR_RW(multicast_querier);
c5c23260 408
fbf2671b 409static ssize_t hash_elasticity_show(struct device *d,
b195167f
HX
410 struct device_attribute *attr, char *buf)
411{
412 struct net_bridge *br = to_bridge(d);
413 return sprintf(buf, "%u\n", br->hash_elasticity);
414}
415
416static int set_elasticity(struct net_bridge *br, unsigned long val)
417{
418 br->hash_elasticity = val;
419 return 0;
420}
421
fbf2671b 422static ssize_t hash_elasticity_store(struct device *d,
b195167f
HX
423 struct device_attribute *attr,
424 const char *buf, size_t len)
425{
426 return store_bridge_parm(d, buf, len, set_elasticity);
427}
fbf2671b 428static DEVICE_ATTR_RW(hash_elasticity);
b195167f 429
fbf2671b 430static ssize_t hash_max_show(struct device *d, struct device_attribute *attr,
b195167f
HX
431 char *buf)
432{
433 struct net_bridge *br = to_bridge(d);
434 return sprintf(buf, "%u\n", br->hash_max);
435}
436
fbf2671b 437static ssize_t hash_max_store(struct device *d, struct device_attribute *attr,
b195167f
HX
438 const char *buf, size_t len)
439{
440 return store_bridge_parm(d, buf, len, br_multicast_set_hash_max);
441}
fbf2671b 442static DEVICE_ATTR_RW(hash_max);
d902eee4 443
5e923585
NA
444static ssize_t multicast_igmp_version_show(struct device *d,
445 struct device_attribute *attr,
446 char *buf)
447{
448 struct net_bridge *br = to_bridge(d);
449
450 return sprintf(buf, "%u\n", br->multicast_igmp_version);
451}
452
453static ssize_t multicast_igmp_version_store(struct device *d,
454 struct device_attribute *attr,
455 const char *buf, size_t len)
456{
457 return store_bridge_parm(d, buf, len, br_multicast_set_igmp_version);
458}
459static DEVICE_ATTR_RW(multicast_igmp_version);
460
fbf2671b 461static ssize_t multicast_last_member_count_show(struct device *d,
d902eee4
HX
462 struct device_attribute *attr,
463 char *buf)
464{
465 struct net_bridge *br = to_bridge(d);
466 return sprintf(buf, "%u\n", br->multicast_last_member_count);
467}
468
469static int set_last_member_count(struct net_bridge *br, unsigned long val)
470{
471 br->multicast_last_member_count = val;
472 return 0;
473}
474
fbf2671b 475static ssize_t multicast_last_member_count_store(struct device *d,
d902eee4
HX
476 struct device_attribute *attr,
477 const char *buf, size_t len)
478{
479 return store_bridge_parm(d, buf, len, set_last_member_count);
480}
fbf2671b 481static DEVICE_ATTR_RW(multicast_last_member_count);
d902eee4 482
fbf2671b 483static ssize_t multicast_startup_query_count_show(
d902eee4
HX
484 struct device *d, struct device_attribute *attr, char *buf)
485{
486 struct net_bridge *br = to_bridge(d);
487 return sprintf(buf, "%u\n", br->multicast_startup_query_count);
488}
489
490static int set_startup_query_count(struct net_bridge *br, unsigned long val)
491{
492 br->multicast_startup_query_count = val;
493 return 0;
494}
495
fbf2671b 496static ssize_t multicast_startup_query_count_store(
d902eee4
HX
497 struct device *d, struct device_attribute *attr, const char *buf,
498 size_t len)
499{
500 return store_bridge_parm(d, buf, len, set_startup_query_count);
501}
fbf2671b 502static DEVICE_ATTR_RW(multicast_startup_query_count);
d902eee4 503
fbf2671b 504static ssize_t multicast_last_member_interval_show(
d902eee4
HX
505 struct device *d, struct device_attribute *attr, char *buf)
506{
507 struct net_bridge *br = to_bridge(d);
508 return sprintf(buf, "%lu\n",
509 jiffies_to_clock_t(br->multicast_last_member_interval));
510}
511
512static int set_last_member_interval(struct net_bridge *br, unsigned long val)
513{
514 br->multicast_last_member_interval = clock_t_to_jiffies(val);
515 return 0;
516}
517
fbf2671b 518static ssize_t multicast_last_member_interval_store(
d902eee4
HX
519 struct device *d, struct device_attribute *attr, const char *buf,
520 size_t len)
521{
522 return store_bridge_parm(d, buf, len, set_last_member_interval);
523}
fbf2671b 524static DEVICE_ATTR_RW(multicast_last_member_interval);
d902eee4 525
fbf2671b 526static ssize_t multicast_membership_interval_show(
d902eee4
HX
527 struct device *d, struct device_attribute *attr, char *buf)
528{
529 struct net_bridge *br = to_bridge(d);
530 return sprintf(buf, "%lu\n",
531 jiffies_to_clock_t(br->multicast_membership_interval));
532}
533
534static int set_membership_interval(struct net_bridge *br, unsigned long val)
535{
536 br->multicast_membership_interval = clock_t_to_jiffies(val);
537 return 0;
538}
539
fbf2671b 540static ssize_t multicast_membership_interval_store(
d902eee4
HX
541 struct device *d, struct device_attribute *attr, const char *buf,
542 size_t len)
543{
544 return store_bridge_parm(d, buf, len, set_membership_interval);
545}
fbf2671b 546static DEVICE_ATTR_RW(multicast_membership_interval);
d902eee4 547
fbf2671b 548static ssize_t multicast_querier_interval_show(struct device *d,
d902eee4
HX
549 struct device_attribute *attr,
550 char *buf)
551{
552 struct net_bridge *br = to_bridge(d);
553 return sprintf(buf, "%lu\n",
554 jiffies_to_clock_t(br->multicast_querier_interval));
555}
556
557static int set_querier_interval(struct net_bridge *br, unsigned long val)
558{
559 br->multicast_querier_interval = clock_t_to_jiffies(val);
560 return 0;
561}
562
fbf2671b 563static ssize_t multicast_querier_interval_store(struct device *d,
d902eee4
HX
564 struct device_attribute *attr,
565 const char *buf, size_t len)
566{
567 return store_bridge_parm(d, buf, len, set_querier_interval);
568}
fbf2671b 569static DEVICE_ATTR_RW(multicast_querier_interval);
d902eee4 570
fbf2671b 571static ssize_t multicast_query_interval_show(struct device *d,
d902eee4
HX
572 struct device_attribute *attr,
573 char *buf)
574{
575 struct net_bridge *br = to_bridge(d);
576 return sprintf(buf, "%lu\n",
577 jiffies_to_clock_t(br->multicast_query_interval));
578}
579
580static int set_query_interval(struct net_bridge *br, unsigned long val)
581{
582 br->multicast_query_interval = clock_t_to_jiffies(val);
583 return 0;
584}
585
fbf2671b 586static ssize_t multicast_query_interval_store(struct device *d,
d902eee4
HX
587 struct device_attribute *attr,
588 const char *buf, size_t len)
589{
590 return store_bridge_parm(d, buf, len, set_query_interval);
591}
fbf2671b 592static DEVICE_ATTR_RW(multicast_query_interval);
d902eee4 593
fbf2671b 594static ssize_t multicast_query_response_interval_show(
d902eee4
HX
595 struct device *d, struct device_attribute *attr, char *buf)
596{
597 struct net_bridge *br = to_bridge(d);
598 return sprintf(
599 buf, "%lu\n",
600 jiffies_to_clock_t(br->multicast_query_response_interval));
601}
602
603static int set_query_response_interval(struct net_bridge *br, unsigned long val)
604{
605 br->multicast_query_response_interval = clock_t_to_jiffies(val);
606 return 0;
607}
608
fbf2671b 609static ssize_t multicast_query_response_interval_store(
d902eee4
HX
610 struct device *d, struct device_attribute *attr, const char *buf,
611 size_t len)
612{
613 return store_bridge_parm(d, buf, len, set_query_response_interval);
614}
fbf2671b 615static DEVICE_ATTR_RW(multicast_query_response_interval);
d902eee4 616
fbf2671b 617static ssize_t multicast_startup_query_interval_show(
d902eee4
HX
618 struct device *d, struct device_attribute *attr, char *buf)
619{
620 struct net_bridge *br = to_bridge(d);
621 return sprintf(
622 buf, "%lu\n",
623 jiffies_to_clock_t(br->multicast_startup_query_interval));
624}
625
626static int set_startup_query_interval(struct net_bridge *br, unsigned long val)
627{
628 br->multicast_startup_query_interval = clock_t_to_jiffies(val);
629 return 0;
630}
631
fbf2671b 632static ssize_t multicast_startup_query_interval_store(
d902eee4
HX
633 struct device *d, struct device_attribute *attr, const char *buf,
634 size_t len)
635{
636 return store_bridge_parm(d, buf, len, set_startup_query_interval);
637}
fbf2671b 638static DEVICE_ATTR_RW(multicast_startup_query_interval);
1080ab95
NA
639
640static ssize_t multicast_stats_enabled_show(struct device *d,
641 struct device_attribute *attr,
642 char *buf)
643{
644 struct net_bridge *br = to_bridge(d);
645
646 return sprintf(buf, "%u\n", br->multicast_stats_enabled);
647}
648
649static int set_stats_enabled(struct net_bridge *br, unsigned long val)
650{
651 br->multicast_stats_enabled = !!val;
652 return 0;
653}
654
655static ssize_t multicast_stats_enabled_store(struct device *d,
656 struct device_attribute *attr,
657 const char *buf,
658 size_t len)
659{
660 return store_bridge_parm(d, buf, len, set_stats_enabled);
661}
662static DEVICE_ATTR_RW(multicast_stats_enabled);
aa2ae3e7
NA
663
664#if IS_ENABLED(CONFIG_IPV6)
665static ssize_t multicast_mld_version_show(struct device *d,
666 struct device_attribute *attr,
667 char *buf)
668{
669 struct net_bridge *br = to_bridge(d);
670
671 return sprintf(buf, "%u\n", br->multicast_mld_version);
672}
673
674static ssize_t multicast_mld_version_store(struct device *d,
675 struct device_attribute *attr,
676 const char *buf, size_t len)
677{
678 return store_bridge_parm(d, buf, len, br_multicast_set_mld_version);
679}
680static DEVICE_ATTR_RW(multicast_mld_version);
681#endif
0909e117 682#endif
34666d46 683#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
fbf2671b 684static ssize_t nf_call_iptables_show(
4df53d8b
PM
685 struct device *d, struct device_attribute *attr, char *buf)
686{
687 struct net_bridge *br = to_bridge(d);
fd701d89 688 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_NF_CALL_IPTABLES));
4df53d8b
PM
689}
690
691static int set_nf_call_iptables(struct net_bridge *br, unsigned long val)
692{
fd701d89 693 br_opt_toggle(br, BROPT_NF_CALL_IPTABLES, !!val);
4df53d8b
PM
694 return 0;
695}
696
fbf2671b 697static ssize_t nf_call_iptables_store(
4df53d8b
PM
698 struct device *d, struct device_attribute *attr, const char *buf,
699 size_t len)
700{
701 return store_bridge_parm(d, buf, len, set_nf_call_iptables);
702}
fbf2671b 703static DEVICE_ATTR_RW(nf_call_iptables);
4df53d8b 704
fbf2671b 705static ssize_t nf_call_ip6tables_show(
4df53d8b
PM
706 struct device *d, struct device_attribute *attr, char *buf)
707{
708 struct net_bridge *br = to_bridge(d);
fd701d89 709 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_NF_CALL_IP6TABLES));
4df53d8b
PM
710}
711
712static int set_nf_call_ip6tables(struct net_bridge *br, unsigned long val)
713{
fd701d89 714 br_opt_toggle(br, BROPT_NF_CALL_IP6TABLES, !!val);
4df53d8b
PM
715 return 0;
716}
717
fbf2671b 718static ssize_t nf_call_ip6tables_store(
4df53d8b
PM
719 struct device *d, struct device_attribute *attr, const char *buf,
720 size_t len)
721{
722 return store_bridge_parm(d, buf, len, set_nf_call_ip6tables);
723}
fbf2671b 724static DEVICE_ATTR_RW(nf_call_ip6tables);
4df53d8b 725
fbf2671b 726static ssize_t nf_call_arptables_show(
4df53d8b
PM
727 struct device *d, struct device_attribute *attr, char *buf)
728{
729 struct net_bridge *br = to_bridge(d);
fd701d89 730 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_NF_CALL_ARPTABLES));
4df53d8b
PM
731}
732
733static int set_nf_call_arptables(struct net_bridge *br, unsigned long val)
734{
fd701d89 735 br_opt_toggle(br, BROPT_NF_CALL_ARPTABLES, !!val);
4df53d8b
PM
736 return 0;
737}
738
fbf2671b 739static ssize_t nf_call_arptables_store(
4df53d8b
PM
740 struct device *d, struct device_attribute *attr, const char *buf,
741 size_t len)
742{
743 return store_bridge_parm(d, buf, len, set_nf_call_arptables);
744}
fbf2671b 745static DEVICE_ATTR_RW(nf_call_arptables);
4df53d8b 746#endif
243a2e63 747#ifdef CONFIG_BRIDGE_VLAN_FILTERING
fbf2671b 748static ssize_t vlan_filtering_show(struct device *d,
243a2e63
VY
749 struct device_attribute *attr,
750 char *buf)
751{
752 struct net_bridge *br = to_bridge(d);
33c3933a 753 return sprintf(buf, "%d\n", br_opt_get(br, BROPT_VLAN_ENABLED));
243a2e63
VY
754}
755
fbf2671b 756static ssize_t vlan_filtering_store(struct device *d,
243a2e63
VY
757 struct device_attribute *attr,
758 const char *buf, size_t len)
759{
760 return store_bridge_parm(d, buf, len, br_vlan_filter_toggle);
761}
fbf2671b 762static DEVICE_ATTR_RW(vlan_filtering);
204177f3
TM
763
764static ssize_t vlan_protocol_show(struct device *d,
765 struct device_attribute *attr,
766 char *buf)
767{
768 struct net_bridge *br = to_bridge(d);
769 return sprintf(buf, "%#06x\n", ntohs(br->vlan_proto));
770}
771
772static ssize_t vlan_protocol_store(struct device *d,
773 struct device_attribute *attr,
774 const char *buf, size_t len)
775{
776 return store_bridge_parm(d, buf, len, br_vlan_set_proto);
777}
778static DEVICE_ATTR_RW(vlan_protocol);
96a20d9d
VY
779
780static ssize_t default_pvid_show(struct device *d,
781 struct device_attribute *attr,
782 char *buf)
783{
784 struct net_bridge *br = to_bridge(d);
785 return sprintf(buf, "%d\n", br->default_pvid);
786}
787
788static ssize_t default_pvid_store(struct device *d,
789 struct device_attribute *attr,
790 const char *buf, size_t len)
791{
792 return store_bridge_parm(d, buf, len, br_vlan_set_default_pvid);
793}
794static DEVICE_ATTR_RW(default_pvid);
6dada9b1
NA
795
796static ssize_t vlan_stats_enabled_show(struct device *d,
797 struct device_attribute *attr,
798 char *buf)
799{
800 struct net_bridge *br = to_bridge(d);
33c3933a 801 return sprintf(buf, "%u\n", br_opt_get(br, BROPT_VLAN_STATS_ENABLED));
6dada9b1
NA
802}
803
804static ssize_t vlan_stats_enabled_store(struct device *d,
805 struct device_attribute *attr,
806 const char *buf, size_t len)
807{
808 return store_bridge_parm(d, buf, len, br_vlan_set_stats);
809}
810static DEVICE_ATTR_RW(vlan_stats_enabled);
243a2e63 811#endif
0909e117 812
1da177e4 813static struct attribute *bridge_attrs[] = {
43cb76d9
GKH
814 &dev_attr_forward_delay.attr,
815 &dev_attr_hello_time.attr,
816 &dev_attr_max_age.attr,
817 &dev_attr_ageing_time.attr,
818 &dev_attr_stp_state.attr,
515853cc 819 &dev_attr_group_fwd_mask.attr,
43cb76d9
GKH
820 &dev_attr_priority.attr,
821 &dev_attr_bridge_id.attr,
822 &dev_attr_root_id.attr,
823 &dev_attr_root_path_cost.attr,
824 &dev_attr_root_port.attr,
825 &dev_attr_topology_change.attr,
826 &dev_attr_topology_change_detected.attr,
827 &dev_attr_hello_timer.attr,
828 &dev_attr_tcn_timer.attr,
829 &dev_attr_topology_change_timer.attr,
830 &dev_attr_gc_timer.attr,
831 &dev_attr_group_addr.attr,
9cf63747 832 &dev_attr_flush.attr,
0909e117
HX
833#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
834 &dev_attr_multicast_router.attr,
561f1103 835 &dev_attr_multicast_snooping.attr,
c5c23260 836 &dev_attr_multicast_querier.attr,
1c8ad5bf 837 &dev_attr_multicast_query_use_ifaddr.attr,
b195167f
HX
838 &dev_attr_hash_elasticity.attr,
839 &dev_attr_hash_max.attr,
d902eee4
HX
840 &dev_attr_multicast_last_member_count.attr,
841 &dev_attr_multicast_startup_query_count.attr,
842 &dev_attr_multicast_last_member_interval.attr,
843 &dev_attr_multicast_membership_interval.attr,
844 &dev_attr_multicast_querier_interval.attr,
845 &dev_attr_multicast_query_interval.attr,
846 &dev_attr_multicast_query_response_interval.attr,
847 &dev_attr_multicast_startup_query_interval.attr,
1080ab95 848 &dev_attr_multicast_stats_enabled.attr,
5e923585 849 &dev_attr_multicast_igmp_version.attr,
aa2ae3e7
NA
850#if IS_ENABLED(CONFIG_IPV6)
851 &dev_attr_multicast_mld_version.attr,
852#endif
4df53d8b 853#endif
34666d46 854#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
4df53d8b
PM
855 &dev_attr_nf_call_iptables.attr,
856 &dev_attr_nf_call_ip6tables.attr,
857 &dev_attr_nf_call_arptables.attr,
243a2e63
VY
858#endif
859#ifdef CONFIG_BRIDGE_VLAN_FILTERING
860 &dev_attr_vlan_filtering.attr,
204177f3 861 &dev_attr_vlan_protocol.attr,
96a20d9d 862 &dev_attr_default_pvid.attr,
6dada9b1 863 &dev_attr_vlan_stats_enabled.attr,
0909e117 864#endif
1da177e4
LT
865 NULL
866};
867
cddbb79f 868static const struct attribute_group bridge_group = {
1da177e4
LT
869 .name = SYSFS_BRIDGE_ATTR,
870 .attrs = bridge_attrs,
871};
872
873/*
874 * Export the forwarding information table as a binary file
875 * The records are struct __fdb_entry.
876 *
877 * Returns the number of bytes read.
878 */
2c3c8bea 879static ssize_t brforward_read(struct file *filp, struct kobject *kobj,
91a69029
ZR
880 struct bin_attribute *bin_attr,
881 char *buf, loff_t off, size_t count)
1da177e4 882{
aeb7ed14 883 struct device *dev = kobj_to_dev(kobj);
43cb76d9 884 struct net_bridge *br = to_bridge(dev);
1da177e4
LT
885 int n;
886
887 /* must read whole records */
888 if (off % sizeof(struct __fdb_entry) != 0)
889 return -EINVAL;
890
9d6f229f 891 n = br_fdb_fillbuf(br, buf,
1da177e4
LT
892 count / sizeof(struct __fdb_entry),
893 off / sizeof(struct __fdb_entry));
894
895 if (n > 0)
896 n *= sizeof(struct __fdb_entry);
9d6f229f 897
1da177e4
LT
898 return n;
899}
900
901static struct bin_attribute bridge_forward = {
902 .attr = { .name = SYSFS_BRIDGE_FDB,
7b595756 903 .mode = S_IRUGO, },
1da177e4
LT
904 .read = brforward_read,
905};
906
907/*
908 * Add entries in sysfs onto the existing network class device
909 * for the bridge.
910 * Adds a attribute group "bridge" containing tuning parameters.
911 * Binary attribute containing the forward table
912 * Sub directory to hold links to interfaces.
913 *
914 * Note: the ifobj exists only to be a subdirectory
915 * to hold links. The ifobj exists in same data structure
916 * as it's parent the bridge so reference counting works.
917 */
918int br_sysfs_addbr(struct net_device *dev)
919{
43cb76d9 920 struct kobject *brobj = &dev->dev.kobj;
1da177e4
LT
921 struct net_bridge *br = netdev_priv(dev);
922 int err;
923
924 err = sysfs_create_group(brobj, &bridge_group);
925 if (err) {
926 pr_info("%s: can't create group %s/%s\n",
0dc47877 927 __func__, dev->name, bridge_group.name);
1da177e4
LT
928 goto out1;
929 }
930
931 err = sysfs_create_bin_file(brobj, &bridge_forward);
932 if (err) {
1842c4be 933 pr_info("%s: can't create attribute file %s/%s\n",
0dc47877 934 __func__, dev->name, bridge_forward.attr.name);
1da177e4
LT
935 goto out2;
936 }
937
43b98c4a
GKH
938 br->ifobj = kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR, brobj);
939 if (!br->ifobj) {
1da177e4 940 pr_info("%s: can't add kobject (directory) %s/%s\n",
0dc47877 941 __func__, dev->name, SYSFS_BRIDGE_PORT_SUBDIR);
b5958963 942 err = -ENOMEM;
1da177e4
LT
943 goto out3;
944 }
945 return 0;
946 out3:
43cb76d9 947 sysfs_remove_bin_file(&dev->dev.kobj, &bridge_forward);
1da177e4 948 out2:
43cb76d9 949 sysfs_remove_group(&dev->dev.kobj, &bridge_group);
1da177e4
LT
950 out1:
951 return err;
952
953}
954
955void br_sysfs_delbr(struct net_device *dev)
956{
43cb76d9 957 struct kobject *kobj = &dev->dev.kobj;
1da177e4
LT
958 struct net_bridge *br = netdev_priv(dev);
959
78a2d906 960 kobject_put(br->ifobj);
1da177e4
LT
961 sysfs_remove_bin_file(kobj, &bridge_forward);
962 sysfs_remove_group(kobj, &bridge_group);
963}