Enumeration Keywords
NDIS 6.0 and later versions of NDIS provide standardized enumeration keywords for miniport drivers of network devices. Enumeration keywords are associated with values that appear as a list in a menu.
The following example shows an INF file definition for an enumeration keyword.
HKR, Ndi\params\<SubkeyName>, ParamDesc, 0, "%<SubkeyName>%"
HKR, Ndi\params\<SubkeyName>, Type, 0, "enum"
HKR, Ndi\params\<SubkeyName>, Default, 0, "3"
HKR, Ndi\params\<SubkeyName>, Optional, 0, "0"
HKR, Ndi\params\<SubkeyName>\enum, "0", 0, "%Disabled%"
HKR, Ndi\params\<SubkeyName>\enum, "1", 0, "%Tx Enabled%"
HKR, Ndi\params\<SubkeyName>\enum, "2", 0, "%Rx Enabled%"
HKR, Ndi\params\<SubkeyName>\enum, "3", 0, "%Rx & Tx Enabled%"
The general enumeration keywords are:
*SpeedDuplex
Speed and duplex settings that a device supports. The device INF file should list only the settings that the associated device supports. That is, for an Ethernet 10/100 device that can support only full-duplex mode, settings for Gigabit or higher speeds or half duplex should not be listed in the associated INF file.
Speed values that are not specifically defined already with enumerated values of 0 through 10 may be set as a number that is the value directly in Mbps. Direct values must be at least 1,000 Mbps (1 Gbps) and above. Here are a few examples for specifying the speed directly:
SpeedDuplex value | Resulting speed |
---|---|
1,000 | 1 Gbps |
10,000 | 10 Gbps |
25,000 | 25 Gbps |
50,000 | 50 Gbps |
100,000 | 100 Gbps |
*FlowControl
The ability for the device to enable or disable flow control in the send or receive path.
Note Ethernet devices today support flow control, and the Windows 8 in-box drivers for LAN have flow control enabled by default. When a kernel debugger attaches to one of these LAN adapters, the NIC will start pushing flow control pause frames into the network. Most network switches will react by temporarily taking down the network for all other computers that are connected to the same hub. This is a common development scenario, and the end-user experience is both undesirable and difficult to diagnose.
Note Client and Server defaults are not the same; refer to the table of defaults below.
For this reason, in Windows 8 and later, NDIS will disable flow control automatically when debugging is enabled on the computer (for example, by typing bcdedit /set debug on at the command line). When kernel debugging is enabled and the miniport calls NdisReadConfiguration and passes "*FlowControl" for the Keyword parameter, NDIS will override the configured value and return zero.
If you need to enable flow control while debugging, NDIS provides the AllowFlowControlUnderDebugger registry value to allow you to do that. The AllowFlowControlUnderDebugger registry value prevents NDIS from disabling flow control, and allows NICs to keep their configured behavior. It can be found under the following registry key:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NDIS\Parameters
Set this registry value to 0x00000001.
If it does not exist, you can create a value with the name AllowFlowControlUnderDebugger and the type REG_DWORD and set it to 0x00000001.
*PriorityVLANTag
A value that indicates whether the device has enabled or disabled the ability to insert the 802.1Q tags for packet priority and virtual LANs (VLANs). This keyword does not indicate whether the device enabled or disabled packet priority or VLAN tags. Instead, it describes the following:
- Whether the device inserts 802.1Q tags during a send operation
- Whether 802.1Q tag information is available in the NET_BUFFER_LIST out-of-band (OOB) information
- Whether the device copies 802.1Q tags to OOB during receive operations
The miniport driver should remove the 802.1Q header from all receive packets regardless of the *PriorityVLANTag setting. If the 802.1Q header is left in a packet, other drivers might not be able to parse the packet correctly.
If the Rx flag is enabled on the receive path, the miniport driver should copy the removed 802.1Q header into OOB.
Otherwise, if the Rx flag is disabled, the miniport driver should not copy the removed 802.1Q header into OOB.
If the Tx flag is enabled on the transmit path, the miniport driver should do the following:
- Insert the 802.1Q header into each outgoing packet and fill it up with the data from OOB (if any non-zero data exists in OOB).
- Advertise appropriate MacOptions in NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES (NDIS_MAC_OPTION_8021P_PRIORITY and NDIS_MAC_OPTION_8021Q_VLAN).
Otherwise, if the Tx flag is disabled, then:
- The miniport filter should not honor 802.1Q information in OOB (and therefore not insert any tag).
- The miniport filter should not advertise appropriate MacOptions in NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES.
Note If the miniport driver supports NDIS quality of service (QoS), it must also read the *QOS keyword value. Based on the *QOS keyword value, the *PriorityVLANTag keyword values are interpreted differently. For more information, see Standardized INF Keywords for NDIS QoS.
*InterruptModeration
A value that describes whether the device enabled or disabled interrupt moderation. Interrupt moderation algorithms are device-dependent. The device manufacturer can use non-standardized keywords to support algorithmic settings. For more information about interrupt moderation, see Interrupt Moderation.
*RSS
A value that describes whether the device enabled or disabled receive side scaling (RSS). For more information about RSS, see Receive Side Scaling.
*HeaderDataSplit
A value that describes whether the device enabled or disabled header-data split. For more information about header-data split, see Header-Data Split.
The following keywords are associated with connection offload services:
*TCPConnectionOffloadIPv4
*TCPConnectionOffloadIPv6
For more information about the connection offload keywords, see Using Registry Values to Enable and Disable Connection Offloading.
The following keywords are associated with task offload services:
*IPChecksumOffloadIPv4
*TCPChecksumOffloadIPv4
*TCPChecksumOffloadIPv6
*UDPChecksumOffloadIPv4
*UDPChecksumOffloadIPv6
*LsoV1IPv4
*LsoV2IPv4
Note For devices that support both large send offload version 1 (LSOv1) and LSOv2 over IPv4, only the *LsoV2IPv4 keyword should be used in the INF file and registry values. If, for example, the *LsoV2IPv4 keyword appears in the INF file and the *LsoV1IPv4 keyword appears in the registry (or vice versa), the *LsoV2IPv4 keyword always takes precedence.
*LsoV2IPv6
*IPsecOffloadV1IPv4
*IPsecOffloadV2
*IPsecOffloadV2IPv4
*TCPUDPChecksumOffloadIPv4
*TCPUDPChecksumOffloadIPv6
For more information about the TCP/IP offload keywords, see Using Registry Values to Enable and Disable Task Offloading.
The columns in the table at the end of this topic describe the following attributes for enumeration keywords:
SubkeyName
The name of the keyword that you must specify in the INF file and that appears in the registry.
ParamDesc
The display text that is associated with SubkeyName.
Value
The enumeration integer value that is associated with each option in the list. This value is stored in NDI\params\SubkeyName\Value.
EnumDesc
The display text that is associated with each value that appears in the menu.
Default
The default value for the menu.
The following table lists all of the keywords and describes the values that a driver must use for the preceding attributes. For more information about a keyword, search for the keyword in the WDK documentation.
SubkeyName | ParamDesc | Value | EnumDesc |
---|---|---|---|
*SpeedDuplex | Speed & Duplex | 0 (Default) | Auto Negotiation |
1 | 10 Mbps Half Duplex | ||
2 | 10 Mbps Full Duplex | ||
3 | 100 Mbps Half Duplex | ||
4 | 100 Mbps Full Duplex | ||
5 | 1.0 Gbps Half Duplex | ||
6 | 1.0 Gbps Full Duplex | ||
7 | 10 Gbps Full Duplex | ||
8 | 20 Gbps Full Duplex | ||
9 | 40 Gbps Full Duplex | ||
10 | 100 Gbps Full Duplex | ||
*FlowControl | Flow Control | 0 (Server Default) | Tx & Rx Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Client Default) | Rx & Tx Enabled | ||
4 | Auto Negotiation | ||
*PriorityVLANTag | Packet Priority & VLAN | 0 | Packet Priority & VLAN Disabled |
1 | Packet Priority Enabled | ||
2 | VLAN Enabled | ||
3 (Default) | Packet Priority & VLAN Enabled | ||
*InterruptModeration | Interrupt Moderation | 0 | Disabled |
1 (Default) | Enabled | ||
*RSS | Receive Side Scaling | 0 | Disabled |
1 (Default) | Enabled | ||
*HeaderDataSplit | Header Data Split | 0 (Default) | Disabled |
1 | Enabled | ||
*TCPConnectionOffloadIPv4 | TCP Connection Offload (IPv4) | 0 | Disabled |
1 (Default) | Enabled | ||
*TCPConnectionOffloadIPv6 | TCP Connection Offload (IPv6) | 0 | Disabled |
1 (Default) | Enabled | ||
*IPChecksumOffloadIPv4 | IPv4 Checksum Offload | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Rx & Tx Enabled | ||
*TCPChecksumOffloadIPv4 | TCP Checksum Offload (IPv4) | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Rx & Tx Enabled | ||
*TCPChecksumOffloadIPv6 | TCP Checksum Offload (IPv6) | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Rx & Tx Enabled | ||
*UDPChecksumOffloadIPv4 | UDP Checksum Offload (IPv4) | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Rx & Tx Enabled | ||
*UDPChecksumOffloadIPv6 | UDP Checksum Offload (IPv6) | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Rx & Tx Enabled | ||
*LsoV1IPv4 | Large Send Offload Version 1 (IPv4) | 0 | Disabled |
1 (Default) | Enabled | ||
*LsoV2IPv4 | Large Send Offload Version 2 (IPv4) | 0 | Disabled |
1 (Default) | Enabled | ||
*LsoV2IPv6 | Large Send Offload Version 2 (IPv6) | 0 | Disabled |
1 (Default) | Enabled | ||
*IPsecOffloadV1IPv4 | IPsec Offload Version 1 (IPv4) | 0 | Disabled |
1 | Auth Header Enabled | ||
2 | ESP Enabled | ||
3 (Default) | Auth Header & ESP Enabled | ||
*IPsecOffloadV2 | IPsec Offload | 0 | Disabled |
1 | Auth Header Enabled | ||
2 | ESP Enabled | ||
3 (Default) | Auth Header & ESP Enabled | ||
*IPsecOffloadV2IPv4 | IPsec Offload (IPv4 only) | 0 | Disabled |
1 | Auth Header Enabled | ||
2 | ESP Enabled | ||
3 (Default) | Auth Header & ESP Enabled | ||
*TCPUDPChecksumOffloadIPv4 | TCP/UDP Checksum Offload (IPv4) | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Tx and Rx Enabled | ||
*TCPUDPChecksumOffloadIPv6 | TCP/UDP Checksum Offload (IPv6) | 0 | Disabled |
1 | Tx Enabled | ||
2 | Rx Enabled | ||
3 (Default) | Tx and Rx Enabled |