On 11/26/2015 08:10 AM, Ian Campbell wrote:
Commit 0f7436ca54c9 "network: wait for DAD to finish for bridge
IPv6 addresses"
results in:
CC util/libvirt_util_la-virnetdevmacvlan.lo
util/virnetdev.c: In function 'virNetDevParseDadStatus':
util/virnetdev.c:1319:188: error: cast increases required alignment of target type
[-Werror=cast-align]
util/virnetdev.c:1332:41: error: cast increases required alignment of target type
[-Werror=cast-align]
util/virnetdev.c:1334:92: error: cast increases required alignment of target type
[-Werror=cast-align]
cc1: all warnings being treated as errors
on at least ARM platforms.
Thanks for looking into this issue Ian.
The three macros involved (NLMSG_NEXT, IFA_RTA and RTA_NEXT) all
appear to
correctly take care of alignment, therefore suppress Wcast-align around their
uses.
Indeed those macros seem to handle alignment, even on one of my older machines
with 2.6 kernel headers. IMO this falls under the "difficult or impossible to
address" scenarios that Daniel mentioned when introducing the VIR_WARNINGS_*
macros via commit e57aaa6f. Adding Daniel to cc for a sanity check of my weak ACK.
Regards,
Jim
Signed-off-by: Ian Campbell <ian.campbell(a)citrix.com>
Cc: Maxim Perevedentsev <mperevedentsev(a)virtuozzo.com>
Cc: Laine Stump <laine(a)laine.org>
Cc: Dario Faggioli <dario.faggioli(a)citrix.com>
Cc: Jim Fehlig <jfehlig(a)suse.com>
---
src/util/virnetdev.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index ade9afa..0bc809e 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -1316,7 +1316,10 @@ virNetDevParseDadStatus(struct nlmsghdr *nlh, int len,
struct rtattr *rtattr_ptr;
size_t i;
struct in6_addr *addr;
+
+ VIR_WARNINGS_NO_CAST_ALIGN
for (; NLMSG_OK(nlh, len); nlh = NLMSG_NEXT(nlh, len)) {
+ VIR_WARNINGS_RESET
if (NLMSG_PAYLOAD(nlh, 0) < sizeof(struct ifaddrmsg)) {
/* Message without payload is the last one. */
break;
@@ -1329,9 +1332,11 @@ virNetDevParseDadStatus(struct nlmsghdr *nlh, int len,
}
ifaddrmsg_len = IFA_PAYLOAD(nlh);
+ VIR_WARNINGS_NO_CAST_ALIGN
rtattr_ptr = (struct rtattr *) IFA_RTA(ifaddrmsg_ptr);
for (; RTA_OK(rtattr_ptr, ifaddrmsg_len);
rtattr_ptr = RTA_NEXT(rtattr_ptr, ifaddrmsg_len)) {
+ VIR_WARNINGS_RESET
if (RTA_PAYLOAD(rtattr_ptr) != sizeof(struct in6_addr)) {
/* No address: ignore. */
continue;