summaryrefslogtreecommitdiffstats
path: root/sys/net/if_loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net/if_loop.c')
-rw-r--r--sys/net/if_loop.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
index 5f6e91b..741e09c 100644
--- a/sys/net/if_loop.c
+++ b/sys/net/if_loop.c
@@ -242,17 +242,19 @@ if_simloop(ifp, m, af, hlen)
/* Strip away media header */
if (hlen > 0) {
+ m_adj(m, hlen);
#ifdef __alpha__
/* The alpha doesn't like unaligned data.
* We move data down in the first mbuf */
- if (hlen & 3) {
- bcopy(m->m_data + hlen, m->m_data, m->m_len - hlen);
- m->m_len -= hlen;
- if (m->m_flags & M_PKTHDR)
- m->m_pkthdr.len -= hlen;
- } else
+ if (mtod(m, vm_offset_t) & 3) {
+ KASSERT(hlen >= 3, "if_simloop: hlen too small");
+ bcopy(m->m_data,
+ (char *)(mtod(m, vm_offset_t)
+ - (mtod(m, vm_offset_t) & 3)),
+ m->m_len);
+ mtod(m,vm_offset_t) -= (mtod(m, vm_offset_t) & 3);
+ }
#endif
- m_adj(m, hlen);
}
/* Deliver to upper layer protocol */
OpenPOWER on IntegriCloud