From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 9285D43DF1;
	Thu,  4 Apr 2024 00:13:37 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 32059402EA;
	Thu,  4 Apr 2024 00:13:34 +0200 (CEST)
Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com
 [209.85.216.52]) by mails.dpdk.org (Postfix) with ESMTP id A86404027B
 for <dev@dpdk.org>; Thu,  4 Apr 2024 00:13:31 +0200 (CEST)
Received: by mail-pj1-f52.google.com with SMTP id
 98e67ed59e1d1-2a2d159e4ffso39854a91.1
 for <dev@dpdk.org>; Wed, 03 Apr 2024 15:13:31 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1712182411;
 x=1712787211; 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=bCHBX8o+9oSWOvE2B9WIz4cJ5kfg1vJXt4hYdMp/ButYBFwIVfSVIX4urGyV04vxdY
 UHirR3pqv3NqBy3HOQUpmPS4qni9Uklgit8m7a6I6cME6hiZPoWzcK+shWCip0hz+hmS
 XZh2+BQ6ENH3lPZ5kHpqXLDOtrhiSpI4tDpJLGCbvsq0RU4iqsFjHfjEMTXgVSPjEpL5
 8BeRcfTwVGrwDoiVQPkkCPDvYQqLPoqujWIePYEQs2j+bl8KdM1537wFbO3IribVWb69
 9UDT/V5Yinfx1ZgaHM7txIxICRXW7B5yNJoRhTdHsCjl3Ms88DJgYZHV8+fVLI1tk+S5
 Zi7w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1712182411; x=1712787211;
 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=FLVi6p0ascVdhcG1ng+RcTOm2dOzdHDWQcVyKWyKIq/PBp0c0MeQyI1TRRkMitygrP
 EGXAgZ+2yZrjwXQRNHP8IGJZTKPO8bayAA6p6r0iq2jjIUv/6AYLMGNl+mUvjmEV5FBm
 mZdyWKcs9HC5Ih07fmZ/N51+4C0SgCEdGRhvRvnUnzDeKnxJNCgMX0HjY0rta4b21M3e
 9LmcK+YEaIf/0AkAjGlQ1p31qU3/4Rh2P8A+a8xx4ynbqf7nBJbCxyvKqihUZOQP7hRS
 G8LwYjG8mtLAx9Ex3L2smGbw3vF3XKwRJybH5X1/Z5VjkHxGNdizMPZtScUICG7rSsj1
 5VRg==
X-Gm-Message-State: AOJu0YyTNUYID0x1mb+WXpoB7BuIA2nsJdejUCheE/RerzaueJTRgRBw
 cuXYv7I9BxIs6FSVt+Pry1IDBo/3gWWkUmYLXLyMcKNuw/klc+waAc8z05h6zJEucDDLmAAZKeU
 XJAtMbQ==
X-Google-Smtp-Source: AGHT+IGoirssC7iClxVb+RifLd1NZhYoSAjDhtpsFuw56IT3JvxDTOg64PfajUqsmynbZt82kk6zjQ==
X-Received: by 2002:a17:90b:4c12:b0:2a2:7c53:7d1f with SMTP id
 na18-20020a17090b4c1200b002a27c537d1fmr5060241pjb.17.1712182410914; 
 Wed, 03 Apr 2024 15:13:30 -0700 (PDT)
Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226])
 by smtp.gmail.com with ESMTPSA id
 1-20020a17090a0f0100b002a261d1da0dsm224218pjy.24.2024.04.03.15.13.30
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Wed, 03 Apr 2024 15:13:30 -0700 (PDT)
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>
Subject: [PATCH v2 1/2] eal: add functions to generate uuid values
Date: Wed,  3 Apr 2024 15:11:07 -0700
Message-ID: <20240403221319.499014-2-stephen@networkplumber.org>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <20240403221319.499014-1-stephen@networkplumber.org>
References: <20240403163432.437275-1-stephen@networkplumber.org>
 <20240403221319.499014-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>,
 <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>,
 <mailto:dev-request@dpdk.org?subject=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 <stephen@networkplumber.org>
---
 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 <stdint.h>
 #include <stdlib.h>
 #include <ctype.h>
+#include <time.h>
 
+#include <rte_atomic.h>
+#include <rte_common.h>
+#include <rte_random.h>
+#include <rte_time.h>
 #include <rte_uuid.h>
 
 /* 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 <stddef.h>
 #include <string.h>
 
+#include <rte_compat.h>
+
 /**
  * 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 {
-- 
2.43.0