Skip to content

Commit 9b1d41b

Browse files
committed
virtio-net: correctly handle IPv6 TSO when supported
In the past, we were enabling IPv6 TSO in the TAP device but we were not negotiating the flag with the guest driver. The previous commit cleaned this up, by not setting gen::TUN_F_TSO6 when calling the TUNSETOFFLOAD ioctl. This commit properly negotiates the feature and, if the guest supports it, it enables it in the TAP device. Signed-off-by: Babis Chalios <[email protected]>
1 parent 1e5d3db commit 9b1d41b

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/vmm/src/devices/virtio/net/device.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDev
2222
use crate::devices::virtio::gen::virtio_blk::VIRTIO_F_VERSION_1;
2323
use crate::devices::virtio::gen::virtio_net::{
2424
virtio_net_hdr_v1, VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, VIRTIO_NET_F_GUEST_TSO4,
25-
VIRTIO_NET_F_GUEST_UFO, VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_MAC,
25+
VIRTIO_NET_F_GUEST_TSO6, VIRTIO_NET_F_GUEST_UFO, VIRTIO_NET_F_HOST_TSO4,
26+
VIRTIO_NET_F_HOST_TSO6, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_MAC,
2627
};
2728
use crate::devices::virtio::gen::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
2829
use crate::devices::virtio::iovec::IoVecBuffer;
@@ -155,8 +156,10 @@ impl Net {
155156
let mut avail_features = 1 << VIRTIO_NET_F_GUEST_CSUM
156157
| 1 << VIRTIO_NET_F_CSUM
157158
| 1 << VIRTIO_NET_F_GUEST_TSO4
159+
| 1 << VIRTIO_NET_F_GUEST_TSO6
158160
| 1 << VIRTIO_NET_F_GUEST_UFO
159161
| 1 << VIRTIO_NET_F_HOST_TSO4
162+
| 1 << VIRTIO_NET_F_HOST_TSO6
160163
| 1 << VIRTIO_NET_F_HOST_UFO
161164
| 1 << VIRTIO_F_VERSION_1
162165
| 1 << VIRTIO_RING_F_EVENT_IDX;
@@ -684,6 +687,12 @@ impl Net {
684687
gen::TUN_F_TSO4,
685688
VIRTIO_NET_F_GUEST_TSO4,
686689
);
690+
add_if_supported(
691+
&mut tap_features,
692+
guest_supported_features,
693+
gen::TUN_F_TSO6,
694+
VIRTIO_NET_F_GUEST_TSO6,
695+
);
687696

688697
tap_features
689698
}
@@ -1010,9 +1019,11 @@ pub mod tests {
10101019
let features = 1 << VIRTIO_NET_F_GUEST_CSUM
10111020
| 1 << VIRTIO_NET_F_CSUM
10121021
| 1 << VIRTIO_NET_F_GUEST_TSO4
1022+
| 1 << VIRTIO_NET_F_GUEST_TSO6
10131023
| 1 << VIRTIO_NET_F_MAC
10141024
| 1 << VIRTIO_NET_F_GUEST_UFO
10151025
| 1 << VIRTIO_NET_F_HOST_TSO4
1026+
| 1 << VIRTIO_NET_F_HOST_TSO6
10161027
| 1 << VIRTIO_NET_F_HOST_UFO
10171028
| 1 << VIRTIO_F_VERSION_1
10181029
| 1 << VIRTIO_RING_F_EVENT_IDX;
@@ -1037,9 +1048,12 @@ pub mod tests {
10371048
// Test that `Net::build_tap_offload_features` creates the TAP offload features that we expect
10381049
// it to do, based on the available guest features
10391050
fn test_build_tap_offload_features_all() {
1040-
let supported_features =
1041-
1 << VIRTIO_NET_F_CSUM | 1 << VIRTIO_NET_F_GUEST_UFO | 1 << VIRTIO_NET_F_GUEST_TSO4;
1042-
let expected_tap_features = gen::TUN_F_CSUM | gen::TUN_F_UFO | gen::TUN_F_TSO4;
1051+
let supported_features = 1 << VIRTIO_NET_F_CSUM
1052+
| 1 << VIRTIO_NET_F_GUEST_UFO
1053+
| 1 << VIRTIO_NET_F_GUEST_TSO4
1054+
| 1 << VIRTIO_NET_F_GUEST_TSO6;
1055+
let expected_tap_features =
1056+
gen::TUN_F_CSUM | gen::TUN_F_UFO | gen::TUN_F_TSO4 | gen::TUN_F_TSO6;
10431057
let supported_flags = Net::build_tap_offload_features(supported_features);
10441058

10451059
assert_eq!(supported_flags, expected_tap_features);

0 commit comments

Comments
 (0)