|
@@ -218,9 +218,35 @@ If use of such macros is not convenient, another option is to use memcpy(),
|
|
|
where the source or destination (or both) are of type u8* or unsigned char*.
|
|
|
Due to the byte-wise nature of this operation, unaligned accesses are avoided.
|
|
|
|
|
|
+
|
|
|
+Alignment vs. Networking
|
|
|
+========================
|
|
|
+
|
|
|
+On architectures that require aligned loads, networking requires that the IP
|
|
|
+header is aligned on a four-byte boundary to optimise the IP stack. For
|
|
|
+regular ethernet hardware, the constant NET_IP_ALIGN is used. On most
|
|
|
+architectures this constant has the value 2 because the normal ethernet
|
|
|
+header is 14 bytes long, so in order to get proper alignment one needs to
|
|
|
+DMA to an address which can be expressed as 4*n + 2. One notable exception
|
|
|
+here is powerpc which defines NET_IP_ALIGN to 0 because DMA to unaligned
|
|
|
+addresses can be very expensive and dwarf the cost of unaligned loads.
|
|
|
+
|
|
|
+For some ethernet hardware that cannot DMA to unaligned addresses like
|
|
|
+4*n+2 or non-ethernet hardware, this can be a problem, and it is then
|
|
|
+required to copy the incoming frame into an aligned buffer. Because this is
|
|
|
+unnecessary on architectures that can do unaligned accesses, the code can be
|
|
|
+made dependent on CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS like so:
|
|
|
+
|
|
|
+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
|
|
+ skb = original skb
|
|
|
+#else
|
|
|
+ skb = copy skb
|
|
|
+#endif
|
|
|
+
|
|
|
--
|
|
|
-Author: Daniel Drake <dsd@gentoo.org>
|
|
|
+Authors: Daniel Drake <dsd@gentoo.org>,
|
|
|
+ Johannes Berg <johannes@sipsolutions.net>
|
|
|
With help from: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,
|
|
|
-Johannes Berg, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock,
|
|
|
-Uli Kunitz, Vadim Lobanov
|
|
|
+Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,
|
|
|
+Vadim Lobanov
|
|
|
|