From patchwork Sat Apr 24 20:14:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Chan X-Patchwork-Id: 427147 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.6 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MIME_HEADER_CTYPE_ONLY, SPF_HELO_NONE, SPF_PASS, T_TVD_MIME_NO_HEADERS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 14816C433ED for ; Sat, 24 Apr 2021 20:15:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E883961158 for ; Sat, 24 Apr 2021 20:15:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237507AbhDXUPi (ORCPT ); Sat, 24 Apr 2021 16:15:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237339AbhDXUPb (ORCPT ); Sat, 24 Apr 2021 16:15:31 -0400 Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BD498C06175F for ; Sat, 24 Apr 2021 13:14:52 -0700 (PDT) Received: by mail-pg1-x52c.google.com with SMTP id d10so37496773pgf.12 for ; Sat, 24 Apr 2021 13:14:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pjMsIzX0qdBulXlBS8KgpZayy/fyucBOs33YxcDYICY=; b=iNb3yRscsZpdcJs3n4VVH5bNJ8wTUV9JEem2K5ABcIm93rZyobjzZpPkxX3H5oqJcz YAzZV2Tjg6aq/jjHoGTENSrYIc4Eo/8jmTf8rkZULSxzcXQrpKEu0FQb+XUO0IRnlgND TQN2ESX9Wgh5Hg7egVhmVVN9lFuoLO0Xii+TU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=pjMsIzX0qdBulXlBS8KgpZayy/fyucBOs33YxcDYICY=; b=P/1e2pppYUOPj6zY+JjgO+bncImTWF4FfD9pdI3i5HleTvwQvaCH8LH6SIXlfgdVae 8T/0B7D5ksvq+HL7IHEv/P6kWwHKiDpypWZdnScfQiPtL613gk8ga7+P1yC8RJn1Para tn8NuEINr98u95vM8+uuYyXOgSBlbVxPJa7LPqOGddzZmrD6B8syn0GXqQu3oyTo680p VnjcgnpvMfofUgFFznPjxX1+StMCbX0QHPFXdkyMGrseooO/kiXNCIHpn1SbfE2gNRRR LxeJioag/I/AdZYlcmdlaKSoyPoQ1tz4cDWb5cKleD0s3LyYSGoIQS9gUq3BuDEEtihC Hkog== X-Gm-Message-State: AOAM533Mru4VySG/bXkU+J0bNxpqiKNxClxd17cmS4HgEGxN/Kw1b7T0 Xttp8jtqDCP3dX4cf4liva4/Qg== X-Google-Smtp-Source: ABdhPJyGvn8Voy36MY9BStqguRaj0MjmJwMetbJdaKCuW7FVN9z9UfAb/vBhKCZLhk1MeSYKYWYtrQ== X-Received: by 2002:a63:48c:: with SMTP id 134mr9949511pge.448.1619295292095; Sat, 24 Apr 2021 13:14:52 -0700 (PDT) Received: from localhost.swdvt.lab.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id z29sm7914070pga.52.2021.04.24.13.14.51 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Apr 2021 13:14:51 -0700 (PDT) From: Michael Chan To: davem@davemloft.net Cc: netdev@vger.kernel.org, kuba@kernel.org, gospo@broadcom.com Subject: [PATCH net-next 10/10] bnxt_en: Implement .ndo_features_check(). Date: Sat, 24 Apr 2021 16:14:31 -0400 Message-Id: <1619295271-30853-11-git-send-email-michael.chan@broadcom.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1619295271-30853-1-git-send-email-michael.chan@broadcom.com> References: <1619295271-30853-1-git-send-email-michael.chan@broadcom.com> Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org For UDP encapsultions, we only support the offloaded Vxlan port and Geneve port. All other ports included FOU and GUE are not supported so we need to turn off TSO and checksum features. Reviewed-by: Sriharsha Basavapatna Reviewed-by: Edwin Peer Signed-off-by: Michael Chan --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 41 +++++++++++++++++++++-- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 ++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 53db073b457c..9d7c98a617f9 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -10781,6 +10781,39 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features) return rc; } +static netdev_features_t bnxt_features_check(struct sk_buff *skb, + struct net_device *dev, + netdev_features_t features) +{ + u8 l4_proto = 0; + + features = vlan_features_check(skb, features); + if (!skb->encapsulation) + return features; + + switch (vlan_get_protocol(skb)) { + case htons(ETH_P_IP): + l4_proto = ip_hdr(skb)->protocol; + break; + case htons(ETH_P_IPV6): + l4_proto = ipv6_hdr(skb)->nexthdr; + break; + default: + return features; + } + + /* For UDP, we can only handle 1 Vxlan port and 1 Geneve port. */ + if (l4_proto == IPPROTO_UDP) { + struct bnxt *bp = netdev_priv(dev); + __be16 udp_port = udp_hdr(skb)->dest; + + if (udp_port != bp->vxlan_port && udp_port != bp->nge_port) + return features & ~(NETIF_F_CSUM_MASK | + NETIF_F_GSO_MASK); + } + return features; +} + int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words, u32 *reg_buf) { @@ -12288,10 +12321,13 @@ static int bnxt_udp_tunnel_sync(struct net_device *netdev, unsigned int table) unsigned int cmd; udp_tunnel_nic_get_port(netdev, table, 0, &ti); - if (ti.type == UDP_TUNNEL_TYPE_VXLAN) + if (ti.type == UDP_TUNNEL_TYPE_VXLAN) { + bp->vxlan_port = ti.port; cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN; - else + } else { + bp->nge_port = ti.port; cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE; + } if (ti.port) return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti.port, cmd); @@ -12391,6 +12427,7 @@ static const struct net_device_ops bnxt_netdev_ops = { .ndo_change_mtu = bnxt_change_mtu, .ndo_fix_features = bnxt_fix_features, .ndo_set_features = bnxt_set_features, + .ndo_features_check = bnxt_features_check, .ndo_tx_timeout = bnxt_tx_timeout, #ifdef CONFIG_BNXT_SRIOV .ndo_get_vf_config = bnxt_get_vf_config, diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index a3744247740b..24d2ad6a8740 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -1914,6 +1914,8 @@ struct bnxt { u16 vxlan_fw_dst_port_id; u16 nge_fw_dst_port_id; + __be16 vxlan_port; + __be16 nge_port; u8 port_partition_type; u8 port_count; u16 br_mode;