aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-07-29 10:59:46 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-07-29 10:59:46 +0200
commit8cbe738a47fd8434d4d7626cf8586929c920a498 (patch)
treec04ecad781932466d5437fb58aba9e54142cba20
parentfdc4a6fd491850a3074bf78b9350f50a22468be3 (diff)
errorlessly stop ppp session functions when terminated for any reason
-rw-r--r--src/main.rs15
-rw-r--r--src/state.rs2
2 files changed, 16 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index 032c710..7e4546a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,5 @@
use std::fs::File;
-use std::io::{BufReader, BufWriter, Write};
+use std::io::{BufRead, BufReader, BufWriter, Write};
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
@@ -220,7 +220,11 @@ fn session(interface: &str, remote_mac: MacAddr, session_id: u16) -> Result<()>
let ppp_state = ppp_state.lock().expect("ppp state mutex is poisoned");
match *ppp_state {
Ppp::Synchronize => {}
+ Ppp::Auth => {}
Ppp::Active => {}
+ Ppp::Terminated => {
+ break;
+ }
Ppp::Err => {
return Err(recv_sess
.join()
@@ -232,15 +236,24 @@ fn session(interface: &str, remote_mac: MacAddr, session_id: u16) -> Result<()>
thread::sleep(PPPOE_XMIT_INTERVAL);
}
+
+ Ok(())
}
fn recv_session(ctl: File, _ppp: File, state: Arc<Mutex<Ppp>>) -> Result<()> {
let mut ctl_r = BufReader::with_capacity(1500, ctl);
loop {
+ if !ctl_r.fill_buf().map(|b| !b.is_empty())? {
+ *state.lock().expect("ppp state mutex is poisoned") = Ppp::Terminated;
+ break;
+ }
+
let mut pkt = PppPkt::default();
pkt.deserialize(&mut ctl_r)?;
println!(" <- ppp lcp {:?}", pkt);
}
+
+ Ok(())
}
diff --git a/src/state.rs b/src/state.rs
index 6771f12..7cd8bec 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -17,7 +17,9 @@ impl Default for Pppoe {
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Ppp {
Synchronize,
+ Auth,
Active,
+ Terminated,
Err,
}