W5100 Errata 문서에 대한 의문점

W5100 사용하려고 데이터 시트와 W5100E01-AVR 예제 코드 보고 공부중입니다.

궁금한 점은 추가 적으로 받았던 문서중에 “3150Aplus_5100_errata_kr_v2.4.pdf” 라는 문서가 존재하는데

해당 문서의 Errata 2, 3번 을 보고 W5100E01-AVR 예제 코드를 보면서 생겼습니다. (정확히는 socket.c )

해당 문서의 2번에 문제를 기술후 solution으로 기제된 답에 따르면

<
이 Erratum을 피하기 위해 TCP의 “Connect”명령과 UDP의 “SEND”명령을
제외하고 항상 subnet mask register의 값을 0으로 유지한다. TCP connect명
령과 UDP send명령은 ARP패킷을 송신하기 때문에 위 그림처럼 유효한
subnet mask 값을 전역변수에 저장해두고 TCP connect와 UDP send명령을
수행할 때만 subnet mask register값을 설정하고 명령이 완료되면 다시
subnet mask register값을 0으로 clear한다.
위의 내용을 적용했을 경우에는 Subnet broadcasting이 되지 않는다.

으로 되어있습니다. 그런데 제공되는 socket.c의 코드를 보게되면

uint8 connect(SOCKET s, uint8 * addr, uint16 port)
{
uint8 ret;

if(
((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) ||
((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
(port == 0x00)
)
{
ret = 0;
}
else
{
ret = 1;
// set destination IP, 목적지 IP 설정, 포트 설정
IINCHIP_WRITE(Sn_DIPR0(s),addr[0]);
IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]);
IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]);
IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]);

IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8));
IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff));
// m2012.03.13 [ys]: set/clear subnet for ARP Errata
   [color=#FF0000]clearSUBR();[/color]    

IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT);
/* m2008.01 [bj] : wait for completion */
while ( IINCHIP_READ(Sn_CR(s)) );
[color=#FF0000]applySUBR();[/color]
}

return ret;
}

으로 되어있는데 설명과는 반대로 Connet 명령을 보낼때만 clear를 하고 명령이 전송된 후에 Set를 하고있는것 처럼 보입니다.

문서와 제공 코드가 서로 다른거 같아서 의문점이 생깁니다.

Erratum 2&3은 아주 특별한 경우에만 발생할 수 있는 문제점으로
실 응용에서는 극히 드물게 나타나는 문제입니다.
따라서, 이 경우에 해당되지 않는 경우 즉 상대방의 아이피가 0.0.0.0이거나 W5100의 IP가 0.0.0.0인 경우가 아니라면
Erratum 을 적용하는 것을 권장하지 않습니다. 이는 Broadcating 패킷의 Loss를 야기 시킬 수 있으며,
Erratum 사항이 아니라면 구지 해당 코드를 구현할 필요는 없습니다.

문서와 Code 상이 불일치 문제는 개선하여 Upload하겠습니다.

문서와 코드의 불일치로 불편을 드려 죄송합니다.
코드가 제대로 된 것입니다.
해당문서는 수정하여 업로드 하였습니다.

현재 Errata code는 W5100의 IP가 '0.0.0.0’일 경우에만 동작하도록 되어있습니다.

TCP의 Connect / UDP의 Sendto 에서 W5100의 IP가 '0.0.0.0’이 아닌 경우에는 Subnet mask는 setting 값으로 유지 되며,
W5100의 IP가 '0.0.0.0’인 경우에는 Subnet mask값이 '0.0.0.0’으로 Clear되었다가 Connection이 되었거나 전송이 완료되었을때
다시 Setting값으로 변경됩니다.

아래의 URL에서 확인 하실수 있습니다.
[url]http://www.wiznet.co.kr/Admin_Root/UpLoad_Files/BoardFiles/3150Aplus_5100_ES_V250K.pdf[/url]

감사합니다.
EK :smiley:

답변 감사드립니다.
수정된 문서의 내용은 확인하였습니다.