Skip to content

Commit b2b8554

Browse files
mniestrojjukkar
authored andcommitted
drivers: wifi: esp: deduplicate RX data processing
Deduplicate final part of RX data processing for two supported cases: passive (+CIPRECVDATA) and non-passive (+IPD). Move implementation to esp_socket module, as this is strictly related to socket. Signed-off-by: Marcin Niestroj <[email protected]>
1 parent 1886d8c commit b2b8554

File tree

4 files changed

+77
-87
lines changed

4 files changed

+77
-87
lines changed

drivers/wifi/esp/esp.c

Lines changed: 1 addition & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ LOG_MODULE_REGISTER(wifi_esp, CONFIG_WIFI_LOG_LEVEL);
2626

2727
#include "esp.h"
2828

29-
#define RX_NET_PKT_ALLOC_TIMEOUT \
30-
K_MSEC(CONFIG_WIFI_ESP_RX_NET_PKT_ALLOC_TIMEOUT)
31-
3229
/* pin settings */
3330
enum modem_control_pins {
3431
#if DT_INST_NODE_HAS_PROP(0, power_gpios)
@@ -394,48 +391,6 @@ MODEM_CMD_DEFINE(on_cmd_closed)
394391
return 0;
395392
}
396393

397-
struct net_pkt *esp_prepare_pkt(struct esp_data *dev, struct net_buf *src,
398-
size_t offset, size_t len)
399-
{
400-
struct net_buf *frag;
401-
struct net_pkt *pkt;
402-
size_t to_copy;
403-
404-
pkt = net_pkt_rx_alloc_with_buffer(dev->net_iface, len, AF_UNSPEC,
405-
0, RX_NET_PKT_ALLOC_TIMEOUT);
406-
if (!pkt) {
407-
return NULL;
408-
}
409-
410-
frag = src;
411-
412-
/* find the right fragment to start copying from */
413-
while (frag && offset >= frag->len) {
414-
offset -= frag->len;
415-
frag = frag->frags;
416-
}
417-
418-
/* traverse the fragment chain until len bytes are copied */
419-
while (frag && len > 0) {
420-
to_copy = MIN(len, frag->len - offset);
421-
if (net_pkt_write(pkt, frag->data + offset, to_copy) != 0) {
422-
net_pkt_unref(pkt);
423-
return NULL;
424-
}
425-
426-
/* to_copy is always <= len */
427-
len -= to_copy;
428-
frag = frag->frags;
429-
430-
/* after the first iteration, this value will be 0 */
431-
offset = 0;
432-
}
433-
434-
net_pkt_cursor_init(pkt);
435-
436-
return pkt;
437-
}
438-
439394
/*
440395
* Passive mode: "+IPD,<id>,<len>\r\n"
441396
* Other: "+IPD,<id>,<len>:<data>"
@@ -512,7 +467,6 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ipd)
512467
cmd_handler_data);
513468
struct esp_socket *sock;
514469
int data_offset, data_len;
515-
struct net_pkt *pkt;
516470
uint8_t link_id;
517471
char cmd_end;
518472
int err;
@@ -553,25 +507,7 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ipd)
553507
return -EAGAIN;
554508
}
555509

556-
if ((sock->flags & (ESP_SOCK_CONNECTED | ESP_SOCK_CLOSE_PENDING)) !=
557-
ESP_SOCK_CONNECTED) {
558-
LOG_DBG("Received data on closed link %d", sock->link_id);
559-
return data_offset + data_len;
560-
}
561-
562-
pkt = esp_prepare_pkt(dev, data->rx_buf, data_offset, data_len);
563-
if (!pkt) {
564-
LOG_ERR("Failed to get net_pkt: len %d", data_len);
565-
if (sock->type == SOCK_STREAM) {
566-
sock->flags |= ESP_SOCK_CLOSE_PENDING;
567-
}
568-
goto submit_work;
569-
}
570-
571-
k_fifo_put(&sock->fifo_rx_pkt, pkt);
572-
573-
submit_work:
574-
k_work_submit_to_queue(&dev->workq, &sock->recv_work);
510+
esp_socket_rx(sock, data->rx_buf, data_offset, data_len);
575511

576512
return data_offset + data_len;
577513
}

drivers/wifi/esp/esp.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,14 +228,14 @@ struct esp_data {
228228

229229
int esp_offload_init(struct net_if *iface);
230230

231-
struct net_pkt *esp_prepare_pkt(struct esp_data *dev, struct net_buf *src,
232-
size_t offset, size_t len);
233231
struct esp_socket *esp_socket_get();
234232
int esp_socket_put(struct esp_socket *sock);
235233
struct esp_socket *esp_socket_from_link_id(struct esp_data *data,
236234
uint8_t link_id);
237235
void esp_socket_init(struct esp_data *data);
238236
void esp_socket_close(struct esp_socket *sock);
237+
void esp_socket_rx(struct esp_socket *sock, struct net_buf *buf,
238+
size_t offset, size_t len);
239239

240240
static inline struct esp_data *esp_socket_to_dev(struct esp_socket *sock)
241241
{

drivers/wifi/esp/esp_offload.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,6 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
453453
cmd_handler_data);
454454
struct esp_socket *sock = dev->rx_sock;
455455
int data_offset, data_len;
456-
struct net_pkt *pkt;
457456
int err;
458457

459458
err = cmd_ciprecvdata_parse(sock, data->rx_buf, len, &data_offset,
@@ -468,25 +467,7 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
468467

469468
sock->bytes_avail -= data_len;
470469

471-
if ((sock->flags & (ESP_SOCK_CONNECTED | ESP_SOCK_CLOSE_PENDING)) !=
472-
ESP_SOCK_CONNECTED) {
473-
LOG_DBG("Received data on closed link %d", sock->link_id);
474-
return data_offset + data_len;
475-
}
476-
477-
pkt = esp_prepare_pkt(dev, data->rx_buf, data_offset, data_len);
478-
if (!pkt) {
479-
LOG_ERR("Failed to get net_pkt: len %d", data_len);
480-
if (sock->type == SOCK_STREAM) {
481-
sock->flags |= ESP_SOCK_CLOSE_PENDING;
482-
}
483-
goto submit_work;
484-
}
485-
486-
k_fifo_put(&sock->fifo_rx_pkt, pkt);
487-
488-
submit_work:
489-
k_work_submit_to_queue(&dev->workq, &sock->recv_work);
470+
esp_socket_rx(sock, data->rx_buf, data_offset, data_len);
490471

491472
return data_offset + data_len;
492473
}

drivers/wifi/esp/esp_socket.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#include <logging/log.h>
1212
LOG_MODULE_DECLARE(wifi_esp, CONFIG_WIFI_LOG_LEVEL);
1313

14+
#define RX_NET_PKT_ALLOC_TIMEOUT \
15+
K_MSEC(CONFIG_WIFI_ESP_RX_NET_PKT_ALLOC_TIMEOUT)
16+
1417
/* esp_data->mtx_sock should be held */
1518
struct esp_socket *esp_socket_get(struct esp_data *data)
1619
{
@@ -72,6 +75,76 @@ void esp_socket_init(struct esp_data *data)
7275
}
7376
}
7477

78+
static struct net_pkt *esp_prepare_pkt(struct esp_data *dev,
79+
struct net_buf *src,
80+
size_t offset, size_t len)
81+
{
82+
struct net_buf *frag;
83+
struct net_pkt *pkt;
84+
size_t to_copy;
85+
86+
pkt = net_pkt_rx_alloc_with_buffer(dev->net_iface, len, AF_UNSPEC,
87+
0, RX_NET_PKT_ALLOC_TIMEOUT);
88+
if (!pkt) {
89+
return NULL;
90+
}
91+
92+
frag = src;
93+
94+
/* find the right fragment to start copying from */
95+
while (frag && offset >= frag->len) {
96+
offset -= frag->len;
97+
frag = frag->frags;
98+
}
99+
100+
/* traverse the fragment chain until len bytes are copied */
101+
while (frag && len > 0) {
102+
to_copy = MIN(len, frag->len - offset);
103+
if (net_pkt_write(pkt, frag->data + offset, to_copy) != 0) {
104+
net_pkt_unref(pkt);
105+
return NULL;
106+
}
107+
108+
/* to_copy is always <= len */
109+
len -= to_copy;
110+
frag = frag->frags;
111+
112+
/* after the first iteration, this value will be 0 */
113+
offset = 0;
114+
}
115+
116+
net_pkt_cursor_init(pkt);
117+
118+
return pkt;
119+
}
120+
121+
void esp_socket_rx(struct esp_socket *sock, struct net_buf *buf,
122+
size_t offset, size_t len)
123+
{
124+
struct esp_data *data = esp_socket_to_dev(sock);
125+
struct net_pkt *pkt;
126+
127+
if ((sock->flags & (ESP_SOCK_CONNECTED | ESP_SOCK_CLOSE_PENDING)) !=
128+
ESP_SOCK_CONNECTED) {
129+
LOG_DBG("Received data on closed link %d", sock->link_id);
130+
return;
131+
}
132+
133+
pkt = esp_prepare_pkt(data, buf, offset, len);
134+
if (!pkt) {
135+
LOG_ERR("Failed to get net_pkt: len %zu", len);
136+
if (sock->type == SOCK_STREAM) {
137+
sock->flags |= ESP_SOCK_CLOSE_PENDING;
138+
}
139+
goto submit_work;
140+
}
141+
142+
k_fifo_put(&sock->fifo_rx_pkt, pkt);
143+
144+
submit_work:
145+
k_work_submit_to_queue(&data->workq, &sock->recv_work);
146+
}
147+
75148
void esp_socket_close(struct esp_socket *sock)
76149
{
77150
struct esp_data *dev = esp_socket_to_dev(sock);

0 commit comments

Comments
 (0)