Index: sys/dev/xen/netfront/netfront.c =================================================================== --- sys/dev/xen/netfront/netfront.c +++ sys/dev/xen/netfront/netfront.c @@ -88,6 +88,8 @@ #include "xenbus_if.h" +#define ETHER_ALIGN 2 + /* Features supported by all backends. TSO and LRO can be negotiated */ #define XN_CSUM_FEATURES (CSUM_TCP | CSUM_UDP) @@ -1357,6 +1359,22 @@ ref_cons = *cons + frags; frags++; } + + if (err == 0) { + /* + * The ethernet header size is not word aligned. Therefore, + * the IP packet and so on won't be align. On some architecture + * (such as ARM) unaligned access may be slower and/or not + * supported. Therefore we might receive an alignment fault. + * To avoid this case, we need to pull-up the data of + * ETHER_ALIGN bytes. + */ + m0 = m_copyup(m0, min(m0->m_pkthdr.len, max_protohdr), + ETHER_ALIGN); + if (m0 == 0) + err = ENOMEM; + } + *list = m0; *cons += frags; *pages_flipped_p = pages_flipped;