Skip to content

Commit

Permalink
shell: telnet: Don't close the connection on EAGAIN error
Browse files Browse the repository at this point in the history
EAGAIN error is returned if the tcp window size is full. Retry
sending the packet instead of closing the connection if this
error occurs.

Also the full payload may not be sent in a single call to
net_context_send(). Keep track of the number of bytes remaining
and try to send the full payload.

Signed-off-by: Andriy Gelman <[email protected]>
  • Loading branch information
talih0 authored and carlescufi committed Dec 12, 2023
1 parent 995824a commit 8232ddd
Showing 1 changed file with 42 additions and 15 deletions.
57 changes: 42 additions & 15 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,29 @@ 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();
while (len > 0) {
int ret;

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

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

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

msg += ret;
len -= ret;
}
}

Expand Down Expand Up @@ -175,7 +189,9 @@ static void telnet_reply_command(struct telnet_simple_command *cmd)

static int telnet_send(void)
{
int err;
int ret;
uint8_t *msg = sh_telnet->line_out.buf;
uint16_t len = sh_telnet->line_out.len;

if (sh_telnet->line_out.len == 0) {
return 0;
Expand All @@ -185,13 +201,24 @@ 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;
while (len > 0) {
ret = net_context_send(sh_telnet->client_ctx, msg,
len, telnet_sent_cb,
K_FOREVER, NULL);

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

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

msg += ret;
len -= ret;
}

/* We reinitialize the line buffer */
Expand Down

0 comments on commit 8232ddd

Please sign in to comment.