lwip-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-devel] [bug #36153] TCP Cheksum error if LWIP_CHECKSUM_ON_COPY=1


From: Alexander
Subject: [lwip-devel] [bug #36153] TCP Cheksum error if LWIP_CHECKSUM_ON_COPY=1
Date: Mon, 16 Apr 2012 13:10:55 +0000
User-agent: Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0

Follow-up Comment #8, bug #36153 (project lwip):

I finally realized what going on.
It's lwip bug(. checksum of delayed tcp_seg not correctly summed with new
sended data. Here is example with my comments:

//my test values for reproduce
#define TCP_SND_BUF          (24)
#define TCP_MSS              (10) //yes, I know that TCP_MSS must be more then
536, but it's for easily debug only
#define LWIP_CHECKSUM_ON_COPY              1
#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK  1

with this options sending 27 bytes of any data will fail

log:
TCP connection request 4163 -> 80. //new client connected
tcp_enqueue_flags: queueing 6510:6511 (0x12)
tcp_output_segment: 6510:6510
TCP connection established 4163 -> 80.
tcp_output: nothing to send (0x0) //here we send 24 bytes of data
tcp_write(pcb=0x200019a8, data=0x80273a0, len=24, apiflags=2) //24 writes
because of TCP_SND_BUF limit
tcp_write: queueing 6511:6521  //full segment1 len = 10
tcp_write: queueing 6521:6531  //full segment2 len = 10
tcp_write: queueing 6531:6535  //NOT full segment3 len = 4 (will wait for
TCP_MORE_DATA)
tcp_output_segment: 6511:6521  //segment1 out
tcp_output_segment: 6521:6531  //segment2 out
tcp_write(pcb=0x200019a8, data=0x80273b8, len=3, apiflags=0) //after ACK
received we write remaining data (3 bytes)
tcp_output_segment: 6531:6538   //it's segment with old 4 bytes + new 3 bytes

tcp_output_segment: calculated checksum is a64a instead of ae6 //checksum of
this segment incorrect!!

now deep into the code:
tcp_write function declare next variables if LWIP_CHECKSUM_ON_COPY=1

u16_t concat_chksum = 0;        //checksum of new added data
u8_t concat_chksum_swapped = 0; //is checksum swapped or not
u16_t concat_chksummed = 0;     //len of new data witch added to delayed
segment

//in 2 phase we set this variables to right values
after all we concat_p to last_unsent->p and sum checksums

#if TCP_CHECKSUM_ON_COPY
    if (concat_chksummed) {

        /*ERROR if concat_chksum swapped!! we must swap it back */

        tcp_seg_add_chksum(concat_chksum, concat_chksummed, 
&last_unsent->chksum,
        &last_unsent->chksum_swapped);
      last_unsent->flags |= TF_SEG_DATA_CHECKSUMMED;
    }
#endif /* TCP_CHECKSUM_ON_COPY */

I add this before call tcp_seg_add_chksum (also patch in attach)
/*if concat checksumm swapped - swap it back */
if (concat_chksum_swapped){
         concat_chksum = SWAP_BYTES_IN_WORD(concat_chksum);
}

This solve the problem.

After viewing the code, I think, that concat_chksum_swapped not necessary,
because we don't accumulate checksum in concat_chksum. (why tcp_seg_add_chksum
called for compute new data checksum in phase 2??)
I need someone to fix the code properly, I'm afraid to break the code.

(file #25657)
    _______________________________________________________

Additional Item Attachment:

File name: tcp_out.c.patch                Size:0 KB


    _______________________________________________________

Reply to this item at:

  <http://savannah.nongnu.org/bugs/?36153>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.nongnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]