네트워크 장치 드라이버를 쓰고 있습니다.
커널 2.6.35.12
장치가 브리지 포트에 연결되어있을 때 장치가 작동하고 있어야합니다.Linux 커널 네트워크 장치 드라이버 및 skb 포인터
브리지에서 인터페이스로 전달 된 ICMPv6 RA 및 NS 메시지 (라우터/인근 소풍)를 차단하려고합니다.
ETH < -> BR0 < -> mydevice 난 다음에 일을하고있는 장치 start_xmit 기능에서
확인입니다
확인하는 것이 그 다음으로는 IPv6 헤더 ICMPv6을하고 그 입력을 확인 :
RS/NS는, I 코드가 작동 RI는 볼 (예 BR0) 장치 내에서 전송__u8 nexthdr = ipv6_hdr(skb)->nexthdr;
if (nexthdr == htons (IPPROTO_ICMPV6))
{
struct icmp6hdr *hdr = icmp6_hdr(skb);
u8 type = hdr->icmp6_type;
if(type == htons (NDISC_NEIGHBOUR_SOLICITATION) || type == htons (NDISC_ROUTER_SOLICITATION))
{
….Do something here…
}
}
ght.
트래픽이 다른 포트에서 브리지를 통해 전달되는 경우 문제가 발생합니다.
icmp6_hdr (skb)가 잘못된 헤더를 반환하는 것을 확인했습니다.
좀 더 디버깅하면 skb-> network_header와 skb-> transport_header가 같은 위치를 가리키고있는 것으로 보입니다.
icmp6_hdr은 왜 틀린지 설명하는 transport_header를 사용하고 있습니다.
모든 헤더와 페이로드 나는 그것이 그것으로 다이빙을하기 전에, 다리 코드 관련이있을 수 있다는 의심
(tcpdump와 함께도 비교) 오프셋 오른쪽에 있음이 보이는 SKB 데이터를 덤프 ,
나는 누군가 비슷한 것을 보거나 다른 아이디어를 갖고있을 것이라고 생각했다.