******************************************************************* 2.6.19 * * From skbuff.h * #define CHECKSUM_NONE 0 * #define CHECKSUM_PARTIAL 1 * #define CHECKSUM_UNNECESSARY 2 * #define CHECKSUM_COMPLETE 3 * * /* * * Invalidate hardware checksum when packet is to be mangled, and * * complete checksum manually on outgoing path. * */ * int skb_checksum_help(struct sk_buff *skb) * { * unsigned int csum; * int ret = 0, offset = skb->h.raw - skb->data; * * if (skb->ip_summed == CHECKSUM_COMPLETE) * goto out_set_summed; * * if (unlikely(skb_shinfo(skb)->gso_size)) { * /* Let GSO fix up the checksum. */ * goto out_set_summed; * } * * if (skb_cloned(skb)) { * ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); * if (ret) * goto out; * } * * BUG_ON(offset > (int)skb->len); * csum = skb_checksum(skb, offset, skb->len-offset, 0); * * offset = skb->tail - skb->h.raw; * BUG_ON(offset <= 0); * BUG_ON(skb->csum + 2 > offset); * * *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum); * * out_set_summed: * skb->ip_summed = CHECKSUM_NONE; * out: * return ret; * } * ******************************************************************* 2.6.18 * * From skbuff.h * #define CHECKSUM_NONE 0 * #define CHECKSUM_HW 1 * #define CHECKSUM_UNNECESSARY 2//LINUX_VERSION_CODE * * /* * * Invalidate hardware checksum when packet is to be mangled, and * * complete checksum manually on outgoing path. * */ * int skb_checksum_help(struct sk_buff *skb, int inward) * { * unsigned int csum; * int ret = 0, offset = skb->h.raw - skb->data; * * if (inward) * goto out_set_summed; * * if (unlikely(skb_shinfo(skb)->gso_size)) { * /* Let GSO fix up the checksum. */ * goto out_set_summed; * } * * if (skb_cloned(skb)) { * ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); * if (ret) * goto out; * } * * BUG_ON(offset > (int)skb->len); * csum = skb_checksum(skb, offset, skb->len-offset, 0); * * offset = skb->tail - skb->h.raw; * BUG_ON(offset <= 0); * BUG_ON(skb->csum + 2 > offset); * * *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum); * * out_set_summed: * skb->ip_summed = CHECKSUM_NONE; * out: * return ret; * } * *******************************************************************