Skip to content

Commit

Permalink
shell: telnet: don't close connection on EAGAIN
Browse files Browse the repository at this point in the history
This error can occur if the tcp window size is full. Instead
of closing the connection the application should sleep and
retry sending the packet.

Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
  • Loading branch information
talih0 committed Dec 7, 2023
1 parent 742de21 commit a4f17d1
Showing 1 changed file with 36 additions and 14 deletions.
50 changes: 36 additions & 14 deletions subsys/shell/backends/shell_telnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ struct shell_telnet *sh_telnet;
#define TELNET_MIN_COMMAND_LEN 2
#define TELNET_WILL_DO_COMMAND_LEN 3

#define TELNET_RETRY_SEND_SLEEP_MS 50

/* Basic TELNET implementation. */

static void telnet_end_client_connection(void)
Expand Down Expand Up @@ -64,17 +66,27 @@ static void telnet_sent_cb(struct net_context *client,

static void telnet_command_send_reply(uint8_t *msg, uint16_t len)
{
int err;

if (sh_telnet->client_ctx == NULL) {
return;
}

err = net_context_send(sh_telnet->client_ctx, msg, len, telnet_sent_cb,
K_FOREVER, NULL);
if (err < 0) {
LOG_ERR("Failed to send command %d, shutting down", err);
telnet_end_client_connection();
for (;;) {
int err;

err = net_context_send(sh_telnet->client_ctx, msg, len, telnet_sent_cb,
K_FOREVER, NULL);

if (err == -EAGAIN) {
k_sleep(K_MSEC(TELNET_RETRY_SEND_SLEEP_MS));
continue;
}

if (err < 0) {
LOG_ERR("Failed to send command %d, shutting down", err);
telnet_end_client_connection();
}

break;
}
}

Expand Down Expand Up @@ -185,13 +197,23 @@ static int telnet_send(void)
return -ENOTCONN;
}

err = net_context_send(sh_telnet->client_ctx, sh_telnet->line_out.buf,
sh_telnet->line_out.len, telnet_sent_cb,
K_FOREVER, NULL);
if (err < 0) {
LOG_ERR("Failed to send %d, shutting down", err);
telnet_end_client_connection();
return err;
for (;;) {
err = net_context_send(sh_telnet->client_ctx, sh_telnet->line_out.buf,
sh_telnet->line_out.len, telnet_sent_cb,
K_FOREVER, NULL);

if (err == -EAGAIN) {
k_sleep(K_MSEC(TELNET_RETRY_SEND_SLEEP_MS));
continue;
}

if (err < 0) {
LOG_ERR("Failed to send %d, shutting down", err);
telnet_end_client_connection();
return err;
}

break;
}

/* We reinitialize the line buffer */
Expand Down

0 comments on commit a4f17d1

Please sign in to comment.