lwip-users
[Top][All Lists]
Advanced

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

Re: [lwip-users] TCP behaviour with Zero Copy API using Raw API interfac


From: Peter Jolasson
Subject: Re: [lwip-users] TCP behaviour with Zero Copy API using Raw API interface
Date: Wed, 8 Jun 2005 15:35:10 +0200

... or maybe it should be optimized a bit for speed performance

--8<------------

#if MEM_ALIGNMENT >= 2
  if( (int)dataptr & 1 ) { /* odd address */
  
    for(acc = 0; len > 1; len -= 2) {
      /*    acc = acc + *((u16_t *)dataptr)++;*/
      acc += htons( ((u16_t)(((u8_t *)dataptr)[0])<<8) | ((u8_t *)dataptr)[1] );
      dataptr += 2;
    }
    
  } else 
#endif
  for(acc = 0; len > 1; len -= 2) {
      /*    acc = acc + *((u16_t *)dataptr)++;*/
    acc += *(u16_t *)dataptr;
    dataptr = (void *)((u16_t *)dataptr + 1);
  }

--8<------------

On 6/8/05, Peter Jolasson <address@hidden> wrote:
> Hi,
> 
> My problem was the lwip_standard_chksum() routine in the inet.c module.
> I wasn't aware that it might need to be rewritten/ported. (I don't
> remember seeing it in any documentation.)
> 
> I just included a compile directive when MEM_ALIGNMENT >= 2.
> Maybe this could/should be put into the code repository?
> 
> //Peter
> 
> 
> 
> static u16_t
> lwip_standard_chksum(void *dataptr, int len)
> {
>  u32_t acc;
> 
>  LWIP_DEBUGF(INET_DEBUG, ("lwip_chksum(%p, %d)\n", (void *)dataptr, len));
>  for(acc = 0; len > 1; len -= 2) {
>      /*    acc = acc + *((u16_t *)dataptr)++;*/
> #if MEM_ALIGNMENT >= 2
>    acc += htons( ((u16_t)(((u8_t *)dataptr)[0])<<8) | ((u8_t *)dataptr)[1] );
>    dataptr += 2;
> #else
>    acc += *(u16_t *)dataptr;
>    dataptr = (void *)((u16_t *)dataptr + 1);
> #endif
>  }
> 
>  /* add up any odd byte */
>  if (len == 1) {
>    acc += htons((u16_t)((*(u8_t *)dataptr) & 0xff) << 8);
>    LWIP_DEBUGF(INET_DEBUG, ("inet: chksum: odd byte %d\n", (unsigned
> int)(*(u8_t *)dataptr)));
>  } else {
>    LWIP_DEBUGF(INET_DEBUG, ("inet: chksum: no odd byte\n"));
>  }
>  acc = (acc >> 16) + (acc & 0xffffUL);
> 
>  if ((acc & 0xffff0000) != 0) {
>    acc = (acc >> 16) + (acc & 0xffffUL);
>  }
> 
>  return (u16_t)acc;
> }
> 
> 
> 
> 
> 
> On 6/8/05, Bill Knight <address@hidden> wrote:
> > This is possibly a problem with the ip checksum routine running
> > on a 16 or 32 bit cpu.
> >
> > Regards
> > -Bill Knight
> > R O SOftWare &
> > http://www.theARMPatch.com
> >
> >
> >
> > On Wed, 8 Jun 2005 10:46:29 +0200, Peter Jolasson wrote:
> >
> > >Hi again,
> >
> > >To correct myself.
> > >It's not when there is an odd number of bytes to transfer that it fails.
> > >It fails when the data is located at an odd address.
> >
> > >But as said before my workaround is to set "copy" to 1 and then it works 
> > >OK.
> >
> > >My target cpu is ARM and I've set MEM_ALIGNMENT to 4.
> > >//Peter
> >
> > >On 6/8/05, Peter Jolasson <address@hidden> wrote:
> > >> Hi,
> > >>
> > >> I dont have a solution to your problem but I can describe a 'funny' 
> > >> behavior
> > >> that I've noticed with tcp_write().
> > >> When I send an even number of bytes I can set "copy" to 0.
> > >> But when sending an odd number of bytes I must set "copy" to 1 otherwise
> > >> it will fail.
> > >>
> > >> I'm using lwIP 1.1.0
> > >> //Peter
> > >>
> > >> On 6/7/05, Sathya Thammanur <address@hidden> wrote:
> > >> > Hi all,
> > >> > I have a client program that connects to a server on PC. The client is
> > >> > a simple program that sends data to PC. What I notice is that when I
> > >> > call  tcp_write() with "copy" argument 1, then my program works
> > >> > without any issues. However, if I change "copy" to 0 then I notice
> > >> > that the TCP connection is not established completely. The following
> > >> > happens :
> > >> >
> > >> > Client                            Server
> > >> > SYN ---------->
> > >> >       <---------             SYN, ACK
> > >> >
> > >> > Junk packet sent from client. The Server resends the SYN, ACK and then
> > >> > closes the connection. TCP client sends a lost ACK with incorrect
> > >> > sequence number after couple of junk packets.
> > >> >
> > >> > I do notice that my application call back that is registered with
> > >> > tcp_connected() is called. Here is where I start to send data. I am
> > >> > using lwip version 0.7.2.  Am I using the tcp_write() in the right way
> > >> > as intended ? Any correct usage of this function will be very useful.
> > >> >
> > >> > Any help would be greatly appreciated.
> > >> >
> > >> > Thanks,
> > >> > Sathya
> > >> >
> > >> >
> > >> > _______________________________________________
> > >> > lwip-users mailing list
> > >> > address@hidden
> > >> > http://lists.nongnu.org/mailman/listinfo/lwip-users
> > >> >
> > >>
> >
> >
> > >_______________________________________________
> > >lwip-users mailing list
> > >address@hidden
> > >http://lists.nongnu.org/mailman/listinfo/lwip-users
> >
> >
> >
> >
> >
> > _______________________________________________
> > lwip-users mailing list
> > address@hidden
> > http://lists.nongnu.org/mailman/listinfo/lwip-users
> >
>




reply via email to

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