Поделиться через


Управление кольцевой сетью

Следуйте указаниям в этом разделе, чтобы управлять структурами NET_RING и их элементами во время передачи данных по сети. Правила в этом разделе описывают, какие элементы сетевых элементов могут изменять клиентские драйверы и когда в зависимости от сценария пути к данным, а также общие сведения, которые клиентские драйверы должны иметь в виду для этих структур.

Важно!

Клиентские драйверы должны придерживаться этих направлений на всех этапах разработки. Если драйвер клиента не соответствует этим указаниям при тестировании с помощью средства проверки драйверов, средство проверки драйверов сообщает о нарушении и запускает проверка ошибок на тестируемом устройстве.

NET_RING

При запуске родительской очереди пакетов NET_RING все индексы в круге инициализируются значением 0.

В следующей таблице описаны элементы сетевого круга, которые клиентские драйверы могут изменять.

Поле Драйвер клиента может изменяться
OSReserved1 Нет
ElementStride Нет
NumberOfElements Нет
ElementIndexMask Нет
Endindex Нет
OSReserved0 Нет
OSReserved2 Нет
Beginindex Да (обязательно)
NextIndex Да (необязательно) Примечание. Платформа никогда не считывает NextIndex.
Рабочая зона Да (необязательно) Примечание. Платформа никогда не считывает Scratch.
Буфер Нет

Клиентские драйверы не должны изменять члены этой структуры только для чтения, а также не должны увеличивать BeginIndex после EndIndex во время вызова EvtPacketQueueAdvance.

Дополнительные сведения о владении индексом в сетевых кольцах см. в статье Общие сведения о кругах сети.

NET_PACKET

Поля в NET_PACKET чувствительны к различным контекстам, в которых работает путь к данным. Указывает, задано ли поле Игнорировать пакета и принимает ли драйвер (Rx) или передает (Tx) пакет, изменяет набор правил, применяемый к пакету.

В следующей таблице приведены инструкции по драйверам в каждом сценарии.

Rx или Tx Пропустить поле задается... Примечания
Rx Клиентский драйвер
  • Во время Rx для клиентских драйверов задано значение Ignore при необходимости, и платформа считывает его. Клиентским драйверам не нужно читать Пропустить в любой момент во время Rx.
  • Если драйвер клиента задает поле Игнорировать во время Rx, то:
    • Клиентские драйверы должны записывать данные в поле Игнорировать при отмене операций Rx для любого пакета, который не был успешно запрограммирован на оборудование. Дополнительные сведения см. в разделе Отмена сетевых данных с помощью сетевых кругов.
    • Клиентские драйверы не должны связывать ресурсы с пакетом, так как они не будут освобождены.
  • Если драйвер клиента не задает поле Игнорировать во время Rx, то:
    • Клиентские драйверы должны заполнять FragmentIndex, FragmentCount и все поля в макете.
    • FragmentIndex должен находиться между BeginIndex включительно и endIndex монопольным в кольце фрагмента.
    • FragmentCount не может превышать количество фрагментов между BeginIndex включительно и EndIndex монопольным числом в кольце фрагмента.
    • Клиентские драйверы должны перемещать круг пакетов BeginIndex , если они перемещают соответствующее кольцо фрагмента BeginIndex.
    • Если после вызова EvtPacketQueueAdvance драйвер клиента увеличивает круг пакетов BeginIndex , драйвер также должен увеличить круг фрагментов BeginIndex после фрагментов этого пакета. Другими словами, кольцо фрагмента BeginIndex должно переместиться в EndIndex фрагментов предыдущего пакета.
Tx NetAdapterCx
  • Клиентские драйверы не должны изменять поля в любом пакете, за исключением Scratch.
  • Клиентские драйверы могут считывать значение Ignore , но никогда не должны выполнять запись в него.
  • Если пакет Tx игнорируется, драйвер не должен считывать никакие поля, кроме, возможно, для Scratch, если это необходимо.

NET_PACKET_LAYOUT

Во время операций Rx на поле МакетNET_PACKET распространяются следующие правила:

  • Все поля, кроме Reserved0 , должны быть инициализированы драйвером клиента.
  • Если параметр Layer2Type имеет значение NetPacketLayer2TypeEthernet, значение Layer2HeaderLength должно иметь значение 14 или больше.
  • Если для параметра Layer2Type задано значение NetPacketLayer2TypeNull, значение Layer2HeaderLength должно иметь значение 0.
  • Если Layer3Type является типом IPv4, значение Layer3HeaderLength должно иметь значение 20 или больше.
  • Если Layer3Type является типом IPv6, значение Layer3HeaderLength должно иметь значение 40 или больше.
  • Если параметр Layer4Type имеет значение Tcp, значение Layer4HeaderLength должно иметь значение 40 или больше.
  • Если параметр Layer4Type имеет значение Udp, значение Layer4HeaderLength должно иметь значение 8 или больше.
  • Поля типа слоя должны находиться в соответствующем диапазоне перечисления.

Макет не используется во время Tx.

NET_FRAGMENT

NET_FRAGMENT правила полей зависят от того, получает или передает драйвер, а также от того, присоединены ли буферы фрагментов к пакетам драйвером или платформой.

Rx или Tx Примечания
Rx
  • Клиентские драйверы не могут выполнять запись в поле OsReserved_Bounced .
  • Если драйвер не подключается, необходимо изменить емкость , но необходимо изменить ValidLength и Offset .
  • Если драйвер подключается, необходимо изменить capacity, ValidLength и Offset .
  • Смещение + Значение ValidLength должно быть меньше Емкости.
Tx
  • Клиентские драйверы не могут изменять поля, кроме scratch.