1use pnet::datalink;
4use std::sync::{Arc, Mutex};
5
6use crate::{
7 error::{RLanLibError, Result},
8 network::NetworkInterface,
9 packet::{Reader, Sender},
10};
11
12pub type Wire = (Arc<Mutex<dyn Reader>>, Arc<Mutex<dyn Sender>>);
14
15pub struct PNetReader {
17 receiver: Box<dyn datalink::DataLinkReceiver>,
18}
19
20impl Reader for PNetReader {
22 fn next_packet(&mut self) -> Result<&[u8]> {
23 self.receiver
24 .next()
25 .map_err(|e| RLanLibError::Wire(e.to_string()))
26 }
27}
28
29unsafe impl Sync for PNetReader {}
30
31pub struct PNetSender {
33 sender: Box<dyn datalink::DataLinkSender>,
34}
35
36impl Sender for PNetSender {
38 fn send(&mut self, packet: &[u8]) -> Result<()> {
39 let opt = self.sender.send_to(packet, None);
40 match opt {
41 Some(res) => Ok(res.map_err(|e| RLanLibError::Wire(e.to_string()))?),
42 None => Err(RLanLibError::Wire("failed to send packet".into())),
43 }
44 }
45}
46
47unsafe impl Sync for PNetSender {}
48
49pub fn default(interface: &NetworkInterface) -> Result<Wire> {
60 let cfg = pnet::datalink::Config::default();
61
62 let channel = match pnet::datalink::channel(&interface.into(), cfg) {
63 Ok(pnet::datalink::Channel::Ethernet(tx, rx)) => Ok((tx, rx)),
64 Ok(_) => Err(RLanLibError::Wire("failed to create packet reader".into())),
65 Err(e) => Err(RLanLibError::Wire(e.to_string())),
66 }?;
67
68 Ok((
69 Arc::new(Mutex::new(PNetReader {
70 receiver: channel.1,
71 })),
72 Arc::new(Mutex::new(PNetSender { sender: channel.0 })),
73 ))
74}
75
76#[cfg(test)]
77#[path = "./wire_tests.rs"]
78mod tests;