diff --git a/Cargo.lock b/Cargo.lock index a07d10b2b..3dda9b0f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -631,6 +631,7 @@ dependencies = [ name = "net_util" version = "0.1.0" dependencies = [ + "epoll", "lazy_static", "libc", "log 0.4.8", diff --git a/net_util/Cargo.toml b/net_util/Cargo.toml index 81257aebf..cf6fb92ba 100644 --- a/net_util/Cargo.toml +++ b/net_util/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" authors = ["The Chromium OS Authors"] [dependencies] +epoll = ">=4.0.1" libc = "0.2.72" log = "0.4.8" net_gen = { path = "../net_gen" } diff --git a/net_util/src/lib.rs b/net_util/src/lib.rs index 3859649f2..1f31c1a5e 100644 --- a/net_util/src/lib.rs +++ b/net_util/src/lib.rs @@ -27,9 +27,8 @@ mod queue_pair; mod tap; use std::io::Error as IoError; -use std::mem; -use std::net; -use std::os::unix::io::FromRawFd; +use std::os::unix::io::{FromRawFd, RawFd}; +use std::{io, mem, net}; pub use mac::{MacAddr, MAC_ADDR_LEN}; pub use open_tap::{open_tap, Error as OpenTapError}; @@ -75,6 +74,34 @@ fn vnet_hdr_len() -> usize { std::mem::size_of::() } +pub fn register_listener( + epoll_fd: RawFd, + fd: RawFd, + ev_type: epoll::Events, + data: u64, +) -> std::result::Result<(), io::Error> { + epoll::ctl( + epoll_fd, + epoll::ControlOptions::EPOLL_CTL_ADD, + fd, + epoll::Event::new(ev_type, data), + ) +} + +pub fn unregister_listener( + epoll_fd: RawFd, + fd: RawFd, + ev_type: epoll::Events, + data: u64, +) -> std::result::Result<(), io::Error> { + epoll::ctl( + epoll_fd, + epoll::ControlOptions::EPOLL_CTL_DEL, + fd, + epoll::Event::new(ev_type, data), + ) +} + #[cfg(test)] mod tests { use super::*; diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index 4900fa389..01aa74b6c 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -6,9 +6,9 @@ // found in the THIRD-PARTY file. use super::net_util::{ - build_net_config_space, build_net_config_space_with_mq, register_listener, unregister_listener, - CtrlVirtio, NetCtrlEpollHandler, VirtioNetConfig, KILL_EVENT, NET_EVENTS_COUNT, PAUSE_EVENT, - RX_QUEUE_EVENT, RX_TAP_EVENT, TX_QUEUE_EVENT, + build_net_config_space, build_net_config_space_with_mq, CtrlVirtio, NetCtrlEpollHandler, + VirtioNetConfig, KILL_EVENT, NET_EVENTS_COUNT, PAUSE_EVENT, RX_QUEUE_EVENT, RX_TAP_EVENT, + TX_QUEUE_EVENT, }; use super::Error as DeviceError; use super::{ @@ -18,7 +18,10 @@ use crate::VirtioInterrupt; use anyhow::anyhow; use libc::EAGAIN; use libc::EFD_NONBLOCK; -use net_util::{open_tap, MacAddr, OpenTapError, RxVirtio, Tap, TxVirtio}; +use net_util::{ + open_tap, register_listener, unregister_listener, MacAddr, OpenTapError, RxVirtio, Tap, + TxVirtio, +}; use std::cmp; use std::collections::HashMap; use std::fs::File; diff --git a/virtio-devices/src/net_util.rs b/virtio-devices/src/net_util.rs index 72be75e84..0060a30b9 100644 --- a/virtio-devices/src/net_util.rs +++ b/virtio-devices/src/net_util.rs @@ -4,10 +4,9 @@ use super::Error as DeviceError; use super::{DescriptorChain, DeviceEventT, Queue}; -use net_util::MacAddr; +use net_util::{register_listener, MacAddr}; use serde::ser::{Serialize, SerializeStruct, Serializer}; use std::fs::File; -use std::io; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -180,34 +179,6 @@ impl CtrlVirtio { } } -pub fn register_listener( - epoll_fd: RawFd, - fd: RawFd, - ev_type: epoll::Events, - data: u64, -) -> std::result::Result<(), io::Error> { - epoll::ctl( - epoll_fd, - epoll::ControlOptions::EPOLL_CTL_ADD, - fd, - epoll::Event::new(ev_type, data), - ) -} - -pub fn unregister_listener( - epoll_fd: RawFd, - fd: RawFd, - ev_type: epoll::Events, - data: u64, -) -> std::result::Result<(), io::Error> { - epoll::ctl( - epoll_fd, - epoll::ControlOptions::EPOLL_CTL_DEL, - fd, - epoll::Event::new(ev_type, data), - ) -} - pub struct NetCtrlEpollHandler { pub mem: GuestMemoryAtomic, pub kill_evt: EventFd,