Skip to content

Commit 88512b9

Browse files
committed
vmm: Implement basic reset capability for net device
Signed-off-by: Adam Jensen <adam@acj.sh>
1 parent 4419bb8 commit 88512b9

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

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

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::devices::virtio::net::{
3232
MAX_BUFFER_SIZE, NET_QUEUE_SIZES, NetError, NetQueue, RX_INDEX, TX_INDEX, generated,
3333
};
3434
use crate::devices::virtio::queue::{DescriptorChain, InvalidAvailIdx, Queue};
35-
use crate::devices::virtio::{ActivateError, TYPE_NET};
35+
use crate::devices::virtio::{ActivateError, ResetError, TYPE_NET};
3636
use crate::devices::{DeviceError, report_net_event_fail};
3737
use crate::dumbo::pdu::arp::ETH_IPV4_FRAME_LEN;
3838
use crate::dumbo::pdu::ethernet::{EthernetFrame, PAYLOAD_OFFSET};
@@ -1030,6 +1030,13 @@ impl VirtioDevice for Net {
10301030
fn is_activated(&self) -> bool {
10311031
self.device_state.is_activated()
10321032
}
1033+
1034+
fn reset(&mut self) -> Result<(), ResetError> {
1035+
self.device_state = DeviceState::Inactive;
1036+
self.rx_frame_buf = [0u8; MAX_BUFFER_SIZE];
1037+
self.acked_features = 0;
1038+
Ok(())
1039+
}
10331040
}
10341041

10351042
#[cfg(test)]
@@ -2402,19 +2409,30 @@ pub mod tests {
24022409
let mem = single_region_mem(2 * MAX_BUFFER_SIZE);
24032410
let mut th = TestHelper::get_default(&mem);
24042411
th.activate_net();
2405-
let net = th.net.lock().unwrap();
2412+
let mut net = th.net.lock().unwrap();
24062413

2407-
// Test queues count (TX and RX).
2408-
let queues = net.queues();
2409-
assert_eq!(queues.len(), NET_QUEUE_SIZES.len());
2410-
assert_eq!(queues[RX_INDEX].size, th.rxq.size());
2411-
assert_eq!(queues[TX_INDEX].size, th.txq.size());
2414+
let validate = |net: &Net| {
2415+
// Test queues count (TX and RX).
2416+
let queues = net.queues();
2417+
assert_eq!(queues.len(), NET_QUEUE_SIZES.len());
2418+
assert_eq!(queues[RX_INDEX].size, th.rxq.size());
2419+
assert_eq!(queues[TX_INDEX].size, th.txq.size());
2420+
2421+
// Test corresponding queues events.
2422+
assert_eq!(net.queue_events().len(), NET_QUEUE_SIZES.len());
2423+
2424+
// Test interrupts.
2425+
assert!(!&net.irq_trigger.has_pending_irq(IrqType::Vring));
2426+
};
2427+
2428+
validate(&net);
24122429

2413-
// Test corresponding queues events.
2414-
assert_eq!(net.queue_events().len(), NET_QUEUE_SIZES.len());
2430+
// Test reset.
2431+
assert!(net.device_state.is_activated());
2432+
net.reset().unwrap();
2433+
assert!(!net.device_state.is_activated());
24152434

2416-
// Test interrupts.
2417-
assert!(!&net.irq_trigger.has_pending_irq(IrqType::Vring));
2435+
validate(&net);
24182436
}
24192437

24202438
#[test]

0 commit comments

Comments
 (0)