diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 12:32:51 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 12:32:51 +0100 |
commit | 4f0b6969ef9e43169183ebfdb5f18acb860dd40a (patch) | |
tree | 070760b3439bbaaaeaa4db852f73af6ac4a010db | |
parent | 1b8b4c2dcafd8c3b014367c5b3f7d15e80bd9d3a (diff) |
reply with NAK if requested address is taken
-rw-r--r-- | src/main.rs | 27 |
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); |