aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-03-04 12:32:51 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-03-04 12:32:51 +0100
commit4f0b6969ef9e43169183ebfdb5f18acb860dd40a (patch)
tree070760b3439bbaaaeaa4db852f73af6ac4a010db
parent1b8b4c2dcafd8c3b014367c5b3f7d15e80bd9d3a (diff)
reply with NAK if requested address is taken
-rw-r--r--src/main.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index 6878480..cbde931 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -139,8 +139,31 @@ fn handle_request(
};
if !lease_mgr.request(*requested_addr) {
- // NAK
- todo!();
+ let own_addr = own_address(sock);
+
+ let mut resp = Message::default();
+ let opts = resp
+ .set_flags(Flags::default().set_broadcast())
+ .set_opcode(Opcode::BootReply)
+ .set_xid(xid)
+ .set_yiaddr(*requested_addr)
+ .set_siaddr(own_addr)
+ .set_chaddr(msg.chaddr())
+ .opts_mut();
+
+ opts.insert(DhcpOption::MessageType(MessageType::Nak));
+ opts.insert(DhcpOption::ServerIdentifier(own_addr));
+
+ let mut resp_buf = Vec::new();
+ resp.encode(&mut Encoder::new(&mut resp_buf))?;
+
+ let n = sock.send_to(&resp_buf, &remote.into())?;
+ if n != resp_buf.len() {
+ Err(anyhow!("partial response"))
+ } else {
+ println!("not ackknowledging {}", requested_addr);
+ Ok(())
+ }
} else {
let lease_time = lease_mgr.lease_time();
let own_addr = own_address(sock);