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