Hi folks -

I have an FTP server on lwIP that works for sending small files, but hangs when 
sending large files. The sending file code is quite simple - it just reads (up 
to) 2K and then sends it via lwip_send.

I'm running FreeRTOS on an AT91SAM7X512 (256K RAM).

When I say "hang", I mean that all threads end up blocked. The ftp thread is 
waiting for a response from lwip_send (tcpip_apimsg -> sys_arch_sem_wait), and 
the tcpip_thread (lwip thread) is in tcpip_thread -> sys_mbox_fetch (it does 
time out and loop around, but does not get any messages).

I suspect the problem may be with the way I set up memory allocation. I wrote a 
TLSF-style allocator that can be called from an ISR or regular user code, and 
used that to replace both regular allocations (mem_malloc, etc) and pool 
allocations (MEMP_MEM_MALLOC == 1).

I have shown that when sending a large file, the memory is exhausted 
(mem_malloc does return 0). Also, I enabled link stats, and it shows drop and 
memerr non-zero (and equal).

I'm not a low-level TCP/IP guy, but I think what's happening is that I'm 
filling up memory with outgoing buffers, and then there's no memory for the eth 
driver to receive ACKs and pass them to the lwIP stack.

Does this sound correct?

If so, then I'm unsure what the best solution would be. I'm not fond of 
re-enabling the pools (our app usually does lots of small sends with multiple 
server and client connections, but occasionally needs to send or receive 
gigabytes; historically, tweaking the pool sizes has been a painful 
trial-and-error process).

Is it possible to statically allocate space for a pbuf chain large enough for 
any incoming packet? This doesn't seem feasible since netif::input takes 
ownership of the pbuf chain.

One solution would be to limit the amount of data ftp passes to lwip_send. My 
TCP_SND_BUF is TCP_WND (== 4 * TCP_MSS, where TCP_MSS == 1460), so it's only 
5840 bytes, but I'm pretty sure lwip_send is allowing me to queue more data 
than that. Is there a procedure for detecting "how full" the send buffer is on 
a socket so that I can throttle in my FTP code?

I'd appreciate any advice on how to proceed.

        -Steve
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to