OID_TIMESTAMP_GET_CROSSTIMESTAMP
上位ドライバーは、NIC ハードウェアからクロス タイムスタンプを取得する OID_TIMESTAMP_GET_CROSSTIMESTAMP の オブジェクト識別子 (OID) クエリ要求を発行します。 クロス タイムスタンプは、NIC ハードウェアタイムスタンプとシステムタイムスタンプのセットであり、相互に非常に近い位置で取得されます。 精度タイム プロトコル (PTP) バージョン 2 のアプリケーションは、NIC のハードウェア クロックとシステム クロックの間の関係を確立するために、この OID で提供される情報を使用します。
ミニポート ドライバーは、 CrossTimestamp フィールドを、現在の構成の一部として NDIS_TIMESTAMP_CAPABILITIES の TRUE に設定する場合、この OID をサポートする必要があります。 現在の構成のレポートの詳細については、 NDIS_STATUS_TIMESTAMP_CURRENT_CONFIG 状態の表示を参照してください。 クロス タイムスタンプ機能が無効になっている場合は、適切なエラー コード(例えば、 NDIS_STATUS_NOT_SUPPORTED)を使用して OID を完了する必要があります。
The NDIS_OID_REQUEST 構造体の NDIS_OID_REQUEST メンバーは、 NdisRequestQueryInformation になります。
ミニポート ドライバーは、OID_TIMESTAMP_GET_CROSSTIMESTAMPの OID 要求を受信すると、 InformationBuffer を QUERY_INFORMATION に NDIS_HARDWARE_CROSSTIMESTAMP 構造体で入力することによってOID を完了します。 NDIS_HARDWARE_CROSSTIMESTAMP 構造体の Header フィールドの タイプ フィールドは NDIS_OBJECT_TYPE_DEFAULT に、 Revision フィールドは NDIS_HARDWARE_CROSSTIMESTAMP_REVISION_1 に設定する必要があります。 ドライバーは、 SystemTimestamp1 、, HardwareClockTimestamp および SystemTimestamp2 の各フィールドに、可能な限り近い次のタイムスタンプと次の順序で入力する必要があります:
SystemTimestamp1: KeQueryPerformanceCounter を呼び出して取得したパフォーマンス カウンター値 (QPC)。
HardwareClockTimestamp: NIC ハードウェア クロックの現在の値。 これは、NIC の生のハードウェア クロック値である必要があります。
SystemTimestamp2: KeQueryPerformanceCounter を呼び出して取得した別のパフォーマンス カウンター値 (QPC)。
ミニポート ドライバーが 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 フィールドの Flags フィールドは、将来使用するために予約されています。 ミニポート ドライバーは、その値を変更することはできません。
ミニポート ドライバーとハードウェアは、高度なハードウェア機能に応じて、これらのタイムスタンプのコレクションを最適化する自由です。 ただし、OID の完了時に返される SystemTimestamp1 と SystemTimestamp2 の値は、キャプチャ時のパフォーマンス カウンター (QPC) 値に正確に対応している必要があります。 HardwareClockTimestamp は、キャプチャ時点での NIC のハードウェア クロック値に対応している必要があります。 特定の実装で、3 つではなく 2 つのタイムスタンプ(例えば、1つのシステム タイムスタンプと対応する NIC ハードウェア クロック タイムスタンプ)をより正確に決定できる場合は、 SystemTimestamp2 フィールドを SystemTimestamp1 と同じ値に設定する必要があります。
ミニドライバーは、 SystemTimestamp1 、 HardwareClockTimestamp または SystemTimestamp2 の値を 0 に設定してはなりません。
状態コードを返します
ミニポート ドライバーは、OID_TIMESTAMP_GET_CROSSTIMESTAMPの OID クエリ要求の次の状態コードのいずれかを返します。
状態コード | 説明 |
---|---|
NDIS_STATUS_SUCCESS | OID 要求は正常に完了しました。 |
NDIS_STATUS_NOT_SUPPORTED | ミニポート ドライバーは、クロス タイムスタンプをサポートしていないか、クロス タイムスタンプ機能が無効になっています。 |
NDIS_STATUS_FAILURE | その他の理由で要求に失敗しました。 |
要件
要件 | Value |
---|---|
サポートされている最小のクライアント | Windows 11 |
サポートされている最小のサーバー | Windows Server 2022 |
NDIS のバージョン | NDIS 6.82 以降 |
ヘッダー | Ntddndis.h (Ndis.h を含む) |