get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/87617/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 87617,
    "url": "http://patchwork.dpdk.org/api/patches/87617/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20210202070652.145861-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": "<20210202070652.145861-1-haiyue.wang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210202070652.145861-1-haiyue.wang@intel.com",
    "date": "2021-02-02T07:06:52",
    "name": "[v1] net/ixgbe: adjust error for UDP with zero checksum",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "fb8235955c86f9d6eed243a76ba76230252d5f13",
    "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/20210202070652.145861-1-haiyue.wang@intel.com/mbox/",
    "series": [
        {
            "id": 15087,
            "url": "http://patchwork.dpdk.org/api/series/15087/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=15087",
            "date": "2021-02-02T07:06:52",
            "name": "[v1] net/ixgbe: adjust error for UDP with zero checksum",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/15087/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/87617/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/87617/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 D2248A052A;\n\tTue,  2 Feb 2021 08:23:30 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 52AD824027A;\n\tTue,  2 Feb 2021 08:23:30 +0100 (CET)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by mails.dpdk.org (Postfix) with ESMTP id 7159F240279;\n Tue,  2 Feb 2021 08:23:27 +0100 (CET)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 01 Feb 2021 23:23:27 -0800",
            "from npg-dpdk-haiyue-1.sh.intel.com ([10.67.118.220])\n by fmsmga008.fm.intel.com with ESMTP; 01 Feb 2021 23:23:23 -0800"
        ],
        "IronPort-SDR": [
            "\n YTvxQe8Z6NXuAcA3H3hlvCLQqUC6dXMpQ53o0naVW/N3//noUJABg7MYDeM3BXoSXe9ipRo047\n rFBmSoDCjLkA==",
            "\n BdyY9SwgE3CZ8JLeQsmKOVpw7Yd8uuxeVq360q2MfJJeCabXd2uoqgCYP38p6andCPXxe6kqVY\n nek66QaOwRLA=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9882\"; a=\"180035339\"",
            "E=Sophos;i=\"5.79,394,1602572400\"; d=\"scan'208\";a=\"180035339\"",
            "E=Sophos;i=\"5.79,394,1602572400\"; d=\"scan'208\";a=\"370396963\""
        ],
        "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 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": "Tue,  2 Feb 2021 15:06:52 +0800",
        "Message-Id": "<20210202070652.145861-1-haiyue.wang@intel.com>",
        "X-Mailer": "git-send-email 2.30.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v1] net/ixgbe: adjust error for UDP with zero\n checksum",
        "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. This patch adds a\ntest around this checksum error flag set for this condition.\n\n1. UDP Test\n  sendp(Ether()/IP()/UDP(chksum=0)/Raw(\"a\"*100), iface=\"ens802f0\")\n  port 0/queue 0: received 1 packets\n    ol_flags: PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD\n\n2. TCP Test\n  sendp(Ether()/IP()/TCP(chksum=0)/Raw(\"a\"*100), iface=\"ens802f0\")\n  port 0/queue 0: received 1 packets\n    ol_flags: PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_GOOD\n\nBugzilla ID: 629\nCc: stable@dpdk.org\n\nSigned-off-by: Haiyue Wang <haiyue.wang@intel.com>\n---\n doc/guides/nics/ixgbe.rst              |  6 ++++\n drivers/net/ixgbe/ixgbe_rxtx.c         | 27 +++++++++++---\n drivers/net/ixgbe/ixgbe_rxtx.h         |  2 ++\n drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c | 49 ++++++++++++++++++++------\n 4 files changed, 70 insertions(+), 14 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/ixgbe.rst b/doc/guides/nics/ixgbe.rst\nindex 696cbd93b..de210b7b8 100644\n--- a/doc/guides/nics/ixgbe.rst\n+++ b/doc/guides/nics/ixgbe.rst\n@@ -287,6 +287,12 @@ 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 zero checksum, the UDP checksum is always marked\n+as good.\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 c1f0c446a..550e3f390 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@@ -1480,6 +1481,12 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)\n \t\tPKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_GOOD,\n \t\tPKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD\n \t};\n+\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\trx_status &= ~IXGBE_RXDADV_ERR_TCPE;\n+\n \tpkt_flags = error_to_pkt_flags_map[(rx_status >>\n \t\tIXGBE_RXDADV_ERR_CKSUM_BIT) & IXGBE_RXDADV_ERR_CKSUM_MSK];\n \n@@ -1569,7 +1576,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 +1911,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 +2006,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 +3128,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 8a25e98df..476ef62cf 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 90c076825..8bffafc71 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, vlan_csum_msk;\n \t__m128i rearm0, rearm1, rearm2, rearm3;\n \n \t/* mask everything except rss type */\n@@ -154,13 +154,29 @@ desc_to_olflags_v(__m128i descs[4], __m128i mbuf_init, uint8_t vlan_flags,\n \t\t\tPKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, 0);\n \n \t/* mask everything except vlan present and l4/ip csum error */\n-\tconst __m128i vlan_csum_msk = _mm_set_epi16(\n-\t\t(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n-\t\t(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n-\t\t(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\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+\tconst __m128i vlan_csum_all_msk = _mm_set_epi16\n+\t\t((IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n+\t\t (IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n+\t\t (IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n+\t\t (IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,\n+\t\t IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,\n+\t\t IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP);\n+\n+\t/* mask everything except UDP header present */\n+\tconst __m128i udptype_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+\t/* convert UDP header present 16 bits 0x0200 to 8 bits 0x02, then get\n+\t * the TCP/UDP checksum error mask 8 bits ~0x40 from 32 bits value of\n+\t * 0x40000000.\n+\t */\n+\tconst __m128i udp_csum_err_skip = _mm_set_epi8\n+\t\t(0, 0, 0, 0,\n+\t\t 0, 0, 0, 0,\n+\t\t 0, 0, 0, 0,\n+\t\t 0, ~(IXGBE_RXDADV_ERR_TCPE >> 24), 0, 0xFF);\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@@ -188,9 +204,17 @@ desc_to_olflags_v(__m128i descs[4], __m128i mbuf_init, uint8_t vlan_flags,\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+\tvlan_csum_msk = _mm_and_si128(ptype0, udptype_msk);\n \tptype0 = _mm_and_si128(ptype0, rsstype_msk);\n \tptype0 = _mm_shuffle_epi8(rss_flags, ptype0);\n \n+\t/* now the most significant 64 bits containing the UDP present */\n+\tvlan_csum_msk = _mm_slli_si128(vlan_csum_msk, 8);\n+\t/* use UDP present 0x02 index to get L4 checksum error mask ~0x40 */\n+\tvlan_csum_msk = _mm_shuffle_epi8(udp_csum_err_skip, vlan_csum_msk);\n+\t/* then mask out the L4 checksum error bit as needed */\n+\tvlan_csum_msk = _mm_and_si128(vlan_csum_all_msk, vlan_csum_msk);\n \tvtag1 = _mm_unpacklo_epi32(vtag0, vtag1);\n \tvtag1 = _mm_and_si128(vtag1, vlan_csum_msk);\n \n@@ -341,6 +365,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 +390,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 +505,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": [
        "v1"
    ]
}