dpif-linux: Fix build with certain 64-bit kernel/userspace combinations.
authorBen Pfaff <blp@nicira.com>
Fri, 14 Oct 2011 16:39:48 +0000 (09:39 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 14 Oct 2011 16:39:48 +0000 (09:39 -0700)
commit320232ec7f37218a6fce0704f9b0ba7696e5ad21
treee30c934661faa67a9c95378741a23d72b08ef965
parent4ca66bfaeb49e6fe85ccd8d8f4f11dbb96213636
dpif-linux: Fix build with certain 64-bit kernel/userspace combinations.

Unix 64-bit ABIs have two 64-bit types: "long" and "long long".  Either of
these is a reasonable choice for uint64_t (the userspace type) and for
__u64 (the kernel type).  Unfortunately, kernel and userspace don't
necessarily agree on the choice, and in fact the choice varies across
kernel versions and architectures.

Now that OVS is actually using kernel types in its kernel header, this
can make a difference: when __u64 and uint64_t differ, passing a pointer
to __u64 to OVS function get_unaligned_u64() yields a compiler warning
or error.

This commit fixes up the problems of this type found in OVS, by making
get_unaligned_u64() accept all 64-bit unsigned integer types, not just
whichever one happens to be uint64_t.  I didn't do the same thing for
put_unaligned_u64() because it is less likely to be a problem in
practice: usually, when userspace writes to kernel data structures it
does so with copies that it knows to be aligned, so that it's not
necessary to use put_unaligned_u64().

This problem won't occur for uint8_t, uint16_t, or uint32_t, since there is
only one reasonable choice of type for each.  It won't occur for ovs_be<N>
because OVS always defines those as aliases for the kernel's __be<N> types
when those are available.

This compiled cleanly for me in Scientific Linux 6.0 x86-64.

Reported-by: Pravin Shelar <pshelar@nicira.com>
lib/unaligned.h
lib/util.h