aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs
index 18e88e2..082a5f2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -62,24 +62,29 @@ fn run(link: String, subnet_id: u8) -> Result<()> {
let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?;
- let address = SocketAddr::from_str("0.0.0.0:67")?;
- sock.bind(&address.into())?;
-
sock.set_broadcast(true)?;
sock.set_reuse_port(true)?;
+ sock.set_reuse_address(true)?;
// Bind socket to interface.
unsafe {
- let link_index = libc::if_nametoindex(CString::new(link.clone())?.into_raw());
+ let link_index = CString::new(link.clone())?.into_raw();
setsockopt(
sock.as_raw_fd(),
- libc::IPPROTO_IP,
+ libc::SOL_SOCKET,
libc::SO_BINDTODEVICE,
link_index,
+ link.len() as i32,
)?;
+
+ // Prevent memory leak.
+ let _ = CString::from_raw(link_index);
}
+ let address = SocketAddr::from_str("0.0.0.0:67")?;
+ sock.bind(&address.into())?;
+
loop {
let mut buf = [MaybeUninit::new(0); 1024];
let (n, remote) = sock.recv_from(&mut buf)?;