aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs
index f25b4fd..c8413f2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -91,7 +91,7 @@ async fn main() -> Result<()> {
let (n, raddr) = result?;
let buf = &buf[..n];
- logged_handle(buf, raddr);
+ logged_handle(&dhcp6, buf, raddr);
logged_tick(&sock, &dhcp6).await;
}
_ = interval.tick() => {
@@ -131,20 +131,44 @@ async fn tick(sock: &UdpSocket, dhcp6: &Dhcp6) -> Result<()> {
send_to_exact(sock, &buf, ALL_DHCPV6_SERVERS).await?;
- println!("[info] solicit");
+ println!("[info] -> solicit");
Ok(())
}
Some(lease) => todo!(),
}
}
-fn logged_handle(buf: &[u8], raddr: SocketAddr) {
- match handle(buf, raddr) {
+fn logged_handle(dhcp6: &Dhcp6, buf: &[u8], raddr: SocketAddr) {
+ match handle(dhcp6, buf, raddr) {
Ok(_) => {}
Err(e) => println!("[warn] handle from {}: {}", raddr, e),
}
}
-fn handle(buf: &[u8], raddr: SocketAddr) -> Result<()> {
- todo!()
+fn handle(dhcp6: &Dhcp6, buf: &[u8], raddr: SocketAddr) -> Result<()> {
+ let msg = Message::decode(&mut Decoder::new(buf))?;
+
+ let client_id = match msg
+ .opts()
+ .get(OptionCode::ClientId)
+ .ok_or(Error::NoClientId)?
+ {
+ DhcpOption::ClientId(client_id) => client_id,
+ _ => unreachable!(),
+ };
+
+ if client_id != dhcp6.duid.as_ref() {
+ println!("[warn] <- [{}] client id mismatch", raddr);
+ return Ok(());
+ }
+
+ match msg.msg_type() {
+ _ => println!(
+ "[warn] <- [{}] unhandled message type {:?}",
+ raddr,
+ msg.msg_type()
+ ),
+ }
+
+ Ok(())
}