OID_TIMESTAMP_GET_CROSSTIMESTAMP

过度分配的驱动程序发出对象标识符 (OID) 查询请求OID_TIMESTAMP_GET_CROSSTIMESTAMP,以从 NIC 硬件获取交叉时间戳。 交叉时间戳是一组 NIC 硬件时间戳和系统时间戳 () 非常接近。 精确时间协议 (PTP) 版本 2 应用程序使用此 OID 中提供的信息在 NIC 的硬件时钟与系统时钟之间建立关系。

如果微型端口驱动程序在当前配置的NDIS_TIMESTAMP_CAPABILITIES结构中将 CrossTimestamp 字段设置为 TRUE,则必须支持此 OID。 有关报告当前配置的更多详细信息,请参阅 NDIS_STATUS_TIMESTAMP_CURRENT_CONFIG 状态指示。 如果禁用交叉时间戳功能,则应使用相应的错误代码 (完成 OID,例如,NDIS_STATUS_NOT_SUPPORTED) 。

NDIS_OID_REQUEST结构的 RequestType 成员将是 NdisRequestQueryInformation

当微型端口驱动程序收到 OID_TIMESTAMP_GET_CROSSTIMESTAMP 的 OID 请求时,驱动程序将通过使用NDIS_HARDWARE_CROSSTIMESTAMP结构填充QUERY_INFORMATION中的 InformationBuffer 来完成 OID。 NDIS_HARDWARE_CROSSTIMESTAMP结构的“标头”字段中的“类型”字段应设置为“NDIS_OBJECT_TYPE_DEFAULT”,“修订”字段设置为“NDIS_HARDWARE_CROSSTIMESTAMP_REVISION_1”。 驱动程序应按以下顺序填充 SystemTimestamp1HardwareClockTimestampSystemTimestamp2 字段,并使用以下时间戳尽可能接近彼此:

  1. SystemTimestamp1: (通过调用 KeQueryPerformanceCounter 获取) QPC 的性能计数器值。

  2. HardwareClockTimestamp:NIC 硬件时钟的当前值。 这应该是 NIC 的原始硬件时钟值。

  3. SystemTimestamp2:另一个性能计数器值 (QPC) 调用 KeQueryPerformanceCounter 获取。

下面是微型端口驱动程序如何处理OID_TIMESTAMP_GET_CROSSTIMESTAMP的示例:

{
. . .
    NDIS_HARDWARE_CROSSTIMESTAMP crossTimestamp;
    LARGE_INTEGER timeStamp;

    RtlZeroMemory(&crossTimestamp, sizeof(crossTimestamp));

    timeStamp = KeQueryPerformanceCounter(NULL);
    crossTimestamp.SystemTimestamp1 = timeStamp.QuadPart;
    crossTimestamp.HardwareClockTimestamp = FunctionToRetrieveHardwareTimestampFromNetworkCard();
    timeStamp = KeQueryPerformanceCounter(NULL);
    crossTimestamp.SystemTimestamp2 = timeStamp.QuadPart;
    crossTimestamp.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
    crossTimestamp.Header.Size = NDIS_SIZEOF_HARDWARE_CROSSTIMESTAMP_REVISION_1;
    crossTimestamp.Header.Revision = NDIS_HARDWARE_CROSSTIMESTAMP_REVISION_1;

// Complete the OID by filling the query information buffer with the crossTimestamp
}

NDIS_HARDWARE_CROSSTIMESTAMP 结构中的“标志”字段保留供将来使用。 微型端口驱动程序不得更改其值。

微型端口驱动程序和硬件可以自由优化这些时间戳的集合,具体取决于任何高级硬件功能。 但是,在 OID 完成时返回的 SystemTimestamp1SystemTimestamp2 值必须与捕获时的性能计数器 (QPC) 值准确对应。 HardwareClockTimestamp 必须与捕获时 NIC 的硬件时钟值相对应。 如果特定实现可以更准确地确定两个时间戳,而不是三个 (例如,一个系统时间戳和相应的 NIC 硬件时钟时间戳) ,则它应将 SystemTimestamp2 字段设置为与 SystemTimestamp1 相同的值。

微型端口驱动程序不应将 SystemTimestamp1HardwareClockTimestampSystemTimestamp2 值设置为

返回状态代码

微型端口驱动程序为 OID_TIMESTAMP_GET_CROSSTIMESTAMP 的 OID 查询请求返回以下状态代码之一。

状态代码 说明
NDIS_STATUS_SUCCESS OID 请求已成功完成。
NDIS_STATUS_NOT_SUPPORTED 微型端口驱动程序不支持交叉时间戳或禁用交叉时间戳功能。
NDIS_STATUS_FAILURE 请求因其他原因而失败。

要求

要求
最低受支持的客户端 Windows 11
最低受支持的服务器 Windows Server 2022
NDIS 版本 NDIS 6.82 及更高版本
标头 Ntddndis.h (包括 Ndis.h)

另请参阅

NDIS_STATUS_TIMESTAMP_CAPABILITY

OID_TIMESTAMP_CURRENT_CONFIG

OID_TIMESTAMP_CAPABILITY

NDIS_OID_REQUEST