mirror of
https://github.com/openvswitch/ovs
synced 2025-10-29 15:28:56 +00:00
ofp-actions: Make struct ofpact constant size across implementations.
Before commit c2d936a44f (ofp-actions: Centralize all OpenFlow action
code for maintainability.), struct ofpact was 4 bytes with GCC and Clang,
and 12 bytes with other compilers. That commit changed struct ofpact so
that it remained 4 bytes with GCC and Clang but shrank to 8 bytes on other
compilers. An unexpected side effect of that change was that the size
of the pad[] array in struct ofpact_nest shrank to 0 bytes, because that
array padded to a multiple of 8 bytes. MSVC does not support 0-element
arrays, so this caused a build failure.
This commit fixes the problem by changing struct ofpact so that it is 4
bytes with every compiler.
Reported-by: Alin Serdean <aserdean@cloudbasesolutions.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Alin Serdean <aserdean@cloudbasesolutions.com>
This commit is contained in:
@@ -169,6 +169,7 @@
|
|||||||
* or otherwise exposed outside of a single process. */
|
* or otherwise exposed outside of a single process. */
|
||||||
#if __GNUC__ && !__CHECKER__
|
#if __GNUC__ && !__CHECKER__
|
||||||
#define OVS_PACKED_ENUM __attribute__((__packed__))
|
#define OVS_PACKED_ENUM __attribute__((__packed__))
|
||||||
|
#define HAVE_PACKED_ENUM
|
||||||
#else
|
#else
|
||||||
#define OVS_PACKED_ENUM
|
#define OVS_PACKED_ENUM
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -157,16 +157,20 @@ enum {
|
|||||||
* code to translate the ofpact to OpenFlow must tolerate this case.)
|
* code to translate the ofpact to OpenFlow must tolerate this case.)
|
||||||
*/
|
*/
|
||||||
struct ofpact {
|
struct ofpact {
|
||||||
|
/* We want the space advantage of an 8-bit type here on every
|
||||||
|
* implementation, without giving up the advantage of having a useful type
|
||||||
|
* on implementations that support packed enums. */
|
||||||
|
#ifdef HAVE_PACKED_ENUM
|
||||||
enum ofpact_type type; /* OFPACT_*. */
|
enum ofpact_type type; /* OFPACT_*. */
|
||||||
|
#else
|
||||||
|
uint8_t type; /* OFPACT_* */
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t raw; /* Original type when added, if any. */
|
uint8_t raw; /* Original type when added, if any. */
|
||||||
uint16_t len; /* Length of the action, in bytes, including
|
uint16_t len; /* Length of the action, in bytes, including
|
||||||
* struct ofpact, excluding padding. */
|
* struct ofpact, excluding padding. */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
/* Make sure that OVS_PACKED_ENUM really worked. */
|
|
||||||
BUILD_ASSERT_DECL(sizeof(struct ofpact) == 4);
|
BUILD_ASSERT_DECL(sizeof(struct ofpact) == 4);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Alignment. */
|
/* Alignment. */
|
||||||
#define OFPACT_ALIGNTO 8
|
#define OFPACT_ALIGNTO 8
|
||||||
|
|||||||
Reference in New Issue
Block a user