@@ -27,6 +27,7 @@ extern "C"{
27
27
#include " lwip/tcp.h"
28
28
#include " lwip/inet.h"
29
29
#include " lwip/dns.h"
30
+ #include " lwip/init.h"
30
31
}
31
32
#include < tcp_axtls.h>
32
33
@@ -49,6 +50,8 @@ AsyncClient::AsyncClient(tcp_pcb* pcb):
49
50
, _error_cb_arg(0 )
50
51
, _recv_cb(0 )
51
52
, _recv_cb_arg(0 )
53
+ , _pb_cb(0 )
54
+ , _pb_cb_arg(0 )
52
55
, _timeout_cb(0 )
53
56
, _timeout_cb_arg(0 )
54
57
, _pcb_busy(false )
@@ -110,11 +113,12 @@ bool AsyncClient::connect(IPAddress ip, uint16_t port){
110
113
return false ;
111
114
ip_addr_t addr;
112
115
addr.addr = ip;
116
+ #if LWIP_VERSION_MAJOR == 1
113
117
netif* interface = ip_route (&addr);
114
118
if (!interface){ // no route to host
115
119
return false ;
116
120
}
117
-
121
+ # endif
118
122
tcp_pcb* pcb = tcp_new ();
119
123
if (!pcb){ // could not allocate pcb
120
124
return false ;
@@ -281,7 +285,7 @@ size_t AsyncClient::ack(size_t len){
281
285
282
286
// Private Callbacks
283
287
284
- int8_t AsyncClient::_connected (void * pcb, int8_t err){
288
+ err_t AsyncClient::_connected (void * pcb, err_t err){
285
289
_pcb = reinterpret_cast <tcp_pcb*>(pcb);
286
290
if (_pcb){
287
291
_pcb_busy = false ;
@@ -334,7 +338,7 @@ int8_t AsyncClient::_close(){
334
338
return err;
335
339
}
336
340
337
- void AsyncClient::_error (int8_t err) {
341
+ void AsyncClient::_error (err_t err) {
338
342
if (_pcb){
339
343
#if ASYNC_TCP_SSL_ENABLED
340
344
if (_pcb_secure){
@@ -361,7 +365,7 @@ void AsyncClient::_ssl_error(int8_t err){
361
365
}
362
366
#endif
363
367
364
- int8_t AsyncClient::_sent (tcp_pcb* pcb, uint16_t len) {
368
+ err_t AsyncClient::_sent (tcp_pcb* pcb, uint16_t len) {
365
369
_rx_last_packet = millis ();
366
370
ASYNC_TCP_DEBUG (" _sent: %u\n " , len);
367
371
_tx_unacked_len -= len;
@@ -375,7 +379,7 @@ int8_t AsyncClient::_sent(tcp_pcb* pcb, uint16_t len) {
375
379
return ERR_OK;
376
380
}
377
381
378
- int8_t AsyncClient::_recv (tcp_pcb* pcb, pbuf* pb, int8_t err) {
382
+ err_t AsyncClient::_recv (tcp_pcb* pcb, pbuf* pb, err_t err) {
379
383
if (pb == NULL ){
380
384
ASYNC_TCP_DEBUG (" _recv: pb == NULL! Closing... %d\n " , err);
381
385
return _close ();
@@ -400,21 +404,25 @@ int8_t AsyncClient::_recv(tcp_pcb* pcb, pbuf* pb, int8_t err) {
400
404
// we should not ack before we assimilate the data
401
405
_ack_pcb = true ;
402
406
pbuf *b = pb;
403
- ASYNC_TCP_DEBUG (" _recv: %d\n " , b->len );
404
- if (_recv_cb)
405
- _recv_cb (_recv_cb_arg, this , b->payload , b->len );
406
- if (!_ack_pcb)
407
- _rx_ack_len += b->len ;
408
- else
409
- tcp_recved (pcb, b->len );
410
407
pb = b->next ;
411
408
b->next = NULL ;
412
- pbuf_free (b);
409
+ ASYNC_TCP_DEBUG (" _recv: %d\n " , b->len );
410
+ if (_pb_cb){
411
+ _pb_cb (_pb_cb_arg, this , b);
412
+ } else {
413
+ if (_recv_cb)
414
+ _recv_cb (_recv_cb_arg, this , b->payload , b->len );
415
+ if (!_ack_pcb)
416
+ _rx_ack_len += b->len ;
417
+ else
418
+ tcp_recved (pcb, b->len );
419
+ pbuf_free (b);
420
+ }
413
421
}
414
422
return ERR_OK;
415
423
}
416
424
417
- int8_t AsyncClient::_poll (tcp_pcb* pcb){
425
+ err_t AsyncClient::_poll (tcp_pcb* pcb){
418
426
// Close requested
419
427
if (_close_pcb){
420
428
_close_pcb = false ;
@@ -448,7 +456,11 @@ int8_t AsyncClient::_poll(tcp_pcb* pcb){
448
456
return ERR_OK;
449
457
}
450
458
451
- void AsyncClient::_dns_found (ip_addr_t *ipaddr){
459
+ #if LWIP_VERSION_MAJOR == 1
460
+ void AsyncClient::_dns_found (struct ip_addr *ipaddr){
461
+ #else
462
+ void AsyncClient::_dns_found (const ip_addr *ipaddr){
463
+ #endif
452
464
if (ipaddr){
453
465
#if ASYNC_TCP_SSL_ENABLED
454
466
connect (IPAddress (ipaddr->addr ), _connect_port, _pcb_secure);
@@ -464,28 +476,31 @@ void AsyncClient::_dns_found(ip_addr_t *ipaddr){
464
476
}
465
477
466
478
// lWIP Callbacks
467
-
479
+ # if LWIP_VERSION_MAJOR == 1
468
480
void AsyncClient::_s_dns_found (const char *name, ip_addr_t *ipaddr, void *arg){
481
+ #else
482
+ void AsyncClient::_s_dns_found (const char *name, const ip_addr *ipaddr, void *arg){
483
+ #endif
469
484
reinterpret_cast <AsyncClient*>(arg)->_dns_found (ipaddr);
470
485
}
471
486
472
- int8_t AsyncClient::_s_poll (void *arg, struct tcp_pcb *tpcb) {
487
+ err_t AsyncClient::_s_poll (void *arg, struct tcp_pcb *tpcb) {
473
488
return reinterpret_cast <AsyncClient*>(arg)->_poll (tpcb);
474
489
}
475
490
476
- int8_t AsyncClient::_s_recv (void *arg, struct tcp_pcb *tpcb, struct pbuf *pb, int8_t err) {
491
+ err_t AsyncClient::_s_recv (void *arg, struct tcp_pcb *tpcb, struct pbuf *pb, err_t err) {
477
492
return reinterpret_cast <AsyncClient*>(arg)->_recv (tpcb, pb, err);
478
493
}
479
494
480
- void AsyncClient::_s_error (void *arg, int8_t err) {
495
+ void AsyncClient::_s_error (void *arg, err_t err) {
481
496
reinterpret_cast <AsyncClient*>(arg)->_error (err);
482
497
}
483
498
484
- int8_t AsyncClient::_s_sent (void *arg, struct tcp_pcb *tpcb, uint16_t len) {
499
+ err_t AsyncClient::_s_sent (void *arg, struct tcp_pcb *tpcb, uint16_t len) {
485
500
return reinterpret_cast <AsyncClient*>(arg)->_sent (tpcb, len);
486
501
}
487
502
488
- int8_t AsyncClient::_s_connected (void * arg, void * tpcb, int8_t err){
503
+ err_t AsyncClient::_s_connected (void * arg, void * tpcb, err_t err){
489
504
return reinterpret_cast <AsyncClient*>(arg)->_connected (tpcb, err);
490
505
}
491
506
@@ -681,6 +696,11 @@ void AsyncClient::onData(AcDataHandler cb, void* arg){
681
696
_recv_cb_arg = arg;
682
697
}
683
698
699
+ void AsyncClient::onPacket (AcPacketHandler cb, void * arg){
700
+ _pb_cb = cb;
701
+ _pb_cb_arg = arg;
702
+ }
703
+
684
704
void AsyncClient::onTimeout (AcTimeoutHandler cb, void * arg){
685
705
_timeout_cb = cb;
686
706
_timeout_cb_arg = arg;
@@ -715,6 +735,14 @@ size_t AsyncClient::space(){
715
735
return 0 ;
716
736
}
717
737
738
+ void AsyncClient::ackPacket (struct pbuf * pb){
739
+ if (!pb){
740
+ return ;
741
+ }
742
+ tcp_recved (_pcb, pb->len );
743
+ pbuf_free (pb);
744
+ }
745
+
718
746
const char * AsyncClient::errorToString (int8_t error){
719
747
switch (error){
720
748
case 0 : return " OK" ;
@@ -855,7 +883,6 @@ void AsyncServer::beginSecure(const char *cert, const char *key, const char *pas
855
883
void AsyncServer::end (){
856
884
if (_pcb){
857
885
// cleanup all connections?
858
- tcp_abort (_pcb);
859
886
tcp_arg (_pcb, NULL );
860
887
tcp_accept (_pcb, NULL );
861
888
if (tcp_close (_pcb) != ERR_OK){
@@ -896,7 +923,7 @@ uint8_t AsyncServer::status(){
896
923
return _pcb->state ;
897
924
}
898
925
899
- int8_t AsyncServer::_accept (tcp_pcb* pcb, int8_t err){
926
+ err_t AsyncServer::_accept (tcp_pcb* pcb, err_t err){
900
927
if (_connect_cb){
901
928
#if ASYNC_TCP_SSL_ENABLED
902
929
if (_noDelay || _ssl_ctx)
@@ -964,12 +991,12 @@ int8_t AsyncServer::_accept(tcp_pcb* pcb, int8_t err){
964
991
return ERR_OK;
965
992
}
966
993
967
- int8_t AsyncServer::_s_accept (void *arg, tcp_pcb* pcb, int8_t err){
994
+ err_t AsyncServer::_s_accept (void *arg, tcp_pcb* pcb, err_t err){
968
995
return reinterpret_cast <AsyncServer*>(arg)->_accept (pcb, err);
969
996
}
970
997
971
998
#if ASYNC_TCP_SSL_ENABLED
972
- int8_t AsyncServer::_poll (tcp_pcb* pcb){
999
+ err_t AsyncServer::_poll (tcp_pcb* pcb){
973
1000
if (!tcp_ssl_has_client () && _pending){
974
1001
struct pending_pcb * p = _pending;
975
1002
if (p->pcb == pcb){
@@ -995,7 +1022,7 @@ int8_t AsyncServer::_poll(tcp_pcb* pcb){
995
1022
return ERR_OK;
996
1023
}
997
1024
998
- int8_t AsyncServer::_recv (struct tcp_pcb *pcb, struct pbuf *pb, int8_t err){
1025
+ err_t AsyncServer::_recv (struct tcp_pcb *pcb, struct pbuf *pb, err_t err){
999
1026
if (!_pending)
1000
1027
return ERR_OK;
1001
1028
@@ -1047,11 +1074,11 @@ int AsyncServer::_s_cert(void *arg, const char *filename, uint8_t **buf){
1047
1074
return reinterpret_cast <AsyncServer*>(arg)->_cert (filename, buf);
1048
1075
}
1049
1076
1050
- int8_t AsyncServer::_s_poll (void *arg, struct tcp_pcb *pcb){
1077
+ err_t AsyncServer::_s_poll (void *arg, struct tcp_pcb *pcb){
1051
1078
return reinterpret_cast <AsyncServer*>(arg)->_poll (pcb);
1052
1079
}
1053
1080
1054
- int8_t AsyncServer::_s_recv (void *arg, struct tcp_pcb *pcb, struct pbuf *pb, int8_t err){
1081
+ err_t AsyncServer::_s_recv (void *arg, struct tcp_pcb *pcb, struct pbuf *pb, err_t err){
1055
1082
return reinterpret_cast <AsyncServer*>(arg)->_recv (pcb, pb, err);
1056
1083
}
1057
1084
#endif
0 commit comments