diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-17 13:43:48 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-17 13:43:48 +0200 |
commit | 409362d5ff93283fd1eb1ecae6414715ca474467 (patch) | |
tree | 33869ce5bd3ae2aa4be4db40f4549c6cdb4d1fff | |
parent | 79c1c2c19000ecf0d2a64923a067ffbfb2e43bee (diff) |
buggy support for multiple interfaces
stops working after a few seconds
-rw-r--r-- | src/error.rs | 3 | ||||
-rw-r--r-- | src/main.rs | 21 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/error.rs b/src/error.rs index 0b560f0..63ad29b 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,4 @@ +use std::array; use std::io; use std::sync::mpsc; @@ -11,6 +12,8 @@ pub enum Error { MpscRecv(#[from] mpsc::RecvError), #[error("mpsc send Vec<u8>")] MpscSendU8Vec, + #[error("array try from slice: {0}")] + ArrayTryFromSlice(#[from] array::TryFromSliceError), #[error("pcap: {0}")] Pcap(#[from] pcap::Error), diff --git a/src/main.rs b/src/main.rs index 4f5f1b3..e7bceb3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,12 +14,14 @@ const PEER_TIMEOUT: Duration = Duration::from_secs(30); fn main() -> Result<()> { let devices = [ - "eth0", "eth0.10", "eth0.20", "eth0.30", "eth0.40", "eth1", "ppp0", "dslite0", "he6in4", + "wlan0", "eth0", "eth0.10", "eth0.20", "eth0.30", "eth0.40", "eth1", "ppp0", "dslite0", + "he6in4", ]; let clt = Arc::new(Mutex::new(None)); let last_connect = Arc::new(Mutex::new(Instant::now())); let rb = Arc::new(Mutex::new(HeapRb::new(2000))); + let hdr = Arc::new(Mutex::new([0; 24])); let sock = UdpSocket::bind("[::]:5555")?; @@ -48,8 +50,15 @@ fn main() -> Result<()> { let clt2 = clt.clone(); let rb2 = rb.clone(); let last_connect2 = last_connect.clone(); + let hdr2 = hdr.clone(); thread::spawn(move || loop { - match recv_ctl(&sock2, clt2.clone(), rb2.clone(), last_connect2.clone()) { + match recv_ctl( + &sock2, + clt2.clone(), + rb2.clone(), + last_connect2.clone(), + hdr2.clone(), + ) { Ok(_) => {} Err(e) => println!("can't recv control packets: {}", e), } @@ -70,6 +79,11 @@ fn main() -> Result<()> { thread::sleep(PEER_TIMEOUT / 2); }); + let mut hdr_buf = [0; 24]; + let _ = r.read(&mut hdr_buf)?; + + *hdr.lock().expect("pcap header mutex is poisoned") = hdr_buf; + loop { let mut buf = [0; 1600]; let n = r.read(&mut buf)?; @@ -97,6 +111,7 @@ fn recv_ctl( clt: Arc<Mutex<Option<SocketAddr>>>, rb: Arc<Mutex<HeapRb<Vec<u8>>>>, last_connect: Arc<Mutex<Instant>>, + hdr: Arc<Mutex<[u8; 24]>>, ) -> Result<()> { let mut buf = [0; 0]; let (_, raddr) = sock.recv_from(&mut buf)?; @@ -106,6 +121,8 @@ fn recv_ctl( .expect("client address mutex is poisoned") .is_none() { + sock.send_to(&*hdr.lock().expect("pcap header mutex is poisoned"), raddr)?; + for pkt in rb .lock() .expect("packet ring buffer mutex is poisoned") |