From a511029cc297fc33afe85f9b6e5786c7cc4befa0 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 23 Mar 2023 11:37:11 +0100 Subject: [PATCH] cmdmon: define 64-bit integer Add a structure for 64-bit integers without requiring 64-bit alignment to be usable in CMD_Reply without struct packing. Add utility functions for conversion to/from network order. Avoid using be64toh() and htobe64() as they don't seem to be available on all supported systems. --- candm.h | 6 ++++++ test/unit/util.c | 5 +++++ util.c | 19 +++++++++++++++++++ util.h | 3 +++ 4 files changed, 33 insertions(+) diff --git a/candm.h b/candm.h index 2fba7f4..b71af80 100644 --- a/candm.h +++ b/candm.h @@ -122,6 +122,12 @@ typedef struct { /* This is used in tv_sec_high for 32-bit timestamps */ #define TV_NOHIGHSEC 0x7fffffff +/* Structure for 64-bit integers (not requiring 64-bit alignment) */ +typedef struct { + uint32_t high; + uint32_t low; +} Integer64; + /* 32-bit floating-point format consisting of 7-bit signed exponent and 25-bit signed coefficient without hidden bit. The result is calculated as: 2^(exp - 25) * coef */ diff --git a/test/unit/util.c b/test/unit/util.c index c8bdadb..6fadefb 100644 --- a/test/unit/util.c +++ b/test/unit/util.c @@ -40,6 +40,7 @@ test_unit(void) double x, y, nan, inf; IPAddr ip, ip2, ip3; IPSockAddr ip_saddr; + Integer64 integer64; Timespec tspec; Float f; int i, j, c; @@ -565,6 +566,10 @@ test_unit(void) UTI_TimespecNetworkToHost(&tspec, &ts2); TEST_CHECK(!UTI_CompareTimespecs(&ts, &ts2)); + integer64 = UTI_Integer64HostToNetwork(0x1234567890ABCDEFULL); + TEST_CHECK(memcmp(&integer64, "\x12\x34\x56\x78\x90\xab\xcd\xef", 8) == 0); + TEST_CHECK(UTI_Integer64NetworkToHost(integer64) == 0x1234567890ABCDEFULL); + TEST_CHECK(UTI_CmacNameToAlgorithm("AES128") == CMC_AES128); TEST_CHECK(UTI_CmacNameToAlgorithm("AES256") == CMC_AES256); TEST_CHECK(UTI_CmacNameToAlgorithm("NOSUCHCMAC") == CMC_INVALID); diff --git a/util.c b/util.c index 0321720..6b3320b 100644 --- a/util.c +++ b/util.c @@ -909,6 +909,25 @@ UTI_TimespecHostToNetwork(const struct timespec *src, Timespec *dest) /* ================================================== */ +uint64_t +UTI_Integer64NetworkToHost(Integer64 i) +{ + return (uint64_t)ntohl(i.high) << 32 | ntohl(i.low); +} + +/* ================================================== */ + +Integer64 +UTI_Integer64HostToNetwork(uint64_t i) +{ + Integer64 r; + r.high = htonl(i >> 32); + r.low = htonl(i); + return r; +} + +/* ================================================== */ + #define FLOAT_EXP_BITS 7 #define FLOAT_EXP_MIN (-(1 << (FLOAT_EXP_BITS - 1))) #define FLOAT_EXP_MAX (-FLOAT_EXP_MIN - 1) diff --git a/util.h b/util.h index d8e25de..d38abf0 100644 --- a/util.h +++ b/util.h @@ -172,6 +172,9 @@ extern double UTI_Log2ToDouble(int l); extern void UTI_TimespecNetworkToHost(const Timespec *src, struct timespec *dest); extern void UTI_TimespecHostToNetwork(const struct timespec *src, Timespec *dest); +uint64_t UTI_Integer64NetworkToHost(Integer64 i); +Integer64 UTI_Integer64HostToNetwork(uint64_t i); + extern double UTI_FloatNetworkToHost(Float x); extern Float UTI_FloatHostToNetwork(double x);