On Wed, Jul 18, 2018 at 07:57:57AM +0300, Artturi Alm wrote: > Hi, > > rather random "i want to clear those XXXs"-moment with morning coffee, > did seem like this was screaming for __packed from sys/cdefs.h, > and less MD in sys/net/, if nothing else. > > With a bit of googling i also ran into a different solution, > which is as ugly as what i'm replacing, imo.., that is: > #define SIZEOF_BPF_HDR (sizeof(struct bpf_hdr) <= 20 ? 18 : > sizeof(struct bpf_hdr)) /* from some apple bpf.h */ > > compile-tested diff from was-current-before-hackathon-src-tree. > > -Artturi >
now i suppose this doesn't work on some arch i can't test with, but would anyone care to tell me which arch(s) and/or why not? the diff i was thinking, without comment/define changes below. -Artturi diff --git sys/net/bpf.h sys/net/bpf.h index 604bdcbab55..095ee283c03 100644 --- sys/net/bpf.h +++ sys/net/bpf.h @@ -140,7 +140,7 @@ struct bpf_hdr { u_int32_t bh_datalen; /* original length of packet */ u_int16_t bh_hdrlen; /* length of bpf header (this struct plus alignment padding) */ -}; +} __packed; /* * Because the structure above is not a multiple of 4 bytes, some compilers * will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't work. @@ -156,6 +156,7 @@ struct bpf_hdr { #else #define SIZEOF_BPF_HDR sizeof(struct bpf_hdr) #endif +CTASSERT(sizeof(struct bpf_hdr) == 18); /* prove XXXs above !true w/packed */ #endif /* > > diff --git a/sys/net/bpf.c b/sys/net/bpf.c > index a6bcf31d471..151a34e19f2 100644 > --- a/sys/net/bpf.c > +++ b/sys/net/bpf.c > @@ -1600,11 +1600,12 @@ bpfsattach(caddr_t *bpfp, const char *name, u_int > dlt, u_int hdrlen) > > /* > * Compute the length of the bpf header. This is not necessarily > - * equal to SIZEOF_BPF_HDR because we want to insert spacing such > - * that the network layer header begins on a longword boundary (for > - * performance reasons and to alleviate alignment restrictions). > + * equal to sizeof(struct bpf_hdr), because we want to insert spacing > + * such that the network layer header begins on a longword boundary > + * (for performance reasons and to alleviate alignment restrictions). > */ > - bp->bif_hdrlen = BPF_WORDALIGN(hdrlen + SIZEOF_BPF_HDR) - hdrlen; > + bp->bif_hdrlen = > + BPF_WORDALIGN(hdrlen + sizeof(struct bpf_hdr)) - hdrlen; > > return (bp); > } > diff --git a/sys/net/bpf.h b/sys/net/bpf.h > index 604bdcbab55..80444bc17ad 100644 > --- a/sys/net/bpf.h > +++ b/sys/net/bpf.h > @@ -140,22 +140,14 @@ struct bpf_hdr { > u_int32_t bh_datalen; /* original length of packet */ > u_int16_t bh_hdrlen; /* length of bpf header (this struct > plus alignment padding) */ > -}; > +} __packed; > +#ifdef _KERNEL > /* > * Because the structure above is not a multiple of 4 bytes, some compilers > * will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't > work. > * Only the kernel needs to know about it; applications use bh_hdrlen. > - * XXX To save a few bytes on 32-bit machines, we avoid end-of-struct > - * XXX padding by using the size of the header data elements. This is > - * XXX fail-safe: on new machines, we just use the 'safe' sizeof. > */ > -#ifdef _KERNEL > -#if defined(__arm__) || defined(__i386__) || defined(__mips__) || \ > - defined(__sparc64__) > -#define SIZEOF_BPF_HDR 18 > -#else > -#define SIZEOF_BPF_HDR sizeof(struct bpf_hdr) > -#endif > +CTASSERT(sizeof(struct bpf_hdr) == 18); > #endif > > /*