fix: added forgotten error handling
AggregateInterface was lacking some special error handling for certain cases
This commit is contained in:
parent
24dff10b6b
commit
c142af62f1
@ -89,7 +89,7 @@ async fn main() -> anyhow::Result<()> {
|
||||
|
||||
interface.set_filter("inbound and udp port 54248", true, None)?;
|
||||
|
||||
interface.prune(|_, interface| interface.datalink() == pcap_sys::consts::DLT_EN10MB);
|
||||
interface.prune(|_, interface| interface.datalink() != pcap_sys::consts::DLT_EN10MB);
|
||||
|
||||
enum EventType {
|
||||
Packet((String, Result<EthernetPacket, pcap_sys::error::Error>)),
|
||||
|
||||
@ -50,7 +50,7 @@ pub mod consts {
|
||||
}
|
||||
|
||||
use ffi::PcapDevIf;
|
||||
use futures::{ready, Stream, StreamExt};
|
||||
use futures::{ready, StreamExt};
|
||||
use tokio::io::unix::AsyncFd;
|
||||
use tokio_stream::StreamMap;
|
||||
|
||||
@ -492,6 +492,10 @@ where
|
||||
Interface::<DevDisabled>::new(&if_name)
|
||||
.map(|interface| (if_name, interface))
|
||||
.ok()
|
||||
.or_else(|| {
|
||||
println!("{} failed to create device", new_name);
|
||||
None
|
||||
})
|
||||
})
|
||||
.collect::<HashMap<_, _>>()
|
||||
};
|
||||
@ -533,6 +537,10 @@ impl<T: State> AggregateInterface<T> {
|
||||
})
|
||||
.collect::<error::Result<_>>()
|
||||
}
|
||||
|
||||
pub fn get_ifnames(&self) -> Vec<&str> {
|
||||
self.interfaces.keys().map(|n| &**n).collect::<_>()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Disabled> AggregateInterface<T> {
|
||||
@ -562,7 +570,8 @@ impl<T: Disabled> AggregateInterface<T> {
|
||||
|
||||
pub fn activate(self) -> error::Result<AggregateInterface<DevActivated>> {
|
||||
Ok(AggregateInterface {
|
||||
interfaces: self.interfaces
|
||||
interfaces: if self.crash {
|
||||
self.interfaces
|
||||
.into_iter()
|
||||
.map(|(name, interface)| {
|
||||
let new_name = name.clone();
|
||||
@ -572,6 +581,23 @@ impl<T: Disabled> AggregateInterface<T> {
|
||||
.map_err(|e| e.add_ifname(&new_name))
|
||||
})
|
||||
.collect::<error::Result<_>>()?
|
||||
} else {
|
||||
self.interfaces
|
||||
.into_iter()
|
||||
.filter_map(|(name, interface)| {
|
||||
let name_clone = name.clone();
|
||||
interface
|
||||
.activate()
|
||||
.map(|interface| (name, interface))
|
||||
.ok()
|
||||
.or_else(|| {
|
||||
println!("{} failed to activate", name_clone);
|
||||
None
|
||||
})
|
||||
})
|
||||
.collect::<_>()
|
||||
},
|
||||
crash: self.crash
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -612,6 +638,7 @@ impl<T: Activated> AggregateInterface<T> {
|
||||
optimize: bool,
|
||||
mask: Option<u32>
|
||||
) -> error::Result<HashMap<&str, Box<ffi::BpfProgram>>> {
|
||||
if self.crash {
|
||||
self.interfaces
|
||||
.iter_mut()
|
||||
.map(|(name, interface)| {
|
||||
@ -620,6 +647,21 @@ impl<T: Activated> AggregateInterface<T> {
|
||||
.map_err(|e| e.add_ifname(&name))
|
||||
})
|
||||
.collect::<error::Result<_>>()
|
||||
} else {
|
||||
Ok(self.interfaces
|
||||
.iter_mut()
|
||||
.filter_map(|(name, interface)| {
|
||||
let name_clone = name.clone();
|
||||
interface.set_filter(filter, optimize, mask)
|
||||
.map(|bpf| (&**name, bpf))
|
||||
.ok()
|
||||
.or_else(|| {
|
||||
println!("{} failed to set filter", name_clone);
|
||||
None
|
||||
})
|
||||
})
|
||||
.collect::<_>())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn sendpacket(&self, ifname: &str, packet: packets::EthernetPkt) -> error::Result<()> {
|
||||
@ -653,19 +695,19 @@ pub struct AggregateInterfaceStream<T: Activated> {
|
||||
}
|
||||
|
||||
impl<T: Activated> AggregateInterfaceStream<T> {
|
||||
pub fn get_ifnames(&self) -> Vec<&str> {
|
||||
self.streams.keys().map(|n| &**n).collect::<_>()
|
||||
}
|
||||
|
||||
pub fn sendpacket(&mut self, ifname: &str, packet: packets::EthernetPkt) -> error::Result<()> {
|
||||
if let Some(interface) = self.streams
|
||||
.values_mut()
|
||||
.find(|interface| {
|
||||
let dev_name = interface.inner
|
||||
interface.inner
|
||||
.get_ref()
|
||||
.interface
|
||||
.dev_name
|
||||
.clone();
|
||||
|
||||
CString::new(ifname).map(|ifname|
|
||||
ifname == dev_name)
|
||||
.unwrap_or(false)
|
||||
.as_bytes() == ifname.as_bytes()
|
||||
}) {
|
||||
interface.sendpacket(packet)?;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user