diff --git a/vhost_user_net/src/lib.rs b/vhost_user_net/src/lib.rs index 095f2b754..4339b95f9 100644 --- a/vhost_user_net/src/lib.rs +++ b/vhost_user_net/src/lib.rs @@ -178,13 +178,13 @@ impl VhostUserBackendMut for VhostUserNetBackend { | (1 << VIRTIO_NET_F_HOST_TSO4) | (1 << VIRTIO_NET_F_HOST_TSO6) | (1 << VIRTIO_NET_F_HOST_ECN) - | 1 << VIRTIO_NET_F_HOST_UFO - | 1 << VIRTIO_NET_F_CTRL_VQ - | 1 << VIRTIO_NET_F_MQ - | 1 << VIRTIO_NET_F_MAC - | 1 << VIRTIO_NET_F_MTU - | 1 << VIRTIO_F_NOTIFY_ON_EMPTY - | 1 << VIRTIO_F_VERSION_1 + | (1 << VIRTIO_NET_F_HOST_UFO) + | (1 << VIRTIO_NET_F_CTRL_VQ) + | (1 << VIRTIO_NET_F_MQ) + | (1 << VIRTIO_NET_F_MAC) + | (1 << VIRTIO_NET_F_MTU) + | (1 << VIRTIO_F_NOTIFY_ON_EMPTY) + | (1 << VIRTIO_F_VERSION_1) | VhostUserVirtioFeatures::PROTOCOL_FEATURES.bits() } diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index b6bdeb078..64dbca21f 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -624,7 +624,7 @@ impl Console { true, ) } else { - let mut avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_CONSOLE_F_SIZE; + let mut avail_features = (1u64 << VIRTIO_F_VERSION_1) | (1u64 << VIRTIO_CONSOLE_F_SIZE); if iommu { avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; } diff --git a/virtio-devices/src/device.rs b/virtio-devices/src/device.rs index 77501187a..06b245e27 100644 --- a/virtio-devices/src/device.rs +++ b/virtio-devices/src/device.rs @@ -210,7 +210,7 @@ pub struct VirtioCommon { impl VirtioCommon { pub fn feature_acked(&self, feature: u64) -> bool { - self.acked_features & 1 << feature == 1 << feature + self.acked_features & (1 << feature) == 1 << feature } pub fn ack_features(&mut self, value: u64) { diff --git a/virtio-devices/src/iommu.rs b/virtio-devices/src/iommu.rs index b572061ec..778f46845 100644 --- a/virtio-devices/src/iommu.rs +++ b/virtio-devices/src/iommu.rs @@ -940,10 +940,10 @@ impl Iommu { true, ) } else { - let avail_features = 1u64 << VIRTIO_F_VERSION_1 - | 1u64 << VIRTIO_IOMMU_F_MAP_UNMAP - | 1u64 << VIRTIO_IOMMU_F_PROBE - | 1u64 << VIRTIO_IOMMU_F_BYPASS_CONFIG; + let avail_features = (1u64 << VIRTIO_F_VERSION_1) + | (1u64 << VIRTIO_IOMMU_F_MAP_UNMAP) + | (1u64 << VIRTIO_IOMMU_F_PROBE) + | (1u64 << VIRTIO_IOMMU_F_BYPASS_CONFIG); (avail_features, 0, BTreeMap::new(), BTreeMap::new(), false) }; diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index 5fba6f7dc..a39080485 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -449,73 +449,75 @@ impl Net { let mtu = taps[0].mtu().map_err(Error::TapError)? as u16; - let (avail_features, acked_features, config, queue_sizes, paused) = - if let Some(state) = state { - info!("Restoring virtio-net {}", id); - ( - state.avail_features, - state.acked_features, - state.config, - state.queue_size, - true, - ) + let (avail_features, acked_features, config, queue_sizes, paused) = if let Some(state) = + state + { + info!("Restoring virtio-net {}", id); + ( + state.avail_features, + state.acked_features, + state.config, + state.queue_size, + true, + ) + } else { + let mut avail_features = (1 << VIRTIO_NET_F_MTU) + | (1 << VIRTIO_RING_F_EVENT_IDX) + | (1 << VIRTIO_F_VERSION_1); + + if iommu { + avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; + } + + // Configure TSO/UFO features when hardware checksum offload is enabled. + if offload_csum { + avail_features |= (1 << VIRTIO_NET_F_CSUM) + | (1 << VIRTIO_NET_F_GUEST_CSUM) + | (1 << VIRTIO_NET_F_CTRL_GUEST_OFFLOADS); + + if offload_tso { + avail_features |= (1 << VIRTIO_NET_F_HOST_ECN) + | (1 << VIRTIO_NET_F_HOST_TSO4) + | (1 << VIRTIO_NET_F_HOST_TSO6) + | (1 << VIRTIO_NET_F_GUEST_ECN) + | (1 << VIRTIO_NET_F_GUEST_TSO4) + | (1 << VIRTIO_NET_F_GUEST_TSO6); + } + + if offload_ufo { + avail_features |= (1 << VIRTIO_NET_F_HOST_UFO) | (1 << VIRTIO_NET_F_GUEST_UFO); + } + } + + avail_features |= 1 << VIRTIO_NET_F_CTRL_VQ; + let queue_num = num_queues + 1; + + let mut config = VirtioNetConfig::default(); + if let Some(mac) = guest_mac { + build_net_config_space( + &mut config, + mac, + num_queues, + Some(mtu), + &mut avail_features, + ); } else { - let mut avail_features = - 1 << VIRTIO_NET_F_MTU | 1 << VIRTIO_RING_F_EVENT_IDX | 1 << VIRTIO_F_VERSION_1; + build_net_config_space_with_mq( + &mut config, + num_queues, + Some(mtu), + &mut avail_features, + ); + } - if iommu { - avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; - } - - // Configure TSO/UFO features when hardware checksum offload is enabled. - if offload_csum { - avail_features |= 1 << VIRTIO_NET_F_CSUM - | 1 << VIRTIO_NET_F_GUEST_CSUM - | 1 << VIRTIO_NET_F_CTRL_GUEST_OFFLOADS; - - if offload_tso { - avail_features |= 1 << VIRTIO_NET_F_HOST_ECN - | 1 << VIRTIO_NET_F_HOST_TSO4 - | 1 << VIRTIO_NET_F_HOST_TSO6 - | 1 << VIRTIO_NET_F_GUEST_ECN - | 1 << VIRTIO_NET_F_GUEST_TSO4 - | 1 << VIRTIO_NET_F_GUEST_TSO6; - } - - if offload_ufo { - avail_features |= 1 << VIRTIO_NET_F_HOST_UFO | 1 << VIRTIO_NET_F_GUEST_UFO; - } - } - - avail_features |= 1 << VIRTIO_NET_F_CTRL_VQ; - let queue_num = num_queues + 1; - - let mut config = VirtioNetConfig::default(); - if let Some(mac) = guest_mac { - build_net_config_space( - &mut config, - mac, - num_queues, - Some(mtu), - &mut avail_features, - ); - } else { - build_net_config_space_with_mq( - &mut config, - num_queues, - Some(mtu), - &mut avail_features, - ); - } - - ( - avail_features, - 0, - config, - vec![queue_size; queue_num], - false, - ) - }; + ( + avail_features, + 0, + config, + vec![queue_size; queue_num], + false, + ) + }; Ok(Net { common: VirtioCommon { diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index 531293618..87ca4130a 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -98,16 +98,16 @@ impl Blk { ) } else { // Filling device and vring features VMM supports. - let mut avail_features = 1 << VIRTIO_BLK_F_SIZE_MAX - | 1 << VIRTIO_BLK_F_SEG_MAX - | 1 << VIRTIO_BLK_F_GEOMETRY - | 1 << VIRTIO_BLK_F_RO - | 1 << VIRTIO_BLK_F_BLK_SIZE - | 1 << VIRTIO_BLK_F_FLUSH - | 1 << VIRTIO_BLK_F_TOPOLOGY - | 1 << VIRTIO_BLK_F_CONFIG_WCE - | 1 << VIRTIO_BLK_F_DISCARD - | 1 << VIRTIO_BLK_F_WRITE_ZEROES + let mut avail_features = (1 << VIRTIO_BLK_F_SIZE_MAX) + | (1 << VIRTIO_BLK_F_SEG_MAX) + | (1 << VIRTIO_BLK_F_GEOMETRY) + | (1 << VIRTIO_BLK_F_RO) + | (1 << VIRTIO_BLK_F_BLK_SIZE) + | (1 << VIRTIO_BLK_F_FLUSH) + | (1 << VIRTIO_BLK_F_TOPOLOGY) + | (1 << VIRTIO_BLK_F_CONFIG_WCE) + | (1 << VIRTIO_BLK_F_DISCARD) + | (1 << VIRTIO_BLK_F_WRITE_ZEROES) | DEFAULT_VIRTIO_FEATURES; if num_queues > 1 { diff --git a/virtio-devices/src/vhost_user/mod.rs b/virtio-devices/src/vhost_user/mod.rs index 56d641528..ed625e3bd 100644 --- a/virtio-devices/src/vhost_user/mod.rs +++ b/virtio-devices/src/vhost_user/mod.rs @@ -147,12 +147,12 @@ pub enum Error { } type Result = std::result::Result; -pub const DEFAULT_VIRTIO_FEATURES: u64 = 1 << VIRTIO_F_RING_INDIRECT_DESC - | 1 << VIRTIO_F_RING_EVENT_IDX - | 1 << VIRTIO_F_VERSION_1 - | 1 << VIRTIO_F_IN_ORDER - | 1 << VIRTIO_F_ORDER_PLATFORM - | 1 << VIRTIO_F_NOTIFICATION_DATA +pub const DEFAULT_VIRTIO_FEATURES: u64 = (1 << VIRTIO_F_RING_INDIRECT_DESC) + | (1 << VIRTIO_F_RING_EVENT_IDX) + | (1 << VIRTIO_F_VERSION_1) + | (1 << VIRTIO_F_IN_ORDER) + | (1 << VIRTIO_F_ORDER_PLATFORM) + | (1 << VIRTIO_F_NOTIFICATION_DATA) | VhostUserVirtioFeatures::PROTOCOL_FEATURES.bits(); const HUP_CONNECTION_EVENT: u16 = EPOLL_HELPER_EVENT_LAST + 1; diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index 54304e535..930f55741 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -118,10 +118,10 @@ impl Net { ) } else { // Filling device and vring features VMM supports. - let mut avail_features = 1 << VIRTIO_NET_F_MRG_RXBUF - | 1 << VIRTIO_NET_F_CTRL_VQ - | 1 << VIRTIO_F_RING_EVENT_IDX - | 1 << VIRTIO_F_VERSION_1 + let mut avail_features = (1 << VIRTIO_NET_F_MRG_RXBUF) + | (1 << VIRTIO_NET_F_CTRL_VQ) + | (1 << VIRTIO_F_RING_EVENT_IDX) + | (1 << VIRTIO_F_VERSION_1) | VhostUserVirtioFeatures::PROTOCOL_FEATURES.bits(); if mtu.is_some() { @@ -130,19 +130,19 @@ impl Net { // Configure TSO/UFO features when hardware checksum offload is enabled. if offload_csum { - avail_features |= 1 << VIRTIO_NET_F_CSUM | 1 << VIRTIO_NET_F_GUEST_CSUM; + avail_features |= (1 << VIRTIO_NET_F_CSUM) | (1 << VIRTIO_NET_F_GUEST_CSUM); if offload_tso { - avail_features |= 1 << VIRTIO_NET_F_HOST_ECN - | 1 << VIRTIO_NET_F_HOST_TSO4 - | 1 << VIRTIO_NET_F_HOST_TSO6 - | 1 << VIRTIO_NET_F_GUEST_ECN - | 1 << VIRTIO_NET_F_GUEST_TSO4 - | 1 << VIRTIO_NET_F_GUEST_TSO6; + avail_features |= (1 << VIRTIO_NET_F_HOST_ECN) + | (1 << VIRTIO_NET_F_HOST_TSO4) + | (1 << VIRTIO_NET_F_HOST_TSO6) + | (1 << VIRTIO_NET_F_GUEST_ECN) + | (1 << VIRTIO_NET_F_GUEST_TSO4) + | (1 << VIRTIO_NET_F_GUEST_TSO6); } if offload_ufo { - avail_features |= 1 << VIRTIO_NET_F_HOST_UFO | 1 << VIRTIO_NET_F_GUEST_UFO; + avail_features |= (1 << VIRTIO_NET_F_HOST_UFO) | (1 << VIRTIO_NET_F_GUEST_UFO); } } diff --git a/virtio-devices/src/vsock/device.rs b/virtio-devices/src/vsock/device.rs index 527fc8234..a2b47d5b7 100644 --- a/virtio-devices/src/vsock/device.rs +++ b/virtio-devices/src/vsock/device.rs @@ -344,7 +344,7 @@ where info!("Restoring virtio-vsock {}", id); (state.avail_features, state.acked_features, true) } else { - let mut avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_F_IN_ORDER; + let mut avail_features = (1u64 << VIRTIO_F_VERSION_1) | (1u64 << VIRTIO_F_IN_ORDER); if iommu { avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; @@ -529,7 +529,7 @@ mod tests { #[test] fn test_virtio_device() { let mut ctx = TestContext::new(); - let avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_F_IN_ORDER; + let avail_features = (1u64 << VIRTIO_F_VERSION_1) | (1u64 << VIRTIO_F_IN_ORDER); let device_features = avail_features; let driver_features: u64 = avail_features | 1 | (1 << 32); let device_pages = [