diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-29 19:14:07 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-29 19:14:07 +0200 |
commit | ff091856599e34402cc1f9cfa55684aa6cd09646 (patch) | |
tree | b17aea12e555a673aa55cfd8c4ec110f93a85440 | |
parent | a7a49be43f009bc43ac5685e4ffcc8a25ca8521a (diff) |
read ip(v6)cp from correct fd
-rw-r--r-- | src/main.rs | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/src/main.rs b/src/main.rs index 359f07c..4286b1c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -258,7 +258,7 @@ fn session( ) -> Result<()> { let mut sock_disc_w = BufWriter::with_capacity(1500, sock_disc); - let (_sock_sess, ctl, _ppp) = new_session(interface, remote_mac, session_id)?; + let (_sock_sess, ctl, ppp) = new_session(interface, remote_mac, session_id)?; let mut ctl_w = BufWriter::with_capacity(1500, ctl.try_clone()?); let ppp_state = Arc::new(Mutex::new(Ppp::default())); @@ -277,11 +277,20 @@ fn session( 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()) { + Ok(_) => Ok(()), + Err(e) => { + *ppp_state2.lock().expect("ppp state mutex is poisoned") = Ppp::Err; + Err(e) + } + }); + + let ppp_state2 = ppp_state.clone(); let ncp_states2 = ncp_states.clone(); let config42 = config4.clone(); let config62 = config6.clone(); - let recv_link_handle = thread::spawn(move || { - match recv_link(ctl2, ppp_state2.clone(), ncp_states2, config42, config62) { + let recv_network_handle = thread::spawn(move || { + match recv_network(ppp, ppp_state2.clone(), ncp_states2, config42, config62) { Ok(_) => Ok(()), Err(e) => { *ppp_state2.lock().expect("ppp state mutex is poisoned") = Ppp::Err; @@ -471,10 +480,17 @@ fn session( break; } Ppp::Err => { - return Err(recv_link_handle - .join() - .expect("recv_link panic") - .expect_err("Ppp::Err state entered without an error")); + return Err(if recv_link_handle.is_finished() { + recv_link_handle + .join() + .expect("recv_link panic") + .expect_err("Ppp::Err state entered without an error") + } else { + recv_network_handle + .join() + .expect("recv_network panic") + .expect_err("Ppp::Err state entered without an error") + }); } } } @@ -485,13 +501,7 @@ fn session( Ok(()) } -fn recv_link( - ctl: File, - state: Arc<Mutex<Ppp>>, - ncp_states: Arc<Mutex<HashMap<Network, Ncp>>>, - config4: Arc<Mutex<Ipv4Config>>, - config6: Arc<Mutex<Ipv6Config>>, -) -> Result<()> { +fn recv_link(ctl: File, state: Arc<Mutex<Ppp>>) -> Result<()> { let mut ctl_r = BufReader::with_capacity(1500, ctl.try_clone()?); let mut ctl_w = BufWriter::with_capacity(1500, ctl); @@ -509,16 +519,43 @@ fn recv_link( PppData::Lcp(lcp) => handle_lcp(lcp, &mut ctl_w, state.clone(), &mut magic)?, PppData::Pap(pap) => handle_pap(pap, state.clone())?, PppData::Chap(chap) => handle_chap(chap, &mut ctl_w, state.clone())?, + _ => println!(" <- unsupported ppp pkt {:?}", ppp), + } + } + + Ok(()) +} + +fn recv_network( + ppp: File, + state: Arc<Mutex<Ppp>>, + ncp_states: Arc<Mutex<HashMap<Network, Ncp>>>, + config4: Arc<Mutex<Ipv4Config>>, + config6: Arc<Mutex<Ipv6Config>>, +) -> Result<()> { + let mut ppp_r = BufReader::with_capacity(1500, ppp.try_clone()?); + let mut ppp_w = BufWriter::with_capacity(1500, ppp); + + loop { + if !ppp_r.fill_buf().map(|b| !b.is_empty())? { + *state.lock().expect("ppp state mutex is poisoned") = Ppp::Terminated; + break; + } + + let mut ppp = PppPkt::default(); + ppp.deserialize(&mut ppp_r)?; + + match ppp.data { PppData::Ipcp(ipcp) => handle_ipcp( ipcp, - &mut ctl_w, + &mut ppp_w, state.clone(), ncp_states.clone(), config4.clone(), )?, PppData::Ipv6cp(ipv6cp) => handle_ipv6cp( ipv6cp, - &mut ctl_w, + &mut ppp_w, state.clone(), ncp_states.clone(), config6.clone(), @@ -1203,7 +1240,7 @@ fn handle_ipcp( fn handle_ipv6cp( ipv6cp: Ipv6cpPkt, - ctl_w: &mut BufWriter<File>, + ppp_w: &mut BufWriter<File>, state: Arc<Mutex<Ppp>>, ncp_states: Arc<Mutex<HashMap<Network, Ncp>>>, config: Arc<Mutex<Ipv6Config>>, |