Anfügen von Zeitstempeln an Pakete

Nachdem der Miniporttreiber gemeldet hat, welche Zeitstempelfunktionen vorhanden und aktuell aktiviert sind, kann der Treiber die relevanten Zeitstempel mithilfe der NET_BUFFER_LIST -Struktur (NBL) an Pakete anfügen.

Weitere Informationen zum Melden der Hardwarezeitstempelfunktionen der Netzwerkkarte und der Softwarezeitstempelfunktionen des Miniporttreibers an das Betriebssystem finden Sie unter Reporting timestamping capabilities and current configuration.for more information on reporting the NIC's hardware timestamping capabilities and the software timestamping capabilities to the operating system, see Reporting timestamping capabilities and current configuration.

Hardwarezeitstempel

Die PtpV2OverUdpIPv4EventMsgReceiveHwFlags , PtpV2OverUdpIPv4AllMsgReceiveHw, PtpV2OverUdpIPv4EventMsgTransmitHwPtpV2OverUdpIPv4AllMsgTransmitHw, , PtpV2OverUdpIPv6EventMsgReceiveHwPtpV2OverUdpIPv6AllMsgReceiveHw, PtpV2OverUdpIPv6AllMsgTransmitHwAllReceiveHwPtpV2OverUdpIPv6EventMsgTransmitHw, , und TaggedTransmitHwAllTransmitHw in der NDIS_TIMESTAMP_CAPABILITY_FLAGS-Struktur geben an, welche Hardwarezeitstempel der Miniporttreiber unterstützt.

Der Zeitstempel, den die NIC-Hardware beim Empfang oder der Übertragung eines Pakets generiert, wird durch einen 64-Bit-Ganzzahlwert dargestellt. Dies sollte der Rohwert der Uhr der NIC-Hardware zum Zeitpunkt der Erfassung des Zeitstempels sein. Der Zeitstempel wird im NetBufferListInfo-Array der NBL-Struktur gespeichert.

Miniporttreiber können die NET_BUFFER_LIST_TIMESTAMP-Struktur verwenden, um den Zeitstempel im NetBufferListInfo-Feld der NBL festzulegen. Der Treiber füllt das Zeitstempelfeld der NET_BUFFER_LIST_TIMESTAMP-Struktur mit dem von der Hardware generierten Zeitstempel und ruft die Hilfsprogrammfunktion NdisSetNblTimestampInfo auf, wobei die -Struktur übergeben wird.

Miniport-Treiber können NdisGetNblTimestampInfo und NdisCopyNblTimestampInfo verwenden, um Zeitstempel abzurufen und zu kopieren.

Wenn eine bestimmte Hardwarezeitstempeleinstellung aktiviert ist, aber kein Zeitstempel generiert wird, der dieser Funktion entspricht, sollte der Miniport den Zeitstempel, den er an die NBL anfügt, auf Null festlegen.

Hinweis

Beim Erkennen von PTP-Paketen der Version 2 zum Generieren von Hardwarezeitstempeln sollte die Implementierung die Zeitstempelgenerierung nicht auf Pakete beschränken, die die Multicastadressen (sowohl IPv4 als auch IPv6) verwenden, die durch die PTP-Spezifikation angegeben sind. Die Implementierung sollte versuchen, PTP-Pakete auf andere Weise zu erkennen, z. B. mithilfe des UDP-Headers oder der PTP-Nutzlast. Dies ist so, dass Zeitstempel weiterhin in Szenarien generiert werden, in denen eine PTP-Implementierung möglicherweise nicht die in der PTP-Spezifikation angegebenen Multicastadressen verwendet, z. B. wenn Unicastadressen verwendet werden.

Empfangsseitige Zeitstempelung

Die Hardware sollte den Zeitstempel so nah wie möglich an dem Punkt abrufen, an dem die Hardware den Frame vom Medium empfängt. Diese Richtlinie wird durch den IEEE 1588-Standard festgelegt.

Wenn ein Paket empfangen wird, muss der Miniporttreiber Folgendes ausführen:

  1. Korrigieren Sie den Zeitstempel für alle Verzögerungen zwischen dem Zeitpunkt, an dem die Hardware den Zeitstempel erfasst hat, und dem Zeitpunkt, an dem die Hardware den Frame tatsächlich empfangen hat.

  2. Fügen Sie den in der Hardware generierten Zeitstempel an die NBL an. Der Zeitstempel entspricht dem Frame (NET_BUFFER Struktur), der in der NBL enthalten ist.

  3. Rufen Sie NdisMIndicateReceiveNetBufferLists auf, um die NBL zu NDIS anzugeben.

Beachten Sie, dass miniporttreiber für Ethernet-Hardware in Empfangsrichtung nur einen NET_BUFFER pro NBL angeben müssen.

Seitliche Zeitstempelübertragung

Die Hardware sollte den Zeitstempel so nah wie möglich an dem Punkt abrufen, an dem die Hardware den Frame an das Medium überträgt. Diese Richtlinie wird durch den IEEE 1588-Standard festgelegt.

Wenn ein Paket übertragen wird, muss der Miniporttreiber:

  1. Korrigieren Sie den Zeitstempel für alle Verzögerungen zwischen dem Zeitpunkt, an dem die Hardware den Zeitstempel erfasst hat, und dem Zeitpunkt, an dem die Hardware den Frame tatsächlich übertragen hat.

  2. Fügen Sie den in der Hardware generierten Zeitstempel an die NBL an. Wenn die NBL mehrere NET_BUFFERs enthält, sollte der Hardwarezeitstempel, der dem ersten NET_BUFFER in der NBL entspricht, an die NBL angefügt werden.

  3. Rufen Sie NdisMSendNetBufferListsComplete auf , um die NBL an NDIS zu senden.

Miniports und NIC-Hardware, die melden, dass das TaggedTransmitHw Funktionsflag unterstützt und derzeit aktiviert ist, sollten überprüfen, ob das NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT Flag im Feld NblFlags einer NBL festgelegt ist, die dem Miniport für die Übertragung zugewiesen wird. Wenn dieses Flag festgelegt ist, gibt dies an, dass für diese NBL ein Zeitstempel für die Sendezeit und ein Hardwarezeitstempel für die NBL generiert werden soll.

Softwarezeitstempel

Die AllReceiveSwFlags , AllTransmitSw und TaggedTransmitSw in der NDIS_TIMESTAMP_CAPABILITY_FLAGS-Struktur geben an, ob der Miniport das Generieren von Softwarezeitstempeln unterstützt.

Softwarezeitstempel werden auch als ganzzahlige 64-Bit-Werte dargestellt und im gleichen Slot im NetBufferListInfo-Array der NET_BUFFER-Struktur (NBL) gespeichert wie die Hardwarezeitstempel.

Wenn Softwarezeitstempelfunktionen vorhanden und aktiviert sind, legt der Miniporttreiber den Zeitstempel in der NBL mithilfe des Leistungsindikatorwerts (Performance Counter Value, QPC) fest. Der Miniporttreiber muss:

  1. Rufen Sie KeQueryPerformanceCounter auf, um den QPC abzurufen.

  2. Füllen Sie das Feld Zeitstempel der NET_BUFFER_LIST_TIMESTAMP-Struktur mit dem QPC aus.

  3. Legen Sie den Zeitstempel in der NBL fest, indem Sie NdisSetNblTimestampInfo aufrufen und den NET_BUFFER_LIST_TIMESTAMP übergeben.

Beim Empfang sollte der Miniporttreiber den QPC so früh wie möglich erfassen, aber nicht vor dem Zeitpunkt, als das Paket eingetroffen ist.

Bei der Übertragung sollte der Miniporttreiber den QPC so spät wie möglich erfassen, bevor das Paket zur Übertragung an die Hardware übergeben wird.

Das TaggedTransmitSw Flag entspricht dem TaggedTransmitHw Flag, entspricht aber Softwarezeitstempeln. Wenn die Funktion unterstützt und aktiviert wird, sollte der Miniport das NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT Flag im Feld NblFlags des NBL überprüfen. Wenn dieses Flag festgelegt ist, sollte der Miniport einen Softwarezeitstempel für die Sendezeit für die NBL generieren.