use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
use std::time::Duration;
pub struct SearchOptions {
pub bind_addr: SocketAddr,
pub broadcast_address: SocketAddr,
pub timeout: Option<Duration>,
}
impl Default for SearchOptions {
fn default() -> Self {
Self::new_v4(10_000)
}
}
pub enum Ipv6SearchScope {
LinkLocal,
Subnet,
Admin,
SiteLocal,
}
impl SearchOptions {
pub fn new_v4(timeout_ms: u64) -> Self {
Self {
bind_addr: (IpAddr::V4(Ipv4Addr::UNSPECIFIED), 0).into(),
broadcast_address: "239.255.255.250:1900".parse().unwrap(),
timeout: Some(Duration::from_millis(timeout_ms)),
}
}
pub fn new_v6(scope: Ipv6SearchScope, timeout_ms: u64) -> Self {
Self {
bind_addr: (IpAddr::V6(Ipv6Addr::UNSPECIFIED), 0).into(),
broadcast_address: match scope {
Ipv6SearchScope::LinkLocal => "[FF02::C]:1900",
Ipv6SearchScope::Subnet => "[FF03::C]:1900",
Ipv6SearchScope::Admin => "[FF04::C]:1900",
Ipv6SearchScope::SiteLocal => "[FF05::C]:1900",
}
.parse()
.unwrap(),
timeout: Some(Duration::from_millis(timeout_ms)),
}
}
}