@@ -153,7 +153,7 @@ struct CoordinatorMessageUpdateType {
153
153
/// This includes adding the guest VF device and switching the data path.
154
154
guest_vf_state : bool ,
155
155
/// Update the receive filter for all channels.
156
- filter_state : Option < u32 > ,
156
+ filter_state : bool ,
157
157
}
158
158
159
159
#[ derive( PartialEq ) ]
@@ -599,7 +599,6 @@ struct PrimaryChannelState {
599
599
tx_spread_sent : bool ,
600
600
guest_link_up : bool ,
601
601
pending_link_action : PendingLinkAction ,
602
- packet_filter : u32 ,
603
602
}
604
603
605
604
impl Inspect for PrimaryChannelState {
@@ -791,7 +790,6 @@ impl PrimaryChannelState {
791
790
tx_spread_sent : false ,
792
791
guest_link_up : true ,
793
792
pending_link_action : PendingLinkAction :: Default ,
794
- packet_filter : rndisprot:: NDIS_PACKET_TYPE_NONE ,
795
793
}
796
794
}
797
795
@@ -808,7 +806,6 @@ impl PrimaryChannelState {
808
806
tx_spread_sent : bool ,
809
807
guest_link_down : bool ,
810
808
pending_link_action : Option < bool > ,
811
- packet_filter : Option < u32 > ,
812
809
) -> Result < Self , NetRestoreError > {
813
810
// Restore control messages.
814
811
let control_messages_len = control_messages. iter ( ) . map ( |msg| msg. data . len ( ) ) . sum ( ) ;
@@ -888,9 +885,6 @@ impl PrimaryChannelState {
888
885
PendingLinkAction :: Default
889
886
} ;
890
887
891
- // If saved state does not have a packet filter set, default to directed, multicast, and broadcast.
892
- let packet_filter = packet_filter. unwrap_or ( rndisprot:: NPROTO_PACKET_FILTER ) ;
893
-
894
888
Ok ( Self {
895
889
guest_vf_state,
896
890
is_data_path_switched : None ,
@@ -905,7 +899,6 @@ impl PrimaryChannelState {
905
899
tx_spread_sent,
906
900
guest_link_up : !guest_link_down,
907
901
pending_link_action,
908
- packet_filter,
909
902
} )
910
903
}
911
904
}
@@ -1470,6 +1463,7 @@ impl Nic {
1470
1463
mut control : RestoreControl < ' _ > ,
1471
1464
state : saved_state:: SavedState ,
1472
1465
) -> Result < ( ) , NetRestoreError > {
1466
+ let mut saved_packet_filter = 0u32 ;
1473
1467
if let Some ( state) = state. open {
1474
1468
let open = match & state. primary {
1475
1469
saved_state:: Primary :: Version => vec ! [ true ] ,
@@ -1557,6 +1551,9 @@ impl Nic {
1557
1551
packet_filter,
1558
1552
} = ready;
1559
1553
1554
+ // If saved state does not have a packet filter set, default to directed, multicast, and broadcast.
1555
+ saved_packet_filter = packet_filter. unwrap_or ( rndisprot:: NPROTO_PACKET_FILTER ) ;
1556
+
1560
1557
let version = check_version ( version)
1561
1558
. ok_or ( NetRestoreError :: UnsupportedVersion ( version) ) ?;
1562
1559
@@ -1617,7 +1614,6 @@ impl Nic {
1617
1614
tx_spread_sent,
1618
1615
guest_link_down,
1619
1616
pending_link_action,
1620
- packet_filter,
1621
1617
) ?;
1622
1618
active. primary = Some ( primary) ;
1623
1619
}
@@ -1640,6 +1636,11 @@ impl Nic {
1640
1636
self . insert_worker ( channel_idx as u16 , & request. unwrap ( ) , state, false ) ?;
1641
1637
}
1642
1638
}
1639
+ for worker in self . coordinator . state_mut ( ) . unwrap ( ) . workers . iter_mut ( ) {
1640
+ if let Some ( worker_state) = worker. state_mut ( ) {
1641
+ worker_state. channel . packet_filter = saved_packet_filter;
1642
+ }
1643
+ }
1643
1644
} else {
1644
1645
control
1645
1646
. restore ( & [ false ] )
@@ -1800,6 +1801,11 @@ impl Nic {
1800
1801
PrimaryChannelGuestVfState :: Restoring ( saved_state) => saved_state,
1801
1802
} ;
1802
1803
1804
+ let worker_0_packet_filter = coordinator. workers [ 0 ]
1805
+ . state ( )
1806
+ . unwrap ( )
1807
+ . channel
1808
+ . packet_filter ;
1803
1809
saved_state:: Primary :: Ready ( saved_state:: ReadyPrimary {
1804
1810
version : ready. buffers . version as u32 ,
1805
1811
receive_buffer : ready. buffers . recv_buffer . saved_state ( ) ,
@@ -1829,7 +1835,7 @@ impl Nic {
1829
1835
tx_spread_sent : primary. tx_spread_sent ,
1830
1836
guest_link_down : !primary. guest_link_up ,
1831
1837
pending_link_action,
1832
- packet_filter : Some ( primary . packet_filter ) ,
1838
+ packet_filter : Some ( worker_0_packet_filter ) ,
1833
1839
} )
1834
1840
}
1835
1841
} ;
@@ -2812,7 +2818,10 @@ impl<T: RingMem> NetChannel<T> {
2812
2818
if restart_endpoint {
2813
2819
self . restart = Some ( CoordinatorMessage :: Restart ) ;
2814
2820
}
2815
- self . send_coordinator_update_filter ( packet_filter) ;
2821
+ if let Some ( filter) = packet_filter {
2822
+ self . packet_filter = filter;
2823
+ self . send_coordinator_update_filter ( ) ;
2824
+ }
2816
2825
rndisprot:: STATUS_SUCCESS
2817
2826
}
2818
2827
Err ( err) => {
@@ -2997,7 +3006,7 @@ impl<T: RingMem> NetChannel<T> {
2997
3006
Ok ( ( ) )
2998
3007
}
2999
3008
3000
- fn send_coordinator_update_message ( & mut self , guest_vf : bool , packet_filter : Option < u32 > ) {
3009
+ fn send_coordinator_update_message ( & mut self , guest_vf : bool , packet_filter : bool ) {
3001
3010
if self . restart . is_none ( ) {
3002
3011
self . restart = Some ( CoordinatorMessage :: Update ( CoordinatorMessageUpdateType {
3003
3012
guest_vf_state : guest_vf,
@@ -3010,20 +3019,16 @@ impl<T: RingMem> NetChannel<T> {
3010
3019
} else if let Some ( CoordinatorMessage :: Update ( ref mut update) ) = self . restart {
3011
3020
// Add the new update to the existing message.
3012
3021
update. guest_vf_state |= guest_vf;
3013
- if packet_filter. is_some ( ) {
3014
- update. filter_state = packet_filter;
3015
- }
3022
+ update. filter_state |= packet_filter;
3016
3023
}
3017
3024
}
3018
3025
3019
3026
fn send_coordinator_update_vf ( & mut self ) {
3020
- self . send_coordinator_update_message ( true , None ) ;
3027
+ self . send_coordinator_update_message ( true , false ) ;
3021
3028
}
3022
3029
3023
- fn send_coordinator_update_filter ( & mut self , packet_filter : Option < u32 > ) {
3024
- if packet_filter. is_some ( ) {
3025
- self . send_coordinator_update_message ( false , packet_filter) ;
3026
- }
3030
+ fn send_coordinator_update_filter ( & mut self ) {
3031
+ self . send_coordinator_update_message ( false , true ) ;
3027
3032
}
3028
3033
}
3029
3034
@@ -3349,7 +3354,7 @@ impl Adapter {
3349
3354
let mut packet_filter = None ;
3350
3355
match oid {
3351
3356
rndisprot:: Oid :: OID_GEN_CURRENT_PACKET_FILTER => {
3352
- packet_filter = self . oid_set_packet_filter ( reader, primary ) ?;
3357
+ packet_filter = self . oid_set_packet_filter ( reader) ?;
3353
3358
}
3354
3359
rndisprot:: Oid :: OID_TCP_OFFLOAD_PARAMETERS => {
3355
3360
self . oid_set_offload_parameters ( reader, primary) ?;
@@ -3437,15 +3442,10 @@ impl Adapter {
3437
3442
fn oid_set_packet_filter (
3438
3443
& self ,
3439
3444
reader : impl MemoryRead + Clone ,
3440
- primary : & mut PrimaryChannelState ,
3441
3445
) -> Result < Option < u32 > , OidError > {
3442
3446
let filter: rndisprot:: RndisPacketFilterOidValue = reader. clone ( ) . read_plain ( ) ?;
3443
- if filter != primary. packet_filter {
3444
- primary. packet_filter = filter;
3445
- tracing:: debug!( filter, "set packet filter" ) ;
3446
- return Ok ( Some ( primary. packet_filter ) ) ;
3447
- }
3448
- Ok ( None )
3447
+ tracing:: debug!( filter, "set packet filter" ) ;
3448
+ Ok ( Some ( filter) )
3449
3449
}
3450
3450
3451
3451
fn oid_set_offload_parameters (
@@ -3939,13 +3939,15 @@ impl Coordinator {
3939
3939
sleep_duration = None ;
3940
3940
}
3941
3941
Message :: Internal ( CoordinatorMessage :: Update ( update_type) ) => {
3942
- if let Some ( packet_filter ) = update_type. filter_state {
3942
+ if update_type. filter_state {
3943
3943
self . stop_workers ( ) . await ;
3944
+ let worker_0_packet_filter =
3945
+ self . workers [ 0 ] . state ( ) . unwrap ( ) . channel . packet_filter ;
3944
3946
self . workers . iter_mut ( ) . for_each ( |worker| {
3945
3947
if let Some ( state) = worker. state_mut ( ) {
3946
- state. channel . packet_filter = packet_filter ;
3948
+ state. channel . packet_filter = worker_0_packet_filter ;
3947
3949
tracing:: debug!(
3948
- ? packet_filter,
3950
+ packet_filter = ?worker_0_packet_filter ,
3949
3951
channel_idx = state. channel_idx,
3950
3952
"update packet filter"
3951
3953
) ;
@@ -4398,8 +4400,7 @@ impl Coordinator {
4398
4400
self . num_queues = num_queues;
4399
4401
}
4400
4402
4401
- let primary_packet_filter = state. state . primary . as_ref ( ) . unwrap ( ) . packet_filter ;
4402
-
4403
+ let worker_0_packet_filter = self . workers [ 0 ] . state ( ) . unwrap ( ) . channel . packet_filter ;
4403
4404
// Provide the queue and receive buffer ranges for each worker.
4404
4405
for ( ( worker, queue) , rx_buffer) in self . workers . iter_mut ( ) . zip ( queues) . zip ( rx_buffers) {
4405
4406
worker. task_mut ( ) . queue_state = Some ( QueueState {
@@ -4409,7 +4410,7 @@ impl Coordinator {
4409
4410
} ) ;
4410
4411
// Update the receive packet filter for the subchannel worker.
4411
4412
if let Some ( worker) = worker. state_mut ( ) {
4412
- worker. channel . packet_filter = primary_packet_filter ;
4413
+ worker. channel . packet_filter = worker_0_packet_filter ;
4413
4414
}
4414
4415
}
4415
4416
0 commit comments