在NTP项目中,NTP.h中,
#ifdef AUTOKEY
#define clear_to_zero opcode
u_int32 opcode; /* last request opcode */
associd_t assoc; /* peer association ID */
u_int32 crypto; /* peer status word */
EVP_PKEY *pkey; /* public key */
const EVP_MD *digest; /* message digest algorithm */
char *subject; /* certificate subject name */
char *issuer; /* certificate issuer name */
struct cert_info *xinfo; /* issuer certificate */
keyid_t pkeyid; /* previous key ID */
keyid_t hcookie; /* host cookie */
keyid_t pcookie; /* peer cookie */
const struct pkey_info *ident_pkey; /* identity key */
BIGNUM *iffval; /* identity challenge (IFF, GQ, MV) */
const BIGNUM *grpkey; /* identity challenge key (GQ) */
struct value cookval; /* receive cookie values */
struct value recval; /* receive autokey values */
struct exten *cmmd; /* extension pointer */
u_long refresh; /* next refresh epoch */
/*
* Variables used by authenticated server
*/
keyid_t *keylist; /* session key ID list */
int keynumber; /* current key number */
struct value encrypt; /* send encrypt values */
struct value sndval; /* send autokey values */
#else /* !AUTOKEY follows */
#define clear_to_zero status
#endif /* !AUTOKEY */
/*
* Ephemeral state variables
*/
u_char status; /* peer status */
u_char new_status; /* under-construction status */
u_char reach; /* reachability register */
int flash; /* protocol error test tally bits */
u_long epoch; /* reference epoch */
int burst; /* packets remaining in burst */
int retry; /* retry counter */
int flip; /* interleave mode control */
int filter_nextpt; /* index into filter shift register */
double filter_delay[NTP_SHIFT]; /* delay shift register */
double filter_offset[NTP_SHIFT]; /* offset shift register */
double filter_disp[NTP_SHIFT]; /* dispersion shift register */
u_long filter_epoch[NTP_SHIFT]; /* epoch shift register */
u_char filter_order[NTP_SHIFT]; /* filter sort index */
l_fp rec; /* receive time stamp */
l_fp xmt; /* transmit time stamp */
l_fp dst; /* destination timestamp */
l_fp aorg; /* origin timestamp */
l_fp borg; /* alternate origin timestamp */
double offset; /* peer clock offset */
double delay; /* peer roundtrip delay */
double jitter; /* peer jitter (squares) */
double disp; /* peer dispersion */
double xleave; /* interleave delay */
double bias; /* programmed offset bias */
/*
* Variables used to correct for packet length and asymmetry.
*/
double t21; /* outbound packet delay */
int t21_bytes; /* outbound packet length */
int t21_last; /* last outbound packet length */
double r21; /* outbound data rate */
double t34; /* inbound packet delay */
int t34_bytes; /* inbound packet length */
double r34; /* inbound data rate */
/*
* End of clear-to-zero area
*/
u_long update; /* receive epoch */
#define end_clear_to_zero update
用两个个#define来标记 结尾 和 开始, 以后用的时候直接用这两个宏,相减便可以得到大小。
#define CLEAR_TO_ZERO(p) ((char *)&((p)->clear_to_zero))
#define END_CLEAR_TO_ZERO(p) ((char *)&((p)->end_clear_to_zero))
#define LEN_CLEAR_TO_ZERO (END_CLEAR_TO_ZERO((struct peer *)0) \
- CLEAR_TO_ZERO((struct peer *)0))
#define CRYPTO_TO_ZERO(p) ((char *)&((p)->clear_to_zero))
#define END_CRYPTO_TO_ZERO(p) ((char *)&((p)->end_clear_to_zero))
#define LEN_CRYPTO_TO_ZERO (END_CRYPTO_TO_ZERO((struct peer *)0) \
- CRYPTO_TO_ZERO((struct peer *)0))