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.c의 ip6_forward() 중 pkt_type에 따라 패킷이 드랍되는 부분
IPv6에서는 하위 계층의 정보를 싹다 버리거나 무시하고 처리할 줄 알았는데... 아오... 이걸 몰라서 일주일 동안 삽질했네... 애꿏은 OpenWrt 방화벽만 찔러보고... 결국 리눅스 커널 IPv6 부분에 printk() 넣어가면서 추적 끝에 해결!! ㅠㅠ
휴... 퇴근하자...ㅠㅠ