numam-dpdk/lib/eal/common/eal_common_uuid.c
Bruce Richardson 99a2dd955f lib: remove librte_ prefix from directory names
There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
2021-04-21 14:04:09 +02:00

168 lines
3.1 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C) 1996, 1997 Theodore Ts'o.
*/
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <ctype.h>
#include <rte_uuid.h>
/* UUID packed form */
struct uuid {
uint32_t time_low;
uint16_t time_mid;
uint16_t time_hi_and_version;
uint16_t clock_seq;
uint8_t node[6];
};
static void uuid_pack(const struct uuid *uu, rte_uuid_t ptr)
{
uint32_t tmp;
uint8_t *out = ptr;
tmp = uu->time_low;
out[3] = (uint8_t) tmp;
tmp >>= 8;
out[2] = (uint8_t) tmp;
tmp >>= 8;
out[1] = (uint8_t) tmp;
tmp >>= 8;
out[0] = (uint8_t) tmp;
tmp = uu->time_mid;
out[5] = (uint8_t) tmp;
tmp >>= 8;
out[4] = (uint8_t) tmp;
tmp = uu->time_hi_and_version;
out[7] = (uint8_t) tmp;
tmp >>= 8;
out[6] = (uint8_t) tmp;
tmp = uu->clock_seq;
out[9] = (uint8_t) tmp;
tmp >>= 8;
out[8] = (uint8_t) tmp;
memcpy(out+10, uu->node, 6);
}
static void uuid_unpack(const rte_uuid_t in, struct uuid *uu)
{
const uint8_t *ptr = in;
uint32_t tmp;
tmp = *ptr++;
tmp = (tmp << 8) | *ptr++;
tmp = (tmp << 8) | *ptr++;
tmp = (tmp << 8) | *ptr++;
uu->time_low = tmp;
tmp = *ptr++;
tmp = (tmp << 8) | *ptr++;
uu->time_mid = tmp;
tmp = *ptr++;
tmp = (tmp << 8) | *ptr++;
uu->time_hi_and_version = tmp;
tmp = *ptr++;
tmp = (tmp << 8) | *ptr++;
uu->clock_seq = tmp;
memcpy(uu->node, ptr, 6);
}
bool rte_uuid_is_null(const rte_uuid_t uu)
{
const uint8_t *cp = uu;
int i;
for (i = 0; i < 16; i++)
if (*cp++)
return false;
return true;
}
/*
* rte_uuid_compare() - compare two UUIDs.
*/
int rte_uuid_compare(const rte_uuid_t uu1, const rte_uuid_t uu2)
{
struct uuid uuid1, uuid2;
uuid_unpack(uu1, &uuid1);
uuid_unpack(uu2, &uuid2);
#define UUCMP(u1, u2) \
do { if (u1 != u2) return (u1 < u2) ? -1 : 1; } while (0)
UUCMP(uuid1.time_low, uuid2.time_low);
UUCMP(uuid1.time_mid, uuid2.time_mid);
UUCMP(uuid1.time_hi_and_version, uuid2.time_hi_and_version);
UUCMP(uuid1.clock_seq, uuid2.clock_seq);
#undef UUCMP
return memcmp(uuid1.node, uuid2.node, 6);
}
int rte_uuid_parse(const char *in, rte_uuid_t uu)
{
struct uuid uuid;
int i;
const char *cp;
char buf[3];
if (strlen(in) != 36)
return -1;
for (i = 0, cp = in; i <= 36; i++, cp++) {
if ((i == 8) || (i == 13) || (i == 18) ||
(i == 23)) {
if (*cp == '-')
continue;
else
return -1;
}
if (i == 36)
if (*cp == 0)
continue;
if (!isxdigit(*cp))
return -1;
}
uuid.time_low = strtoul(in, NULL, 16);
uuid.time_mid = strtoul(in+9, NULL, 16);
uuid.time_hi_and_version = strtoul(in+14, NULL, 16);
uuid.clock_seq = strtoul(in+19, NULL, 16);
cp = in+24;
buf[2] = 0;
for (i = 0; i < 6; i++) {
buf[0] = *cp++;
buf[1] = *cp++;
uuid.node[i] = strtoul(buf, NULL, 16);
}
uuid_pack(&uuid, uu);
return 0;
}
void rte_uuid_unparse(const rte_uuid_t uu, char *out, size_t len)
{
struct uuid uuid;
uuid_unpack(uu, &uuid);
snprintf(out, len,
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
uuid.time_low, uuid.time_mid, uuid.time_hi_and_version,
uuid.clock_seq >> 8, uuid.clock_seq & 0xFF,
uuid.node[0], uuid.node[1], uuid.node[2],
uuid.node[3], uuid.node[4], uuid.node[5]);
}