diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-11-25 11:36:58 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-11-25 11:36:58 +0100 |
commit | 97182b9f45479feca4bb3f62280506b266e044c6 (patch) | |
tree | a83b0ab90fcca953be29d4f57493698cc28ee5ca | |
parent | f04dca42e798dc8aaeb9746c7a51aa251c031c72 (diff) |
fix consecutive renew packets being treated like retransmissions0.3.8
-rw-r--r-- | Cargo.lock | 2 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/client.rs | 17 | ||||
-rw-r--r-- | src/main.rs | 15 |
4 files changed, 21 insertions, 15 deletions
@@ -384,7 +384,7 @@ dependencies = [ [[package]] name = "rsdsl_dhcp6" -version = "0.3.7" +version = "0.3.8" dependencies = [ "dhcproto", "rand", @@ -1,6 +1,6 @@ [package] name = "rsdsl_dhcp6" -version = "0.3.7" +version = "0.3.8" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/client.rs b/src/client.rs index 30e616c..47daf6f 100644 --- a/src/client.rs +++ b/src/client.rs @@ -147,19 +147,20 @@ impl Dhcp6c { } } - /// Waits for and returns the next packet to send. - pub async fn to_send(&mut self) -> Packet { + /// Waits for and returns the next packet to send + /// and a boolean indicating whether it is a retransmission. + pub async fn to_send(&mut self) -> (Packet, bool) { loop { tokio::select! { - packet = self.output_rx.recv() => return packet.expect("output channel is closed"), + packet = self.output_rx.recv() => return (packet.expect("output channel is closed"), false), _ = self.restart_timer.tick() => if self.restart_counter > 0 { // TO+ event - if let Some(packet) = self.timeout_positive() { return packet; } + if let Some(packet) = self.timeout_positive() { return (packet, true); } } else { // TO- event - if let Some(packet) = self.timeout_negative() { return packet; } + if let Some(packet) = self.timeout_negative() { return (packet, true); } }, - Some(_) = option_wait_renew(self.lease.as_ref()) => if let Some(packet) = self.t1() { return packet; }, - Some(_) = option_wait_rebind(self.lease.as_ref()) => if let Some(packet) = self.t2() { return packet; }, - Some(_) = option_wait_expire(self.lease.as_ref()) => if let Some(packet) = self.expire() { return packet; }, + Some(_) = option_wait_renew(self.lease.as_ref()) => if let Some(packet) = self.t1() { return (packet, false); }, + Some(_) = option_wait_rebind(self.lease.as_ref()) => if let Some(packet) = self.t2() { return (packet, false); }, + Some(_) = option_wait_expire(self.lease.as_ref()) => if let Some(packet) = self.expire() { return (packet, false); }, } } } diff --git a/src/main.rs b/src/main.rs index 6e5973b..20bf052 100644 --- a/src/main.rs +++ b/src/main.rs @@ -186,7 +186,7 @@ async fn main() -> Result<()> { } }, - packet = dhcp6c.to_send() => send_dhcp6(&mut dhcp6, &sock, packet).await, + packet = dhcp6c.to_send() => send_dhcp6(&mut dhcp6, &sock, packet.0, packet.1).await, result = dhcp6c_rx.changed() => { result?; @@ -407,15 +407,20 @@ fn handle(dhcp6: &mut Dhcp6, dhcp6c: &mut Dhcp6c, buf: &[u8]) -> Result<()> { Ok(()) } -async fn send_dhcp6(dhcp6: &mut Dhcp6, sock: &UdpSocket, packet: Packet) { - match do_send_dhcp6(dhcp6, sock, packet).await { +async fn send_dhcp6(dhcp6: &mut Dhcp6, sock: &UdpSocket, packet: Packet, re_tx: bool) { + match do_send_dhcp6(dhcp6, sock, packet, re_tx).await { Ok(_) => {} Err(e) => println!("[warn] -> send error: {}", e), } } -async fn do_send_dhcp6(dhcp6: &mut Dhcp6, sock: &UdpSocket, packet: Packet) -> Result<()> { - if packet != dhcp6.last_sent { +async fn do_send_dhcp6( + dhcp6: &mut Dhcp6, + sock: &UdpSocket, + packet: Packet, + re_tx: bool, +) -> Result<()> { + if !re_tx { dhcp6.xid = rand::random(); dhcp6.xts = Instant::now(); } |