@@ -870,6 +870,26 @@ impl VirtioDevice for Net {
870870 fn is_activated ( & self ) -> bool {
871871 self . device_state . is_activated ( )
872872 }
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+ }
873893}
874894
875895#[ cfg( test) ]
@@ -2015,17 +2035,29 @@ pub mod tests {
20152035 th. activate_net ( ) ;
20162036 let net = th. net . lock ( ) . unwrap ( ) ;
20172037
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) ;
20232053
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( ) ) ;
20262059
2027- // Test interrupts.
2028- assert ! ( !& net. irq_trigger. has_pending_irq( IrqType :: Vring ) ) ;
2060+ validate ( & net) ;
20292061 }
20302062
20312063 #[ test]
0 commit comments