Skip to content

Conversation

@damanm24
Copy link
Contributor

@damanm24 damanm24 commented Nov 12, 2025

This PR adds the ability for the net_consomme backend to process IPv6 traffic generated by a guest VM. Without this change, guest VM's would only reporting having an IPv4 address and a link-local IPv6 address assigned to the machine (see the image below). However, with the addition of a minimal DHCPv6 server and handling of the Neighbor Discovery Protocol (NDP) (an extension of ICMPv6 analogous to ARP for IPv4), guest VM's are able to generate their own global unicast IPv6 addresses with SLAAC (Stateless Address Autoconfiguration).

Before:
image

After:
image

Proper handling of TCP and UDP traffic over IPv6 was validated by spinning up a netcat server on a host machine that a guest VM would connect to by using the host machines global unicast IPv6 address.

Along with adding IPv6 support, this PR also introduces some changes to remove types that were defined in the net_consomme crate and replace them with types that already exist in various dependencies.

Addresses an item in the consomme backlog: #2313

Copilot AI review requested due to automatic review settings November 12, 2025 01:15
@damanm24 damanm24 requested review from a team as code owners November 12, 2025 01:15
@github-actions github-actions bot added the unsafe Related to unsafe code label Nov 12, 2025
@github-actions
Copy link

⚠️ Unsafe Code Detected

This PR modifies files containing unsafe Rust code. Extra scrutiny is required during review.

For more on why we check whole files, instead of just diffs, check out the Rustonomicon

@damanm24
Copy link
Contributor Author

Before this change goes in, I will update the validate_mana_nic function (in the vmm_tests) to ensure the device with a self-assigned IPv6 address.

@github-actions
Copy link

@jstarks
Copy link
Member

jstarks commented Nov 12, 2025

This is really cool.

@github-actions
Copy link

})
.unwrap_or(false);

if !client_mac_matches {
Copy link
Contributor

Choose a reason for hiding this comment

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

see other comment about deciding whether we care about MAC address

@github-actions
Copy link

Copy link
Contributor

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 12 out of 13 changed files in this pull request and generated 7 comments.

Comments suppressed due to low confidence (1)

vm/devices/net/net_consomme/consomme/src/tcp.rs:1256

  • The TCP listener implementation only handles IPv4 addresses. The poll_listener method returns SocketAddrV4 and explicitly rejects non-IPv4 addresses. However, the PR adds IPv6 support to TCP (as seen in handle_tcp and bind_tcp_port), but incoming IPv6 connections won't be accepted because the listener socket is created with Domain::IPV4 (line 1221) and only returns IPv4 addresses. This creates an asymmetry where outgoing IPv6 TCP connections work, but incoming IPv6 connections are silently dropped.
    ) -> Result<Option<(Socket, SocketAddrV4)>, DropReason> {
        match self.socket.poll_accept(cx) {
            Poll::Ready(r) => match r {
                Ok((socket, address)) => match address.as_socket() {
                    Some(addr) => match address.as_socket_ipv4() {
                        Some(src_address) => Ok(Some((
                            socket,
                            SocketAddrV4::new(*src_address.ip(), addr.port()),
                        ))),
                        None => {
                            tracing::warn!(?address, "Not an IPv4 address from accept");
                            Ok(None)

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

Labels

unsafe Related to unsafe code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants