# ifdef HAVE_128BIT_INTEGERS
# define ntohlll(x) (((uint128_t)ntohll((uint64_t)(x >> 64))) | (((uint128_t)ntohll(((uint64_t) x)) << 64)))
# else
-uint128_t ntohlll(uint128_t num);
+static inline uint128_t ntohlll(uint128_t const num)
+{
+ uint64_t const *p = (uint64_t const *) #
+ uint64_t ret[2];
+
+ /* swapsies */
+ ret[1] = ntohll(p[0]);
+ ret[0] = ntohll(p[1]);
+
+ return *(uint128_t *)ret;
+}
# endif
# else
# define ntohlll(x) (x)
case FR_TYPE_IPV6_ADDR:
case FR_TYPE_IPV6_PREFIX:
- return fr_snprint_uint128(*out, outlen, ntohlll(*(uint128_t const *) &vp->vp_ipv6addr));
+ {
+ uint128_t ipv6int;
+
+ /*
+ * Needed for correct alignment (as flagged by ubsan)
+ */
+ memcpy(&ipv6int, &vp->vp_ipv6addr, sizeof(ipv6int));
+
+ return fr_snprint_uint128(*out, outlen, ntohlll(ipv6int));
+ }
default:
break;
}
#endif
-#if !defined(HAVE_128BIT_INTEGERS) && !defined(WORDS_BIGENDIAN)
-/** Swap byte order of 128 bit integer
- *
- * @param num 128bit integer to swap.
- * @return 128bit integer reversed.
- */
-uint128_t ntohlll(uint128_t const num)
-{
- uint64_t const *p = (uint64_t const *) #
- uint64_t ret[2];
-
- /* swapsies */
- ret[1] = ntohll(p[0]);
- ret[0] = ntohll(p[1]);
-
- return *(uint128_t *)ret;
-}
-#endif
-
/*
* Replacements in case we don't have inet_pton
*/