Skip to content

Commit a1ffdfd

Browse files
committed
Fix issue on Cosm sketch tahat stops after some conenctions
1 parent b865941 commit a1ffdfd

File tree

2 files changed

+117
-21
lines changed

2 files changed

+117
-21
lines changed

wifiHD/src/ard_spi.c

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ static void ard_tcp_print_stats(struct ttcp *ttcp) {
231231

232232
void showTTCPstatus()
233233
{
234+
printk("IF status: %s\n", (ifStatus) ? "UP":"DOWN");
235+
printk("CONN status: %s\n", (_connected) ? "UP":"DOWN");
236+
234237
int i = 0;
235238
for (; i<MAX_SOCK_NUM; i++)
236239
{
@@ -691,6 +694,15 @@ int start_client_tcp_cmd_cb(int numParam, char* buf, void* ctx) {
691694
if (sock >= MAX_SOCK_NUM)
692695
return WIFI_SPI_ERR;
693696

697+
// Check previous connection
698+
_ttcp = getTTCP(sock);
699+
if (_ttcp != NULL)
700+
{
701+
printk("Previous client %p not stopped !\n", _ttcp);
702+
ard_tcp_stop(_ttcp);
703+
clearMapSockTcp(sock);
704+
}
705+
694706
if (ard_tcp_start((struct ip_addr)addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, sock, &_ttcp) == 0)
695707
{
696708
INFO_SPI("Start Client [0x%x, %d, %d] OK!\n", addr, port, sock);
@@ -1110,19 +1122,26 @@ cmd_spi_state_t get_client_state_tcp_cmd_cb(char* recv, char* reply, void* ctx,
11101122
if ((recv[3]==1)&&(recv[4]>=0)&&(recv[4]<MAX_SOCK_NUM))
11111123
{
11121124
void * p= getTTCP((uint8_t)recv[4]);
1113-
// get if we are in server or Transmit mode (0)
1114-
if (getModeTcp(p) == TTCP_MODE_TRANSMIT)
1125+
if (p!=NULL)
11151126
{
1127+
// get if we are in server or Transmit mode (0)
1128+
if (getModeTcp(p) == TTCP_MODE_TRANSMIT)
1129+
{
1130+
1131+
_state = getStateTcp(p, 1);
1132+
INFO_TCP_VER("CLI> p=%p _ttcp=%p state(tpcb):%d state:%d\n",
1133+
p, ((struct ttcp*) p)->tpcb,
1134+
((struct ttcp*) p)->tpcb->state,
1135+
_state);
1136+
}else {
1137+
_state = getStateTcp(p, 1);
1138+
INFO_TCP_VER("SER> p=%p _ttcp=%p state(tpcb):%d state(lpcb):%d state:%d\n",
1139+
p, ((struct ttcp*) p)->tpcb,
1140+
((struct ttcp*) p)->tpcb->state,
1141+
((struct ttcp*) p)->lpcb->state,
1142+
_state);
11161143

1117-
_state = getStateTcp(p, 1);
1118-
INFO_TCP_VER("p=%p _ttcp=%p state:%d\n",
1119-
p, ((struct ttcp*) p)->tpcb, _state);
1120-
}else {
1121-
INFO_TCP_VER("p=%p _ttcp=%p state(tpcb):%d state(lpcb):%d\n",
1122-
p, ((struct ttcp*) p)->tpcb,
1123-
((struct ttcp*) p)->tpcb->state,
1124-
((struct ttcp*) p)->lpcb->state);
1125-
_state = getStateTcp(p, 1);
1144+
}
11261145
}
11271146
}
11281147
PUT_DATA_BYTE(_state, reply, 3);

wifiHD/src/ard_tcp.c

Lines changed: 87 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
227243
static 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

617672
void 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

Comments
 (0)