dhcp working!!!!!!!!!
This commit is contained in:
parent
71502147da
commit
2bfca4ad1d
44
src/dhcp.rs
44
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::<u8, 4096>::new();
|
||||
let mut opts = Vec::<u8, 255>::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,16 +91,6 @@ 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))
|
||||
@ -105,16 +98,20 @@ pub async fn dhcp_server(stack: Stack<'static>) {
|
||||
.unwrap_or(&[]),
|
||||
)
|
||||
.unwrap();
|
||||
opts.push(80).unwrap();
|
||||
&opts
|
||||
}
|
||||
|
||||
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!(),
|
||||
},
|
||||
)
|
||||
.await,
|
||||
)
|
||||
.await;
|
||||
};
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user