In message: <86sk2m1hsj....@ds4.des.no>
            Dag-Erling Smørgrav <d...@des.no> writes:
: "M. Warner Losh" <i...@bsdimp.com> writes:
: > /*
: >  * Macros to cast a struct sockaddr, or parts thereof.
: >  * On architectures with strict alignment requirements, the compiler
: >  * can bogusly warn about alignment problems since its static analysis
: >  * is insufficient for it to know that with the APIs used, there
: >  * really is no alignment issue.
: >  */
: 
: That's a bit harsh on the compiler, don't you think?  It never pays to
: hurt the compiler's feelings :)

/*
 * Macros to cast a struct sockaddr, or parts thereof.  struct
 * sockaddr's alginment is loose to later be cast to a sockaddr_in or
 * sockaddr_in6.  On architectures with strict alignment requirements,
 * this leads to compiler warnings because the compiler doesn't know
 * the ABI guarantees proper alignment.
 */

But this leads me to think that the right fix might be:

/*
 * Structure used by kernel to store most
 * addresses.
 */
struct sockaddr {
        unsigned char   sa_len;         /* total length */
        sa_family_t     sa_family;      /* address family */
        char            sa_data[14];    /* actually longer; address value */
} __aligned(4);

since that's what the ABI defines....

: > : @@ -2410,8 +2419,8 @@
: > :                           }
: > :                           reject = 0;
: > :                           for (j = 0; j < 16; j += 4) {
: > : -                                 if ((*(u_int32_t 
*)&sin6->sin6_addr.s6_addr[j] & *(u_int32_t *)&m6p->sin6_addr.s6_addr[j])
: > : -                                     != *(u_int32_t 
*)&a6p->sin6_addr.s6_addr[j]) {
: > : +                                 if 
((UINT32_CAST(sin6->sin6_addr.s6_addr[j]) & 
UINT32_CAST(m6p->sin6_addr.s6_addr[j]))
: > : +                                     != 
UINT32_CAST(a6p->sin6_addr.s6_addr[j])) {
: > :                                           ++reject;
: > :                                           break;
: > :                                   }
: > : 
: > : 
: >
: > Why 16 and 4 here?  What's so magical about them?
: 
: 4 = bytes in a uint32_t, 16 = bytes in an ipv6 address.

Isn't that better served by 'sizeof(uint32_t)' and
'sizeof(ipv6_addr_t)'?

Warner
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to