Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a3f3ad9

Browse files
committed
vmm: Implement basic reset capability for net device
Signed-off-by: Adam Jensen <adam@acj.sh>
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

Lines changed: 31 additions & 10 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /