@@ -24,7 +24,8 @@ use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDev
24
24
use crate :: devices:: virtio:: gen:: virtio_blk:: VIRTIO_F_VERSION_1 ;
25
25
use crate :: devices:: virtio:: gen:: virtio_net:: {
26
26
virtio_net_hdr_v1, VIRTIO_NET_F_CSUM , VIRTIO_NET_F_GUEST_CSUM , VIRTIO_NET_F_GUEST_TSO4 ,
27
- VIRTIO_NET_F_GUEST_TSO6 , VIRTIO_NET_F_GUEST_UFO , VIRTIO_NET_F_HOST_TSO4 , VIRTIO_NET_F_HOST_UFO , VIRTIO_NET_F_MAC ,
27
+ VIRTIO_NET_F_GUEST_TSO6 , VIRTIO_NET_F_GUEST_UFO , VIRTIO_NET_F_HOST_TSO4 , VIRTIO_NET_F_HOST_UFO ,
28
+ VIRTIO_NET_F_MAC ,
28
29
} ;
29
30
use crate :: devices:: virtio:: gen:: virtio_ring:: VIRTIO_RING_F_EVENT_IDX ;
30
31
use crate :: devices:: virtio:: iovec:: IoVecBuffer ;
@@ -641,12 +642,12 @@ impl Net {
641
642
}
642
643
}
643
644
644
- fn build_tap_supported_features ( desired_flags : Vec < ( u32 , u32 ) > , supported_features : u64 ) -> u32 {
645
- let mut answer : u32 = 0 ;
645
+ fn build_tap_supported_features ( desired_flags : & [ ( u32 , u32 ) ] , supported_features : u64 ) -> u32 {
646
+ let mut answer: u32 = 0 ;
646
647
647
- for i in 0 .. desired_flags. len ( ) {
648
- if ( supported_features & 1 << desired_flags [ i ] . 1 ) != 0 {
649
- answer |= desired_flags [ i ] . 0
648
+ for ( tap_flag , net_flag ) in desired_flags. iter ( ) {
649
+ if ( supported_features & 1 << net_flag ) != 0 {
650
+ answer |= tap_flag ;
650
651
}
651
652
}
652
653
@@ -868,14 +869,15 @@ impl VirtioDevice for Net {
868
869
}
869
870
}
870
871
871
- let desired_flags = vec ! [
872
+ let desired_flags = [
872
873
( gen:: TUN_F_CSUM , VIRTIO_NET_F_CSUM ) ,
873
874
( gen:: TUN_F_UFO , VIRTIO_NET_F_GUEST_UFO ) ,
874
875
( gen:: TUN_F_TSO4 , VIRTIO_NET_F_GUEST_TSO4 ) ,
875
- ( gen :: TUN_F_TSO6 , VIRTIO_NET_F_GUEST_TSO6 )
876
+ ( gen:: TUN_F_TSO6 , VIRTIO_NET_F_GUEST_TSO6 ) ,
876
877
] ;
877
878
878
- let supported_flags = Net :: build_tap_supported_features ( desired_flags, self . acked_features ( ) ) ;
879
+ let supported_flags =
880
+ Net :: build_tap_supported_features ( & desired_flags, self . acked_features ( ) ) ;
879
881
if self . tap . set_offload ( supported_flags) . is_err ( ) {
880
882
return Err ( super :: super :: ActivateError :: TapSetOffload ) ;
881
883
}
@@ -1022,63 +1024,66 @@ pub mod tests {
1022
1024
// We can't get offload features, that were set up to a TAP device by ioctl,
1023
1025
// hence that we have to validate, that we sort out unsupported features correctly
1024
1026
fn test_build_tap_supported_features_all ( ) {
1025
- let desired_features = vec ! [
1027
+ let desired_features = [
1026
1028
( gen:: TUN_F_CSUM , VIRTIO_NET_F_CSUM ) ,
1027
1029
( gen:: TUN_F_UFO , VIRTIO_NET_F_GUEST_UFO ) ,
1028
1030
( gen:: TUN_F_TSO4 , VIRTIO_NET_F_GUEST_TSO4 ) ,
1029
- ( gen :: TUN_F_TSO6 , VIRTIO_NET_F_GUEST_TSO6 )
1031
+ ( gen:: TUN_F_TSO6 , VIRTIO_NET_F_GUEST_TSO6 ) ,
1030
1032
] ;
1031
1033
1032
- let mut tap_features : u32 = 0 ;
1033
- let mut ack_features : u32 = 0 ;
1034
+ let mut tap_features: u32 = 0 ;
1035
+ let mut ack_features: u32 = 0 ;
1034
1036
1035
- for i in 0 .. desired_features. len ( ) {
1037
+ for i in 0 ..desired_features. len ( ) {
1036
1038
tap_features |= desired_features[ i] . 0 ;
1037
1039
ack_features |= 1 << desired_features[ i] . 1 ;
1038
1040
}
1039
1041
1040
- let supported_flags = Net :: build_tap_supported_features ( desired_features, ack_features as u64 ) ;
1042
+ let supported_flags =
1043
+ Net :: build_tap_supported_features ( & desired_features, ack_features as u64 ) ;
1041
1044
1042
1045
assert_eq ! ( supported_flags, tap_features) ;
1043
1046
}
1044
1047
1045
1048
#[ test]
1046
1049
fn test_build_tap_supported_features_ack_les_than_want ( ) {
1047
- let desired_features = vec ! [
1050
+ let desired_features = [
1048
1051
( gen:: TUN_F_CSUM , VIRTIO_NET_F_CSUM ) ,
1049
1052
( gen:: TUN_F_UFO , VIRTIO_NET_F_GUEST_UFO ) ,
1050
1053
( gen:: TUN_F_TSO4 , VIRTIO_NET_F_GUEST_TSO4 ) ,
1051
- ( gen :: TUN_F_TSO6 , VIRTIO_NET_F_GUEST_TSO6 )
1054
+ ( gen:: TUN_F_TSO6 , VIRTIO_NET_F_GUEST_TSO6 ) ,
1052
1055
] ;
1053
1056
1054
- let tap_features : u32 = gen:: TUN_F_CSUM | gen:: TUN_F_UFO ;
1055
- let ack_features : u32 = 1 << VIRTIO_NET_F_CSUM | 1 << VIRTIO_NET_F_GUEST_UFO ;
1057
+ let tap_features: u32 = gen:: TUN_F_CSUM | gen:: TUN_F_UFO ;
1058
+ let ack_features: u32 = 1 << VIRTIO_NET_F_CSUM | 1 << VIRTIO_NET_F_GUEST_UFO ;
1056
1059
1057
- let supported_flags = Net :: build_tap_supported_features ( desired_features, ack_features as u64 ) ;
1060
+ let supported_flags =
1061
+ Net :: build_tap_supported_features ( & desired_features, ack_features as u64 ) ;
1058
1062
1059
1063
assert_eq ! ( supported_flags, tap_features) ;
1060
1064
}
1061
1065
1062
1066
#[ test]
1063
1067
fn test_build_tap_supported_features_ack_more_than_want ( ) {
1064
- let desired_features = vec ! [
1068
+ let desired_features = [
1065
1069
( gen:: TUN_F_CSUM , VIRTIO_NET_F_CSUM ) ,
1066
1070
( gen:: TUN_F_UFO , VIRTIO_NET_F_GUEST_UFO ) ,
1067
1071
( gen:: TUN_F_TSO4 , VIRTIO_NET_F_GUEST_TSO4 ) ,
1068
1072
] ;
1069
1073
1070
- let mut tap_features : u32 = 0 ;
1071
- let mut ack_features : u32 = 0 ;
1074
+ let mut tap_features: u32 = 0 ;
1075
+ let mut ack_features: u32 = 0 ;
1072
1076
1073
- for i in 0 .. desired_features. len ( ) {
1077
+ for i in 0 ..desired_features. len ( ) {
1074
1078
tap_features |= desired_features[ i] . 0 ;
1075
1079
ack_features |= 1 << desired_features[ i] . 1 ;
1076
1080
}
1077
1081
1078
1082
// extra supported feature
1079
1083
ack_features |= 1 << VIRTIO_NET_F_GUEST_TSO6 ;
1080
1084
1081
- let supported_flags = Net :: build_tap_supported_features ( desired_features, ack_features as u64 ) ;
1085
+ let supported_flags =
1086
+ Net :: build_tap_supported_features ( & desired_features, ack_features as u64 ) ;
1082
1087
1083
1088
assert_eq ! ( supported_flags, tap_features) ;
1084
1089
}
0 commit comments