1

可能であれば、レイヤ2で動作することなく、特定のインターフェイスに到着するすべてのマルチキャストIPv6パケットを受信したいと思います。

生のICMPv6パケット用のソケットを開くと、自分のマシン専用のユニキャストパケットの受信は問題なく機能します。ただし、多くのICMPv6パケットはリンクローカルマルチキャストです(例:ネイバーソリシテーション)。要請ノードマルチキャストを含むすべてのマルチキャストトラフィックをリッスンする正しい方法は何ですか?現在、IPV6_ADD_MEMBERSHIPを使用してマルチキャストグループを追加しようとしていますが、これは機能しないようです。これが私のコードです:

/* open RAW socket to receive on */
if ((sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
    perror("socket");
}

/* get device index */
memset(&if_idx, 0, sizeof(struct ifreq));
strncpy(if_idx.ifr_name, DEVNAME, IFNAMSIZ-1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
    perror("SIOCGIFINDEX");
}

/* configure to receive all multicast packets on this interface */
memset(&mreq, 0, sizeof(struct ipv6_mreq));
inet_pton(AF_INET6, "ff02::", &mreq.ipv6mr_multiaddr);
mreq.ipv6mr_interface = if_idx.ifr_ifindex;
if (setsockopt(sockfd, SOL_SOCKET, IPV6_ADD_MEMBERSHIP, &mreq,
            sizeof(struct ipv6_mreq)) < 0) {
    perror("setsockopt");
}

私は何が間違っているのですか?私が欲しいのはどういうわけか可能でなければなりません。ff02::とff02::1:ff00:0をグループとして試しましたが、後者でもsetsockoptが失敗しました。どうしたの?残念ながら、IPv6マルチキャストプログラミングに関するドキュメントはほとんどありません。

4

2 に答える 2

0

SOL_IPV6の代わりに使用してくださいSOL_SOCKET

ff80::1を使用して、サブスクライブとトラフィックの生成をテストしping6 -I eth0 ff08::1ます。

于 2012-09-28T15:39:44.733 に答える
0

結局、これは不可能のようです。現在、Linuxの「調理済み」モードのAF_PACKETソケットタイプ(SOCKET_DGRAM)を使用して、リンク層ヘッダーとBPFを使用して生のIPv6パケットにアクセスし、ICMPv6NDパケットを除外しています。少なくともイーサネットの解析を処理する必要はありません。この方法でヘッダーを作成すると、他のリンク層タイプをより簡単にサポートできる可能性があります。

于 2012-09-29T02:36:38.167 に答える