xref: /dflybsd-src/contrib/tcpdump/extract.h (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
141c99275SPeter Avalos /*
241c99275SPeter Avalos  * Copyright (c) 1992, 1993, 1994, 1995, 1996
341c99275SPeter Avalos  *	The Regents of the University of California.  All rights reserved.
441c99275SPeter Avalos  *
541c99275SPeter Avalos  * Redistribution and use in source and binary forms, with or without
641c99275SPeter Avalos  * modification, are permitted provided that: (1) source code distributions
741c99275SPeter Avalos  * retain the above copyright notice and this paragraph in its entirety, (2)
841c99275SPeter Avalos  * distributions including binary code include the above copyright notice and
941c99275SPeter Avalos  * this paragraph in its entirety in the documentation or other materials
1041c99275SPeter Avalos  * provided with the distribution, and (3) all advertising materials mentioning
1141c99275SPeter Avalos  * features or use of this software display the following acknowledgement:
1241c99275SPeter Avalos  * ``This product includes software developed by the University of California,
1341c99275SPeter Avalos  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1441c99275SPeter Avalos  * the University nor the names of its contributors may be used to endorse
1541c99275SPeter Avalos  * or promote products derived from this software without specific prior
1641c99275SPeter Avalos  * written permission.
1741c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1841c99275SPeter Avalos  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1941c99275SPeter Avalos  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2041c99275SPeter Avalos  */
2141c99275SPeter Avalos 
22*ed775ee7SAntonio Huete Jimenez #ifndef EXTRACT_H
23*ed775ee7SAntonio Huete Jimenez #define EXTRACT_H
24*ed775ee7SAntonio Huete Jimenez 
25*ed775ee7SAntonio Huete Jimenez #include <string.h>
26*ed775ee7SAntonio Huete Jimenez 
2741c99275SPeter Avalos /*
28*ed775ee7SAntonio Huete Jimenez  * For 8-bit values; needed to fetch a one-byte value.  Byte order
29411677aeSAaron LI  * isn't relevant, and alignment isn't an issue.
3041c99275SPeter Avalos  */
31*ed775ee7SAntonio Huete Jimenez #define EXTRACT_U_1(p)	((uint8_t)(*(p)))
32*ed775ee7SAntonio Huete Jimenez #define EXTRACT_S_1(p)	((int8_t)(*(p)))
33411677aeSAaron LI 
34411677aeSAaron LI /*
35411677aeSAaron LI  * Inline functions or macros to extract possibly-unaligned big-endian
36411677aeSAaron LI  * integral values.
37411677aeSAaron LI  */
38411677aeSAaron LI #include "funcattrs.h"
39*ed775ee7SAntonio Huete Jimenez #include "netdissect.h"
40411677aeSAaron LI 
41411677aeSAaron LI /*
42411677aeSAaron LI  * If we have versions of GCC or Clang that support an __attribute__
43411677aeSAaron LI  * to say "if we're building with unsigned behavior sanitization,
44411677aeSAaron LI  * don't complain about undefined behavior in this function", we
45411677aeSAaron LI  * label these functions with that attribute - we *know* it's undefined
46411677aeSAaron LI  * in the C standard, but we *also* know it does what we want with
47411677aeSAaron LI  * the ISA we're targeting and the compiler we're using.
48411677aeSAaron LI  *
49411677aeSAaron LI  * For GCC 4.9.0 and later, we use __attribute__((no_sanitize_undefined));
50411677aeSAaron LI  * pre-5.0 GCC doesn't have __has_attribute, and I'm not sure whether
51411677aeSAaron LI  * GCC or Clang first had __attribute__((no_sanitize(XXX)).
52411677aeSAaron LI  *
53411677aeSAaron LI  * For Clang, we check for __attribute__((no_sanitize(XXX)) with
54411677aeSAaron LI  * __has_attribute, as there are versions of Clang that support
55411677aeSAaron LI  * __attribute__((no_sanitize("undefined")) but don't support
56411677aeSAaron LI  * __attribute__((no_sanitize_undefined)).
57411677aeSAaron LI  *
58411677aeSAaron LI  * We define this here, rather than in funcattrs.h, because we
59411677aeSAaron LI  * only want it used here, we don't want it to be broadly used.
60411677aeSAaron LI  * (Any printer will get this defined, but this should at least
61411677aeSAaron LI  * make it harder for people to find.)
62411677aeSAaron LI  */
63411677aeSAaron LI #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 409)
64411677aeSAaron LI #define UNALIGNED_OK	__attribute__((no_sanitize_undefined))
65411677aeSAaron LI #elif __has_attribute(no_sanitize)
66411677aeSAaron LI #define UNALIGNED_OK	__attribute__((no_sanitize("undefined")))
67411677aeSAaron LI #else
68411677aeSAaron LI #define UNALIGNED_OK
69411677aeSAaron LI #endif
70411677aeSAaron LI 
71*ed775ee7SAntonio Huete Jimenez #if (defined(__i386__) || defined(_M_IX86) || defined(__X86__) || defined(__x86_64__) || defined(_M_X64)) || \
72*ed775ee7SAntonio Huete Jimenez     (defined(__m68k__) && (!defined(__mc68000__) && !defined(__mc68010__))) || \
73*ed775ee7SAntonio Huete Jimenez     (defined(__ppc__) || defined(__ppc64__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PPC64)) || \
74*ed775ee7SAntonio Huete Jimenez     (defined(__s390__) || defined(__s390x__) || defined(__zarch__))
7541c99275SPeter Avalos /*
76*ed775ee7SAntonio Huete Jimenez  * The processor natively handles unaligned loads, so we can just
77*ed775ee7SAntonio Huete Jimenez  * cast the pointer and fetch through it.
78*ed775ee7SAntonio Huete Jimenez  *
79*ed775ee7SAntonio Huete Jimenez  * XXX - are those all the x86 tests we need?
80*ed775ee7SAntonio Huete Jimenez  * XXX - are those the only 68k tests we need not to generated
81*ed775ee7SAntonio Huete Jimenez  * unaligned accesses if the target is the 68000 or 68010?
82*ed775ee7SAntonio Huete Jimenez  * XXX - are there any tests we don't need, because some definitions are for
83*ed775ee7SAntonio Huete Jimenez  * compilers that also predefine the GCC symbols?
84*ed775ee7SAntonio Huete Jimenez  * XXX - do we need to test for both 32-bit and 64-bit versions of those
85*ed775ee7SAntonio Huete Jimenez  * architectures in all cases?
8641c99275SPeter Avalos  */
87*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline uint16_t
EXTRACT_BE_U_2(const void * p)88*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_U_2(const void *p)
89*ed775ee7SAntonio Huete Jimenez {
90*ed775ee7SAntonio Huete Jimenez 	return ((uint16_t)ntohs(*(const uint16_t *)(p)));
91*ed775ee7SAntonio Huete Jimenez }
92*ed775ee7SAntonio Huete Jimenez 
93*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline int16_t
EXTRACT_BE_S_2(const void * p)94*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_S_2(const void *p)
95*ed775ee7SAntonio Huete Jimenez {
96*ed775ee7SAntonio Huete Jimenez 	return ((int16_t)ntohs(*(const int16_t *)(p)));
97*ed775ee7SAntonio Huete Jimenez }
98*ed775ee7SAntonio Huete Jimenez 
99*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline uint32_t
EXTRACT_BE_U_4(const void * p)100*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_U_4(const void *p)
101*ed775ee7SAntonio Huete Jimenez {
102*ed775ee7SAntonio Huete Jimenez 	return ((uint32_t)ntohl(*(const uint32_t *)(p)));
103*ed775ee7SAntonio Huete Jimenez }
104*ed775ee7SAntonio Huete Jimenez 
105*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline int32_t
EXTRACT_BE_S_4(const void * p)106*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_S_4(const void *p)
107*ed775ee7SAntonio Huete Jimenez {
108*ed775ee7SAntonio Huete Jimenez 	return ((int32_t)ntohl(*(const int32_t *)(p)));
109*ed775ee7SAntonio Huete Jimenez }
110*ed775ee7SAntonio Huete Jimenez 
111*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline uint64_t
EXTRACT_BE_U_8(const void * p)112*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_U_8(const void *p)
113*ed775ee7SAntonio Huete Jimenez {
114*ed775ee7SAntonio Huete Jimenez 	return ((uint64_t)(((uint64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 |
115*ed775ee7SAntonio Huete Jimenez 		((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0));
116*ed775ee7SAntonio Huete Jimenez 
117*ed775ee7SAntonio Huete Jimenez }
118*ed775ee7SAntonio Huete Jimenez 
119*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline int64_t
EXTRACT_BE_S_8(const void * p)120*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_S_8(const void *p)
121*ed775ee7SAntonio Huete Jimenez {
122*ed775ee7SAntonio Huete Jimenez 	return ((int64_t)(((int64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 |
123*ed775ee7SAntonio Huete Jimenez 		((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0));
124*ed775ee7SAntonio Huete Jimenez 
125*ed775ee7SAntonio Huete Jimenez }
126411677aeSAaron LI 
12741c99275SPeter Avalos /*
128*ed775ee7SAntonio Huete Jimenez  * Extract an IPv4 address, which is in network byte order, and not
129*ed775ee7SAntonio Huete Jimenez  * necessarily aligned, and provide the result in host byte order.
130*ed775ee7SAntonio Huete Jimenez  */
131*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline uint32_t
EXTRACT_IPV4_TO_HOST_ORDER(const void * p)132*ed775ee7SAntonio Huete Jimenez EXTRACT_IPV4_TO_HOST_ORDER(const void *p)
133*ed775ee7SAntonio Huete Jimenez {
134*ed775ee7SAntonio Huete Jimenez 	return ((uint32_t)ntohl(*(const uint32_t *)(p)));
135*ed775ee7SAntonio Huete Jimenez }
136*ed775ee7SAntonio Huete Jimenez #elif ND_IS_AT_LEAST_GNUC_VERSION(2,0) && \
137*ed775ee7SAntonio Huete Jimenez     (defined(__alpha) || defined(__alpha__) || \
138*ed775ee7SAntonio Huete Jimenez      defined(__mips) || defined(__mips__))
139*ed775ee7SAntonio Huete Jimenez /*
140*ed775ee7SAntonio Huete Jimenez  * This is MIPS or Alpha, which don't natively handle unaligned loads,
141*ed775ee7SAntonio Huete Jimenez  * but which have instructions that can help when doing unaligned
142*ed775ee7SAntonio Huete Jimenez  * loads, and this is GCC 2.0 or later or a compiler that claims to
143*ed775ee7SAntonio Huete Jimenez  * be GCC 2.0 or later, which we assume that mean we have
144*ed775ee7SAntonio Huete Jimenez  * __attribute__((packed)), which we can use to convince the compiler
145*ed775ee7SAntonio Huete Jimenez  * to generate those instructions.
146411677aeSAaron LI  *
147411677aeSAaron LI  * Declare packed structures containing a uint16_t and a uint32_t,
14841c99275SPeter Avalos  * cast the pointer to point to one of those, and fetch through it;
14941c99275SPeter Avalos  * the GCC manual doesn't appear to explicitly say that
15041c99275SPeter Avalos  * __attribute__((packed)) causes the compiler to generate unaligned-safe
15141c99275SPeter Avalos  * code, but it apppears to do so.
15241c99275SPeter Avalos  *
153411677aeSAaron LI  * We do this in case the compiler can generate code using those
154411677aeSAaron LI  * instructions to do an unaligned load and pass stuff to "ntohs()" or
155*ed775ee7SAntonio Huete Jimenez  * "ntohl()", which might be better than the code to fetch the
156411677aeSAaron LI  * bytes one at a time and assemble them.  (That might not be the
157411677aeSAaron LI  * case on a little-endian platform, such as DEC's MIPS machines and
158411677aeSAaron LI  * Alpha machines, where "ntohs()" and "ntohl()" might not be done
159411677aeSAaron LI  * inline.)
160411677aeSAaron LI  *
161411677aeSAaron LI  * We do this only for specific architectures because, for example,
162411677aeSAaron LI  * at least some versions of GCC, when compiling for 64-bit SPARC,
163411677aeSAaron LI  * generate code that assumes alignment if we do this.
164411677aeSAaron LI  *
165411677aeSAaron LI  * XXX - add other architectures and compilers as possible and
166411677aeSAaron LI  * appropriate.
167411677aeSAaron LI  *
168411677aeSAaron LI  * HP's C compiler, indicated by __HP_cc being defined, supports
169411677aeSAaron LI  * "#pragma unaligned N" in version A.05.50 and later, where "N"
170411677aeSAaron LI  * specifies a number of bytes at which the typedef on the next
171411677aeSAaron LI  * line is aligned, e.g.
172411677aeSAaron LI  *
173411677aeSAaron LI  *	#pragma unalign 1
174411677aeSAaron LI  *	typedef uint16_t unaligned_uint16_t;
175411677aeSAaron LI  *
176411677aeSAaron LI  * to define unaligned_uint16_t as a 16-bit unaligned data type.
177411677aeSAaron LI  * This could be presumably used, in sufficiently recent versions of
178411677aeSAaron LI  * the compiler, with macros similar to those below.  This would be
179411677aeSAaron LI  * useful only if that compiler could generate better code for PA-RISC
180411677aeSAaron LI  * or Itanium than would be generated by a bunch of shifts-and-ORs.
181411677aeSAaron LI  *
182411677aeSAaron LI  * DEC C, indicated by __DECC being defined, has, at least on Alpha,
183411677aeSAaron LI  * an __unaligned qualifier that can be applied to pointers to get the
184411677aeSAaron LI  * compiler to generate code that does unaligned loads and stores when
185411677aeSAaron LI  * dereferencing the pointer in question.
186411677aeSAaron LI  *
187411677aeSAaron LI  * XXX - what if the native C compiler doesn't support
188411677aeSAaron LI  * __attribute__((packed))?  How can we get it to generate unaligned
189411677aeSAaron LI  * accesses for *specific* items?
19041c99275SPeter Avalos  */
19141c99275SPeter Avalos typedef struct {
192411677aeSAaron LI 	uint16_t	val;
193411677aeSAaron LI } __attribute__((packed)) unaligned_uint16_t;
19441c99275SPeter Avalos 
19541c99275SPeter Avalos typedef struct {
196*ed775ee7SAntonio Huete Jimenez 	int16_t		val;
197*ed775ee7SAntonio Huete Jimenez } __attribute__((packed)) unaligned_int16_t;
198*ed775ee7SAntonio Huete Jimenez 
199*ed775ee7SAntonio Huete Jimenez typedef struct {
200411677aeSAaron LI 	uint32_t	val;
201411677aeSAaron LI } __attribute__((packed)) unaligned_uint32_t;
20241c99275SPeter Avalos 
203*ed775ee7SAntonio Huete Jimenez typedef struct {
204*ed775ee7SAntonio Huete Jimenez 	int32_t		val;
205*ed775ee7SAntonio Huete Jimenez } __attribute__((packed)) unaligned_int32_t;
206*ed775ee7SAntonio Huete Jimenez 
207411677aeSAaron LI UNALIGNED_OK static inline uint16_t
EXTRACT_BE_U_2(const void * p)208*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_U_2(const void *p)
209411677aeSAaron LI {
210411677aeSAaron LI 	return ((uint16_t)ntohs(((const unaligned_uint16_t *)(p))->val));
211411677aeSAaron LI }
21241c99275SPeter Avalos 
213*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline int16_t
EXTRACT_BE_S_2(const void * p)214*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_S_2(const void *p)
215*ed775ee7SAntonio Huete Jimenez {
216*ed775ee7SAntonio Huete Jimenez 	return ((int16_t)ntohs(((const unaligned_int16_t *)(p))->val));
217*ed775ee7SAntonio Huete Jimenez }
218*ed775ee7SAntonio Huete Jimenez 
219411677aeSAaron LI UNALIGNED_OK static inline uint32_t
EXTRACT_BE_U_4(const void * p)220*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_U_4(const void *p)
221411677aeSAaron LI {
222411677aeSAaron LI 	return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val));
223411677aeSAaron LI }
224411677aeSAaron LI 
225*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline int32_t
EXTRACT_BE_S_4(const void * p)226*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_S_4(const void *p)
227*ed775ee7SAntonio Huete Jimenez {
228*ed775ee7SAntonio Huete Jimenez 	return ((int32_t)ntohl(((const unaligned_int32_t *)(p))->val));
229*ed775ee7SAntonio Huete Jimenez }
230*ed775ee7SAntonio Huete Jimenez 
231411677aeSAaron LI UNALIGNED_OK static inline uint64_t
EXTRACT_BE_U_8(const void * p)232*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_U_8(const void *p)
233411677aeSAaron LI {
234411677aeSAaron LI 	return ((uint64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
235411677aeSAaron LI 		((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0));
236411677aeSAaron LI }
237411677aeSAaron LI 
238*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline int64_t
EXTRACT_BE_S_8(const void * p)239*ed775ee7SAntonio Huete Jimenez EXTRACT_BE_S_8(const void *p)
240*ed775ee7SAntonio Huete Jimenez {
241*ed775ee7SAntonio Huete Jimenez 	return ((int64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
242*ed775ee7SAntonio Huete Jimenez 		((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0));
243*ed775ee7SAntonio Huete Jimenez }
244*ed775ee7SAntonio Huete Jimenez 
24541c99275SPeter Avalos /*
246*ed775ee7SAntonio Huete Jimenez  * Extract an IPv4 address, which is in network byte order, and not
247*ed775ee7SAntonio Huete Jimenez  * necessarily aligned, and provide the result in host byte order.
248*ed775ee7SAntonio Huete Jimenez  */
249*ed775ee7SAntonio Huete Jimenez UNALIGNED_OK static inline uint32_t
EXTRACT_IPV4_TO_HOST_ORDER(const void * p)250*ed775ee7SAntonio Huete Jimenez EXTRACT_IPV4_TO_HOST_ORDER(const void *p)
251*ed775ee7SAntonio Huete Jimenez {
252*ed775ee7SAntonio Huete Jimenez 	return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val));
253*ed775ee7SAntonio Huete Jimenez }
254*ed775ee7SAntonio Huete Jimenez #else
255*ed775ee7SAntonio Huete Jimenez /*
256*ed775ee7SAntonio Huete Jimenez  * This architecture doesn't natively support unaligned loads, and either
257*ed775ee7SAntonio Huete Jimenez  * this isn't a GCC-compatible compiler, we don't have __attribute__,
258411677aeSAaron LI  * or we do but we don't know of any better way with this instruction
259411677aeSAaron LI  * set to do unaligned loads, so do unaligned loads of big-endian
26041c99275SPeter Avalos  * quantities the hard way - fetch the bytes one at a time and
26141c99275SPeter Avalos  * assemble them.
262*ed775ee7SAntonio Huete Jimenez  *
263*ed775ee7SAntonio Huete Jimenez  * XXX - ARM is a special case.  ARMv1 through ARMv5 didn't suppory
264*ed775ee7SAntonio Huete Jimenez  * unaligned loads; ARMv6 and later support it *but* have a bit in
265*ed775ee7SAntonio Huete Jimenez  * the system control register that the OS can set and that causes
266*ed775ee7SAntonio Huete Jimenez  * unaligned loads to fault rather than succeeding.
267*ed775ee7SAntonio Huete Jimenez  *
268*ed775ee7SAntonio Huete Jimenez  * At least some OSes may set that flag, so we do *not* treat ARM
269*ed775ee7SAntonio Huete Jimenez  * as supporting unaligned loads.  If your OS supports them on ARM,
270*ed775ee7SAntonio Huete Jimenez  * and you want to use them, please update the tests in the #if above
271*ed775ee7SAntonio Huete Jimenez  * to check for ARM *and* for your OS.
27241c99275SPeter Avalos  */
273*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_2(p) \
274411677aeSAaron LI 	((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
275411677aeSAaron LI 	            ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
276*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_2(p) \
277*ed775ee7SAntonio Huete Jimenez 	((int16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
278*ed775ee7SAntonio Huete Jimenez 	           ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
279*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_4(p) \
280411677aeSAaron LI 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
281411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
282411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
283411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
284*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_4(p) \
285*ed775ee7SAntonio Huete Jimenez 	((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
286*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
287*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
288*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
289*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_8(p) \
290411677aeSAaron LI 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
291411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
292411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
293411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
294411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
295411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
296411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
297411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
298*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_8(p) \
299*ed775ee7SAntonio Huete Jimenez 	((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
300*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
301*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
302*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
303*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
304*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
305*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
306*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
307*ed775ee7SAntonio Huete Jimenez 
30841c99275SPeter Avalos /*
309*ed775ee7SAntonio Huete Jimenez  * Extract an IPv4 address, which is in network byte order, and not
310*ed775ee7SAntonio Huete Jimenez  * necessarily aligned, and provide the result in host byte order.
31141c99275SPeter Avalos  */
312*ed775ee7SAntonio Huete Jimenez #define EXTRACT_IPV4_TO_HOST_ORDER(p) \
313*ed775ee7SAntonio Huete Jimenez 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
314*ed775ee7SAntonio Huete Jimenez 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
315*ed775ee7SAntonio Huete Jimenez 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
316*ed775ee7SAntonio Huete Jimenez 	            ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
317*ed775ee7SAntonio Huete Jimenez #endif /* unaligned access checks */
318*ed775ee7SAntonio Huete Jimenez 
319*ed775ee7SAntonio Huete Jimenez /*
320*ed775ee7SAntonio Huete Jimenez  * Extract numerical values in *host* byte order.  (Some metadata
321*ed775ee7SAntonio Huete Jimenez  * headers are in the byte order of the host that wrote the file,
322*ed775ee7SAntonio Huete Jimenez  * and libpcap translate them to the byte order of the host
323*ed775ee7SAntonio Huete Jimenez  * reading the file.  This means that if a program on that host
324*ed775ee7SAntonio Huete Jimenez  * reads with libpcap and writes to a new file, the new file will
325*ed775ee7SAntonio Huete Jimenez  * be written in the byte order of the host writing the file.  Thus,
326*ed775ee7SAntonio Huete Jimenez  * the magic number in pcap files and byte-order magic in pcapng
327*ed775ee7SAntonio Huete Jimenez  * files can be used to determine the byte order in those metadata
328*ed775ee7SAntonio Huete Jimenez  * headers.)
329*ed775ee7SAntonio Huete Jimenez  *
330*ed775ee7SAntonio Huete Jimenez  * XXX - on platforms that can do unaligned accesses, just cast and
331*ed775ee7SAntonio Huete Jimenez  * dereference the pointer.
332*ed775ee7SAntonio Huete Jimenez  */
333*ed775ee7SAntonio Huete Jimenez static inline uint16_t
EXTRACT_HE_U_2(const void * p)334*ed775ee7SAntonio Huete Jimenez EXTRACT_HE_U_2(const void *p)
335411677aeSAaron LI {
336*ed775ee7SAntonio Huete Jimenez 	uint16_t val;
337*ed775ee7SAntonio Huete Jimenez 
338*ed775ee7SAntonio Huete Jimenez 	UNALIGNED_MEMCPY(&val, p, sizeof(uint16_t));
339*ed775ee7SAntonio Huete Jimenez 	return val;
340411677aeSAaron LI }
341411677aeSAaron LI 
342*ed775ee7SAntonio Huete Jimenez static inline int16_t
EXTRACT_HE_S_2(const void * p)343*ed775ee7SAntonio Huete Jimenez EXTRACT_HE_S_2(const void *p)
344411677aeSAaron LI {
345*ed775ee7SAntonio Huete Jimenez 	int16_t val;
346*ed775ee7SAntonio Huete Jimenez 
347*ed775ee7SAntonio Huete Jimenez 	UNALIGNED_MEMCPY(&val, p, sizeof(int16_t));
348*ed775ee7SAntonio Huete Jimenez 	return val;
349411677aeSAaron LI }
350411677aeSAaron LI 
351*ed775ee7SAntonio Huete Jimenez static inline uint32_t
EXTRACT_HE_U_4(const void * p)352*ed775ee7SAntonio Huete Jimenez EXTRACT_HE_U_4(const void *p)
353411677aeSAaron LI {
354*ed775ee7SAntonio Huete Jimenez 	uint32_t val;
355411677aeSAaron LI 
356*ed775ee7SAntonio Huete Jimenez 	UNALIGNED_MEMCPY(&val, p, sizeof(uint32_t));
357*ed775ee7SAntonio Huete Jimenez 	return val;
358411677aeSAaron LI }
359411677aeSAaron LI 
360*ed775ee7SAntonio Huete Jimenez static inline int32_t
EXTRACT_HE_S_4(const void * p)361*ed775ee7SAntonio Huete Jimenez EXTRACT_HE_S_4(const void *p)
362*ed775ee7SAntonio Huete Jimenez {
363*ed775ee7SAntonio Huete Jimenez 	int32_t val;
36441c99275SPeter Avalos 
365*ed775ee7SAntonio Huete Jimenez 	UNALIGNED_MEMCPY(&val, p, sizeof(int32_t));
366*ed775ee7SAntonio Huete Jimenez 	return val;
367*ed775ee7SAntonio Huete Jimenez }
368*ed775ee7SAntonio Huete Jimenez 
369*ed775ee7SAntonio Huete Jimenez /*
370*ed775ee7SAntonio Huete Jimenez  * Extract an IPv4 address, which is in network byte order, and which
371*ed775ee7SAntonio Huete Jimenez  * is not necessarily aligned on a 4-byte boundary, and provide the
372*ed775ee7SAntonio Huete Jimenez  * result in network byte order.
373*ed775ee7SAntonio Huete Jimenez  *
374*ed775ee7SAntonio Huete Jimenez  * This works the same way regardless of the host's byte order.
375*ed775ee7SAntonio Huete Jimenez  */
376*ed775ee7SAntonio Huete Jimenez static inline uint32_t
EXTRACT_IPV4_TO_NETWORK_ORDER(const void * p)377*ed775ee7SAntonio Huete Jimenez EXTRACT_IPV4_TO_NETWORK_ORDER(const void *p)
378*ed775ee7SAntonio Huete Jimenez {
379*ed775ee7SAntonio Huete Jimenez 	uint32_t addr;
380*ed775ee7SAntonio Huete Jimenez 
381*ed775ee7SAntonio Huete Jimenez 	UNALIGNED_MEMCPY(&addr, p, sizeof(uint32_t));
382*ed775ee7SAntonio Huete Jimenez 	return addr;
383*ed775ee7SAntonio Huete Jimenez }
384*ed775ee7SAntonio Huete Jimenez 
385*ed775ee7SAntonio Huete Jimenez /*
386*ed775ee7SAntonio Huete Jimenez  * Non-power-of-2 sizes.
387*ed775ee7SAntonio Huete Jimenez  */
388*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_3(p) \
389411677aeSAaron LI 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
390411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
391411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0)))
392411677aeSAaron LI 
393*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_3(p) \
394*ed775ee7SAntonio Huete Jimenez 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
395*ed775ee7SAntonio Huete Jimenez 	  ((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
396*ed775ee7SAntonio Huete Jimenez 	             ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
397*ed775ee7SAntonio Huete Jimenez 	             ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))) : \
398*ed775ee7SAntonio Huete Jimenez 	  ((int32_t)(0xFF000000U | \
399*ed775ee7SAntonio Huete Jimenez 	             ((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
400*ed775ee7SAntonio Huete Jimenez 	             ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
401*ed775ee7SAntonio Huete Jimenez 	             ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))))
402*ed775ee7SAntonio Huete Jimenez 
403*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_5(p) \
404411677aeSAaron LI 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
405411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
406411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
407411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
408411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0)))
409411677aeSAaron LI 
410*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_5(p) \
411*ed775ee7SAntonio Huete Jimenez 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
412*ed775ee7SAntonio Huete Jimenez 	  ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
413*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
414*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
415*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
416*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))) : \
417*ed775ee7SAntonio Huete Jimenez 	  ((int64_t)(INT64_T_CONSTANT(0xFFFFFF0000000000U) | \
418*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
419*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
420*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
421*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
422*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))))
423*ed775ee7SAntonio Huete Jimenez 
424*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_6(p) \
425411677aeSAaron LI 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
426411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
427411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
428411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
429411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
430411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0)))
431411677aeSAaron LI 
432*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_6(p) \
433*ed775ee7SAntonio Huete Jimenez 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
434*ed775ee7SAntonio Huete Jimenez 	   ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
435*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
436*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
437*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
438*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
439*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))) : \
440*ed775ee7SAntonio Huete Jimenez 	  ((int64_t)(INT64_T_CONSTANT(0xFFFFFFFF00000000U) | \
441*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
442*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
443*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
444*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
445*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
446*ed775ee7SAntonio Huete Jimenez 	              ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))))
447*ed775ee7SAntonio Huete Jimenez 
448*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_U_7(p) \
449411677aeSAaron LI 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
450411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
451411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
452411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
453411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
454411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
455411677aeSAaron LI 	            ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0)))
45641c99275SPeter Avalos 
457*ed775ee7SAntonio Huete Jimenez #define EXTRACT_BE_S_7(p) \
458*ed775ee7SAntonio Huete Jimenez 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
459*ed775ee7SAntonio Huete Jimenez 	  ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
460*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
461*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
462*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
463*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
464*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
465*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))) : \
466*ed775ee7SAntonio Huete Jimenez 	    ((int64_t)(INT64_T_CONSTANT(0xFFFFFFFFFF000000U) | \
467*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
468*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
469*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
470*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
471*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
472*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
473*ed775ee7SAntonio Huete Jimenez 	             ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))))
474*ed775ee7SAntonio Huete Jimenez 
47541c99275SPeter Avalos /*
47641c99275SPeter Avalos  * Macros to extract possibly-unaligned little-endian integral values.
47741c99275SPeter Avalos  * XXX - do loads on little-endian machines that support unaligned loads?
47841c99275SPeter Avalos  */
479*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_2(p) \
480411677aeSAaron LI 	((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
481411677aeSAaron LI 	            ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
482*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_S_2(p) \
483*ed775ee7SAntonio Huete Jimenez 	((int16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
484*ed775ee7SAntonio Huete Jimenez 	           ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
485*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_4(p) \
486411677aeSAaron LI 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
487411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
488411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
489411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
490*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_S_4(p) \
491*ed775ee7SAntonio Huete Jimenez 	((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
492*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
493*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
494*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
495*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_8(p) \
496*ed775ee7SAntonio Huete Jimenez 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
497*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
498*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
499*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
500*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
501*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
502*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
503*ed775ee7SAntonio Huete Jimenez 	            ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
504*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_S_8(p) \
505*ed775ee7SAntonio Huete Jimenez 	((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
506*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
507*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
508*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
509*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
510*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
511*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
512*ed775ee7SAntonio Huete Jimenez 	           ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
513*ed775ee7SAntonio Huete Jimenez 
514*ed775ee7SAntonio Huete Jimenez /*
515*ed775ee7SAntonio Huete Jimenez  * Non-power-of-2 sizes.
516*ed775ee7SAntonio Huete Jimenez  */
517*ed775ee7SAntonio Huete Jimenez 
518*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_3(p) \
519411677aeSAaron LI 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
520411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
521411677aeSAaron LI 	            ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
522*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_S_3(p) \
523*ed775ee7SAntonio Huete Jimenez 	((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
524*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
525*ed775ee7SAntonio Huete Jimenez 	           ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
526*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_5(p) \
527*ed775ee7SAntonio Huete Jimenez 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) |	\
528*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) |	\
529*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) |	\
530*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) |	\
531*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
532*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_6(p) \
533*ed775ee7SAntonio Huete Jimenez 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) |	\
534*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) |	\
535*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) |	\
536*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) |	\
537*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) |	\
538*ed775ee7SAntonio Huete Jimenez 		    ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
539*ed775ee7SAntonio Huete Jimenez #define EXTRACT_LE_U_7(p) \
540*ed775ee7SAntonio Huete Jimenez 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) |	\
541411677aeSAaron LI 		    ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) |	\
542411677aeSAaron LI 		    ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) |	\
543411677aeSAaron LI 		    ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) |	\
544411677aeSAaron LI 		    ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) |	\
545411677aeSAaron LI 		    ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) |	\
546411677aeSAaron LI 		    ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
547411677aeSAaron LI 
548411677aeSAaron LI /*
549411677aeSAaron LI  * Macros to check the presence of the values in question.
550411677aeSAaron LI  */
551*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_1(p) ND_TTEST_LEN((p), 1)
552*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_1(p) ND_TCHECK_LEN((p), 1)
553411677aeSAaron LI 
554*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_2(p) ND_TTEST_LEN((p), 2)
555*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_2(p) ND_TCHECK_LEN((p), 2)
556411677aeSAaron LI 
557*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_3(p) ND_TTEST_LEN((p), 3)
558*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_3(p) ND_TCHECK_LEN((p), 3)
559411677aeSAaron LI 
560*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_4(p) ND_TTEST_LEN((p), 4)
561*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_4(p) ND_TCHECK_LEN((p), 4)
562411677aeSAaron LI 
563*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_5(p) ND_TTEST_LEN((p), 5)
564*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_5(p) ND_TCHECK_LEN((p), 5)
565411677aeSAaron LI 
566*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_6(p) ND_TTEST_LEN((p), 6)
567*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_6(p) ND_TCHECK_LEN((p), 6)
568411677aeSAaron LI 
569*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_7(p) ND_TTEST_LEN((p), 7)
570*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_7(p) ND_TCHECK_LEN((p), 7)
571411677aeSAaron LI 
572*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_8(p) ND_TTEST_LEN((p), 8)
573*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_8(p) ND_TCHECK_LEN((p), 8)
574411677aeSAaron LI 
575*ed775ee7SAntonio Huete Jimenez #define ND_TTEST_16(p) ND_TTEST_LEN((p), 16)
576*ed775ee7SAntonio Huete Jimenez #define ND_TCHECK_16(p) ND_TCHECK_LEN((p), 16)
577*ed775ee7SAntonio Huete Jimenez 
578*ed775ee7SAntonio Huete Jimenez static inline NORETURN void
nd_trunc_longjmp(netdissect_options * ndo)579*ed775ee7SAntonio Huete Jimenez nd_trunc_longjmp(netdissect_options *ndo)
580*ed775ee7SAntonio Huete Jimenez {
581*ed775ee7SAntonio Huete Jimenez 	longjmp(ndo->ndo_early_end, ND_TRUNCATED);
582*ed775ee7SAntonio Huete Jimenez }
583*ed775ee7SAntonio Huete Jimenez 
584*ed775ee7SAntonio Huete Jimenez /* get_u_1 and get_s_1 */
585*ed775ee7SAntonio Huete Jimenez 
586*ed775ee7SAntonio Huete Jimenez static inline uint8_t
get_u_1(netdissect_options * ndo,const u_char * p)587*ed775ee7SAntonio Huete Jimenez get_u_1(netdissect_options *ndo, const u_char *p)
588*ed775ee7SAntonio Huete Jimenez {
589*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_1(p))
590*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
591*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_U_1(p);
592*ed775ee7SAntonio Huete Jimenez }
593*ed775ee7SAntonio Huete Jimenez 
594*ed775ee7SAntonio Huete Jimenez static inline int8_t
get_s_1(netdissect_options * ndo,const u_char * p)595*ed775ee7SAntonio Huete Jimenez get_s_1(netdissect_options *ndo, const u_char *p)
596*ed775ee7SAntonio Huete Jimenez {
597*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_1(p))
598*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
599*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_S_1(p);
600*ed775ee7SAntonio Huete Jimenez }
601*ed775ee7SAntonio Huete Jimenez 
602*ed775ee7SAntonio Huete Jimenez /* get_be_u_N */
603*ed775ee7SAntonio Huete Jimenez 
604*ed775ee7SAntonio Huete Jimenez static inline uint16_t
get_be_u_2(netdissect_options * ndo,const u_char * p)605*ed775ee7SAntonio Huete Jimenez get_be_u_2(netdissect_options *ndo, const u_char *p)
606*ed775ee7SAntonio Huete Jimenez {
607*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_2(p))
608*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
609*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_2(p);
610*ed775ee7SAntonio Huete Jimenez }
611*ed775ee7SAntonio Huete Jimenez 
612*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_be_u_3(netdissect_options * ndo,const u_char * p)613*ed775ee7SAntonio Huete Jimenez get_be_u_3(netdissect_options *ndo, const u_char *p)
614*ed775ee7SAntonio Huete Jimenez {
615*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_3(p))
616*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
617*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_3(p);
618*ed775ee7SAntonio Huete Jimenez }
619*ed775ee7SAntonio Huete Jimenez 
620*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_be_u_4(netdissect_options * ndo,const u_char * p)621*ed775ee7SAntonio Huete Jimenez get_be_u_4(netdissect_options *ndo, const u_char *p)
622*ed775ee7SAntonio Huete Jimenez {
623*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
624*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
625*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_4(p);
626*ed775ee7SAntonio Huete Jimenez }
627*ed775ee7SAntonio Huete Jimenez 
628*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_be_u_5(netdissect_options * ndo,const u_char * p)629*ed775ee7SAntonio Huete Jimenez get_be_u_5(netdissect_options *ndo, const u_char *p)
630*ed775ee7SAntonio Huete Jimenez {
631*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_5(p))
632*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
633*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_5(p);
634*ed775ee7SAntonio Huete Jimenez }
635*ed775ee7SAntonio Huete Jimenez 
636*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_be_u_6(netdissect_options * ndo,const u_char * p)637*ed775ee7SAntonio Huete Jimenez get_be_u_6(netdissect_options *ndo, const u_char *p)
638*ed775ee7SAntonio Huete Jimenez {
639*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_6(p))
640*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
641*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_6(p);
642*ed775ee7SAntonio Huete Jimenez }
643*ed775ee7SAntonio Huete Jimenez 
644*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_be_u_7(netdissect_options * ndo,const u_char * p)645*ed775ee7SAntonio Huete Jimenez get_be_u_7(netdissect_options *ndo, const u_char *p)
646*ed775ee7SAntonio Huete Jimenez {
647*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_7(p))
648*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
649*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_7(p);
650*ed775ee7SAntonio Huete Jimenez }
651*ed775ee7SAntonio Huete Jimenez 
652*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_be_u_8(netdissect_options * ndo,const u_char * p)653*ed775ee7SAntonio Huete Jimenez get_be_u_8(netdissect_options *ndo, const u_char *p)
654*ed775ee7SAntonio Huete Jimenez {
655*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_8(p))
656*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
657*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_U_8(p);
658*ed775ee7SAntonio Huete Jimenez }
659*ed775ee7SAntonio Huete Jimenez 
660*ed775ee7SAntonio Huete Jimenez /* get_be_s_N  */
661*ed775ee7SAntonio Huete Jimenez 
662*ed775ee7SAntonio Huete Jimenez static inline int16_t
get_be_s_2(netdissect_options * ndo,const u_char * p)663*ed775ee7SAntonio Huete Jimenez get_be_s_2(netdissect_options *ndo, const u_char *p)
664*ed775ee7SAntonio Huete Jimenez {
665*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_2(p))
666*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
667*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_2(p);
668*ed775ee7SAntonio Huete Jimenez }
669*ed775ee7SAntonio Huete Jimenez 
670*ed775ee7SAntonio Huete Jimenez static inline int32_t
get_be_s_3(netdissect_options * ndo,const u_char * p)671*ed775ee7SAntonio Huete Jimenez get_be_s_3(netdissect_options *ndo, const u_char *p)
672*ed775ee7SAntonio Huete Jimenez {
673*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_3(p))
674*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
675*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_3(p);
676*ed775ee7SAntonio Huete Jimenez }
677*ed775ee7SAntonio Huete Jimenez 
678*ed775ee7SAntonio Huete Jimenez static inline int32_t
get_be_s_4(netdissect_options * ndo,const u_char * p)679*ed775ee7SAntonio Huete Jimenez get_be_s_4(netdissect_options *ndo, const u_char *p)
680*ed775ee7SAntonio Huete Jimenez {
681*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
682*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
683*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_4(p);
684*ed775ee7SAntonio Huete Jimenez }
685*ed775ee7SAntonio Huete Jimenez 
686*ed775ee7SAntonio Huete Jimenez static inline int64_t
get_be_s_5(netdissect_options * ndo,const u_char * p)687*ed775ee7SAntonio Huete Jimenez get_be_s_5(netdissect_options *ndo, const u_char *p)
688*ed775ee7SAntonio Huete Jimenez {
689*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_5(p))
690*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
691*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_5(p);
692*ed775ee7SAntonio Huete Jimenez }
693*ed775ee7SAntonio Huete Jimenez 
694*ed775ee7SAntonio Huete Jimenez static inline int64_t
get_be_s_6(netdissect_options * ndo,const u_char * p)695*ed775ee7SAntonio Huete Jimenez get_be_s_6(netdissect_options *ndo, const u_char *p)
696*ed775ee7SAntonio Huete Jimenez {
697*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_6(p))
698*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
699*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_6(p);
700*ed775ee7SAntonio Huete Jimenez }
701*ed775ee7SAntonio Huete Jimenez 
702*ed775ee7SAntonio Huete Jimenez static inline int64_t
get_be_s_7(netdissect_options * ndo,const u_char * p)703*ed775ee7SAntonio Huete Jimenez get_be_s_7(netdissect_options *ndo, const u_char *p)
704*ed775ee7SAntonio Huete Jimenez {
705*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_7(p))
706*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
707*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_7(p);
708*ed775ee7SAntonio Huete Jimenez }
709*ed775ee7SAntonio Huete Jimenez 
710*ed775ee7SAntonio Huete Jimenez static inline int64_t
get_be_s_8(netdissect_options * ndo,const u_char * p)711*ed775ee7SAntonio Huete Jimenez get_be_s_8(netdissect_options *ndo, const u_char *p)
712*ed775ee7SAntonio Huete Jimenez {
713*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_8(p))
714*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
715*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_BE_S_8(p);
716*ed775ee7SAntonio Huete Jimenez }
717*ed775ee7SAntonio Huete Jimenez 
718*ed775ee7SAntonio Huete Jimenez /* get_he_u_N */
719*ed775ee7SAntonio Huete Jimenez 
720*ed775ee7SAntonio Huete Jimenez static inline uint16_t
get_he_u_2(netdissect_options * ndo,const u_char * p)721*ed775ee7SAntonio Huete Jimenez get_he_u_2(netdissect_options *ndo, const u_char *p)
722*ed775ee7SAntonio Huete Jimenez {
723*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_2(p))
724*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
725*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_HE_U_2(p);
726*ed775ee7SAntonio Huete Jimenez }
727*ed775ee7SAntonio Huete Jimenez 
728*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_he_u_4(netdissect_options * ndo,const u_char * p)729*ed775ee7SAntonio Huete Jimenez get_he_u_4(netdissect_options *ndo, const u_char *p)
730*ed775ee7SAntonio Huete Jimenez {
731*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
732*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
733*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_HE_U_4(p);
734*ed775ee7SAntonio Huete Jimenez }
735*ed775ee7SAntonio Huete Jimenez 
736*ed775ee7SAntonio Huete Jimenez /* get_he_s_N */
737*ed775ee7SAntonio Huete Jimenez 
738*ed775ee7SAntonio Huete Jimenez static inline int16_t
get_he_s_2(netdissect_options * ndo,const u_char * p)739*ed775ee7SAntonio Huete Jimenez get_he_s_2(netdissect_options *ndo, const u_char *p)
740*ed775ee7SAntonio Huete Jimenez {
741*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_2(p))
742*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
743*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_HE_S_2(p);
744*ed775ee7SAntonio Huete Jimenez }
745*ed775ee7SAntonio Huete Jimenez 
746*ed775ee7SAntonio Huete Jimenez static inline int32_t
get_he_s_4(netdissect_options * ndo,const u_char * p)747*ed775ee7SAntonio Huete Jimenez get_he_s_4(netdissect_options *ndo, const u_char *p)
748*ed775ee7SAntonio Huete Jimenez {
749*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
750*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
751*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_HE_S_4(p);
752*ed775ee7SAntonio Huete Jimenez }
753*ed775ee7SAntonio Huete Jimenez 
754*ed775ee7SAntonio Huete Jimenez /* get_le_u_N */
755*ed775ee7SAntonio Huete Jimenez 
756*ed775ee7SAntonio Huete Jimenez static inline uint16_t
get_le_u_2(netdissect_options * ndo,const u_char * p)757*ed775ee7SAntonio Huete Jimenez get_le_u_2(netdissect_options *ndo, const u_char *p)
758*ed775ee7SAntonio Huete Jimenez {
759*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_2(p))
760*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
761*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_2(p);
762*ed775ee7SAntonio Huete Jimenez }
763*ed775ee7SAntonio Huete Jimenez 
764*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_le_u_3(netdissect_options * ndo,const u_char * p)765*ed775ee7SAntonio Huete Jimenez get_le_u_3(netdissect_options *ndo, const u_char *p)
766*ed775ee7SAntonio Huete Jimenez {
767*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_3(p))
768*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
769*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_3(p);
770*ed775ee7SAntonio Huete Jimenez }
771*ed775ee7SAntonio Huete Jimenez 
772*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_le_u_4(netdissect_options * ndo,const u_char * p)773*ed775ee7SAntonio Huete Jimenez get_le_u_4(netdissect_options *ndo, const u_char *p)
774*ed775ee7SAntonio Huete Jimenez {
775*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
776*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
777*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_4(p);
778*ed775ee7SAntonio Huete Jimenez }
779*ed775ee7SAntonio Huete Jimenez 
780*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_le_u_5(netdissect_options * ndo,const u_char * p)781*ed775ee7SAntonio Huete Jimenez get_le_u_5(netdissect_options *ndo, const u_char *p)
782*ed775ee7SAntonio Huete Jimenez {
783*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_5(p))
784*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
785*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_5(p);
786*ed775ee7SAntonio Huete Jimenez }
787*ed775ee7SAntonio Huete Jimenez 
788*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_le_u_6(netdissect_options * ndo,const u_char * p)789*ed775ee7SAntonio Huete Jimenez get_le_u_6(netdissect_options *ndo, const u_char *p)
790*ed775ee7SAntonio Huete Jimenez {
791*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_6(p))
792*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
793*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_6(p);
794*ed775ee7SAntonio Huete Jimenez }
795*ed775ee7SAntonio Huete Jimenez 
796*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_le_u_7(netdissect_options * ndo,const u_char * p)797*ed775ee7SAntonio Huete Jimenez get_le_u_7(netdissect_options *ndo, const u_char *p)
798*ed775ee7SAntonio Huete Jimenez {
799*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_7(p))
800*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
801*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_7(p);
802*ed775ee7SAntonio Huete Jimenez }
803*ed775ee7SAntonio Huete Jimenez 
804*ed775ee7SAntonio Huete Jimenez static inline uint64_t
get_le_u_8(netdissect_options * ndo,const u_char * p)805*ed775ee7SAntonio Huete Jimenez get_le_u_8(netdissect_options *ndo, const u_char *p)
806*ed775ee7SAntonio Huete Jimenez {
807*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_8(p))
808*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
809*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_U_8(p);
810*ed775ee7SAntonio Huete Jimenez }
811*ed775ee7SAntonio Huete Jimenez 
812*ed775ee7SAntonio Huete Jimenez /* get_le_s_N */
813*ed775ee7SAntonio Huete Jimenez 
814*ed775ee7SAntonio Huete Jimenez static inline int16_t
get_le_s_2(netdissect_options * ndo,const u_char * p)815*ed775ee7SAntonio Huete Jimenez get_le_s_2(netdissect_options *ndo, const u_char *p)
816*ed775ee7SAntonio Huete Jimenez {
817*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_2(p))
818*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
819*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_S_2(p);
820*ed775ee7SAntonio Huete Jimenez }
821*ed775ee7SAntonio Huete Jimenez 
822*ed775ee7SAntonio Huete Jimenez static inline int32_t
get_le_s_3(netdissect_options * ndo,const u_char * p)823*ed775ee7SAntonio Huete Jimenez get_le_s_3(netdissect_options *ndo, const u_char *p)
824*ed775ee7SAntonio Huete Jimenez {
825*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_3(p))
826*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
827*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_S_3(p);
828*ed775ee7SAntonio Huete Jimenez }
829*ed775ee7SAntonio Huete Jimenez 
830*ed775ee7SAntonio Huete Jimenez static inline int32_t
get_le_s_4(netdissect_options * ndo,const u_char * p)831*ed775ee7SAntonio Huete Jimenez get_le_s_4(netdissect_options *ndo, const u_char *p)
832*ed775ee7SAntonio Huete Jimenez {
833*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
834*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
835*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_S_4(p);
836*ed775ee7SAntonio Huete Jimenez }
837*ed775ee7SAntonio Huete Jimenez 
838*ed775ee7SAntonio Huete Jimenez static inline int64_t
get_le_s_8(netdissect_options * ndo,const u_char * p)839*ed775ee7SAntonio Huete Jimenez get_le_s_8(netdissect_options *ndo, const u_char *p)
840*ed775ee7SAntonio Huete Jimenez {
841*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_8(p))
842*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
843*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_LE_S_8(p);
844*ed775ee7SAntonio Huete Jimenez }
845*ed775ee7SAntonio Huete Jimenez 
846*ed775ee7SAntonio Huete Jimenez /* get_ipv4_to_{host|network]_order */
847*ed775ee7SAntonio Huete Jimenez 
848*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_ipv4_to_host_order(netdissect_options * ndo,const u_char * p)849*ed775ee7SAntonio Huete Jimenez get_ipv4_to_host_order(netdissect_options *ndo, const u_char *p)
850*ed775ee7SAntonio Huete Jimenez {
851*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
852*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
853*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_IPV4_TO_HOST_ORDER(p);
854*ed775ee7SAntonio Huete Jimenez }
855*ed775ee7SAntonio Huete Jimenez 
856*ed775ee7SAntonio Huete Jimenez static inline uint32_t
get_ipv4_to_network_order(netdissect_options * ndo,const u_char * p)857*ed775ee7SAntonio Huete Jimenez get_ipv4_to_network_order(netdissect_options *ndo, const u_char *p)
858*ed775ee7SAntonio Huete Jimenez {
859*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_4(p))
860*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
861*ed775ee7SAntonio Huete Jimenez 	return EXTRACT_IPV4_TO_NETWORK_ORDER(p);
862*ed775ee7SAntonio Huete Jimenez }
863*ed775ee7SAntonio Huete Jimenez 
864*ed775ee7SAntonio Huete Jimenez static inline void
get_cpy_bytes(netdissect_options * ndo,u_char * dst,const u_char * p,size_t len)865*ed775ee7SAntonio Huete Jimenez get_cpy_bytes(netdissect_options *ndo, u_char *dst, const u_char *p, size_t len)
866*ed775ee7SAntonio Huete Jimenez {
867*ed775ee7SAntonio Huete Jimenez 	if (!ND_TTEST_LEN(p, len))
868*ed775ee7SAntonio Huete Jimenez 		nd_trunc_longjmp(ndo);
869*ed775ee7SAntonio Huete Jimenez 	UNALIGNED_MEMCPY(dst, p, len);
870*ed775ee7SAntonio Huete Jimenez }
871*ed775ee7SAntonio Huete Jimenez 
872*ed775ee7SAntonio Huete Jimenez #define GET_U_1(p) get_u_1(ndo, (const u_char *)(p))
873*ed775ee7SAntonio Huete Jimenez #define GET_S_1(p) get_s_1(ndo, (const u_char *)(p))
874*ed775ee7SAntonio Huete Jimenez 
875*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_2(p) get_be_u_2(ndo, (const u_char *)(p))
876*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_3(p) get_be_u_3(ndo, (const u_char *)(p))
877*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_4(p) get_be_u_4(ndo, (const u_char *)(p))
878*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_5(p) get_be_u_5(ndo, (const u_char *)(p))
879*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_6(p) get_be_u_6(ndo, (const u_char *)(p))
880*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_7(p) get_be_u_7(ndo, (const u_char *)(p))
881*ed775ee7SAntonio Huete Jimenez #define GET_BE_U_8(p) get_be_u_8(ndo, (const u_char *)(p))
882*ed775ee7SAntonio Huete Jimenez 
883*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_2(p) get_be_s_2(ndo, (const u_char *)(p))
884*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_3(p) get_be_s_3(ndo, (const u_char *)(p))
885*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_4(p) get_be_s_4(ndo, (const u_char *)(p))
886*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_5(p) get_be_s_5(ndo, (const u_char *)(p))
887*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_6(p) get_be_s_6(ndo, (const u_char *)(p))
888*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_7(p) get_be_s_7(ndo, (const u_char *)(p))
889*ed775ee7SAntonio Huete Jimenez #define GET_BE_S_8(p) get_be_s_8(ndo, (const u_char *)(p))
890*ed775ee7SAntonio Huete Jimenez 
891*ed775ee7SAntonio Huete Jimenez #define GET_HE_U_2(p) get_he_u_2(ndo, (const u_char *)(p))
892*ed775ee7SAntonio Huete Jimenez #define GET_HE_U_4(p) get_he_u_4(ndo, (const u_char *)(p))
893*ed775ee7SAntonio Huete Jimenez 
894*ed775ee7SAntonio Huete Jimenez #define GET_HE_S_2(p) get_he_s_2(ndo, (const u_char *)(p))
895*ed775ee7SAntonio Huete Jimenez #define GET_HE_S_4(p) get_he_s_4(ndo, (const u_char *)(p))
896*ed775ee7SAntonio Huete Jimenez 
897*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_2(p) get_le_u_2(ndo, (const u_char *)(p))
898*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_3(p) get_le_u_3(ndo, (const u_char *)(p))
899*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_4(p) get_le_u_4(ndo, (const u_char *)(p))
900*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_5(p) get_le_u_5(ndo, (const u_char *)(p))
901*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_6(p) get_le_u_6(ndo, (const u_char *)(p))
902*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_7(p) get_le_u_7(ndo, (const u_char *)(p))
903*ed775ee7SAntonio Huete Jimenez #define GET_LE_U_8(p) get_le_u_8(ndo, (const u_char *)(p))
904*ed775ee7SAntonio Huete Jimenez 
905*ed775ee7SAntonio Huete Jimenez #define GET_LE_S_2(p) get_le_s_2(ndo, (const u_char *)(p))
906*ed775ee7SAntonio Huete Jimenez #define GET_LE_S_3(p) get_le_s_3(ndo, (const u_char *)(p))
907*ed775ee7SAntonio Huete Jimenez #define GET_LE_S_4(p) get_le_s_4(ndo, (const u_char *)(p))
908*ed775ee7SAntonio Huete Jimenez #define GET_LE_S_8(p) get_le_s_8(ndo, (const u_char *)(p))
909*ed775ee7SAntonio Huete Jimenez 
910*ed775ee7SAntonio Huete Jimenez #define GET_IPV4_TO_HOST_ORDER(p) get_ipv4_to_host_order(ndo, (const u_char *)(p))
911*ed775ee7SAntonio Huete Jimenez #define GET_IPV4_TO_NETWORK_ORDER(p) get_ipv4_to_network_order(ndo, (const u_char *)(p))
912*ed775ee7SAntonio Huete Jimenez 
913*ed775ee7SAntonio Huete Jimenez #define GET_CPY_BYTES(dst, p, len) get_cpy_bytes(ndo, (u_char *)(dst), (const u_char *)(p), len)
914*ed775ee7SAntonio Huete Jimenez 
915*ed775ee7SAntonio Huete Jimenez #endif /* EXTRACT_H */
916