net: Kill link between CSUM and SG features.
[pandora-kernel.git] / net / ipv4 / af_inet.c
index e225a4e..dc3f677 100644 (file)
@@ -248,8 +248,12 @@ EXPORT_SYMBOL(inet_listen);
 u32 inet_ehash_secret __read_mostly;
 EXPORT_SYMBOL(inet_ehash_secret);
 
+u32 ipv6_hash_secret __read_mostly;
+EXPORT_SYMBOL(ipv6_hash_secret);
+
 /*
- * inet_ehash_secret must be set exactly once
+ * inet_ehash_secret must be set exactly once, and to a non nul value
+ * ipv6_hash_secret must be set exactly once.
  */
 void build_ehash_secret(void)
 {
@@ -259,7 +263,8 @@ void build_ehash_secret(void)
                get_random_bytes(&rnd, sizeof(rnd));
        } while (rnd == 0);
 
-       cmpxchg(&inet_ehash_secret, 0, rnd);
+       if (cmpxchg(&inet_ehash_secret, 0, rnd) == 0)
+               get_random_bytes(&ipv6_hash_secret, sizeof(ipv6_hash_secret));
 }
 EXPORT_SYMBOL(build_ehash_secret);
 
@@ -1279,9 +1284,6 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
        int id;
        unsigned int offset = 0;
 
-       if (!(features & NETIF_F_V4_CSUM))
-               features &= ~NETIF_F_SG;
-
        if (unlikely(skb_shinfo(skb)->gso_type &
                     ~(SKB_GSO_TCPV4 |
                       SKB_GSO_UDP |
@@ -1327,8 +1329,10 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
                        if (skb->next != NULL)
                                iph->frag_off |= htons(IP_MF);
                        offset += (skb->len - skb->mac_len - iph->ihl * 4);
-               } else
-                       iph->id = htons(id++);
+               } else  {
+                       if (!(iph->frag_off & htons(IP_DF)))
+                               iph->id = htons(id++);
+               }
                iph->tot_len = htons(skb->len - skb->mac_len);
                iph->check = 0;
                iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
@@ -1572,7 +1576,7 @@ static const struct net_offload udp_offload = {
 
 static const struct net_protocol icmp_protocol = {
        .handler =      icmp_rcv,
-       .err_handler =  ping_err,
+       .err_handler =  icmp_err,
        .no_policy =    1,
        .netns_ok =     1,
 };