aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-03-04 19:04:21 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-03-04 19:04:21 +0100
commit3c9ffda89d9d0da9e22e6307f04dcdf284f34267 (patch)
tree87dcf38c4f522406780c2d8d5999c3ae823a0f7a /src/main.rs
parent8a1e6ea25dc16f27de6544585b97d2c6e3f2c4fd (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.rs25
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];