Присоединение меток времени к пакетам
После того как драйвер мини-порта сообщит, какие возможности меток времени существуют и включены в данный момент, драйвер может прикрепить соответствующие метки времени к пакетам с помощью структуры NET_BUFFER_LIST (NBL).
Дополнительные сведения о возможностях аппаратной метки времени сетевой карты и возможностях программной метки времени драйвера мини-порта в операционную систему см. в статье Возможности создания меток времени и текущая конфигурация.
Метки времени оборудования
Флаги PtpV2OverUdpIPv4EventMsgReceiveHw
, PtpV2OverUdpIPv4AllMsgReceiveHw
, PtpV2OverUdpIPv4EventMsgTransmitHw
, PtpV2OverUdpIPv6EventMsgReceiveHw
PtpV2OverUdpIPv4AllMsgTransmitHw
, PtpV2OverUdpIPv6AllMsgReceiveHw
, PtpV2OverUdpIPv6EventMsgTransmitHw
, , PtpV2OverUdpIPv6AllMsgTransmitHw
, AllReceiveHw
, и AllTransmitHw
TaggedTransmitHw
в структуре NDIS_TIMESTAMP_CAPABILITY_FLAGS указывают, какие аппаратные метки времени поддерживает драйвер мини-порта.
Метка времени, которую оборудование сетевой карты создает при приеме или передаче пакета, представлена 64-разрядным целочисленным значением. Это должно быть необработанное значение часов оборудования сетевой карты в момент записи метки времени. Метка времени хранится в массиве NetBufferListInfo структуры NBL.
Драйверы минипорта могут использовать структуру NET_BUFFER_LIST_TIMESTAMP , чтобы задать метку времени в поле NetBufferListInfo NBL. Драйвер заполняет поле Timestamp структуры NET_BUFFER_LIST_TIMESTAMP меткой времени, созданной оборудованием, и вызывает служебную функцию NdisSetNblTimestampInfo , передав структуру.
Драйверы miniport могут использовать NdisGetNblTimestampInfo и NdisCopyNblTimestampInfo для получения и копирования меток времени.
Если определенный параметр метки времени оборудования включен, но метка времени, соответствующая этой возможности, не создается, мини-порт должен установить метку времени, присоединенную к NBL, равным нулю.
Примечание
При распознавании пакетов PTP версии 2 для создания аппаратных меток времени реализация не должна ограничивать создание меток времени пакетами, используюющими адреса многоадресной рассылки (как IPv4, так и IPv6), которые указаны в спецификации PTP. Реализация должна пытаться распознавать PTP-пакеты другими способами, например с помощью заголовка UDP или полезных данных PTP. Это значит, что метки времени по-прежнему создаются в сценариях, где реализация PTP может не использовать адреса многоадресной рассылки, указанные в спецификации PTP, например, когда используются одноадресные адреса.
Метка времени на стороне получения
Оборудование должно получить метку времени как можно ближе к точке, когда оборудование получает кадр из среды. Это руководство определяется стандартом IEEE 1588.
При получении пакета драйвер мини-порта должен:
Исправьте метку времени для всех задержек, которые существуют между моментом, когда оборудование захватило метку времени и когда оборудование фактически получило кадр.
Присоедините метку времени, созданную на оборудовании, к NBL. Метка времени соответствует кадру (NET_BUFFER структуре), содержащейся в NBL.
Вызовите NdisMIndicateReceiveNetBufferLists , чтобы указать NBL в NDIS.
Обратите внимание, что в направлении приема драйверы минипорта для оборудования Ethernet должны указывать только один NET_BUFFER на NBL.
Метка времени боковой передачи
Оборудование должно получить метку времени как можно ближе к точке, когда оборудование передает кадр в среду. Это руководство определяется стандартом IEEE 1588.
При передаче пакета драйвер мини-порта должен:
Исправьте метку времени для всех задержек, которые существуют между моментом, когда оборудование захватило метку времени и когда оборудование фактически передало кадр.
Присоедините метку времени, созданную на оборудовании, к NBL. Если NBL содержит несколько NET_BUFFER, метка времени оборудования, соответствующая первому NET_BUFFER в NBL, должна быть присоединена к NBL.
Вызовите NdisMSendNetBufferListsComplete , чтобы отправить полный NBL в NDIS.
Минипорты и сетевой адаптер оборудования, сообщающие о том, что TaggedTransmitHw
флаг возможности поддерживается и в настоящее время включен, должны проверка, если NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT
флаг установлен в поле NblFlags NBL, предоставленного минипорту для передачи. Если этот флаг установлен, это означает, что для этого NBL требуется метка времени передачи и что для NBL должна быть создана аппаратная метка времени передачи.
Метки времени программного обеспечения
Флаги AllReceiveSw
, AllTransmitSw
и TaggedTransmitSw
в структуре NDIS_TIMESTAMP_CAPABILITY_FLAGS указывают, поддерживает ли минипорт создание меток времени программного обеспечения.
Программные метки времени также представлены в виде 64-разрядных целочисленных значений и хранятся в том же слоте в массиве NetBufferListInfo структуры NET_BUFFER (NBL) в качестве аппаратных меток времени.
Если возможности программной метки времени присутствуют и включены, драйвер мини-порта устанавливает метку времени в NBL с помощью значения счетчика производительности (QPC). Драйвер мини-порта должен:
Вызовите KeQueryPerformanceCounter , чтобы получить QPC.
Заполните поле Timestamp структуры NET_BUFFER_LIST_TIMESTAMP QPC.
Задайте метку времени в NBL, вызвав NdisSetNblTimestampInfo и передав NET_BUFFER_LIST_TIMESTAMP.
При получении драйвер мини-порта должен записать QPC как можно раньше, но не раньше, чем когда поступил пакет.
При передаче драйвер мини-порта должен записать QPC как можно позже, прежде чем пакет будет передан оборудованию для передачи.
Флаг TaggedTransmitSw
аналогиен флагу, TaggedTransmitHw
но соответствует меткам времени программного обеспечения. Если эта возможность поддерживается и включена, мини-порт должен проверка NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT
флаг в поле NblFlags NBL. Если этот флаг установлен, минипорт должен создать метку времени передачи программного обеспечения времени для NBL.