diff options
author | Vlad Yasevich <vyasevic@redhat.com> | 2013-02-13 07:00:09 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-02-13 19:41:46 -0500 |
commit | 243a2e63f5f47763b802e9dee8dbf1611a1c1322 (patch) | |
tree | 547c44d694683fe852414b7fade126f3b0d2a56b /net/bridge/br_sysfs_br.c | |
parent | 222229974824a4f30b417531cdc9b5b869d6a6b7 (diff) |
bridge: Add vlan filtering infrastructure
Adds an optional infrustructure component to bridge that would allow
native vlan filtering in the bridge. Each bridge port (as well
as the bridge device) now get a VLAN bitmap. Each bit in the bitmap
is associated with a vlan id. This way if the bit corresponding to
the vid is set in the bitmap that the packet with vid is allowed to
enter and exit the port.
Write access the bitmap is protected by RTNL and read access
protected by RCU.
Vlan functionality is disabled by default.
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_sysfs_br.c')
-rw-r--r-- | net/bridge/br_sysfs_br.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index 5913a3a0047b..8baa9c08e1a4 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
@@ -691,6 +691,24 @@ static ssize_t store_nf_call_arptables( | |||
691 | static DEVICE_ATTR(nf_call_arptables, S_IRUGO | S_IWUSR, | 691 | static DEVICE_ATTR(nf_call_arptables, S_IRUGO | S_IWUSR, |
692 | show_nf_call_arptables, store_nf_call_arptables); | 692 | show_nf_call_arptables, store_nf_call_arptables); |
693 | #endif | 693 | #endif |
694 | #ifdef CONFIG_BRIDGE_VLAN_FILTERING | ||
695 | static ssize_t show_vlan_filtering(struct device *d, | ||
696 | struct device_attribute *attr, | ||
697 | char *buf) | ||
698 | { | ||
699 | struct net_bridge *br = to_bridge(d); | ||
700 | return sprintf(buf, "%d\n", br->vlan_enabled); | ||
701 | } | ||
702 | |||
703 | static ssize_t store_vlan_filtering(struct device *d, | ||
704 | struct device_attribute *attr, | ||
705 | const char *buf, size_t len) | ||
706 | { | ||
707 | return store_bridge_parm(d, buf, len, br_vlan_filter_toggle); | ||
708 | } | ||
709 | static DEVICE_ATTR(vlan_filtering, S_IRUGO | S_IWUSR, | ||
710 | show_vlan_filtering, store_vlan_filtering); | ||
711 | #endif | ||
694 | 712 | ||
695 | static struct attribute *bridge_attrs[] = { | 713 | static struct attribute *bridge_attrs[] = { |
696 | &dev_attr_forward_delay.attr, | 714 | &dev_attr_forward_delay.attr, |
@@ -732,6 +750,9 @@ static struct attribute *bridge_attrs[] = { | |||
732 | &dev_attr_nf_call_ip6tables.attr, | 750 | &dev_attr_nf_call_ip6tables.attr, |
733 | &dev_attr_nf_call_arptables.attr, | 751 | &dev_attr_nf_call_arptables.attr, |
734 | #endif | 752 | #endif |
753 | #ifdef CONFIG_BRIDGE_VLAN_FILTERING | ||
754 | &dev_attr_vlan_filtering.attr, | ||
755 | #endif | ||
735 | NULL | 756 | NULL |
736 | }; | 757 | }; |
737 | 758 | ||