ethoc: align received packet to make IP header at word boundary
authorThomas Chou <thomas@wytron.com.tw>
Sun, 4 Oct 2009 23:33:19 +0000 (23:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Oct 2009 10:50:12 +0000 (03:50 -0700)
The packet buffer is allocated at 4 bytes boundary, but the IP header
length and version bits is located at byte 14. These bit fields access
as 32 bits word and caused exception on processors that do not support
unaligned access.

The patch adds 2 bytes offset to make the bit fields word aligned.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethoc.c

index f92747fc5f8b005ba5943964773e47012cc72738..0c6c7f47ace4c21ad3c024f26bc83c3534258ce0 100644 (file)
@@ -399,6 +399,10 @@ static int ethoc_rx(struct net_device *dev, int limit)
                if (ethoc_update_rx_stats(priv, &bd) == 0) {
                        int size = bd.stat >> 16;
                        struct sk_buff *skb = netdev_alloc_skb(dev, size);
+
+                       size -= 4; /* strip the CRC */
+                       skb_reserve(skb, 2); /* align TCP/IP header */
+
                        if (likely(skb)) {
                                void *src = phys_to_virt(bd.addr);
                                memcpy_fromio(skb_put(skb, size), src, size);