2

ネットワークデバイスドライバーを書いています。
カーネル 2.6.35.12
デバイスは、ブリッジ ポートに接続されているときに動作するはずです。

ブリッジからインターフェイスに転送された ICMPv6 RA および NS メッセージ (ルーター/近隣要請) を傍受しようとしています。
eth <–> br0 <–> mydevice

デバイスの start_xmit 関数では、次のことを行っています。

イーサネット ヘッダーの後のプロトコル フィールドが IPV6 (0x86dd) であることを確認します。

ipv6 の次のヘッダーが ICMPv6 であることを確認し、そのタイプを確認します。

__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…
       }
   }

RS/NS がデバイス (br0 など) 内から送信されると、コードが正しく機能していることがわかります。

問題は、トラフィックが他のポートからブリッジを介して転送される場合です。

icmp6_hdr(skb) が間違ったヘッダーを返すことがわかりました。
さらにデバッグすると、skb->network_header と skb->transport_header が同じ場所を指しているようです。

icmp6_hdr は transport_header を使用しており、これが正しくない理由を説明しています。

skb データをダンプすると、すべてのヘッダーとペイロードが正しいオフセットにあるように見えます (これも tcpdump と比較してください)。

橋のコードに関係している可能性があるのではないかと思います。

誰かが似たようなことに出くわしたり、他のアイデアを持っているのではないかと思いましたか?

4

1 に答える 1

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% 確実というわけではありませんが、IPv4 で同様のことをやろうとしていたときに、これを発見しましたNF_IP_LOCAL_IN

于 2013-08-12T14:07:15.390 に答える