aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-07-30 09:13:35 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-07-30 09:13:35 +0200
commit8b0ee47e2c771f88df1707241a940deff4e34a98 (patch)
tree8844712e95d5b95eb1c6558e6894cf1eff44a92a
parent50ca45dc839bf07d8ace9a84247b2f6f04e8c208 (diff)
write ds config to file
-rw-r--r--src/main.rs59
1 files changed, 56 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs
index c1ef4e6..f84a9b6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -11,7 +11,7 @@ use ppproperly::{
Ipv6cpData, Ipv6cpOpt, Ipv6cpPkt, LcpData, LcpOpt, LcpPkt, MacAddr, PapData, PapPkt, PppData,
PppPkt, PppoeData, PppoePkt, PppoeVal, Serialize,
};
-use rsdsl_ip_config::{Ipv4Config, Ipv6Config};
+use rsdsl_ip_config::{DsConfig, Ipv4Config, Ipv6Config};
use rsdsl_netlinkd::link;
use rsdsl_pppoe2::{Ncp, Ppp, Pppoe, Result};
use rsdsl_pppoe2_sys::{new_discovery_socket, new_session};
@@ -46,6 +46,28 @@ fn ll(if_id: u64) -> Ipv6Addr {
((0xfe80 << 112) | if_id as u128).into()
}
+fn write_dsconfig(config4: Arc<Mutex<Ipv4Config>>, config6: Arc<Mutex<Ipv6Config>>) -> Result<()> {
+ let config4 = config4.lock().expect("ipv4 config mutex is poisoned");
+ let config6 = config6.lock().expect("ipv6 config mutex is poisoned");
+
+ let dsconfig = DsConfig {
+ v4: match config4.addr {
+ Ipv4Addr::UNSPECIFIED => None,
+ _ => Some(*config4),
+ },
+ v6: match config6.laddr {
+ Ipv6Addr::UNSPECIFIED => None,
+ _ => Some(*config6),
+ },
+ };
+
+ let mut file = File::create(rsdsl_ip_config::LOCATION)?;
+ serde_json::to_writer_pretty(&mut file, &dsconfig)?;
+
+ println!("<-> write ds config to {}", rsdsl_ip_config::LOCATION);
+ Ok(())
+}
+
fn main() -> Result<()> {
println!("wait for up {}", PPPOE_UPLINK);
@@ -291,6 +313,9 @@ fn session(
let config4 = Arc::new(Mutex::new(Ipv4Config::default()));
let config6 = Arc::new(Mutex::new(Ipv6Config::default()));
+ let mut ipv4_active = false;
+ let mut ipv6_active = false;
+
let ctl2 = ctl.try_clone()?;
let ppp_state2 = ppp_state.clone();
let recv_link_handle = thread::spawn(move || match recv_link(ctl2, ppp_state2.clone()) {
@@ -433,7 +458,9 @@ fn session(
eprintln!("{}", e);
Err(e)
}
- })
+ });
+
+ ipv4_active = false;
}
Network::Ipv6 => {
thread::spawn(|| match ipv6cp(ctl2, ncp_states2, config62) {
@@ -442,9 +469,35 @@ fn session(
eprintln!("{}", e);
Err(e)
}
- })
+ });
+
+ ipv6_active = false;
}
};
+ } else if *state == Ncp::Active {
+ match *ncp {
+ Network::Ipv4 if !ipv4_active => {
+ write_dsconfig(config4.clone(), config6.clone())?;
+ ipv4_active = true;
+ }
+ Network::Ipv6 if !ipv6_active => {
+ write_dsconfig(config4.clone(), config6.clone())?;
+ ipv6_active = true;
+ }
+ _ => {}
+ }
+ } else if *state == Ncp::Failed {
+ match *ncp {
+ Network::Ipv4 if ipv4_active => {
+ write_dsconfig(config4.clone(), config6.clone())?;
+ ipv4_active = false;
+ }
+ Network::Ipv6 if ipv6_active => {
+ write_dsconfig(config4.clone(), config6.clone())?;
+ ipv6_active = false;
+ }
+ _ => {}
+ }
}
}
}