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 reveice an alignement
fault. To avoid this case, we need to pull-up the data of ETHER_ALIGN bytes.
I'm not sure how this patch will impact x86, we need to do some benchmarking
without and with it.
Furthermore, I don't know if m_copyup is the rigth function to use here. Can
any expert to the network stack can tell me if there is a better solution?
#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)
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;