From 7fbdb693287c422380baa6863a2ad8b4c0224d5d Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 19 Oct 2022 12:44:42 -0700 Subject: [PATCH] Allow reconnecting to the testbench JTAG socket --- test/sim/tb_cxxrtl/tb.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/test/sim/tb_cxxrtl/tb.cpp b/test/sim/tb_cxxrtl/tb.cpp index 190e0ab..b661ce7 100644 --- a/test/sim/tb_cxxrtl/tb.cpp +++ b/test/sim/tb_cxxrtl/tb.cpp @@ -258,6 +258,22 @@ void exit_help(std::string errtext = "") { exit(-1); } +int wait_for_connection(int server_fd, uint16_t port, struct sockaddr *sock_addr, socklen_t *sock_addr_len) { + int sock_fd; + printf("Waiting for connection on port %u\n", port); + if (listen(server_fd, 3) < 0) { + fprintf(stderr, "listen failed\n"); + exit(-1); + } + sock_fd = accept(server_fd, sock_addr, sock_addr_len); + if (sock_fd < 0) { + fprintf(stderr, "accept failed\n"); + exit(-1); + } + printf("Connected\n"); + return sock_fd; +} + static const int TCP_BUF_SIZE = 256; int main(int argc, char **argv) { @@ -355,17 +371,7 @@ int main(int argc, char **argv) { exit(-1); } - printf("Waiting for connection on port %u\n", port); - if (listen(server_fd, 3) < 0) { - fprintf(stderr, "listen failed\n"); - exit(-1); - } - sock_fd = accept(server_fd, (struct sockaddr *)&sock_addr, &sock_addr_len); - if (sock_fd < 0) { - fprintf(stderr, "accept failed\n"); - exit(-1); - } - printf("Connected\n"); + sock_fd = wait_for_connection(server_fd, port, (struct sockaddr *)&sock_addr, &sock_addr_len); } mem_io_state memio; @@ -485,6 +491,10 @@ int main(int argc, char **argv) { } rx_ptr = 0; rx_remaining = read(sock_fd, &rxbuf, TCP_BUF_SIZE); + if (rx_remaining == 0) { + // The socket is closed. Wait for another connection. + sock_fd = wait_for_connection(server_fd, port, (struct sockaddr *)&sock_addr, &sock_addr_len); + } } } }