Skip to content

[TASK] Phase 4.3.2: virtio-net Driver (QEMU NIC) #136

Description

@iamvirul

Overview

Implement a user-space virtio-net driver for QEMU's paravirtual NIC. virtio-net is the standard NIC in QEMU/KVM environments and is the correct first target — it is simpler than real PCIe NICs and avoids PCI enumeration complexity.

Background

virtio-net uses shared memory virtqueues (TX and RX rings in DMA buffers) for zero-copy packet transfer. The driver places packet buffers in the RX virtqueue; QEMU fills them with incoming frames and fires an interrupt. For TX, the driver places frames in the TX virtqueue; QEMU drains them.

Design

Virtqueue

pub struct Virtqueue {
    descriptors: &'static mut [VirtqDesc],   // DMA buffer
    available:   &'static mut VirtqAvail,
    used:        &'static mut VirtqUsed,
    queue_size:  u16,
    last_used:   u16,
}

Driver Lifecycle

  1. Enumerate PCI bus for virtio-net device (vendor=0x1AF4, device=0x1000)
  2. Read virtio device config (MAC address, features)
  3. Negotiate features (VIRTIO_NET_F_MAC minimum)
  4. Allocate TX/RX virtqueues via sys_dma_alloc
  5. Register IrqCapability for virtio interrupt
  6. Populate RX queue with empty buffers; notify device
  7. On IRQ: drain used RX descriptors, pass frames to sys_nic_send (to kernel RX ring)
  8. On TX: get frame from kernel TX ring via sys_nic_recv, place in TX virtqueue, kick device

Acceptance Criteria

  • PCI device enumeration finds virtio-net device in QEMU
  • Virtqueues allocated via sys_dma_alloc (physically contiguous)
  • MAC address read from virtio config space
  • RX: incoming frames received and forwarded to kernel net stack
  • TX: outgoing frames from kernel net stack transmitted to QEMU
  • Driver sends ReadySignal after init
  • QEMU -netdev user mode: ping to host gateway succeeds (verified via ARP/ICMP in Phase 4.3.3)
  • Serial log: "virtio-net: found PCI device at bus 0 slot N", "virtio-net: MAC=52:54:00:xx:xx:xx, MTU=1500", "virtio-net: ready"

Files

  • userspace/drivers/virtio-net/src/main.rs
  • userspace/drivers/virtio-net/src/pci.rs — PCI enumeration
  • userspace/drivers/virtio-net/src/virtqueue.rs
  • userspace/drivers/virtio-net/src/net.rs — TX/RX loops
  • userspace/drivers/virtio-net/Cargo.toml

Dependencies

  • Phase 4.3.1 (NIC abstraction): sys_nic_send / sys_nic_recv
  • Phase 3.1.4: sys_dma_alloc for virtqueue memory
  • Phase 3.1.3: sys_irq_register for virtio IRQ

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    Status
    Todo

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions