summaryrefslogtreecommitdiff
path: root/extract.h
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2014-02-15 20:37:28 -0800
committerGuy Harris <guy@alum.mit.edu>2014-02-15 20:37:28 -0800
commitf5e2e1a4a523dde5afbcd73ec3999c0093605d36 (patch)
tree17898a478270e4e1eaa53f60972206433534230c /extract.h
parent2c2d923201145ab633c8492126c2844b0e131730 (diff)
downloadtcpdump-f5e2e1a4a523dde5afbcd73ec3999c0093605d36.tar.gz
Add {40,48,56}-bit big-endian extract macros and use them for DCCP ACKs.
Add macros to, given an octet pointer, extract 40-bit, 48-bit, and 56-bit big-endian numbers from the location pointed to by that pointer, and use them when extracting ACK numbers from DCCP packets. This fixes problems on big-endian(!) machines.
Diffstat (limited to 'extract.h')
-rw-r--r--extract.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/extract.h b/extract.h
index 4dfbaae3..fe69bbcc 100644
--- a/extract.h
+++ b/extract.h
@@ -165,6 +165,30 @@ EXTRACT_64BITS(const void *p)
(u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
(u_int32_t)*((const u_int8_t *)(p) + 2)))
+#define EXTRACT_40BITS(p) \
+ ((u_int64_t)((u_int64_t)*((const u_int8_t *)(p) + 0) << 32 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 1) << 24 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 2) << 16 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 3) << 8 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 4)))
+
+#define EXTRACT_48BITS(p) \
+ ((u_int64_t)((u_int64_t)*((const u_int8_t *)(p) + 0) << 40 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 1) << 32 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 2) << 24 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 3) << 16 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 4) << 8 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 5)))
+
+#define EXTRACT_56BITS(p) \
+ ((u_int64_t)((u_int64_t)*((const u_int8_t *)(p) + 0) << 48 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 1) << 40 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 2) << 32 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 3) << 24 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 4) << 16 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 5) << 8 | \
+ (u_int64_t)*((const u_int8_t *)(p) + 6)))
+
/*
* Macros to extract possibly-unaligned little-endian integral values.
* XXX - do loads on little-endian machines that support unaligned loads?