aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-08-13 17:11:29 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-08-13 17:11:29 +0200
commitd098c0009e9f47e1855100fbb6acd30e324f9d61 (patch)
treebd53b106d91fd01f8d61cc6504096169779ad322 /src
parent190868438e5c54e12817709f32114abffa039fd6 (diff)
include server id in request
Diffstat (limited to 'src')
-rw-r--r--src/error.rs2
-rw-r--r--src/main.rs27
2 files changed, 25 insertions, 4 deletions
diff --git a/src/error.rs b/src/error.rs
index 52b361d..e013a67 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -10,6 +10,8 @@ pub enum Error {
NoIAPDStatus,
#[error("no ia_prefix")]
NoIAPrefix,
+ #[error("no server duid")]
+ NoServerId,
#[error("incomplete transmission")]
PartialSend,
diff --git a/src/main.rs b/src/main.rs
index c66f93d..f1bbb2a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -23,7 +23,7 @@ const MAX_ATTEMPTS: usize = 4;
#[derive(Clone, Debug, Eq, PartialEq)]
enum State {
Solicit(Vec<u8>),
- Request(Vec<u8>, [u8; 3], SocketAddrV6, IAPD, usize),
+ Request(Vec<u8>, Vec<u8>, [u8; 3], SocketAddrV6, IAPD, usize),
Active(Vec<u8>, SocketAddrV6),
Renew(Vec<u8>, SocketAddrV6),
}
@@ -120,6 +120,11 @@ fn handle_response(
MessageType::Advertise => {
let opts = msg.opts();
+ let server_id = match opts.get(OptionCode::ServerId).ok_or(Error::NoServerId)? {
+ DhcpOption::ServerId(server_id) => server_id,
+ _ => unreachable!(),
+ };
+
let aftr = opts.get(OptionCode::AftrName).map(|v| match v {
DhcpOption::Unknown(unk) => {
Name::from_bytes(unk.data()).expect("invalid aftr name format")
@@ -171,7 +176,14 @@ fn handle_response(
remote, MAX_ATTEMPTS, ia_pd.id
);
- *state = State::Request(client_id.clone(), msg.xid(), remote, ia_pd.clone(), 1);
+ *state = State::Request(
+ client_id.clone(),
+ server_id.clone(),
+ msg.xid(),
+ remote,
+ ia_pd.clone(),
+ 1,
+ );
}
_ => println!(" <- [{}] unexpected advertise from", remote),
}
@@ -221,7 +233,7 @@ fn tick(sock: &Socket, state: Arc<Mutex<State>>) -> Result<()> {
println!(" -> solicit pd 1 aftr");
Ok(())
}
- State::Request(ref client_id, xid, dst, ref ia_pd, n) => {
+ State::Request(ref client_id, ref server_id, xid, dst, ref ia_pd, n) => {
if n >= MAX_ATTEMPTS {
*state = State::Solicit(client_id.clone());
@@ -245,7 +257,14 @@ fn tick(sock: &Socket, state: Arc<Mutex<State>>) -> Result<()> {
println!(" -> request {}/{}, pd {} aftr", n, MAX_ATTEMPTS, ia_pd.id);
- *state = State::Request(client_id.clone(), xid, dst, ia_pd.clone(), n + 1);
+ *state = State::Request(
+ client_id.clone(),
+ server_id.clone(),
+ xid,
+ dst,
+ ia_pd.clone(),
+ n + 1,
+ );
Ok(())
}
_ => todo!(),