Skip to content

vm networking: add flag vnet_hdr#78

Merged
dmcgowan merged 1 commit into
containerd:mainfrom
akerouanton:vnet-header
May 15, 2026
Merged

vm networking: add flag vnet_hdr#78
dmcgowan merged 1 commit into
containerd:mainfrom
akerouanton:vnet-header

Conversation

@akerouanton
Copy link
Copy Markdown
Member

@akerouanton akerouanton commented Dec 22, 2025

When segmentation offload is enabled, and unsegmented packets are sent to a VM (i.e. when running a container in the root netns), the kernel will detect that packets are larger than expected and proceed.

That's not the case for containers (i.e. when running a container with its own netns, and a veth pair). In that case, packets reach the virtio-net interface, are forwarded to the bridge, and then to the appropriate veth.

Unsegmented packets with GSO fields unset are dropped by the kernel either at the bridge or at the veth level. That may be due to the current network topology where the vnet interface is attached to a bridge.

In that case, we need to tell libkrun that the network backend sends / receives virtio_net_hdr structs with the packets, and the backend need to preserve GSO fields for VM-to-VM connections, or populate them for host-to-VM connections.

Copilot AI review requested due to automatic review settings December 22, 2025 06:32
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds support for virtio-net headers in VM networking by introducing a new vnet_hdr flag. This flag enables proper handling of segmentation offload for containers running with their own network namespace and veth pairs, where unsegmented packets would otherwise be dropped by the kernel.

Key changes:

  • Adds a new vnet_hdr boolean field to control virtio-net header inclusion
  • Introduces network flag constants to replace magic numbers
  • Updates documentation to describe the new optional field

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
internal/shim/task/networking_unix.go Adds vnet_hdr field and flag constant, updates parsing and flag handling logic
docs/vm-networking.md Documents the new vnet_hdr optional field

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/shim/task/networking_unix.go Outdated
@akerouanton akerouanton force-pushed the vnet-header branch 2 times, most recently from fbdd137 to f5f3bb5 Compare December 22, 2025 06:35
Copilot AI review requested due to automatic review settings February 25, 2026 01:40
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/shim/task/networking.go
Comment thread docs/vm-configuration.md
Comment thread internal/shim/task/networking.go
akerouanton added a commit that referenced this pull request Apr 8, 2026
ndeloof pushed a commit to ndeloof/nerdbox-debug that referenced this pull request Apr 30, 2026
When segmentation offload is enabled, and unsegmented packets are sent
to a VM (i.e. when running a container in the root netns), the kernel
will detect that packets are larger than expected and proceed.

That's not the case for containers (i.e. when running a container with
its own netns, and a veth pair). In that case, packets reach the
virtio-net interface, are forwarded to the bridge, and then to the
appropriate veth.

Unsegmented packets with GSO fields unset are dropped by the kernel
either at the bridge or at the veth level. That may be due to the
current network topology where the vnet interface is attached to a
bridge.

In that case, we need to tell libkrun that the network backend sends /
receives virtio_net_hdr structs with the packets, and the backend need
to preserve GSO fields for VM-to-VM connections, or populate them for
host-to-VM connections.

Signed-off-by: Albin Kerouanton <albin.kerouanton@docker.com>
Copy link
Copy Markdown
Member

@dmcgowan dmcgowan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its optional and approved for libkrun, lets get it in so it can be apart of ourvm interface

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants