diff options
author | guy <guy> | 2002-12-11 07:13:49 +0000 |
---|---|---|
committer | guy <guy> | 2002-12-11 07:13:49 +0000 |
commit | fcc82f451d3e51fdf636abbf927edb287bada0e0 (patch) | |
tree | 938119171c0d1eb45c66c2f576b95293f04f468b /print-frag6.c | |
parent | 3a4254f5c662637cf669ff66b941240d7e456d6d (diff) | |
download | tcpdump-fcc82f451d3e51fdf636abbf927edb287bada0e0.tar.gz |
The "__attribute__((packed))" tag on structures causes some files not to
compile with Sun C, as "interface.h" isn't being included before the
structures are being declared.
Furthermore, in the files that Sun C *can* compile, it doesn't cause Sun
C to generate code that's safe with unaligned accesses, as
"__attribute__" is defined as a do-nothing macro with compilers that
don't support it.
Therefore, we get rid of that tag on the structures to which it was
added, and instead use "EXTRACT_16BIT()" and "EXTRACT_32BIT()" to fetch
16-bit and 32-bit big-endian quantities from packets. We also fix some
other references to multi-byte quantities to get rid of code that tries
to do unaligned loads on platforms that don't support them.
We also throw in a hack that makes those macros use
"__attribute__((packed))" on structures containing only one 16-bit or
32-bit integer to get the compiler to generate unaligned-safe code
rather than doing it by hand. (GCC on SPARC produces the same code that
doing it by hand does; I don't know if GCC on any other big-endian
strict-alignment processor generates better code for that case. On
little-endian processors, as "ntohs()" and "ntohl()" might be functions,
that might actually produce worse code.)
Fix some places to use "%u" rather than "%d" to print unsigned
quantities.
Diffstat (limited to 'print-frag6.c')
-rw-r--r-- | print-frag6.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/print-frag6.c b/print-frag6.c index 4e5309e1..c3cbe2f5 100644 --- a/print-frag6.c +++ b/print-frag6.c @@ -21,7 +21,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-frag6.c,v 1.14 2002-08-01 08:53:07 risso Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/print-frag6.c,v 1.15 2002-12-11 07:14:00 guy Exp $"; #endif #ifdef HAVE_CONFIG_H @@ -38,6 +38,7 @@ static const char rcsid[] = #include "interface.h" #include "addrtoname.h" +#include "extract.h" int frag6_print(register const u_char *bp, register const u_char *bp2) @@ -56,20 +57,20 @@ frag6_print(register const u_char *bp, register const u_char *bp2) if (vflag) { printf("frag (0x%08x:%d|%ld)", - (u_int32_t)ntohl(dp->ip6f_ident), - ntohs(dp->ip6f_offlg & IP6F_OFF_MASK), - sizeof(struct ip6_hdr) + ntohs(ip6->ip6_plen) - + EXTRACT_32BITS(&dp->ip6f_ident), + EXTRACT_16BITS(&dp->ip6f_offlg & IP6F_OFF_MASK), + sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) - (long)(bp - bp2) - sizeof(struct ip6_frag)); } else { printf("frag (%d|%ld)", - ntohs(dp->ip6f_offlg & IP6F_OFF_MASK), - sizeof(struct ip6_hdr) + ntohs(ip6->ip6_plen) - + EXTRACT_16BITS(&dp->ip6f_offlg & IP6F_OFF_MASK), + sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) - (long)(bp - bp2) - sizeof(struct ip6_frag)); } #if 1 /* it is meaningless to decode non-first fragment */ - if (ntohs(dp->ip6f_offlg & IP6F_OFF_MASK) != 0) + if (EXTRACT_16BITS(&dp->ip6f_offlg & IP6F_OFF_MASK) != 0) return 65535; else #endif |