[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1409856043-21840-1-git-send-email-vyasevic@redhat.com>
Date: Thu, 4 Sep 2014 14:40:43 -0400
From: Vladislav Yasevich <vyasevich@...il.com>
To: netdev@...r.kernel.org
Cc: Vladislav Yasevich <vyasevic@...hat.com>,
Jiri Pirko <jiri@...nulli.us>,
Florian Zumbiehl <florz@...rz.de>,
Eric Dumazet <eric.dumazet@...il.com>,
Matthew Rosato <mjrosato@...ux.vnet.ibm.com>
Subject: [PATCH net] core: Untag packets after rx_handler has run.
Currently, we attempt to remove the vlan informaion from the packet
before passing it to the rx_handler. In most situations this works
just fine since the rx_handlers are usually installed for the
lower device and thus vlan device isn't found. However, macvtap
device is a bit different as it installs an rx_handler on top
of a macvlan device. As a result, if someone was define a vlan
device on top of a macvap (for the purposes of enabling a VM
to use vlans with macvtap), then the current code will result
in passing an untagged packet to the macvtap rx_handler and the
VM will not receive tagged traffic.
This patch moves the untaggin code to after the rx_handler for
the current device has been called. This still works for the
existing rx_handlers (like bonding/teaming/bridging/etc) and
also makes vlans on top of macvtap work as before.
Fixes: 6acf54f1cf (macvtap: Add support of packet capture on macvtap device)
Reported-by: Matthew Rosato <mjrosato@...ux.vnet.ibm.com>
Signed-off-by: Vladislav Yasevich <vyasevic@...hat.com>
---
net/core/dev.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index ab9a165..54691d1 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3642,17 +3642,6 @@ ncls:
if (pfmemalloc && !skb_pfmemalloc_protocol(skb))
goto drop;
- if (vlan_tx_tag_present(skb)) {
- if (pt_prev) {
- ret = deliver_skb(skb, pt_prev, orig_dev);
- pt_prev = NULL;
- }
- if (vlan_do_receive(&skb))
- goto another_round;
- else if (unlikely(!skb))
- goto unlock;
- }
-
rx_handler = rcu_dereference(skb->dev->rx_handler);
if (rx_handler) {
if (pt_prev) {
@@ -3674,6 +3663,17 @@ ncls:
}
}
+ if (vlan_tx_tag_present(skb)) {
+ if (pt_prev) {
+ ret = deliver_skb(skb, pt_prev, orig_dev);
+ pt_prev = NULL;
+ }
+ if (vlan_do_receive(&skb))
+ goto another_round;
+ else if (unlikely(!skb))
+ goto unlock;
+ }
+
if (unlikely(vlan_tx_tag_present(skb))) {
if (vlan_tx_tag_get_id(skb))
skb->pkt_type = PACKET_OTHERHOST;
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists