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:
parent
a4f8bf7a90
commit
3f778c7c63
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue