From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10073.outbound.protection.outlook.com [40.107.1.73]) by dpdk.org (Postfix) with ESMTP id C967F1B27E for ; Mon, 30 Oct 2017 12:34:38 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=mDNeqoNLaTuw7VLODcwhC9Wms+QeCnoGqcSz0XaK1w4=; b=Ndd8Sjkmg0nYeGMBcMeiQQMsVr+XCH9UR18UHRSO3SKuWd962vuLlGwP4NZQOSp9TvG7iRfutFYgbWBfry/OSbeo3ZRGgnXCgCwaTPHdRVh783tum1+MG3j/4WekH3IVH3wuUyyLEav7vnLsWyx/s7y6R/dkpntRBYvRL6LSI/U= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=motih@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR05MB1918.eurprd05.prod.outlook.com (2a01:111:e400:7b79::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.178.6; Mon, 30 Oct 2017 11:34:35 +0000 From: Moti Haimovsky To: adrien.mazarguil@6wind.com Cc: dev@dpdk.org, Moti Haimovsky Date: Mon, 30 Oct 2017 13:34:16 +0200 Message-Id: <1509363256-123323-1-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: AM0PR0102CA0058.eurprd01.prod.exchangelabs.com (2603:10a6:208::35) To VI1PR05MB1918.eurprd05.prod.outlook.com (2a01:111:e400:7b79::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 241a6d96-d056-407f-32c8-08d51f8a3305 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(4534020)(4602075)(2017052603238); SRVR:VI1PR05MB1918; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1918; 3:ZE8q2GlHjNAT93TGw9j4s/SKy/FEWnSf0TPFRPVcSrqCfRqFH6VYsIeDw2fhMr4bBQWJHbdB8UXLPYaY8NwTxNjHo8mA3Y/dErqVotBJttMGmIwUOM64c5ZA7CQsFG2VOYE+2JrUKJUeLn9sdno8k3c92vnQn/Pf1HmE4p8at8a3CqJ4q9ySeJBCGoaqno8kcAZKtPKSXSrGge6iHKvAXsFt6qkLAvm+7u4HBBh9aDvwsu0pRW+/HtI6ECNw8Fp0; 25:QAHk0/QU4PNM8bh5y8V0OieEUif1yzXG/qtkUEvAFp3d+46THxtyPx3GX0o3jHClK+ga2VUbRRg8LJl/J7Ts90YBF9o+YDPgcBj2enbTsObZEQyrp6X7N2+nNmbs8PCp0L3LU7MWE3DtVUF+80jo61l1PZM8EA7S7BuQ/A4vpQmFkrA6FsCZkzf5gK9I38emu546PtU87VbHkHsGXU8ho+fSWf8IFneihEFUlwWCsRAWwRcMwaICWP4n7IHsddOn0qv2Z3jWoMJh8nmau7ELgOQE4umJ/6MOa6tpP5A4gGPVgssJN2t60ItYi4gUxJm1S/Fuz5hREzb1xC04UKTenn1GZ/wwTN5wbuCEaJl/BjE=; 31:F0/oRo5uwR05bXVHjrdX/ZRI6dHMgEyzyNggP/n8syF+sNQ7xwS34DWbUnZzykEaRRtvBcHEUsdG58H1GQ1/DaAUtzNCqXlBBXWwUEVIBujxJ49a/L+/jz3rz9d6ElZckpiXPb5eq6RjcdDEWUmloarxjcxTuq/qnfMTFoYs5TL6AnPYCMSOl+SpiG5gU6UsGtirj9VTzNoV80KGlJoNTgVPKesBH7vUIXfr+8MpdAo= X-MS-TrafficTypeDiagnostic: VI1PR05MB1918: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1918; 20:1K38G4gHpl5fv/tAKnVyb0eAHbrCMrHSIoefzNCVXeckV5V69dlKKWW6DfRASRPp4igHlRPhFu6hdIusSczd2rwYz7ukpIBqiAiYFoMqKRYeck/QzYYxXkHa0HQN4+yTjQKlXBdHNInz/9rpGXwgXQabIJBvVzjb5ACeQQGJ2zqlCiHyXAg9Xm1cyR8Togw0g5/K4pRhkR3Lwfxoadjwq8MXh2bvXMUVIBhPLoUNxwkpiCQPygc1hEw+Md9quFY2pPvbN2felrUHbjBE3jP8GAx2lq5X9EiGIbquGZpngTogs3AWXVdQEbqKHLvtoRFUkeM9GXCkcZ6NCFwm9nKF5PjKTZJMeTboyHcTrLUMVX0k7D+SFJiO6LdW/1CyBOMWRjKQIYm0FkN5kv67LnZWXcCqtZKvazxv44JIukxxUoDiFM4YbxlSrT0pNL1F+axjZdohJp3Tm/suVYYg+ZPKPLVcNcMRGfjOn0SA8PqnpxLE+i6GQNmiw2BXxlvzQjAe; 4:5NInQMpaPXtj8Vz/f2FDPtV+i/IGR6bs1aTsYXQtp6VY2flfA8rs0+fY8ZAr7M1MAwkeDw3lyORsXhsh/dMNF66WGrkwAqZJ+IFS85fOOKiDDLl8t0w+sKds4E2cK/iRR4pOU2YMEH6V+RjENC2yzaJIY85XpxuXxijZ/PheWGi/BVmx2Sp7aMOqmkWryU0+ODPaPgmE00PX6czAXEU2024TdvOg7HrdOQn0pkLL4gLj7SLURNuh+Oo3dymMa+ivjpmo0bV7VWJT4ifStllRDQ== X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(3231020)(3002001)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123558100)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR05MB1918; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR05MB1918; X-Forefront-PRVS: 0476D4AB88 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(39860400002)(376002)(346002)(199003)(189002)(68736007)(69596002)(478600001)(8676002)(81166006)(81156014)(47776003)(8936002)(305945005)(7736002)(66066001)(316002)(50986999)(16586007)(36756003)(101416001)(50226002)(33026002)(97736004)(4326008)(5660300001)(6116002)(3846002)(5003940100001)(6666003)(6916009)(107886003)(53936002)(55016002)(2906002)(16526018)(189998001)(50466002)(4720700003)(48376002)(25786009)(575784001)(86362001)(33646002)(105586002)(2351001)(2361001)(21086003)(106356001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB1918; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1918; 23:m4gW9WiaPG0PhuHEYONlni1hqblRwE4VtJkhvNVEe?= =?us-ascii?Q?ed0Vv7th6kcmrjhccvOhLBw/GbyVspJRRNuu/aWX2XLF0AOvkBhiveVc7LXc?= =?us-ascii?Q?U9e0mjmjOGqTNw8azdboiVsT8OcO9cm1Gqonjgw/Ze5273ZW2k11jwP85uSj?= =?us-ascii?Q?Jrhhpu4cnj+9BbU+9Nd57B4mtl1yBXki3FVQAhyIkXsZOBTHtvYT80lUSGWM?= =?us-ascii?Q?tW/Udb4I61Jfx+fH87oS1vEWHuNLDd2k21BMqj29eMwoieXm4FcEa6UFlqAm?= =?us-ascii?Q?4UN/HUnkhiumJkUIHgFRW9d41+O6UZ5SFbvGnGJbTWnaWPx9645JEa2FZvnI?= =?us-ascii?Q?lvAyjBCXaLY/IWejeNgxKLuTugb4r6uisb0wBb8LoIImay8GroW2VL2Ag1rg?= =?us-ascii?Q?GfST6GpECxP/9uOHbW7rLo9lgXIsiU4+ZwAWzb4dC5vQ5Y+B0hukJ9o6XiL/?= =?us-ascii?Q?MIqRVmhbfrQprb4Z/a9iC5lVrUTKURTxCGFnjYal9Ut2CrK3wi7PH9rdB1c5?= =?us-ascii?Q?reG08LTViwRlOL8VOFTpweNBO/2R7diPaCr4jvj8bb6OJPSEZKhD++UqDfvx?= =?us-ascii?Q?RYw5fKh5WsGrv5c4h1e6AJmhqB1v+mjkaPWsiXTynzPEfJCVfKpjMCw1bmrB?= =?us-ascii?Q?J93d4kbe8hZWTQ0AUrBGgcVWGg+r3IF1T8WE3XE7f6LHgU1cvM7qcWnzyoy4?= =?us-ascii?Q?xQCttoMAQ8DFphHe1bSZqsPpUS/dh678oITj3ish+my6rOQ8vyNAWgu921zR?= =?us-ascii?Q?OoI3G5sPbnZHhbBjIaIkMyqlVjhx4sgAYxgujFmwshi4i/jCxv7Izyu+GpUI?= =?us-ascii?Q?wtqDmU6tvh8tt6aIYCu9uWJvLJMcWvaJLB/a9w0RPKBzVMkGWI3OaC58nEKH?= =?us-ascii?Q?x9X5o6IariNz/xMKMNtfoZ4V04S6Zse+dX6msGsOU+Eamc3aRIAGyU9jdWqv?= =?us-ascii?Q?9BhaB0F94VSNjRpyptEd5GruGrRUTsg5+PEA6dfrbp1L9AD2Dgc6XzCEIiPr?= =?us-ascii?Q?DKxHHqZWZSDbLCACzivlQNHRkWTTPuh/Ezsf/2mPQ6F0czCbDJaUraeEWpxp?= =?us-ascii?Q?x3IjetmVLbO17XyKOoRjq4L4LviogAkLY8tmg+rHayY2YPpznZ5m9rlvyNnb?= =?us-ascii?Q?hUXRakkljSVTDAgegK1C0c+K2IWrFzR8NI4Sxu+1RWzZ0cRsy9J9Csi+4yQ+?= =?us-ascii?Q?bqSAKvw6cFm2fQ=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1918; 6:r8o1vqRk/ZkuXG0ehVr3N9MPFCSDi+ZuEMA0bYg7x5ZNSY4h+xI1s1Rc++HjiahkRCjACoXnsslSUQkOPqDp9LY8KGU6KwUjeoYoAUCOiP5rU4xxP4n/NwrKQBT4pNr0qbJ1D3FoSq8bRLo3CcpBpgpKjZzZOfbmYzz7OzgO0qS4TiEPUhxhV7zVsjPxYt1opcYbSApdQlCPTC3WabZBFCDmDD3VO0xxyQ5sU78ntqVRHEjdcnpv/wGCtrVKYBI/q5zMxZgSFhfbRiSzRuTs9dpw67f168qtoOWb0v5BhIK3x3Qwc0fse35/Xh9VIhHOCzWG6xWnP8MVN3nc7++1sBcbm0xBxNq4KZoSZwt8fPI=; 5:gL6Jo1Tw07Q8iZNW04d+98wiljePeiPNlfLKRddmZbZ/61crtT+O2mqF/uC5uejs7bXdmkzbyH1Dqro5LvrUXQFWoUxfcLiVcN/5OnUap6eneLuSo7Tj0UDooBAbpSB90IbR3vGkBDCopirLNcNvL94hnTbyVRv9rr9T2pMHZIM=; 24:RxmagzcdEMtNmNQd2bp+Ssi3afEIXONDzubfRNLdVJtMBAhGn1jvoaVxj3UmNad2iWWUqenByJbgmhOGJkbumkK9q8Wyen/3K+KmVqftN3U=; 7:17xksU+71HpgI2wmsFOzLxmlbYKAxg1qBZFwVAY3Okz9CjI6J+405OGMRQOTM8H2F50qP+eaeqrPcCoN9JJD8pF27XLxeHrt/Z8b5mt/EZO0YczLyHo1PAxuR/hBtE2UII0BHGYqn/VdDpOvSxiQ7xxHy2qyHxDP6FlC8Uvihu4v2mekUnK2KlrAQ6IThlXWdrqC0sd81ncIy9SahBCQr1UusA17wPIVmtIVLChZQyc1bfaW6x0EskVGa+1+t3gT SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2017 11:34:35.6750 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 241a6d96-d056-407f-32c8-08d51f8a3305 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB1918 Subject: [dpdk-dev] [PATCH] net/mlx4: enhance Rx packet type offloads X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Oct 2017 11:34:39 -0000 This patch enhances the Rx packet type offload to also report the L4 protocol information in the hw ptype filled by the PMD for each received packet. Signed-off-by: Moti Haimovsky --- drivers/net/mlx4/mlx4.c | 2 + drivers/net/mlx4/mlx4_prm.h | 16 +++ drivers/net/mlx4/mlx4_rxtx.c | 264 +++++++++++++++++++++++++++++++++++++++---- drivers/net/mlx4/mlx4_rxtx.h | 1 + 4 files changed, 260 insertions(+), 23 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 5d35a50..c228da3 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -706,6 +706,8 @@ struct mlx4_conf { static void rte_mlx4_pmd_init(void) { + /* Build the static table for ptype conversion. */ + mlx4_set_ptype_table(); /* * RDMAV_HUGEPAGES_SAFE tells ibv_fork_init() we intend to use * huge pages. Calling ibv_fork_init() during init allows diff --git a/drivers/net/mlx4/mlx4_prm.h b/drivers/net/mlx4/mlx4_prm.h index b0fd982..a301f95 100644 --- a/drivers/net/mlx4/mlx4_prm.h +++ b/drivers/net/mlx4/mlx4_prm.h @@ -78,6 +78,22 @@ enum { MLX4_CQE_L2_TUNNEL_IPOK = (int)(1u << 31), }; +/* CQE status flags. */ +enum { + MLX4_CQE_STATUS_IPV4 = 1 << 22, + MLX4_CQE_STATUS_IPV4F = 1 << 23, + MLX4_CQE_STATUS_IPV6 = 1 << 24, + MLX4_CQE_STATUS_IPV4OPT = 1 << 25, + MLX4_CQE_STATUS_TCP = 1 << 26, + MLX4_CQE_STATUS_UDP = 1 << 27, + MLX4_CQE_STATUS_PTYPE_MASK = MLX4_CQE_STATUS_IPV4 | + MLX4_CQE_STATUS_IPV4F | + MLX4_CQE_STATUS_IPV6 | + MLX4_CQE_STATUS_IPV4OPT | + MLX4_CQE_STATUS_TCP | + MLX4_CQE_STATUS_UDP, +}; + /* Send queue information. */ struct mlx4_sq { uint8_t *buf; /**< SQ buffer. */ diff --git a/drivers/net/mlx4/mlx4_rxtx.c b/drivers/net/mlx4/mlx4_rxtx.c index 67dc712..fd31a6f 100644 --- a/drivers/net/mlx4/mlx4_rxtx.c +++ b/drivers/net/mlx4/mlx4_rxtx.c @@ -71,6 +71,215 @@ struct pv { uint32_t val; }; +/* A table to translate Rx completion flags to packet type. */ +uint32_t mlx4_ptype_table[] __rte_cache_aligned = { + [0xff] = RTE_PTYPE_ALL_MASK, /* Last entry for errored packet. */ +}; + +/** + * Build a table to translate Rx completion flags to packet type. + * + * @note: fix mlx5_dev_supported_ptypes_get() if any change here. + */ +void +mlx4_set_ptype_table(void) +{ + unsigned int i; + uint32_t (*p)[RTE_DIM(mlx4_ptype_table)] = &mlx4_ptype_table; + + /* Last entry must not be overwritten, reserved for errored packet. */ + for (i = 0; i < RTE_DIM(mlx4_ptype_table) - 1; ++i) + (*p)[i] = RTE_PTYPE_UNKNOWN; + /* + * The index to the array should have: + * bit[7] - MLX4_CQE_L2_TUNNEL + * bit[6] - MLX4_CQE_L2_TUNNEL_IPV4 + * bit[5] - MLX4_CQE_STATUS_UDP + * bit[4] - MLX4_CQE_STATUS_TCP + * bit[3] - MLX4_CQE_STATUS_IPV4OPT + * bit[2] - MLX4_CQE_STATUS_IPV6 + * bit[1] - MLX4_CQE_STATUS_IPV4F + * bit[0] - MLX4_CQE_STATUS_IPV4 + * giving a total of up to 256 entries. + */ + (*p)[0x00] = RTE_PTYPE_L2_ETHER; + (*p)[0x01] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_NONFRAG; + (*p)[0x02] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_FRAG; + (*p)[0x03] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_FRAG; + (*p)[0x04] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN; + (*p)[0x09] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_NONFRAG; + (*p)[0x0a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_FRAG; + (*p)[0x11] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_TCP; + (*p)[0x12] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_TCP; + (*p)[0x14] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_L4_TCP; + (*p)[0x18] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_TCP; + (*p)[0x19] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_TCP; + (*p)[0x1a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_TCP; + (*p)[0x21] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_UDP; + (*p)[0x22] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_L4_UDP; + (*p)[0x24] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_L4_UDP; + (*p)[0x28] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_UDP; + (*p)[0x29] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_UDP; + (*p)[0x2a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT | + RTE_PTYPE_L4_UDP; + /* Tunneled - L3 IPV6 */ + (*p)[0x80] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN; + (*p)[0x81] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_NONFRAG; + (*p)[0x82] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG; + (*p)[0x83] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG; + (*p)[0x84] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN; + (*p)[0x88] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT; + (*p)[0x89] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_NONFRAG; + (*p)[0x8a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_FRAG; + /* Tunneled - L3 IPV6, TCP */ + (*p)[0x91] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0x92] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0x93] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0x94] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0x98] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0x99] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0x9a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_TCP; + /* Tunneled - L3 IPV6, UDP */ + (*p)[0xa1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xa2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xa3] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xa4] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xa8] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xa9] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xaa] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_UDP; + /* Tunneled - L3 IPV4 */ + (*p)[0xc0] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN; + (*p)[0xc1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_NONFRAG; + (*p)[0xc2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG; + (*p)[0xc3] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG; + (*p)[0xc4] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN; + (*p)[0xc8] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT; + (*p)[0xc9] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_NONFRAG; + (*p)[0xca] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_FRAG; + /* Tunneled - L3 IPV4, TCP */ + (*p)[0xd0] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xd1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xd2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xd3] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xd4] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xd8] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xd9] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | + RTE_PTYPE_INNER_L4_TCP; + (*p)[0xda] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_TCP; + /* Tunneled - L3 IPV4, UDP */ + (*p)[0xe0] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xe1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xe2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xe3] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xe4] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | + RTE_PTYPE_INNER_L4_UDP; + (*p)[0xe8] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_UDP; + (*p)[0xe9] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_UDP; + (*p)[0xea] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | + RTE_PTYPE_INNER_L3_IPV4_EXT | RTE_PTYPE_INNER_L4_FRAG | + RTE_PTYPE_INNER_L4_UDP; +} + /** * Stamp a WQE so it won't be reused by the HW. * @@ -568,30 +777,40 @@ struct pv { /** * Translate Rx completion flags to packet type. * - * @param flags - * Rx completion flags returned by mlx4_cqe_flags(). + * @param[in] cqe + * Pointer to CQE. * * @return - * Packet type in mbuf format. + * Packet type for struct rte_mbuf. */ static inline uint32_t -rxq_cq_to_pkt_type(uint32_t flags) +rxq_cq_to_pkt_type(volatile struct mlx4_cqe *cqe) { - uint32_t pkt_type; + uint8_t idx = 0; + uint32_t pinfo = rte_be_to_cpu_32(cqe->vlan_my_qpn); + uint32_t status = rte_be_to_cpu_32(cqe->status); - if (flags & MLX4_CQE_L2_TUNNEL) - pkt_type = - mlx4_transpose(flags, - MLX4_CQE_L2_TUNNEL_IPV4, - RTE_PTYPE_L3_IPV4_EXT_UNKNOWN) | - mlx4_transpose(flags, - MLX4_CQE_STATUS_IPV4_PKT, - RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN); - else - pkt_type = mlx4_transpose(flags, - MLX4_CQE_STATUS_IPV4_PKT, - RTE_PTYPE_L3_IPV4_EXT_UNKNOWN); - return pkt_type; + /* + * The index to the array should have: + * bit[7] - MLX4_CQE_L2_TUNNEL + * bit[6] - MLX4_CQE_L2_TUNNEL_IPV4 + */ + if (pinfo & MLX4_CQE_L2_TUNNEL) + idx |= ((pinfo & MLX4_CQE_L2_TUNNEL) >> 20) | + ((pinfo & MLX4_CQE_L2_TUNNEL_IPV4) >> 19); + /* + * The index to the array should have: + * bit[5] - MLX4_CQE_STATUS_UDP + * bit[4] - MLX4_CQE_STATUS_TCP + * bit[3] - MLX4_CQE_STATUS_IPV4OPT + * bit[2] - MLX4_CQE_STATUS_IPV6 + * bit[1] - MLX4_CQE_STATUS_IPV4F + * bit[0] - MLX4_CQE_STATUS_IPV4 + * giving a total of up to 256 entries. + */ + idx |= ((status & MLX4_CQE_STATUS_PTYPE_MASK) >> 22); + rte_prefetch0(&(mlx4_ptype_table[idx])); + return mlx4_ptype_table[idx]; } /** @@ -774,6 +993,10 @@ struct pv { goto skip; } pkt = seg; + /* Update packet information. */ + pkt->packet_type = rxq_cq_to_pkt_type(cqe); + pkt->ol_flags = 0; + pkt->pkt_len = len; if (rxq->csum | rxq->csum_l2tun) { uint32_t flags = mlx4_cqe_flags(cqe, @@ -784,12 +1007,7 @@ struct pv { rxq_cq_to_ol_flags(flags, rxq->csum, rxq->csum_l2tun); - pkt->packet_type = rxq_cq_to_pkt_type(flags); - } else { - pkt->packet_type = 0; - pkt->ol_flags = 0; } - pkt->pkt_len = len; } rep->nb_segs = 1; rep->port = rxq->port_id; diff --git a/drivers/net/mlx4/mlx4_rxtx.h b/drivers/net/mlx4/mlx4_rxtx.h index 7d67748..5302232 100644 --- a/drivers/net/mlx4/mlx4_rxtx.h +++ b/drivers/net/mlx4/mlx4_rxtx.h @@ -165,6 +165,7 @@ int mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, /* mlx4_rxtx.c */ +void mlx4_set_ptype_table(void); uint32_t mlx4_txq_mp2mr(struct txq *txq, struct rte_mempool *mp); uint16_t mlx4_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n); -- 1.8.3.1