On Thu, Jun 13, 2013 at 09:10:51AM -0700, 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]>
> ---
>  drivers/scsi/fcoe/fcoe.c |   12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index fc7bb1f..cb7ac9c 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -1658,13 +1658,11 @@ static int fcoe_xmit(struct fc_lport *lport, struct 
> fc_frame *fp)
>       skb->protocol = htons(ETH_P_FCOE);
>       skb->priority = fcoe->priority;
>  
> -     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);
> -             skb->dev = fcoe->realdev;
> -     } else
> -             skb->dev = 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;
>  
>       /* fill up mac and fcoe headers */
>       eh = eth_hdr(skb);
> 
> _______________________________________________
> fcoe-devel mailing list
> [email protected]
> http://lists.open-fcoe.org/mailman/listinfo/fcoe-devel
> 
Acked-by: Neil Horman <[email protected]>
_______________________________________________
fcoe-devel mailing list
[email protected]
http://lists.open-fcoe.org/mailman/listinfo/fcoe-devel

Reply via email to