[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 12/12] slirp: use HOST_SUPPORTS_UNALIGNED_ACCESS
From: |
Philippe Mathieu-Daudé |
Subject: |
[Qemu-devel] [RFC PATCH 12/12] slirp: use HOST_SUPPORTS_UNALIGNED_ACCESS |
Date: |
Mon, 8 Jan 2018 14:29:04 -0300 |
Access struct in6_addr with 'void *', then cast to 'u8 *' to avoid alignment
issues.
Signed-off-by: Philippe Mathieu-Daudé <address@hidden>
---
ugly...
slirp/ip6.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/slirp/ip6.h b/slirp/ip6.h
index c6493a0856..4eaeaa9a0a 100644
--- a/slirp/ip6.h
+++ b/slirp/ip6.h
@@ -51,11 +51,19 @@
0x00, 0x00, 0x00, 0x00,\
0x00, 0x00, 0x00, 0x00 } }
+#ifdef HOST_SUPPORTS_UNALIGNED_ACCESS
static inline bool in6_equal(const struct in6_addr *a, const struct in6_addr
*b)
{
return memcmp(a, b, sizeof(*a)) == 0;
}
+#else
+static inline bool in6_equal(const void *a, const void *b)
+{
+ return memcmp(a, b, sizeof(struct in6_addr)) == 0;
+}
+#endif
+#ifdef HOST_SUPPORTS_UNALIGNED_ACCESS
static inline bool in6_equal_net(const struct in6_addr *a,
const struct in6_addr *b,
int prefix_len)
@@ -71,7 +79,28 @@ static inline bool in6_equal_net(const struct in6_addr *a,
return a->s6_addr[prefix_len / 8] >> (8 - (prefix_len % 8))
== b->s6_addr[prefix_len / 8] >> (8 - (prefix_len % 8));
}
+#else
+static inline bool in6_equal_net(const void *a,
+ const void *b,
+ int prefix_len)
+{
+ const uint8_t *aa = (uint8_t *)a;
+ const uint8_t *ab = (uint8_t *)b;
+
+ if (memcmp(a, b, prefix_len / 8) != 0) {
+ return 0;
+ }
+
+ if (prefix_len % 8 == 0) {
+ return 1;
+ }
+
+ return (aa[prefix_len / 8] >> (8 - (prefix_len % 8)))
+ == (ab[prefix_len / 8] >> (8 - (prefix_len % 8)));
+}
+#endif
+#ifdef HOST_SUPPORTS_UNALIGNED_ACCESS
static inline bool in6_equal_mach(const struct in6_addr *a,
const struct in6_addr *b,
int prefix_len)
@@ -89,6 +118,28 @@ static inline bool in6_equal_mach(const struct in6_addr *a,
return (a->s6_addr[prefix_len / 8] & ((1U << (8 - (prefix_len % 8))) - 1))
== (b->s6_addr[prefix_len / 8] & ((1U << (8 - (prefix_len % 8))) - 1));
}
+#else
+static inline bool in6_equal_mach(const void *a,
+ const void *b,
+ int prefix_len)
+{
+ const uint8_t *aa = (uint8_t *)a;
+ const uint8_t *ab = (uint8_t *)b;
+
+ if (memcmp(&(aa[DIV_ROUND_UP(prefix_len, 8)]),
+ &(ab[DIV_ROUND_UP(prefix_len, 8)]),
+ 16 - DIV_ROUND_UP(prefix_len, 8)) != 0) {
+ return 0;
+ }
+
+ if (prefix_len % 8 == 0) {
+ return 1;
+ }
+
+ return (aa[prefix_len / 8] & ((1U << (8 - (prefix_len % 8))) - 1))
+ == (ab[prefix_len / 8] & ((1U << (8 - (prefix_len % 8))) - 1));
+}
+#endif
#define in6_equal_router(a)\
@@ -112,10 +163,17 @@ static inline bool in6_equal_mach(const struct in6_addr
*a,
#define in6_zero(a)\
(in6_equal(a, &(struct in6_addr)ZERO_ADDR))
+#ifdef HOST_SUPPORTS_UNALIGNED_ACCESS
static inline bool in6_multicast(const struct in6_addr *a)
{
return a->s6_addr[0] == 0xff;
}
+#else
+static inline bool in6_multicast(const void *a)
+{
+ return ((const uint8_t *)a)[0] == 0xff;
+}
+#endif
/* Compute emulated host MAC address from its ipv6 address */
static inline void in6_compute_ethaddr(struct in6_addr ip,
--
2.15.1
- [Qemu-devel] [PATCH 08/12] slirp: removed unused code, (continued)
- [Qemu-devel] [PATCH 08/12] slirp: removed unused code, Philippe Mathieu-Daudé, 2018/01/08
- [Qemu-devel] [PATCH 09/12] slirp: add in6_dhcp_multicast(), Philippe Mathieu-Daudé, 2018/01/08
- [Qemu-devel] [PATCH 10/12] configure: disable unaligned access warning on x86 arch, Philippe Mathieu-Daudé, 2018/01/08
- [Qemu-devel] [PATCH 11/12] configure: add HOST_SUPPORTS_UNALIGNED_ACCESS, Philippe Mathieu-Daudé, 2018/01/08
- [Qemu-devel] [RFC PATCH 12/12] slirp: use HOST_SUPPORTS_UNALIGNED_ACCESS,
Philippe Mathieu-Daudé <=
- Re: [Qemu-devel] [PATCH 00/12] add HOST_SUPPORTS_UNALIGNED_ACCESS, reduce slirp warnings, no-reply, 2018/01/08