Skip to content

Commit a3f3ad9

Browse files
committed
vmm: Implement basic reset capability for net device
Signed-off-by: Adam Jensen <[email protected]>
1 parent 8f182ad commit a3f3ad9

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

src/vmm/src/devices/virtio/net/device.rs

+31-10
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::devices::virtio::net::{
3434
gen, NetError, NetQueue, MAX_BUFFER_SIZE, NET_QUEUE_SIZES, RX_INDEX, TX_INDEX,
3535
};
3636
use crate::devices::virtio::queue::{DescriptorChain, Queue};
37-
use crate::devices::virtio::{ActivateError, TYPE_NET};
37+
use crate::devices::virtio::{ActivateError, ResetError, TYPE_NET};
3838
use crate::devices::{report_net_event_fail, DeviceError};
3939
use crate::dumbo::pdu::arp::ETH_IPV4_FRAME_LEN;
4040
use crate::dumbo::pdu::ethernet::{EthernetFrame, PAYLOAD_OFFSET};
@@ -870,6 +870,15 @@ impl VirtioDevice for Net {
870870
fn is_activated(&self) -> bool {
871871
self.device_state.is_activated()
872872
}
873+
874+
fn reset(&mut self) -> Result<(), ResetError> {
875+
self.device_state = DeviceState::Inactive;
876+
self.rx_bytes_read = 0;
877+
self.rx_deferred_frame = false;
878+
self.rx_frame_buf = [0u8; MAX_BUFFER_SIZE];
879+
self.metrics = NetMetricsPerDevice::alloc(self.id.clone());
880+
Ok(())
881+
}
873882
}
874883

875884
#[cfg(test)]
@@ -2015,17 +2024,29 @@ pub mod tests {
20152024
th.activate_net();
20162025
let net = th.net.lock().unwrap();
20172026

2018-
// Test queues count (TX and RX).
2019-
let queues = net.queues();
2020-
assert_eq!(queues.len(), NET_QUEUE_SIZES.len());
2021-
assert_eq!(queues[RX_INDEX].size, th.rxq.size());
2022-
assert_eq!(queues[TX_INDEX].size, th.txq.size());
2027+
let validate = |net: &Net| {
2028+
// Test queues count (TX and RX).
2029+
let queues = net.queues();
2030+
assert_eq!(queues.len(), NET_QUEUE_SIZES.len());
2031+
assert_eq!(queues[RX_INDEX].size, th.rxq.size());
2032+
assert_eq!(queues[TX_INDEX].size, th.txq.size());
2033+
2034+
// Test corresponding queues events.
2035+
assert_eq!(net.queue_events().len(), NET_QUEUE_SIZES.len());
2036+
2037+
// Test interrupts.
2038+
assert!(!&net.irq_trigger.has_pending_irq(IrqType::Vring));
2039+
};
2040+
2041+
validate(&net);
20232042

2024-
// Test corresponding queues events.
2025-
assert_eq!(net.queue_events().len(), NET_QUEUE_SIZES.len());
2043+
// Test reset.
2044+
let mut net = net;
2045+
assert!(net.device_state.is_activated());
2046+
net.reset().unwrap();
2047+
assert!(!net.device_state.is_activated());
20262048

2027-
// Test interrupts.
2028-
assert!(!&net.irq_trigger.has_pending_irq(IrqType::Vring));
2049+
validate(&net);
20292050
}
20302051

20312052
#[test]

0 commit comments

Comments
 (0)