lkml.org 
[lkml]   [2018]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 38/71] net: mvpp2: Extract the correct ethtype from the skb for tx csum offload
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Maxime Chevallier <maxime.chevallier@bootlin.com>

    [ Upstream commit 35f3625c21852ad839f20c91c7d81c4c1101e207 ]

    When offloading the L3 and L4 csum computation on TX, we need to extract
    the l3_proto from the ethtype, independently of the presence of a vlan
    tag.

    The actual driver uses skb->protocol as-is, resulting in packets with
    the wrong L4 checksum being sent when there's a vlan tag in the packet
    header and checksum offloading is enabled.

    This commit makes use of vlan_protocol_get() to get the correct ethtype
    regardless the presence of a vlan tag.

    Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network unit")
    Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/marvell/mvpp2.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    --- a/drivers/net/ethernet/marvell/mvpp2.c
    +++ b/drivers/net/ethernet/marvell/mvpp2.c
    @@ -29,6 +29,7 @@
    #include <linux/clk.h>
    #include <linux/hrtimer.h>
    #include <linux/ktime.h>
    +#include <linux/if_vlan.h>
    #include <uapi/linux/ppp_defs.h>
    #include <net/ip.h>
    #include <net/ipv6.h>
    @@ -4266,7 +4267,7 @@ static void mvpp2_txq_desc_put(struct mv
    }

    /* Set Tx descriptors fields relevant for CSUM calculation */
    -static u32 mvpp2_txq_desc_csum(int l3_offs, int l3_proto,
    +static u32 mvpp2_txq_desc_csum(int l3_offs, __be16 l3_proto,
    int ip_hdr_len, int l4_proto)
    {
    u32 command;
    @@ -5019,14 +5020,15 @@ static u32 mvpp2_skb_tx_csum(struct mvpp
    if (skb->ip_summed == CHECKSUM_PARTIAL) {
    int ip_hdr_len = 0;
    u8 l4_proto;
    + __be16 l3_proto = vlan_get_protocol(skb);

    - if (skb->protocol == htons(ETH_P_IP)) {
    + if (l3_proto == htons(ETH_P_IP)) {
    struct iphdr *ip4h = ip_hdr(skb);

    /* Calculate IPv4 checksum and L4 checksum */
    ip_hdr_len = ip4h->ihl;
    l4_proto = ip4h->protocol;
    - } else if (skb->protocol == htons(ETH_P_IPV6)) {
    + } else if (l3_proto == htons(ETH_P_IPV6)) {
    struct ipv6hdr *ip6h = ipv6_hdr(skb);

    /* Read l4_protocol from one of IPv6 extra headers */
    @@ -5038,7 +5040,7 @@ static u32 mvpp2_skb_tx_csum(struct mvpp
    }

    return mvpp2_txq_desc_csum(skb_network_offset(skb),
    - skb->protocol, ip_hdr_len, l4_proto);
    + l3_proto, ip_hdr_len, l4_proto);
    }

    return MVPP2_TXD_L4_CSUM_NOT | MVPP2_TXD_IP_CSUM_DISABLE;

    \
     
     \ /
      Last update: 2018-10-16 19:30    [W:3.346 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site