Internals of NDIS driver for VirtIO based network adapter: Difference between revisions

From KVM
No edit summary
 
No edit summary
Line 5: Line 5:
This document contains implementation notes of Windows network adapter driver of VirtIO network device.
This document contains implementation notes of Windows network adapter driver of VirtIO network device.


== Abbreviations in the document ==
= Abbreviations in the document =
·        LSO, a.k.a. GSO, a.k.a. TSO – Large, Global, Transmit segment offload – the same thing in context of Windows driver.
* LSO, a.k.a. GSO, a.k.a. TSO – Large, Global, Transmit segment offload – the same thing in context of Windows driver.
* OOB – out-of-band packet data; set of structures, associated with packet
* SG – scatter-gather
* MTU – maximal transfer unit
* MSS – maximal segment size
* CS – checksum
* MDL – memory descriptor list
* WL – waiting list
* DUT – device under test


·        OOB – out-of-band packet data; set of structures, associated with packet


·        SG – scatter-gather
= NDIS driver features =
== Basic networking operations ==
The NetKVM driver supports non-serialized data sending and receiving.


·        MTU – maximal transfer unit
Multiple send operations are supported by driver and not required to be serialized by NDIS (Logo requirements).


·        MSS – maximal segment size
For send operation scatter-gather mode is a default, it can be disabled by configuration to force copy mode to preallocated buffers.


·        CS – checksum
In receive operations the driver can indicate up to NDIS as many packets as VirtIO device can receive without waiting for NDIS to free receive buffers.


·        MDL – memory descriptor list
The default MTU reported by driver to NDIS is 1514 bytes, i.e. NDIS sends without LSO packets up to MTU, the driver can not indicate reception of packets bigger than MTU. MTU can be changed through the device properties in device manager.


·        WL – waiting list
For bidirectional data channel to/from device, the driver initializes 2 VirtIO queues (transmit and receive). VirtIO queues contain memory blocks for SG entry only (physical address + size), all the data buffers, where the physical address points to, are not related to VirtIO.


·        DUT – device under test
Buffers, required for VirtIO headers and network data (when necessary) and OS-specific object, required for data indication, are allocated by the driver additionally during initialization.


== Checksum offload ==
NDIS driver can declare following types of TX checksum offload


== NDIS driver features ==
* IP checksum. NDIS does not initialize IP header checksum, device/driver fill it.
=== Basic networking operations ===
* TCP checksum. NDIS initializes TCP header checksum with “pseudo header checksum” value (pseudo header does not exist in the packet, checksum calculated on virtual structure), the device/driver finish it
* Support IP options and TCP options when calculating checksum.
* UDP checksum – exactly as TCP without options.
* IP and TCP checksum for IPV6.
 
NDIS driver may implement also support of RX checksum offload (ability to verify IP/TCP checksum in incoming packets) – this feature is not supported in NetKVM.
 
The NetKVM driver has implementation of all the CS offloads for IPV4, it works functionally. It is very helpful during development and diagnostic; some of these mechanisms used for LSO also. But the implementation does not pass corner cases of NDIS tests and disabled in the configuration by default.

Revision as of 10:16, 27 July 2009

Internals of NDIS driver for VIRTIO based network adapter


This document contains implementation notes of Windows network adapter driver of VirtIO network device.

Abbreviations in the document

  • LSO, a.k.a. GSO, a.k.a. TSO – Large, Global, Transmit segment offload – the same thing in context of Windows driver.
  • OOB – out-of-band packet data; set of structures, associated with packet
  • SG – scatter-gather
  • MTU – maximal transfer unit
  • MSS – maximal segment size
  • CS – checksum
  • MDL – memory descriptor list
  • WL – waiting list
  • DUT – device under test


NDIS driver features

Basic networking operations

The NetKVM driver supports non-serialized data sending and receiving.

Multiple send operations are supported by driver and not required to be serialized by NDIS (Logo requirements).

For send operation scatter-gather mode is a default, it can be disabled by configuration to force copy mode to preallocated buffers.

In receive operations the driver can indicate up to NDIS as many packets as VirtIO device can receive without waiting for NDIS to free receive buffers.

The default MTU reported by driver to NDIS is 1514 bytes, i.e. NDIS sends without LSO packets up to MTU, the driver can not indicate reception of packets bigger than MTU. MTU can be changed through the device properties in device manager.

For bidirectional data channel to/from device, the driver initializes 2 VirtIO queues (transmit and receive). VirtIO queues contain memory blocks for SG entry only (physical address + size), all the data buffers, where the physical address points to, are not related to VirtIO.

Buffers, required for VirtIO headers and network data (when necessary) and OS-specific object, required for data indication, are allocated by the driver additionally during initialization.

Checksum offload

NDIS driver can declare following types of TX checksum offload

  • IP checksum. NDIS does not initialize IP header checksum, device/driver fill it.
  • TCP checksum. NDIS initializes TCP header checksum with “pseudo header checksum” value (pseudo header does not exist in the packet, checksum calculated on virtual structure), the device/driver finish it
  • Support IP options and TCP options when calculating checksum.
  • UDP checksum – exactly as TCP without options.
  • IP and TCP checksum for IPV6.

NDIS driver may implement also support of RX checksum offload (ability to verify IP/TCP checksum in incoming packets) – this feature is not supported in NetKVM.

The NetKVM driver has implementation of all the CS offloads for IPV4, it works functionally. It is very helpful during development and diagnostic; some of these mechanisms used for LSO also. But the implementation does not pass corner cases of NDIS tests and disabled in the configuration by default.