Herbert Xu wrote: >>+u_int16_t nf_proto_csum_update(struct sk_buff *skb, >>+ u_int32_t oldval, u_int32_t newval, >>+ u_int16_t csum, int pseudohdr) >>+{ >>+ if (skb->ip_summed != CHECKSUM_PARTIAL) { >>+ csum = nf_csum_update(oldval, newval, csum); >>+ if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) > > > Shouldn't that be !pseudohdr?
No, if the changed data is part of the pseudo-hdr, we need to update skb->csum so the skb passes later checksum checks. >>+ skb->csum = nf_csum_update(oldval, newval, skb->csum); > > ^^^^^^^^^ > > This is a 32-bit quantity so nf_csum_update should eat a 32-bit quantity > as well. Also, this checksum is not inverted so you need > > skb->csum = ~nf_csum_update(oldval, newval, ~skb->csum); I'll change it to 32-bit and try the inversion, but it works fine this way. - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html