get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87648,
    "url": "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"
    ]
}