@@ -566,6 +566,7 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
void *va;
int used_frags;
dma_addr_t dma;
+ int hdrlen;
skb = netdev_alloc_skb(priv->dev, SMALL_PACKET_SIZE + NET_IP_ALIGN);
if (!skb) {
@@ -598,15 +599,16 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
skb_shinfo(skb)->nr_frags = used_frags;
/* Copy headers into the skb linear buffer */
- memcpy(skb->data, va, HEADER_COPY_SIZE);
- skb->tail += HEADER_COPY_SIZE;
+ hdrlen = __net_get_headlen(va, SMALL_PACKET_SIZE);
+ memcpy(skb->data, va, ALIGN(hdrlen, sizeof(long)));
+ skb->tail += hdrlen;
/* Skip headers in first fragment */
- skb_shinfo(skb)->frags[0].page_offset += HEADER_COPY_SIZE;
+ skb_shinfo(skb)->frags[0].page_offset += hdrlen;
/* Adjust size of first fragment */
- skb_frag_size_sub(&skb_shinfo(skb)->frags[0], HEADER_COPY_SIZE);
- skb->data_len = length - HEADER_COPY_SIZE;
+ skb_frag_size_sub(&skb_shinfo(skb)->frags[0], hdrlen);
+ skb->data_len = length - hdrlen;
}
return skb;
}