get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 137458,
    "url": "http://patches.dpdk.org/api/patches/137458/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240229003201.186997-2-stephen@networkplumber.org/",
    "project": {
        "id": 1,
        "url": "http://patches.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": "<20240229003201.186997-2-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240229003201.186997-2-stephen@networkplumber.org",
    "date": "2024-02-29T00:32:02",
    "name": "[v3] lib/hash: add siphash",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "605ede85ce41d96b9b98a91b522770f21e33312e",
    "submitter": {
        "id": 27,
        "url": "http://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240229003201.186997-2-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 31283,
            "url": "http://patches.dpdk.org/api/series/31283/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31283",
            "date": "2024-02-29T00:32:02",
            "name": "[v3] lib/hash: add siphash",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/31283/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/137458/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/137458/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 2847B43C20;\n\tThu, 29 Feb 2024 01:33:22 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A0BC6402B4;\n\tThu, 29 Feb 2024 01:33:21 +0100 (CET)",
            "from mail-pf1-f182.google.com (mail-pf1-f182.google.com\n [209.85.210.182])\n by mails.dpdk.org (Postfix) with ESMTP id 8E7EA402AF\n for <dev@dpdk.org>; Thu, 29 Feb 2024 01:33:20 +0100 (CET)",
            "by mail-pf1-f182.google.com with SMTP id\n d2e1a72fcca58-6da4a923b1bso258854b3a.2\n for <dev@dpdk.org>; Wed, 28 Feb 2024 16:33:20 -0800 (PST)",
            "from hermes.local (204-195-123-141.wavecable.com. [204.195.123.141])\n by smtp.gmail.com with ESMTPSA id\n s13-20020a170902ea0d00b001dcc0c84721sm61902plg.99.2024.02.28.16.33.18\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 28 Feb 2024 16:33:19 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1709166799;\n x=1709771599; darn=dpdk.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=jb4taKT9Bu6mP1Vwvx0msDDKpinRZuv2mV3iUPOQhFc=;\n b=YEgOYdPOv5DtEUPo+yOtV6vk/bEb0HPiXEKooeIJXVv75awVYO8iZBhyH83hOindW/\n siLSsPjucYAyo88gOvNzfNjLqIlIpckpTAyEHwI7dNF43RYLlo7PkV0nZaDdXS4wXfjT\n KcVvuNAxDaMOn6KU9EcFC/+nKBeTRAHha2te+vcBBdlhlzDckvd+P9G3OmwDENSvVhDz\n k/pA+uu7+iCAE8XB3ClqPguegv4LFGMqTmLAw+iI9MO39qIaFhw5bncOyhdrSMjcjQNr\n BNs/wX6LFCW0LAscrH8c+QmsGacVeXphGwgxzNkhyfszF5Yvb9y63ZiWFy9xBfe40+Sv\n ymkA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1709166799; x=1709771599;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=jb4taKT9Bu6mP1Vwvx0msDDKpinRZuv2mV3iUPOQhFc=;\n b=W7wbGZ2wE5WrN1txmPgHcjQkz6yYzgwUZnBc9TI0G84XoT4SeLXKp0fwanESkc8wxx\n K0wsjeP3NOGvFAmSa2TzpHsXRWLocbme0SpUvAtfsM35jfc0P6sQf7Q7tgRNk51dmJ9d\n R2dW4ASMG2nh2/iqkM1XNg4oVybJ7IpuzeEcXtOV5cNog590bGdYkVNwzQn6OGRY4k7v\n WXYcTTjKUfthLbCED6qqjQ8VSBMNWL47VmwBk40hRrvD1LUynVP/yS8QQl/sX06t5hBT\n 8P2vQZPnMXc0XPxbrrGZxs2olWW0UibSrDyOlfIDw6zCfByZbd8F+A4FR2PXsBK7xjEj\n QR6Q==",
        "X-Gm-Message-State": "AOJu0YzoLLqUAF+AaN2JUdCJU1xjKhaRl2WiLFItqCBEzbKN05eDWLjX\n Wi7Zycv7KiOWMctX6DY4kj0uM0pu6vCJVjrTveTbHzst01Yx3evG6KM6tQhlI3qqVGwYMdinVS8\n K",
        "X-Google-Smtp-Source": "\n AGHT+IFX0kHMlJg9hAo5sQ5UQylJXwVS719GIs+P+QfBTIYqykI4e9RKZTRk06RrOfaRbQ4Llk6WOg==",
        "X-Received": "by 2002:a05:6a20:a892:b0:1a1:3b8:827b with SMTP id\n ca18-20020a056a20a89200b001a103b8827bmr779098pzb.52.1709166799456;\n Wed, 28 Feb 2024 16:33:19 -0800 (PST)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>,\n Yipeng Wang <yipeng1.wang@intel.com>,\n Sameh Gobriel <sameh.gobriel@intel.com>,\n Bruce Richardson <bruce.richardson@intel.com>,\n Vladimir Medvedkin <vladimir.medvedkin@intel.com>",
        "Subject": "[PATCH v3] lib/hash: add siphash",
        "Date": "Wed, 28 Feb 2024 16:32:02 -0800",
        "Message-ID": "<20240229003201.186997-2-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20240227174012.343004-1-stephen@networkplumber.org>",
        "References": "<20240227174012.343004-1-stephen@networkplumber.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "Add SipHash which is a fast and cryptographicly sound hash\ncreated by Jean-Philippe Aumasson and Daniel J. Bernstein.\nSiphash is widely used by Linux, FreeBSD, OpenBSD and other\nprojects because it is fast and resistant to DoS attacks.\nThis version is designed to be useful as alternative hash\nwith cuckoo hash in DPDK.\n\nImplementation is based of the public domain and Creative\nCommon license reference version as well as some optimizations\nfrom the GPL-2 or BSD-3 licensed version in Linux.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\nv3 - unroll the rounds to get 3% speedup\n     use memcpy to avoid having x86 only code\n\n app/test/test_hash_functions.c |  71 ++++++++++++-\n lib/hash/meson.build           |   2 +\n lib/hash/rte_siphash.c         | 176 +++++++++++++++++++++++++++++++++\n lib/hash/rte_siphash.h         |  86 ++++++++++++++++\n lib/hash/version.map           |   7 ++\n 5 files changed, 338 insertions(+), 4 deletions(-)\n create mode 100644 lib/hash/rte_siphash.c\n create mode 100644 lib/hash/rte_siphash.h",
    "diff": "diff --git a/app/test/test_hash_functions.c b/app/test/test_hash_functions.c\nindex 70820d1f1976..3bffbe4ed4ba 100644\n--- a/app/test/test_hash_functions.c\n+++ b/app/test/test_hash_functions.c\n@@ -15,6 +15,7 @@\n #include <rte_hash.h>\n #include <rte_jhash.h>\n #include <rte_hash_crc.h>\n+#include <rte_siphash.h>\n \n #include \"test.h\"\n \n@@ -52,6 +53,42 @@ static uint32_t hash_values_crc[2][12] = {{\n }\n };\n \n+static uint32_t hash_values_hsiphash[2][12] = {\n+\t{\n+\t\t0x8e01e473, 0xc41e3669,\n+\t\t0x813e4dbd, 0x7ebe2eea,\n+\t\t0x33a5c5b7, 0xc910629b,\n+\t\t0xba50237f, 0xbbc870c6,\n+\t\t0x95124362, 0x850f8e0d,\n+\t\t0x192ff266, 0xb41d8206,\n+\t}, {\n+\t\t0x66200aa0, 0x769e7201,\n+\t\t0x0e934d03, 0x96d7c892,\n+\t\t0xb4643534, 0xcb758913,\n+\t\t0x498b66e9, 0x116b4082,\n+\t\t0x603030dc, 0x644b608b,\n+\t\t0x74b29c27, 0x513f3a9c,\n+\t}\n+};\n+\n+static uint64_t hash_values_siphash[2][12] = {\n+\t{\n+\t\t0x8b5a0baa49fbc58d, 0x62c3506f27376c25,\n+\t\t0xef7bdf3ee24abec8, 0xc72b1c24fc2f7938,\n+\t\t0xc902632ed88f897f, 0xab631e00063006f5,\n+\t\t0x7b821577565ea3a4, 0x8b19265d1c12cdc7,\n+\t\t0x610e7ab6ada60b22, 0x3c6f1970dd62f235,\n+\t\t0x4b8db19fd6940031, 0xa43827a530b08989,\n+\t}, {\n+\t\t0x86e1bbae2893aaf1, 0x9c05614a696cda03,\n+\t\t0x9ee31847083019c3, 0x600e860c97264e31,\n+\t\t0xda8721038e4972bc, 0xfeedeb1b8bfe5d1e,\n+\t\t0xb2d6388922af426f, 0x7d05b8e82e38cf30,\n+\t\t0x439caa6ecd0b628d, 0x6d4c4ba6f3f2aed5,\n+\t\t0x5622bb0da20658ff, 0x409d76de4adcd475,\n+\t}\n+};\n+\n /*******************************************************************************\n  * Hash function performance test configuration section. Each performance test\n  * will be performed HASHTEST_ITERATIONS times.\n@@ -61,9 +98,11 @@ static uint32_t hash_values_crc[2][12] = {{\n  */\n #define HASHTEST_ITERATIONS 1000000\n #define MAX_KEYSIZE 64\n-static rte_hash_function hashtest_funcs[] = {rte_jhash, rte_hash_crc};\n-static uint32_t hashtest_initvals[] = {0, 0xdeadbeef};\n-static uint32_t hashtest_key_lens[] = {\n+static const rte_hash_function hashtest_funcs[] = {rte_jhash, rte_hash_crc, rte_hsiphash};\n+static const uint32_t hashtest_initvals[] = {0, 0xdeadbeef};\n+static const uint64_t hashtest_initkeys[] = {0, UINT64_C(0xfeedc0dedeadbeef)};\n+\n+static const uint32_t hashtest_key_lens[] = {\n \t1, 2,                 /* Unusual key sizes */\n \t4, 8, 16, 32, 48, 64, /* standard key sizes */\n \t9,                    /* IPv4 SRC + DST + protocol, unpadded */\n@@ -85,6 +124,9 @@ get_hash_name(rte_hash_function f)\n \tif (f == rte_hash_crc)\n \t\treturn \"rte_hash_crc\";\n \n+\tif (f == rte_hsiphash)\n+\t\treturn \"hsiphash\";\n+\n \treturn \"UnknownHash\";\n }\n \n@@ -126,6 +168,7 @@ run_hash_func_perf_tests(void)\n \tprintf(\" Number of iterations for each test = %d\\n\",\n \t\t\tHASHTEST_ITERATIONS);\n \tprintf(\"Hash Func.  , Key Length (bytes), Initial value, Ticks/Op.\\n\");\n+\tfflush(stdout);\n \n \tfor (i = 0; i < RTE_DIM(hashtest_initvals); i++) {\n \t\tfor (j = 0; j < RTE_DIM(hashtest_key_lens); j++) {\n@@ -147,13 +190,15 @@ verify_precalculated_hash_func_tests(void)\n {\n \tunsigned i, j;\n \tuint8_t key[64];\n-\tuint32_t hash;\n \n \tfor (i = 0; i < 64; i++)\n \t\tkey[i] = (uint8_t) i;\n \n \tfor (i = 0; i < RTE_DIM(hashtest_key_lens); i++) {\n \t\tfor (j = 0; j < RTE_DIM(hashtest_initvals); j++) {\n+\t\t\tuint32_t hash;\n+\t\t\tuint64_t shash;\n+\n \t\t\thash = rte_jhash(key, hashtest_key_lens[i],\n \t\t\t\t\t hashtest_initvals[j]);\n \t\t\tif (hash != hash_values_jhash[j][i]) {\n@@ -173,6 +218,24 @@ verify_precalculated_hash_func_tests(void)\n \t\t\t\t       hash_values_crc[j][i], hash);\n \t\t\t\treturn -1;\n \t\t\t}\n+\n+\t\t\thash = rte_hsiphash(key, hashtest_key_lens[i], hashtest_initvals[j]);\n+\t\t\tif (hash != hash_values_hsiphash[j][i]) {\n+\t\t\t\tprintf(\"Hsiphash for %u bytes with initial value 0x%x.\"\n+\t\t\t\t       \"Expected 0x%x, but got 0x%x\\n\",\n+\t\t\t\t       hashtest_key_lens[i], hashtest_initvals[j],\n+\t\t\t\t       hash_values_hsiphash[j][i], hash);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\n+\t\t\tshash = rte_siphash(key, hashtest_key_lens[i], hashtest_initkeys[j]);\n+\t\t\tif (shash != hash_values_siphash[j][i]) {\n+\t\t\t\tprintf(\"siphash for %u bytes with initial %#\"PRIx64\".\"\n+\t\t\t\t       \"Expected %#\"PRIx64\", but got %#\"PRIx64\"\\n\",\n+\t\t\t\t       hashtest_key_lens[i], hashtest_initkeys[j],\n+\t\t\t\t       hash_values_siphash[j][i], shash);\n+\t\t\t\treturn -1;\n+\t\t\t}\n \t\t}\n \t}\n \ndiff --git a/lib/hash/meson.build b/lib/hash/meson.build\nindex 277eb9fa9366..913855124d2b 100644\n--- a/lib/hash/meson.build\n+++ b/lib/hash/meson.build\n@@ -6,6 +6,7 @@ headers = files(\n         'rte_hash_crc.h',\n         'rte_hash.h',\n         'rte_jhash.h',\n+        'rte_siphash.h',\n         'rte_thash.h',\n         'rte_thash_gfni.h',\n )\n@@ -21,6 +22,7 @@ sources = files(\n         'rte_cuckoo_hash.c',\n         'rte_hash_crc.c',\n         'rte_fbk_hash.c',\n+        'rte_siphash.c',\n         'rte_thash.c',\n         'rte_thash_gfni.c',\n )\ndiff --git a/lib/hash/rte_siphash.c b/lib/hash/rte_siphash.c\nnew file mode 100644\nindex 000000000000..85f0c54c280e\n--- /dev/null\n+++ b/lib/hash/rte_siphash.c\n@@ -0,0 +1,176 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ *\n+ * Based on code reference code licensed as CC0 and MIT.\n+ * Copyright (c) 2012-2022 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>\n+ * Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to>\n+ */\n+\n+#include <stdint.h>\n+#include <string.h>\n+\n+#include <rte_byteorder.h>\n+#include <rte_common.h>\n+\n+#include \"rte_siphash.h\"\n+\n+static __rte_always_inline uint64_t\n+rol64(uint64_t x,  unsigned int b)\n+{\n+\treturn (x << b) | (x >> (64 - b));\n+}\n+\n+static __rte_always_inline uint64_t u8to64_le(const uint8_t *p)\n+{\n+\tuint64_t w;\n+\n+\tmemcpy(&w, p, sizeof(w));\n+\treturn rte_cpu_to_le_64(w);\n+}\n+\n+static __rte_always_inline uint32_t u8to32_le(const uint8_t *p)\n+{\n+\tuint32_t w;\n+\n+\tmemcpy(&w, p, sizeof(w));\n+\treturn rte_cpu_to_le_32(w);\n+}\n+\n+static __rte_always_inline uint16_t u8to16_le(const uint8_t *p)\n+{\n+\tuint16_t w;\n+\n+\tmemcpy(&w, p, sizeof(w));\n+\treturn rte_cpu_to_le_16(w);\n+}\n+\n+\n+/*\n+ * Use a 64bit version of SipHash for both full and\n+ * half versions, The difference is the number of rounds.\n+ */\n+#define PREAMBLE(len)\t\t\t\t\t\\\n+\tuint64_t v0 = UINT64_C(0x736f6d6570736575);\t\\\n+\tuint64_t v1 = UINT64_C(0x646f72616e646f6d);\t\\\n+\tuint64_t v2 = UINT64_C(0x6c7967656e657261);\t\\\n+\tuint64_t v3 = UINT64_C(0x7465646279746573);\t\\\n+\tuint64_t b = (uint64_t)len << 56;\t\t\\\n+\tv2 ^= init_val;\t\t\t\t\t\\\n+\tv0 ^= init_val\n+\n+#define SIPROUND do {\t\t\t\t\\\n+\tv0 += v1;\t\t\t\\\n+\tv1 = rol64(v1, 13);\t\t\\\n+\tv1 ^= v0;\t\t\t\\\n+\tv0 = rol64(v0, 32);\t\t\\\n+\tv2 += v3;\t\t\t\\\n+\tv3 = rol64(v3, 16);\t\t\\\n+\tv3 ^= v2;\t\t\t\\\n+\tv0 += v3;\t\t\t\\\n+\tv3 = rol64(v3, 21);\t\t\\\n+\tv3 ^= v0;\t\t\t\\\n+\tv2 += v1;\t\t\t\\\n+\tv1 = rol64(v1, 17);\t\t\\\n+\tv1 ^= v2;\t\t\t\\\n+\tv2 = rol64(v2, 32);\t\t\\\n+} while (0)\n+\n+uint64_t\n+rte_siphash(const void *key, uint32_t len, uint64_t init_val)\n+{\n+\tconst uint8_t *data = key;\n+\tconst uint32_t left = len & 7;\n+\tconst uint8_t *end = data + (len - left);\n+\n+\tPREAMBLE(len);\n+\n+\tfor (; data != end; data += 8) {\n+\t\tuint64_t m = u8to64_le(data);\n+\t\tv3 ^= m;\n+\t\tSIPROUND;\n+\t\tSIPROUND;\n+\t\tv0 ^= m;\n+\t}\n+\n+\tswitch (left) {\n+\tcase 7:\n+\t\tb |= ((uint64_t)end[6]) << 48;\t/* fallthrough */\n+\tcase 6:\n+\t\tb |= ((uint64_t)end[5]) << 40;\t/* fallthrough */\n+\tcase 5:\n+\t\tb |= ((uint64_t)end[4]) << 32;\t/* fallthrough */\n+\tcase 4:\n+\t\tb |= u8to32_le(data);\n+\t\tbreak;\n+\tcase 3:\n+\t\tb |= ((uint64_t)end[2]) << 16;\t/* fallthrough */\n+\tcase 2:\n+\t\tb |= u8to16_le(data);\n+\t\tbreak;\n+\tcase 1:\n+\t\tb |= data[0];\n+\t}\n+\n+\tv3 ^= b;\n+\tSIPROUND;\n+\tSIPROUND;\n+\n+\tv0 ^= b;\n+\tv2 ^= 0xff;\n+\n+\tSIPROUND;\n+\tSIPROUND;\n+\tSIPROUND;\n+\tSIPROUND;\n+\n+\treturn (v0 ^ v1) ^ (v2 ^ v3);\n+}\n+\n+uint32_t\n+rte_hsiphash(const void *key, uint32_t len, uint32_t init_val)\n+{\n+\tconst uint8_t *data = key;\n+\tconst uint32_t left = len & 7;\n+\tconst uint8_t *end = data + (len - left);\n+\n+\tPREAMBLE(len);\n+\n+\tfor (; data != end; data += 8) {\n+\t\tuint64_t m = u8to64_le(data);\n+\t\tv3 ^= m;\n+\t\tSIPROUND;\n+\t\tv0 ^= m;\n+\t}\n+\n+\n+\n+\tswitch (left) {\n+\tcase 7:\n+\t\tb |= ((uint64_t)end[6]) << 48;\t/* fallthrough */\n+\tcase 6:\n+\t\tb |= ((uint64_t)end[5]) << 40;\t/* fallthrough */\n+\tcase 5:\n+\t\tb |= ((uint64_t)end[4]) << 32;\t/* fallthrough */\n+\tcase 4:\n+\t\tb |= u8to32_le(data);\n+\t\tbreak;\n+\tcase 3:\n+\t\tb |= ((uint64_t)end[2]) << 16;\t/* fallthrough */\n+\tcase 2:\n+\t\tb |= u8to16_le(data);\n+\t\tbreak;\n+\tcase 1:\n+\t\tb |= data[0];\n+\t}\n+\n+\tv3 ^= b;\n+\tSIPROUND;\n+\n+\tv0 ^= b;\n+\tv2 ^= 0xff;\n+\n+\tSIPROUND;\n+\tSIPROUND;\n+\tSIPROUND;\n+\n+\treturn (v0 ^ v1) ^ (v2 ^ v3);\n+}\ndiff --git a/lib/hash/rte_siphash.h b/lib/hash/rte_siphash.h\nnew file mode 100644\nindex 000000000000..d9fbbe2e9275\n--- /dev/null\n+++ b/lib/hash/rte_siphash.h\n@@ -0,0 +1,86 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ *\n+ * Based on code reference code licensed as CC0 and MIT.\n+ * Copyright (c) 2012-2022 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>\n+ * Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to>\n+ */\n+\n+#ifndef _RTE_SIPHASH_H\n+#define _RTE_SIPHASH_H\n+\n+/**\n+ * @file\n+ *\n+ * SipHash is a family of pseudorandom functions (PRFs) optimized for speed on short messages.\n+ *\n+ * SipHash was designed in 2012 by Jean-Philippe Aumasson and Daniel J. Bernstein as a defense\n+ * against hash-flooding DoS attacks.\n+ *\n+ * SipHash is simpler and faster on short messages than previous cryptographic algorithms,\n+ * such as MACs based on universal hashing.\n+ * Competitive in performance with insecure non-cryptographic algorithms.\n+ *\n+ * Cryptographically secure, with no sign of weakness despite multiple cryptanalysis projects\n+ * by leading cryptographers.\n+ *\n+ * Battle-tested, with successful integration in OSs (Linux kernel, OpenBSD, FreeBSD, FreeRTOS),\n+ * languages (Perl, Python, Ruby, etc.), libraries (OpenSSL libcrypto, Sodium, etc.)\n+ * and applications (Wireguard, Redis, etc.).\n+ *\n+ * As a secure pseudorandom function (a.k.a. keyed hash function), SipHash can also be used as\n+ * a secure message authentication code (MAC). But SipHash is not a hash in the sense of\n+ * general-purpose key-less hash function such as BLAKE3 or SHA-3.\n+ * SipHash should therefore always be used with a secret key in order to be secure.\n+ * siphash functions.\n+ *\n+ */\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+#include <stdint.h>\n+\n+#include <rte_compat.h>\n+\n+/**\n+ * Compute a SipHash-2-4.\n+ * This version is the original version described in the reference version.\n+ * It uses a 64 bit key; does 2 compression rounds, and 4 finalization rounds.\n+ *\n+ * @param data\n+ *   Data to perform hash on.\n+ * @param len\n+ *   How many bytes to use to calculate hash value.\n+ * @param init_val\n+ *   Value to initialize hash generator.\n+ * @return\n+ *   64bit calculated hash value.\n+ */\n+__rte_experimental\n+uint64_t\n+rte_siphash(const void *data, uint32_t len, uint64_t init_val);\n+\n+/**\n+ * Compute Siphash-1-3.\n+ * This is the faster version which is used by Linux and other OS's.\n+ * It uses a 32 bit key; does 1 compression round, and 3 finalization rounds.\n+ *\n+ * @param data\n+ *   Data to perform hash on.\n+ * @param len\n+ *   How many bytes to use to calculate hash value.\n+ * @param init_val\n+ *   Value to initialize hash generator.\n+ * @return\n+ *   32bit calculated hash value.\n+ */\n+__rte_experimental\n+uint32_t\n+rte_hsiphash(const void *data, uint32_t len, uint32_t init_val);\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif /* _RTE_SIPHASH_H */\ndiff --git a/lib/hash/version.map b/lib/hash/version.map\nindex 6b2afebf6b46..16221fc1d8c7 100644\n--- a/lib/hash/version.map\n+++ b/lib/hash/version.map\n@@ -48,3 +48,10 @@ DPDK_24 {\n \n \tlocal: *;\n };\n+\n+EXPERIMENTAL {\n+\tglobal:\n+\n+\trte_siphash;\n+\trte_hsiphash;\n+};\n",
    "prefixes": [
        "v3"
    ]
}