Присоединение меток времени к пакетам

После того как драйвер мини-порта сообщит, какие возможности меток времени существуют и включены в данный момент, драйвер может прикрепить соответствующие метки времени к пакетам с помощью структуры NET_BUFFER_LIST (NBL).

Дополнительные сведения о возможностях аппаратной метки времени сетевой карты и возможностях программной метки времени драйвера мини-порта в операционную систему см. в статье Возможности создания меток времени и текущая конфигурация.

Метки времени оборудования

Флаги PtpV2OverUdpIPv4EventMsgReceiveHw, PtpV2OverUdpIPv4AllMsgReceiveHw, PtpV2OverUdpIPv4EventMsgTransmitHw, PtpV2OverUdpIPv6EventMsgReceiveHwPtpV2OverUdpIPv4AllMsgTransmitHw, PtpV2OverUdpIPv6AllMsgReceiveHw, PtpV2OverUdpIPv6EventMsgTransmitHw, , PtpV2OverUdpIPv6AllMsgTransmitHw, AllReceiveHw, и AllTransmitHwTaggedTransmitHw в структуре 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.

При получении пакета драйвер мини-порта должен:

  1. Исправьте метку времени для всех задержек, которые существуют между моментом, когда оборудование захватило метку времени и когда оборудование фактически получило кадр.

  2. Присоедините метку времени, созданную на оборудовании, к NBL. Метка времени соответствует кадру (NET_BUFFER структуре), содержащейся в NBL.

  3. Вызовите NdisMIndicateReceiveNetBufferLists , чтобы указать NBL в NDIS.

Обратите внимание, что в направлении приема драйверы минипорта для оборудования Ethernet должны указывать только один NET_BUFFER на NBL.

Метка времени боковой передачи

Оборудование должно получить метку времени как можно ближе к точке, когда оборудование передает кадр в среду. Это руководство определяется стандартом IEEE 1588.

При передаче пакета драйвер мини-порта должен:

  1. Исправьте метку времени для всех задержек, которые существуют между моментом, когда оборудование захватило метку времени и когда оборудование фактически передало кадр.

  2. Присоедините метку времени, созданную на оборудовании, к NBL. Если NBL содержит несколько NET_BUFFER, метка времени оборудования, соответствующая первому NET_BUFFER в NBL, должна быть присоединена к NBL.

  3. Вызовите 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). Драйвер мини-порта должен:

  1. Вызовите KeQueryPerformanceCounter , чтобы получить QPC.

  2. Заполните поле Timestamp структуры NET_BUFFER_LIST_TIMESTAMP QPC.

  3. Задайте метку времени в NBL, вызвав NdisSetNblTimestampInfo и передав NET_BUFFER_LIST_TIMESTAMP.

При получении драйвер мини-порта должен записать QPC как можно раньше, но не раньше, чем когда поступил пакет.

При передаче драйвер мини-порта должен записать QPC как можно позже, прежде чем пакет будет передан оборудованию для передачи.

Флаг TaggedTransmitSw аналогиен флагу, TaggedTransmitHw но соответствует меткам времени программного обеспечения. Если эта возможность поддерживается и включена, мини-порт должен проверка NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT флаг в поле NblFlags NBL. Если этот флаг установлен, минипорт должен создать метку времени передачи программного обеспечения времени для NBL.