bridge: Apply the PVID to priority-tagged frames
IEEE 802.1Q says that when we receive priority-tagged (VID 0) frames use the PVID for the port as its VID. (See IEEE 802.1Q-2011 6.9.1 and Table 9-2) Apply the PVID to not only untagged frames but also priority-tagged frames. Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> Reviewed-by: Vlad Yasevich <vyasevic@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8adff41c3d
commit
b90356ce17
1 changed files with 20 additions and 7 deletions
|
@ -189,6 +189,8 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,
|
||||||
bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
||||||
struct sk_buff *skb, u16 *vid)
|
struct sk_buff *skb, u16 *vid)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
/* If VLAN filtering is disabled on the bridge, all packets are
|
/* If VLAN filtering is disabled on the bridge, all packets are
|
||||||
* permitted.
|
* permitted.
|
||||||
*/
|
*/
|
||||||
|
@ -201,20 +203,31 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
||||||
if (!v)
|
if (!v)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (br_vlan_get_tag(skb, vid)) {
|
err = br_vlan_get_tag(skb, vid);
|
||||||
|
if (!*vid) {
|
||||||
u16 pvid = br_get_pvid(v);
|
u16 pvid = br_get_pvid(v);
|
||||||
|
|
||||||
/* Frame did not have a tag. See if pvid is set
|
/* Frame had a tag with VID 0 or did not have a tag.
|
||||||
* on this port. That tells us which vlan untagged
|
* See if pvid is set on this port. That tells us which
|
||||||
* traffic belongs to.
|
* vlan untagged or priority-tagged traffic belongs to.
|
||||||
*/
|
*/
|
||||||
if (pvid == VLAN_N_VID)
|
if (pvid == VLAN_N_VID)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* PVID is set on this port. Any untagged ingress
|
/* PVID is set on this port. Any untagged or priority-tagged
|
||||||
* frame is considered to belong to this vlan.
|
* ingress frame is considered to belong to this vlan.
|
||||||
*/
|
*/
|
||||||
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), pvid);
|
if (likely(err))
|
||||||
|
/* Untagged Frame. */
|
||||||
|
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), pvid);
|
||||||
|
else
|
||||||
|
/* Priority-tagged Frame.
|
||||||
|
* At this point, We know that skb->vlan_tci had
|
||||||
|
* VLAN_TAG_PRESENT bit and its VID field was 0x000.
|
||||||
|
* We update only VID field and preserve PCP field.
|
||||||
|
*/
|
||||||
|
skb->vlan_tci |= pvid;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue