在 Rust 中接收 DHCPv6 消息

Receiving DHCPv6 messages in Rust

我正在尝试接收 Rust 中的 dhcp6 消息。这是我现在的代码:

use std::net::UdpSocket;
use std::net::Ipv6Addr;

fn main() -> std::io::Result<()> {
    {
        let socket = UdpSocket::bind("[::]:547")?;
        let mult: Ipv6Addr = "ff02::1:2".parse().unwrap();
        socket.join_multicast_v6(&mult, 0)?;
        let mut buf = [0; 65_535];
        let (amt, src) = socket.recv_from(&mut buf)?;
        let res = parser::header(&buf).unwrap();
        println!("{:?}", res);
    }
    Ok(())
}

它设法接收通过例如发送的单播消息。 echo "Hello"| socat -t 10 - udp6:[::1]:547,在 tcpdump 中显示为 IP6 localhost.57028 > localhost.dhcpv6-server: dhcp6 msgtype-72,但对于 dhcp6 消息(在 tcpdump 中显示为 IP6 fe80::20e:7bff:febb:a38a.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit),没有收到数据。

我是不是漏掉了什么?

问题出在以下行:

socket.join_multicast_v6(&mult, 0)?;

手册指出:

This function specifies a new multicast group for this socket to join. The address must be a valid multicast address, and interface is the index of the interface to join/leave (or 0 to indicate any interface).

不幸的是,我将“任何接口”读作“这将适用于所有接口”,但事实可能并非如此。

例如使用 nix crate 中的 if_nametoindex("eth1") 将接口名称解析为接口索引对我有用。