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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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