fix: finalize code for DEFCON
remove print statements switch to async based waiting to improve performance a little on Linux disable checksums on inbound packets on Linux with smoltcp
This commit is contained in:
@@ -144,6 +144,8 @@ extern "C" {
|
||||
pub fn pcap_set_promisc(dev: *mut PcapDev, promisc: c_int) -> c_int;
|
||||
pub fn pcap_set_buffer_size(dev: *mut PcapDev, bufsize: c_int) -> c_int;
|
||||
pub fn pcap_set_timeout(dev: *mut PcapDev, ms: c_int) -> c_int;
|
||||
#[cfg(unix)]
|
||||
pub fn pcap_set_immediate_mode(dev: *mut PcapDev, immediate_mode: c_int) -> c_int;
|
||||
pub fn pcap_activate(dev: *mut PcapDev) -> c_int;
|
||||
pub fn pcap_datalink(dev: *mut PcapDev) -> c_int;
|
||||
pub fn pcap_geterr(dev: *mut PcapDev) -> *const c_char;
|
||||
|
||||
+68
-45
@@ -237,6 +237,22 @@ impl Interface {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
pub fn set_immediate_mode(&mut self, immediate_mode: bool) -> error::Result<()> {
|
||||
if self.state != State::Disabled {
|
||||
return Err(error::Error::IncorrectDeviceState(
|
||||
State::Disabled,
|
||||
self.state,
|
||||
));
|
||||
}
|
||||
|
||||
if unsafe { ffi::pcap_set_immediate_mode(self.dev, if immediate_mode { 1 } else { 0 }) } != 0 {
|
||||
Err(unsafe { ffi::pcap_geterr(self.dev) })?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn activate(&mut self) -> error::Result<()> {
|
||||
if self.state != State::Disabled {
|
||||
return Err(error::Error::IncorrectDeviceState(
|
||||
@@ -387,9 +403,9 @@ impl Interface {
|
||||
WaitHandle(fd)
|
||||
}
|
||||
|
||||
pub fn wait_ready(&self, timeout: Option<Duration>) -> error::Result<()> {
|
||||
self.get_wait_ready_callback().wait(timeout)
|
||||
}
|
||||
// pub fn wait_ready(&self, timeout: Option<Duration>) -> error::Result<()> {
|
||||
// self.get_wait_ready_callback().wait(timeout)
|
||||
// }
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
@@ -405,7 +421,7 @@ unsafe impl Sync for WaitHandle {}
|
||||
|
||||
impl WaitHandle {
|
||||
#[cfg(windows)]
|
||||
pub fn wait(&self, timeout: Option<Duration>) -> error::Result<()> {
|
||||
pub async fn wait(&self, timeout: Option<Duration>) -> error::Result<()> {
|
||||
use windows::Win32::System::Threading::WaitForSingleObject;
|
||||
|
||||
let timeout = timeout
|
||||
@@ -422,52 +438,59 @@ impl WaitHandle {
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
pub fn wait(&self, timeout: Option<Duration>) -> error::Result<()> {
|
||||
unsafe {
|
||||
use std::mem::MaybeUninit;
|
||||
pub async fn wait(&self, _timeout: Option<Duration>) -> error::Result<()> {
|
||||
let async_fd = tokio::io::unix::AsyncFd::new(self.0)?;
|
||||
let mut guard = async_fd.ready(tokio::io::Interest::READABLE).await?;
|
||||
guard.clear_ready();
|
||||
drop(guard);
|
||||
async_fd.into_inner();
|
||||
Ok(())
|
||||
|
||||
// unsafe {
|
||||
// use std::mem::MaybeUninit;
|
||||
|
||||
let mut readfds = {
|
||||
let mut readfds = MaybeUninit::<libc::fd_set>::uninit();
|
||||
libc::FD_ZERO(readfds.as_mut_ptr());
|
||||
libc::FD_SET(self.0, readfds.as_mut_ptr());
|
||||
readfds.assume_init()
|
||||
};
|
||||
// let mut readfds = {
|
||||
// let mut readfds = MaybeUninit::<libc::fd_set>::uninit();
|
||||
// libc::FD_ZERO(readfds.as_mut_ptr());
|
||||
// libc::FD_SET(self.0, readfds.as_mut_ptr());
|
||||
// readfds.assume_init()
|
||||
// };
|
||||
|
||||
let mut writefds = {
|
||||
let mut writefds = MaybeUninit::<libc::fd_set>::uninit();
|
||||
libc::FD_ZERO(writefds.as_mut_ptr());
|
||||
libc::FD_SET(self.0, writefds.as_mut_ptr());
|
||||
writefds.assume_init()
|
||||
};
|
||||
// let mut writefds = {
|
||||
// let mut writefds = MaybeUninit::<libc::fd_set>::uninit();
|
||||
// libc::FD_ZERO(writefds.as_mut_ptr());
|
||||
// libc::FD_SET(self.0, writefds.as_mut_ptr());
|
||||
// writefds.assume_init()
|
||||
// };
|
||||
|
||||
let mut exceptfds = {
|
||||
let mut exceptfds = MaybeUninit::<libc::fd_set>::uninit();
|
||||
libc::FD_ZERO(exceptfds.as_mut_ptr());
|
||||
exceptfds.assume_init()
|
||||
};
|
||||
// let mut exceptfds = {
|
||||
// let mut exceptfds = MaybeUninit::<libc::fd_set>::uninit();
|
||||
// libc::FD_ZERO(exceptfds.as_mut_ptr());
|
||||
// exceptfds.assume_init()
|
||||
// };
|
||||
|
||||
let mut c_timeout = libc::timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 50_000,
|
||||
};
|
||||
if let Some(t) = timeout {
|
||||
c_timeout.tv_sec = t.as_secs() as libc::time_t;
|
||||
c_timeout.tv_usec = (t.as_micros() % 1_000_000) as libc::suseconds_t;
|
||||
}
|
||||
// let mut c_timeout = libc::timeval {
|
||||
// tv_sec: 0,
|
||||
// tv_usec: 50_000,
|
||||
// };
|
||||
// if let Some(t) = timeout {
|
||||
// c_timeout.tv_sec = t.as_secs() as libc::time_t;
|
||||
// c_timeout.tv_usec = (t.as_micros() % 1_000_000) as libc::suseconds_t;
|
||||
// }
|
||||
|
||||
let res = libc::select(
|
||||
1,
|
||||
&mut readfds,
|
||||
&mut writefds,
|
||||
&mut exceptfds,
|
||||
&mut c_timeout as *mut _,
|
||||
);
|
||||
// let res = libc::select(
|
||||
// 1,
|
||||
// &mut readfds,
|
||||
// &mut writefds,
|
||||
// &mut exceptfds,
|
||||
// &mut c_timeout as *mut _,
|
||||
// );
|
||||
|
||||
if res == -1 {
|
||||
Err(std::io::Error::last_os_error()).map_err(Into::into)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
// if res == -1 {
|
||||
// Err(std::io::Error::last_os_error()).map_err(Into::into)
|
||||
// } else {
|
||||
// Ok(())
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user