@@ -151,7 +151,7 @@ static void tcp_send_data(struct ttcp *ttcp) {
151151 do {
152152 startTime = timer_get_ms ();
153153 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 );
155155 if (err == ERR_MEM )
156156 {
157157 len /= 2 ;
@@ -185,6 +185,7 @@ static err_t tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) {
185185 INFO_TCP ("TTCP [%p-%p]: connect %d %d\n" , ttcp , tpcb , err , ttcp -> tpcb -> state );
186186
187187 _connected = ( ttcp -> tpcb -> state == ESTABLISHED ) ? 1 : 0 ;
188+ tcp_poll_retries = 0 ;
188189
189190 ttcp -> start_time = timer_get_ms ();
190191
@@ -224,6 +225,21 @@ static void atcp_conn_err_cb(void *arg, err_t err) {
224225 pending_close = false;
225226}
226227
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+
227243static void close_conn (struct ttcp * _ttcp ) {
228244 tcp_arg (_ttcp -> tpcb , NULL );
229245 tcp_sent (_ttcp -> tpcb , NULL );
@@ -331,6 +347,44 @@ static err_t atcp_poll(void *arg, struct tcp_pcb *pcb) {
331347 return ERR_OK ;
332348}
333349
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+
334388/**
335389 * Only used in TCP mode.
336390 */
@@ -379,11 +433,12 @@ static int atcp_start(struct ttcp* ttcp) {
379433 atcp_init ();
380434
381435 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 );
383437 tcp_recv (ttcp -> tpcb , atcp_recv_cb );
438+ tcp_poll (ttcp -> tpcb , atcp_poll , 4 );
384439 _connected = false;
385440 INFO_TCP ("[tpcb]- %p\n" , ttcp -> tpcb );
386-
441+ DUMP_TCP_STATE ( ttcp );
387442 if (tcp_connect (ttcp -> tpcb , & ttcp -> addr , ttcp -> port , tcp_connect_cb )
388443 != ERR_OK ) {
389444 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,
616671
617672void ard_tcp_stop (void * ttcp ) {
618673 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 )
623675 {
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+ }
625690 }
626691}
627692
@@ -672,9 +737,9 @@ static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len) {
672737
673738 tcp_poll_retries = 0 ;
674739
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 );
676741
677- if (_ttcp -> left > 0 ) {
742+ if (( _ttcp ) && ( _ttcp -> left > 0 ) ) {
678743 INFO_TCP ("data left: %d\n" , _ttcp -> left );
679744 tcp_send_data (_ttcp );
680745 }
@@ -687,6 +752,18 @@ int sendTcpData(void* p, uint8_t* buf, uint16_t len) {
687752 DUMP_TCP (buf ,len );
688753
689754 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+
690767 if ((_ttcp != NULL ) && (_ttcp -> tpcb != NULL ) &&
691768 (buf != NULL ) && (len != 0 ) && (_ttcp -> payload != NULL )) {
692769 if (_ttcp -> tpcb -> state == ESTABLISHED ||
0 commit comments