Signed-off-by: Samuel Thibault <samuel.thiba...@ens-lyon.org> --- slirp/ip.h | 6 ++++-- slirp/ip6.h | 6 ++++-- slirp/ip6_icmp.h | 12 +++++++----- slirp/util.h | 25 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 9 deletions(-)
diff --git a/slirp/ip.h b/slirp/ip.h index 2baeeb9a3a..77182e61a9 100644 --- a/slirp/ip.h +++ b/slirp/ip.h @@ -35,6 +35,8 @@ #include <glib.h> +#include "util.h" + #if G_BYTE_ORDER == G_BIG_ENDIAN # undef NTOHL # undef NTOHS @@ -229,8 +231,8 @@ struct ipasfrag { struct ip ipf_ip; }; -QEMU_BUILD_BUG_ON(offsetof(struct ipq, frag_link) != - offsetof(struct ipasfrag, ipf_link)); +SLIRP_BUILD_BUG_ON(offsetof(struct ipq, frag_link) != + offsetof(struct ipasfrag, ipf_link)); #define ipf_off ipf_ip.ip_off #define ipf_tos ipf_ip.ip_tos diff --git a/slirp/ip6.h b/slirp/ip6.h index 4e7c366505..3db099acef 100644 --- a/slirp/ip6.h +++ b/slirp/ip6.h @@ -8,6 +8,8 @@ #include <glib.h> +#include "util.h" + #define ALLNODES_MULTICAST { .s6_addr = \ { 0xff, 0x02, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00,\ @@ -152,7 +154,7 @@ struct ip6_pseudohdr { * If we marked the struct as packed then we would be unable to take * the address of any of the fields in it. */ -QEMU_BUILD_BUG_ON(sizeof(struct ip6) != 40); -QEMU_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40); +SLIRP_BUILD_BUG_ON(sizeof(struct ip6) != 40); +SLIRP_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40); #endif diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h index 3f44ed2f49..ea7fcfe5e6 100644 --- a/slirp/ip6_icmp.h +++ b/slirp/ip6_icmp.h @@ -6,6 +6,8 @@ #ifndef SLIRP_IP6_ICMP_H #define SLIRP_IP6_ICMP_H +#include "util.h" + /* * Interface Control Message Protocol version 6 Definitions. * Per RFC 4443, March 2006. @@ -50,14 +52,14 @@ struct ndp_ra { /* Router Advertisement Message */ uint32_t retrans_time; /* Retrans Timer */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12); struct ndp_ns { /* Neighbor Solicitation Message */ uint32_t reserved; struct in6_addr target; /* Target Address */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20); struct ndp_na { /* Neighbor Advertisement Message */ #if G_BYTE_ORDER == G_BIG_ENDIAN @@ -78,7 +80,7 @@ struct ndp_na { /* Neighbor Advertisement Message */ struct in6_addr target; /* Target Address */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_na) != 20); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_na) != 20); struct ndp_redirect { uint32_t reserved; @@ -86,7 +88,7 @@ struct ndp_redirect { struct in6_addr dest; /* Destination Address */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36); /* * Structure of an icmpv6 header. @@ -113,7 +115,7 @@ struct icmp6 { #define icmp6_redirect icmp6_body.ndp_redirect }; -QEMU_BUILD_BUG_ON(sizeof(struct icmp6) != 40); +SLIRP_BUILD_BUG_ON(sizeof(struct icmp6) != 40); #define ICMP6_MINLEN 4 #define ICMP6_ERROR_MINLEN 8 diff --git a/slirp/util.h b/slirp/util.h index ef75804560..fc2c2e58fe 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -48,6 +48,31 @@ # define SLIRP_PACKED __attribute__((packed)) #endif +#ifndef glue +#define xglue(x, y) x ## y +#define glue(x, y) xglue(x, y) +#endif + +#define SLIRP_BUILD_BUG_ON_STRUCT(x) \ + struct { \ + int:(x) ? -1 : 1; \ + } + +/* SLIRP_BUILD_BUG_MSG() emits the message given if _Static_assert is + * supported; otherwise, it will be omitted from the compiler error + * message (but as it remains present in the source code, it can still + * be useful when debugging). */ +#if defined(CONFIG_STATIC_ASSERT) +#define SLIRP_BUILD_BUG_MSG(x, msg) _Static_assert(!(x), msg) +#elif defined(__COUNTER__) +#define SLIRP_BUILD_BUG_MSG(x, msg) typedef SLIRP_BUILD_BUG_ON_STRUCT(x) \ + glue(qemu_build_bug_on__, __COUNTER__) __attribute__((unused)) +#else +#define SLIRP_BUILD_BUG_MSG(x, msg) +#endif + +#define SLIRP_BUILD_BUG_ON(x) SLIRP_BUILD_BUG_MSG(x, "not expecting: " #x) + #define SCALE_MS 1000000 #define ETH_ALEN 6 -- 2.20.1