미니포트 드라이버가 어떤 타임스탬프 기능이 있고 현재 사용하도록 설정되어 있는지 보고한 후 드라이버는 NBL(NET_BUFFER_LIST) 구조를 사용하여 관련 타임스탬프를 패킷에 연결할 수 있습니다.
NIC의 하드웨어 타임스탬프 기능 및 미니포트 드라이버의 소프트웨어 타임스탬프 기능을 운영 체제에 보고하는 방법에 대한 자세한 내용은 보고 타임스탬프 기능 및 현재 구성참조하세요.
하드웨어 타임스탬프
NDIS_TIMESTAMP_CAPABILITY_FLAGS 구조의 PtpV2OverUdpIPv4EventMsgReceiveHw, PtpV2OverUdpIPv4AllMsgReceiveHw, PtpV2OverUdpIPv4EventMsgTransmitHw, PtpV2OverUdpIPv4AllMsgTransmitHw, PtpV2OverUdpIPv6EventMsgReceiveHw, PtpV2OverUdpIPv6AllMsgReceiveHw, PtpV2OverUdpIPv6EventMsgTransmitHw, PtpV2OverUdpIPv6AllMsgTransmitHw, AllReceiveHw, AllTransmitHw 및 TaggedTransmitHw 플래그는 미니포트 드라이버가 지원하는 하드웨어 타임스탬프를 나타냅니다.
패킷의 수신 또는 전송 시 NIC 하드웨어가 생성하는 타임스탬프는 64비트 정수 값으로 표시됩니다. 타임스탬프가 캡처되는 지점에서 NIC 하드웨어 시계의 원시 값이어야 합니다. 타임스탬프는 NBL 구조체의 NetBufferListInfo 배열에 저장됩니다.
미니포트 드라이버는 NET_BUFFER_LIST_TIMESTAMP 구조를 사용하여 NBL의 NetBufferListInfo 필드에 타임스탬프를 설정할 수 있습니다. 드라이버는 NET_BUFFER_LIST_TIMESTAMP 구조체의 타임스탬프 필드를 하드웨어에서 생성된 타임스탬프로 채우고 NdisSetNblTimestampInfo 유틸리티 함수를 호출하여 구조를 전달합니다.
미니포트 드라이버는 NdisGetNblTimestampInfo 및 NdisCopyNblTimestampInfo 사용하여 타임스탬프를 검색하고 복사할 수 있습니다.
특정 하드웨어 타임스탬프 설정을 사용하도록 설정했지만 해당 기능에 해당하는 타임스탬프가 생성되지 않은 경우 미니포트는 NBL에 연결하는 타임스탬프를 0으로 설정해야 합니다.
비고
하드웨어 타임스탬프를 생성하기 위해 PTP 버전 2 패킷을 인식할 때 구현은 PTP 사양에 의해 지정된 멀티캐스트 주소(IPv4 및 IPv6 둘 다)를 사용하는 패킷으로 타임스탬프 생성을 제한해서는 안 됩니다. 구현은 UDP 헤더 또는 PTP 페이로드를 사용하는 등 다른 방법으로 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로 보냅니다.
TaggedTransmitHw 기능 플래그가 지원되고 현재 사용하도록 설정되어 있다고 보고하는 미니포트 및 NIC 하드웨어는 전송을 위해 미니포트에 제공되는 NBL의 NblFlags 필드에 NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT 플래그가 설정되어 있는지 확인해야 합니다. 이 플래그를 설정하면 해당 NBL에 전송 시간 타임스탬프가 필요하고 NBL에 대해 전송 시간 하드웨어 타임스탬프를 생성해야 했음을 나타냅니다.
소프트웨어 타임스탬프
NDIS_TIMESTAMP_CAPABILITY_FLAGS 구조의 AllReceiveSw, AllTransmitSw 및 TaggedTransmitSw 플래그는 미니포트가 소프트웨어 타임스탬프 생성을 지원하는지 여부를 나타냅니다.
소프트웨어 타임스탬프는 64비트 정수 값으로도 표시되며 하드웨어 타임스탬프와 NET_BUFFER(NBL) 구조의 NetBufferListInfo 배열에 동일한 슬롯에 저장됩니다.
소프트웨어 타임스탬프 기능이 있고 사용하도록 설정된 경우 미니포트 드라이버는 QPC(성능 카운터 값)를 사용하여 NBL의 타임스탬프를 설정합니다. 미니포트 드라이버는 다음을 수행해야 합니다.
KeQueryPerformanceCounter 호출하여 QPC를 가져옵니다.
NET_BUFFER_LIST_TIMESTAMP 구조체의 타임스탬프 필드를 QPC로 채우세요.
NdisSetNblTimestampInfo 호출하고 NET_BUFFER_LIST_TIMESTAMP전달하여 NBL에서 타임스탬프를 설정합니다.
수신 시 미니포트 드라이버는 가능한 한 빨리 QPC를 캡처해야 하지만 패킷이 도착한 시점보다 빠르지 않아야 합니다.
전송 시 미니포트 드라이버는 패킷이 전송을 위해 하드웨어에 제공되기 전에 가능한 한 늦게 QPC를 캡처해야 합니다.
TaggedTransmitSw 플래그는 TaggedTransmitHw 플래그와 유사하지만 소프트웨어 타임스탬프에 해당합니다. 기능이 지원되고 사용하도록 설정된 경우 미니포트는 NBL의 NblFlags 필드에서 NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT 플래그를 확인해야 합니다. 이 플래그가 설정되면 미니포트는 NBL에 대한 전송 시간 소프트웨어 타임스탬프를 생성해야 합니다.