mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
virtio-devices: net: Provide custom functions for fuzzing
Three functions are added: * 'Tap::new_for_fuzzing()' a custom constructor that creates a dummy `Tap` interface directly from `File` backed by Unix domain socket; * 'Tap::mtu()' a custom function that returns hard-coded mtu; * 'Net::wait_for_epoll_threads()'. Two functions are reused with modifications to work with the dummy 'Tap' interface: * 'Net::new_with_tap()' is made public for fuzzing; * 'Net::activate()' is modified to not call into 'Tap::set_offload()' for fuzzing. Signed-off-by: Bo Chen <chen.bo@intel.com>
This commit is contained in:
@@ -305,6 +305,7 @@ impl Tap {
|
|||||||
unsafe { Self::ioctl_with_ref(&sock, net_gen::sockios::SIOCSIFNETMASK as c_ulong, &ifreq) }
|
unsafe { Self::ioctl_with_ref(&sock, net_gen::sockios::SIOCSIFNETMASK as c_ulong, &ifreq) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(fuzzing))]
|
||||||
pub fn mtu(&self) -> Result<i32> {
|
pub fn mtu(&self) -> Result<i32> {
|
||||||
let sock = create_unix_socket().map_err(Error::NetUtil)?;
|
let sock = create_unix_socket().map_err(Error::NetUtil)?;
|
||||||
|
|
||||||
@@ -319,6 +320,12 @@ impl Tap {
|
|||||||
Ok(mtu)
|
Ok(mtu)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(fuzzing)]
|
||||||
|
pub fn mtu(&self) -> Result<i32> {
|
||||||
|
// Consistent with the `virtio_devices::net::MIN_MTU`
|
||||||
|
Ok(1280)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_mtu(&self, mtu: i32) -> Result<()> {
|
pub fn set_mtu(&self, mtu: i32) -> Result<()> {
|
||||||
let sock = create_unix_socket().map_err(Error::NetUtil)?;
|
let sock = create_unix_socket().map_err(Error::NetUtil)?;
|
||||||
|
|
||||||
@@ -383,6 +390,11 @@ impl Tap {
|
|||||||
pub fn get_if_name(&self) -> Vec<u8> {
|
pub fn get_if_name(&self) -> Vec<u8> {
|
||||||
self.if_name.clone()
|
self.if_name.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(fuzzing)]
|
||||||
|
pub fn new_for_fuzzing(tap_file: File, if_name: Vec<u8>) -> Self {
|
||||||
|
Tap { tap_file, if_name }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Read for Tap {
|
impl Read for Tap {
|
||||||
|
|||||||
@@ -435,7 +435,7 @@ impl VersionMapped for NetState {}
|
|||||||
impl Net {
|
impl Net {
|
||||||
/// Create a new virtio network device with the given TAP interface.
|
/// Create a new virtio network device with the given TAP interface.
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn new_with_tap(
|
pub fn new_with_tap(
|
||||||
id: String,
|
id: String,
|
||||||
taps: Vec<Tap>,
|
taps: Vec<Tap>,
|
||||||
guest_mac: Option<MacAddr>,
|
guest_mac: Option<MacAddr>,
|
||||||
@@ -623,6 +623,11 @@ impl Net {
|
|||||||
queue_size: self.common.queue_sizes.clone(),
|
queue_size: self.common.queue_sizes.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(fuzzing)]
|
||||||
|
pub fn wait_for_epoll_threads(&mut self) {
|
||||||
|
self.common.wait_for_epoll_threads();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Net {
|
impl Drop for Net {
|
||||||
@@ -735,6 +740,7 @@ impl VirtioDevice for Net {
|
|||||||
.map_err(ActivateError::CreateRateLimiter)?;
|
.map_err(ActivateError::CreateRateLimiter)?;
|
||||||
|
|
||||||
let tap = taps.remove(0);
|
let tap = taps.remove(0);
|
||||||
|
#[cfg(not(fuzzing))]
|
||||||
tap.set_offload(virtio_features_to_tap_offload(self.common.acked_features))
|
tap.set_offload(virtio_features_to_tap_offload(self.common.acked_features))
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
error!("Error programming tap offload: {:?}", e);
|
error!("Error programming tap offload: {:?}", e);
|
||||||
|
|||||||
Reference in New Issue
Block a user