For the calculation of the flush variable, use the get_unaligned_xxx() helpers to access only relevant bits of the IP header. Note: Since I don't know the network details, I'm not sure if "& ~IP_DF" (& ~0x4000) is correct, or if "& IP_OFFSET" (& 0x1FFF) should be used instead (which I believe would be more correct). Instead of possibly breaking things I left it as is, but maybe some expert can check? Signed-off-by: Helge Deller diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index c7731e300a44..58cad2687c2c 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -1479,7 +1479,7 @@ struct sk_buff *inet_gro_receive(struct list_head *head, struct sk_buff *skb) struct sk_buff *p; unsigned int hlen; unsigned int off; - int flush = 1; + u16 flush = 1; int proto; off = skb_gro_offset(skb); @@ -1504,7 +1504,8 @@ struct sk_buff *inet_gro_receive(struct list_head *head, struct sk_buff *skb) goto out; NAPI_GRO_CB(skb)->proto = proto; - flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (ntohl(*(__be32 *)&iph->id) & ~IP_DF)); + flush = (get_unaligned_be16(&iph->tot_len) ^ skb_gro_len(skb)) | + (get_unaligned_be16(&iph->frag_off) & ~IP_DF); list_for_each_entry(p, head, list) { struct iphdr *iph2;