Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net if_ether: Ensure that ether_header is aligned



details:   https://anonhg.NetBSD.org/src/rev/252246484fac
branches:  trunk
changeset: 980630:252246484fac
user:      roy <roy%NetBSD.org@localhost>
date:      Sat Feb 13 07:28:04 2021 +0000

description:
if_ether: Ensure that ether_header is aligned

diffstat:

 sys/net/if_ether.h     |   8 ++++++--
 sys/net/if_ethersubr.c |  19 ++++++++++++++-----
 2 files changed, 20 insertions(+), 7 deletions(-)

diffs (62 lines):

diff -r c39af33f9bca -r 252246484fac sys/net/if_ether.h
--- a/sys/net/if_ether.h        Sat Feb 13 07:08:45 2021 +0000
+++ b/sys/net/if_ether.h        Sat Feb 13 07:28:04 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ether.h,v 1.84 2021/02/03 18:13:13 roy Exp $        */
+/*     $NetBSD: if_ether.h,v 1.85 2021/02/13 07:28:04 roy Exp $        */
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -89,7 +89,11 @@
        uint8_t  ether_shost[ETHER_ADDR_LEN];
        uint16_t ether_type;
 };
-
+#ifdef __NO_STRICT_ALIGNMENT
+#define        ETHER_HDR_ALIGNED_P(eh) 1
+#else
+#define        ETHER_HDR_ALIGNED_P(eh) ((((vaddr_t) (eh)) & 3) == 0)
+#endif
 #ifdef __CTASSERT
 __CTASSERT(sizeof(struct ether_addr) == 6);
 __CTASSERT(sizeof(struct ether_header) == 14);
diff -r c39af33f9bca -r 252246484fac sys/net/if_ethersubr.c
--- a/sys/net/if_ethersubr.c    Sat Feb 13 07:08:45 2021 +0000
+++ b/sys/net/if_ethersubr.c    Sat Feb 13 07:28:04 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ethersubr.c,v 1.289 2020/09/26 18:38:09 roy Exp $   */
+/*     $NetBSD: if_ethersubr.c,v 1.290 2021/02/13 07:28:04 roy Exp $   */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.289 2020/09/26 18:38:09 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.290 2021/02/13 07:28:04 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -648,9 +648,18 @@
 
        if ((ifp->if_flags & IFF_UP) == 0)
                goto drop;
-       if (m->m_len < sizeof(*eh)) {
-               m = m_pullup(m, sizeof(*eh));
-               if (m == NULL)
+
+       /* If the Ethernet header is not aligned, slurp it up into a new
+        * mbuf with space for link headers, in the event we forward
+        * it.  Otherwise, if it is aligned, make sure the entire
+        * base Ethernet header is in the first mbuf of the chain.
+        */
+       if (ETHER_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
+               if ((m = m_copyup(m, sizeof(*eh),
+                   (max_linkhdr + 3) & ~3)) == NULL)
+                       goto dropped;
+       } else if (__predict_false(m->m_len < sizeof(*eh))) {
+               if ((m = m_pullup(m, sizeof(*eh))) == NULL)
                        goto dropped;
        }
 



Home | Main Index | Thread Index | Old Index