Re: [PATCH v2] netlink: align attributes on 64-bits
From: Thomas Graf <tgraf@suug.ch>
Date: 2012-12-18 17:11:05
On 12/18/12 at 04:50pm, David Laight wrote:
quoted
2/ Suppose that the attribute is: struct foo { __u64 bar1; __u32 bar2; } => sizeof(struct foo) = 12 (= payload)That is only true if the host architecture aligns 64bit items on 32 it boundaries (as i386 does). Otherwise there are 4 bytes of padding at the end and the size is 16. Actually it is worse than that. Consider the structure: struct bar { __u32 foo1; __u64 foo2; } On i386 it will have size 12 and foo2 will be at offset 4. On sparc32 (and most 64bit) it will have size 16 with foo2 at offset 8 (and 4 bytes of pad after foo1).
This is a known problem and I can't think of anything that can be done about it except for memcpy()ing the data before accessing it. If you have ideas, I'm more that willing to listen :)
Do these messages move between systems? If they do then any 64bit items need an explicit alignment eg tag with __attribute__((aligned(8))) (or aligned(4)).
They don't. Netlink has and will be host bound. It also uses host byte order for that reason.