@@ -382,7 +382,7 @@ struct NetChannel<T: RingMem> {
382
382
pending_send_size : usize ,
383
383
restart : Option < CoordinatorMessage > ,
384
384
can_use_ring_size_opt : bool ,
385
- stop_rx : bool ,
385
+ packet_filter : u32 ,
386
386
}
387
387
388
388
/// Buffers used during packet processing.
@@ -591,7 +591,7 @@ struct PrimaryChannelState {
591
591
tx_spread_sent : bool ,
592
592
guest_link_up : bool ,
593
593
pending_link_action : PendingLinkAction ,
594
- stop_rx : bool ,
594
+ packet_filter : u32 ,
595
595
}
596
596
597
597
impl Inspect for PrimaryChannelState {
@@ -783,7 +783,7 @@ impl PrimaryChannelState {
783
783
tx_spread_sent : false ,
784
784
guest_link_up : true ,
785
785
pending_link_action : PendingLinkAction :: Default ,
786
- stop_rx : false ,
786
+ packet_filter : rndisprot :: NPROTO_PACKET_FILTER ,
787
787
}
788
788
}
789
789
@@ -800,7 +800,7 @@ impl PrimaryChannelState {
800
800
tx_spread_sent : bool ,
801
801
guest_link_down : bool ,
802
802
pending_link_action : Option < bool > ,
803
- stop_rx : bool ,
803
+ packet_filter : u32 ,
804
804
) -> Result < Self , NetRestoreError > {
805
805
// Restore control messages.
806
806
let control_messages_len = control_messages. iter ( ) . map ( |msg| msg. data . len ( ) ) . sum ( ) ;
@@ -894,7 +894,7 @@ impl PrimaryChannelState {
894
894
tx_spread_sent,
895
895
guest_link_up : !guest_link_down,
896
896
pending_link_action,
897
- stop_rx ,
897
+ packet_filter ,
898
898
} )
899
899
}
900
900
}
@@ -1198,7 +1198,8 @@ impl VmbusDevice for Nic {
1198
1198
. adapter
1199
1199
. num_sub_channels_opened
1200
1200
. fetch_add ( 1 , Ordering :: SeqCst ) ;
1201
- let r = self . insert_worker ( channel_idx, open_request, state, true , false ) ;
1201
+ let packet_filter = rndisprot:: NDIS_PACKET_TYPE_NONE ; // No traffic until guest sets filter.
1202
+ let r = self . insert_worker ( channel_idx, open_request, state, true , packet_filter) ;
1202
1203
if channel_idx != 0
1203
1204
&& num_opened + 1 == self . coordinator . state_mut ( ) . unwrap ( ) . num_queues as usize
1204
1205
{
@@ -1338,7 +1339,7 @@ impl Nic {
1338
1339
open_request : & OpenRequest ,
1339
1340
state : WorkerState ,
1340
1341
start : bool ,
1341
- stop_rx : bool ,
1342
+ packet_filter : u32 ,
1342
1343
) -> Result < ( ) , OpenError > {
1343
1344
let coordinator = self . coordinator . state_mut ( ) . unwrap ( ) ;
1344
1345
@@ -1370,7 +1371,7 @@ impl Nic {
1370
1371
pending_send_size : 0 ,
1371
1372
restart : None ,
1372
1373
can_use_ring_size_opt,
1373
- stop_rx ,
1374
+ packet_filter ,
1374
1375
} ,
1375
1376
state,
1376
1377
coordinator_send : self . coordinator_send . clone ( ) . unwrap ( ) ,
@@ -1460,7 +1461,7 @@ impl Nic {
1460
1461
mut control : RestoreControl < ' _ > ,
1461
1462
state : saved_state:: SavedState ,
1462
1463
) -> Result < ( ) , NetRestoreError > {
1463
- let mut channel_stop_rx = false ;
1464
+ let mut channel_packet_filter = 0u32 ; // set to primary packet filter
1464
1465
if let Some ( state) = state. open {
1465
1466
let open = match & state. primary {
1466
1467
saved_state:: Primary :: Version => vec ! [ true ] ,
@@ -1545,7 +1546,7 @@ impl Nic {
1545
1546
tx_spread_sent,
1546
1547
guest_link_down,
1547
1548
pending_link_action,
1548
- stop_rx ,
1549
+ packet_filter ,
1549
1550
} = ready;
1550
1551
1551
1552
let version = check_version ( version)
@@ -1608,9 +1609,9 @@ impl Nic {
1608
1609
tx_spread_sent,
1609
1610
guest_link_down,
1610
1611
pending_link_action,
1611
- stop_rx ,
1612
+ packet_filter ,
1612
1613
) ?;
1613
- channel_stop_rx = primary. stop_rx ;
1614
+ channel_packet_filter = primary. packet_filter ;
1614
1615
active. primary = Some ( primary) ;
1615
1616
}
1616
1617
@@ -1634,7 +1635,7 @@ impl Nic {
1634
1635
& request. unwrap ( ) ,
1635
1636
state,
1636
1637
false ,
1637
- channel_stop_rx ,
1638
+ channel_packet_filter ,
1638
1639
) ?;
1639
1640
}
1640
1641
}
@@ -1827,7 +1828,7 @@ impl Nic {
1827
1828
tx_spread_sent : primary. tx_spread_sent ,
1828
1829
guest_link_down : !primary. guest_link_up ,
1829
1830
pending_link_action,
1830
- stop_rx : primary. stop_rx ,
1831
+ packet_filter : primary. packet_filter ,
1831
1832
} )
1832
1833
}
1833
1834
} ;
@@ -2802,13 +2803,13 @@ impl<T: RingMem> NetChannel<T> {
2802
2803
tracing:: trace!( ?request, "handling control message MESSAGE_TYPE_SET_MSG" ) ;
2803
2804
2804
2805
let status = match self . adapter . handle_oid_set ( primary, request. oid , reader) {
2805
- Ok ( ( restart_endpoint, stop_rx ) ) => {
2806
+ Ok ( ( restart_endpoint, packet_filter ) ) => {
2806
2807
// Restart the endpoint if the OID changed some critical
2807
2808
// endpoint property.
2808
2809
if restart_endpoint {
2809
2810
self . restart = Some ( CoordinatorMessage :: Restart ) ;
2810
2811
}
2811
- self . stop_rx = stop_rx ;
2812
+ self . packet_filter = packet_filter ;
2812
2813
rndisprot:: STATUS_SUCCESS
2813
2814
}
2814
2815
Err ( err) => {
@@ -3025,16 +3026,12 @@ enum OidError {
3025
3026
BadVersion ,
3026
3027
#[ error( "feature {0} not supported" ) ]
3027
3028
NotSupported ( & ' static str ) ,
3028
- #[ error( "packet filter {0} not supported" ) ]
3029
- UnsupportedFilter ( u32 ) ,
3030
3029
}
3031
3030
3032
3031
impl OidError {
3033
3032
fn as_status ( & self ) -> u32 {
3034
3033
match self {
3035
- OidError :: UnknownOid | OidError :: NotSupported ( _) | OidError :: UnsupportedFilter ( _) => {
3036
- rndisprot:: STATUS_NOT_SUPPORTED
3037
- }
3034
+ OidError :: UnknownOid | OidError :: NotSupported ( _) => rndisprot:: STATUS_NOT_SUPPORTED ,
3038
3035
OidError :: BadVersion => rndisprot:: STATUS_BAD_VERSION ,
3039
3036
OidError :: InvalidInput ( _) => rndisprot:: STATUS_INVALID_DATA ,
3040
3037
OidError :: Access ( _) => rndisprot:: STATUS_FAILURE ,
@@ -3313,14 +3310,14 @@ impl Adapter {
3313
3310
primary : & mut PrimaryChannelState ,
3314
3311
oid : rndisprot:: Oid ,
3315
3312
reader : impl MemoryRead + Clone ,
3316
- ) -> Result < ( bool , bool ) , OidError > {
3313
+ ) -> Result < ( bool , u32 ) , OidError > {
3317
3314
tracing:: debug!( ?oid, "oid set" ) ;
3318
3315
3319
3316
let mut restart_endpoint = false ;
3320
- let mut stop_rx = false ;
3317
+ let mut packet_filter = 0u32 ;
3321
3318
match oid {
3322
3319
rndisprot:: Oid :: OID_GEN_CURRENT_PACKET_FILTER => {
3323
- stop_rx = self . oid_set_packet_filter ( reader, primary) ?;
3320
+ packet_filter = self . oid_set_packet_filter ( reader, primary) ?;
3324
3321
}
3325
3322
rndisprot:: Oid :: OID_TCP_OFFLOAD_PARAMETERS => {
3326
3323
self . oid_set_offload_parameters ( reader, primary) ?;
@@ -3347,7 +3344,7 @@ impl Adapter {
3347
3344
return Err ( OidError :: UnknownOid ) ;
3348
3345
}
3349
3346
}
3350
- Ok ( ( restart_endpoint, stop_rx ) )
3347
+ Ok ( ( restart_endpoint, packet_filter ) )
3351
3348
}
3352
3349
3353
3350
fn oid_set_rss_parameters (
@@ -3409,15 +3406,11 @@ impl Adapter {
3409
3406
& self ,
3410
3407
reader : impl MemoryRead + Clone ,
3411
3408
primary : & mut PrimaryChannelState ,
3412
- ) -> Result < bool , OidError > {
3409
+ ) -> Result < u32 , OidError > {
3413
3410
let filter: rndisprot:: RndisPacketFilterOidValue = reader. clone ( ) . read_plain ( ) ?;
3414
- if filter != 0 {
3415
- // TODO:
3416
- // Maybe dont return error since previously we were not?
3417
- return Err ( OidError :: UnsupportedFilter ( filter) ) ;
3418
- }
3419
- primary. stop_rx = true ;
3420
- Ok ( primary. stop_rx )
3411
+ primary. packet_filter = filter;
3412
+ tracing:: debug!( filter, "set packet filter" ) ;
3413
+ Ok ( primary. packet_filter )
3421
3414
}
3422
3415
3423
3416
fn oid_set_offload_parameters (
@@ -4968,7 +4961,11 @@ impl<T: 'static + RingMem> NetChannel<T> {
4968
4961
data : & mut ProcessingData ,
4969
4962
epqueue : & mut dyn net_backend:: Queue ,
4970
4963
) -> Result < bool , WorkerError > {
4971
- if self . stop_rx {
4964
+ if self . packet_filter == rndisprot:: NDIS_PACKET_TYPE_NONE {
4965
+ tracing:: debug!(
4966
+ packet_filter = self . packet_filter,
4967
+ "rx packet not processed"
4968
+ ) ;
4972
4969
return Ok ( false ) ;
4973
4970
}
4974
4971
let n = epqueue
0 commit comments