Skip to content

Commit d60bd57

Browse files
mniestrojjukkar
authored andcommitted
drivers: wifi: esp: rework +CIPRECVDATA handling
Current on_cmd_ciprecvdata handler is a bit overwhelming to follow. Add a cmd_ciprecvdata_parse() helper, which is responsible only for parsing received metadata (message offset and length), leaving socket instance untouched. Consume received payload later on, just after verifying that socket is in valid state. Signed-off-by: Marcin Niestroj <[email protected]>
1 parent 9fee4d7 commit d60bd57

File tree

1 file changed

+45
-34
lines changed

1 file changed

+45
-34
lines changed

drivers/wifi/esp/esp_offload.c

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -401,65 +401,77 @@ static int esp_send(struct net_pkt *pkt,
401401

402402
#define CIPRECVDATA_CMD_MIN_LEN (sizeof("+CIPRECVDATA,L:") - 1)
403403
#define CIPRECVDATA_CMD_MAX_LEN (sizeof("+CIPRECVDATA,LLLL:") - 1)
404-
MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
405-
{
406-
char *endptr, cmd_buf[CIPRECVDATA_CMD_MAX_LEN + 1];
407-
int data_offset, data_len, ret;
408-
size_t match_len, frags_len;
409-
struct esp_socket *sock;
410-
struct esp_data *dev;
411-
struct net_pkt *pkt;
412404

413-
dev = CONTAINER_OF(data, struct esp_data, cmd_handler_data);
414-
415-
sock = dev->rx_sock;
405+
static int cmd_ciprecvdata_parse(struct esp_socket *sock,
406+
struct net_buf *buf, uint16_t len,
407+
int *data_offset, int *data_len)
408+
{
409+
char cmd_buf[CIPRECVDATA_CMD_MAX_LEN + 1];
410+
char *endptr;
411+
size_t frags_len;
412+
size_t match_len;
416413

417-
frags_len = net_buf_frags_len(data->rx_buf);
414+
frags_len = net_buf_frags_len(buf);
418415
if (frags_len < CIPRECVDATA_CMD_MIN_LEN) {
419-
ret = -EAGAIN;
420-
goto out;
416+
return -EAGAIN;
421417
}
422418

423419
match_len = net_buf_linearize(cmd_buf, CIPRECVDATA_CMD_MAX_LEN,
424-
data->rx_buf, 0, CIPRECVDATA_CMD_MAX_LEN);
425-
420+
buf, 0, CIPRECVDATA_CMD_MAX_LEN);
426421
cmd_buf[match_len] = 0;
427422

428-
data_len = strtol(&cmd_buf[len], &endptr, 10);
423+
*data_len = strtol(&cmd_buf[len], &endptr, 10);
429424
if (endptr == &cmd_buf[len] ||
430425
(*endptr == 0 && match_len >= CIPRECVDATA_CMD_MAX_LEN) ||
431-
data_len > sock->bytes_avail) {
426+
*data_len > sock->bytes_avail) {
432427
LOG_ERR("Invalid cmd: %s", log_strdup(cmd_buf));
433-
ret = len;
434-
goto out;
428+
return -EBADMSG;
435429
} else if (*endptr == 0) {
436-
ret = -EAGAIN;
437-
goto out;
430+
return -EAGAIN;
438431
} else if (*endptr != _CIPRECVDATA_END) {
439432
LOG_ERR("Invalid end of cmd: 0x%02x != 0x%02x", *endptr,
440433
_CIPRECVDATA_END);
441-
ret = len;
442-
goto out;
434+
return -EBADMSG;
443435
}
444436

445-
*endptr = 0;
446-
447437
/* data_offset is the offset to where the actual data starts */
448-
data_offset = strlen(cmd_buf) + 1;
438+
*data_offset = (endptr - cmd_buf) + 1;
449439

450440
/* FIXME: Inefficient way of waiting for data */
451-
if (data_offset + data_len > frags_len) {
452-
ret = -EAGAIN;
453-
goto out;
441+
if (*data_offset + *data_len > frags_len) {
442+
return -EAGAIN;
443+
}
444+
445+
*endptr = 0;
446+
447+
return 0;
448+
}
449+
450+
MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
451+
{
452+
struct esp_data *dev = CONTAINER_OF(data, struct esp_data,
453+
cmd_handler_data);
454+
struct esp_socket *sock = dev->rx_sock;
455+
int data_offset, data_len;
456+
struct net_pkt *pkt;
457+
int err;
458+
459+
err = cmd_ciprecvdata_parse(sock, data->rx_buf, len, &data_offset,
460+
&data_len);
461+
if (err) {
462+
if (err == -EAGAIN) {
463+
return -EAGAIN;
464+
}
465+
466+
return err;
454467
}
455468

456469
sock->bytes_avail -= data_len;
457-
ret = data_offset + data_len;
458470

459471
if ((sock->flags & (ESP_SOCK_CONNECTED | ESP_SOCK_CLOSE_PENDING)) !=
460472
ESP_SOCK_CONNECTED) {
461473
LOG_DBG("Received data on closed link %d", sock->link_id);
462-
goto out;
474+
return data_offset + data_len;
463475
}
464476

465477
pkt = esp_prepare_pkt(dev, data->rx_buf, data_offset, data_len);
@@ -476,8 +488,7 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
476488
submit_work:
477489
k_work_submit_to_queue(&dev->workq, &sock->recv_work);
478490

479-
out:
480-
return ret;
491+
return data_offset + data_len;
481492
}
482493

483494
static void esp_recvdata_work(struct k_work *work)

0 commit comments

Comments
 (0)