xref: /freebsd/contrib/tcpdump/extract.h (revision 0a7e5f1f02aad2ff5fff1c60f44c6975fd07e1d9)
14edb46e9SPaul Traina /*
24edb46e9SPaul Traina  * Copyright (c) 1992, 1993, 1994, 1995, 1996
34edb46e9SPaul Traina  *	The Regents of the University of California.  All rights reserved.
44edb46e9SPaul Traina  *
54edb46e9SPaul Traina  * Redistribution and use in source and binary forms, with or without
64edb46e9SPaul Traina  * modification, are permitted provided that: (1) source code distributions
74edb46e9SPaul Traina  * retain the above copyright notice and this paragraph in its entirety, (2)
84edb46e9SPaul Traina  * distributions including binary code include the above copyright notice and
94edb46e9SPaul Traina  * this paragraph in its entirety in the documentation or other materials
104edb46e9SPaul Traina  * provided with the distribution, and (3) all advertising materials mentioning
114edb46e9SPaul Traina  * features or use of this software display the following acknowledgement:
124edb46e9SPaul Traina  * ``This product includes software developed by the University of California,
134edb46e9SPaul Traina  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
144edb46e9SPaul Traina  * the University nor the names of its contributors may be used to endorse
154edb46e9SPaul Traina  * or promote products derived from this software without specific prior
164edb46e9SPaul Traina  * written permission.
174edb46e9SPaul Traina  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
184edb46e9SPaul Traina  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
194edb46e9SPaul Traina  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
204edb46e9SPaul Traina  */
214edb46e9SPaul Traina 
22ee67461eSJoseph Mingrone #ifndef EXTRACT_H
23ee67461eSJoseph Mingrone #define EXTRACT_H
24ee67461eSJoseph Mingrone 
25ee67461eSJoseph Mingrone #include <string.h>
26ee67461eSJoseph Mingrone 
271de50e9fSSam Leffler /*
28ee67461eSJoseph Mingrone  * For 8-bit values; needed to fetch a one-byte value.  Byte order
290bff6a5aSEd Maste  * isn't relevant, and alignment isn't an issue.
301de50e9fSSam Leffler  */
31ee67461eSJoseph Mingrone #define EXTRACT_U_1(p)	((uint8_t)(*(p)))
32ee67461eSJoseph Mingrone #define EXTRACT_S_1(p)	((int8_t)(*(p)))
330bff6a5aSEd Maste 
340bff6a5aSEd Maste /*
350bff6a5aSEd Maste  * Inline functions or macros to extract possibly-unaligned big-endian
360bff6a5aSEd Maste  * integral values.
370bff6a5aSEd Maste  */
380bff6a5aSEd Maste #include "funcattrs.h"
39ee67461eSJoseph Mingrone #include "netdissect.h"
40ee67461eSJoseph Mingrone #include "diag-control.h"
410bff6a5aSEd Maste 
420bff6a5aSEd Maste /*
430bff6a5aSEd Maste  * If we have versions of GCC or Clang that support an __attribute__
440bff6a5aSEd Maste  * to say "if we're building with unsigned behavior sanitization,
450bff6a5aSEd Maste  * don't complain about undefined behavior in this function", we
460bff6a5aSEd Maste  * label these functions with that attribute - we *know* it's undefined
470bff6a5aSEd Maste  * in the C standard, but we *also* know it does what we want with
480bff6a5aSEd Maste  * the ISA we're targeting and the compiler we're using.
490bff6a5aSEd Maste  *
500bff6a5aSEd Maste  * For GCC 4.9.0 and later, we use __attribute__((no_sanitize_undefined));
510bff6a5aSEd Maste  * pre-5.0 GCC doesn't have __has_attribute, and I'm not sure whether
520bff6a5aSEd Maste  * GCC or Clang first had __attribute__((no_sanitize(XXX)).
530bff6a5aSEd Maste  *
540bff6a5aSEd Maste  * For Clang, we check for __attribute__((no_sanitize(XXX)) with
550bff6a5aSEd Maste  * __has_attribute, as there are versions of Clang that support
560bff6a5aSEd Maste  * __attribute__((no_sanitize("undefined")) but don't support
570bff6a5aSEd Maste  * __attribute__((no_sanitize_undefined)).
580bff6a5aSEd Maste  *
590bff6a5aSEd Maste  * We define this here, rather than in funcattrs.h, because we
600bff6a5aSEd Maste  * only want it used here, we don't want it to be broadly used.
610bff6a5aSEd Maste  * (Any printer will get this defined, but this should at least
620bff6a5aSEd Maste  * make it harder for people to find.)
630bff6a5aSEd Maste  */
640bff6a5aSEd Maste #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 409)
650bff6a5aSEd Maste #define UNALIGNED_OK	__attribute__((no_sanitize_undefined))
660bff6a5aSEd Maste #elif __has_attribute(no_sanitize)
670bff6a5aSEd Maste #define UNALIGNED_OK	__attribute__((no_sanitize("undefined")))
680bff6a5aSEd Maste #else
690bff6a5aSEd Maste #define UNALIGNED_OK
700bff6a5aSEd Maste #endif
710bff6a5aSEd Maste 
72ee67461eSJoseph Mingrone #if (defined(__i386__) || defined(_M_IX86) || defined(__X86__) || defined(__x86_64__) || defined(_M_X64)) || \
73ee67461eSJoseph Mingrone     (defined(__m68k__) && (!defined(__mc68000__) && !defined(__mc68010__))) || \
74ee67461eSJoseph Mingrone     (defined(__ppc__) || defined(__ppc64__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PPC64)) || \
75ee67461eSJoseph Mingrone     (defined(__s390__) || defined(__s390x__) || defined(__zarch__))
765b0fe478SBruce M Simpson /*
77ee67461eSJoseph Mingrone  * The processor natively handles unaligned loads, so we can just
78ee67461eSJoseph Mingrone  * cast the pointer and fetch through it.
79ee67461eSJoseph Mingrone  *
80ee67461eSJoseph Mingrone  * XXX - are those all the x86 tests we need?
81ee67461eSJoseph Mingrone  * XXX - are those the only 68k tests we need not to generated
82ee67461eSJoseph Mingrone  * unaligned accesses if the target is the 68000 or 68010?
83ee67461eSJoseph Mingrone  * XXX - are there any tests we don't need, because some definitions are for
84ee67461eSJoseph Mingrone  * compilers that also predefine the GCC symbols?
85ee67461eSJoseph Mingrone  * XXX - do we need to test for both 32-bit and 64-bit versions of those
86ee67461eSJoseph Mingrone  * architectures in all cases?
875b0fe478SBruce M Simpson  */
88ee67461eSJoseph Mingrone UNALIGNED_OK static inline uint16_t
EXTRACT_BE_U_2(const void * p)89ee67461eSJoseph Mingrone EXTRACT_BE_U_2(const void *p)
90ee67461eSJoseph Mingrone {
91ee67461eSJoseph Mingrone 	return ((uint16_t)ntohs(*(const uint16_t *)(p)));
92ee67461eSJoseph Mingrone }
93ee67461eSJoseph Mingrone 
94ee67461eSJoseph Mingrone UNALIGNED_OK static inline int16_t
EXTRACT_BE_S_2(const void * p)95ee67461eSJoseph Mingrone EXTRACT_BE_S_2(const void *p)
96ee67461eSJoseph Mingrone {
97ee67461eSJoseph Mingrone 	return ((int16_t)ntohs(*(const int16_t *)(p)));
98ee67461eSJoseph Mingrone }
99ee67461eSJoseph Mingrone 
100ee67461eSJoseph Mingrone UNALIGNED_OK static inline uint32_t
EXTRACT_BE_U_4(const void * p)101ee67461eSJoseph Mingrone EXTRACT_BE_U_4(const void *p)
102ee67461eSJoseph Mingrone {
103ee67461eSJoseph Mingrone 	return ((uint32_t)ntohl(*(const uint32_t *)(p)));
104ee67461eSJoseph Mingrone }
105ee67461eSJoseph Mingrone 
106ee67461eSJoseph Mingrone UNALIGNED_OK static inline int32_t
EXTRACT_BE_S_4(const void * p)107ee67461eSJoseph Mingrone EXTRACT_BE_S_4(const void *p)
108ee67461eSJoseph Mingrone {
109ee67461eSJoseph Mingrone 	return ((int32_t)ntohl(*(const int32_t *)(p)));
110ee67461eSJoseph Mingrone }
111ee67461eSJoseph Mingrone 
112ee67461eSJoseph Mingrone UNALIGNED_OK static inline uint64_t
EXTRACT_BE_U_8(const void * p)113ee67461eSJoseph Mingrone EXTRACT_BE_U_8(const void *p)
114ee67461eSJoseph Mingrone {
115ee67461eSJoseph Mingrone 	return ((uint64_t)(((uint64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 |
116ee67461eSJoseph Mingrone 		((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0));
117ee67461eSJoseph Mingrone 
118ee67461eSJoseph Mingrone }
119ee67461eSJoseph Mingrone 
120ee67461eSJoseph Mingrone UNALIGNED_OK static inline int64_t
EXTRACT_BE_S_8(const void * p)121ee67461eSJoseph Mingrone EXTRACT_BE_S_8(const void *p)
122ee67461eSJoseph Mingrone {
123ee67461eSJoseph Mingrone 	return ((int64_t)(((int64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 |
124ee67461eSJoseph Mingrone 		((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0));
125ee67461eSJoseph Mingrone 
126ee67461eSJoseph Mingrone }
1273c602fabSXin LI 
1285b0fe478SBruce M Simpson /*
129ee67461eSJoseph Mingrone  * Extract an IPv4 address, which is in network byte order, and not
130ee67461eSJoseph Mingrone  * necessarily aligned, and provide the result in host byte order.
131ee67461eSJoseph Mingrone  */
132ee67461eSJoseph Mingrone UNALIGNED_OK static inline uint32_t
EXTRACT_IPV4_TO_HOST_ORDER(const void * p)133ee67461eSJoseph Mingrone EXTRACT_IPV4_TO_HOST_ORDER(const void *p)
134ee67461eSJoseph Mingrone {
135ee67461eSJoseph Mingrone 	return ((uint32_t)ntohl(*(const uint32_t *)(p)));
136ee67461eSJoseph Mingrone }
137ee67461eSJoseph Mingrone #elif ND_IS_AT_LEAST_GNUC_VERSION(2,0) && \
138ee67461eSJoseph Mingrone     (defined(__alpha) || defined(__alpha__) || \
139ee67461eSJoseph Mingrone      defined(__mips) || defined(__mips__))
140ee67461eSJoseph Mingrone /*
141ee67461eSJoseph Mingrone  * This is MIPS or Alpha, which don't natively handle unaligned loads,
142ee67461eSJoseph Mingrone  * but which have instructions that can help when doing unaligned
143ee67461eSJoseph Mingrone  * loads, and this is GCC 2.0 or later or a compiler that claims to
144ee67461eSJoseph Mingrone  * be GCC 2.0 or later, which we assume that mean we have
145ee67461eSJoseph Mingrone  * __attribute__((packed)), which we can use to convince the compiler
146ee67461eSJoseph Mingrone  * to generate those instructions.
1473c602fabSXin LI  *
1483c602fabSXin LI  * Declare packed structures containing a uint16_t and a uint32_t,
1495b0fe478SBruce M Simpson  * cast the pointer to point to one of those, and fetch through it;
1505b0fe478SBruce M Simpson  * the GCC manual doesn't appear to explicitly say that
1515b0fe478SBruce M Simpson  * __attribute__((packed)) causes the compiler to generate unaligned-safe
152ee67461eSJoseph Mingrone  * code, but it appears to do so.
1535b0fe478SBruce M Simpson  *
1543c602fabSXin LI  * We do this in case the compiler can generate code using those
1553c602fabSXin LI  * instructions to do an unaligned load and pass stuff to "ntohs()" or
156ee67461eSJoseph Mingrone  * "ntohl()", which might be better than the code to fetch the
1573c602fabSXin LI  * bytes one at a time and assemble them.  (That might not be the
1583c602fabSXin LI  * case on a little-endian platform, such as DEC's MIPS machines and
1593c602fabSXin LI  * Alpha machines, where "ntohs()" and "ntohl()" might not be done
1603c602fabSXin LI  * inline.)
1613c602fabSXin LI  *
1623c602fabSXin LI  * We do this only for specific architectures because, for example,
1633c602fabSXin LI  * at least some versions of GCC, when compiling for 64-bit SPARC,
1643c602fabSXin LI  * generate code that assumes alignment if we do this.
1653c602fabSXin LI  *
1663c602fabSXin LI  * XXX - add other architectures and compilers as possible and
1673c602fabSXin LI  * appropriate.
1683c602fabSXin LI  *
1693c602fabSXin LI  * HP's C compiler, indicated by __HP_cc being defined, supports
1703c602fabSXin LI  * "#pragma unaligned N" in version A.05.50 and later, where "N"
1713c602fabSXin LI  * specifies a number of bytes at which the typedef on the next
1723c602fabSXin LI  * line is aligned, e.g.
1733c602fabSXin LI  *
1743c602fabSXin LI  *	#pragma unalign 1
1753c602fabSXin LI  *	typedef uint16_t unaligned_uint16_t;
1763c602fabSXin LI  *
1773c602fabSXin LI  * to define unaligned_uint16_t as a 16-bit unaligned data type.
1783c602fabSXin LI  * This could be presumably used, in sufficiently recent versions of
1793c602fabSXin LI  * the compiler, with macros similar to those below.  This would be
1803c602fabSXin LI  * useful only if that compiler could generate better code for PA-RISC
1813c602fabSXin LI  * or Itanium than would be generated by a bunch of shifts-and-ORs.
1823c602fabSXin LI  *
1833c602fabSXin LI  * DEC C, indicated by __DECC being defined, has, at least on Alpha,
1843c602fabSXin LI  * an __unaligned qualifier that can be applied to pointers to get the
1853c602fabSXin LI  * compiler to generate code that does unaligned loads and stores when
1863c602fabSXin LI  * dereferencing the pointer in question.
1873c602fabSXin LI  *
1883c602fabSXin LI  * XXX - what if the native C compiler doesn't support
1893c602fabSXin LI  * __attribute__((packed))?  How can we get it to generate unaligned
1903c602fabSXin LI  * accesses for *specific* items?
1915b0fe478SBruce M Simpson  */
1925b0fe478SBruce M Simpson typedef struct {
1933c602fabSXin LI 	uint16_t	val;
1943c602fabSXin LI } __attribute__((packed)) unaligned_uint16_t;
1955b0fe478SBruce M Simpson 
1965b0fe478SBruce M Simpson typedef struct {
197ee67461eSJoseph Mingrone 	int16_t		val;
198ee67461eSJoseph Mingrone } __attribute__((packed)) unaligned_int16_t;
199ee67461eSJoseph Mingrone 
200ee67461eSJoseph Mingrone typedef struct {
2013c602fabSXin LI 	uint32_t	val;
2023c602fabSXin LI } __attribute__((packed)) unaligned_uint32_t;
2035b0fe478SBruce M Simpson 
204ee67461eSJoseph Mingrone typedef struct {
205ee67461eSJoseph Mingrone 	int32_t		val;
206ee67461eSJoseph Mingrone } __attribute__((packed)) unaligned_int32_t;
207ee67461eSJoseph Mingrone 
2080bff6a5aSEd Maste UNALIGNED_OK static inline uint16_t
EXTRACT_BE_U_2(const void * p)209ee67461eSJoseph Mingrone EXTRACT_BE_U_2(const void *p)
210340b3427SPedro F. Giffuni {
2113c602fabSXin LI 	return ((uint16_t)ntohs(((const unaligned_uint16_t *)(p))->val));
212340b3427SPedro F. Giffuni }
213340b3427SPedro F. Giffuni 
214ee67461eSJoseph Mingrone UNALIGNED_OK static inline int16_t
EXTRACT_BE_S_2(const void * p)215ee67461eSJoseph Mingrone EXTRACT_BE_S_2(const void *p)
216ee67461eSJoseph Mingrone {
217ee67461eSJoseph Mingrone 	return ((int16_t)ntohs(((const unaligned_int16_t *)(p))->val));
218ee67461eSJoseph Mingrone }
219ee67461eSJoseph Mingrone 
2200bff6a5aSEd Maste UNALIGNED_OK static inline uint32_t
EXTRACT_BE_U_4(const void * p)221ee67461eSJoseph Mingrone EXTRACT_BE_U_4(const void *p)
222340b3427SPedro F. Giffuni {
2233c602fabSXin LI 	return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val));
224340b3427SPedro F. Giffuni }
225340b3427SPedro F. Giffuni 
226ee67461eSJoseph Mingrone UNALIGNED_OK static inline int32_t
EXTRACT_BE_S_4(const void * p)227ee67461eSJoseph Mingrone EXTRACT_BE_S_4(const void *p)
228ee67461eSJoseph Mingrone {
229ee67461eSJoseph Mingrone 	return ((int32_t)ntohl(((const unaligned_int32_t *)(p))->val));
230ee67461eSJoseph Mingrone }
231ee67461eSJoseph Mingrone 
2320bff6a5aSEd Maste UNALIGNED_OK static inline uint64_t
EXTRACT_BE_U_8(const void * p)233ee67461eSJoseph Mingrone EXTRACT_BE_U_8(const void *p)
234340b3427SPedro F. Giffuni {
2353340d773SGleb Smirnoff 	return ((uint64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
2363c602fabSXin LI 		((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0));
237340b3427SPedro F. Giffuni }
2381de50e9fSSam Leffler 
239ee67461eSJoseph Mingrone UNALIGNED_OK static inline int64_t
EXTRACT_BE_S_8(const void * p)240ee67461eSJoseph Mingrone EXTRACT_BE_S_8(const void *p)
241ee67461eSJoseph Mingrone {
242ee67461eSJoseph Mingrone 	return ((int64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
243ee67461eSJoseph Mingrone 		((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0));
244ee67461eSJoseph Mingrone }
245ee67461eSJoseph Mingrone 
2465b0fe478SBruce M Simpson /*
247ee67461eSJoseph Mingrone  * Extract an IPv4 address, which is in network byte order, and not
248ee67461eSJoseph Mingrone  * necessarily aligned, and provide the result in host byte order.
249ee67461eSJoseph Mingrone  */
250ee67461eSJoseph Mingrone UNALIGNED_OK static inline uint32_t
EXTRACT_IPV4_TO_HOST_ORDER(const void * p)251ee67461eSJoseph Mingrone EXTRACT_IPV4_TO_HOST_ORDER(const void *p)
252ee67461eSJoseph Mingrone {
253ee67461eSJoseph Mingrone 	return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val));
254ee67461eSJoseph Mingrone }
255ee67461eSJoseph Mingrone #else
256ee67461eSJoseph Mingrone /*
257ee67461eSJoseph Mingrone  * This architecture doesn't natively support unaligned loads, and either
258ee67461eSJoseph Mingrone  * this isn't a GCC-compatible compiler, we don't have __attribute__,
2593c602fabSXin LI  * or we do but we don't know of any better way with this instruction
2603c602fabSXin LI  * set to do unaligned loads, so do unaligned loads of big-endian
2615b0fe478SBruce M Simpson  * quantities the hard way - fetch the bytes one at a time and
2625b0fe478SBruce M Simpson  * assemble them.
263ee67461eSJoseph Mingrone  *
264*0a7e5f1fSJoseph Mingrone  * XXX - ARM is a special case.  ARMv1 through ARMv5 didn't support
265ee67461eSJoseph Mingrone  * unaligned loads; ARMv6 and later support it *but* have a bit in
266ee67461eSJoseph Mingrone  * the system control register that the OS can set and that causes
267ee67461eSJoseph Mingrone  * unaligned loads to fault rather than succeeding.
268ee67461eSJoseph Mingrone  *
269ee67461eSJoseph Mingrone  * At least some OSes may set that flag, so we do *not* treat ARM
270ee67461eSJoseph Mingrone  * as supporting unaligned loads.  If your OS supports them on ARM,
271ee67461eSJoseph Mingrone  * and you want to use them, please update the tests in the #if above
272ee67461eSJoseph Mingrone  * to check for ARM *and* for your OS.
2735b0fe478SBruce M Simpson  */
274ee67461eSJoseph Mingrone #define EXTRACT_BE_U_2(p) \
2758bdc5a62SPatrick Kelsey 	((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
2768bdc5a62SPatrick Kelsey 	            ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
277ee67461eSJoseph Mingrone #define EXTRACT_BE_S_2(p) \
278ee67461eSJoseph Mingrone 	((int16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
279ee67461eSJoseph Mingrone 	           ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
280ee67461eSJoseph Mingrone #define EXTRACT_BE_U_4(p) \
2818bdc5a62SPatrick Kelsey 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
2828bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
2838bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
2848bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
285ee67461eSJoseph Mingrone #define EXTRACT_BE_S_4(p) \
286ee67461eSJoseph Mingrone 	((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
287ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
288ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
289ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
290ee67461eSJoseph Mingrone #define EXTRACT_BE_U_8(p) \
2918bdc5a62SPatrick Kelsey 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
2928bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
2938bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
2948bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
2958bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
2968bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
2978bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
2988bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
299ee67461eSJoseph Mingrone #define EXTRACT_BE_S_8(p) \
300ee67461eSJoseph Mingrone 	((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
301ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
302ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
303ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
304ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
305ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
306ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
307ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
308ee67461eSJoseph Mingrone 
3095b0fe478SBruce M Simpson /*
310ee67461eSJoseph Mingrone  * Extract an IPv4 address, which is in network byte order, and not
311ee67461eSJoseph Mingrone  * necessarily aligned, and provide the result in host byte order.
3125b0fe478SBruce M Simpson  */
313ee67461eSJoseph Mingrone #define EXTRACT_IPV4_TO_HOST_ORDER(p) \
314ee67461eSJoseph Mingrone 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
315ee67461eSJoseph Mingrone 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
316ee67461eSJoseph Mingrone 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
317ee67461eSJoseph Mingrone 	            ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
318ee67461eSJoseph Mingrone #endif /* unaligned access checks */
319ee67461eSJoseph Mingrone 
320ee67461eSJoseph Mingrone /*
321ee67461eSJoseph Mingrone  * Extract numerical values in *host* byte order.  (Some metadata
322ee67461eSJoseph Mingrone  * headers are in the byte order of the host that wrote the file,
323ee67461eSJoseph Mingrone  * and libpcap translate them to the byte order of the host
324ee67461eSJoseph Mingrone  * reading the file.  This means that if a program on that host
325ee67461eSJoseph Mingrone  * reads with libpcap and writes to a new file, the new file will
326ee67461eSJoseph Mingrone  * be written in the byte order of the host writing the file.  Thus,
327ee67461eSJoseph Mingrone  * the magic number in pcap files and byte-order magic in pcapng
328ee67461eSJoseph Mingrone  * files can be used to determine the byte order in those metadata
329ee67461eSJoseph Mingrone  * headers.)
330ee67461eSJoseph Mingrone  *
331ee67461eSJoseph Mingrone  * XXX - on platforms that can do unaligned accesses, just cast and
332ee67461eSJoseph Mingrone  * dereference the pointer.
333ee67461eSJoseph Mingrone  */
334ee67461eSJoseph Mingrone static inline uint16_t
EXTRACT_HE_U_2(const void * p)335ee67461eSJoseph Mingrone EXTRACT_HE_U_2(const void *p)
336340b3427SPedro F. Giffuni {
337ee67461eSJoseph Mingrone 	uint16_t val;
338ee67461eSJoseph Mingrone 
339ee67461eSJoseph Mingrone 	UNALIGNED_MEMCPY(&val, p, sizeof(uint16_t));
340ee67461eSJoseph Mingrone 	return val;
341340b3427SPedro F. Giffuni }
342340b3427SPedro F. Giffuni 
343ee67461eSJoseph Mingrone static inline int16_t
EXTRACT_HE_S_2(const void * p)344ee67461eSJoseph Mingrone EXTRACT_HE_S_2(const void *p)
345340b3427SPedro F. Giffuni {
346ee67461eSJoseph Mingrone 	int16_t val;
347ee67461eSJoseph Mingrone 
348ee67461eSJoseph Mingrone 	UNALIGNED_MEMCPY(&val, p, sizeof(int16_t));
349ee67461eSJoseph Mingrone 	return val;
350340b3427SPedro F. Giffuni }
351340b3427SPedro F. Giffuni 
352ee67461eSJoseph Mingrone static inline uint32_t
EXTRACT_HE_U_4(const void * p)353ee67461eSJoseph Mingrone EXTRACT_HE_U_4(const void *p)
354340b3427SPedro F. Giffuni {
355ee67461eSJoseph Mingrone 	uint32_t val;
356340b3427SPedro F. Giffuni 
357ee67461eSJoseph Mingrone 	UNALIGNED_MEMCPY(&val, p, sizeof(uint32_t));
358ee67461eSJoseph Mingrone 	return val;
359340b3427SPedro F. Giffuni }
360340b3427SPedro F. Giffuni 
361ee67461eSJoseph Mingrone static inline int32_t
EXTRACT_HE_S_4(const void * p)362ee67461eSJoseph Mingrone EXTRACT_HE_S_4(const void *p)
363ee67461eSJoseph Mingrone {
364ee67461eSJoseph Mingrone 	int32_t val;
3654edb46e9SPaul Traina 
366ee67461eSJoseph Mingrone 	UNALIGNED_MEMCPY(&val, p, sizeof(int32_t));
367ee67461eSJoseph Mingrone 	return val;
368ee67461eSJoseph Mingrone }
369ee67461eSJoseph Mingrone 
370ee67461eSJoseph Mingrone /*
371ee67461eSJoseph Mingrone  * Extract an IPv4 address, which is in network byte order, and which
372ee67461eSJoseph Mingrone  * is not necessarily aligned on a 4-byte boundary, and provide the
373ee67461eSJoseph Mingrone  * result in network byte order.
374ee67461eSJoseph Mingrone  *
375ee67461eSJoseph Mingrone  * This works the same way regardless of the host's byte order.
376ee67461eSJoseph Mingrone  */
377ee67461eSJoseph Mingrone static inline uint32_t
EXTRACT_IPV4_TO_NETWORK_ORDER(const void * p)378ee67461eSJoseph Mingrone EXTRACT_IPV4_TO_NETWORK_ORDER(const void *p)
379ee67461eSJoseph Mingrone {
380ee67461eSJoseph Mingrone 	uint32_t addr;
381ee67461eSJoseph Mingrone 
382ee67461eSJoseph Mingrone 	UNALIGNED_MEMCPY(&addr, p, sizeof(uint32_t));
383ee67461eSJoseph Mingrone 	return addr;
384ee67461eSJoseph Mingrone }
385ee67461eSJoseph Mingrone 
386ee67461eSJoseph Mingrone /*
387ee67461eSJoseph Mingrone  * Non-power-of-2 sizes.
388ee67461eSJoseph Mingrone  */
389ee67461eSJoseph Mingrone #define EXTRACT_BE_U_3(p) \
3908bdc5a62SPatrick Kelsey 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
3918bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
3928bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0)))
3933c602fabSXin LI 
394ee67461eSJoseph Mingrone #define EXTRACT_BE_S_3(p) \
395ee67461eSJoseph Mingrone 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
396ee67461eSJoseph Mingrone 	  ((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
397ee67461eSJoseph Mingrone 	             ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
398ee67461eSJoseph Mingrone 	             ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))) : \
399ee67461eSJoseph Mingrone 	  ((int32_t)(0xFF000000U | \
400ee67461eSJoseph Mingrone 	             ((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
401ee67461eSJoseph Mingrone 	             ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
402ee67461eSJoseph Mingrone 	             ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))))
403ee67461eSJoseph Mingrone 
404ee67461eSJoseph Mingrone #define EXTRACT_BE_U_5(p) \
4058bdc5a62SPatrick Kelsey 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
4068bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
4078bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
4088bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
4098bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0)))
4103c602fabSXin LI 
411ee67461eSJoseph Mingrone #define EXTRACT_BE_S_5(p) \
412ee67461eSJoseph Mingrone 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
413ee67461eSJoseph Mingrone 	  ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
414ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
415ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
416ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
417ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))) : \
418ee67461eSJoseph Mingrone 	  ((int64_t)(INT64_T_CONSTANT(0xFFFFFF0000000000U) | \
419ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
420ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
421ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
422ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
423ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))))
424ee67461eSJoseph Mingrone 
425ee67461eSJoseph Mingrone #define EXTRACT_BE_U_6(p) \
4268bdc5a62SPatrick Kelsey 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
4278bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
4288bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
4298bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
4308bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
4318bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0)))
4323c602fabSXin LI 
433ee67461eSJoseph Mingrone #define EXTRACT_BE_S_6(p) \
434ee67461eSJoseph Mingrone 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
435ee67461eSJoseph Mingrone 	   ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
436ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
437ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
438ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
439ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
440ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))) : \
441ee67461eSJoseph Mingrone 	  ((int64_t)(INT64_T_CONSTANT(0xFFFFFFFF00000000U) | \
442ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
443ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
444ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
445ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
446ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
447ee67461eSJoseph Mingrone 	              ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))))
448ee67461eSJoseph Mingrone 
449ee67461eSJoseph Mingrone #define EXTRACT_BE_U_7(p) \
4508bdc5a62SPatrick Kelsey 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
4518bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
4528bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
4538bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
4548bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
4558bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
4568bdc5a62SPatrick Kelsey 	            ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0)))
4574edb46e9SPaul Traina 
458ee67461eSJoseph Mingrone #define EXTRACT_BE_S_7(p) \
459ee67461eSJoseph Mingrone 	(((*((const uint8_t *)(p) + 0)) & 0x80) ? \
460ee67461eSJoseph Mingrone 	  ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
461ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
462ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
463ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
464ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
465ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
466ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))) : \
467ee67461eSJoseph Mingrone 	    ((int64_t)(INT64_T_CONSTANT(0xFFFFFFFFFF000000U) | \
468ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
469ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
470ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
471ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
472ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
473ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
474ee67461eSJoseph Mingrone 	             ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))))
475ee67461eSJoseph Mingrone 
4761de50e9fSSam Leffler /*
4771de50e9fSSam Leffler  * Macros to extract possibly-unaligned little-endian integral values.
4781de50e9fSSam Leffler  * XXX - do loads on little-endian machines that support unaligned loads?
4791de50e9fSSam Leffler  */
480ee67461eSJoseph Mingrone #define EXTRACT_LE_U_2(p) \
4818bdc5a62SPatrick Kelsey 	((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
4828bdc5a62SPatrick Kelsey 	            ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
483ee67461eSJoseph Mingrone #define EXTRACT_LE_S_2(p) \
484ee67461eSJoseph Mingrone 	((int16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
485ee67461eSJoseph Mingrone 	           ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
486ee67461eSJoseph Mingrone #define EXTRACT_LE_U_4(p) \
4878bdc5a62SPatrick Kelsey 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
4888bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
4898bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
4908bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
491ee67461eSJoseph Mingrone #define EXTRACT_LE_S_4(p) \
492ee67461eSJoseph Mingrone 	((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
493ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
494ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
495ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
496ee67461eSJoseph Mingrone #define EXTRACT_LE_U_8(p) \
497ee67461eSJoseph Mingrone 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
498ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
499ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
500ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
501ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
502ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
503ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
504ee67461eSJoseph Mingrone 	            ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
505ee67461eSJoseph Mingrone #define EXTRACT_LE_S_8(p) \
506ee67461eSJoseph Mingrone 	((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
507ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
508ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
509ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
510ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
511ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
512ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
513ee67461eSJoseph Mingrone 	           ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
514ee67461eSJoseph Mingrone 
515ee67461eSJoseph Mingrone /*
516ee67461eSJoseph Mingrone  * Non-power-of-2 sizes.
517ee67461eSJoseph Mingrone  */
518ee67461eSJoseph Mingrone 
519ee67461eSJoseph Mingrone #define EXTRACT_LE_U_3(p) \
5208bdc5a62SPatrick Kelsey 	((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
5218bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
5228bdc5a62SPatrick Kelsey 	            ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
523ee67461eSJoseph Mingrone #define EXTRACT_LE_S_3(p) \
524ee67461eSJoseph Mingrone 	((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
525ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
526ee67461eSJoseph Mingrone 	           ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
527ee67461eSJoseph Mingrone #define EXTRACT_LE_U_5(p) \
528ee67461eSJoseph Mingrone 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) |	\
529ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) |	\
530ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) |	\
531ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) |	\
532ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
533ee67461eSJoseph Mingrone #define EXTRACT_LE_U_6(p) \
534ee67461eSJoseph Mingrone 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) |	\
535ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) |	\
536ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) |	\
537ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) |	\
538ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) |	\
539ee67461eSJoseph Mingrone 		    ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
540ee67461eSJoseph Mingrone #define EXTRACT_LE_U_7(p) \
541ee67461eSJoseph Mingrone 	((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) |	\
5428bdc5a62SPatrick Kelsey 		    ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) |	\
5438bdc5a62SPatrick Kelsey 		    ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) |	\
5448bdc5a62SPatrick Kelsey 		    ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) |	\
5458bdc5a62SPatrick Kelsey 		    ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) |	\
5468bdc5a62SPatrick Kelsey 		    ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) |	\
5478bdc5a62SPatrick Kelsey 		    ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
5483340d773SGleb Smirnoff 
5493340d773SGleb Smirnoff /*
5503340d773SGleb Smirnoff  * Macros to check the presence of the values in question.
5513340d773SGleb Smirnoff  */
552ee67461eSJoseph Mingrone #define ND_TTEST_1(p) ND_TTEST_LEN((p), 1)
553ee67461eSJoseph Mingrone #define ND_TCHECK_1(p) ND_TCHECK_LEN((p), 1)
5543340d773SGleb Smirnoff 
555ee67461eSJoseph Mingrone #define ND_TTEST_2(p) ND_TTEST_LEN((p), 2)
556ee67461eSJoseph Mingrone #define ND_TCHECK_2(p) ND_TCHECK_LEN((p), 2)
5573340d773SGleb Smirnoff 
558ee67461eSJoseph Mingrone #define ND_TTEST_3(p) ND_TTEST_LEN((p), 3)
559ee67461eSJoseph Mingrone #define ND_TCHECK_3(p) ND_TCHECK_LEN((p), 3)
5603340d773SGleb Smirnoff 
561ee67461eSJoseph Mingrone #define ND_TTEST_4(p) ND_TTEST_LEN((p), 4)
562ee67461eSJoseph Mingrone #define ND_TCHECK_4(p) ND_TCHECK_LEN((p), 4)
5633340d773SGleb Smirnoff 
564ee67461eSJoseph Mingrone #define ND_TTEST_5(p) ND_TTEST_LEN((p), 5)
565ee67461eSJoseph Mingrone #define ND_TCHECK_5(p) ND_TCHECK_LEN((p), 5)
5663340d773SGleb Smirnoff 
567ee67461eSJoseph Mingrone #define ND_TTEST_6(p) ND_TTEST_LEN((p), 6)
568ee67461eSJoseph Mingrone #define ND_TCHECK_6(p) ND_TCHECK_LEN((p), 6)
5693340d773SGleb Smirnoff 
570ee67461eSJoseph Mingrone #define ND_TTEST_7(p) ND_TTEST_LEN((p), 7)
571ee67461eSJoseph Mingrone #define ND_TCHECK_7(p) ND_TCHECK_LEN((p), 7)
5723340d773SGleb Smirnoff 
573ee67461eSJoseph Mingrone #define ND_TTEST_8(p) ND_TTEST_LEN((p), 8)
574ee67461eSJoseph Mingrone #define ND_TCHECK_8(p) ND_TCHECK_LEN((p), 8)
5750bff6a5aSEd Maste 
576ee67461eSJoseph Mingrone #define ND_TTEST_16(p) ND_TTEST_LEN((p), 16)
577ee67461eSJoseph Mingrone #define ND_TCHECK_16(p) ND_TCHECK_LEN((p), 16)
578ee67461eSJoseph Mingrone 
579ee67461eSJoseph Mingrone /* get_u_1 and get_s_1 */
580ee67461eSJoseph Mingrone 
581ee67461eSJoseph Mingrone static inline uint8_t
get_u_1(netdissect_options * ndo,const u_char * p)582ee67461eSJoseph Mingrone get_u_1(netdissect_options *ndo, const u_char *p)
583ee67461eSJoseph Mingrone {
584ee67461eSJoseph Mingrone 	if (!ND_TTEST_1(p))
585ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
586ee67461eSJoseph Mingrone 	return EXTRACT_U_1(p);
587ee67461eSJoseph Mingrone }
588ee67461eSJoseph Mingrone 
589ee67461eSJoseph Mingrone static inline int8_t
get_s_1(netdissect_options * ndo,const u_char * p)590ee67461eSJoseph Mingrone get_s_1(netdissect_options *ndo, const u_char *p)
591ee67461eSJoseph Mingrone {
592ee67461eSJoseph Mingrone 	if (!ND_TTEST_1(p))
593ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
594ee67461eSJoseph Mingrone 	return EXTRACT_S_1(p);
595ee67461eSJoseph Mingrone }
596ee67461eSJoseph Mingrone 
597ee67461eSJoseph Mingrone /* get_be_u_N */
598ee67461eSJoseph Mingrone 
599ee67461eSJoseph Mingrone static inline uint16_t
get_be_u_2(netdissect_options * ndo,const u_char * p)600ee67461eSJoseph Mingrone get_be_u_2(netdissect_options *ndo, const u_char *p)
601ee67461eSJoseph Mingrone {
602ee67461eSJoseph Mingrone 	if (!ND_TTEST_2(p))
603ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
604ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_2(p);
605ee67461eSJoseph Mingrone }
606ee67461eSJoseph Mingrone 
607ee67461eSJoseph Mingrone static inline uint32_t
get_be_u_3(netdissect_options * ndo,const u_char * p)608ee67461eSJoseph Mingrone get_be_u_3(netdissect_options *ndo, const u_char *p)
609ee67461eSJoseph Mingrone {
610ee67461eSJoseph Mingrone 	if (!ND_TTEST_3(p))
611ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
612ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_3(p);
613ee67461eSJoseph Mingrone }
614ee67461eSJoseph Mingrone 
615ee67461eSJoseph Mingrone static inline uint32_t
get_be_u_4(netdissect_options * ndo,const u_char * p)616ee67461eSJoseph Mingrone get_be_u_4(netdissect_options *ndo, const u_char *p)
617ee67461eSJoseph Mingrone {
618ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
619ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
620ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_4(p);
621ee67461eSJoseph Mingrone }
622ee67461eSJoseph Mingrone 
623ee67461eSJoseph Mingrone static inline uint64_t
get_be_u_5(netdissect_options * ndo,const u_char * p)624ee67461eSJoseph Mingrone get_be_u_5(netdissect_options *ndo, const u_char *p)
625ee67461eSJoseph Mingrone {
626ee67461eSJoseph Mingrone 	if (!ND_TTEST_5(p))
627ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
628ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_5(p);
629ee67461eSJoseph Mingrone }
630ee67461eSJoseph Mingrone 
631ee67461eSJoseph Mingrone static inline uint64_t
get_be_u_6(netdissect_options * ndo,const u_char * p)632ee67461eSJoseph Mingrone get_be_u_6(netdissect_options *ndo, const u_char *p)
633ee67461eSJoseph Mingrone {
634ee67461eSJoseph Mingrone 	if (!ND_TTEST_6(p))
635ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
636ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_6(p);
637ee67461eSJoseph Mingrone }
638ee67461eSJoseph Mingrone 
639ee67461eSJoseph Mingrone static inline uint64_t
get_be_u_7(netdissect_options * ndo,const u_char * p)640ee67461eSJoseph Mingrone get_be_u_7(netdissect_options *ndo, const u_char *p)
641ee67461eSJoseph Mingrone {
642ee67461eSJoseph Mingrone 	if (!ND_TTEST_7(p))
643ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
644ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_7(p);
645ee67461eSJoseph Mingrone }
646ee67461eSJoseph Mingrone 
647ee67461eSJoseph Mingrone static inline uint64_t
get_be_u_8(netdissect_options * ndo,const u_char * p)648ee67461eSJoseph Mingrone get_be_u_8(netdissect_options *ndo, const u_char *p)
649ee67461eSJoseph Mingrone {
650ee67461eSJoseph Mingrone 	if (!ND_TTEST_8(p))
651ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
652ee67461eSJoseph Mingrone 	return EXTRACT_BE_U_8(p);
653ee67461eSJoseph Mingrone }
654ee67461eSJoseph Mingrone 
655ee67461eSJoseph Mingrone /* get_be_s_N  */
656ee67461eSJoseph Mingrone 
657ee67461eSJoseph Mingrone static inline int16_t
get_be_s_2(netdissect_options * ndo,const u_char * p)658ee67461eSJoseph Mingrone get_be_s_2(netdissect_options *ndo, const u_char *p)
659ee67461eSJoseph Mingrone {
660ee67461eSJoseph Mingrone 	if (!ND_TTEST_2(p))
661ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
662ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_2(p);
663ee67461eSJoseph Mingrone }
664ee67461eSJoseph Mingrone 
665ee67461eSJoseph Mingrone static inline int32_t
get_be_s_3(netdissect_options * ndo,const u_char * p)666ee67461eSJoseph Mingrone get_be_s_3(netdissect_options *ndo, const u_char *p)
667ee67461eSJoseph Mingrone {
668ee67461eSJoseph Mingrone 	if (!ND_TTEST_3(p))
669ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
670ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_3(p);
671ee67461eSJoseph Mingrone }
672ee67461eSJoseph Mingrone 
673ee67461eSJoseph Mingrone static inline int32_t
get_be_s_4(netdissect_options * ndo,const u_char * p)674ee67461eSJoseph Mingrone get_be_s_4(netdissect_options *ndo, const u_char *p)
675ee67461eSJoseph Mingrone {
676ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
677ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
678ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_4(p);
679ee67461eSJoseph Mingrone }
680ee67461eSJoseph Mingrone 
681ee67461eSJoseph Mingrone static inline int64_t
get_be_s_5(netdissect_options * ndo,const u_char * p)682ee67461eSJoseph Mingrone get_be_s_5(netdissect_options *ndo, const u_char *p)
683ee67461eSJoseph Mingrone {
684ee67461eSJoseph Mingrone 	if (!ND_TTEST_5(p))
685ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
686ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_5(p);
687ee67461eSJoseph Mingrone }
688ee67461eSJoseph Mingrone 
689ee67461eSJoseph Mingrone static inline int64_t
get_be_s_6(netdissect_options * ndo,const u_char * p)690ee67461eSJoseph Mingrone get_be_s_6(netdissect_options *ndo, const u_char *p)
691ee67461eSJoseph Mingrone {
692ee67461eSJoseph Mingrone 	if (!ND_TTEST_6(p))
693ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
694ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_6(p);
695ee67461eSJoseph Mingrone }
696ee67461eSJoseph Mingrone 
697ee67461eSJoseph Mingrone static inline int64_t
get_be_s_7(netdissect_options * ndo,const u_char * p)698ee67461eSJoseph Mingrone get_be_s_7(netdissect_options *ndo, const u_char *p)
699ee67461eSJoseph Mingrone {
700ee67461eSJoseph Mingrone 	if (!ND_TTEST_7(p))
701ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
702ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_7(p);
703ee67461eSJoseph Mingrone }
704ee67461eSJoseph Mingrone 
705ee67461eSJoseph Mingrone static inline int64_t
get_be_s_8(netdissect_options * ndo,const u_char * p)706ee67461eSJoseph Mingrone get_be_s_8(netdissect_options *ndo, const u_char *p)
707ee67461eSJoseph Mingrone {
708ee67461eSJoseph Mingrone 	if (!ND_TTEST_8(p))
709ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
710ee67461eSJoseph Mingrone 	return EXTRACT_BE_S_8(p);
711ee67461eSJoseph Mingrone }
712ee67461eSJoseph Mingrone 
713ee67461eSJoseph Mingrone /* get_he_u_N */
714ee67461eSJoseph Mingrone 
715ee67461eSJoseph Mingrone static inline uint16_t
get_he_u_2(netdissect_options * ndo,const u_char * p)716ee67461eSJoseph Mingrone get_he_u_2(netdissect_options *ndo, const u_char *p)
717ee67461eSJoseph Mingrone {
718ee67461eSJoseph Mingrone 	if (!ND_TTEST_2(p))
719ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
720ee67461eSJoseph Mingrone 	return EXTRACT_HE_U_2(p);
721ee67461eSJoseph Mingrone }
722ee67461eSJoseph Mingrone 
723ee67461eSJoseph Mingrone static inline uint32_t
get_he_u_4(netdissect_options * ndo,const u_char * p)724ee67461eSJoseph Mingrone get_he_u_4(netdissect_options *ndo, const u_char *p)
725ee67461eSJoseph Mingrone {
726ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
727ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
728ee67461eSJoseph Mingrone 	return EXTRACT_HE_U_4(p);
729ee67461eSJoseph Mingrone }
730ee67461eSJoseph Mingrone 
731ee67461eSJoseph Mingrone /* get_he_s_N */
732ee67461eSJoseph Mingrone 
733ee67461eSJoseph Mingrone static inline int16_t
get_he_s_2(netdissect_options * ndo,const u_char * p)734ee67461eSJoseph Mingrone get_he_s_2(netdissect_options *ndo, const u_char *p)
735ee67461eSJoseph Mingrone {
736ee67461eSJoseph Mingrone 	if (!ND_TTEST_2(p))
737ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
738ee67461eSJoseph Mingrone 	return EXTRACT_HE_S_2(p);
739ee67461eSJoseph Mingrone }
740ee67461eSJoseph Mingrone 
741ee67461eSJoseph Mingrone static inline int32_t
get_he_s_4(netdissect_options * ndo,const u_char * p)742ee67461eSJoseph Mingrone get_he_s_4(netdissect_options *ndo, const u_char *p)
743ee67461eSJoseph Mingrone {
744ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
745ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
746ee67461eSJoseph Mingrone 	return EXTRACT_HE_S_4(p);
747ee67461eSJoseph Mingrone }
748ee67461eSJoseph Mingrone 
749ee67461eSJoseph Mingrone /* get_le_u_N */
750ee67461eSJoseph Mingrone 
751ee67461eSJoseph Mingrone static inline uint16_t
get_le_u_2(netdissect_options * ndo,const u_char * p)752ee67461eSJoseph Mingrone get_le_u_2(netdissect_options *ndo, const u_char *p)
753ee67461eSJoseph Mingrone {
754ee67461eSJoseph Mingrone 	if (!ND_TTEST_2(p))
755ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
756ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_2(p);
757ee67461eSJoseph Mingrone }
758ee67461eSJoseph Mingrone 
759ee67461eSJoseph Mingrone static inline uint32_t
get_le_u_3(netdissect_options * ndo,const u_char * p)760ee67461eSJoseph Mingrone get_le_u_3(netdissect_options *ndo, const u_char *p)
761ee67461eSJoseph Mingrone {
762ee67461eSJoseph Mingrone 	if (!ND_TTEST_3(p))
763ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
764ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_3(p);
765ee67461eSJoseph Mingrone }
766ee67461eSJoseph Mingrone 
767ee67461eSJoseph Mingrone static inline uint32_t
get_le_u_4(netdissect_options * ndo,const u_char * p)768ee67461eSJoseph Mingrone get_le_u_4(netdissect_options *ndo, const u_char *p)
769ee67461eSJoseph Mingrone {
770ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
771ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
772ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_4(p);
773ee67461eSJoseph Mingrone }
774ee67461eSJoseph Mingrone 
775ee67461eSJoseph Mingrone static inline uint64_t
get_le_u_5(netdissect_options * ndo,const u_char * p)776ee67461eSJoseph Mingrone get_le_u_5(netdissect_options *ndo, const u_char *p)
777ee67461eSJoseph Mingrone {
778ee67461eSJoseph Mingrone 	if (!ND_TTEST_5(p))
779ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
780ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_5(p);
781ee67461eSJoseph Mingrone }
782ee67461eSJoseph Mingrone 
783ee67461eSJoseph Mingrone static inline uint64_t
get_le_u_6(netdissect_options * ndo,const u_char * p)784ee67461eSJoseph Mingrone get_le_u_6(netdissect_options *ndo, const u_char *p)
785ee67461eSJoseph Mingrone {
786ee67461eSJoseph Mingrone 	if (!ND_TTEST_6(p))
787ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
788ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_6(p);
789ee67461eSJoseph Mingrone }
790ee67461eSJoseph Mingrone 
791ee67461eSJoseph Mingrone static inline uint64_t
get_le_u_7(netdissect_options * ndo,const u_char * p)792ee67461eSJoseph Mingrone get_le_u_7(netdissect_options *ndo, const u_char *p)
793ee67461eSJoseph Mingrone {
794ee67461eSJoseph Mingrone 	if (!ND_TTEST_7(p))
795ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
796ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_7(p);
797ee67461eSJoseph Mingrone }
798ee67461eSJoseph Mingrone 
799ee67461eSJoseph Mingrone static inline uint64_t
get_le_u_8(netdissect_options * ndo,const u_char * p)800ee67461eSJoseph Mingrone get_le_u_8(netdissect_options *ndo, const u_char *p)
801ee67461eSJoseph Mingrone {
802ee67461eSJoseph Mingrone 	if (!ND_TTEST_8(p))
803ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
804ee67461eSJoseph Mingrone 	return EXTRACT_LE_U_8(p);
805ee67461eSJoseph Mingrone }
806ee67461eSJoseph Mingrone 
807ee67461eSJoseph Mingrone /* get_le_s_N */
808ee67461eSJoseph Mingrone 
809ee67461eSJoseph Mingrone static inline int16_t
get_le_s_2(netdissect_options * ndo,const u_char * p)810ee67461eSJoseph Mingrone get_le_s_2(netdissect_options *ndo, const u_char *p)
811ee67461eSJoseph Mingrone {
812ee67461eSJoseph Mingrone 	if (!ND_TTEST_2(p))
813ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
814ee67461eSJoseph Mingrone 	return EXTRACT_LE_S_2(p);
815ee67461eSJoseph Mingrone }
816ee67461eSJoseph Mingrone 
817ee67461eSJoseph Mingrone static inline int32_t
get_le_s_3(netdissect_options * ndo,const u_char * p)818ee67461eSJoseph Mingrone get_le_s_3(netdissect_options *ndo, const u_char *p)
819ee67461eSJoseph Mingrone {
820ee67461eSJoseph Mingrone 	if (!ND_TTEST_3(p))
821ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
822ee67461eSJoseph Mingrone 	return EXTRACT_LE_S_3(p);
823ee67461eSJoseph Mingrone }
824ee67461eSJoseph Mingrone 
825ee67461eSJoseph Mingrone static inline int32_t
get_le_s_4(netdissect_options * ndo,const u_char * p)826ee67461eSJoseph Mingrone get_le_s_4(netdissect_options *ndo, const u_char *p)
827ee67461eSJoseph Mingrone {
828ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
829ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
830ee67461eSJoseph Mingrone 	return EXTRACT_LE_S_4(p);
831ee67461eSJoseph Mingrone }
832ee67461eSJoseph Mingrone 
833ee67461eSJoseph Mingrone static inline int64_t
get_le_s_8(netdissect_options * ndo,const u_char * p)834ee67461eSJoseph Mingrone get_le_s_8(netdissect_options *ndo, const u_char *p)
835ee67461eSJoseph Mingrone {
836ee67461eSJoseph Mingrone 	if (!ND_TTEST_8(p))
837ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
838ee67461eSJoseph Mingrone 	return EXTRACT_LE_S_8(p);
839ee67461eSJoseph Mingrone }
840ee67461eSJoseph Mingrone 
841ee67461eSJoseph Mingrone /* get_ipv4_to_{host|network]_order */
842ee67461eSJoseph Mingrone 
843ee67461eSJoseph Mingrone static inline uint32_t
get_ipv4_to_host_order(netdissect_options * ndo,const u_char * p)844ee67461eSJoseph Mingrone get_ipv4_to_host_order(netdissect_options *ndo, const u_char *p)
845ee67461eSJoseph Mingrone {
846ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
847ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
848ee67461eSJoseph Mingrone 	return EXTRACT_IPV4_TO_HOST_ORDER(p);
849ee67461eSJoseph Mingrone }
850ee67461eSJoseph Mingrone 
851ee67461eSJoseph Mingrone static inline uint32_t
get_ipv4_to_network_order(netdissect_options * ndo,const u_char * p)852ee67461eSJoseph Mingrone get_ipv4_to_network_order(netdissect_options *ndo, const u_char *p)
853ee67461eSJoseph Mingrone {
854ee67461eSJoseph Mingrone 	if (!ND_TTEST_4(p))
855ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
856ee67461eSJoseph Mingrone 	return EXTRACT_IPV4_TO_NETWORK_ORDER(p);
857ee67461eSJoseph Mingrone }
858ee67461eSJoseph Mingrone 
859ee67461eSJoseph Mingrone static inline void
get_cpy_bytes(netdissect_options * ndo,u_char * dst,const u_char * p,size_t len)860ee67461eSJoseph Mingrone get_cpy_bytes(netdissect_options *ndo, u_char *dst, const u_char *p, size_t len)
861ee67461eSJoseph Mingrone {
862ee67461eSJoseph Mingrone 	if (!ND_TTEST_LEN(p, len))
863ee67461eSJoseph Mingrone 		nd_trunc_longjmp(ndo);
864ee67461eSJoseph Mingrone 	UNALIGNED_MEMCPY(dst, p, len);
865ee67461eSJoseph Mingrone }
866ee67461eSJoseph Mingrone 
867ee67461eSJoseph Mingrone #define GET_U_1(p) get_u_1(ndo, (const u_char *)(p))
868ee67461eSJoseph Mingrone #define GET_S_1(p) get_s_1(ndo, (const u_char *)(p))
869ee67461eSJoseph Mingrone 
870ee67461eSJoseph Mingrone #define GET_BE_U_2(p) get_be_u_2(ndo, (const u_char *)(p))
871ee67461eSJoseph Mingrone #define GET_BE_U_3(p) get_be_u_3(ndo, (const u_char *)(p))
872ee67461eSJoseph Mingrone #define GET_BE_U_4(p) get_be_u_4(ndo, (const u_char *)(p))
873ee67461eSJoseph Mingrone #define GET_BE_U_5(p) get_be_u_5(ndo, (const u_char *)(p))
874ee67461eSJoseph Mingrone #define GET_BE_U_6(p) get_be_u_6(ndo, (const u_char *)(p))
875ee67461eSJoseph Mingrone #define GET_BE_U_7(p) get_be_u_7(ndo, (const u_char *)(p))
876ee67461eSJoseph Mingrone #define GET_BE_U_8(p) get_be_u_8(ndo, (const u_char *)(p))
877ee67461eSJoseph Mingrone 
878ee67461eSJoseph Mingrone #define GET_BE_S_2(p) get_be_s_2(ndo, (const u_char *)(p))
879ee67461eSJoseph Mingrone #define GET_BE_S_3(p) get_be_s_3(ndo, (const u_char *)(p))
880ee67461eSJoseph Mingrone #define GET_BE_S_4(p) get_be_s_4(ndo, (const u_char *)(p))
881ee67461eSJoseph Mingrone #define GET_BE_S_5(p) get_be_s_5(ndo, (const u_char *)(p))
882ee67461eSJoseph Mingrone #define GET_BE_S_6(p) get_be_s_6(ndo, (const u_char *)(p))
883ee67461eSJoseph Mingrone #define GET_BE_S_7(p) get_be_s_7(ndo, (const u_char *)(p))
884ee67461eSJoseph Mingrone #define GET_BE_S_8(p) get_be_s_8(ndo, (const u_char *)(p))
885ee67461eSJoseph Mingrone 
886ee67461eSJoseph Mingrone #define GET_HE_U_2(p) get_he_u_2(ndo, (const u_char *)(p))
887ee67461eSJoseph Mingrone #define GET_HE_U_4(p) get_he_u_4(ndo, (const u_char *)(p))
888ee67461eSJoseph Mingrone 
889ee67461eSJoseph Mingrone #define GET_HE_S_2(p) get_he_s_2(ndo, (const u_char *)(p))
890ee67461eSJoseph Mingrone #define GET_HE_S_4(p) get_he_s_4(ndo, (const u_char *)(p))
891ee67461eSJoseph Mingrone 
892ee67461eSJoseph Mingrone #define GET_LE_U_2(p) get_le_u_2(ndo, (const u_char *)(p))
893ee67461eSJoseph Mingrone #define GET_LE_U_3(p) get_le_u_3(ndo, (const u_char *)(p))
894ee67461eSJoseph Mingrone #define GET_LE_U_4(p) get_le_u_4(ndo, (const u_char *)(p))
895ee67461eSJoseph Mingrone #define GET_LE_U_5(p) get_le_u_5(ndo, (const u_char *)(p))
896ee67461eSJoseph Mingrone #define GET_LE_U_6(p) get_le_u_6(ndo, (const u_char *)(p))
897ee67461eSJoseph Mingrone #define GET_LE_U_7(p) get_le_u_7(ndo, (const u_char *)(p))
898ee67461eSJoseph Mingrone #define GET_LE_U_8(p) get_le_u_8(ndo, (const u_char *)(p))
899ee67461eSJoseph Mingrone 
900ee67461eSJoseph Mingrone #define GET_LE_S_2(p) get_le_s_2(ndo, (const u_char *)(p))
901ee67461eSJoseph Mingrone #define GET_LE_S_3(p) get_le_s_3(ndo, (const u_char *)(p))
902ee67461eSJoseph Mingrone #define GET_LE_S_4(p) get_le_s_4(ndo, (const u_char *)(p))
903ee67461eSJoseph Mingrone #define GET_LE_S_8(p) get_le_s_8(ndo, (const u_char *)(p))
904ee67461eSJoseph Mingrone 
905ee67461eSJoseph Mingrone #define GET_IPV4_TO_HOST_ORDER(p) get_ipv4_to_host_order(ndo, (const u_char *)(p))
906ee67461eSJoseph Mingrone #define GET_IPV4_TO_NETWORK_ORDER(p) get_ipv4_to_network_order(ndo, (const u_char *)(p))
907ee67461eSJoseph Mingrone 
908ee67461eSJoseph Mingrone #define GET_CPY_BYTES(dst, p, len) get_cpy_bytes(ndo, (u_char *)(dst), (const u_char *)(p), len)
909ee67461eSJoseph Mingrone 
910ee67461eSJoseph Mingrone #endif /* EXTRACT_H */
911