<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>MQX Software Solutions中的主题 SOCK_STREAM_recv() bug drops data on receive timeout</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460288#M15437</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;We are using MQX for KSDK 1.3.&amp;nbsp; We have found that the socket recv() function will drop some data if a receive timeout occurs.&amp;nbsp; We found this when trying to transferring a relatively large file (~500KB).&amp;nbsp; I believe this is the relevant code in SOCK_STREAM_recv():&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14514963806262904 jive_text_macro" data-renderedposition="71_8_1232_256" jivemacro_uid="_14514963806262904" modifiedtitle="true"&gt;&lt;P&gt;&amp;nbsp; error = RTCSCMD_issue(parms, TCP_Process_receive);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (error) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_setsockerror(sock, error);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Start CR 2340 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If data was copied to the userbuf, but not all that&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the recv() asked for, and a timer was started that has&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; now timed out, we need to return with the count, and not&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_ERROR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error == RTCSERR_TCP_TIMED_OUT) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _task_stop_preemption();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = parms.TCB_PTR-&amp;gt;rcvnxt - parms.TCB_PTR-&amp;gt;rcvbufseq;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _task_start_preemption();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_EXIT2(RECV, RTCS_OK, n);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When a receive timeout occurs (detected by line 10), it is supposed to return how much data it partially filled the buffer with.&amp;nbsp; However, we are seeing it return 0, even though there is data in the buffer (we added a memset to zero out the buffer before calling the socket recv function).&amp;nbsp; I think that line 13 is the culprit (it seems to always set n to 0), but I am not sure what it should be to fix the issue, because I do not completely understand the TCB (Transmission Control Block) and how they are used.&amp;nbsp; I am guessing this line used to work with a previous version of RTCS, and was never updated?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 30 Dec 2015 17:34:26 GMT</pubDate>
    <dc:creator>bowe</dc:creator>
    <dc:date>2015-12-30T17:34:26Z</dc:date>
    <item>
      <title>SOCK_STREAM_recv() bug drops data on receive timeout</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460288#M15437</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;We are using MQX for KSDK 1.3.&amp;nbsp; We have found that the socket recv() function will drop some data if a receive timeout occurs.&amp;nbsp; We found this when trying to transferring a relatively large file (~500KB).&amp;nbsp; I believe this is the relevant code in SOCK_STREAM_recv():&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14514963806262904 jive_text_macro" data-renderedposition="71_8_1232_256" jivemacro_uid="_14514963806262904" modifiedtitle="true"&gt;&lt;P&gt;&amp;nbsp; error = RTCSCMD_issue(parms, TCP_Process_receive);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (error) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_setsockerror(sock, error);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Start CR 2340 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If data was copied to the userbuf, but not all that&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the recv() asked for, and a timer was started that has&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; now timed out, we need to return with the count, and not&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_ERROR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error == RTCSERR_TCP_TIMED_OUT) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _task_stop_preemption();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = parms.TCB_PTR-&amp;gt;rcvnxt - parms.TCB_PTR-&amp;gt;rcvbufseq;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _task_start_preemption();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_EXIT2(RECV, RTCS_OK, n);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When a receive timeout occurs (detected by line 10), it is supposed to return how much data it partially filled the buffer with.&amp;nbsp; However, we are seeing it return 0, even though there is data in the buffer (we added a memset to zero out the buffer before calling the socket recv function).&amp;nbsp; I think that line 13 is the culprit (it seems to always set n to 0), but I am not sure what it should be to fix the issue, because I do not completely understand the TCB (Transmission Control Block) and how they are used.&amp;nbsp; I am guessing this line used to work with a previous version of RTCS, and was never updated?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 30 Dec 2015 17:34:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460288#M15437</guid>
      <dc:creator>bowe</dc:creator>
      <dc:date>2015-12-30T17:34:26Z</dc:date>
    </item>
    <item>
      <title>Re: SOCK_STREAM_recv() bug drops data on receive timeout</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460289#M15438</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;We believe we found a fix for this (at least it seems to work in our preliminary testing).&amp;nbsp; I think the issue is rcvbufseq has already been updated when we try to perform the calculation for the number of bytes, so we need to save its value before the RTCSCMD_issue().&amp;nbsp; Then since rcvbufseq should be updated, and rcvnxt might get updated before SOCK_STREAM_recv() gets to continue running, we actually want to look at the new value of rcvbufseq.&amp;nbsp; So the code shown in the previous post changes to this (again, that code is in SOCK_STREAM_recv() in sock_stream.c):&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_14515166243601073" data-renderedposition="92_8_1232_240" jivemacro_uid="_14515166243601073"&gt;&lt;P&gt;&amp;nbsp; uint32_t prev_recvbufseq = parms.TCB_PTR-&amp;gt;rcvbufseq;&lt;/P&gt;&lt;P&gt;&amp;nbsp; error = RTCSCMD_issue(parms, TCP_Process_receive);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (error) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_setsockerror(sock, error);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Start CR 2340 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If data was copied to the userbuf, but not all that&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the recv() asked for, and a timer was started that has&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; now timed out, we need to return with the count, and not&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_ERROR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error == RTCSERR_TCP_TIMED_OUT) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = parms.TCB_PTR-&amp;gt;rcvbufseq - prev_recvbufseq;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RTCS_EXIT2(RECV, RTCS_OK, n);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then another tweak to make httpsrv_read() in httpsrv_supp.c return when there is no data to be read (instead of locking up in a loop senslessly), we forced a return when the received number of bytes is 0 (change to line 07):&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="_jivemacro_uid_14515173076161965 jive_macro_code jive_text_macro" data-renderedposition="458_8_1232_272" jivemacro_uid="_14515173076161965"&gt;&lt;P&gt;/* If there is some space remaining in user buffer try to read from socket */&lt;/P&gt;&lt;P&gt;while (read &amp;lt; len)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t received;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; received = httpsrv_recv(session, dst+read, len-read, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((received != 0) &amp;amp;&amp;amp; ((uint32_t)RTCS_ERROR != received))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read += received;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;return(read);&lt;/P&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 30 Dec 2015 23:14:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460289#M15438</guid>
      <dc:creator>bowe</dc:creator>
      <dc:date>2015-12-30T23:14:39Z</dc:date>
    </item>
    <item>
      <title>Re: SOCK_STREAM_recv() bug drops data on receive timeout</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460290#M15439</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Bowe,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;your workaround seems fine. Thank you so much for sharing it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I need to report this issue to MQX development team. I will let you know when they have a final fix.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 20 Jan 2016 21:08:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460290#M15439</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2016-01-20T21:08:36Z</dc:date>
    </item>
    <item>
      <title>Re: SOCK_STREAM_recv() bug drops data on receive timeout</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460291#M15440</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Just FYI,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the report number for this issue is &lt;A class="issue-link" data-issue-key="MQX-5683" href="http://sw-jira.freescale.net/browse/MQX-5683" rel="176684"&gt;MQX-5683.&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 20 Jan 2016 21:15:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/SOCK-STREAM-recv-bug-drops-data-on-receive-timeout/m-p/460291#M15440</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2016-01-20T21:15:39Z</dc:date>
    </item>
  </channel>
</rss>

