@@ -151,7 +151,7 @@ static void tcp_send_data(struct ttcp *ttcp) {
151
151
do {
152
152
startTime = timer_get_ms ();
153
153
err = tcp_write (ttcp -> tpcb , ttcp -> payload , len , TCP_WRITE_FLAG_COPY );
154
- INFO_TCP ("%d) tcp_write %p len:%d err:%d\n" , count ++ , ttcp -> tpcb , len , err );
154
+ INFO_TCP_VER ("%d) tcp_write %p state:%d len:%d err:%d\n" , count ++ , ttcp -> tpcb , ttcp -> tpcb -> state , len , err );
155
155
if (err == ERR_MEM )
156
156
{
157
157
len /= 2 ;
@@ -185,6 +185,7 @@ static err_t tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) {
185
185
INFO_TCP ("TTCP [%p-%p]: connect %d %d\n" , ttcp , tpcb , err , ttcp -> tpcb -> state );
186
186
187
187
_connected = ( ttcp -> tpcb -> state == ESTABLISHED ) ? 1 : 0 ;
188
+ tcp_poll_retries = 0 ;
188
189
189
190
ttcp -> start_time = timer_get_ms ();
190
191
@@ -224,6 +225,21 @@ static void atcp_conn_err_cb(void *arg, err_t err) {
224
225
pending_close = false;
225
226
}
226
227
228
+ static void atcp_conn_cli_err_cb (void * arg , err_t err ) {
229
+ struct ttcp * _ttcp = arg ;
230
+
231
+ WARN ("TTCP [%p]: connection error: %d arg:%p\n" ,
232
+ _ttcp , err , arg );
233
+
234
+ if (ifStatus == false)
235
+ printk ("Abort connection\n" );
236
+ ard_tcp_destroy (_ttcp );
237
+ cleanSockState_cb (_ttcp );
238
+
239
+ pending_close = false;
240
+ }
241
+
242
+
227
243
static void close_conn (struct ttcp * _ttcp ) {
228
244
tcp_arg (_ttcp -> tpcb , NULL );
229
245
tcp_sent (_ttcp -> tpcb , NULL );
@@ -331,6 +347,44 @@ static err_t atcp_poll(void *arg, struct tcp_pcb *pcb) {
331
347
return ERR_OK ;
332
348
}
333
349
350
+ static err_t atcp_poll_conn (void * arg , struct tcp_pcb * pcb ) {
351
+ struct ttcp * _ttcp = arg ;
352
+ ++ tcp_poll_retries ;
353
+
354
+ if (tcp_poll_retries > 4 ) {
355
+ WARN ("ARD TCP [%p] arg=%p retries=%d\n" ,
356
+ pcb , arg , tcp_poll_retries );
357
+ tcp_poll_retries = 0 ;
358
+ tcp_abort (pcb );
359
+ ard_tcp_destroy (_ttcp );
360
+ cleanSockState_cb (_ttcp );
361
+ pending_close = false;
362
+ return ERR_ABRT ;
363
+ }
364
+
365
+ if (pending_close )
366
+ {
367
+ err_t err = tcp_close (pcb );
368
+ if (err == ERR_MEM )
369
+ {
370
+ pending_close = true;
371
+ }
372
+ else
373
+ {
374
+ pending_close = false;
375
+ }
376
+
377
+ INFO_TCP ("ARD TCP [%p-%p] try to close pending:%d\n" , pcb , (_ttcp )?_ttcp -> tpcb :0 , pending_close );
378
+ }else {
379
+ WARN ("ARD TCP [%p-%p] arg=%p retries=%d\n" , (_ttcp )?_ttcp -> tpcb :0 , pcb , arg , tcp_poll_retries );
380
+ if (_ttcp ) tcp_send_data (_ttcp );
381
+ else WARN ("ttcp NULL!" );
382
+ }
383
+
384
+ return ERR_OK ;
385
+ }
386
+
387
+
334
388
/**
335
389
* Only used in TCP mode.
336
390
*/
@@ -379,11 +433,12 @@ static int atcp_start(struct ttcp* ttcp) {
379
433
atcp_init ();
380
434
381
435
if (ttcp -> mode == TTCP_MODE_TRANSMIT ) {
382
- tcp_err (ttcp -> tpcb , atcp_conn_err_cb );
436
+ tcp_err (ttcp -> tpcb , atcp_conn_cli_err_cb );
383
437
tcp_recv (ttcp -> tpcb , atcp_recv_cb );
438
+ tcp_poll (ttcp -> tpcb , atcp_poll , 4 );
384
439
_connected = false;
385
440
INFO_TCP ("[tpcb]- %p\n" , ttcp -> tpcb );
386
-
441
+ DUMP_TCP_STATE ( ttcp );
387
442
if (tcp_connect (ttcp -> tpcb , & ttcp -> addr , ttcp -> port , tcp_connect_cb )
388
443
!= ERR_OK ) {
389
444
WARN ("TTCP [%p]: tcp connect failed\n" , ttcp );
@@ -616,12 +671,22 @@ int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque,
616
671
617
672
void ard_tcp_stop (void * ttcp ) {
618
673
struct ttcp * _ttcp = (struct ttcp * ) ttcp ;
619
-
620
- INFO_TCP ("Closing connection...state:%d\n" , _ttcp -> tpcb -> state );
621
- DUMP_TCP_STATE (_ttcp );
622
- if ((_ttcp )&& (_ttcp -> tpcb )&& (_ttcp -> tpcb -> state != LAST_ACK )&& (_ttcp -> tpcb -> state != CLOSED ))
674
+ if (_ttcp == NULL )
623
675
{
624
- close_conn (_ttcp );
676
+ WARN ("ttcp = NULL!\n" );
677
+ return ;
678
+ }
679
+ if (_ttcp -> mode == TTCP_MODE_TRANSMIT ) {
680
+ INFO_TCP ("Destroy TCP connection...state:%d\n" , _ttcp -> tpcb -> state );
681
+ ard_tcp_destroy (_ttcp );
682
+ clearMapSockTcp (getSock (_ttcp ));
683
+ }else {
684
+ INFO_TCP ("Closing connection...state:%d\n" , _ttcp -> tpcb -> state );
685
+ DUMP_TCP_STATE (_ttcp );
686
+ if ((_ttcp )&& (_ttcp -> tpcb )&& (_ttcp -> tpcb -> state != LAST_ACK )&& (_ttcp -> tpcb -> state != CLOSED ))
687
+ {
688
+ close_conn (_ttcp );
689
+ }
625
690
}
626
691
}
627
692
@@ -672,9 +737,9 @@ static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len) {
672
737
673
738
tcp_poll_retries = 0 ;
674
739
675
- INFO_TCP ("Packet sent pcb:%p len:%d dur:%d\n" , pcb , len , timer_get_ms () - startTime );
740
+ INFO_TCP_VER ("Packet sent pcb:%p len:%d dur:%d\n" , pcb , len , timer_get_ms () - startTime );
676
741
677
- if (_ttcp -> left > 0 ) {
742
+ if (( _ttcp ) && ( _ttcp -> left > 0 ) ) {
678
743
INFO_TCP ("data left: %d\n" , _ttcp -> left );
679
744
tcp_send_data (_ttcp );
680
745
}
@@ -687,6 +752,18 @@ int sendTcpData(void* p, uint8_t* buf, uint16_t len) {
687
752
DUMP_TCP (buf ,len );
688
753
689
754
struct ttcp * _ttcp = (struct ttcp * ) p ;
755
+
756
+ if (_ttcp == NULL )
757
+ {
758
+ WARN ("ttcp == NULL!" );
759
+ return WL_FAILURE ;
760
+ }
761
+
762
+ INFO_TCP_VER ("CLI> p=%p _ttcp=%p state(tpcb):%d state(lpcb):%d\n" ,
763
+ p , ((struct ttcp * ) p )-> tpcb ,
764
+ ((struct ttcp * ) p )-> tpcb -> state ,
765
+ ((struct ttcp * ) p )-> lpcb -> state );
766
+
690
767
if ((_ttcp != NULL ) && (_ttcp -> tpcb != NULL ) &&
691
768
(buf != NULL ) && (len != 0 ) && (_ttcp -> payload != NULL )) {
692
769
if (_ttcp -> tpcb -> state == ESTABLISHED ||
0 commit comments