@@ -870,6 +870,26 @@ impl VirtioDevice for Net {
870
870
fn is_activated ( & self ) -> bool {
871
871
self . device_state . is_activated ( )
872
872
}
873
+
874
+ fn reset ( & mut self ) -> Option < ( EventFd , Vec < EventFd > ) > {
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
+
881
+ let queue_evts: Vec < _ > = self
882
+ . queue_evts
883
+ . iter ( )
884
+ . filter_map ( |q| q. try_clone ( ) . ok ( ) )
885
+ . collect ( ) ;
886
+
887
+ if let Ok ( irq_evt) = self . irq_trigger . irq_evt . try_clone ( ) {
888
+ Some ( ( irq_evt, queue_evts) )
889
+ } else {
890
+ None
891
+ }
892
+ }
873
893
}
874
894
875
895
#[ cfg( test) ]
@@ -2015,17 +2035,29 @@ pub mod tests {
2015
2035
th. activate_net ( ) ;
2016
2036
let net = th. net . lock ( ) . unwrap ( ) ;
2017
2037
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( ) ) ;
2038
+ let validate = |net : & Net | {
2039
+ // Test queues count (TX and RX).
2040
+ let queues = net. queues ( ) ;
2041
+ assert_eq ! ( queues. len( ) , NET_QUEUE_SIZES . len( ) ) ;
2042
+ assert_eq ! ( queues[ RX_INDEX ] . size, th. rxq. size( ) ) ;
2043
+ assert_eq ! ( queues[ TX_INDEX ] . size, th. txq. size( ) ) ;
2044
+
2045
+ // Test corresponding queues events.
2046
+ assert_eq ! ( net. queue_events( ) . len( ) , NET_QUEUE_SIZES . len( ) ) ;
2047
+
2048
+ // Test interrupts.
2049
+ assert ! ( !& net. irq_trigger. has_pending_irq( IrqType :: Vring ) ) ;
2050
+ } ;
2051
+
2052
+ validate ( & net) ;
2023
2053
2024
- // Test corresponding queues events.
2025
- assert_eq ! ( net. queue_events( ) . len( ) , NET_QUEUE_SIZES . len( ) ) ;
2054
+ // Test reset.
2055
+ let mut net = net;
2056
+ assert ! ( net. device_state. is_activated( ) ) ;
2057
+ let ( _interrupt_evt, _queue_evts) = net. reset ( ) . unwrap ( ) ;
2058
+ assert ! ( !net. device_state. is_activated( ) ) ;
2026
2059
2027
- // Test interrupts.
2028
- assert ! ( !& net. irq_trigger. has_pending_irq( IrqType :: Vring ) ) ;
2060
+ validate ( & net) ;
2029
2061
}
2030
2062
2031
2063
#[ test]
0 commit comments