Module Name: src Committed By: roy Date: Sat Feb 13 07:28:05 UTC 2021
Modified Files: src/sys/net: if_ether.h if_ethersubr.c Log Message: if_ether: Ensure that ether_header is aligned To generate a diff of this commit: cvs rdiff -u -r1.84 -r1.85 src/sys/net/if_ether.h cvs rdiff -u -r1.289 -r1.290 src/sys/net/if_ethersubr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_ether.h diff -u src/sys/net/if_ether.h:1.84 src/sys/net/if_ether.h:1.85 --- src/sys/net/if_ether.h:1.84 Wed Feb 3 18:13:13 2021 +++ src/sys/net/if_ether.h Sat Feb 13 07:28:04 2021 @@ -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 @@ struct ether_header { 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); Index: src/sys/net/if_ethersubr.c diff -u src/sys/net/if_ethersubr.c:1.289 src/sys/net/if_ethersubr.c:1.290 --- src/sys/net/if_ethersubr.c:1.289 Sat Sep 26 18:38:09 2020 +++ src/sys/net/if_ethersubr.c Sat Feb 13 07:28:04 2021 @@ -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 @@ ether_input(struct ifnet *ifp, struct mb 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; }