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

Commit 882ef82

Browse files
authored
Merge branch 'master' into fix_dns
2 parents 5e2d35e + 091802a commit 882ef82

File tree

10 files changed

+351
-214
lines changed

10 files changed

+351
-214
lines changed

.github/stale.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Configuration for probot-stale - https://github.com/probot/stale
2+
3+
daysUntilStale: 60
4+
daysUntilClose: 14
5+
limitPerRun: 30
6+
staleLabel: stale
7+
exemptLabels:
8+
- pinned
9+
- security
10+
- "to be implemented"
11+
- "for reference"
12+
- "move to PR"
13+
- "enhancement"
14+
15+
only: issues
16+
onlyLabels: []
17+
exemptProjects: false
18+
exemptMilestones: false
19+
exemptAssignees: false
20+
21+
markComment: >
22+
[STALE_SET] This issue has been automatically marked as stale because it has not had
23+
recent activity. It will be closed in 14 days if no further activity occurs. Thank you
24+
for your contributions.
25+
26+
unmarkComment: >
27+
[STALE_CLR] This issue has been removed from the stale queue. Please ensure activity to keep it openin the future.
28+
29+
closeComment: >
30+
[STALE_DEL] This stale issue has been automatically closed. Thank you for your contributions.
31+

.github/workflows/main.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Async TCP CI
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
- release/*
8+
pull_request:
9+
10+
jobs:
11+
12+
build-arduino:
13+
name: Build Arduino
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v1
17+
- name: Build Tests
18+
env:
19+
TRAVIS_BUILD_DIR: ${{ github.workspace }}
20+
run: bash $TRAVIS_BUILD_DIR/travis/build.sh
21+
22+
build-pio:
23+
name: Build PlatformIO
24+
runs-on: ubuntu-latest
25+
steps:
26+
- uses: actions/checkout@v1
27+
- name: Install Python Wheel
28+
run: pip install wheel
29+
- name: Build Tests
30+
env:
31+
TRAVIS_BUILD_DIR: ${{ github.workspace }}
32+
run: bash $TRAVIS_BUILD_DIR/travis/build-pio.sh

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
.DS_Store

.travis.yml

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
sudo: false
2-
32
language: python
4-
python:
5-
- "2.7"
6-
73
os:
84
- linux
95

10-
dist:
11-
- xenial
6+
git:
7+
depth: false
8+
9+
stages:
10+
- build
11+
12+
jobs:
13+
include:
14+
15+
- name: "Arduino Build"
16+
if: tag IS blank AND (type = pull_request OR (type = push AND branch = master))
17+
stage: build
18+
script: bash $TRAVIS_BUILD_DIR/travis/build.sh
1219

13-
script:
14-
- bash $TRAVIS_BUILD_DIR/travis/build.sh
20+
- name: "PlatformIO Build"
21+
if: tag IS blank AND (type = pull_request OR (type = push AND branch = master))
22+
stage: build
23+
script: bash $TRAVIS_BUILD_DIR/travis/build-pio.sh
1524

1625
notifications:
1726
email:
@@ -22,4 +31,4 @@ notifications:
2231
- https://webhooks.gitter.im/e/60e65d0c78ea0a920347
2332
on_success: change # options: [always|never|change] default: always
2433
on_failure: always # options: [always|never|change] default: always
25-
on_start: never # options: [always|never|change] default: always
34+
on_start: false # default: false

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Async TCP Library for ESP32 Arduino
33

44
[![Join the chat at https://gitter.im/me-no-dev/ESPAsyncWebServer](https://badges.gitter.im/me-no-dev/ESPAsyncWebServer.svg)](https://gitter.im/me-no-dev/ESPAsyncWebServer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
55

6+
[![Build Status](https://travis-ci.org/me-no-dev/AsyncTCP.svg?branch=master)](https://travis-ci.org/me-no-dev/AsyncTCP)
7+
68
This is a fully asynchronous TCP library, aimed at enabling trouble-free, multi-connection network environment for Espressif's ESP32 MCUs.
79

810
This library is the base for [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer)

src/AsyncTCP.cpp

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ typedef struct {
7878

7979
static xQueueHandle _async_queue;
8080
static TaskHandle_t _async_service_task_handle = NULL;
81+
static tcp_pcb * pcb_recently_closed = NULL;
8182

8283
static inline bool _init_async_event_queue(){
8384
if(!_async_queue){
@@ -161,6 +162,9 @@ static void _handle_async_event(lwip_event_packet_t * e){
161162
} else if(e->event == LWIP_TCP_ACCEPT){
162163
//ets_printf("A: 0x%08x 0x%08x\n", e->arg, e->accept.client);
163164
AsyncServer::_s_accepted(e->arg, e->accept.client);
165+
} else if(e->event == LWIP_TCP_DNS){
166+
//ets_printf("D: 0x%08x %s = %s\n", e->arg, e->dns.name, ipaddr_ntoa(&e->dns.addr));
167+
AsyncClient::_s_dns_found(e->dns.name, &e->dns.addr, e->arg);
164168
}
165169
free((void*)(e));
166170
}
@@ -329,7 +333,6 @@ static int8_t _tcp_accept(void * arg, AsyncClient * client) {
329333
typedef struct {
330334
struct tcpip_api_call_data call;
331335
tcp_pcb * pcb;
332-
AsyncClient * client;
333336
int8_t err;
334337
union {
335338
struct {
@@ -354,39 +357,39 @@ typedef struct {
354357
static err_t _tcp_output_api(struct tcpip_api_call_data *api_call_msg){
355358
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
356359
msg->err = ERR_CONN;
357-
if(msg->client && msg->client->pcb() == msg->pcb){
360+
if(msg->pcb != pcb_recently_closed) {
358361
msg->err = tcp_output(msg->pcb);
359362
}
363+
pcb_recently_closed = NULL;
360364
return msg->err;
361365
}
362366

363-
static esp_err_t _tcp_output(tcp_pcb * pcb, AsyncClient * client) {
367+
static esp_err_t _tcp_output(tcp_pcb * pcb) {
364368
if(!pcb){
365369
return ERR_CONN;
366370
}
367371
tcp_api_call_t msg;
368372
msg.pcb = pcb;
369-
msg.client = client;
370373
tcpip_api_call(_tcp_output_api, (struct tcpip_api_call_data*)&msg);
371374
return msg.err;
372375
}
373376

374377
static err_t _tcp_write_api(struct tcpip_api_call_data *api_call_msg){
375378
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
376379
msg->err = ERR_CONN;
377-
if(msg->client && msg->client->pcb() == msg->pcb){
380+
if(msg->pcb != pcb_recently_closed) {
378381
msg->err = tcp_write(msg->pcb, msg->write.data, msg->write.size, msg->write.apiflags);
379382
}
383+
pcb_recently_closed = NULL;
380384
return msg->err;
381385
}
382386

383-
static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_t apiflags, AsyncClient * client) {
387+
static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_t apiflags) {
384388
if(!pcb){
385389
return ERR_CONN;
386390
}
387391
tcp_api_call_t msg;
388392
msg.pcb = pcb;
389-
msg.client = client;
390393
msg.write.data = data;
391394
msg.write.size = size;
392395
msg.write.apiflags = apiflags;
@@ -397,20 +400,20 @@ static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_
397400
static err_t _tcp_recved_api(struct tcpip_api_call_data *api_call_msg){
398401
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
399402
msg->err = ERR_CONN;
400-
if(msg->client && msg->client->pcb() == msg->pcb){
403+
if(msg->pcb != pcb_recently_closed) {
401404
msg->err = 0;
402405
tcp_recved(msg->pcb, msg->received);
403406
}
407+
pcb_recently_closed = NULL;
404408
return msg->err;
405409
}
406410

407-
static esp_err_t _tcp_recved(tcp_pcb * pcb, size_t len, AsyncClient * client) {
411+
static esp_err_t _tcp_recved(tcp_pcb * pcb, size_t len) {
408412
if(!pcb){
409413
return ERR_CONN;
410414
}
411415
tcp_api_call_t msg;
412416
msg.pcb = pcb;
413-
msg.client = client;
414417
msg.received = len;
415418
tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call_data*)&msg);
416419
return msg.err;
@@ -419,39 +422,39 @@ static esp_err_t _tcp_recved(tcp_pcb * pcb, size_t len, AsyncClient * client) {
419422
static err_t _tcp_close_api(struct tcpip_api_call_data *api_call_msg){
420423
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
421424
msg->err = ERR_CONN;
422-
if(!msg->client || msg->client->pcb() == msg->pcb){
425+
if(msg->pcb != pcb_recently_closed) {
423426
msg->err = tcp_close(msg->pcb);
424427
}
428+
pcb_recently_closed = NULL;
425429
return msg->err;
426430
}
427431

428-
static esp_err_t _tcp_close(tcp_pcb * pcb, AsyncClient * client) {
432+
static esp_err_t _tcp_close(tcp_pcb * pcb) {
429433
if(!pcb){
430434
return ERR_CONN;
431435
}
432436
tcp_api_call_t msg;
433437
msg.pcb = pcb;
434-
msg.client = client;
435438
tcpip_api_call(_tcp_close_api, (struct tcpip_api_call_data*)&msg);
436439
return msg.err;
437440
}
438441

439442
static err_t _tcp_abort_api(struct tcpip_api_call_data *api_call_msg){
440443
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
441444
msg->err = ERR_CONN;
442-
if(!msg->client || msg->client->pcb() == msg->pcb){
445+
if(msg->pcb != pcb_recently_closed) {
443446
tcp_abort(msg->pcb);
444447
}
448+
pcb_recently_closed = NULL;
445449
return msg->err;
446450
}
447451

448-
static esp_err_t _tcp_abort(tcp_pcb * pcb, AsyncClient * client) {
452+
static esp_err_t _tcp_abort(tcp_pcb * pcb) {
449453
if(!pcb){
450454
return ERR_CONN;
451455
}
452456
tcp_api_call_t msg;
453457
msg.pcb = pcb;
454-
msg.client = client;
455458
tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call_data*)&msg);
456459
return msg.err;
457460
}
@@ -679,6 +682,13 @@ bool AsyncClient::connect(IPAddress ip, uint16_t port){
679682

680683
bool AsyncClient::connect(const char* host, uint16_t port){
681684
ip_addr_t addr;
685+
686+
if(!_start_async_task()){
687+
Serial.println("failed to start task");
688+
log_e("failed to start task");
689+
return false;
690+
}
691+
682692
err_t err = dns_gethostbyname(host, &addr, (dns_found_callback)&_tcp_dns_found, this);
683693
if(err == ERR_OK) {
684694
return connect(IPAddress(addr.u_addr.ip4.addr), port);
@@ -692,14 +702,14 @@ bool AsyncClient::connect(const char* host, uint16_t port){
692702

693703
void AsyncClient::close(bool now){
694704
if(_pcb){
695-
_tcp_recved(_pcb, _rx_ack_len, this);
705+
_tcp_recved(_pcb, _rx_ack_len);
696706
}
697707
_close();
698708
}
699709

700710
int8_t AsyncClient::abort(){
701711
if(_pcb) {
702-
_tcp_abort(_pcb, this);
712+
_tcp_abort(_pcb);
703713
_pcb = NULL;
704714
}
705715
return ERR_ABRT;
@@ -722,7 +732,7 @@ size_t AsyncClient::add(const char* data, size_t size, uint8_t apiflags) {
722732
}
723733
size_t will_send = (room < size) ? room : size;
724734
int8_t err = ERR_OK;
725-
err = _tcp_write(_pcb, data, will_send, apiflags, this);
735+
err = _tcp_write(_pcb, data, will_send, apiflags);
726736
if(err != ERR_OK) {
727737
return 0;
728738
}
@@ -731,7 +741,7 @@ size_t AsyncClient::add(const char* data, size_t size, uint8_t apiflags) {
731741

732742
bool AsyncClient::send(){
733743
int8_t err = ERR_OK;
734-
err = _tcp_output(_pcb, this);
744+
err = _tcp_output(_pcb);
735745
if(err == ERR_OK){
736746
_pcb_busy = true;
737747
_pcb_sent_at = millis();
@@ -744,7 +754,7 @@ size_t AsyncClient::ack(size_t len){
744754
if(len > _rx_ack_len)
745755
len = _rx_ack_len;
746756
if(len){
747-
_tcp_recved(_pcb, len, this);
757+
_tcp_recved(_pcb, len);
748758
}
749759
_rx_ack_len -= len;
750760
return len;
@@ -754,7 +764,7 @@ void AsyncClient::ackPacket(struct pbuf * pb){
754764
if(!pb){
755765
return;
756766
}
757-
_tcp_recved(_pcb, pb->len, this);
767+
_tcp_recved(_pcb, pb->len);
758768
pbuf_free(pb);
759769
}
760770

@@ -773,7 +783,7 @@ int8_t AsyncClient::_close(){
773783
tcp_err(_pcb, NULL);
774784
tcp_poll(_pcb, NULL, 0);
775785
_tcp_clear_events(this);
776-
err = _tcp_close(_pcb, this);
786+
err = _tcp_close(_pcb);
777787
if(err != ERR_OK) {
778788
err = abort();
779789
}
@@ -835,6 +845,7 @@ int8_t AsyncClient::_lwip_fin(tcp_pcb* pcb, int8_t err) {
835845
if(tcp_close(_pcb) != ERR_OK) {
836846
tcp_abort(_pcb);
837847
}
848+
pcb_recently_closed = _pcb;
838849
_pcb = NULL;
839850
return ERR_OK;
840851
}
@@ -875,7 +886,7 @@ int8_t AsyncClient::_recv(tcp_pcb* pcb, pbuf* pb, int8_t err) {
875886
if(!_ack_pcb) {
876887
_rx_ack_len += b->len;
877888
} else if(_pcb) {
878-
_tcp_recved(_pcb, b->len, this);
889+
_tcp_recved(_pcb, b->len);
879890
}
880891
pbuf_free(b);
881892
}
@@ -1222,7 +1233,7 @@ void AsyncServer::begin(){
12221233
err = _tcp_bind(_pcb, &local_addr, _port);
12231234

12241235
if (err != ERR_OK) {
1225-
_tcp_close(_pcb, NULL);
1236+
_tcp_close(_pcb);
12261237
log_e("bind error: %d", err);
12271238
return;
12281239
}
@@ -1241,7 +1252,7 @@ void AsyncServer::end(){
12411252
if(_pcb){
12421253
tcp_arg(_pcb, NULL);
12431254
tcp_accept(_pcb, NULL);
1244-
_tcp_abort(_pcb, NULL);
1255+
_tcp_abort(_pcb);
12451256
_pcb = NULL;
12461257
}
12471258
}

0 commit comments

Comments
 (0)