Index: dev/ic/mpi.c =================================================================== RCS file: /cvs/src/sys/dev/ic/mpi.c,v retrieving revision 1.223 diff -u -p -r1.223 mpi.c --- dev/ic/mpi.c 22 Sep 2020 19:32:52 -0000 1.223 +++ dev/ic/mpi.c 7 Mar 2021 11:39:40 -0000 @@ -1064,7 +1064,7 @@ mpi_alloc_ccbs(struct mpi_softc *sc) if (bus_dmamap_create(sc->sc_dmat, MAXPHYS, sc->sc_max_sgl_len, MAXPHYS, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, + BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &ccb->ccb_dmamap) != 0) { printf("%s: unable to create dma map\n", DEVNAME(sc)); goto free_maps; Index: net/if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.632 diff -u -p -r1.632 if.c --- net/if.c 20 Feb 2021 04:55:52 -0000 1.632 +++ net/if.c 7 Mar 2021 11:39:41 -0000 @@ -1766,8 +1766,14 @@ if_setlladdr(struct ifnet *ifp, const ui if (ifp->if_sadl == NULL) return (EINVAL); - memcpy(((struct arpcom *)ifp)->ac_enaddr, lladdr, ETHER_ADDR_LEN); memcpy(LLADDR(ifp->if_sadl), lladdr, ETHER_ADDR_LEN); + + if (ifp->if_type == IFT_ETHER) { + struct arpcom *ac = (struct arpcom *)ifp; + + memcpy(ac->ac_enaddr, lladdr, ETHER_ADDR_LEN); + ac->ac_e64 = ether_addr_to_e64((struct ether_addr *)lladdr); + } return (0); } Index: net/if_ethersubr.c =================================================================== RCS file: /cvs/src/sys/net/if_ethersubr.c,v retrieving revision 1.274 diff -u -p -r1.274 if_ethersubr.c --- net/if_ethersubr.c 7 Mar 2021 06:02:32 -0000 1.274 +++ net/if_ethersubr.c 7 Mar 2021 11:39:41 -0000 @@ -382,7 +382,7 @@ ether_input(struct ifnet *ifp, struct mb struct arpcom *ac; const struct ether_brport *eb; unsigned int sdelim = 0; - uint64_t dst, self; + uint64_t dst; /* Drop short frames */ if (m->m_len < ETHER_HDR_LEN) @@ -452,8 +452,7 @@ ether_input(struct ifnet *ifp, struct mb */ eh = mtod(m, struct ether_header *); - self = ether_addr_to_e64((struct ether_addr *)ac->ac_enaddr); - if (dst != self) { + if (dst != ac->ac_e64) { #if NCARP > 0 /* * If it's not for this port, it could be for carp(4). @@ -481,7 +480,7 @@ ether_input(struct ifnet *ifp, struct mb if ((ifp->if_flags & IFF_SIMPLEX) == 0) { uint64_t src = ether_addr_to_e64( (struct ether_addr *)eh->ether_shost); - if (self == src) + if (ac->ac_e64 == src) goto dropanyway; } @@ -684,6 +683,7 @@ ether_ifattach(struct ifnet *ifp) if_alloc_sadl(ifp); memcpy(LLADDR(ifp->if_sadl), ac->ac_enaddr, ifp->if_addrlen); + ac->ac_e64 = ether_addr_to_e64((struct ether_addr *)ac->ac_enaddr); LIST_INIT(&ac->ac_multiaddrs); #if NBPFILTER > 0 bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, ETHER_HDR_LEN); Index: netinet/if_ether.h =================================================================== RCS file: /cvs/src/sys/netinet/if_ether.h,v retrieving revision 1.80 diff -u -p -r1.80 if_ether.h --- netinet/if_ether.h 5 Mar 2021 06:44:09 -0000 1.80 +++ netinet/if_ether.h 7 Mar 2021 11:39:41 -0000 @@ -232,6 +232,7 @@ struct arpcom { struct ifnet ac_if; /* network-visible interface */ u_int8_t ac_enaddr[ETHER_ADDR_LEN]; /* ethernet hardware address */ char ac__pad[2]; /* pad for some machines */ + uint64_t ac_e64; LIST_HEAD(, ether_multi) ac_multiaddrs; /* list of multicast addrs */ int ac_multicnt; /* length of ac_multiaddrs */ int ac_multirangecnt; /* number of mcast ranges */