From: Vlad Yasevich <vyasevic@redhat.com>
To: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Cc: "David S. Miller" <davem@davemloft.net>, netdev@vger.kernel.org
Subject: Re: [PATCH net 2/4] bridge: Handle priority-tagged frames properly
Date: Wed, 11 Sep 2013 12:32:01 -0400 [thread overview]
Message-ID: <52309B01.4060607@redhat.com> (raw)
In-Reply-To: <1378882832.3495.12.camel@ubuntu-vm-makita>
On 09/11/2013 03:00 AM, Toshiaki Makita wrote:
> On Tue, 2013-09-10 at 10:03 -0400, Vlad Yasevich wrote:
>> On 09/10/2013 06:34 AM, Toshiaki Makita wrote:
>>> 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-2005 6.7.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>
>>> ---
>>> net/bridge/br_vlan.c | 27 ++++++++++++++++++++-------
>>> 1 file changed, 20 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
>>> index 21b6d21..5a9c44a 100644
>>> --- a/net/bridge/br_vlan.c
>>> +++ b/net/bridge/br_vlan.c
>>> @@ -189,6 +189,8 @@ out:
>>> bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
>>> struct sk_buff *skb, u16 *vid)
>>> {
>>> + int err;
>>> +
>>> /* If VLAN filtering is disabled on the bridge, all packets are
>>> * permitted.
>>> */
>>> @@ -201,20 +203,31 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
>>> if (!v)
>>> return false;
>>>
>>> - if (br_vlan_get_tag(skb, vid)) {
>>> + err = br_vlan_get_tag(skb, vid);
>>> + if (!*vid) {
>>> u16 pvid = br_get_pvid(v);
>>>
>>> - /* Frame did not have a tag. See if pvid is set
>>> - * on this port. That tells us which vlan untagged
>>> - * traffic belongs to.
>>> + /* Frame had a tag with VID 0 or did not have a tag.
>>> + * See if pvid is set on this port. That tells us which
>>> + * vlan untagged or priority-tagged traffic belongs to.
>>> */
>>> if (pvid == VLAN_N_VID)
>>> return false;
>>>
>>> - /* PVID is set on this port. Any untagged ingress
>>> - * frame is considered to belong to this vlan.
>>> + /* PVID is set on this port. Any untagged or priority-tagged
>>> + * 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;
>>> +
>>
>> In the case of a priority tagged frame, we should unroll the
>> modification above and restore the VID field to 0. Otherwise, you
>> may end up either stripping the vlan header completely or forwarding
>> with pvid of the ingress port.
>
> Thank you for reviewing.
>
> It is my intended behavior that an incoming priority-tagged frame is
> forwarded as a frame untagged or tagged with pvid.
>
> IEEE 802.1Q-2011:
>
> section 8.1.7 Conversion of frame formats
>
> NOTE - As all incoming frames, including priority-tagged frames, are
> classified as belonging to a VLAN, the transmitting Port transmits
> VLAN-tagged frames or untagged frames. Hence, a station sending a
> priority-tagged frame via a Bridge will receive a response that is
> either VLAN-tagged or untagged, as described in 8.5.
>
> 3. Definitions
>
> 3.132 Priority-tagged frame: A tagged frame whose tag header carries
> priority information but carries no VLAN identification information.
>
> 3.203 VLAN-tagged frame: A VLAN-tagged frame is a tagged frame whose
> tag header carries *both* VLAN identification and priority
> information.
>
> Toshiaki Makita
>
Hmm.. The problem is that if a system attached to a port configures a
vlan interface with vid 0 and some priority mappings, then that
interface will not be able to properly receive traffic, as the bridge
now will never transmit priority tagged frames.
-vlad
>>
>> -vlad
>>> return true;
>>> }
>>>
>>>
>
>
next prev parent reply other threads:[~2013-09-11 16:32 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-10 10:27 [PATCH net 0/4] bridge: Fix problems around the PVID Toshiaki Makita
2013-09-10 10:32 ` [PATCH net 1/4] bridge: Don't use VID 0 and 4095 in vlan filtering Toshiaki Makita
2013-09-10 14:22 ` Vlad Yasevich
2013-09-12 19:55 ` David Miller
2013-09-12 20:57 ` Vlad Yasevich
2013-09-10 10:34 ` [PATCH net 2/4] bridge: Handle priority-tagged frames properly Toshiaki Makita
2013-09-10 14:03 ` Vlad Yasevich
2013-09-11 7:00 ` Toshiaki Makita
2013-09-11 16:32 ` Vlad Yasevich [this message]
2013-09-12 8:08 ` Toshiaki Makita
2013-09-10 10:37 ` [PATCH net 3/4] bridge: Fix the way the PVID is referenced Toshiaki Makita
2013-09-10 14:08 ` Vlad Yasevich
2013-09-10 14:24 ` Vlad Yasevich
2013-09-10 10:39 ` [PATCH net 4/4] bridge: Fix updating FDB entries when the PVID is applied Toshiaki Makita
2013-09-10 14:24 ` Vlad Yasevich
2013-09-12 20:00 ` [PATCH net 0/4] bridge: Fix problems around the PVID David Miller
2013-09-13 12:06 ` Toshiaki Makita
2013-09-13 15:21 ` Veaceslav Falico
2013-09-14 15:42 ` Toshiaki Makita
2013-09-16 17:49 ` Vlad Yasevich
2013-09-17 8:12 ` Toshiaki Makita
2013-09-23 14:41 ` Vlad Yasevich
2013-09-24 11:45 ` Toshiaki Makita
2013-09-24 13:35 ` Vlad Yasevich
2013-09-24 17:30 ` Toshiaki Makita
2013-09-24 17:55 ` Vlad Yasevich
2013-09-26 10:38 ` Toshiaki Makita
2013-09-26 14:22 ` Vlad Yasevich
2013-09-27 17:11 ` Toshiaki Makita
2013-09-27 18:10 ` Vlad Yasevich
2013-09-30 11:46 ` Toshiaki Makita
2013-09-30 16:01 ` Vlad Yasevich
2013-10-01 11:56 ` Toshiaki Makita
2013-10-09 15:01 ` Vlad Yasevich
2013-10-11 7:34 ` Toshiaki Makita
2013-10-11 14:14 ` Vlad Yasevich
2013-10-13 16:11 ` Toshiaki Makita
2013-10-15 13:55 ` Vlad Yasevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52309B01.4060607@redhat.com \
--to=vyasevic@redhat.com \
--cc=davem@davemloft.net \
--cc=makita.toshiaki@lab.ntt.co.jp \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.