@@ -32,7 +32,7 @@ use crate::devices::virtio::net::{
3232 MAX_BUFFER_SIZE , NET_QUEUE_SIZES , NetError , NetQueue , RX_INDEX , TX_INDEX , generated,
3333} ;
3434use crate :: devices:: virtio:: queue:: { DescriptorChain , InvalidAvailIdx , Queue } ;
35- use crate :: devices:: virtio:: { ActivateError , TYPE_NET } ;
35+ use crate :: devices:: virtio:: { ActivateError , ResetError , TYPE_NET } ;
3636use crate :: devices:: { DeviceError , report_net_event_fail} ;
3737use crate :: dumbo:: pdu:: arp:: ETH_IPV4_FRAME_LEN ;
3838use 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