From 2bfca4ad1df6f8f0e241b5a1f7390ca4d6b17412 Mon Sep 17 00:00:00 2001 From: Arkitu <85173315+Arkitu@users.noreply.github.com> Date: Sat, 26 Apr 2025 17:41:26 +0200 Subject: [PATCH] dhcp working!!!!!!!!! --- src/dhcp.rs | 60 ++++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/src/dhcp.rs b/src/dhcp.rs index cc935b3..f8f40a2 100644 --- a/src/dhcp.rs +++ b/src/dhcp.rs @@ -22,6 +22,7 @@ pub async fn dhcp_server(stack: Stack<'static>) { let mut buf = [0; 4096]; let mut res_buf = Vec::::new(); let mut opts = Vec::::new(); + let mut current_ip = 10_u8; // add one at each new connection, loop at 250, hope not to get on occupied ip loop { let mut socket = UdpSocket::new( stack, @@ -70,7 +71,9 @@ pub async fn dhcp_server(stack: Stack<'static>) { res_buf.extend_from_slice(&[0; 2]).unwrap(); // secs res_buf.extend_from_slice(&[0x80, 0x00]).unwrap(); // flags res_buf.extend_from_slice(&buf[12..16]).unwrap(); // ciaddr - res_buf.extend_from_slice(&[192, 254, 0, 12]).unwrap(); // yiaddr + res_buf + .extend_from_slice(&[192, 254, 0, current_ip]) + .unwrap(); // yiaddr res_buf.extend_from_slice(&[0; 4]).unwrap(); // siaddr res_buf.extend_from_slice(&buf[24..28]).unwrap(); // giaddr res_buf.extend_from_slice(&buf[28..44]).unwrap(); // chaddr @@ -88,33 +91,27 @@ pub async fn dhcp_server(stack: Stack<'static>) { ]) .unwrap(); // opt message type - unwrap( - write_dhcp_opts( - &mut res_buf, - match (msg_type, rapid_commit) { - (DhcpMsgType::DISCOVER, false) => { - unwrap(v4_options!(msg; ParameterRequestList)) - .await - .unwrap_or(&[]) - } - (DhcpMsgType::DISCOVER, true) => { - opts.clear(); - opts.extend_from_slice( - unwrap(v4_options!(msg; ParameterRequestList)) - .await - .unwrap_or(&[]), - ) - .unwrap(); - opts.push(80).unwrap(); - &opts - } - (DhcpMsgType::REQUEST, false) => &[1, 3, 51, 6, 54], - _ => unreachable!(), - }, - ) - .await, + opts.clear(); + opts.extend_from_slice( + unwrap(v4_options!(msg; ParameterRequestList)) + .await + .unwrap_or(&[]), ) - .await; + .unwrap(); + + let default_opts: &[u8] = match (msg_type, rapid_commit) { + (DhcpMsgType::DISCOVER, false) => &[54], + (DhcpMsgType::DISCOVER, true) => &[54, 80], + (DhcpMsgType::REQUEST, false) => &[1, 3, 51, 6, 54], + _ => unreachable!(), + }; + for o in default_opts { + if !opts.contains(o) { + opts.push(*o).unwrap(); + } + } + + unwrap(write_dhcp_opts(&mut res_buf, &opts).await).await; res_buf.push(255).unwrap(); // end option for o in unwrap(unwrap(dhcpv4::Message::new(&res_buf)).await.options()).await { @@ -144,8 +141,15 @@ pub async fn dhcp_server(stack: Stack<'static>) { .await, ) .await; - info!("offer/ack sent"); + info!("offer/ack sent for ip {}", current_ip); Timer::after_secs(0).await; + + if msg_type == DhcpMsgType::REQUEST || rapid_commit { + current_ip += 1; + if current_ip > 250 { + current_ip = 10; + } + } } _ => {} }