communications failing due to large packetsize?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

communications failing due to large packetsize?

Frans Moeskops
Dear LWIP users,

I am using the lwip 1.1.1 on two embedded applications. They talk to
eachother and read/write to FIFO's. The pbufs are chopped up to 2 bytes on
the sending-end. When I send 1350 bytes everything goes well, but 30 bytes
more and it fails.  The debug (and ethereal) both say 'packet discarded due
to failing checksum' and then my connection is broken. The receiver-side
isn't acking the failed package, so my senders' queue is only growing. I'm
new in the TCP/IP world so I'm a bit clueless about where to look.

I use these defines:

#define MEM_SIZE                         2*1024*1024
#define TCP_MSS                         1460
#define TCP_SND_BUF   2*1024*1024
#define TCP_SND_QUEUELEN 2*1024*1024
#define MEMP_NUM_TCP_SEG                 2*1024
#define MEMP_NUM_PBUF                   16
#define TCP_WND                         4*1024
#define WND_OFFSET 633


thank you for your time,

Frans



_______________________________________________
lwip-users mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/lwip-users
Reply | Threaded
Open this post in threaded view
|

Re: communications failing due to large packetsize?

Kieran Mansley
On Fri, 2006-12-08 at 11:11 +0100, Frans Moeskops wrote:
> Dear LWIP users,
>
> I am using the lwip 1.1.1 on two embedded applications. They talk to
> eachother and read/write to FIFO's. The pbufs are chopped up to 2 bytes on
> the sending-end. When I send 1350 bytes everything goes well, but 30 bytes
> more and it fails.

Sounds like it's OK when everything fits in one segment, but not when
two are needed, although with your MSS size set at 1460 I'd expect the
point at which it fails to be a bit closer to that than 1350 bytes.

>   The debug (and ethereal) both say 'packet discarded due
> to failing checksum' and then my connection is broken. The receiver-side
> isn't acking the failed package, so my senders' queue is only growing. I'm
> new in the TCP/IP world so I'm a bit clueless about where to look.

I'd look at the checksum generation as a first check.  

> I use these defines:
>
> #define MEM_SIZE                         2*1024*1024
> #define TCP_MSS                         1460
> #define TCP_SND_BUF   2*1024*1024

I think I'd define TCP_SND_BUF to be a little less than MEM_SIZE so that
not all the memory can be in the send buffer, leaving none for receive.
A 2MB send buffer is very large - I think linux defaults to about 64KB
for the send and receive buffer lengths, although obviously you can set
them higher if you need to for performance.

> #define TCP_SND_QUEUELEN 2*1024*1024

The send queuelen is the length in packet buffers, not bytes!

> #define MEMP_NUM_TCP_SEG                 2*1024
> #define MEMP_NUM_PBUF                   16

You've got 2048 TCP segments, but only 16 packet buffers to put them in.
These should I think be roughly similar values as often you'll have just
one segment in each packet buffer.

> #define TCP_WND                         4*1024

TCP_WND is the receive equivalent of the send buffer, so it makes sense
to set these roughly the same, and probably sensible to specify them
both as multiples of TCP_MSS.

> #define WND_OFFSET 633

Not sure what this one is/does - it's not a standard option as far as I
can see.

Hope that helps.

Feel free to attach an ethereal capture if you think that would help
throw light on the problem but sounds as though the checksumming is
worth looking into first.

Kieran




_______________________________________________
lwip-users mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/lwip-users