diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 15 |
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)?; |