@@ -32,7 +32,7 @@ use crate::devices::virtio::net::{
32
32
MAX_BUFFER_SIZE , NET_QUEUE_SIZES , NetError , NetQueue , RX_INDEX , TX_INDEX , generated,
33
33
} ;
34
34
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 } ;
36
36
use crate :: devices:: { DeviceError , report_net_event_fail} ;
37
37
use crate :: dumbo:: pdu:: arp:: ETH_IPV4_FRAME_LEN ;
38
38
use crate :: dumbo:: pdu:: ethernet:: { EthernetFrame , PAYLOAD_OFFSET } ;
@@ -1030,6 +1030,13 @@ impl VirtioDevice for Net {
1030
1030
fn is_activated ( & self ) -> bool {
1031
1031
self . device_state . is_activated ( )
1032
1032
}
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
+ }
1033
1040
}
1034
1041
1035
1042
#[ cfg( test) ]
@@ -2402,19 +2409,30 @@ pub mod tests {
2402
2409
let mem = single_region_mem ( 2 * MAX_BUFFER_SIZE ) ;
2403
2410
let mut th = TestHelper :: get_default ( & mem) ;
2404
2411
th. activate_net ( ) ;
2405
- let net = th. net . lock ( ) . unwrap ( ) ;
2412
+ let mut net = th. net . lock ( ) . unwrap ( ) ;
2406
2413
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) ;
2412
2429
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( ) ) ;
2415
2434
2416
- // Test interrupts.
2417
- assert ! ( !& net. irq_trigger. has_pending_irq( IrqType :: Vring ) ) ;
2435
+ validate ( & net) ;
2418
2436
}
2419
2437
2420
2438
#[ test]
0 commit comments