Don't receive TCP packet

Linux 2011. 2. 2. 09:07
개발 중인 모델에, 1차 검증 단계에서 PC와의 socket 통신으로 진행하는 단계가 있다.

이까짓것 하면서 붙였는데, 얼레... 진행이 안된다.  소스를 뜯어봐도 문제가 없는 것 같다.

Wireshark를 설치하고 packet의 흐름을 살펴봤다.  그 결과, board에서 UDP에 대해서는 정상적으로 반응하는데 TCP에 대해서는 제대로 반응하지 않는다는 것을 알았다.  뭐가 문제일까...

혹시나 .application의 문제일까 하고 TFTP를 실행해보니 이것은 역시 정상 동작, telnet과 NFS를 -o tcp 옵션을 사용하여보니 이것도 마찬가지 증상이다.  의심해봐야 자기만 손해라는 linux kernel중에서 그 역사가 깊고 유구한 networking쪽을 의심하기 시작, kernel을 파집고 들어가기 시작했다.

역시나, tcp_v4_rcv()에서 packet을 dropt시키는 현상을 발견했는데, 그 조건은,

if (skb->pkt_type != PACKET_HOST)
    goto discard_it;


확인 결과, skb->pkt_type은 include/linux/if_packet.h에 다음과 같이 정의되어 있다.

#define PACKET_HOST 0
#define PACKET_BROADCAST 1
#define PACKET_MULTICAST 2
#define PACKET_OTHERHOST 3
#define PACKET_OUTGOING 4
#define PACKET_LOOPBACK 5
#define PACKET_FASTROUTE 6


이 중에서, 나의 경우는 항상 PACKET_MULTICAST로 되어있는 것이 문제였다.  어떤 녀석이 이것을 셋팅할까.  역추적을 시작한 결과, 각각의 ethernet device에서 호출하는 함수인 eth_type_trans()에서 값이 결정된다는 것을 파악했다.
if (unlikely(is_multicast_ether_addr(eth->h_dest))) {
    if (!compare_ether_addr_64bits(eth->h_dest, dev->broadcast))
        skb->pkt_type = PACKET_BROADCAST;
    else
        skb->pkt_type = PACKET_MULTICAST;


is_multicast_ether_addr()은 해당 ethernet address (MAC address)가 multicast address인지 아닌지 파악한다.  근데 나는 multicast로 지정한 적이 없는데!! 내가 임시로 지정한 MAC address가 11:00:aa:bb:00:11 이었다... -_-

아.  역시.. 또 spec를 모르고 일을 하는데서 오는 문제점이었단 말인가... 쳇... -.-

http://en.wikipedia.org/wiki/MAC_address
Posted by 강군님

댓글을 달아 주세요

  1. Favicon of http://www.squidoo.com/ukdissertationwritinghelp ukdissertationwritinghelp 2011.02.04 13:36  댓글주소  수정/삭제  댓글쓰기

    It’s a great tip on Do It yourself stuff. Thanks!

  2. 장모군 2011.02.11 10:24  댓글주소  수정/삭제  댓글쓰기

    삽질을 해야 지식이 남는 것 같아요.