[lwip-users] tcp echo example

2014-08-01 Thread M. Manca
Hi all,

I tryed the 'standard' echo example using raw sockets and in my
configuration it works but sends each message 2 times.
I debugged it and I found that the 2nd time the message is always sent
inside the callback function for the received message (the echo replied
by the echo server). Considering that the pbuf_free() is executed in the
send function I really don't understand why it is already valid when the
sent callback is executed. Its address is not null and the content of
the payload is always the echo message.

If I remove the tcp_write() inside the message sent callback everything
works fine.
I don't understand also why there is the tcp_write() inside the callback
considering that every action to receive and transmit a packet is done
every 250 milliseconds callingsys_check_timeouts() and
ethernetif_input(eth0Netif).

Is it normal? Wasn't updated the example?
Any answer/help will be appreciated.

I am using lwip 1.4.1 on a NXP LPC1769 on an EA AOAA board using the
echo example to test the troughput of the network.
Cheers.
logo
*

Massimo Manca*/, Micron Engineering/
via della Ferriera, 48 33170 Pordenone PN ITALIA
Tel: 39 0434 1856131| Mobile: 39 349 4504979
www.micronengineering.it

Twitter
http://s.wisestamp.com/links?url=https%3A%2F%2Ftwitter.com%2Fmassimomanca
LinkedIn
http://s.wisestamp.com/links?url=http%3A%2F%2Fit.linkedin.com%2Fpub%2Fmassimo-manca%2F7%2Fa15%2F479%2F
SlideShare
http://s.wisestamp.com/links?url=http%3A%2F%2Fwww.slideshare.net%2Fmicronpn
Contact me: Skype micron.engineering
Designed with WiseStamp -
http://s.wisestamp.com/links?url=http%3A%2F%2Fr1.wisestamp.com%2Fr%2Flanding%3Fu%3Daaa0e17b0c4ca423%26v%3D3.13.31%26t%3D1406878932897%26promo%3D10%26dest%3Dhttp%253A%252F%252Fwww.wisestamp.com%252Femail-install%253Futm_source%253Dextension%2526utm_medium%253Demail%2526utm_campaign%253Dpromo_10Get
yours
http://s.wisestamp.com/links?url=http%3A%2F%2Fr1.wisestamp.com%2Fr%2Flanding%3Fu%3Daaa0e17b0c4ca423%26v%3D3.13.31%26t%3D1406878932897%26promo%3D10%26dest%3Dhttp%253A%252F%252Fwww.wisestamp.com%252Femail-install%253Futm_source%253Dextension%2526utm_medium%253Demail%2526utm_campaign%253Dpromo_10


---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! 
Antivirus.
http://www.avast.com
attachment: m_manca.vcf___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

Re: [lwip-users] tcp echo example

2014-08-01 Thread Sergio R. Caprile
Hi,
when you say echo example, do you mean the echo example in the contrib
tree or some vendor distributed (and probably modified) file ?
'cause i've run the echo example from the 1.4.1 contrib tree some weeks
ago and I don't recall seeing anything strange.
And btw, I don't see anything close to what you are describing in that
code, and there is only one tcp_write() call in echo.c:

[scaprile@Hal ~]$ grep -n tcp_write
programming/lwip/contrib/apps/tcpecho_raw/echo.c
311:  wr_err = tcp_write(tpcb, ptr-payload, ptr-len, 1);

BTW, if you want to really test the net throughput (or at least come
closer) get the netio patch: https://savannah.nongnu.org/patch/?7026

Regards

-- 


___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users


Re: [lwip-users] tcp echo example

2014-08-01 Thread M. Manca
Il 01/08/2014 20:35, Sergio R. Caprile ha scritto:
 Hi,
 when you say echo example, do you mean the echo example in the contrib
 tree or some vendor distributed (and probably modified) file ?
 'cause i've run the echo example from the 1.4.1 contrib tree some weeks
 ago and I don't recall seeing anything strange.
 And btw, I don't see anything close to what you are describing in that
 code, and there is only one tcp_write() call in echo.c:

 [scaprile@Hal ~]$ grep -n tcp_write
 programming/lwip/contrib/apps/tcpecho_raw/echo.c
 311:  wr_err = tcp_write(tpcb, ptr-payload, ptr-len, 1);
yes, it isn't the only one directly called but if you search for
echo_send() you will find it in echo_recv(), echo_poll(). echo_sent().

The code is exactly that, the port is that for LPC176x. The port is
working perfectly but every echo message is sent 2 times, the 1st is
correct but the second call to tcp_write() cames from the call to
echo_send() inside echo_sent(). Debugging the situation I found that
pbuf_free() is correctly called but the pointer to pbuf (es-p) is not
NULL.

So seems that the effect of the problem is quite clear but is not clear why.

What I can say is that if I want to send a message, it will be copied to
a pbuf and this pbuf in some way will be only enqueued to be
transmitted, right?

Supposing that I write 3 messages, I should call tcp_write() 3 times so
at least 3 pbufs will be enqueued. Considering that messages are really
sent calling tcp_output() that it is called in tcp_fasttmr() and in
tcp_slowtmr() I really don't understand why inside the sent callback the
pbuf pointer is checked and the message re-sent if the pointer is not
null... that it is the last message enqued and this doesn't mean that it
is always the 1st message that will be sent.

I simply think that the call to echo_send() inside the sent callback is
totally wrong .

 BTW, if you want to really test the net throughput (or at least come
 closer) get the netio patch: https://savannah.nongnu.org/patch/?7026

 Regards





logo
*

Massimo Manca*/, Micron Engineering/
via della Ferriera, 48 33170 Pordenone PN ITALIA
Tel: 39 0434 1856131| Mobile: 39 349 4504979
www.micronengineering.it

Twitter
http://s.wisestamp.com/links?url=https%3A%2F%2Ftwitter.com%2Fmassimomanca
LinkedIn
http://s.wisestamp.com/links?url=http%3A%2F%2Fit.linkedin.com%2Fpub%2Fmassimo-manca%2F7%2Fa15%2F479%2F
SlideShare
http://s.wisestamp.com/links?url=http%3A%2F%2Fwww.slideshare.net%2Fmicronpn
Contact me: Skype micron.engineering
Designed with WiseStamp -
http://s.wisestamp.com/links?url=http%3A%2F%2Fr1.wisestamp.com%2Fr%2Flanding%3Fu%3Daaa0e17b0c4ca423%26v%3D3.13.31%26t%3D1406923781901%26promo%3D10%26dest%3Dhttp%253A%252F%252Fwww.wisestamp.com%252Femail-install%253Futm_source%253Dextension%2526utm_medium%253Demail%2526utm_campaign%253Dpromo_10Get
yours
http://s.wisestamp.com/links?url=http%3A%2F%2Fr1.wisestamp.com%2Fr%2Flanding%3Fu%3Daaa0e17b0c4ca423%26v%3D3.13.31%26t%3D1406923781901%26promo%3D10%26dest%3Dhttp%253A%252F%252Fwww.wisestamp.com%252Femail-install%253Futm_source%253Dextension%2526utm_medium%253Demail%2526utm_campaign%253Dpromo_10


---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! 
Antivirus.
http://www.avast.com
attachment: m_manca.vcf___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

Re: [lwip-users] tcp echo example

2014-08-01 Thread Sergio R. Caprile
Not really.
tcp_write() allocates an internal pbuf itself, but you can only send 3
times in a row if yu have enough memory, and as TCP works, there is no
concept of packet and no need to call 3 times in a row. You have a
sndbuf and you can send as much as you can fit inside that sndbuf for
that pcb. Once your buf is filled, you can only send again once data has
been sent out, acknowledged by the receiver, and so that buffer freed,
and that is signalled to you via the tcp_sent() callback.
The whole point of calling echo_send() from inside the callback function
is that in this case the total amount of data actually sent might not
equal the amount of data received (in the whole pbuf). The first call to
tcp_write() sends only the first pbuf in the pbuf chain, and once this
is acked, the tcp_sent() callback will try to send the remaining pbufs
in the chain.
A pbuf may be a chain of pbufs, linked by p-next

Either you have some memory problems or I've been lucky enough to get
whole data inside a single pbuf and didn't trigger the possible bug. I
recall sending small packets, what are you sending ? Again, I suggest
you use netio for big chunks of data.
I don't have the time to build a short tcp_mss version of my linux port
and try it, maybe on monday. I suggest you (besides going for netio) try
with small messages, I'm sure those work OK. If they do, then check the
pbuf chains, if they don't... check your port.

Regards

-- 


___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users


Re: [lwip-users] tcp echo example

2014-08-01 Thread M. Manca
Il 01/08/2014 23:46, Sergio R. Caprile ha scritto:
 Not really.
 tcp_write() allocates an internal pbuf itself, but you can only send 3
 times in a row if yu have enough memory, and as TCP works, there is no
 concept of packet and no need to call 3 times in a row.
I mean a different thing. I said that also if I could send 3 packets
calling 3 times tcp_write() there is no reason to send a message inside
the sent callback because it could only resend the last message sent
but if the callback is entered means that the packet was sent.
Of course sending only 1 message (I mean calling tcp_write() only 1
time) there is really no reason to provide the possibility to send hte
same packet another time.
  You have a
 sndbuf and you can send as much as you can fit inside that sndbuf for
 that pcb. Once your buf is filled, you can only send again once data has
 been sent out, acknowledged by the receiver, and so that buffer freed,
 and that is signalled to you via the tcp_sent() callback.
Yes, the problem is that for me the pcb is not freed. It contains valid
data, exactly the last data sent and also the pbuf pointer is not null.
 The whole point of calling echo_send() from inside the callback function
 is that in this case the total amount of data actually sent might not
 equal the amount of data received (in the whole pbuf).
I made a test running all night... it sent more then 20 messages and
received always the reply in a single message, same behavior for the
messages sent.
  The first call to
 tcp_write() sends only the first pbuf in the pbuf chain, and once this
 is acked, the tcp_sent() callback will try to send the remaining pbufs
 in the chain.
If I correctly understand the code a tcp_write will try to put all data
of a single tcp_write() in a single pcb also if I found some
documentation saying that it could fit the message in more then 1 pcb so
it will fit in a pcb chain.
May you know what is the maximum data size in a pcb? In my case I am
sure it will fit always in a pcb because the message is shorter then 50
bytes.
 A pbuf may be a chain of pbufs, linked by p-next

 Either you have some memory problems or I've been lucky enough to get
 whole data inside a single pbuf and didn't trigger the possible bug. I
 recall sending small packets, what are you sending ?
Sure, the memory problem is that the tcp_write() pcb seems to be not
deallocated and also its pointer is not null, so may be more a problem
related to pbuf_free(). It is correctly called after tcp_write() so it
frees the user pcb, then tcp_write() should copy the data in a new pcb
that will be used by tcp_output() (and sent). The pcb that is not free
is the pcb used by tcp_write to send the message, I shouldn't have any
control on it.
My message is sprintf(szEchoMsg, Raw message %d\n, iCount); and
szEchoMsg is 50 bytes length.
The echo server triggers on \n so echoes line by line.
  Again, I suggest
 you use netio for big chunks of data.
 I don't have the time to build a short tcp_mss version of my linux port
 and try it, maybe on monday. I suggest you (besides going for netio) try
 with small messages, I'm sure those work OK. If they do, then check the
 pbuf chains, if they don't... check your port.
I suppose that I found something like a bug because all other examples
(also netio) work well with no problems.
I started with tcp_echo raw example because until now I designed server
applications using lwip but this time I have to write a tcp client
application. Because it wasn't working I tried the ping example and it
worked perfectly.

Take care that my mcu is working at 120MHz, my system tick is 1 ms and
the timed functions are called every 250ms (I tryed also at 125ms with
no difference).

Now my application seems to be working but I would test it with messages
divided on several pcbs to be sure it really works well.
Also in my application I didn't provide to send pcbs inside the sent
callback function.

Kind regards.

 Regards





logo
*

Massimo Manca*/, Micron Engineering/
via della Ferriera, 48 33170 Pordenone PN ITALIA
Tel: 39 0434 1856131| Mobile: 39 349 4504979
www.micronengineering.it

Twitter
http://s.wisestamp.com/links?url=https%3A%2F%2Ftwitter.com%2Fmassimomanca
LinkedIn
http://s.wisestamp.com/links?url=http%3A%2F%2Fit.linkedin.com%2Fpub%2Fmassimo-manca%2F7%2Fa15%2F479%2F
SlideShare
http://s.wisestamp.com/links?url=http%3A%2F%2Fwww.slideshare.net%2Fmicronpn
Contact me: Skype micron.engineering
Designed with WiseStamp -
http://s.wisestamp.com/links?url=http%3A%2F%2Fr1.wisestamp.com%2Fr%2Flanding%3Fu%3Daaa0e17b0c4ca423%26v%3D3.13.31%26t%3D1406929657462%26promo%3D10%26dest%3Dhttp%253A%252F%252Fwww.wisestamp.com%252Femail-install%253Futm_source%253Dextension%2526utm_medium%253Demail%2526utm_campaign%253Dpromo_10Get
yours