@@ -88,6 +88,13 @@ typedef union {
} u64;
} ovs_u128;
+typedef union {
+ ovs_be32 be32[4];
+ struct {
+ ovs_be64 hi, lo;
+ } be64;
+} ovs_be128;
+
/* A 64-bit value, in network byte order, that is only aligned on a 32-bit
* boundary. */
typedef struct {
@@ -42,6 +42,20 @@ ovs_be64 htonll(uint64_t);
uint64_t ntohll(ovs_be64);
#endif
+static inline void
+hton128(const ovs_u128 *src, ovs_be128 *dst)
+{
+ dst->be64.hi = htonll(src->u64.lo);
+ dst->be64.lo = htonll(src->u64.hi);
+}
+
+static inline void
+ntoh128(const ovs_be128 *src, ovs_u128 *dst)
+{
+ dst->u64.hi = ntohll(src->be64.lo);
+ dst->u64.lo = ntohll(src->be64.hi);
+}
+
static inline uint32_t
uint32_byteswap(uint32_t crc) {
return (((crc & 0x000000ff) << 24) |
@@ -1742,6 +1742,7 @@ union mf_value {
uint8_t tun_metadata[128];
struct in6_addr ipv6;
struct eth_addr mac;
+ ovs_be128 be128;
ovs_be64 be64;
ovs_be32 be32;
ovs_be16 be16;
@@ -568,6 +568,27 @@ ovs_u128_equals(const ovs_u128 *a, const ovs_u128 *b)
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 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
These types will be used by the following patches to ensure a consistent wire format for 128-bit connection tracking labels. Signed-off-by: Joe Stringer <joestringer@nicira.com> --- include/openvswitch/types.h | 7 +++++++ lib/byte-order.h | 14 ++++++++++++++ lib/meta-flow.h | 1 + lib/util.h | 21 +++++++++++++++++++++ 4 files changed, 43 insertions(+)