Piero,
It all works for me as expected. Back then I was fighting the tcp_poll callback calling my tcp_sent function when I wasn't expecting it and that cascaded in several problems. One of them was "fixed" by increasing TCP_SND_QUEUELEN. I dropped TCP_SND_QUEUELEN to 16 and although my output is choppy, it all works fine now. As others have pointed out - the behavior is correct. If data can't be queued, something has to block until the data can be queued. If you don't want blocking I guess you need to check if you can queue data before going through with the call that blocks. Something somewhere in your program has to wait or simply drop the outgoing data if it's not important (e.g. status). Bill _____ From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Piero 74 Sent: Wednesday, March 19, 2008 10:53 AM To: Mailing list for lwIP users Subject: Re: [lwip-users] tcp_enqueue problem, using socket: the piece of code was inside do_writemore function. Bill, can you check this idea? or can you integrate here your test tcp_accept_data ??? thanks, Piero 2008/3/19, Piero 74 <[EMAIL PROTECTED]>: i saw this piece of code in tcp_write: .... err = tcp_write(conn->pcb.tcp, dataptr, len, conn->write_msg->msg.w.apiflags); LWIP_ASSERT("do_writemore: invalid length!", ((conn->write_offset + len) <= conn->write_msg->msg.w.len)); if (err == ERR_OK) { conn->write_offset += len; if (conn->write_offset == conn->write_msg->msg.w.len) { /* everything was written */ write_finished = 1; conn->write_msg = NULL; conn->write_offset = 0; } err = tcp_output_nagle(conn->pcb.tcp); conn->err = err; if ((err == ERR_OK) && (tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT)) { API_EVENT(conn, NETCONN_EVT_SENDMINUS, len); } } else if (err == ERR_MEM) { /* tcp_enqueue returned ERR_MEM, try tcp_output anyway */ err = tcp_output(conn->pcb.tcp); #if LWIP_TCPIP_CORE_LOCKING conn->write_delayed = 1; #endif } else { /* if ERR_MEM, we wait for sent_tcp or poll_tcp to be called <--------- wrong comment??? ERR_CONN instead ERR_MEM on other errors we don't try writing any more */ conn->err = err; write_finished = 1; } if (write_finished) { /* everything was written: set back connection state and back to application task */ .... first, i suppose there is a wrong comment (see above) second, i propose a patch (but i'm not sure); if tcp_enqueue returned ERR_MEM, instead of try tcp_output anyway, exit using conn->err = err; write_finished = 1; what do you think??? Piero. 2008/3/19, Piero 74 <[EMAIL PROTECTED]>: i didn't understand this suggest: #define tcp_accept_data(pcb) ((pcb)->snd_buf > 0 * (((pcb)->queuelen < TCP_SND_QUEUELEN)) 0 * (((pcb)->queuelen < TCP_SND_QUEUELEN) is always 0, right??? where have i to add this macro??
_______________________________________________ lwip-users mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/lwip-users
