doesnt help... maybe set_mcast_if need to call on ipv6 too

This commit is contained in:
Igor Katson 2024-09-16 10:21:40 +01:00
parent 028addcf6a
commit 6193cc942b
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5

View file

@ -196,8 +196,8 @@ async fn bind_v6_socket() -> anyhow::Result<UdpSocket> {
} }
} }
for (present, multiaddr) in [ for (present, multiaddr) in [
(has_link_local, SSDP_MCAST_IPV6_LINK_LOCAL),
(has_site_local, SSDP_MCAST_IPV6_SITE_LOCAL), (has_site_local, SSDP_MCAST_IPV6_SITE_LOCAL),
(has_link_local, SSDP_MCAST_IPV6_LINK_LOCAL),
] { ] {
if !present { if !present {
continue; continue;
@ -356,7 +356,10 @@ Content-Length: 0\r\n\r\n"
let futs = interfaces let futs = interfaces
.into_iter() .into_iter()
.flat_map(|ni| ni.addr.into_iter().map(move |a| (ni.index, a))) .flat_map(|ni| {
trace!(name=ni.name, addr=?ni.addr, id=ni.index, "found network interface");
ni.addr.into_iter().map(move |a| (ni.index, a))
})
.filter_map(|(ifidx, addr)| match addr.ip() { .filter_map(|(ifidx, addr)| match addr.ip() {
std::net::IpAddr::V4(a) if !a.is_loopback() && a.is_private() => { std::net::IpAddr::V4(a) if !a.is_loopback() && a.is_private() => {
Some(MulticastOpts { Some(MulticastOpts {
@ -369,15 +372,17 @@ Content-Length: 0\r\n\r\n"
interface_addr: addr.ip(), interface_addr: addr.ip(),
interface_id: ifidx, interface_id: ifidx,
mcast_addr: { mcast_addr: {
let bip = if ipv6_is_link_local(a) { if ipv6_is_link_local(a) {
SSDP_MCAST_IPV6_LINK_LOCAL SocketAddr::V6(SocketAddrV6::new(SSDP_MCAST_IPV6_LINK_LOCAL, SSDP_PORT, 0, ifidx))
} else { } else {
SSDP_MCAST_IPV6_SITE_LOCAL SocketAddr::V6(SocketAddrV6::new(SSDP_MCAST_IPV6_SITE_LOCAL, SSDP_PORT, 0, 0))
}; }
SocketAddr::V6(SocketAddrV6::new(bip, SSDP_PORT, 0, ifidx))
}, },
}), }),
_ => None, _ => {
trace!(oif_id=ifidx, addr=%addr.ip(), "ignoring address");
None
},
}) })
.map(|opts| async move { .map(|opts| async move {
let payload = get_payload(&opts); let payload = get_payload(&opts);
@ -385,7 +390,7 @@ Content-Length: 0\r\n\r\n"
.lock() .lock()
.insert((payload.clone(), opts.interface_id, opts.mcast_addr)) .insert((payload.clone(), opts.interface_id, opts.mcast_addr))
{ {
// don't send duplicates trace!(oif_id=opts.interface_id, addr=%opts.mcast_addr, "not sending duplicate payload");
return; return;
} }
@ -408,13 +413,16 @@ Content-Length: 0\r\n\r\n"
sock_v4 sock_v4
} }
(IpAddr::V6(_), _, Some(sock_v6)) => sock_v6, (IpAddr::V6(_), _, Some(sock_v6)) => sock_v6,
_ => return, _ => {
trace!(addr=%opts.interface_addr, "ignoring address, no socket to send to");
return;
},
}; };
match sock.send_to(payload.as_slice(), opts.mcast_addr).await { match sock.send_to(payload.as_slice(), opts.mcast_addr).await {
Ok(sz) => trace!(payload=?payload, addr=%opts.mcast_addr, size=sz, "sent"), Ok(sz) => trace!(addr=%opts.mcast_addr, oif_id=opts.interface_id, oif_addr=%opts.interface_addr, size=sz, payload=?payload, "sent"),
Err(e) => { Err(e) => {
debug!(payload=?payload, addr=%opts.mcast_addr, "error sending: {e:#}") debug!(addr=%opts.mcast_addr, oif_id=opts.interface_id, oif_addr=%opts.interface_addr, payload=?payload, "error sending: {e:#}")
} }
}; };
}); });