From patchwork Wed Apr 3 16:32:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 139084 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 7A79843DEE; Wed, 3 Apr 2024 18:34:51 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D609F402E4; Wed, 3 Apr 2024 18:34:46 +0200 (CEST) Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) by mails.dpdk.org (Postfix) with ESMTP id A1B9C40144 for ; Wed, 3 Apr 2024 18:34:44 +0200 (CEST) Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-6ecbe6dc8c6so2415970b3a.1 for ; Wed, 03 Apr 2024 09:34:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1712162084; x=1712766884; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Gc9056QOjuVYfhf4bhMSmsFklkfUlX/P5ar793xxAkA=; b=nycGzxfs+9dhHl6U0V75zn46rFZADHCYdEfhRNgHsLeNEIs22D96lJRKYaHqIHFYNG r/ep8+gmwynLYqRmY/1b6DGwsLflSsjNIhbpMVbii9L7yMFuDGy5wvth73Y1LRj3sFqp BFsRP40y8BHuR/D02oirPF2e/6Wtu3ZJSM330ob6SRFHqpnWe6USakyg53dYEXu1C/hE zoitUOKfpW8N45MfgfYNRdncD0cxTrexVMT2SZ0dfP/tBbIG+HKuJLKNRIfas5oKX3T1 GzXneSKWEgCSviX3ewkeENvH1LQ4oKqCl6YFHj2o4dSNRvwL281ruQshHHl2zB2Kf3Ac b2Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712162084; x=1712766884; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Gc9056QOjuVYfhf4bhMSmsFklkfUlX/P5ar793xxAkA=; b=CokqNG1FEv9GmTq5+h78P+zNjM7EFT5Vp0ackbcXzuliM/nNOpm2tAWGl3IWKSjGJc XIMtEF1x5j/5NQ6F+udIWGGZ02Uu1bDnLJYCOgIrEFfUPDy6yYO74ATy+7Bl45UxId/6 3+hdcEd+XNIY3p1PDSDdJ4MPrDKvyZwbdB+8JpMXZ8bR7LGNsJ/4sZcloF62rGERzSlW /oAXrLNm25cze4eZIWi7oeM6h/fOv6fLQdFdxYVWcad6dY6w7BSfQfL5RN6hxPaAvsOx PQQgzekCLJwOVcbHryff5iPyIsB5JKtIUMbRbEuAPFufbho67NIE3cqJSl9SRR25HtSJ QPNw== X-Gm-Message-State: AOJu0YykMtTs25RDL/5N1s5jhK8Kf/XxPL8aXcZBfb8NC/svssL8K8xB aEqCqyq1sNbQoi5A7LQj0CW7QTDvVZZNgVlRfW2a3TUOBOPd6d0vy4d/gYTz8oXdgeGsiqQaxq+ DyBVVOw== X-Google-Smtp-Source: AGHT+IEIb9/xukvgHeJvwIvKz8OCy/6hhntEbwYTE06dH5UeugVAQ6+98SvTsv6e7RvWw8NlHtq6yQ== X-Received: by 2002:a05:6a21:398b:b0:1a7:34c:185d with SMTP id ad11-20020a056a21398b00b001a7034c185dmr170902pzc.59.1712162083837; Wed, 03 Apr 2024 09:34:43 -0700 (PDT) Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id a6-20020aa78e86000000b006e5a09708f8sm12332364pfr.174.2024.04.03.09.34.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 09:34:43 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Subject: [PATCH 1/2] eal: add functions to generate uuid values Date: Wed, 3 Apr 2024 09:32:29 -0700 Message-ID: <20240403163432.437275-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240403163432.437275-1-stephen@networkplumber.org> References: <20240403163432.437275-1-stephen@networkplumber.org> MIME-Version: 1.0 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 Useful to be able to generate uuid values for tests or for interaction with other subsystems as magic cookie. Naming and overall algorithm come from libuuid which is used by permission of original author. Signed-off-by: Stephen Hemminger --- lib/eal/common/eal_common_uuid.c | 56 ++++++++++++++++++++++++++++++++ lib/eal/include/rte_uuid.h | 22 ++++++++++++- lib/eal/version.map | 2 ++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/lib/eal/common/eal_common_uuid.c b/lib/eal/common/eal_common_uuid.c index 0a80bfbb38..fc8f58e8a4 100644 --- a/lib/eal/common/eal_common_uuid.c +++ b/lib/eal/common/eal_common_uuid.c @@ -7,7 +7,12 @@ #include #include #include +#include +#include +#include +#include +#include #include /* UUID packed form */ @@ -165,3 +170,54 @@ void rte_uuid_unparse(const rte_uuid_t uu, char *out, size_t len) uuid.node[0], uuid.node[1], uuid.node[2], uuid.node[3], uuid.node[4], uuid.node[5]); } + +void rte_uuid_generate_random(rte_uuid_t out) +{ + union { + uint64_t words[2]; + rte_uuid_t uuid; + } buf; + struct uuid uu; + + /* UUID is 128 bit */ + buf.words[0] = rte_rand(); + buf.words[1] = rte_rand(); + + /* Mark these random bytes a version 4 random uuid */ + uuid_unpack(buf.uuid, &uu); + uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x4000; + uuid_pack(&uu, out); +} + +void rte_uuid_generate_time(rte_uuid_t out) +{ + struct uuid uu; + struct timespec ts; + uint64_t ns, rnd; + static uint16_t sequence; + + /* The time value for UUID is 100ns since 15 October 1582 */ + clock_gettime(CLOCK_REALTIME, &ts); + + ns = ts.tv_nsec / 100; + ns += (uint64_t) ts.tv_sec * (NSEC_PER_SEC / 100); + ns += (((uint64_t) 0x01B21DD2) << 32) + 0x13814000; + + uu.time_low = (uint32_t) ns; + uu.time_mid = (uint16_t) (ns >> 32); + uu.time_hi_and_version = (uint16_t) (ns >> 48); + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x4000; + uu.clock_seq = rte_atomic_fetch_add_explicit(&sequence, 1, + rte_memory_order_relaxed); + + rnd = rte_rand(); + memcpy(uu.node, &rnd, 6); + /* + * What libuuid does set multicast bit. + * This avoids conflicts with network cards. + */ + uu.node[0] |= 0x1; + + uuid_pack(&uu, out); +} diff --git a/lib/eal/include/rte_uuid.h b/lib/eal/include/rte_uuid.h index cfefd4308a..052b78a812 100644 --- a/lib/eal/include/rte_uuid.h +++ b/lib/eal/include/rte_uuid.h @@ -18,6 +18,8 @@ extern "C" { #include #include +#include + /** * Struct describing a Universal Unique Identifier */ @@ -94,12 +96,30 @@ int rte_uuid_parse(const char *in, rte_uuid_t uu); * @param uu * UUID to format * @param out - * Resulting string buffer + * Resulting string bufferm * @param len * Sizeof the available string buffer */ void rte_uuid_unparse(const rte_uuid_t uu, char *out, size_t len); +/** + * Generate a random uuid + * + * @param uu + * Resulting UUID + */ +__rte_experimental +void rte_uuid_generate_random(rte_uuid_t uu); + +/** + * Generate a uuid based on time stamp. + * + * @param uu + * Resulting UUID + */ +__rte_experimental +void rte_uuid_generate_time(rte_uuid_t uu); + #ifdef __cplusplus } #endif diff --git a/lib/eal/version.map b/lib/eal/version.map index 3df50c3fbb..5a8aa67244 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -396,6 +396,8 @@ EXPERIMENTAL { # added in 24.03 rte_vfio_get_device_info; # WINDOWS_NO_EXPORT + rte_uuid_generate_random; + rte_uuid_generate_time; }; INTERNAL { From patchwork Wed Apr 3 16:32:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 139085 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 D4E2D43DEE; Wed, 3 Apr 2024 18:35:00 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5E09D40649; Wed, 3 Apr 2024 18:34:48 +0200 (CEST) Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) by mails.dpdk.org (Postfix) with ESMTP id 9310040144 for ; Wed, 3 Apr 2024 18:34:45 +0200 (CEST) Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-6e6c0098328so5713150b3a.3 for ; Wed, 03 Apr 2024 09:34:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1712162085; x=1712766885; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=eJAHcCDGmuX5J0zZctPA7CLCKHMcY8RayBA+53/LPok=; b=Se/T/uOvxn8d8Vc/8Svim6ljsNHx/7uP6KYiEvbCU1EAFbTyMz+xrmiz9FY/+2suIx Tp9BGfxeGnekQj3mEBhQaHrVlPizY3wEF+MvIM6a+cngwj844Uex8R71TRwFmcIQxOCH tzthl8twGHkuAU9UGD4qCtaP3EJaESlFbnQnePUKHjitJX1ebyA6jFaA/t+3MMBEVRbz BGAPHQWnUqV7UwPtLfKAYMoSCjm5aJRcZJT56ixp53BNz9HVcqC8zuSPtlOH6cmIItMm w3+y3UkQM2LBURywckYtXYAV4+O451HFhHIhC2INHdeCc53xtMO1eq+VPEt2biGnulVH oGug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712162085; x=1712766885; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eJAHcCDGmuX5J0zZctPA7CLCKHMcY8RayBA+53/LPok=; b=uyRpYtOnN8JjT9TJoCY28dLNFJTOuSWtS9v6vxEjV5Ne6zYlfTjXnZ9DdmVLcmOCHv rA4gdnOPNgx5cAlYyUfQ+5ffV4GBhcaF2o3D4dc8OClpJEytCx2IGlXtv4Pm8bhG4CC1 XVgIHL2DVnSvNgqbOZyzU0p5uHrvQ6J++pcJn4WG5oY39DhytowYBoUdi3QkkPOWp2Ux xrqIWlbJQ2vN0Jj6BwGrcUess9o3xBm0VwnSxIGnEsinRMsqvdSU9x5O8loQuW0KA6V7 18w3lPwcB7lzRO1eOENgJa5ZgAO/x9qoNZwrTGFFiNdH2rRPu7MGgKjR/spdougKpVXY VtrQ== X-Gm-Message-State: AOJu0YypZCBR9dkbNBM+UU9Hf7V4xNsvE4IHgIPmAXkOUMFx6lQ4Xbu+ dYlYvVPvyZBuUEfrj7/VVnOvW3FaUvPEPYHrsaEr7MZ+ufmApBCXnxGZGVA2MkPewM2/I+0B+3m NPYO1uQ== X-Google-Smtp-Source: AGHT+IHS/JMnBUoU2nmcbdUvvylE4kn7UIFTJkaonzB6xTehydpx/uerwTNO9mPydUhzP605qReJzg== X-Received: by 2002:a05:6a20:d429:b0:1a3:3c5f:2ebd with SMTP id il41-20020a056a20d42900b001a33c5f2ebdmr115723pzb.59.1712162084773; Wed, 03 Apr 2024 09:34:44 -0700 (PDT) Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id a6-20020aa78e86000000b006e5a09708f8sm12332364pfr.174.2024.04.03.09.34.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 09:34:44 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Subject: [PATCH 2/2] test: add functional test for uuid Date: Wed, 3 Apr 2024 09:32:30 -0700 Message-ID: <20240403163432.437275-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240403163432.437275-1-stephen@networkplumber.org> References: <20240403163432.437275-1-stephen@networkplumber.org> MIME-Version: 1.0 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 The uuid functions in EAL were not covered by any current functional tests. Signed-off-by: Stephen Hemminger --- app/test/meson.build | 1 + app/test/test_uuid.c | 135 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 app/test/test_uuid.c diff --git a/app/test/meson.build b/app/test/meson.build index 7d909039ae..11fb7dbffa 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -198,6 +198,7 @@ source_file_deps = { 'test_trace.c': [], 'test_trace_perf.c': [], 'test_trace_register.c': [], + 'test_uuid.c' : [], 'test_vdev.c': ['kvargs', 'bus_vdev'], 'test_version.c': [], } diff --git a/app/test/test_uuid.c b/app/test/test_uuid.c new file mode 100644 index 0000000000..669ed82243 --- /dev/null +++ b/app/test/test_uuid.c @@ -0,0 +1,135 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Stephen Hemminger + */ + +#include + +#include "test.h" + +#define NROUNDS 100 + +static int +check_duplicate_uuid(rte_uuid_t uids[]) +{ + int i, j; + char out[256]; + + for (i = 0; i < NROUNDS - 1; i++) { + for (j = i + 1; j < NROUNDS; j++) { + if (rte_uuid_compare(uids[i], uids[j]) == 0) { + rte_uuid_unparse(uids[i], out, sizeof(out)); + printf("Generated duplicate random uuids %d == %d : %s\n", + i, j, out); + return TEST_FAILED; + } + } + } + return TEST_SUCCESS; +} + + +static const struct uuid_case { + const char *in; + rte_uuid_t result; +} good_cases[] = { + { "02ce8e94-5b84-47fc-8f86-72633c5b5061", RTE_UUID_INIT(0x02ce8e94, 0x5b84, 0x47fc, 0x8f86, 0x72633c5b5061) }, + { "2c72af87-d220-4931-98ec-45c8520c94e1", RTE_UUID_INIT(0x2c72af87, 0xd220, 0x4931, 0x98ec, 0x45c8520c94e1) }, + { "441edca1-0942-4ccd-9b33-233e0454fe5b", RTE_UUID_INIT(0x441edca1, 0x0942, 0x4ccd, 0x9b33, 0x233e0454fe5b) }, +}; + +static const char * const bad_cases[] = { + "", /* empty */ + "41edca1-0942-4ccd-9b33-233e0454fe5b", /* too short */ + "d5cecbac-531b-4527-b0629-2bc3011dc9c", /* hyphen in wrong place */ + "db318745-1347-4f5e-m142-d86dc41172b2", /* bad hex */ +}; + +static int +test_uuid(void) +{ + rte_uuid_t uids[NROUNDS] = { }; + rte_uuid_t clone[NROUNDS] = { }; + unsigned int i; + int ret; + + /* Test generate random uuid */ + for (i = 0; i < NROUNDS; i++) { + if (!rte_uuid_is_null(uids[i])) { + printf("Zero'd uuid %d is not null\n", i); + return TEST_FAILED; + } + + rte_uuid_generate_random(uids[i]); + + if (rte_uuid_is_null(uids[i])) { + printf("Generated random uuid %d is null\n", i); + return TEST_FAILED; + } + } + + ret = check_duplicate_uuid(uids); + if (ret != TEST_SUCCESS) + return ret; + + /* Test generate time */ + for (i = 0; i < NROUNDS; i++) { + rte_uuid_generate_time(uids[i]); + + if (rte_uuid_is_null(uids[i])) { + printf("Generated random uuid %d is null\n", i); + return TEST_FAILED; + } + } + + + /* Test that copy works */ + for (i = 0; i < NROUNDS; i++) { + if (!rte_uuid_is_null(clone[i])) { + printf("Zero'd clone %d is not null\n", i); + return TEST_FAILED; + } + + rte_uuid_copy(clone[i], uids[i]); + + if (rte_uuid_compare(uids[i], clone[i]) != 0) { + printf("Copied uuid does not match\n"); + return TEST_FAILED; + } + } + + for (i = 0; i < RTE_DIM(good_cases); i++) { + const struct uuid_case *c = &good_cases[i]; + char out[37]; + rte_uuid_t uu; + + if (rte_uuid_parse(c->in, uu) != 0) { + printf("Failed to parse '%s'\n", c->in); + return TEST_FAILED; + } + if (rte_uuid_compare(uu, c->result) != 0) { + printf("Parse mismatch for '%s'\n", c->in); + return TEST_FAILED; + } + + rte_uuid_unparse(uu, out, sizeof(out)); + if (strcmp(out, c->in) != 0) { + printf("Parse/unparse mismatch (%s != %s)\n", + out, c->in); + return TEST_FAILED; + } + } + + for (i = 0; i < RTE_DIM(bad_cases); i++) { + const char *s = bad_cases[i]; + rte_uuid_t uu; + + if (rte_uuid_parse(s, uu) == 0) { + printf("Accepted parse of '%s'\n", s); + return TEST_FAILED; + } + } + return TEST_SUCCESS; +} + + +REGISTER_FAST_TEST(uuid_autotest, true, true, test_uuid);