WIZnet Developer Forum

W5200 client Mode 에서의 재전송관련 문의

안녕하세요
w5200 Chip로 STM32f103 CPU와 SPI로 연결하여 Client Mode로 PC는 Server 실험중에 Packet send 시 이상 현상이 발생되어 질의 드립니다.
Packet Send시에 약 256 Byte를 50ms 간격으로 계속 하여 보내는 실험을 하였습니다. 실제 사용하는 Program이 상태 정보를 자주 보내여야 하기 때문에 50ms 가격으로 Packet을 보내는 도중에 몇분 정도 지나면 Error가 발생하기 시작 합니다. 256 byte 중 만약 10개를 못 보내었다면 한번에 1byte 씩 재전송 하는 Mode로 들어 갑니다.

W5200_TCP_and_UDP_SampleCode_v1.3 Loopback 예제일부

case SOCK_ESTABLISHED:						/* if connection is established */                
	if(ch_status[s]==1)
	{
		printf("\r\n%d : Connected",s);			
		ch_status[s] = 2;
	}
	if ((RSR_len = getSn_RX_RSR(s)) > 0) 			/* check Rx data */
	{
		if (RSR_len > TX_RX_MAX_BUF_SIZE) RSR_len = TX_RX_MAX_BUF_SIZE;	/* if Rx data size is lager than TX_RX_MAX_BUF_SIZE */
								/* the data size to read is MAX_BUF_SIZE. */
		received_len = recv(s, data_buf, RSR_len);			/* read the received data */
		printf(" received_len = %d\n\r",received_len);
                    sent_data_len = send(s, data_buf, received_len, (bool)WINDOWFULL_FLAG_OFF);         /* sent the received data */
                    printf(" sent_data_len = %d\n\r",sent_data_len);
                    if(sent_data_len != received_len) /* ohly assert when windowfull */
                    {
                              init_windowfull_retry_cnt(s);                              
                              while(sent_data_len !=  received_len) 
                              {
                                        printf("ret :%d\r\n", sent_data_len);
                                        tmp_retry_cnt = incr_windowfull_retry_cnt(s);
                                        
                                        if(tmp_retry_cnt <= WINDOWFULL_MAX_RETRY_NUM) 
                                        {
                                                   sent_data_len += send(s, data_buf, received_len, (bool)WINDOWFULL_FLAG_ON); 
                                                   os_delay(WINDOWFULL_WAIT_TIME);
                                         } 
                                        else 
                                        {
                                                   printf("WindowFull !!!\r\n");
                                                   close(s);
                                                   printf("Socket Close !!!\r\n");
                                                   while(1);
                                        }
                              }                               
                    }                        
	}

os_delay 는 freeRTOS 에서 ms 단위의 Delay 함수 입니다.
받는 쪽은 PC Server 로 AXI 이나 EthernetHost 모두 동일합니다.
질의사항
재전송시에 1 byte 밖에는 못 보내는가요?
그렇다면 200 byte 못 보냈다고 Return 되면 200 번을 retry 해야 하는가요?
send 함수로 Packet 전송시 어느정도의 Delay를 두어야 하나요?
이러한 현상이 발생된 후에는 CHip Reset하기 전까지는 정상화 되지 않습니다.
혹시 w5500 Chip을 사용하면 재전송시 이러한 문제를 해결 될 수 있는지요?

안녕하세요 위즈네트 김현준 연구원입니다.

먼저 와이어샤크로 패킷캡쳐하여 윈도우 풀상태인지 아닌지 확인 부탁드립니다.

그리고 풀 상태가 아님에도 불구하고 패킷을 1byte씩만 보낸다면

github.com/Wiznet/ioLibrary_Driver

위 사이트로 접속하셔서 ioLibrary를 다운받아 포팅 후 사용해 보시기 바랍니다.
사용하신 firmware 드라이버와 loopback 코드보다 많이 업데이트 된 버전입니다.
해당 Library로 포팅하신후 사용해보시면 정상동작을 확인하실 수 있으실 겁니다.

참고로 말씀드리자면 1.3버전은 최신버전이 아니라 1.7버전이 최신 펌웨어입니다

wiznet.co.kr/product-item/w5200/ (여기서 받아보실 수 있습니다.)

하지만 1.7 펌웨어도 예전 버전이기 때문에 ioLibrary를 포팅하시는게 가장 좋은 방법입니다.

안녕하세요
Version 1.7로 Driver를 바꾸어 시험해도 조금 지나면 더이상 send가 되지 않습니다.
wireshark로 잡아 보면
2576 67.705613 192.168.0.3 192.168.0.70 TCP 54 5062→5062 [ACK] Seq=23 Ack=1050 Win=63193 Len=0
2584 67.741844 175.212.206.47 192.168.0.3 TCP 66 60536→5062 [ACK] Seq=62 Ack=3589 Win=25344 Len=0 TSval=49306265 TSecr=70550289
2604 68.171269 192.168.0.70 192.168.0.3 TCP 69 5062→5062 [PSH, ACK] Seq=1050 Ack=23 Win=2048 Len=15
2605 68.171491 192.168.0.3 175.212.206.47 TCP 81 5062→60536 [PSH, ACK] Seq=3589 Ack=62 Win=66304 Len=15 TSval=70550341 TSecr=49306265
2606 68.221234 192.168.0.3 192.168.0.70 TCP 54 5062→5062 [ACK] Seq=23 Ack=1065 Win=63178 Len=0
2607 68.255223 175.212.206.47 192.168.0.3 TCP 66 60536→5062 [ACK] Seq=62 Ack=3604 Win=25344 Len=0 TSval=49306316 TSecr=70550341

192.168.0.70 이 w5200 쪽 Board입니다.
192.168.0.3이 Server 쪽입니다.
172.212.206.47 은 스마트폰 쪽입니다.
첨부한 ip_send_error_capture.exe 는 확장자를 pcapng 로 바꾸면 wireshark로 열어 볼수 있습니다.
약 500ms 단위로 15 packet 을 주기적으로 전송하다가 약4~5분 지나면 Send한 Packet이 0 byte가 됩니다.
한번 봐 주십시요.
ip_send_error_capture.txt (1.96 MB)

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.