From patchwork Wed May 4 11:23:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Dumitrescu X-Patchwork-Id: 110610 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 778CAA04FD; Wed, 4 May 2022 13:23:53 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 368DA427F4; Wed, 4 May 2022 13:23:49 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id B1E544069F for ; Wed, 4 May 2022 13:23:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651663426; x=1683199426; h=from:to:subject:date:message-id:in-reply-to:references; bh=212w5a94Vw4iYfV8zY16JS8fqAc2jzu3ICEt3rBEZSI=; b=hqqrnCHWe6b8gy01MR178hq9S0uqK9uQNLmJaV+cZsKtkc7daxzRe11o qoXT+hI4+xPwRoPOEBPbodrbEjDv5GnWlFsMJRpHxS+ORXZpeOzLbdHlS 7PmnIOydZX1wpc3VSt1OxhPBCjJHDLmPzshoXRTcX8Qwa4niWCkOuzEhL Kh6YqQzGK3p9hIBEpdhS9bhVphnfjJy95imZzCPhDgbN3V8Fbir3RtBNr t+Eib9NSvEE3XS0ky8UHsfydEIgTxkuUlRStgMXTStkzgR3Emoth1GZ4E keRTILQaMTEfiJWeAU2mdH5vL2mnYKxM9x+AC1bE14uuG1f4W+gnG0ox+ A==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="330725613" X-IronPort-AV: E=Sophos;i="5.91,197,1647327600"; d="scan'208";a="330725613" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 May 2022 04:23:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.91,197,1647327600"; d="scan'208";a="890474264" Received: from silpixa00400573.ir.intel.com (HELO silpixa00400573.ger.corp.intel.com) ([10.237.223.107]) by fmsmga005.fm.intel.com with ESMTP; 04 May 2022 04:23:44 -0700 From: Cristian Dumitrescu To: dev@dpdk.org Subject: [PATCH V4 2/2] examples/pipeline: support hash functions Date: Wed, 4 May 2022 12:23:43 +0100 Message-Id: <20220504112343.21723-2-cristian.dumitrescu@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220504112343.21723-1-cristian.dumitrescu@intel.com> References: <20220430134059.80255-1-cristian.dumitrescu@intel.com> <20220504112343.21723-1-cristian.dumitrescu@intel.com> 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 Add example for hash function operation. Signed-off-by: Cristian Dumitrescu --- Change log: V4: -Removed redundant line in the CLI file. -Added comment on the crc32 hash function in the .spec file. examples/pipeline/examples/hash_func.cli | 34 +++++++ examples/pipeline/examples/hash_func.spec | 107 ++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 examples/pipeline/examples/hash_func.cli create mode 100644 examples/pipeline/examples/hash_func.spec diff --git a/examples/pipeline/examples/hash_func.cli b/examples/pipeline/examples/hash_func.cli new file mode 100644 index 0000000000..d65cd62d17 --- /dev/null +++ b/examples/pipeline/examples/hash_func.cli @@ -0,0 +1,34 @@ +; SPDX-License-Identifier: BSD-3-Clause +; Copyright(c) 2022 Intel Corporation + +; +; Customize the LINK parameters to match your setup. +; +mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0 + +link LINK0 dev 0000:18:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on +link LINK1 dev 0000:18:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on +link LINK2 dev 0000:3b:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on +link LINK3 dev 0000:3b:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on + +; +; PIPELINE0 setup. +; +pipeline PIPELINE0 create 0 + +pipeline PIPELINE0 port in 0 link LINK0 rxq 0 bsz 32 +pipeline PIPELINE0 port in 1 link LINK1 rxq 0 bsz 32 +pipeline PIPELINE0 port in 2 link LINK2 rxq 0 bsz 32 +pipeline PIPELINE0 port in 3 link LINK3 rxq 0 bsz 32 + +pipeline PIPELINE0 port out 0 link LINK0 txq 0 bsz 32 +pipeline PIPELINE0 port out 1 link LINK1 txq 0 bsz 32 +pipeline PIPELINE0 port out 2 link LINK2 txq 0 bsz 32 +pipeline PIPELINE0 port out 3 link LINK3 txq 0 bsz 32 + +pipeline PIPELINE0 build ./examples/pipeline/examples/hash_func.spec + +; +; Pipelines-to-threads mapping. +; +thread 1 pipeline PIPELINE0 enable diff --git a/examples/pipeline/examples/hash_func.spec b/examples/pipeline/examples/hash_func.spec new file mode 100644 index 0000000000..a3275a17da --- /dev/null +++ b/examples/pipeline/examples/hash_func.spec @@ -0,0 +1,107 @@ +; SPDX-License-Identifier: BSD-3-Clause +; Copyright(c) 2022 Intel Corporation + +; This simple example illustrates how to compute a hash signature over an n-tuple set of fields read +; from the packet headers and/or the packet meta-data by using the "hash" instruction. In this +; specific example, the n-tuple is the classical DiffServ 5-tuple. + +// +// Headers +// +struct ethernet_h { + bit<48> dst_addr + bit<48> src_addr + bit<16> ethertype +} + +struct ipv4_h { + bit<8> ver_ihl + bit<8> diffserv + bit<16> total_len + bit<16> identification + bit<16> flags_offset + bit<8> ttl + bit<8> protocol + bit<16> hdr_checksum + bit<32> src_addr + bit<32> dst_addr +} + +struct udp_h { + bit<16> src_port + bit<16> dst_port + bit<16> length + bit<16> checksum +} + +header ethernet instanceof ethernet_h +header ipv4 instanceof ipv4_h +header udp instanceof udp_h + +// +// Meta-data. +// +struct metadata_t { + bit<32> port + bit<32> src_addr + bit<32> dst_addr + bit<8> protocol + bit<16> src_port + bit<16> dst_port + bit<32> hash +} + +metadata instanceof metadata_t + +// +// Pipeline. +// +apply { + // + // RX and parse. + // + rx m.port + extract h.ethernet + extract h.ipv4 + extract h.udp + + // + // Prepare the n-tuple to be hashed in meta-data. + // + // This is required when: + // a) The n-tuple fields are part of different headers; + // b) Some n-tuple fields come from headers and some from meta-data. + // + mov m.src_addr h.ipv4.src_addr + mov m.dst_addr h.ipv4.dst_addr + mov m.protocol h.ipv4.protocol + mov m.src_port h.udp.src_port + mov m.dst_port h.udp.dst_port + + // + // Compute the hash over the n-tuple. + // + // Details: + // a) Hash function: jhash. Another available option is crc32. + // b) Destination (i.e. hash result): m.hash; + // c) Source (i.e. n-tuple to be hashed): The 5-tuple formed by the meta-data fields + // (m.src_addr, m.dst_addr, m.protocol, m.src_port, m.dst_port). Only the first and + // the last n-tuple fields are specified in the hash instruction, but all the fields + // in between are part of the n-tuple to be hashed. + // + hash jhash m.hash m.src_addr m.dst_port + + // + // Use the computed hash to create a uniform distribution of pkts across the 4 output ports. + // + and m.hash 3 + mov m.port m.hash + + // + // De-parse and TX. + // + emit h.ethernet + emit h.ipv4 + emit h.udp + tx m.port +}