On 6/18/2013 10:56 AM, Robert Love wrote:
fcoe_xmit was coded such that it would skip the vlan net device/layer
and instead set some vlan flags and transmit on the real net device.
The real net device has code that would add the vlan tag for fcoe skbs.
This avoids some extra processing for data frames and provides a small
performance improvement.

Since fcoe_xmit was not using the vlan net device, __vlan_put_tag
within the real net device's xmit routine was ultimately being
called to set the vlan tag.

With the below change the behavior of __vlan_put_tag changed slightly,
it now sets the skb->protocol = vlan_proto. vlan_proto was not a field
being set by fcoe_xmit, so the skb->protocol is now not being set to
ETH_P_8021Q, as it should be.

This patch converts fcoe_xmit to use the vlan_put_tag routine which
will tag the skb and fcoe will continue to transmit fcoe skbs on the
real net device.

For reference, the below change was the one that altered the
__vlan_put_tag behavior.

   commit 86a9bad3ab6b6f858fd4443b48738cabbb6d094c
   Author: Patrick McHardy <[email protected]>
   Date:   Fri Apr 19 02:04:30 2013 +0000

       net: vlan: add protocol argument to packet tagging functions

       Add a protocol argument to the VLAN packet tagging functions. In case of 
HW
       tagging, we need that protocol available in the ndo_start_xmit functions,
       so it is stored in a new field in the skb. The new field fits into a hole
       (on 64 bit) and doesn't increase the sks's size.

Signed-off-by: Robert Love <[email protected]>
Acked-by: Neil Horman <[email protected]>
---

Acked-by: John Fastabend <[email protected]>


  drivers/scsi/fcoe/fcoe.c |    7 +++++--
  1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index fc7bb1f..7efc5df 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -1660,9 +1660,12 @@ static int fcoe_xmit(struct fc_lport *lport, struct 
fc_frame *fp)

        if (fcoe->netdev->priv_flags & IFF_802_1Q_VLAN &&
            fcoe->realdev->features & NETIF_F_HW_VLAN_CTAG_TX) {
-               skb->vlan_tci = VLAN_TAG_PRESENT |
-                               vlan_dev_vlan_id(fcoe->netdev);
+               /* must set skb->dev before calling vlan_put_tag */
                skb->dev = fcoe->realdev;
+               skb = vlan_put_tag(skb, htons(ETH_P_8021Q),
+                                  vlan_dev_vlan_id(fcoe->netdev));
+               if (!skb)
+                       return -ENOMEM;

Because you already check for NETIF_F_HW_VLAN_CTAG_TX use
__vlan_hwaccel_put_tag().

        } else
                skb->dev = fcoe->netdev;



Looks like a reasonable fix. A follow up patch could fix the if() to use
is_vlan_dev() and vlan_hw_offload_capable().

.John
_______________________________________________
fcoe-devel mailing list
[email protected]
http://lists.open-fcoe.org/mailman/listinfo/fcoe-devel

Reply via email to