stlink (tcp): manage scattered stlink-server responses

detected in ubuntu 20.04
sometimes, the stlink-server response could be segmented on multiple
packets.

this causes stlink_tcp_send_cmd to fail with the following msg:
Error: failed to receive USB CMD response
because the received_size < expected size

to fix the issue, do recv in a loop till all data is received
or timeout is reached.

Change-Id: I46cc60c231b4cc52f150ead268f843bc60c41149
Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/6671
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Tested-by: jenkins
This commit is contained in:
Tarek BOCHKATI 2021-11-03 16:22:22 +01:00 committed by Antonio Borneo
parent a4f8bf7a90
commit 3f778c7c63
1 changed files with 28 additions and 9 deletions

View File

@ -37,6 +37,7 @@
#include <helper/binarybuffer.h> #include <helper/binarybuffer.h>
#include <helper/bits.h> #include <helper/bits.h>
#include <helper/system.h> #include <helper/system.h>
#include <helper/time_support.h>
#include <jtag/interface.h> #include <jtag/interface.h>
#include <jtag/hla/hla_layout.h> #include <jtag/hla/hla_layout.h>
#include <jtag/hla/hla_transport.h> #include <jtag/hla/hla_transport.h>
@ -926,17 +927,35 @@ static int stlink_tcp_send_cmd(void *handle, int send_size, int recv_size, bool
return ERROR_FAIL; return ERROR_FAIL;
} }
keep_alive();
/* read the TCP response */ /* read the TCP response */
int received_size = recv(h->tcp_backend_priv.fd, (void *)h->tcp_backend_priv.recv_buf, recv_size, 0); int retval = ERROR_OK;
if (received_size != recv_size) { int remaining_bytes = recv_size;
LOG_ERROR("failed to receive USB CMD response"); uint8_t *recv_buf = h->tcp_backend_priv.recv_buf;
if (received_size == -1) const int64_t timeout = timeval_ms() + 1000; /* 1 second */
while (remaining_bytes > 0) {
if (timeval_ms() > timeout) {
LOG_DEBUG("received size %d (expected %d)", recv_size - remaining_bytes, recv_size);
retval = ERROR_TIMEOUT_REACHED;
break;
}
keep_alive();
int received = recv(h->tcp_backend_priv.fd, (void *)recv_buf, remaining_bytes, 0);
if (received == -1) {
LOG_DEBUG("socket recv error: %s (errno %d)", strerror(errno), errno); LOG_DEBUG("socket recv error: %s (errno %d)", strerror(errno), errno);
else retval = ERROR_FAIL;
LOG_DEBUG("received size %d (expected %d)", received_size, recv_size); break;
return ERROR_FAIL; }
recv_buf += received;
remaining_bytes -= received;
}
if (retval != ERROR_OK) {
LOG_ERROR("failed to receive USB CMD response");
return retval;
} }
if (check_tcp_status) { if (check_tcp_status) {