diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-10-14 18:21:57 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-10-14 18:21:57 +0200 |
commit | 65b1cc9cd5f00b5b0e15c3486d94a901b74ae101 (patch) | |
tree | 78a60fda4e13bcf899291e4e5a3641f309f13f66 /src | |
parent | ae23cea988f5fdf53632fd5eee39e1b4fddd7bc4 (diff) |
add basic message handler structure
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 36 |
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(()) } |