將時間戳記附加至封包
在迷你埠驅動程式報告哪些時間戳記功能存在且目前已啟用之後,驅動程式可以使用 NET_BUFFER_LIST ( NBL) 結構,將相關的時間戳記附加至封包。
如需向作業系統報告 NIC 硬體時間戳記功能和迷你埠驅動程式軟體時間戳記功能的詳細資訊,請參閱 報告時間戳記功能和目前的設定。
硬體時間戳記
PtpV2OverUdpIPv4EventMsgReceiveHw
NDIS_TIMESTAMP_CAPABILITY_FLAGS結構中的、 PtpV2OverUdpIPv4AllMsgReceiveHw
、 PtpV2OverUdpIPv4EventMsgTransmitHw
、 PtpV2OverUdpIPv6AllMsgReceiveHw
PtpV2OverUdpIPv6AllMsgTransmitHw
PtpV2OverUdpIPv4AllMsgTransmitHw
PtpV2OverUdpIPv6EventMsgTransmitHw
AllReceiveHw
PtpV2OverUdpIPv6EventMsgReceiveHw
AllTransmitHw
和 TaggedTransmitHw
旗標會指出迷你埠驅動程式支援的硬體時間戳記。
NIC 硬體在接收或傳輸封包時產生的時間戳記是以 64 位整數值表示。 這應該是擷取時間戳記時 NIC 硬體時鐘的原始值。 時間戳記會儲存在 NBL 結構的 NetBufferListInfo 陣列中。
迷你埠驅動程式可以使用 NET_BUFFER_LIST_TIMESTAMP 結構,在 NBL 的 NetBufferListInfo 欄位中設定時間戳記。 驅動程式會以硬體所產生的時間戳記填入NET_BUFFER_LIST_TIMESTAMP結構的Timestamp欄位,並呼叫傳入 結構的 NdisSetNblTimestampInfo公用程式函式。
迷你埠驅動程式可以使用 NdisGetNblTimestampInfo 和 NdisCopyNblTimestampInfo 來擷取和複製時間戳記。
如果啟用特定的硬體時間戳記設定,但不會產生對應至該功能的時間戳記,迷你埠應該將附加至 NBL 的時間戳記設定為 零。
注意
辨識 PTP 第 2 版封包以產生硬體時間戳記時,實作不應將時間戳記產生限制為使用多播位址的封包, (PTP 規格所指定的 IPv4 和 IPv6) 。 實作應該嘗試以其他方式辨識 PTP 封包,例如使用 UDP 標頭或 PTP 承載。 因此,在 PTP 實作可能不會使用 PTP 規格中指定的多播位址的情況下,仍會產生時間戳記,例如使用單播位址。
接收端時間戳記
當硬體從媒體接收框架時,硬體應該會盡可能接近點的時間戳記。 此指導方針是由 IEEE 1588 標準所指定。
收到封包時,迷你埠驅動程式必須:
更正硬體擷取時間戳記時和硬體實際收到框架之間任何延遲的時間戳記。
將硬體中產生的時間戳記附加至 NBL。 時間戳記會對應至 NBL 中包含的框架 (NET_BUFFER 結構) 。
呼叫 NdisMIndicateReceiveNetBufferLists 以指示 NBL 至 NDIS。
請注意,在接收方向中,需要乙太網路硬體的迷你埠驅動程式,才能指出每個 NBL 只有一 個NET_BUFFER 。
傳輸端時間戳記
當硬體將框架傳輸至中型時,硬體應該會盡可能接近點的時間戳記。 此指導方針是由 IEEE 1588 標準所指定。
傳輸封包時,迷你埠驅動程式必須:
更正當硬體擷取時間戳記和硬體實際傳輸框架時,所存在之任何延遲的時間戳記。
將硬體中產生的時間戳記附加至 NBL。 如果 NBL 包含多個 NET_BUFFER,則對應至 NBL 中第一 個NET_BUFFER 的硬體時間戳記應該附加至 NBL。
呼叫 NdisMSendNetBufferListsComplete 以將 NBL 傳送至 NDIS。
報告支援功能旗標的迷你埠和 NIC 硬體 TaggedTransmitHw
,目前應該檢查旗標是否已 NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT
在提供給迷你埠進行傳輸的 NblFlags 欄位中設定旗標。 如果設定此旗標,這表示該 NBL 需要傳輸時間時間戳記,而且應該為 NBL 產生傳輸時間硬體時間戳記。
軟體時間戳記
NDIS_TIMESTAMP_CAPABILITY_FLAGSAllReceiveSw
結構中的 、 AllTransmitSw
和 TaggedTransmitSw
旗標會指出迷你埠是否支援產生軟體時間戳記。
軟體時間戳記也會以 64 位的整數值表示,而且會儲存在與硬體時間戳記 (NBL) 結構NET_BUFFER NetBufferListInfo陣列相同的位置。
如果軟體時間戳記功能存在並啟用,迷你埠驅動程式會使用效能計數器值設定 NBL 中的時間戳記, (QPC) 。 迷你埠驅動程式必須:
呼叫 KeQueryPerformanceCounter 以取得 QPC。
使用 QPC 填入NET_BUFFER_LIST_TIMESTAMP結構的[時間戳記] 欄位。
呼叫 NdisSetNblTimestampInfo 並傳入 NET_BUFFER_LIST_TIMESTAMP,以設定 NBL 中的時間戳記。
在接收時,迷你埠驅動程式應該儘快擷取 QPC,但不早于封包抵達的時間。
在傳輸時,迷你埠驅動程式應該儘快擷取 QPC,再將封包提供給硬體進行傳輸。
旗 TaggedTransmitSw
標類似于 旗標, TaggedTransmitHw
但會對應至軟體時間戳記。 如果支援並啟用此功能,迷你埠應該會在NBL 的 NblFlags欄位中檢查 NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT
旗標。 如果設定此旗標,迷你埠應該會產生 NBL 的傳輸時間軟體時間戳記。