On Wed, Apr 03, 2024 at 09:32:29AM -0700, Stephen Hemminger wrote:
> 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 <step...@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>

i guess this should be rte_stdatomic.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;

sequence will need to be RTE_ATOMIC(uint16_t) if you build with clang
and you -Denable_stdatomic=true clang enforces the use of atomic types
and build would have failed at the rte_atomic_fetch_add_explicit below.

the CI probably already told you this.

> +
> +     /* 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

buffer -> bufferm intentional?

>   * @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

i guess 24.07 now

>       rte_vfio_get_device_info; # WINDOWS_NO_EXPORT
> +     rte_uuid_generate_random;
> +     rte_uuid_generate_time;
>  };
>  
>  INTERNAL {
> -- 
> 2.43.0

Reply via email to