net: Make TAP registration functions immutable

By making the registration functions immutable, this patch prevents from
self borrowing issues with the RwLock on self.mem.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf 2019-08-21 08:54:12 -07:00 committed by Rob Bradford
parent 0b8856d148
commit dfb18ef14a

View File

@ -144,6 +144,7 @@ impl NetEpollHandler {
// Queue has no available descriptors // Queue has no available descriptors
if self.rx_tap_listening { if self.rx_tap_listening {
self.unregister_tap_rx_listener().unwrap(); self.unregister_tap_rx_listener().unwrap();
self.rx_tap_listening = false;
} }
return false; return false;
} }
@ -302,25 +303,23 @@ impl NetEpollHandler {
self.tap.read(&mut self.rx.frame_buf) self.tap.read(&mut self.rx.frame_buf)
} }
fn register_tap_rx_listener(&mut self) -> std::result::Result<(), std::io::Error> { fn register_tap_rx_listener(&self) -> std::result::Result<(), std::io::Error> {
epoll::ctl( epoll::ctl(
self.epoll_fd, self.epoll_fd,
epoll::ControlOptions::EPOLL_CTL_ADD, epoll::ControlOptions::EPOLL_CTL_ADD,
self.tap.as_raw_fd(), self.tap.as_raw_fd(),
epoll::Event::new(epoll::Events::EPOLLIN, u64::from(RX_TAP_EVENT)), epoll::Event::new(epoll::Events::EPOLLIN, u64::from(RX_TAP_EVENT)),
)?; )?;
self.rx_tap_listening = true;
Ok(()) Ok(())
} }
fn unregister_tap_rx_listener(&mut self) -> std::result::Result<(), std::io::Error> { fn unregister_tap_rx_listener(&self) -> std::result::Result<(), std::io::Error> {
epoll::ctl( epoll::ctl(
self.epoll_fd, self.epoll_fd,
epoll::ControlOptions::EPOLL_CTL_DEL, epoll::ControlOptions::EPOLL_CTL_DEL,
self.tap.as_raw_fd(), self.tap.as_raw_fd(),
epoll::Event::new(epoll::Events::EPOLLIN, u64::from(RX_TAP_EVENT)), epoll::Event::new(epoll::Events::EPOLLIN, u64::from(RX_TAP_EVENT)),
)?; )?;
self.rx_tap_listening = false;
Ok(()) Ok(())
} }
@ -344,6 +343,7 @@ impl NetEpollHandler {
.map_err(DeviceError::EpollCtl)?; .map_err(DeviceError::EpollCtl)?;
self.register_tap_rx_listener() self.register_tap_rx_listener()
.map_err(DeviceError::EpollCtl)?; .map_err(DeviceError::EpollCtl)?;
self.rx_tap_listening = true;
epoll::ctl( epoll::ctl(
self.epoll_fd, self.epoll_fd,
epoll::ControlOptions::EPOLL_CTL_ADD, epoll::ControlOptions::EPOLL_CTL_ADD,
@ -387,6 +387,7 @@ impl NetEpollHandler {
self.resume_rx().unwrap(); self.resume_rx().unwrap();
if !self.rx_tap_listening { if !self.rx_tap_listening {
self.register_tap_rx_listener().unwrap(); self.register_tap_rx_listener().unwrap();
self.rx_tap_listening = true;
} }
} }
TX_QUEUE_EVENT => { TX_QUEUE_EVENT => {