aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@FreeBSD.org>2005-11-30 17:48:23 +0000
committerRuslan Ermilov <ru@FreeBSD.org>2005-11-30 17:48:23 +0000
commit3faffd5dae0c1dd9acf64d65e2b166b16787f2ee (patch)
tree2c9c688d6fd1feeef812658b41be669548cc4d27
parentabffa5185a88906ff2d31d931baa40d8e42dc5f0 (diff)
Notes
-rw-r--r--sys/dev/de/if_de.c37
-rw-r--r--sys/dev/de/if_devar.h4
-rw-r--r--sys/pci/if_de.c37
-rw-r--r--sys/pci/if_devar.h4
4 files changed, 40 insertions, 42 deletions
diff --git a/sys/dev/de/if_de.c b/sys/dev/de/if_de.c
index 93593b12d53d8..feaedac021e33 100644
--- a/sys/dev/de/if_de.c
+++ b/sys/dev/de/if_de.c
@@ -3023,6 +3023,7 @@ tulip_addr_filter(tulip_softc_t * const sc)
struct ifmultiaddr *ifma;
struct ifnet *ifp;
u_char *addrp;
+ u_char eaddr[ETHER_ADDR_LEN];
int multicnt;
TULIP_LOCK_ASSERT(sc);
@@ -3038,6 +3039,10 @@ tulip_addr_filter(tulip_softc_t * const sc)
multicnt = 0;
ifp = sc->tulip_ifp;
IF_ADDR_LOCK(ifp);
+
+ /* Copy MAC address on stack to align. */
+ bcopy(IF_LLADDR(ifp), eaddr, ETHER_ADDR_LEN);
+
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
if (ifma->ifma_addr->sa_family == AF_LINK)
@@ -3081,12 +3086,12 @@ tulip_addr_filter(tulip_softc_t * const sc)
hash = tulip_mchash(ifp->if_broadcastaddr);
sp[hash >> 4] |= htole32(1 << (hash & 0xF));
if (sc->tulip_flags & TULIP_WANTHASHONLY) {
- hash = tulip_mchash(IF_LLADDR(ifp));
+ hash = tulip_mchash(eaddr);
sp[hash >> 4] |= htole32(1 << (hash & 0xF));
} else {
- sp[39] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 0);
- sp[40] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 1);
- sp[41] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 2);
+ sp[39] = TULIP_SP_MAC(((u_int16_t *)eaddr)[0]);
+ sp[40] = TULIP_SP_MAC(((u_int16_t *)eaddr)[1]);
+ sp[41] = TULIP_SP_MAC(((u_int16_t *)eaddr)[2]);
}
}
}
@@ -3101,32 +3106,26 @@ tulip_addr_filter(tulip_softc_t * const sc)
if (ifma->ifma_addr->sa_family != AF_LINK)
continue;
addrp = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
- *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 0);
- *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 1);
- *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 2);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[0]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[1]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[2]);
idx++;
}
/*
* Add the broadcast address.
*/
idx++;
-#if BYTE_ORDER == BIG_ENDIAN
- *sp++ = 0xFFFF << 16;
- *sp++ = 0xFFFF << 16;
- *sp++ = 0xFFFF << 16;
-#else
- *sp++ = 0xFFFF;
- *sp++ = 0xFFFF;
- *sp++ = 0xFFFF;
-#endif
+ *sp++ = TULIP_SP_MAC(0xFFFF);
+ *sp++ = TULIP_SP_MAC(0xFFFF);
+ *sp++ = TULIP_SP_MAC(0xFFFF);
}
/*
* Pad the rest with our hardware address
*/
for (; idx < 16; idx++) {
- *sp++ = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 0);
- *sp++ = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 1);
- *sp++ = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 2);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)eaddr)[0]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)eaddr)[1]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)eaddr)[2]);
}
}
IF_ADDR_UNLOCK(ifp);
diff --git a/sys/dev/de/if_devar.h b/sys/dev/de/if_devar.h
index 75565b063527d..ae96b2e70edf4 100644
--- a/sys/dev/de/if_devar.h
+++ b/sys/dev/de/if_devar.h
@@ -837,9 +837,9 @@ static const struct {
* endian case, just shift them left 16.
*/
#if BYTE_ORDER == BIG_ENDIAN
-#define TULIP_SP_MAC(ptr) (be16dec(ptr) << 16)
+#define TULIP_SP_MAC(x) ((x) << 16)
#else
-#define TULIP_SP_MAC(ptr) (le16dec(ptr))
+#define TULIP_SP_MAC(x) (x)
#endif
/*
diff --git a/sys/pci/if_de.c b/sys/pci/if_de.c
index 93593b12d53d8..feaedac021e33 100644
--- a/sys/pci/if_de.c
+++ b/sys/pci/if_de.c
@@ -3023,6 +3023,7 @@ tulip_addr_filter(tulip_softc_t * const sc)
struct ifmultiaddr *ifma;
struct ifnet *ifp;
u_char *addrp;
+ u_char eaddr[ETHER_ADDR_LEN];
int multicnt;
TULIP_LOCK_ASSERT(sc);
@@ -3038,6 +3039,10 @@ tulip_addr_filter(tulip_softc_t * const sc)
multicnt = 0;
ifp = sc->tulip_ifp;
IF_ADDR_LOCK(ifp);
+
+ /* Copy MAC address on stack to align. */
+ bcopy(IF_LLADDR(ifp), eaddr, ETHER_ADDR_LEN);
+
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
if (ifma->ifma_addr->sa_family == AF_LINK)
@@ -3081,12 +3086,12 @@ tulip_addr_filter(tulip_softc_t * const sc)
hash = tulip_mchash(ifp->if_broadcastaddr);
sp[hash >> 4] |= htole32(1 << (hash & 0xF));
if (sc->tulip_flags & TULIP_WANTHASHONLY) {
- hash = tulip_mchash(IF_LLADDR(ifp));
+ hash = tulip_mchash(eaddr);
sp[hash >> 4] |= htole32(1 << (hash & 0xF));
} else {
- sp[39] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 0);
- sp[40] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 1);
- sp[41] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 2);
+ sp[39] = TULIP_SP_MAC(((u_int16_t *)eaddr)[0]);
+ sp[40] = TULIP_SP_MAC(((u_int16_t *)eaddr)[1]);
+ sp[41] = TULIP_SP_MAC(((u_int16_t *)eaddr)[2]);
}
}
}
@@ -3101,32 +3106,26 @@ tulip_addr_filter(tulip_softc_t * const sc)
if (ifma->ifma_addr->sa_family != AF_LINK)
continue;
addrp = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
- *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 0);
- *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 1);
- *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 2);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[0]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[1]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[2]);
idx++;
}
/*
* Add the broadcast address.
*/
idx++;
-#if BYTE_ORDER == BIG_ENDIAN
- *sp++ = 0xFFFF << 16;
- *sp++ = 0xFFFF << 16;
- *sp++ = 0xFFFF << 16;
-#else
- *sp++ = 0xFFFF;
- *sp++ = 0xFFFF;
- *sp++ = 0xFFFF;
-#endif
+ *sp++ = TULIP_SP_MAC(0xFFFF);
+ *sp++ = TULIP_SP_MAC(0xFFFF);
+ *sp++ = TULIP_SP_MAC(0xFFFF);
}
/*
* Pad the rest with our hardware address
*/
for (; idx < 16; idx++) {
- *sp++ = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 0);
- *sp++ = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 1);
- *sp++ = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 2);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)eaddr)[0]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)eaddr)[1]);
+ *sp++ = TULIP_SP_MAC(((u_int16_t *)eaddr)[2]);
}
}
IF_ADDR_UNLOCK(ifp);
diff --git a/sys/pci/if_devar.h b/sys/pci/if_devar.h
index 75565b063527d..ae96b2e70edf4 100644
--- a/sys/pci/if_devar.h
+++ b/sys/pci/if_devar.h
@@ -837,9 +837,9 @@ static const struct {
* endian case, just shift them left 16.
*/
#if BYTE_ORDER == BIG_ENDIAN
-#define TULIP_SP_MAC(ptr) (be16dec(ptr) << 16)
+#define TULIP_SP_MAC(x) ((x) << 16)
#else
-#define TULIP_SP_MAC(ptr) (le16dec(ptr))
+#define TULIP_SP_MAC(x) (x)
#endif
/*