On Sat, Nov 09, 2002 at 11:50:17AM +0900, Jun-ichiro itojun Hagino wrote:
> >>    if not, is it acceptable if we test the feature in
> >>    configure.in and use it if available?
> >I'd say so (as long as this doesn't involve peppering the code with
> >#ifdefs - if the feature *isn't* available, you still have to use the
> >EXTRACT macros),
> 
>       i was thinking about something like this:
> 
> #if GCC
> #define __ATTRIBUTE_PACKED__  __attribute__((packed))
> #else
> #define __ATTRIBUTE_PACKED__
> #endif
> 
> struct foo {
>       u_int32_t bar;
>       u_int32_t baz;
> } __ATTRIBUTE_PACKED__;

Or just use "__attribute((packed))", as "interface.h" does

        #ifndef HAVE___ATTRIBUTE__
        #define __attribute__(x)
        #endif

so that __attribute__ is no-oped out if the compiler doesn't support it.

(Yes, this breaks if there's a compiler that supports it in a
non-GCC-compatible fashion, but there's already stuff in tcpdump that
depends on __attribute__ either not existing or working as it does in
GCC.)

Presumably then you'd do

        #if defined(LBL_ALIGN) && !defined(HAVE___ATTRIBUTE__)

or something such as that in "extract.h", so that raw "ntohs()" and
"ntohl()" will be used if either

        1) the platform supports efficient unaligned memory accesses
           (LBL_ALIGN isn't defined)

or

        2) the platform supports __attribute__((packed)) so that the
           compiler will generate reasonably efficient code to fetch
           unaligned stuff

and then convert references to use the EXTRACT_ macros.

> >although note that "__attribute((packed))", at least
> >according to the GCC 3.2 manual:
> >
> >     
>http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html#Variable%20Attributes
> >
> >changes the layout of the structure, so you'd have to add padding to
> >structures that lack it.
> 
>       if they don't have padding, they do not work right even now.

I.e., a structure

        struct foo {
                u_int32_t       a;
                u_int8_t        b;
                u_int32_t       c;
        };

won't work as a packet format description - you have to use

        struct foo {
                u_int32_t       a;
                u_int8_t        b;
                u_int8_t        pad[3];
                u_int32_t       c;
        };

?  If so, are there any structures of the sort that won't work?
-
This is the TCPDUMP workers list. It is archived at
http://www.tcpdump.org/lists/workers/index.html
To unsubscribe use mailto:tcpdump-workers-request@;tcpdump.org?body=unsubscribe

Reply via email to