typedef union {
uint32_t u32[4];
struct {
+#ifdef WORDS_BIGENDIAN
+ uint64_t hi, lo;
+#else
uint64_t lo, hi;
+#endif
} u64;
} ovs_u128;
+typedef union {
+ ovs_be32 be32[4];
+ struct {
+ ovs_be64 hi, lo;
+ } be64;
+} ovs_be128;
+
+#define OVS_U128_MAX (ovs_u128) { .u64 = { UINT64_MAX, UINT64_MAX } }
+#define OVS_BE128_MAX (ovs_be128) { .be64 = { OVS_BE64_MAX, OVS_BE64_MAX } }
+
/* A 64-bit value, in network byte order, that is only aligned on a 32-bit
* boundary. */
typedef struct {
uint64_t ntohll(ovs_be64);
#endif
+static inline void
+hton128(const ovs_u128 *src, ovs_be128 *dst)
+{
+ dst->be64.hi = htonll(src->u64.hi);
+ dst->be64.lo = htonll(src->u64.lo);
+}
+
+static inline void
+ntoh128(const ovs_be128 *src, ovs_u128 *dst)
+{
+ dst->u64.hi = ntohll(src->be64.hi);
+ dst->u64.lo = ntohll(src->be64.lo);
+}
+
static inline uint32_t
uint32_byteswap(uint32_t crc) {
return (((crc & 0x000000ff) << 24) |
return (a->u64.hi == b->u64.hi) && (a->u64.lo == b->u64.lo);
}
+/* Returns true if 'val' is 0. */
+static inline bool
+ovs_u128_is_zero(const ovs_u128 *val)
+{
+ return !(val->u64.hi || val->u64.lo);
+}
+
+/* Returns true if 'val' is all ones. */
+static inline bool
+ovs_u128_is_ones(const ovs_u128 *val)
+{
+ ovs_u128 ones = OVS_U128_MAX;
+
+ return ovs_u128_equals(val, &ones);
+}
+
+/* Returns non-zero if the parameters have equal value. */
+static inline int
+ovs_be128_equals(const ovs_be128 *a, const ovs_be128 *b)
+{
+ return (a->be64.hi == b->be64.hi) && (a->be64.lo == b->be64.lo);
+}
+
+/* Returns true if 'val' is 0. */
+static inline bool
+ovs_be128_is_zero(const ovs_be128 *val)
+{
+ return !(val->be64.hi || val->be64.lo);
+}
+
void xsleep(unsigned int seconds);
#ifdef _WIN32