Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/87648/?format=api
http://patchwork.dpdk.org/api/patches/87648/?format=api", "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20210203021922.16164-1-haiyue.wang@intel.com/", "project": { "id": 1, "url": "http://patchwork.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20210203021922.16164-1-haiyue.wang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20210203021922.16164-1-haiyue.wang@intel.com", "date": "2021-02-03T02:19:22", "name": "[v2] net/ixgbe: fix UDP zero checksum error", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "f2e81aa309a3ff957a3505de46e3c0493293d42f", "submitter": { "id": 1044, "url": "http://patchwork.dpdk.org/api/people/1044/?format=api", "name": "Wang, Haiyue", "email": "haiyue.wang@intel.com" }, "delegate": { "id": 1540, "url": "http://patchwork.dpdk.org/api/users/1540/?format=api", "username": "qzhan15", "first_name": "Qi", "last_name": "Zhang", "email": "qi.z.zhang@intel.com" }, "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20210203021922.16164-1-haiyue.wang@intel.com/mbox/", "series": [ { "id": 15111, "url": "http://patchwork.dpdk.org/api/series/15111/?format=api", "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=15111", "date": "2021-02-03T02:19:22", "name": "[v2] net/ixgbe: fix UDP zero checksum error", "version": 2, "mbox": "http://patchwork.dpdk.org/series/15111/mbox/" } ], "comments": "http://patchwork.dpdk.org/api/patches/87648/comments/", "check": "fail", "checks": "http://patchwork.dpdk.org/api/patches/87648/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id C55CEA0A0E;\n\tWed, 3 Feb 2021 03:35:53 +0100 (CET)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5DBE1240416;\n\tWed, 3 Feb 2021 03:35:53 +0100 (CET)", "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n by mails.dpdk.org (Postfix) with ESMTP id 4D72024040D;\n Wed, 3 Feb 2021 03:35:51 +0100 (CET)", "from orsmga008.jf.intel.com ([10.7.209.65])\n by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 02 Feb 2021 18:35:50 -0800", "from npg-dpdk-haiyue-1.sh.intel.com ([10.67.118.220])\n by orsmga008.jf.intel.com with ESMTP; 02 Feb 2021 18:35:45 -0800" ], "IronPort-SDR": [ "\n 1sn+OyGg004gI7/LNli2HmE6H9BdkI2NeJ9zO2/QDSAnt4SK4go9mc3XzPJ5UOpKPb+eFhudsh\n QvMCKTJKtDMw==", "\n mk5M9Asynh21vucvzsK1I+CvQgLO/MxiLPDi/LlwJVd2UkUTJ7nOhIoEd4zh+wqaIeWngl+aw0\n L5D4VGQknNBA==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6000,8403,9883\"; a=\"181050395\"", "E=Sophos;i=\"5.79,397,1602572400\"; d=\"scan'208\";a=\"181050395\"", "E=Sophos;i=\"5.79,397,1602572400\"; d=\"scan'208\";a=\"392120463\"" ], "X-ExtLoop1": "1", "From": "Haiyue Wang <haiyue.wang@intel.com>", "To": "dev@dpdk.org", "Cc": "pvalerio@redhat.com, aconole@redhat.com, david.marchand@redhat.com,\n qi.z.zhang@intel.com, leyi.rong@intel.com, Lijuan.Tu@intel.com,\n Ruifeng.Wang@arm.com, Feifei.Wang2@arm.com,\n Haiyue Wang <haiyue.wang@intel.com>, stable@dpdk.org,\n Jeff Guo <jia.guo@intel.com>,\n Bruce Richardson <bruce.richardson@intel.com>,\n Konstantin Ananyev <konstantin.ananyev@intel.com>", "Date": "Wed, 3 Feb 2021 10:19:22 +0800", "Message-Id": "<20210203021922.16164-1-haiyue.wang@intel.com>", "X-Mailer": "git-send-email 2.30.0", "In-Reply-To": "<20210202070652.145861-1-haiyue.wang@intel.com>", "References": "<20210202070652.145861-1-haiyue.wang@intel.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[dpdk-dev] [PATCH v2] net/ixgbe: fix UDP zero checksum error", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "There is an 82599 errata that UDP frames with a zero checksum are\nincorrectly marked as checksum invalid by the hardware. This was\nleading to misleading PKT_RX_L4_CKSUM_BAD flag.\n\nThis patch changes the bad UDP checksum to PKT_RX_L4_CKSUM_UNKNOWN,\nso the software application will then have to recompute the checksum\nitself if needed.\n\nBugzilla ID: 629\n\nFixes: af75078fece3 (\"first public release\")\nCc: stable@dpdk.org\n\nReported-by: Paolo Valerio <pvalerio@redhat.com>\nSigned-off-by: Haiyue Wang <haiyue.wang@intel.com>\n---\nv2: Change the always GOOD checksum to UNKOWN if BAD.\n---\n doc/guides/nics/ixgbe.rst | 7 ++++++\n drivers/net/ixgbe/ixgbe_rxtx.c | 30 ++++++++++++++++++++----\n drivers/net/ixgbe/ixgbe_rxtx.h | 2 ++\n drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c | 32 +++++++++++++++++++++++---\n 4 files changed, 64 insertions(+), 7 deletions(-)", "diff": "diff --git a/doc/guides/nics/ixgbe.rst b/doc/guides/nics/ixgbe.rst\nindex 696cbd93ba..41b07b9aff 100644\n--- a/doc/guides/nics/ixgbe.rst\n+++ b/doc/guides/nics/ixgbe.rst\n@@ -287,6 +287,13 @@ the VFs which are required.::\n Currently hot-plugging of representor ports is not supported so all required\n representors must be specified on the creation of the PF.\n \n+Limitations or Known issues\n+---------------------------\n+The 82599 hardware errata: UDP frames with a zero checksum can be marked as\n+checksum errors. To support UDP zero checksum, the bad UDP checksum is marked\n+as PKT_RX_L4_CKSUM_UNKNOWN, so the application will recompute the checksum to\n+validate it again.\n+\n Supported Chipsets and NICs\n ---------------------------\n \ndiff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c\nindex 72d27f35ca..950b7894e0 100644\n--- a/drivers/net/ixgbe/ixgbe_rxtx.c\n+++ b/drivers/net/ixgbe/ixgbe_rxtx.c\n@@ -1466,7 +1466,8 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status, uint64_t vlan_flags)\n }\n \n static inline uint64_t\n-rx_desc_error_to_pkt_flags(uint32_t rx_status)\n+rx_desc_error_to_pkt_flags(uint32_t rx_status, uint16_t pkt_info,\n+\t\t\t uint8_t rx_udp_csum_zero_err)\n {\n \tuint64_t pkt_flags;\n \n@@ -1483,6 +1484,15 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)\n \tpkt_flags = error_to_pkt_flags_map[(rx_status >>\n \t\tIXGBE_RXDADV_ERR_CKSUM_BIT) & IXGBE_RXDADV_ERR_CKSUM_MSK];\n \n+\t/* Mask out the bad UDP checksum error if the hardware has UDP zero\n+\t * checksum error issue, so that the software application will then\n+\t * have to recompute the checksum itself if needed.\n+\t */\n+\tif ((rx_status & IXGBE_RXDADV_ERR_TCPE) &&\n+\t (pkt_info & IXGBE_RXDADV_PKTTYPE_UDP) &&\n+\t rx_udp_csum_zero_err)\n+\t\tpkt_flags &= ~PKT_RX_L4_CKSUM_BAD;\n+\n \tif ((rx_status & IXGBE_RXD_STAT_OUTERIPCS) &&\n \t (rx_status & IXGBE_RXDADV_ERR_OUTERIPER)) {\n \t\tpkt_flags |= PKT_RX_EIP_CKSUM_BAD;\n@@ -1569,7 +1579,9 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)\n \t\t\t/* convert descriptor fields to rte mbuf flags */\n \t\t\tpkt_flags = rx_desc_status_to_pkt_flags(s[j],\n \t\t\t\tvlan_flags);\n-\t\t\tpkt_flags |= rx_desc_error_to_pkt_flags(s[j]);\n+\t\t\tpkt_flags |= rx_desc_error_to_pkt_flags(s[j],\n+\t\t\t\t\t(uint16_t)pkt_info[j],\n+\t\t\t\t\trxq->rx_udp_csum_zero_err);\n \t\t\tpkt_flags |= ixgbe_rxd_pkt_info_to_pkt_flags\n \t\t\t\t\t((uint16_t)pkt_info[j]);\n \t\t\tmb->ol_flags = pkt_flags;\n@@ -1902,7 +1914,9 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\trxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);\n \n \t\tpkt_flags = rx_desc_status_to_pkt_flags(staterr, vlan_flags);\n-\t\tpkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);\n+\t\tpkt_flags = pkt_flags |\n+\t\t\trx_desc_error_to_pkt_flags(staterr, (uint16_t)pkt_info,\n+\t\t\t\t\t\t rxq->rx_udp_csum_zero_err);\n \t\tpkt_flags = pkt_flags |\n \t\t\tixgbe_rxd_pkt_info_to_pkt_flags((uint16_t)pkt_info);\n \t\trxm->ol_flags = pkt_flags;\n@@ -1995,7 +2009,8 @@ ixgbe_fill_cluster_head_buf(\n \thead->vlan_tci = rte_le_to_cpu_16(desc->wb.upper.vlan);\n \tpkt_info = rte_le_to_cpu_32(desc->wb.lower.lo_dword.data);\n \tpkt_flags = rx_desc_status_to_pkt_flags(staterr, rxq->vlan_flags);\n-\tpkt_flags |= rx_desc_error_to_pkt_flags(staterr);\n+\tpkt_flags |= rx_desc_error_to_pkt_flags(staterr, (uint16_t)pkt_info,\n+\t\t\t\t\t\trxq->rx_udp_csum_zero_err);\n \tpkt_flags |= ixgbe_rxd_pkt_info_to_pkt_flags((uint16_t)pkt_info);\n \thead->ol_flags = pkt_flags;\n \thead->packet_type =\n@@ -3116,6 +3131,13 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,\n \telse\n \t\trxq->pkt_type_mask = IXGBE_PACKET_TYPE_MASK_82599;\n \n+\t/*\n+\t * 82599 errata, UDP frames with a 0 checksum can be marked as checksum\n+\t * errors.\n+\t */\n+\tif (hw->mac.type == ixgbe_mac_82599EB)\n+\t\trxq->rx_udp_csum_zero_err = 1;\n+\n \t/*\n \t * Allocate RX ring hardware descriptors. A memzone large enough to\n \t * handle the maximum ring size is allocated in order to allow for\ndiff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h\nindex 8a25e98df6..476ef62cfd 100644\n--- a/drivers/net/ixgbe/ixgbe_rxtx.h\n+++ b/drivers/net/ixgbe/ixgbe_rxtx.h\n@@ -129,6 +129,8 @@ struct ixgbe_rx_queue {\n \tuint8_t crc_len; /**< 0 if CRC stripped, 4 otherwise. */\n \tuint8_t drop_en; /**< If not 0, set SRRCTL.Drop_En. */\n \tuint8_t rx_deferred_start; /**< not in global dev start. */\n+\t/** UDP frames with a 0 checksum can be marked as checksum errors. */\n+\tuint8_t rx_udp_csum_zero_err;\n \t/** flags to set in mbuf when a vlan is detected. */\n \tuint64_t vlan_flags;\n \tuint64_t\t offloads; /**< Rx offloads with DEV_RX_OFFLOAD_* */\ndiff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c\nindex 9bbffe6119..7610fd93db 100644\n--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c\n+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c\n@@ -132,9 +132,9 @@ desc_to_olflags_v_ipsec(__m128i descs[4], struct rte_mbuf **rx_pkts)\n \n static inline void\n desc_to_olflags_v(__m128i descs[4], __m128i mbuf_init, uint8_t vlan_flags,\n-\tstruct rte_mbuf **rx_pkts)\n+\t\t uint16_t udp_p_flag, struct rte_mbuf **rx_pkts)\n {\n-\t__m128i ptype0, ptype1, vtag0, vtag1, csum;\n+\t__m128i ptype0, ptype1, vtag0, vtag1, csum, udp_csum_skip;\n \t__m128i rearm0, rearm1, rearm2, rearm3;\n \n \t/* mask everything except rss type */\n@@ -161,6 +161,7 @@ desc_to_olflags_v(__m128i descs[4], __m128i mbuf_init, uint8_t vlan_flags,\n \t\t(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n \t\tIXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,\n \t\tIXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP);\n+\n \t/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */\n \tconst __m128i vlan_csum_map_lo = _mm_set_epi8(\n \t\t0, 0, 0, 0,\n@@ -182,12 +183,23 @@ desc_to_olflags_v(__m128i descs[4], __m128i mbuf_init, uint8_t vlan_flags,\n \t\t0, PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,\n \t\tPKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t));\n \n+\t/* mask everything except UDP header present if specified */\n+\tconst __m128i udp_hdr_p_msk = _mm_set_epi16\n+\t\t(0, 0, 0, 0,\n+\t\t udp_p_flag, udp_p_flag, udp_p_flag, udp_p_flag);\n+\n+\tconst __m128i udp_csum_bad_shuf = _mm_set_epi8\n+\t\t(0, 0, 0, 0, 0, 0, 0, 0,\n+\t\t 0, 0, 0, 0, 0, 0, ~(uint8_t)PKT_RX_L4_CKSUM_BAD, 0xFF);\n+\n \tptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);\n \tptype1 = _mm_unpacklo_epi16(descs[2], descs[3]);\n \tvtag0 = _mm_unpackhi_epi16(descs[0], descs[1]);\n \tvtag1 = _mm_unpackhi_epi16(descs[2], descs[3]);\n \n \tptype0 = _mm_unpacklo_epi32(ptype0, ptype1);\n+\t/* save the UDP header present information */\n+\tudp_csum_skip = _mm_and_si128(ptype0, udp_hdr_p_msk);\n \tptype0 = _mm_and_si128(ptype0, rsstype_msk);\n \tptype0 = _mm_shuffle_epi8(rss_flags, ptype0);\n \n@@ -215,6 +227,15 @@ desc_to_olflags_v(__m128i descs[4], __m128i mbuf_init, uint8_t vlan_flags,\n \n \tvtag1 = _mm_or_si128(ptype0, vtag1);\n \n+\t/* convert the UDP header present 0x200 to 0x1 for aligning with each\n+\t * PKT_RX_L4_CKSUM_BAD value in low byte of 16 bits word ol_flag in\n+\t * vtag1 (4x16). Then mask out the bad checksum value by shuffle and\n+\t * bit-mask.\n+\t */\n+\tudp_csum_skip = _mm_srli_epi16(udp_csum_skip, 9);\n+\tudp_csum_skip = _mm_shuffle_epi8(udp_csum_bad_shuf, udp_csum_skip);\n+\tvtag1 = _mm_and_si128(vtag1, udp_csum_skip);\n+\n \t/*\n \t * At this point, we have the 4 sets of flags in the low 64-bits\n \t * of vtag1 (4x16).\n@@ -341,6 +362,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,\n \t__m128i dd_check, eop_check;\n \t__m128i mbuf_init;\n \tuint8_t vlan_flags;\n+\tuint16_t udp_p_flag = 0; /* Rx Descriptor UDP header present */\n \n \t/* nb_pkts has to be floor-aligned to RTE_IXGBE_DESCS_PER_LOOP */\n \tnb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RTE_IXGBE_DESCS_PER_LOOP);\n@@ -365,6 +387,9 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,\n \t\t\t\trte_cpu_to_le_32(IXGBE_RXDADV_STAT_DD)))\n \t\treturn 0;\n \n+\tif (rxq->rx_udp_csum_zero_err)\n+\t\tudp_p_flag = IXGBE_RXDADV_PKTTYPE_UDP;\n+\n \t/* 4 packets DD mask */\n \tdd_check = _mm_set_epi64x(0x0000000100000001LL, 0x0000000100000001LL);\n \n@@ -477,7 +502,8 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,\n \t\tsterr_tmp1 = _mm_unpackhi_epi32(descs[1], descs[0]);\n \n \t\t/* set ol_flags with vlan packet type */\n-\t\tdesc_to_olflags_v(descs, mbuf_init, vlan_flags, &rx_pkts[pos]);\n+\t\tdesc_to_olflags_v(descs, mbuf_init, vlan_flags, udp_p_flag,\n+\t\t\t\t &rx_pkts[pos]);\n \n #ifdef RTE_LIB_SECURITY\n \t\tif (unlikely(use_ipsec))\n", "prefixes": [ "v2" ] }{ "id": 87648, "url": "