패킷에 타임스탬프 연결

미니포트 드라이버가 어떤 타임스탬프 기능이 있고 현재 사용하도록 설정되어 있는지 보고한 후 드라이버는 NBL( NET_BUFFER_LIST ) 구조를 사용하여 관련 타임스탬프를 패킷에 연결할 수 있습니다.

NIC의 하드웨어 타임스탬프 기능 및 미니포트 드라이버의 소프트웨어 타임스탬프 기능을 운영 체제에 보고하는 방법에 대한 자세한 내용은 타임스탬프 기능 및 현재 구성 보고를 참조하세요.

하드웨어 타임스탬프

NDIS_TIMESTAMP_CAPABILITY_FLAGS 구조의 , PtpV2OverUdpIPv4AllMsgTransmitHwPtpV2OverUdpIPv6EventMsgReceiveHwPtpV2OverUdpIPv6AllMsgTransmitHwPtpV2OverUdpIPv6AllMsgReceiveHwPtpV2OverUdpIPv4EventMsgTransmitHwPtpV2OverUdpIPv4AllMsgReceiveHwPtpV2OverUdpIPv6EventMsgTransmitHw, , AllReceiveHwTaggedTransmitHwAllTransmitHw 플래그는 PtpV2OverUdpIPv4EventMsgReceiveHw미니포트 드라이버가 지원하는 하드웨어 타임스탬프를 나타냅니다.

패킷의 수신 또는 전송 시 NIC 하드웨어가 생성하는 타임스탬프는 64비트 정수 값으로 표시됩니다. 타임스탬프가 캡처되는 지점에서 NIC 하드웨어 시계의 원시 값이어야 합니다. 타임스탬프는 NBL 구조체의 NetBufferListInfo 배열에 저장됩니다.

미니포트 드라이버는 NET_BUFFER_LIST_TIMESTAMP 구조를 사용하여 NBL의 NetBufferListInfo 필드에 타임스탬프를 설정할 수 있습니다. 드라이버는 NET_BUFFER_LIST_TIMESTAMP 구조체의 타임스탬프 필드를 하드웨어에서 생성된 타임스탬프로 채우고 NdisSetNblTimestampInfo 유틸리티 함수를 호출하여 구조를 전달합니다.

미니포트 드라이버는 NdisGetNblTimestampInfoNdisCopyNblTimestampInfo 를 사용하여 타임스탬프를 검색하고 복사할 수 있습니다.

특정 하드웨어 타임스탬프 설정을 사용하도록 설정했지만 해당 기능에 해당하는 타임스탬프가 생성되지 않은 경우 미니포트는 NBL에 연결하는 타임스탬프를 0으로 설정해야 합니다.

참고

하드웨어 타임스탬프를 생성하기 위해 PTP 버전 2 패킷을 인식할 때 구현은 타임스탬프 생성을 PTP 사양에 지정된 멀티캐스트 주소(IPv4 및 IPv6 모두)를 사용하는 패킷으로 제한해서는 안 됩니다. 구현은 UDP 헤더 또는 PTP 페이로드를 사용하는 등 다른 방법으로 PTP 패킷을 인식하려고 시도해야 합니다. 따라서 PTP 구현이 PTP 사양에 지정된 멀티캐스트 주소(예: 유니캐스트 주소가 사용되는 경우)를 사용하지 않을 수 있는 시나리오에서는 타임스탬프가 여전히 생성됩니다.

사이드 타임스탬프 받기

하드웨어는 하드웨어가 매체에서 프레임을 수신하는 시점에 최대한 가깝게 타임스탬프를 가져와야 합니다. 이 지침은 IEEE 1588 표준에 의해 지정됩니다.

패킷이 수신되면 미니포트 드라이버는 다음을 수행해야 합니다.

  1. 하드웨어가 타임스탬프를 캡처한 시점과 하드웨어가 실제로 프레임을 수신한 시점 사이에 존재하는 지연에 대한 타임스탬프를 수정합니다.

  2. 하드웨어에서 생성된 타임스탬프를 NBL에 연결합니다. 타임스탬프는 NBL에 포함된 프레임(NET_BUFFER 구조)에 해당합니다.

  3. NdisMIndicateReceiveNetBufferLists를 호출하여 NBL을 NDIS로 나타냅니다.

수신 방향에서 이더넷 하드웨어용 미니포트 드라이버는 NBL당 NET_BUFFER 하나만 나타내야 합니다.

전송 쪽 타임스탬프

하드웨어는 하드웨어가 프레임을 매체로 전송하는 지점에 최대한 가깝게 타임스탬프를 가져와야 합니다. 이 지침은 IEEE 1588 표준에 의해 지정됩니다.

패킷이 전송되면 미니포트 드라이버는 다음을 수행해야 합니다.

  1. 하드웨어가 타임스탬프를 캡처한 시점과 하드웨어가 실제로 프레임을 전송한 시점 사이에 존재하는 지연에 대한 타임스탬프를 수정합니다.

  2. 하드웨어에서 생성된 타임스탬프를 NBL에 연결합니다. NBL에 여러 NET_BUFFER포함된 경우 NBL의 첫 번째 NET_BUFFER 해당하는 하드웨어 타임스탬프를 NBL에 연결해야 합니다.

  3. NdisMSendNetBufferListsComplete를 호출하여 NBL을 NDIS로 보냅니다.

기능 플래그가 지원되고 현재 사용하도록 설정되어 있음을 보고하는 TaggedTransmitHw 미니포트 및 NIC 하드웨어는 플래그가 전송을 위해 미니포트에 제공되는 NBL의 NblFlags 필드에 설정된 경우 NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT 검사 합니다. 이 플래그를 설정하면 해당 NBL에 전송 시간 타임스탬프가 필요하고 NBL에 대해 전송 시간 하드웨어 타임스탬프를 생성해야 했음을 나타냅니다.

소프트웨어 타임스탬프

NDIS_TIMESTAMP_CAPABILITY_FLAGS 구조의 및 AllTransmitSwTaggedTransmitSw 플래그는 AllReceiveSw미니포트가 소프트웨어 타임스탬프 생성을 지원하는지 여부를 나타냅니다.

소프트웨어 타임스탬프는 64비트 정수 값으로도 표시되며 NBL(NET_BUFFER) 구조체의 NetBufferListInfo 배열에서 하드웨어 타임스탬프와 동일한 슬롯에 저장됩니다.

소프트웨어 타임스탬프 기능이 있고 사용하도록 설정된 경우 미니포트 드라이버는 QPC(성능 카운터 값)를 사용하여 NBL에서 타임스탬프를 설정합니다. 미니포트 드라이버는 다음을 수행해야 합니다.

  1. KeQueryPerformanceCounter를 호출하여 QPC를 가져옵니다.

  2. NET_BUFFER_LIST_TIMESTAMP 구조체의 타임스탬프 필드를 QPC로 채웁니다.

  3. NdisSetNblTimestampInfo를 호출하고 NET_BUFFER_LIST_TIMESTAMP 전달하여 NBL에서 타임스탬프를 설정합니다.

수신 시 미니포트 드라이버는 가능한 한 빨리 QPC를 캡처해야 하지만 패킷이 도착한 시점보다 빠르지 않아야 합니다.

전송 시 미니포트 드라이버는 패킷이 전송을 위해 하드웨어에 제공되기 전에 가능한 한 늦게 QPC를 캡처해야 합니다.

플래그는 TaggedTransmitSw 플래그와 TaggedTransmitHw 유사하지만 소프트웨어 타임스탬프에 해당합니다. 기능이 지원되고 사용하도록 설정된 경우 미니포트는 NBL의 NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMITNblFlags 필드에 플래그를 검사 합니다. 이 플래그가 설정된 경우 미니포트는 NBL에 대한 전송 시간 소프트웨어 타임스탬프를 생성해야 합니다.