1 #include <linux/kernel.h>
2 #include <linux/netdevice.h>
3 #include <linux/rtnetlink.h>
4 #include <linux/slab.h>
6 #include "br_private.h"
8 static int __vlan_add(struct net_port_vlans
*v
, u16 vid
)
12 if (test_bit(vid
, v
->vlan_bitmap
))
15 if (v
->port_idx
&& vid
) {
16 struct net_device
*dev
= v
->parent
.port
->dev
;
18 /* Add VLAN to the device filter if it is supported.
19 * Stricly speaking, this is not necessary now, since devices
20 * are made promiscuous by the bridge, but if that ever changes
21 * this code will allow tagged traffic to enter the bridge.
23 if (dev
->features
& NETIF_F_HW_VLAN_FILTER
) {
24 err
= dev
->netdev_ops
->ndo_vlan_rx_add_vid(dev
, vid
);
30 set_bit(vid
, v
->vlan_bitmap
);
34 static int __vlan_del(struct net_port_vlans
*v
, u16 vid
)
36 if (!test_bit(vid
, v
->vlan_bitmap
))
39 if (v
->port_idx
&& vid
) {
40 struct net_device
*dev
= v
->parent
.port
->dev
;
42 if (dev
->features
& NETIF_F_HW_VLAN_FILTER
)
43 dev
->netdev_ops
->ndo_vlan_rx_kill_vid(dev
, vid
);
46 clear_bit(vid
, v
->vlan_bitmap
);
47 if (bitmap_empty(v
->vlan_bitmap
, BR_VLAN_BITMAP_LEN
)) {
49 rcu_assign_pointer(v
->parent
.port
->vlan_info
, NULL
);
51 rcu_assign_pointer(v
->parent
.br
->vlan_info
, NULL
);
57 static void __vlan_flush(struct net_port_vlans
*v
)
59 bitmap_zero(v
->vlan_bitmap
, BR_VLAN_BITMAP_LEN
);
61 rcu_assign_pointer(v
->parent
.port
->vlan_info
, NULL
);
63 rcu_assign_pointer(v
->parent
.br
->vlan_info
, NULL
);
67 /* Must be protected by RTNL */
68 int br_vlan_add(struct net_bridge
*br
, u16 vid
)
70 struct net_port_vlans
*pv
= NULL
;
75 pv
= rtnl_dereference(br
->vlan_info
);
77 return __vlan_add(pv
, vid
);
79 /* Create port vlan infomration
81 pv
= kzalloc(sizeof(*pv
), GFP_KERNEL
);
86 err
= __vlan_add(pv
, vid
);
90 rcu_assign_pointer(br
->vlan_info
, pv
);
97 /* Must be protected by RTNL */
98 int br_vlan_delete(struct net_bridge
*br
, u16 vid
)
100 struct net_port_vlans
*pv
;
104 pv
= rtnl_dereference(br
->vlan_info
);
112 void br_vlan_flush(struct net_bridge
*br
)
114 struct net_port_vlans
*pv
;
118 pv
= rtnl_dereference(br
->vlan_info
);
125 int br_vlan_filter_toggle(struct net_bridge
*br
, unsigned long val
)
128 return restart_syscall();
130 if (br
->vlan_enabled
== val
)
133 br
->vlan_enabled
= val
;
140 /* Must be protected by RTNL */
141 int nbp_vlan_add(struct net_bridge_port
*port
, u16 vid
)
143 struct net_port_vlans
*pv
= NULL
;
148 pv
= rtnl_dereference(port
->vlan_info
);
150 return __vlan_add(pv
, vid
);
152 /* Create port vlan infomration
154 pv
= kzalloc(sizeof(*pv
), GFP_KERNEL
);
160 pv
->port_idx
= port
->port_no
;
161 pv
->parent
.port
= port
;
162 err
= __vlan_add(pv
, vid
);
166 rcu_assign_pointer(port
->vlan_info
, pv
);
174 /* Must be protected by RTNL */
175 int nbp_vlan_delete(struct net_bridge_port
*port
, u16 vid
)
177 struct net_port_vlans
*pv
;
181 pv
= rtnl_dereference(port
->vlan_info
);
185 return __vlan_del(pv
, vid
);
188 void nbp_vlan_flush(struct net_bridge_port
*port
)
190 struct net_port_vlans
*pv
;
194 pv
= rtnl_dereference(port
->vlan_info
);