Previous Next

General Statistics for Connection-Oriented Miniport Drivers

The following chart summarizes the OIDs used to get or set the general statistics for connection-oriented miniport drivers and NICs.

Length Q S Name
4 or 8 M   OID_GEN_CO_XMIT_PDUS_OK
PDUs transmitted without errors
4 or 8 M   OID_GEN_CO_RCV_PDUS_OK
PDUs received without errors
4 or 8 M   OID_GEN_CO_XMIT_PDUS_ERROR
PDUs not transmitted or transmitted with errors
4 or 8 M   OID_GEN_CO_RCV_PDUS_ERROR
PDUs received with errors
4 or 8 M   OID_GEN_CO_RCV_PDUS_NO_BUFFER
PDUs missed, no buffers
4 or 8 O   OID_GEN_CO_RCV_CRC_ERROR
PDUs received with circular redundancy check (CRC) errors
4 or 8 O   OID_GEN_CO_TRANSMIT_QUEUE_LENGTH
Length of transmit queue
4 or 8 O   OID_GEN_CO_BYTES_XMIT
Bytes transmitted without errors
4 or 8 O   OID_GEN_CO_BYTES_RCV
Bytes received without errors
4 or 8 O   OID_GEN_CO_BYTES_XMIT_OUTSTANDING
Bytes awaiting transmission
4 or 8 O   OID_GEN_CO_NETCARD_LOAD
The transmit load on a NIC

Miniport Driver Support for 64-bit Counters

All one-Gbps and faster connection-oriented miniport drivers must support 64-bit counters for the following statistics OIDs. All 100Mbps and faster connection-oriented miiniport drivers should support 64-bit counters for the following statistics OIDs:

OID_GEN_CO_XMIT_PDUS_OK

OID_GEN_CO_RCV_PDUS_OK

OID_GEN_CO_BYTES_XMIT

OID_GEN_CO_BYTES_RCV

Such miniport drivers can also support 64-bit counters for other statistics OIDs, such as OIDs that indicate transmit or receive errors.

System support for 64-bit counters is available in Windows XP and later OS versions.

OID_GEN_CO_XMIT_PDUS_OK

The number of PDUs transmitted without errors.

OID_GEN_CO_RCV_PDUS_OK

The number of PDUs the NIC received without errors and indicated to bound protocols.

OID_GEN_CO_XMIT_PDUS_ERROR

The number of PDUs a NIC failed to transmit.

OID_GEN_CO_RCV_PDUS_ERROR

The number of PDUs that a NIC received but did not indicate to bound protocols due to errors.

OID_GEN_CO_RCV_PDUS_NO_BUFFER

The number of PDUs that the NIC could not receive because of a lack of NIC receive buffer space. Instead of providing the exact number, some NICs provide only the number of times that they have missed at least one PDU because of such a problem.

OID_GEN_CO_RCV_CRC_ERROR

The number of PDUs received with cyclic redundancy check (CRC) errors.

OID_GEN_CO_TRANSMIT_QUEUE_LENGTH

The number of PDUs currently queued for transmission, whether on the NIC or in a driver-internal queue. The number returned is always the total number of PDUs currently queued, which can include unsubmitted send requests queued in the NDIS library.

OID_GEN_CO_BYTES_XMIT

The number of bytes in PDUs transmitted without errors.

OID_GEN_CO_BYTES_RCV

The number of bytes in PDUs received without errors.

OID_GEN_CO_BYTES_XMIT_OUTSTANDING

The number of bytes in PDUs that are queued for transmission.

OID_GEN_CO_NETCARD_LOAD

The OID_GEN_CO_NETCARD_LOAD OID returns the relative load on the transmit system of a connection-oriented miniport driver. The miniport driver derives this number by calculating the difference between the amount of data delivered for transmission from protocols and the amount of data actually sent, as indicated by the packets returned to protocols with NdisMCoSendComplete. The result is the amount of outstanding transmit data in the miniport driver at any time.

Because this statistic changes at a very high frequency, the miniport driver port should filter it. The simplest filtering method is to maintain a running average of samples of the outstanding transmit data. For example, each time MiniportCoSendPackets is called, the miniport driver could add the submitted packet size to a miniport driver-defined variable called OutstandingBytes. Each time the miniport driver calls NdisMCoSendComplete, the miniport driver would then subtract the returned packet size from OutstandingBytes. The miniport driver must also maintain a running average, which is the value that the miniport driver should return in response to the OID_GEN_CO_NETCARD_LOAD query. This variable, which could be called RunningAverage, must be updated on each MiniportCoSendPackets, as follows:

RunningAverage = [(RunningAverage * C) + (OutstandingBytes * 
(128 - C))]/128

In this case, 1 < C < 128. Larger values of C produce smoother filtering.