Align IP header on four byte boundary

Quantenna calls ip_hdr_aligned() from ip_rcv(). ip_hdr_aligned()
memmoves the frame to ensure that the IP header is aligned on a four
byte boundary. This does not work properly because ip_rcv() potentially
clones the skb prior to that. You can't change the ->data or other
pointers of a cloned skb, because you would need to change the pointers
in all of the clones which you can't because Linux is not keeping track
of all clones.

Let's perform this memmove operation very early, hopefully prior to
anybody calling skb_clone() on it.

This is only a temporary solution until Quantenna found a nicer
solution.
diff --git a/net/core/dev.c b/net/core/dev.c
index 4b667b0..b36063e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4107,6 +4107,12 @@
 	orig_dev = skb->dev;
 
 	skb_reset_network_header(skb);
+
+	/* Memmove frame if IP header is not aligned on a four byte boundary.
+	 * This is only a temporary solution until Quantenna found a more
+	 * permanent solution. */
+	ip_hdr_aligned(skb);
+
 	if (!skb_transport_header_was_set(skb))
 		skb_reset_transport_header(skb);
 	skb_reset_mac_len(skb);