2013-06-13 2 views
2

네트워크 장치 드라이버를 쓰고 있습니다.
커널 2.6.35.12
장치가 브리지 포트에 연결되어있을 때 장치가 작동하고 있어야합니다.Linux 커널 네트워크 장치 드라이버 및 skb 포인터

브리지에서 인터페이스로 전달 된 ICMPv6 RA 및 NS 메시지 (라우터/인근 소풍)를 차단하려고합니다.
ETH < -> BR0 < -> mydevice 난 다음에 일을하고있는 장치 start_xmit 기능에서

: 이더넷 헤더 후 프로토콜 필드가 IPV6 (0x86dd)

확인입니다

확인하는 것이 그 다음으로는 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 데이터를 덤프 ,

나는 누군가 비슷한 것을 보거나 다른 아이디어를 갖고있을 것이라고 생각했다.

답변

0

일부 문제는 Netfilter가 다음 헤더가 무엇인지 파악하는 것 이상을 수행했다고 가정하는 것입니다. 내 경험에 (매우 오래되지이기는하지만) 당신은 이런 식으로 뭔가를 할 :

struct icmp6hdr *icmp6; 
// Obviously don't do this unless you check to make sure that it's the right protocol 
struct ipv6_hdr *ip6hdr = (struct ipv6_hdr*)skb->network_header; 
// You need to move the headers around 
// Notice the memory address of skb->data and skb->network_header are the same 
// that means that the IP header hasn't been "pulled" 
skb->transport_header = skb_pull(skb, sizeof(struct ipv6_hdr)); 
if(ntohs(ip6hdr->nexthdr) == IPPROTO_ICMPV6) { 
    icmp6 = (struct icmp6hdr*)skb->transport_header; 
    // Doing this is more efficient, since you only are calling the 
    // Network to Host function once 
    __u8 type = ntohs(hdr->icmp6_type); 
    switch(type) { 
    case NDISC_NEIGHBOUR_SOLICITATION: 
    case NDISC_ROUTER_SOLICITATION: 
     // Do your stuff 
     break; 
    } 
} 

는 희망이 도움이되었다. Netfilter 코드를 작성하기 시작 했으므로 정확히 100 %는 아니지만, NF_IP_LOCAL_IN 후크에서 IPv4와 비슷한 것을하려고 할 때 이것을 발견했습니다.

관련 문제