2012년 12월 27일 목요일

Unicast IPv6 packet in broadcast Ethernet frame

IPv6 패킷은 유니캐스트 패킷인데 하위 이더넷 프레임 헤더는 브로드캐스트일때...
물론 이런 경우 일반적으로는 없다. 그러나 나한테 닥쳤다. 요새 Click Modular Router 갖고 IPv6 기반 low-power wireless PAN (6LoWPAN) 경계 라우터를 만들다보니 이런 일도 다 생긴다.ㅎㅎ

여하튼 이런 경우 해당 패킷은 리눅스 커널 IPv6 스택으로 들어간다. 만약, IPv6 헤더의 목적지 주소가 자기 자신인 경우 정상적으로 상위계층으로 올라간다. 하지만 목적지 주소가 다를 경우, 포워드시 패킷이 드랍된다.

그 이유는 이더넷 프레임 수신시 이더넷 헤더의 목적지 ID가 브로드캐스트인 경우 패킷 타입(소켓 버퍼의 pkt_type)을 브로드캐스트(PACKET_BROADCAST or PACKET_MULTICAST)로 낙인(!) 찍어버리기 때문이다.

eth.c에서 목적지 ID에 따라 패킷 타입을 결정짓는 부분
ip6_output.cip6_forward()pkt_type에 따라 패킷이 드랍되는 부분

IPv6에서는 하위 계층의 정보를 싹다 버리거나 무시하고 처리할 줄 알았는데... 아오... 이걸 몰라서 일주일 동안 삽질했네... 애꿏은 OpenWrt 방화벽만 찔러보고... 결국 리눅스 커널 IPv6 부분에 printk() 넣어가면서 추적 끝에 해결!! ㅠㅠ

휴... 퇴근하자...ㅠㅠ