patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / net / ipv4 / ipvs / ip_vs_core.c
index a3aa641..9f4b94f 100644 (file)
@@ -735,6 +735,13 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
        if (skb->nfcache & NFC_IPVS_PROPERTY)
                return NF_ACCEPT;
 
+       if (skb->ip_summed == CHECKSUM_HW) {
+               if (skb_checksum_help(pskb, (out == NULL)))
+                       return NF_DROP;
+               if (skb != *pskb)
+                       skb = *pskb;
+       }
+
        iph = skb->nh.iph;
        if (unlikely(iph->protocol == IPPROTO_ICMP)) {
                int related, verdict = ip_vs_out_icmp(pskb, &related);
@@ -974,6 +981,13 @@ ip_vs_in(unsigned int hooknum, struct sk_buff **pskb,
                return NF_ACCEPT;
        }
 
+       if (skb->ip_summed == CHECKSUM_HW) {
+               if (skb_checksum_help(pskb, (out == NULL)))
+                       return NF_DROP;
+               if (skb != *pskb)
+                       skb = *pskb;
+       }
+
        iph = skb->nh.iph;
        if (unlikely(iph->protocol == IPPROTO_ICMP)) {
                int related, verdict = ip_vs_in_icmp(pskb, &related);