From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9D14CA0C4B; Mon, 12 Jul 2021 04:57:46 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 22CFE40688; Mon, 12 Jul 2021 04:57:46 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mails.dpdk.org (Postfix) with ESMTP id C856140685 for ; Mon, 12 Jul 2021 04:57:43 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10042"; a="189596558" X-IronPort-AV: E=Sophos;i="5.84,232,1620716400"; d="scan'208";a="189596558" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jul 2021 19:57:40 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,232,1620716400"; d="scan'208";a="501841130" Received: from wuwenjun.sh.intel.com ([10.67.110.207]) by fmsmga002.fm.intel.com with ESMTP; 11 Jul 2021 19:57:38 -0700 From: Wenjun Wu To: dev@dpdk.org, jingjing.wu@intel.com, beilei.xing@intel.com, qi.z.zhang@intel.com Cc: Wenjun Wu Date: Mon, 12 Jul 2021 10:39:43 +0800 Message-Id: <20210712023943.800953-1-wenjun1.wu@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v1] net/iavf: support default RSS for IP fragment packet X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch adds default RSS support for IPv4 and IPv6 fragment packet. Signed-off-by: Wenjun Wu --- drivers/net/iavf/iavf_hash.c | 60 +++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c index 03dae5d999..e76d094aae 100644 --- a/drivers/net/iavf/iavf_hash.c +++ b/drivers/net/iavf/iavf_hash.c @@ -566,6 +566,29 @@ static struct iavf_flow_parser iavf_hash_parser = { .stage = IAVF_FLOW_STAGE_RSS, }; +static void +iavf_hash_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer) +{ + struct virtchnl_proto_hdr *hdr1; + struct virtchnl_proto_hdr *hdr2; + int i; + + if (layer < 0 || layer > hdrs->count) + return; + + /* shift headers layer */ + for (i = hdrs->count; i >= layer; i--) { + hdr1 = &hdrs->proto_hdr[i]; + hdr2 = &hdrs->proto_hdr[i - 1]; + *hdr1 = *hdr2; + } + + /* adding dummy fragment header */ + hdr1 = &hdrs->proto_hdr[layer]; + VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG); + hdrs->count = ++layer; +} + int iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add) { @@ -580,7 +603,9 @@ iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add) ETH_RSS_NONFRAG_IPV4_TCP | \ ETH_RSS_NONFRAG_IPV6_TCP | \ ETH_RSS_NONFRAG_IPV4_SCTP | \ - ETH_RSS_NONFRAG_IPV6_SCTP) + ETH_RSS_NONFRAG_IPV6_SCTP | \ + ETH_RSS_FRAG_IPV4 | \ + ETH_RSS_FRAG_IPV6) rss_cfg.rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; if (rss_hf & ETH_RSS_IPV4) { @@ -606,6 +631,10 @@ iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add) if (rss_hf & ETH_RSS_IPV6) { rss_cfg.proto_hdrs = inner_ipv6_tmplt; iavf_add_del_rss_cfg(ad, &rss_cfg, add); + if (rss_hf & ETH_RSS_FRAG_IPV6) { + rss_cfg.proto_hdrs = outer_ipv6_frag_tmplt; + iavf_add_del_rss_cfg(ad, &rss_cfg, add); + } } if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) { @@ -623,6 +652,12 @@ iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add) iavf_add_del_rss_cfg(ad, &rss_cfg, add); } + if (rss_hf & ETH_RSS_FRAG_IPV4) { + rss_cfg.proto_hdrs = outer_ipv4_tmplt; + iavf_hash_add_fragment_hdr(&rss_cfg.proto_hdrs, 1); + iavf_add_del_rss_cfg(ad, &rss_cfg, add); + } + vf->rss_hf = rss_hf & IAVF_RSS_HF_ALL; return 0; } @@ -737,29 +772,6 @@ do { \ REFINE_PROTO_FLD(ADD, fld_2); \ } while (0) -static void -iavf_hash_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer) -{ - struct virtchnl_proto_hdr *hdr1; - struct virtchnl_proto_hdr *hdr2; - int i; - - if (layer < 0 || layer > hdrs->count) - return; - - /* shift headers layer */ - for (i = hdrs->count; i >= layer; i--) { - hdr1 = &hdrs->proto_hdr[i]; - hdr2 = &hdrs->proto_hdr[i - 1]; - *hdr1 = *hdr2; - } - - /* adding dummy fragment header */ - hdr1 = &hdrs->proto_hdr[layer]; - VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG); - hdrs->count = ++layer; -} - /* refine proto hdrs base on l2, l3, l4 rss type */ static void iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs, -- 2.25.1