1

如果可能的话,我想接收到达某个接口的所有多播 IPv6 数据包,而无需在第 2 层上进行操作。

我为原始 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

毕竟这似乎是不可能的。我现在使用 Linux 的 AF_PACKET 套接字类型和“熟”模式 (SOCKET_DGRAM) 来访问带有链路层标头的原始 IPv6 数据包和一个 BPF 来过滤掉 ICMPv6 ND 数据包 - 至少我不需要处理解析以太网以这种方式标头,我可以更轻松地支持其他链路层类型。

于 2012-09-29T02:36:38.167 回答
0

使用SOL_IPV6而不是SOL_SOCKET.

测试订阅ff80::1和生成流量ping6 -I eth0 ff08::1

于 2012-09-28T15:39:44.733 回答