Define ar_* as inlined functions, not as macros. Makes it easier to

understand why ARPHRD_IEEE1394 needs to be handled with care - it doesn't
have ar_tha.
This commit is contained in:
maxv 2018-02-13 08:43:26 +00:00
parent a79a3b36b5
commit e296dd2e51
1 changed files with 34 additions and 11 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_arp.h,v 1.30 2015/08/31 08:05:20 ozaki-r Exp $ */
/* $NetBSD: if_arp.h,v 1.31 2018/02/13 08:43:26 maxv Exp $ */
/*
* Copyright (c) 1986, 1993
@ -68,20 +68,43 @@ struct arphdr {
#ifdef COMMENT_ONLY
uint8_t ar_sha[]; /* sender hardware address */
uint8_t ar_spa[]; /* sender protocol address */
uint8_t ar_tha[]; /* target hardware address */
uint8_t ar_tha[]; /* target hardware address (!IEEE1394) */
uint8_t ar_tpa[]; /* target protocol address */
#endif
#define ar_sha(ap) (((char *)((ap)+1))+0)
#define ar_spa(ap) (((char *)((ap)+1))+(ap)->ar_hln)
#define ar_tha(ap) \
(ntohs((ap)->ar_hrd) == ARPHRD_IEEE1394 \
? NULL : (((char *)((ap)+1))+(ap)->ar_hln+(ap)->ar_pln))
#define ar_tpa(ap) \
(ntohs((ap)->ar_hrd) == ARPHRD_IEEE1394 \
? (((char *)((ap)+1))+(ap)->ar_hln+(ap)->ar_pln) \
: (((char *)((ap)+1))+(ap)->ar_hln+(ap)->ar_pln+(ap)->ar_hln))
} __packed;
static inline uint8_t *
ar_sha(struct arphdr *ap)
{
return ((uint8_t *)(ap + 1)) + 0;
}
static inline uint8_t *
ar_spa(struct arphdr *ap)
{
return ((uint8_t *)(ap + 1)) + ap->ar_hln;
}
static inline uint8_t *
ar_tha(struct arphdr *ap)
{
if (ntohs(ap->ar_hrd) == ARPHRD_IEEE1394) {
return NULL;
} else {
return ((uint8_t *)(ap + 1)) + ap->ar_hln + ap->ar_pln;
}
}
static inline uint8_t *
ar_tpa(struct arphdr *ap)
{
if (ntohs(ap->ar_hrd) == ARPHRD_IEEE1394) {
return ((uint8_t *)(ap + 1)) + ap->ar_hln + ap->ar_pln;
} else {
return ((uint8_t *)(ap + 1)) + ap->ar_hln + ap->ar_pln +
ap->ar_hln;
}
}
/*
* ARP ioctl request