Sdílet prostřednictvím


Připojení časových razítek k paketům

Jakmile ovladač miniportu oznámí, které možnosti časového razítka jsou k dispozici a aktuálně povolené, může ovladač připojit příslušná časová razítka k paketům pomocí struktury NET_BUFFER_LIST (NBL).

Další informace o nahlášení možností hardwarového časového razítkování síťové karty a softwarového časového razítkování ovladače miniportu operačnímu systému naleznete v části Zpráva o možnostech časového razítkování a aktuální konfiguraci.

Časové razítka hardwaru

Příznaky PtpV2OverUdpIPv4EventMsgReceiveHw, PtpV2OverUdpIPv4AllMsgReceiveHw, PtpV2OverUdpIPv4EventMsgTransmitHw, PtpV2OverUdpIPv4AllMsgTransmitHw, PtpV2OverUdpIPv6EventMsgReceiveHw, PtpV2OverUdpIPv6AllMsgReceiveHw, PtpV2OverUdpIPv6EventMsgTransmitHw, PtpV2OverUdpIPv6AllMsgTransmitHw, AllReceiveHw, AllTransmitHw a TaggedTransmitHw ve struktuře NDIS_TIMESTAMP_CAPABILITY_FLAGS označují, které časové razítko hardwaru podporuje ovladač miniportu.

Časové razítko, které hardware síťové karty generuje při příjmu nebo přenosu paketu, je reprezentováno 64bitovou celočíselnou hodnotou. Měla by to být surová hodnota hodin hardwaru síťové karty v okamžiku zachycení časového razítka. Časové razítko je uloženo v NBL pole struktury NetBufferListInfo.

Ovladače miniportu můžou použít strukturu NET_BUFFER_LIST_TIMESTAMP k nastavení časového razítka v poli NetBufferListInfo NBL. Ovladač vyplní pole Timestamp struktury NET_BUFFER_LIST_TIMESTAMP časovým razítkem vygenerovaným hardwarem a zavolá funkci nástroje NdisSetNblTimestampInfo tím, že předá strukturu.

Ovladače miniportu můžou používat NdisGetNblTimestampInfo a NdisCopyNblTimestampInfo k načtení a kopírování časových razítek.

Pokud je povolené konkrétní nastavení časového razítka hardwaru, ale časové razítko odpovídající této funkci není generováno, miniport by měl nastavit časové razítko, které se připojí k NBL, nula.

Poznámka

Při rozpoznávání paketů PTP verze 2 pro generování časových razítek hardwaru by implementace neměla omezit generování časového razítka na pakety, které používají adresy vícesměrového vysílání (IPv4 i IPv6), které jsou specifikovány specifikací PTP. Implementace by se měla pokusit rozpoznat pakety PTP jinými způsoby, například pomocí hlavičky UDP nebo datové části PTP. To znamená, že časové razítka se stále generují ve scénářích, kdy implementace PTP nemusí používat adresy vícesměrového vysílání zadané ve specifikaci PTP, například kde se používají adresy jednosměrového vysílání.

Časové označování na straně příjmu

Hardware by mělo získat časové razítko co nejblíže bodu, když hardware obdrží rámec z média. Tento pokyn je specifikován standardem IEEE 1588.

Při přijetí paketu musí ovladač miniportu:

  1. Opravte časové razítko pro všechna zpoždění, která nastala mezi okamžikem, kdy hardware zachytil časové razítko, a kdy zařízení skutečně obdrželo snímek.

  2. Připojte časové razítko vygenerované na hardwaru k NBL. Časové razítko odpovídá struktuře (NET_BUFFER), jež je obsažena v NBL.

  3. Zavolejte NdisMIndicateReceiveNetBufferLists, abyste označili NBL pro NDIS.

Všimněte si, že pro příjem se vyžaduje, aby ovladače miniportu pro ethernetový hardware označily pouze jeden NET_BUFFER na NBL.

Časové razítkování na straně odesílání

Hardware by mělo získat časové razítko co nejblíže okamžiku, kdy přenáší rámec na médium. Tento pokyn je specifikován standardem IEEE 1588.

Při přenosu paketu musí ovladač miniportu:

  1. Opravte časové razítko pro všechna zpoždění, která existují mezi tím, kdy hardware zachytil časové razítko, a kdy hardware skutečně přenášel snímek.

  2. Připojte časové razítko vygenerované na hardwaru k NBL. Pokud NBL obsahuje více NET_BUFFERs, mělo by být k NBL připojeno časové razítko hardwaru odpovídající prvnímu NET_BUFFER v NBL.

  3. Zavolejte NdisMSendNetBufferListsComplete k dokončení odeslání NBL do NDIS.

Miniporty a hardware síťových karet, které hlásí, že je příznak TaggedTransmitHw schopností podporovaný a aktuálně povolený, by měly zkontrolovat, jestli je příznak NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT nastavený v NblFlags pole NBL, které je předáno miniportu pro přenos. Pokud je tento příznak nastavený, znamená to, že pro tuto NBL je potřeba časové razítko přenosu a pro NBL by se mělo vygenerovat hardwarové časové razítko přenosu.

Časová razítka softwaru

Příznaky AllReceiveSw, AllTransmitSw a TaggedTransmitSw ve struktuře NDIS_TIMESTAMP_CAPABILITY_FLAGS označují, jestli miniport podporuje generování časových razítek softwaru.

Časová razítka softwaru jsou také reprezentována jako 64bitové celočíselné hodnoty a jsou uloženy ve stejném slotu v NetBufferListInfo pole struktury NET_BUFFER (NBL) jako časové razítka hardwaru.

Pokud jsou k dispozici a povolené schopnosti softwarového časového razítkování, nastaví ovladač miniportu časové razítko v NBL pomocí hodnoty čítače výkonu (QPC). Ovladač miniportu musí:

  1. Zavolejte KeQueryPerformanceCounter pro získání QPC.

  2. Vyplňte pole časové razítko struktury NET_BUFFER_LIST_TIMESTAMP pomocí Query Performance Counter (QPC).

  3. Nastavte časové razítko v NBL voláním NdisSetNblTimestampInfo a předáním NET_BUFFER_LIST_TIMESTAMP.

Při příjmu paketu by měl ovladač miniportu zachytit QPC co nejdříve, ale ne dříve, než když paket dorazí.

Při přenosu by měl ovladač miniportu zachytit QPC co nejpozději, než je paket předán hardwaru pro přenos.

Příznak TaggedTransmitSw je podobný příznaku TaggedTransmitHw, ale odpovídá časovým razítkům softwaru. Pokud je tato možnost podporována a povolena, měl by miniport zkontrolovat příznak NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT v poli NblFlags NBL. Pokud je tento příznak nastavený, měl by miniport vygenerovat časové razítko přenosu pro NBL.