WIZnet Developer Forum

[W5300] UDP 통신중 packet 놓치는 현상

W5300을 이용하여 약15Mbps의 UDP 송수신을 테스트하고 있습니다.(MACRAW mode)

W5300은 일방적으로 수신을 하게 되는데요.
약 10초에 한번씩 packet을 한두개 놓치는 현상이 감지됩니다.

packet 수신을 감지하는 방법은 S0_RX_RSR, S0_RX_RSR2를 읽어서 판단하도록 했습니다.

혹시 충돌에 의해서 이런 현상이 발생하는게 UDP의 특성상 맞는 것인지요.
아니면 다른 원인이 있을까요…

만약 충돌이 발생해서 packet을 놓친다면 이것을 알 수 있는 방법이 있는지도 알고 싶습니다.

안녕하세요.

우선 UDP의 경우, 말씀하신대로 데이터 통신에 대한 보장을 하지 않는 것을 특징으로 합니다.
그래서 UDP 자체의 특성 때문에 모듈의 노드로 오기전에 데이터가 유실되는 원인일 수 있는 것이죠.

하지만, 패킷을 놓치는 경우에 대해서는 다른 원인이 존재할 수 있습니다.

현재 이더넷 수신을 감지하는 방법으로 RSR의 값을 활용한다고 하셨는데,
지정된 버퍼를 넘어설 때까지 데이터를 가져가지 않아 overflow로 데이터가 유실될 수 있습니다.
이 경우 RSR값이 소켓 RX버퍼 사이즈를 넘는지 확인하여 아실 수 있습니다.
(RX인터럽트를 사용해서 RX버퍼 사이즈를 체크함으로써 overflow를 확인하는 방법도 있습니다)

보다 정확한 방법으로는 Wireshark같은 패킷 확인 프로그램을 통해 모듈의 노드까지 도달한 데이터의 손실여부를 판단하면 되겠죠.
다만, 이 경우는 Dummy허브와 같은 장비가 필요하므로 상황에 맞지 않으시다면 추천하지 않습니다.

감사합니다.

안녕하세요.
친절한 답변 감사드립니다.

패킷이 빠지는 현상때문에 RSR과 interrupt를 동시에 모니터링하고 있습니다.

관찰한 결과를 보면 패킷이 빠지는 순간에 interrupt가 발생하지는 않고 있습니다.
제가 패킷을 처리하는 루틴은 아래와 같습니다.

  1. RSR != 0 이면 2로 진행
  2. interrupt vector 값이 있으면 clear 후, 3으로 진행
  3. RSR 값 만큼 buffer read, 4로 진행
  4. RSR == 0이면 1로 return, 아니면 3으로 return

이렇게 진행됩니다. (이 루틴동안 interrupt 핀은 항상 low로 발생하는지 모니터링 합니다.)

패킷이 빠진 구간에서는 interrupt가 발생하지 않았습니다.

혹시 다른 방법으로 디버깅할 방법이 없을런지요…

말씀하신대로 테스트하셨다면,
W5300의 하드웨어 버퍼가 overflow되서 발생하는 현상은 아니겠네요.
패킷 중 일부가 유실된 것이 아니라, 패킷 자체가 하나 둘 들어오지 않은 것이니까요.

질문 사항으로,
현재 RX 인터럽트에 대해서 별다른 핸들링은하지 않고, 인터럽트 발생여부만 판단하고 계신건가요?
3, 4가 진행될 때, 인터럽트가 발생하면 2번으로 넘어가서 진행되는건가요?
추가로,
혹시 지금 테스트하는 환경이 PC와 다이렉트로 연결되서 하는 것인가요?
PC와 모듈사이에 다른 네트워크의 간섭이 없는데 패킷이 유실된다면, 하드웨어 문제일 가능성이 높습니다(RJ45, LAN Cable 등)

다른 디버깅 방법으로는 말씀드린바처럼,
Dummy 허브를 사용해서 WireShark 같은 프로그램으로 패킷을 캡쳐해보는 것이 가장 확실합니다.

애초에 모듈의 노드에 패킷이 제대로 전달되지 않았다면, 중간에 유실된 것이니까요.

현재 테스트하고 계신 방법으로도 어느정도 패킷 자체가 들어오지 않았다라는 예상을 할 수 있겠지만,
가장 단순하고 확실한 방법은 위의 방법이 되겠습니다.

안녕하세요…


질문 사항으로,
현재 RX 인터럽트에 대해서 별다른 핸들링은하지 않고, 인터럽트 발생여부만 판단하고 계신건가요?
3, 4가 진행될 때, 인터럽트가 발생하면 2번으로 넘어가서 진행되는건가요?

–> 인터럽트는 단순 모니터링만 하고 있습니다.
인터럽트 벡터가 0이 아니면 확인만하고 clear를 하고 있습니다.
3,4번에서 인터럽트가 발생한다고 해서 다시 2번으로 돌아가지는 않습니다.


혹시 지금 테스트하는 환경이 PC와 다이렉트로 연결되서 하는 것인가요?
PC와 모듈사이에 다른 네트워크의 간섭이 없는데 패킷이 유실된다면, 하드웨어 문제일 가능성이 높습니다(RJ45, LAN Cable 등)

–>테스트환경은 아래와 같습니다.
PC -> W5300 (direct 연결)
PC에서는 wireshark으로 pcap file을 pumping하여 W5300으로 전송

W5300 제어는 FPGA로 수행함
FPGA에서 W5300의 interrupt라든가 read/write 신호 및 data들을 제어 및 모니터링함.
packet이 놓쳤다고 판단되는 부분에서 전후의 packet 값을 FPGA에서 확인(signal Tap으로 read data 확인)하여
wireshark의 pcap file과 data를 비교하여 W5300으로 packet이 들어 오지 않음을 확인.

이렇게 테스트를 하고 있습니다.
혹시 이전 packet의 data를 읽은 후, timing의 문제로 인하여 어떤 설정을 miss하게 되면 next packet을 수신하지 못할 가능성이 있을까요?
(register read/write low duration은 약 144ns로 datasheet에 명시된 min 값보다는 여유가 있는 편이긴 합니다.)

그리고 만약 RJ45에서 유실된다면, W5300에서 이를 확인할 수 있는 방법은 없는지요.

감사합니다.

안녕하세요.

현재 MACRAW로
별다른 파싱하지 않고 IP Header부터 다 받고 계신건가요?

처음 답변으로 돌아가서, 버퍼가 overflow 나면 애초에 패킷이 버려집니다.
이 경우 수신데이터가 없기 때문에 인터럽트가 발생하지 않습니다.
UDP는 TCP와 달리 송신측에서 전송성공 유무를 확인할 수도 없습니다.

현재 사용하시는 소켓의 사이즈는 얼마이고,
PC에서 보내는 패킷의 사이즈는 얼마이며, 얼마 간격으로 보내는지가 중요합니다.
현재 RSR을 통해 수신 체크를 하신다는 말을 들어보았을 때, 폴링방식으로 구현하신 것으로 판단됩니다.
또한 데이터를 처리하는 과정 시간에 따라서는 딜레이 되어, 계속해서 버퍼에 데이터가 쌓이고 overflow가 발생할 수도 있을 것 같습니다.

RSR 사이즈를 매번 체크해서 점점 누적되는지, 소켓 버퍼 사이즈에 근접한 값이 들어있는지 확인해보셔서 overflow문제를 짚고 넘어가시는게 좋을듯 합니다.

읽고 쓰는 타이밍에 대한 것은, 데이터시트에 나와있는 타이밍만 잘 지켜주시면 문제 없습니다.
레지스터 접근과 관련해서는 아래 ioLibrary를 참조하시면 좋을 것 같습니다.
https://github.com/Wiznet/ioLibrary_Driver/blob/master/Ethernet/W5300/w5300.c

그리고, RJ45에서 유실된 것을 받는 입장인 W5300에서 확인할 방법은 없습니다.

감사합니다.

현재 MACRAW 로 IP Header부터 전부 받고 있습니다.

socket size는 default(8KB)를 사용하고 있습니다.
입력받는 packet size는 대략 1200 ~1448 Byte사이의 값을 가집니다. 이보다 큰 size는 존재하지 않습니다.

packet이 빠지는 순간을 기준으로 앞쪽의 수신 데이터를 살펴보면 매 packet 마다 polling이 발생하여 buffer를 비워주는 동작을
반복하고 있는 것으로 미루어 볼 때, 내부 buffer의 overflow가 발생하지는 않는 것으로 유추할 수 있을 듯 합니다.

말씀하신대로 overflow는 다시한번 체크해 보도록 하겠습니다.

그리고 환경을 다르게 설정해서 테스트를 해 보면서 packet 빠지는 현상이 동일한지 살펴보고 다시 질문하도록 하겠습니다.

감사합니다.

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