1999-10-08 07:47:09 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that: (1) source code distributions
|
|
|
|
* retain the above copyright notice and this paragraph in its entirety, (2)
|
|
|
|
* distributions including binary code include the above copyright notice and
|
|
|
|
* this paragraph in its entirety in the documentation or other materials
|
|
|
|
* provided with the distribution, and (3) all advertising materials mentioning
|
|
|
|
* features or use of this software display the following acknowledgement:
|
|
|
|
* ``This product includes software developed by the University of California,
|
|
|
|
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
|
|
|
* the University nor the names of its contributors may be used to endorse
|
|
|
|
* or promote products derived from this software without specific prior
|
|
|
|
* written permission.
|
|
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
|
|
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
*/
|
|
|
|
|
2004-09-25 14:48:14 +08:00
|
|
|
/*
|
|
|
|
* Macros to extract possibly-unaligned big-endian integral values.
|
|
|
|
*/
|
1999-10-08 07:47:09 +08:00
|
|
|
#ifdef LBL_ALIGN
|
2002-12-11 15:13:49 +08:00
|
|
|
/*
|
|
|
|
* The processor doesn't natively handle unaligned loads.
|
|
|
|
*/
|
2014-02-02 06:02:17 +08:00
|
|
|
#if defined(__GNUC__) && defined(HAVE___ATTRIBUTE__) && \
|
|
|
|
(defined(__alpha) || defined(__alpha__) || \
|
|
|
|
defined(__mips) || defined(__mips__))
|
|
|
|
|
2002-12-11 15:13:49 +08:00
|
|
|
/*
|
2014-02-02 06:02:17 +08:00
|
|
|
* This is a GCC-compatible compiler and we have __attribute__, which
|
|
|
|
* we assume that mean we have __attribute__((packed)), and this is
|
|
|
|
* MIPS or Alpha, which has instructions that can help when doing
|
|
|
|
* unaligned loads.
|
|
|
|
*
|
2014-04-23 15:45:13 +08:00
|
|
|
* Declare packed structures containing a uint16_t and a uint32_t,
|
2002-12-11 15:13:49 +08:00
|
|
|
* cast the pointer to point to one of those, and fetch through it;
|
|
|
|
* the GCC manual doesn't appear to explicitly say that
|
|
|
|
* __attribute__((packed)) causes the compiler to generate unaligned-safe
|
|
|
|
* code, but it apppears to do so.
|
|
|
|
*
|
2014-02-02 06:02:17 +08:00
|
|
|
* We do this in case the compiler can generate code using those
|
|
|
|
* instructions to do an unaligned load and pass stuff to "ntohs()" or
|
|
|
|
* "ntohl()", which might be better than than the code to fetch the
|
|
|
|
* bytes one at a time and assemble them. (That might not be the
|
|
|
|
* case on a little-endian platform, such as DEC's MIPS machines and
|
|
|
|
* Alpha machines, where "ntohs()" and "ntohl()" might not be done
|
|
|
|
* inline.)
|
|
|
|
*
|
|
|
|
* We do this only for specific architectures because, for example,
|
|
|
|
* at least some versions of GCC, when compiling for 64-bit SPARC,
|
|
|
|
* generate code that assumes alignment if we do this.
|
|
|
|
*
|
|
|
|
* XXX - add other architectures and compilers as possible and
|
|
|
|
* appropriate.
|
|
|
|
*
|
|
|
|
* HP's C compiler, indicated by __HP_cc being defined, supports
|
|
|
|
* "#pragma unaligned N" in version A.05.50 and later, where "N"
|
|
|
|
* specifies a number of bytes at which the typedef on the next
|
|
|
|
* line is aligned, e.g.
|
|
|
|
*
|
|
|
|
* #pragma unalign 1
|
2014-04-23 15:45:13 +08:00
|
|
|
* typedef uint16_t unaligned_uint16_t;
|
2014-02-02 06:02:17 +08:00
|
|
|
*
|
2014-04-23 15:45:13 +08:00
|
|
|
* to define unaligned_uint16_t as a 16-bit unaligned data type.
|
2014-02-02 06:02:17 +08:00
|
|
|
* This could be presumably used, in sufficiently recent versions of
|
|
|
|
* the compiler, with macros similar to those below. This would be
|
|
|
|
* useful only if that compiler could generate better code for PA-RISC
|
|
|
|
* or Itanium than would be generated by a bunch of shifts-and-ORs.
|
|
|
|
*
|
|
|
|
* DEC C, indicated by __DECC being defined, has, at least on Alpha,
|
|
|
|
* an __unaligned qualifier that can be applied to pointers to get the
|
|
|
|
* compiler to generate code that does unaligned loads and stores when
|
|
|
|
* dereferencing the pointer in question.
|
|
|
|
*
|
|
|
|
* XXX - what if the native C compiler doesn't support
|
|
|
|
* __attribute__((packed))? How can we get it to generate unaligned
|
|
|
|
* accesses for *specific* items?
|
2002-12-11 15:13:49 +08:00
|
|
|
*/
|
|
|
|
typedef struct {
|
2014-04-23 15:45:13 +08:00
|
|
|
uint16_t val;
|
|
|
|
} __attribute__((packed)) unaligned_uint16_t;
|
2002-12-11 15:13:49 +08:00
|
|
|
|
|
|
|
typedef struct {
|
2014-04-23 15:45:13 +08:00
|
|
|
uint32_t val;
|
|
|
|
} __attribute__((packed)) unaligned_uint32_t;
|
2002-12-11 15:13:49 +08:00
|
|
|
|
2014-04-23 15:45:13 +08:00
|
|
|
static inline uint16_t
|
2013-06-02 17:48:44 +08:00
|
|
|
EXTRACT_16BITS(const void *p)
|
|
|
|
{
|
2014-04-23 15:45:13 +08:00
|
|
|
return ((uint16_t)ntohs(((const unaligned_uint16_t *)(p))->val));
|
2013-06-02 17:48:44 +08:00
|
|
|
}
|
|
|
|
|
2014-04-23 15:45:13 +08:00
|
|
|
static inline uint32_t
|
2013-06-02 17:48:44 +08:00
|
|
|
EXTRACT_32BITS(const void *p)
|
|
|
|
{
|
2014-04-23 15:45:13 +08:00
|
|
|
return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val));
|
2013-06-02 17:48:44 +08:00
|
|
|
}
|
|
|
|
|
2014-04-23 15:45:13 +08:00
|
|
|
static inline uint64_t
|
2013-06-02 17:48:44 +08:00
|
|
|
EXTRACT_64BITS(const void *p)
|
|
|
|
{
|
2016-08-30 01:11:01 +08:00
|
|
|
return ((uint64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
|
2014-04-23 15:45:13 +08:00
|
|
|
((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0));
|
2013-06-02 17:48:44 +08:00
|
|
|
}
|
2004-09-25 14:48:14 +08:00
|
|
|
|
2014-02-02 06:02:17 +08:00
|
|
|
#else /* have to do it a byte at a time */
|
2002-12-11 15:13:49 +08:00
|
|
|
/*
|
2014-02-02 06:02:17 +08:00
|
|
|
* This isn't a GCC-compatible compiler, we don't have __attribute__,
|
|
|
|
* or we do but we don't know of any better way with this instruction
|
|
|
|
* set to do unaligned loads, so do unaligned loads of big-endian
|
2002-12-11 15:13:49 +08:00
|
|
|
* quantities the hard way - fetch the bytes one at a time and
|
|
|
|
* assemble them.
|
|
|
|
*/
|
1999-10-08 07:47:09 +08:00
|
|
|
#define EXTRACT_16BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
|
|
|
|
((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
|
1999-10-08 07:47:09 +08:00
|
|
|
#define EXTRACT_32BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
|
2005-01-15 10:06:50 +08:00
|
|
|
#define EXTRACT_64BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
|
2014-02-02 06:02:17 +08:00
|
|
|
#endif /* must special-case unaligned accesses */
|
2002-12-11 15:13:49 +08:00
|
|
|
#else /* LBL_ALIGN */
|
|
|
|
/*
|
|
|
|
* The processor natively handles unaligned loads, so we can just
|
|
|
|
* cast the pointer and fetch through it.
|
|
|
|
*/
|
2014-04-23 15:45:13 +08:00
|
|
|
static inline uint16_t
|
2013-06-02 17:48:44 +08:00
|
|
|
EXTRACT_16BITS(const void *p)
|
|
|
|
{
|
2014-04-23 15:45:13 +08:00
|
|
|
return ((uint16_t)ntohs(*(const uint16_t *)(p)));
|
2013-06-02 17:48:44 +08:00
|
|
|
}
|
|
|
|
|
2014-04-23 15:45:13 +08:00
|
|
|
static inline uint32_t
|
2013-06-02 17:48:44 +08:00
|
|
|
EXTRACT_32BITS(const void *p)
|
|
|
|
{
|
2014-04-23 15:45:13 +08:00
|
|
|
return ((uint32_t)ntohl(*(const uint32_t *)(p)));
|
2013-06-02 17:48:44 +08:00
|
|
|
}
|
|
|
|
|
2014-04-23 15:45:13 +08:00
|
|
|
static inline uint64_t
|
2013-06-02 17:48:44 +08:00
|
|
|
EXTRACT_64BITS(const void *p)
|
|
|
|
{
|
2016-08-30 01:11:01 +08:00
|
|
|
return ((uint64_t)(((uint64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 |
|
2014-04-23 15:45:13 +08:00
|
|
|
((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0));
|
2013-06-02 17:48:44 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2002-12-11 15:13:49 +08:00
|
|
|
#endif /* LBL_ALIGN */
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
#define EXTRACT_24BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 2)) << 0)))
|
1999-10-08 07:47:09 +08:00
|
|
|
|
2014-02-16 12:37:28 +08:00
|
|
|
#define EXTRACT_40BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
|
2014-10-02 08:55:59 +08:00
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 4)) << 0)))
|
2014-02-16 12:37:28 +08:00
|
|
|
|
|
|
|
#define EXTRACT_48BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 5)) << 0)))
|
2014-02-16 12:37:28 +08:00
|
|
|
|
|
|
|
#define EXTRACT_56BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 6)) << 0)))
|
2014-02-16 12:37:28 +08:00
|
|
|
|
2004-09-25 14:48:14 +08:00
|
|
|
/*
|
|
|
|
* Macros to extract possibly-unaligned little-endian integral values.
|
|
|
|
* XXX - do loads on little-endian machines that support unaligned loads?
|
|
|
|
*/
|
1999-10-08 07:47:09 +08:00
|
|
|
#define EXTRACT_LE_8BITS(p) (*(p))
|
|
|
|
#define EXTRACT_LE_16BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
|
|
|
|
((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
|
1999-10-08 07:47:09 +08:00
|
|
|
#define EXTRACT_LE_32BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
|
2006-01-31 00:20:06 +08:00
|
|
|
#define EXTRACT_LE_24BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
|
|
|
|
((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
|
2004-09-24 05:30:12 +08:00
|
|
|
#define EXTRACT_LE_64BITS(p) \
|
Add some more parentheses, Just In Case.
I'm not sure whether
Performing a byte swapping operation on "p" implies that it came
from an external source, and is therefore tainted.
from Coverity means that it thinks we're byte-swapping the pointer
*itself*, or that we're byte-swapping what it points to, but, just in
case it's the former, let's try throwing some more parentheses in.
(If it's the latter, well, yes, it's packet data, so it comes from an
external source, but Coverity didn't seem to point out any place where
we were using the data it points to without checking its value in cases
where we have to.)
2014-10-02 04:12:13 +08:00
|
|
|
((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
|
|
|
|
((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
|
2015-07-08 02:56:48 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Macros to check the presence of the values in question.
|
|
|
|
*/
|
|
|
|
#define ND_TTEST_8BITS(p) ND_TTEST2(*(p), 1)
|
|
|
|
#define ND_TCHECK_8BITS(p) ND_TCHECK2(*(p), 1)
|
|
|
|
|
|
|
|
#define ND_TTEST_16BITS(p) ND_TTEST2(*(p), 2)
|
|
|
|
#define ND_TCHECK_16BITS(p) ND_TCHECK2(*(p), 2)
|
|
|
|
|
|
|
|
#define ND_TTEST_24BITS(p) ND_TTEST2(*(p), 3)
|
|
|
|
#define ND_TCHECK_24BITS(p) ND_TCHECK2(*(p), 3)
|
|
|
|
|
|
|
|
#define ND_TTEST_32BITS(p) ND_TTEST2(*(p), 4)
|
|
|
|
#define ND_TCHECK_32BITS(p) ND_TCHECK2(*(p), 4)
|
|
|
|
|
|
|
|
#define ND_TTEST_40BITS(p) ND_TTEST2(*(p), 5)
|
|
|
|
#define ND_TCHECK_40BITS(p) ND_TCHECK2(*(p), 5)
|
|
|
|
|
|
|
|
#define ND_TTEST_48BITS(p) ND_TTEST2(*(p), 6)
|
|
|
|
#define ND_TCHECK_48BITS(p) ND_TCHECK2(*(p), 6)
|
|
|
|
|
|
|
|
#define ND_TTEST_56BITS(p) ND_TTEST2(*(p), 7)
|
|
|
|
#define ND_TCHECK_56BITS(p) ND_TCHECK2(*(p), 7)
|
|
|
|
|
|
|
|
#define ND_TTEST_64BITS(p) ND_TTEST2(*(p), 8)
|
|
|
|
#define ND_TCHECK_64BITS(p) ND_TCHECK2(*(p), 8)
|