diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-11-13 17:13:41 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-11-13 17:13:41 +0100 |
commit | c5c79df2d2a6e598f64c9cf75e53e018e66678f1 (patch) | |
tree | daf078d8efb78e7f7a2d0aaad9b6cc39279129df | |
parent | e096a3be05c484935594d84ae10d372d9bfe7738 (diff) |
detect ppp0 device presence rather than ppp ds config
Fixes an issue where old, unestablished sessions counted as up and caused errors on startup.
-rw-r--r-- | src/main.rs | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/src/main.rs b/src/main.rs index 59a0cd9..46f063a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,6 @@ use rsdsl_dhcp6::{Error, Result}; use std::fs::{self, File}; use std::net::{IpAddr, Ipv6Addr, SocketAddr, SocketAddrV6}; -use std::path::Path; use std::str::FromStr; use std::time::SystemTime; @@ -114,20 +113,6 @@ async fn main() -> Result<()> { let mut sigusr1 = signal(SignalKind::user_defined1())?; - println!("[info] wait for pppoe"); - - let ds_config_path = Path::new(rsdsl_ip_config::LOCATION); - let mut already_up = true; - while !ds_config_path.exists() { - already_up = false; - sleep(Duration::from_secs(8)).await; - } - - if already_up { - println!("[info] <> ipv6 link already up"); - dhcp6c.up(); - } - let sock = Socket::new(Domain::IPV6, Type::DGRAM, None)?; sock.set_only_v6(true)?; @@ -142,6 +127,24 @@ async fn main() -> Result<()> { let sock: UdpSocket = sock.try_into()?; + println!("[info] wait for pppoe"); + + let mut already_up = true; + while let Err(e) = sock.bind_device(Some("ppp0".as_bytes())) { + if e.raw_os_error() == Some(19) { + // "No such device" doesn't have an ErrorKind. + already_up = false; + sleep(Duration::from_secs(8)).await; + } else { + return Err(e.into()); + } + } + + if already_up { + println!("[info] <> ipv6 link already up"); + dhcp6c.up(); + } + let mut buf = [0; 1500]; loop { tokio::select! { |