diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-13 17:11:29 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-13 17:11:29 +0200 |
commit | d098c0009e9f47e1855100fbb6acd30e324f9d61 (patch) | |
tree | bd53b106d91fd01f8d61cc6504096169779ad322 /src | |
parent | 190868438e5c54e12817709f32114abffa039fd6 (diff) |
include server id in request
Diffstat (limited to 'src')
-rw-r--r-- | src/error.rs | 2 | ||||
-rw-r--r-- | src/main.rs | 27 |
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!(), |