2 * Sysfs attributes of bridge
3 * Linux ethernet bridge
6 * Stephen Hemminger <shemminger@osdl.org>
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.
14 #include <linux/capability.h>
15 #include <linux/kernel.h>
16 #include <linux/netdevice.h>
17 #include <linux/etherdevice.h>
18 #include <linux/if_bridge.h>
19 #include <linux/rtnetlink.h>
20 #include <linux/spinlock.h>
21 #include <linux/times.h>
23 #include "br_private.h"
25 #define to_bridge(cd) ((struct net_bridge *)netdev_priv(to_net_dev(cd)))
28 * Common code for storing bridge parameters.
30 static ssize_t
store_bridge_parm(struct device
*d
,
31 const char *buf
, size_t len
,
32 int (*set
)(struct net_bridge
*, unsigned long))
34 struct net_bridge
*br
= to_bridge(d
);
39 if (!ns_capable(dev_net(br
->dev
)->user_ns
, CAP_NET_ADMIN
))
42 val
= simple_strtoul(buf
, &endp
, 0);
47 return restart_syscall();
49 err
= (*set
)(br
, val
);
51 netdev_state_change(br
->dev
);
54 return err
? err
: len
;
58 static ssize_t
forward_delay_show(struct device
*d
,
59 struct device_attribute
*attr
, char *buf
)
61 struct net_bridge
*br
= to_bridge(d
);
62 return sprintf(buf
, "%lu\n", jiffies_to_clock_t(br
->forward_delay
));
65 static ssize_t
forward_delay_store(struct device
*d
,
66 struct device_attribute
*attr
,
67 const char *buf
, size_t len
)
69 return store_bridge_parm(d
, buf
, len
, br_set_forward_delay
);
71 static DEVICE_ATTR_RW(forward_delay
);
73 static ssize_t
hello_time_show(struct device
*d
, struct device_attribute
*attr
,
76 return sprintf(buf
, "%lu\n",
77 jiffies_to_clock_t(to_bridge(d
)->hello_time
));
80 static ssize_t
hello_time_store(struct device
*d
,
81 struct device_attribute
*attr
, const char *buf
,
84 return store_bridge_parm(d
, buf
, len
, br_set_hello_time
);
86 static DEVICE_ATTR_RW(hello_time
);
88 static ssize_t
max_age_show(struct device
*d
, struct device_attribute
*attr
,
91 return sprintf(buf
, "%lu\n",
92 jiffies_to_clock_t(to_bridge(d
)->max_age
));
95 static ssize_t
max_age_store(struct device
*d
, struct device_attribute
*attr
,
96 const char *buf
, size_t len
)
98 return store_bridge_parm(d
, buf
, len
, br_set_max_age
);
100 static DEVICE_ATTR_RW(max_age
);
102 static ssize_t
ageing_time_show(struct device
*d
,
103 struct device_attribute
*attr
, char *buf
)
105 struct net_bridge
*br
= to_bridge(d
);
106 return sprintf(buf
, "%lu\n", jiffies_to_clock_t(br
->ageing_time
));
109 static int set_ageing_time(struct net_bridge
*br
, unsigned long val
)
111 return br_set_ageing_time(br
, val
);
114 static ssize_t
ageing_time_store(struct device
*d
,
115 struct device_attribute
*attr
,
116 const char *buf
, size_t len
)
118 return store_bridge_parm(d
, buf
, len
, set_ageing_time
);
120 static DEVICE_ATTR_RW(ageing_time
);
122 static ssize_t
stp_state_show(struct device
*d
,
123 struct device_attribute
*attr
, char *buf
)
125 struct net_bridge
*br
= to_bridge(d
);
126 return sprintf(buf
, "%d\n", br
->stp_enabled
);
130 static int set_stp_state(struct net_bridge
*br
, unsigned long val
)
132 br_stp_set_enabled(br
, val
);
137 static ssize_t
stp_state_store(struct device
*d
,
138 struct device_attribute
*attr
, const char *buf
,
141 return store_bridge_parm(d
, buf
, len
, set_stp_state
);
143 static DEVICE_ATTR_RW(stp_state
);
145 static ssize_t
group_fwd_mask_show(struct device
*d
,
146 struct device_attribute
*attr
,
149 struct net_bridge
*br
= to_bridge(d
);
150 return sprintf(buf
, "%#x\n", br
->group_fwd_mask
);
153 static int set_group_fwd_mask(struct net_bridge
*br
, unsigned long val
)
155 if (val
& BR_GROUPFWD_RESTRICTED
)
158 br
->group_fwd_mask
= val
;
163 static ssize_t
group_fwd_mask_store(struct device
*d
,
164 struct device_attribute
*attr
,
168 return store_bridge_parm(d
, buf
, len
, set_group_fwd_mask
);
170 static DEVICE_ATTR_RW(group_fwd_mask
);
172 static ssize_t
priority_show(struct device
*d
, struct device_attribute
*attr
,
175 struct net_bridge
*br
= to_bridge(d
);
176 return sprintf(buf
, "%d\n",
177 (br
->bridge_id
.prio
[0] << 8) | br
->bridge_id
.prio
[1]);
180 static int set_priority(struct net_bridge
*br
, unsigned long val
)
182 br_stp_set_bridge_priority(br
, (u16
) val
);
186 static ssize_t
priority_store(struct device
*d
, struct device_attribute
*attr
,
187 const char *buf
, size_t len
)
189 return store_bridge_parm(d
, buf
, len
, set_priority
);
191 static DEVICE_ATTR_RW(priority
);
193 static ssize_t
root_id_show(struct device
*d
, struct device_attribute
*attr
,
196 return br_show_bridge_id(buf
, &to_bridge(d
)->designated_root
);
198 static DEVICE_ATTR_RO(root_id
);
200 static ssize_t
bridge_id_show(struct device
*d
, struct device_attribute
*attr
,
203 return br_show_bridge_id(buf
, &to_bridge(d
)->bridge_id
);
205 static DEVICE_ATTR_RO(bridge_id
);
207 static ssize_t
root_port_show(struct device
*d
, struct device_attribute
*attr
,
210 return sprintf(buf
, "%d\n", to_bridge(d
)->root_port
);
212 static DEVICE_ATTR_RO(root_port
);
214 static ssize_t
root_path_cost_show(struct device
*d
,
215 struct device_attribute
*attr
, char *buf
)
217 return sprintf(buf
, "%d\n", to_bridge(d
)->root_path_cost
);
219 static DEVICE_ATTR_RO(root_path_cost
);
221 static ssize_t
topology_change_show(struct device
*d
,
222 struct device_attribute
*attr
, char *buf
)
224 return sprintf(buf
, "%d\n", to_bridge(d
)->topology_change
);
226 static DEVICE_ATTR_RO(topology_change
);
228 static ssize_t
topology_change_detected_show(struct device
*d
,
229 struct device_attribute
*attr
,
232 struct net_bridge
*br
= to_bridge(d
);
233 return sprintf(buf
, "%d\n", br
->topology_change_detected
);
235 static DEVICE_ATTR_RO(topology_change_detected
);
237 static ssize_t
hello_timer_show(struct device
*d
,
238 struct device_attribute
*attr
, char *buf
)
240 struct net_bridge
*br
= to_bridge(d
);
241 return sprintf(buf
, "%ld\n", br_timer_value(&br
->hello_timer
));
243 static DEVICE_ATTR_RO(hello_timer
);
245 static ssize_t
tcn_timer_show(struct device
*d
, struct device_attribute
*attr
,
248 struct net_bridge
*br
= to_bridge(d
);
249 return sprintf(buf
, "%ld\n", br_timer_value(&br
->tcn_timer
));
251 static DEVICE_ATTR_RO(tcn_timer
);
253 static ssize_t
topology_change_timer_show(struct device
*d
,
254 struct device_attribute
*attr
,
257 struct net_bridge
*br
= to_bridge(d
);
258 return sprintf(buf
, "%ld\n", br_timer_value(&br
->topology_change_timer
));
260 static DEVICE_ATTR_RO(topology_change_timer
);
262 static ssize_t
gc_timer_show(struct device
*d
, struct device_attribute
*attr
,
265 struct net_bridge
*br
= to_bridge(d
);
266 return sprintf(buf
, "%ld\n", br_timer_value(&br
->gc_timer
));
268 static DEVICE_ATTR_RO(gc_timer
);
270 static ssize_t
group_addr_show(struct device
*d
,
271 struct device_attribute
*attr
, char *buf
)
273 struct net_bridge
*br
= to_bridge(d
);
274 return sprintf(buf
, "%x:%x:%x:%x:%x:%x\n",
275 br
->group_addr
[0], br
->group_addr
[1],
276 br
->group_addr
[2], br
->group_addr
[3],
277 br
->group_addr
[4], br
->group_addr
[5]);
280 static ssize_t
group_addr_store(struct device
*d
,
281 struct device_attribute
*attr
,
282 const char *buf
, size_t len
)
284 struct net_bridge
*br
= to_bridge(d
);
288 if (!ns_capable(dev_net(br
->dev
)->user_ns
, CAP_NET_ADMIN
))
291 if (sscanf(buf
, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
292 &new_addr
[0], &new_addr
[1], &new_addr
[2],
293 &new_addr
[3], &new_addr
[4], &new_addr
[5]) != 6)
296 if (!is_link_local_ether_addr(new_addr
))
299 if (new_addr
[5] == 1 || /* 802.3x Pause address */
300 new_addr
[5] == 2 || /* 802.3ad Slow protocols */
301 new_addr
[5] == 3) /* 802.1X PAE address */
305 return restart_syscall();
307 spin_lock_bh(&br
->lock
);
308 for (i
= 0; i
< 6; i
++)
309 br
->group_addr
[i
] = new_addr
[i
];
310 spin_unlock_bh(&br
->lock
);
312 br
->group_addr_set
= true;
313 br_recalculate_fwd_mask(br
);
314 netdev_state_change(br
->dev
);
321 static DEVICE_ATTR_RW(group_addr
);
323 static int set_flush(struct net_bridge
*br
, unsigned long val
)
329 static ssize_t
flush_store(struct device
*d
,
330 struct device_attribute
*attr
,
331 const char *buf
, size_t len
)
333 return store_bridge_parm(d
, buf
, len
, set_flush
);
335 static DEVICE_ATTR_WO(flush
);
337 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
338 static ssize_t
multicast_router_show(struct device
*d
,
339 struct device_attribute
*attr
, char *buf
)
341 struct net_bridge
*br
= to_bridge(d
);
342 return sprintf(buf
, "%d\n", br
->multicast_router
);
345 static ssize_t
multicast_router_store(struct device
*d
,
346 struct device_attribute
*attr
,
347 const char *buf
, size_t len
)
349 return store_bridge_parm(d
, buf
, len
, br_multicast_set_router
);
351 static DEVICE_ATTR_RW(multicast_router
);
353 static ssize_t
multicast_snooping_show(struct device
*d
,
354 struct device_attribute
*attr
,
357 struct net_bridge
*br
= to_bridge(d
);
358 return sprintf(buf
, "%d\n", !br
->multicast_disabled
);
361 static ssize_t
multicast_snooping_store(struct device
*d
,
362 struct device_attribute
*attr
,
363 const char *buf
, size_t len
)
365 return store_bridge_parm(d
, buf
, len
, br_multicast_toggle
);
367 static DEVICE_ATTR_RW(multicast_snooping
);
369 static ssize_t
multicast_query_use_ifaddr_show(struct device
*d
,
370 struct device_attribute
*attr
,
373 struct net_bridge
*br
= to_bridge(d
);
374 return sprintf(buf
, "%d\n", br
->multicast_query_use_ifaddr
);
377 static int set_query_use_ifaddr(struct net_bridge
*br
, unsigned long val
)
379 br
->multicast_query_use_ifaddr
= !!val
;
384 multicast_query_use_ifaddr_store(struct device
*d
,
385 struct device_attribute
*attr
,
386 const char *buf
, size_t len
)
388 return store_bridge_parm(d
, buf
, len
, set_query_use_ifaddr
);
390 static DEVICE_ATTR_RW(multicast_query_use_ifaddr
);
392 static ssize_t
multicast_querier_show(struct device
*d
,
393 struct device_attribute
*attr
,
396 struct net_bridge
*br
= to_bridge(d
);
397 return sprintf(buf
, "%d\n", br
->multicast_querier
);
400 static ssize_t
multicast_querier_store(struct device
*d
,
401 struct device_attribute
*attr
,
402 const char *buf
, size_t len
)
404 return store_bridge_parm(d
, buf
, len
, br_multicast_set_querier
);
406 static DEVICE_ATTR_RW(multicast_querier
);
408 static ssize_t
hash_elasticity_show(struct device
*d
,
409 struct device_attribute
*attr
, char *buf
)
411 struct net_bridge
*br
= to_bridge(d
);
412 return sprintf(buf
, "%u\n", br
->hash_elasticity
);
415 static int set_elasticity(struct net_bridge
*br
, unsigned long val
)
417 br
->hash_elasticity
= val
;
421 static ssize_t
hash_elasticity_store(struct device
*d
,
422 struct device_attribute
*attr
,
423 const char *buf
, size_t len
)
425 return store_bridge_parm(d
, buf
, len
, set_elasticity
);
427 static DEVICE_ATTR_RW(hash_elasticity
);
429 static ssize_t
hash_max_show(struct device
*d
, struct device_attribute
*attr
,
432 struct net_bridge
*br
= to_bridge(d
);
433 return sprintf(buf
, "%u\n", br
->hash_max
);
436 static ssize_t
hash_max_store(struct device
*d
, struct device_attribute
*attr
,
437 const char *buf
, size_t len
)
439 return store_bridge_parm(d
, buf
, len
, br_multicast_set_hash_max
);
441 static DEVICE_ATTR_RW(hash_max
);
443 static ssize_t
multicast_last_member_count_show(struct device
*d
,
444 struct device_attribute
*attr
,
447 struct net_bridge
*br
= to_bridge(d
);
448 return sprintf(buf
, "%u\n", br
->multicast_last_member_count
);
451 static int set_last_member_count(struct net_bridge
*br
, unsigned long val
)
453 br
->multicast_last_member_count
= val
;
457 static ssize_t
multicast_last_member_count_store(struct device
*d
,
458 struct device_attribute
*attr
,
459 const char *buf
, size_t len
)
461 return store_bridge_parm(d
, buf
, len
, set_last_member_count
);
463 static DEVICE_ATTR_RW(multicast_last_member_count
);
465 static ssize_t
multicast_startup_query_count_show(
466 struct device
*d
, struct device_attribute
*attr
, char *buf
)
468 struct net_bridge
*br
= to_bridge(d
);
469 return sprintf(buf
, "%u\n", br
->multicast_startup_query_count
);
472 static int set_startup_query_count(struct net_bridge
*br
, unsigned long val
)
474 br
->multicast_startup_query_count
= val
;
478 static ssize_t
multicast_startup_query_count_store(
479 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
482 return store_bridge_parm(d
, buf
, len
, set_startup_query_count
);
484 static DEVICE_ATTR_RW(multicast_startup_query_count
);
486 static ssize_t
multicast_last_member_interval_show(
487 struct device
*d
, struct device_attribute
*attr
, char *buf
)
489 struct net_bridge
*br
= to_bridge(d
);
490 return sprintf(buf
, "%lu\n",
491 jiffies_to_clock_t(br
->multicast_last_member_interval
));
494 static int set_last_member_interval(struct net_bridge
*br
, unsigned long val
)
496 br
->multicast_last_member_interval
= clock_t_to_jiffies(val
);
500 static ssize_t
multicast_last_member_interval_store(
501 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
504 return store_bridge_parm(d
, buf
, len
, set_last_member_interval
);
506 static DEVICE_ATTR_RW(multicast_last_member_interval
);
508 static ssize_t
multicast_membership_interval_show(
509 struct device
*d
, struct device_attribute
*attr
, char *buf
)
511 struct net_bridge
*br
= to_bridge(d
);
512 return sprintf(buf
, "%lu\n",
513 jiffies_to_clock_t(br
->multicast_membership_interval
));
516 static int set_membership_interval(struct net_bridge
*br
, unsigned long val
)
518 br
->multicast_membership_interval
= clock_t_to_jiffies(val
);
522 static ssize_t
multicast_membership_interval_store(
523 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
526 return store_bridge_parm(d
, buf
, len
, set_membership_interval
);
528 static DEVICE_ATTR_RW(multicast_membership_interval
);
530 static ssize_t
multicast_querier_interval_show(struct device
*d
,
531 struct device_attribute
*attr
,
534 struct net_bridge
*br
= to_bridge(d
);
535 return sprintf(buf
, "%lu\n",
536 jiffies_to_clock_t(br
->multicast_querier_interval
));
539 static int set_querier_interval(struct net_bridge
*br
, unsigned long val
)
541 br
->multicast_querier_interval
= clock_t_to_jiffies(val
);
545 static ssize_t
multicast_querier_interval_store(struct device
*d
,
546 struct device_attribute
*attr
,
547 const char *buf
, size_t len
)
549 return store_bridge_parm(d
, buf
, len
, set_querier_interval
);
551 static DEVICE_ATTR_RW(multicast_querier_interval
);
553 static ssize_t
multicast_query_interval_show(struct device
*d
,
554 struct device_attribute
*attr
,
557 struct net_bridge
*br
= to_bridge(d
);
558 return sprintf(buf
, "%lu\n",
559 jiffies_to_clock_t(br
->multicast_query_interval
));
562 static int set_query_interval(struct net_bridge
*br
, unsigned long val
)
564 br
->multicast_query_interval
= clock_t_to_jiffies(val
);
568 static ssize_t
multicast_query_interval_store(struct device
*d
,
569 struct device_attribute
*attr
,
570 const char *buf
, size_t len
)
572 return store_bridge_parm(d
, buf
, len
, set_query_interval
);
574 static DEVICE_ATTR_RW(multicast_query_interval
);
576 static ssize_t
multicast_query_response_interval_show(
577 struct device
*d
, struct device_attribute
*attr
, char *buf
)
579 struct net_bridge
*br
= to_bridge(d
);
582 jiffies_to_clock_t(br
->multicast_query_response_interval
));
585 static int set_query_response_interval(struct net_bridge
*br
, unsigned long val
)
587 br
->multicast_query_response_interval
= clock_t_to_jiffies(val
);
591 static ssize_t
multicast_query_response_interval_store(
592 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
595 return store_bridge_parm(d
, buf
, len
, set_query_response_interval
);
597 static DEVICE_ATTR_RW(multicast_query_response_interval
);
599 static ssize_t
multicast_startup_query_interval_show(
600 struct device
*d
, struct device_attribute
*attr
, char *buf
)
602 struct net_bridge
*br
= to_bridge(d
);
605 jiffies_to_clock_t(br
->multicast_startup_query_interval
));
608 static int set_startup_query_interval(struct net_bridge
*br
, unsigned long val
)
610 br
->multicast_startup_query_interval
= clock_t_to_jiffies(val
);
614 static ssize_t
multicast_startup_query_interval_store(
615 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
618 return store_bridge_parm(d
, buf
, len
, set_startup_query_interval
);
620 static DEVICE_ATTR_RW(multicast_startup_query_interval
);
622 static ssize_t
multicast_stats_enabled_show(struct device
*d
,
623 struct device_attribute
*attr
,
626 struct net_bridge
*br
= to_bridge(d
);
628 return sprintf(buf
, "%u\n", br
->multicast_stats_enabled
);
631 static int set_stats_enabled(struct net_bridge
*br
, unsigned long val
)
633 br
->multicast_stats_enabled
= !!val
;
637 static ssize_t
multicast_stats_enabled_store(struct device
*d
,
638 struct device_attribute
*attr
,
642 return store_bridge_parm(d
, buf
, len
, set_stats_enabled
);
644 static DEVICE_ATTR_RW(multicast_stats_enabled
);
646 #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
647 static ssize_t
nf_call_iptables_show(
648 struct device
*d
, struct device_attribute
*attr
, char *buf
)
650 struct net_bridge
*br
= to_bridge(d
);
651 return sprintf(buf
, "%u\n", br
->nf_call_iptables
);
654 static int set_nf_call_iptables(struct net_bridge
*br
, unsigned long val
)
656 br
->nf_call_iptables
= val
? true : false;
660 static ssize_t
nf_call_iptables_store(
661 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
664 return store_bridge_parm(d
, buf
, len
, set_nf_call_iptables
);
666 static DEVICE_ATTR_RW(nf_call_iptables
);
668 static ssize_t
nf_call_ip6tables_show(
669 struct device
*d
, struct device_attribute
*attr
, char *buf
)
671 struct net_bridge
*br
= to_bridge(d
);
672 return sprintf(buf
, "%u\n", br
->nf_call_ip6tables
);
675 static int set_nf_call_ip6tables(struct net_bridge
*br
, unsigned long val
)
677 br
->nf_call_ip6tables
= val
? true : false;
681 static ssize_t
nf_call_ip6tables_store(
682 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
685 return store_bridge_parm(d
, buf
, len
, set_nf_call_ip6tables
);
687 static DEVICE_ATTR_RW(nf_call_ip6tables
);
689 static ssize_t
nf_call_arptables_show(
690 struct device
*d
, struct device_attribute
*attr
, char *buf
)
692 struct net_bridge
*br
= to_bridge(d
);
693 return sprintf(buf
, "%u\n", br
->nf_call_arptables
);
696 static int set_nf_call_arptables(struct net_bridge
*br
, unsigned long val
)
698 br
->nf_call_arptables
= val
? true : false;
702 static ssize_t
nf_call_arptables_store(
703 struct device
*d
, struct device_attribute
*attr
, const char *buf
,
706 return store_bridge_parm(d
, buf
, len
, set_nf_call_arptables
);
708 static DEVICE_ATTR_RW(nf_call_arptables
);
710 #ifdef CONFIG_BRIDGE_VLAN_FILTERING
711 static ssize_t
vlan_filtering_show(struct device
*d
,
712 struct device_attribute
*attr
,
715 struct net_bridge
*br
= to_bridge(d
);
716 return sprintf(buf
, "%d\n", br
->vlan_enabled
);
719 static ssize_t
vlan_filtering_store(struct device
*d
,
720 struct device_attribute
*attr
,
721 const char *buf
, size_t len
)
723 return store_bridge_parm(d
, buf
, len
, br_vlan_filter_toggle
);
725 static DEVICE_ATTR_RW(vlan_filtering
);
727 static ssize_t
vlan_protocol_show(struct device
*d
,
728 struct device_attribute
*attr
,
731 struct net_bridge
*br
= to_bridge(d
);
732 return sprintf(buf
, "%#06x\n", ntohs(br
->vlan_proto
));
735 static ssize_t
vlan_protocol_store(struct device
*d
,
736 struct device_attribute
*attr
,
737 const char *buf
, size_t len
)
739 return store_bridge_parm(d
, buf
, len
, br_vlan_set_proto
);
741 static DEVICE_ATTR_RW(vlan_protocol
);
743 static ssize_t
default_pvid_show(struct device
*d
,
744 struct device_attribute
*attr
,
747 struct net_bridge
*br
= to_bridge(d
);
748 return sprintf(buf
, "%d\n", br
->default_pvid
);
751 static ssize_t
default_pvid_store(struct device
*d
,
752 struct device_attribute
*attr
,
753 const char *buf
, size_t len
)
755 return store_bridge_parm(d
, buf
, len
, br_vlan_set_default_pvid
);
757 static DEVICE_ATTR_RW(default_pvid
);
759 static ssize_t
vlan_stats_enabled_show(struct device
*d
,
760 struct device_attribute
*attr
,
763 struct net_bridge
*br
= to_bridge(d
);
764 return sprintf(buf
, "%u\n", br
->vlan_stats_enabled
);
767 static ssize_t
vlan_stats_enabled_store(struct device
*d
,
768 struct device_attribute
*attr
,
769 const char *buf
, size_t len
)
771 return store_bridge_parm(d
, buf
, len
, br_vlan_set_stats
);
773 static DEVICE_ATTR_RW(vlan_stats_enabled
);
776 static struct attribute
*bridge_attrs
[] = {
777 &dev_attr_forward_delay
.attr
,
778 &dev_attr_hello_time
.attr
,
779 &dev_attr_max_age
.attr
,
780 &dev_attr_ageing_time
.attr
,
781 &dev_attr_stp_state
.attr
,
782 &dev_attr_group_fwd_mask
.attr
,
783 &dev_attr_priority
.attr
,
784 &dev_attr_bridge_id
.attr
,
785 &dev_attr_root_id
.attr
,
786 &dev_attr_root_path_cost
.attr
,
787 &dev_attr_root_port
.attr
,
788 &dev_attr_topology_change
.attr
,
789 &dev_attr_topology_change_detected
.attr
,
790 &dev_attr_hello_timer
.attr
,
791 &dev_attr_tcn_timer
.attr
,
792 &dev_attr_topology_change_timer
.attr
,
793 &dev_attr_gc_timer
.attr
,
794 &dev_attr_group_addr
.attr
,
795 &dev_attr_flush
.attr
,
796 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
797 &dev_attr_multicast_router
.attr
,
798 &dev_attr_multicast_snooping
.attr
,
799 &dev_attr_multicast_querier
.attr
,
800 &dev_attr_multicast_query_use_ifaddr
.attr
,
801 &dev_attr_hash_elasticity
.attr
,
802 &dev_attr_hash_max
.attr
,
803 &dev_attr_multicast_last_member_count
.attr
,
804 &dev_attr_multicast_startup_query_count
.attr
,
805 &dev_attr_multicast_last_member_interval
.attr
,
806 &dev_attr_multicast_membership_interval
.attr
,
807 &dev_attr_multicast_querier_interval
.attr
,
808 &dev_attr_multicast_query_interval
.attr
,
809 &dev_attr_multicast_query_response_interval
.attr
,
810 &dev_attr_multicast_startup_query_interval
.attr
,
811 &dev_attr_multicast_stats_enabled
.attr
,
813 #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
814 &dev_attr_nf_call_iptables
.attr
,
815 &dev_attr_nf_call_ip6tables
.attr
,
816 &dev_attr_nf_call_arptables
.attr
,
818 #ifdef CONFIG_BRIDGE_VLAN_FILTERING
819 &dev_attr_vlan_filtering
.attr
,
820 &dev_attr_vlan_protocol
.attr
,
821 &dev_attr_default_pvid
.attr
,
822 &dev_attr_vlan_stats_enabled
.attr
,
827 static struct attribute_group bridge_group
= {
828 .name
= SYSFS_BRIDGE_ATTR
,
829 .attrs
= bridge_attrs
,
833 * Export the forwarding information table as a binary file
834 * The records are struct __fdb_entry.
836 * Returns the number of bytes read.
838 static ssize_t
brforward_read(struct file
*filp
, struct kobject
*kobj
,
839 struct bin_attribute
*bin_attr
,
840 char *buf
, loff_t off
, size_t count
)
842 struct device
*dev
= kobj_to_dev(kobj
);
843 struct net_bridge
*br
= to_bridge(dev
);
846 /* must read whole records */
847 if (off
% sizeof(struct __fdb_entry
) != 0)
850 n
= br_fdb_fillbuf(br
, buf
,
851 count
/ sizeof(struct __fdb_entry
),
852 off
/ sizeof(struct __fdb_entry
));
855 n
*= sizeof(struct __fdb_entry
);
860 static struct bin_attribute bridge_forward
= {
861 .attr
= { .name
= SYSFS_BRIDGE_FDB
,
863 .read
= brforward_read
,
867 * Add entries in sysfs onto the existing network class device
869 * Adds a attribute group "bridge" containing tuning parameters.
870 * Binary attribute containing the forward table
871 * Sub directory to hold links to interfaces.
873 * Note: the ifobj exists only to be a subdirectory
874 * to hold links. The ifobj exists in same data structure
875 * as it's parent the bridge so reference counting works.
877 int br_sysfs_addbr(struct net_device
*dev
)
879 struct kobject
*brobj
= &dev
->dev
.kobj
;
880 struct net_bridge
*br
= netdev_priv(dev
);
883 err
= sysfs_create_group(brobj
, &bridge_group
);
885 pr_info("%s: can't create group %s/%s\n",
886 __func__
, dev
->name
, bridge_group
.name
);
890 err
= sysfs_create_bin_file(brobj
, &bridge_forward
);
892 pr_info("%s: can't create attribute file %s/%s\n",
893 __func__
, dev
->name
, bridge_forward
.attr
.name
);
897 br
->ifobj
= kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR
, brobj
);
899 pr_info("%s: can't add kobject (directory) %s/%s\n",
900 __func__
, dev
->name
, SYSFS_BRIDGE_PORT_SUBDIR
);
905 sysfs_remove_bin_file(&dev
->dev
.kobj
, &bridge_forward
);
907 sysfs_remove_group(&dev
->dev
.kobj
, &bridge_group
);
913 void br_sysfs_delbr(struct net_device
*dev
)
915 struct kobject
*kobj
= &dev
->dev
.kobj
;
916 struct net_bridge
*br
= netdev_priv(dev
);
918 kobject_put(br
->ifobj
);
919 sysfs_remove_bin_file(kobj
, &bridge_forward
);
920 sysfs_remove_group(kobj
, &bridge_group
);