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


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

Reply via email to