Subject: Re: unaligned data object from SIOCGIFCONF
To: Nathan J. Williams <nathanw@MIT.EDU>
From: None <itojun@iijlab.net>
List: tech-net
Date: 02/22/2000 19:11:35
>> With introduction of IPv6, SIOCGIFCONF can return unaligned data
>> object for 64bit arch (like alpha). Situation is like this:
>> - SIOCGIFCONF returns packed structs
>> - sizeof(sockaddr_in6) % 8 != 0
>> - so, data object from SIOCGIFCONF can be placed at "addr % 8
>> != 0".
>I notieced this problem when one of my alphas started spewing
>alignment fixups for rarpd.
>As you noted, this isn't new with IPv6, since some other sockaddr_foo
>variants aren't multiples of 8.
>I used solution 3 ("blame the application") for rarpd. The packing
>of variable sized structures, while annoying, is the historic API, and
>applications that make assumptions of alignment of structures packed
>this way are broken.
I'm thinking of bringing in getifaddrs(3) from BSDI. This is basically
a wrapper around SIOCGIFCONF, and is under redistributable copyright.
It will help future application writers.
Manipulation of SIOCGIFCONF is way too complicated for normal apps.
- alignment issue after getting the data
- we need to try-and-error for buffer size, since we can't get the
necessary buffer size beforehand.
If noone objects, I would like to bring it into libc,
after checking with BSDI.
itojun
int
getifaddrs(struct ifaddrs **pif)
struct ifaddrs {
struct ifaddrs *ifa_next;
char *ifa_name;
u_int ifa_flags;
struct sockaddr *ifa_addr;
struct sockaddr *ifa_netmask;
struct sockaddr *ifa_dstaddr;
void *ifa_data;
};