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.
This commit is contained in:
Miroslav Lichvar 2023-03-23 11:37:11 +01:00
parent 0845df7684
commit a511029cc2
4 changed files with 33 additions and 0 deletions

View file

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

View file

@ -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);

19
util.c
View file

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

3
util.h
View file

@ -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);