Incremental update of TCP Checksum

From: Vishwas Raman
Date: Tue Sep 16 2003 - 13:51:52 EST


Hi all,

I have a very simple question, which a lot of you would have solved. I am intercepting a TCP packet, which I would like to change slightly.

Let's say, I change the doff field of the tcp-header (for eg: increase it by 1). I know it is wrong just to change the doff field without increasing the packet length, but lets say I do it just as a test. Since I changed a portion of the tcp header, I have to update the tcp checksum too right!!! If so, what is the best way to do so, without having to recalculate the entire tcp checksum (I know how to recalculate the checksum from scratch).

Can anyone out there tell me the algorithm to update the checksum without having to recalculate it.

I tried the following algorithm but it didnt work. The packet got rejected as a packet with bad cksum.

void changePacket(struct sk_buff* skb)
{
struct tcphdr *tcpHdr = skb->h.th;
// Verifying the tcp checksum works here...
tcpHeader->doff += 1;
long cksum = (~(tcpHdr->check))&0xffff;
cksum += 1;
while (cksum >> 16)
{
cksum = (cksum & 0xffff) + (cksum >> 16);
}
tcpHeader->check = ~cksum;
// Verifying tcp checksum here fails with bad cksum
}

Any pointers/help in this regard will be highly appreciated...

Thanks,

-Vishwas.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/