diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 19:04:21 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 19:04:21 +0100 |
commit | 3c9ffda89d9d0da9e22e6307f04dcdf284f34267 (patch) | |
tree | 87dcf38c4f522406780c2d8d5999c3ae823a0f7a /src/main.rs | |
parent | 8a1e6ea25dc16f27de6544585b97d2c6e3f2c4fd (diff) |
bind in a way that allows broadcasts to be received while still being able to tell interfaces apart
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs index 4ef4b23..1ef444c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,14 @@ use dhcp4d::error::{Error, Result}; use dhcp4d::lease::{LeaseFileManager, LeaseFileManagerConfig, LeaseManager}; -use dhcp4d::util::{format_client_id, local_ip}; +use dhcp4d::util::{format_client_id, local_ip, setsockopt}; +use std::ffi::CString; use std::fs::{self, OpenOptions}; use std::io::Write; use std::mem::MaybeUninit; -use std::net::{IpAddr, SocketAddr, SocketAddrV4}; +use std::net::{SocketAddr, SocketAddrV4}; +use std::os::fd::AsRawFd; +use std::str::FromStr; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -60,13 +63,23 @@ fn main() -> Result<()> { fn run<T: LeaseManager>(link: String, lease_mgr: Arc<Mutex<T>>) -> Result<()> { let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; - let addresses = linkaddrs::ipv4_addresses(link)?; - let address = addresses.first().expect("interface has no IPv4 addresses"); - - let address = SocketAddr::new(IpAddr::V4(address.addr()), 67); + let address = SocketAddr::from_str("0.0.0.0:67")?; sock.bind(&address.into())?; sock.set_broadcast(true)?; + sock.set_reuse_port(true)?; + + // Bind socket to interface. + unsafe { + let link_index = libc::if_nametoindex(CString::new(link)?.into_raw()); + + setsockopt( + sock.as_raw_fd(), + libc::IPPROTO_IP, + libc::SO_BINDTODEVICE, + link_index, + )?; + } loop { let mut buf = [MaybeUninit::new(0); 1024]; |