Skip to content
This repository was archived by the owner on Jan 20, 2025. It is now read-only.

Commit 4e7d1c3

Browse files
committed
try to catch some edge cases between LwIP and Async tasks
1 parent b5c6167 commit 4e7d1c3

File tree

2 files changed

+112
-85
lines changed

2 files changed

+112
-85
lines changed

src/AsyncTCP.cpp

Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ static int8_t _tcp_accept(void * arg, AsyncClient * client) {
328328
typedef struct {
329329
struct tcpip_api_call_data call;
330330
tcp_pcb * pcb;
331+
AsyncClient * client;
331332
int8_t err;
332333
union {
333334
struct {
@@ -351,34 +352,42 @@ typedef struct {
351352

352353
static err_t _tcp_output_api(struct tcpip_api_call_data *api_call_msg){
353354
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
354-
msg->err = tcp_output(msg->pcb);
355+
msg->err = 0;
356+
if(msg->client && msg->client->pcb()){
357+
msg->err = tcp_output(msg->pcb);
358+
}
355359
return msg->err;
356360
}
357361

358-
static esp_err_t _tcp_output(tcp_pcb * pcb) {
362+
static esp_err_t _tcp_output(tcp_pcb * pcb, AsyncClient * client) {
359363
if(!pcb){
360364
log_w("pcb is NULL");
361365
return ESP_FAIL;
362366
}
363367
tcp_api_call_t msg;
364368
msg.pcb = pcb;
369+
msg.client = client;
365370
tcpip_api_call(_tcp_output_api, (struct tcpip_api_call_data*)&msg);
366371
return msg.err;
367372
}
368373

369374
static err_t _tcp_write_api(struct tcpip_api_call_data *api_call_msg){
370375
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
371-
msg->err = tcp_write(msg->pcb, msg->write.data, msg->write.size, msg->write.apiflags);
376+
msg->err = 0;
377+
if(msg->client && msg->client->pcb()){
378+
msg->err = tcp_write(msg->pcb, msg->write.data, msg->write.size, msg->write.apiflags);
379+
}
372380
return msg->err;
373381
}
374382

375-
static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_t apiflags) {
383+
static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_t apiflags, AsyncClient * client) {
376384
if(!pcb){
377385
log_w("pcb is NULL");
378386
return ESP_FAIL;
379387
}
380388
tcp_api_call_t msg;
381389
msg.pcb = pcb;
390+
msg.client = client;
382391
msg.write.data = data;
383392
msg.write.size = size;
384393
msg.write.apiflags = apiflags;
@@ -389,74 +398,84 @@ static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_
389398
static err_t _tcp_recved_api(struct tcpip_api_call_data *api_call_msg){
390399
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
391400
msg->err = 0;
392-
tcp_recved(msg->pcb, msg->received);
401+
if(msg->client && msg->client->pcb()){
402+
tcp_recved(msg->pcb, msg->received);
403+
}
393404
return msg->err;
394405
}
395406

396-
static esp_err_t _tcp_recved(tcp_pcb * pcb, size_t len) {
407+
static esp_err_t _tcp_recved(tcp_pcb * pcb, size_t len, AsyncClient * client) {
397408
if(!pcb){
398409
log_w("pcb is NULL");
399410
return ESP_FAIL;
400411
}
401412
tcp_api_call_t msg;
402413
msg.pcb = pcb;
414+
msg.client = client;
403415
msg.received = len;
404416
tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call_data*)&msg);
405417
return msg.err;
406418
}
407419

408-
static err_t _tcp_connect_api(struct tcpip_api_call_data *api_call_msg){
420+
static err_t _tcp_close_api(struct tcpip_api_call_data *api_call_msg){
409421
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
410-
msg->err = tcp_connect(msg->pcb, msg->connect.addr, msg->connect.port, msg->connect.cb);
422+
msg->err = 0;
423+
if(msg->client && msg->client->pcb()){
424+
msg->err = tcp_close(msg->pcb);
425+
}
411426
return msg->err;
412427
}
413428

414-
static esp_err_t _tcp_connect(tcp_pcb * pcb, ip_addr_t * addr, uint16_t port, tcp_connected_fn cb) {
429+
static esp_err_t _tcp_close(tcp_pcb * pcb, AsyncClient * client) {
415430
if(!pcb){
416431
log_w("pcb is NULL");
417432
return ESP_FAIL;
418433
}
419434
tcp_api_call_t msg;
420435
msg.pcb = pcb;
421-
msg.connect.addr = addr;
422-
msg.connect.port = port;
423-
msg.connect.cb = cb;
424-
tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call_data*)&msg);
436+
msg.client = client;
437+
tcpip_api_call(_tcp_close_api, (struct tcpip_api_call_data*)&msg);
425438
return msg.err;
426439
}
427440

428-
static err_t _tcp_close_api(struct tcpip_api_call_data *api_call_msg){
441+
static err_t _tcp_abort_api(struct tcpip_api_call_data *api_call_msg){
429442
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
430-
msg->err = tcp_close(msg->pcb);
443+
msg->err = 0;
444+
if(msg->client && msg->client->pcb()){
445+
tcp_abort(msg->pcb);
446+
}
431447
return msg->err;
432448
}
433449

434-
static esp_err_t _tcp_close(tcp_pcb * pcb) {
450+
static esp_err_t _tcp_abort(tcp_pcb * pcb, AsyncClient * client) {
435451
if(!pcb){
436452
log_w("pcb is NULL");
437453
return ESP_FAIL;
438454
}
439455
tcp_api_call_t msg;
440456
msg.pcb = pcb;
441-
tcpip_api_call(_tcp_close_api, (struct tcpip_api_call_data*)&msg);
457+
msg.client = client;
458+
tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call_data*)&msg);
442459
return msg.err;
443460
}
444461

445-
static err_t _tcp_abort_api(struct tcpip_api_call_data *api_call_msg){
462+
static err_t _tcp_connect_api(struct tcpip_api_call_data *api_call_msg){
446463
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
447-
msg->err = 0;
448-
tcp_abort(msg->pcb);
464+
msg->err = tcp_connect(msg->pcb, msg->connect.addr, msg->connect.port, msg->connect.cb);
449465
return msg->err;
450466
}
451467

452-
static esp_err_t _tcp_abort(tcp_pcb * pcb) {
468+
static esp_err_t _tcp_connect(tcp_pcb * pcb, ip_addr_t * addr, uint16_t port, tcp_connected_fn cb) {
453469
if(!pcb){
454470
log_w("pcb is NULL");
455471
return ESP_FAIL;
456472
}
457473
tcp_api_call_t msg;
458474
msg.pcb = pcb;
459-
tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call_data*)&msg);
475+
msg.connect.addr = addr;
476+
msg.connect.port = port;
477+
msg.connect.cb = cb;
478+
tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call_data*)&msg);
460479
return msg.err;
461480
}
462481

@@ -606,7 +625,7 @@ int8_t AsyncClient::_close(){
606625
tcp_err(_pcb, NULL);
607626
tcp_poll(_pcb, NULL, 0);
608627
_tcp_clear_events(this);
609-
err = _tcp_close(_pcb);
628+
err = _tcp_close(_pcb, this);
610629
if(err != ERR_OK) {
611630
err = abort();
612631
}
@@ -704,7 +723,7 @@ int8_t AsyncClient::_recv(tcp_pcb* pcb, pbuf* pb, int8_t err) {
704723
if(!_ack_pcb) {
705724
_rx_ack_len += b->len;
706725
} else if(_pcb) {
707-
_tcp_recved(_pcb, b->len);
726+
_tcp_recved(_pcb, b->len, this);
708727
}
709728
pbuf_free(b);
710729
}
@@ -773,15 +792,15 @@ bool AsyncClient::connect(const char* host, uint16_t port){
773792

774793
int8_t AsyncClient::abort(){
775794
if(_pcb) {
776-
_tcp_abort(_pcb);
795+
_tcp_abort(_pcb, this);
777796
_pcb = NULL;
778797
}
779798
return ERR_ABRT;
780799
}
781800

782801
void AsyncClient::close(bool now){
783802
if(_pcb){
784-
_tcp_recved(_pcb, _rx_ack_len);
803+
_tcp_recved(_pcb, _rx_ack_len, this);
785804
}
786805
_close();
787806
}
@@ -833,7 +852,7 @@ size_t AsyncClient::add(const char* data, size_t size, uint8_t apiflags) {
833852
}
834853
size_t will_send = (room < size) ? room : size;
835854
int8_t err = ERR_OK;
836-
err = _tcp_write(_pcb, data, will_send, apiflags);
855+
err = _tcp_write(_pcb, data, will_send, apiflags, this);
837856
if(err != ERR_OK) {
838857
return 0;
839858
}
@@ -842,7 +861,7 @@ size_t AsyncClient::add(const char* data, size_t size, uint8_t apiflags) {
842861

843862
bool AsyncClient::send(){
844863
int8_t err = ERR_OK;
845-
err = _tcp_output(_pcb);
864+
err = _tcp_output(_pcb, this);
846865
if(err == ERR_OK){
847866
_pcb_busy = true;
848867
_pcb_sent_at = millis();
@@ -855,7 +874,7 @@ size_t AsyncClient::ack(size_t len){
855874
if(len > _rx_ack_len)
856875
len = _rx_ack_len;
857876
if(len){
858-
_tcp_recved(_pcb, len);
877+
_tcp_recved(_pcb, len, this);
859878
}
860879
_rx_ack_len -= len;
861880
return len;
@@ -996,7 +1015,7 @@ void AsyncClient::ackPacket(struct pbuf * pb){
9961015
if(!pb){
9971016
return;
9981017
}
999-
_tcp_recved(_pcb, pb->len);
1018+
_tcp_recved(_pcb, pb->len, this);
10001019
pbuf_free(pb);
10011020
}
10021021

@@ -1232,7 +1251,7 @@ void AsyncServer::begin(){
12321251
err = _tcp_bind(_pcb, &local_addr, _port);
12331252

12341253
if (err != ERR_OK) {
1235-
_tcp_close(_pcb);
1254+
_tcp_close(_pcb, NULL);
12361255
log_e("bind error: %d", err);
12371256
return;
12381257
}
@@ -1251,7 +1270,7 @@ void AsyncServer::end(){
12511270
if(_pcb){
12521271
tcp_arg(_pcb, NULL);
12531272
tcp_accept(_pcb, NULL);
1254-
_tcp_abort(_pcb);
1273+
_tcp_abort(_pcb, NULL);
12551274
_pcb = NULL;
12561275
}
12571276
}

0 commit comments

Comments
 (0)