From 7bef2c918ac077da2156697ca821820e56561b9e Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 5 Feb 2011 13:14:47 -0800 Subject: [PATCH] Add types and accessors for working with half-aligned 64-bit values. Both OpenFlow and Netlink contain 64-bit fields that are only guaranteed to be aligned on 32-bit boundaries. This commit introduces types for representing these fields and functions for working with them. Followup commits will make the OpenFlow and Netlink code use these types and functions. --- include/openvswitch/types.h | 25 +++++++++++++++++++++- lib/unaligned.h | 41 ++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/include/openvswitch/types.h b/include/openvswitch/types.h index fbd2997b3..9ddb85773 100644 --- a/include/openvswitch/types.h +++ b/include/openvswitch/types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Nicira Networks. + * Copyright (c) 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ #ifndef OPENVSWITCH_TYPES_H #define OPENVSWITCH_TYPES_H 1 +#include +#include #include #ifdef __CHECKER__ @@ -35,5 +37,26 @@ typedef uint16_t OVS_BITWISE ovs_be16; typedef uint32_t OVS_BITWISE ovs_be32; typedef uint64_t OVS_BITWISE ovs_be64; + +/* Netlink and OpenFlow both contain 64-bit values that are only guaranteed to + * be aligned on 32-bit boundaries. These types help. + * + * lib/unaligned.h has helper functions for accessing these. */ + +/* A 64-bit value, in host byte order, that is only aligned on a 32-bit + * boundary. */ +typedef struct { +#ifdef WORDS_BIGENDIAN + uint32_t hi, lo; +#else + uint32_t lo, hi; +#endif +} ovs_32aligned_u64; + +/* A 64-bit value, in network byte order, that is only aligned on a 32-bit + * boundary. */ +typedef struct { + ovs_be32 hi, lo; +} ovs_32aligned_be64; #endif /* openvswitch/types.h */ diff --git a/lib/unaligned.h b/lib/unaligned.h index ef08f4e22..a44ee8be8 100644 --- a/lib/unaligned.h +++ b/lib/unaligned.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Nicira Networks. + * Copyright (c) 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -140,5 +140,44 @@ static inline void put_unaligned_u64(uint64_t *p_, uint64_t x_) #define put_unaligned_be32 put_unaligned_u32 #define put_unaligned_be64 put_unaligned_u64 #endif + +/* Returns the value in 'x'. */ +static inline uint64_t +get_32aligned_u64(const ovs_32aligned_u64 *x) +{ + return ((uint64_t) x->hi << 32) | x->lo; +} + +/* Stores 'value' in 'x'. */ +static inline void +put_32aligned_u64(ovs_32aligned_u64 *x, uint64_t value) +{ + x->hi = value >> 32; + x->lo = value; +} + +/* Returns the value of 'x'. */ +static inline ovs_be64 +get_32aligned_be64(const ovs_32aligned_be64 *x) +{ +#ifdef WORDS_BIGENDIAN + return ((ovs_be64) x->hi << 32) | x->lo; +#else + return ((ovs_be64) x->lo << 32) | x->hi; +#endif +} + +/* Stores network byte order 'value' into 'x'. */ +static inline void +put_32aligned_be64(ovs_32aligned_be64 *x, ovs_be64 value) +{ +#if WORDS_BIGENDIAN + x->hi = value >> 32; + x->lo = value; +#else + x->hi = value; + x->lo = value >> 32; +#endif +} #endif /* unaligned.h */ -- 2.43.0