Subject: struct sockaddr_storage

From: Mike Taylor <[email-masked]>
Date: Thu, 19 Oct 2006 16:42:22 -0700 (PDT)

Hello All,
 
Does anybody understand why RFCs propose creating struct sockaddr_storage with
code like

/* 
* Desired design of maximum size and alignment
*/
#define _SS_MAXSIZE 128 /* Implementation specific max size */ 
#define _SS_ALIGNSIZE (sizeof (int64_t)) 
               /* Implementation specific desired alignment */
/* 
* Definitions used for sockaddr_storage structure paddings design.
*/
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (sa_family_t)) 
#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (sa_family_t)+ 
                              _SS_PAD1SIZE + _SS_ALIGNSIZE))
struct sockaddr_storage { 
    sa_family_t  ss_family;     /* address family */
    /* Following fields are implementation specific */
    char _ss_pad1[_SS_PAD1SIZE];
              /* 6 byte pad, this is to make implementation */
              /* specific pad up to alignment field that */
              /* follows explicit in the data structure */
    int64_t _ss_align;     /* field to force desired structure */
                           /* storage alignment */
    char _ss_pad2[_SS_PAD2SIZE];
              /* 112 byte pad to achieve desired size, */
              /* _SS_MAXSIZE value minus size of ss_family */
              /* __ss_pad1, __ss_align fields is 112 */
}; 

instead of 
 
struct sockaddr_storage
{
       union {
             sa_family_t stor_family;
             struct sockaddr_in s4;
             struct sockaddr_in s6;
      }sock_store;
      #define ss_family sock_store.stor_family;  
}
 
Is there a legitimate concern that this would not actually work as desired on some platforms due
to alignment issues when declared using a union?  Doesn't ANSI C guarantee that all members
of the union are at offset zero?  I seem to recall reading that someplace.  And with this definition
wouldn't it guarantee alignment on any platform without platform-specific padding like the RFC
version?
 
Regards,
 
MT

--------------------------------------------------------------------
IETF IPv6 working group mailing list
[email-masked]
Administrative Requests: https://www1.ietf.org/mailman/listinfo/ipv6
--------------------------------------------------------------------