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


Выделение очереди виртуальных машин

Чтобы выделить очередь с начальным набором параметров конфигурации, верхний драйвер выдает метод OID запрос OID_RECEIVE_FILTER_ALLOCATE_QUEUE. Элемент InformationBuffer структуры NDIS_OID_REQUEST изначально содержит указатель на структуру NDIS_RECEIVE_QUEUE_PARAMETERS . После успешного возврата из запроса метода OID, элемент InformationBuffer структуры NDIS_OID_REQUEST указывает на структуру NDIS_RECEIVE_QUEUE_PARAMETERS, которая содержит новый идентификатор очереди и запись таблицы MSI-X.

Структура NDIS_RECEIVE_QUEUE_PARAMETERS используется в OID OID_RECEIVE_FILTER_ALLOCATE_QUEUE и OID_RECEIVE_FILTER_QUEUE_PARAMETERS. Дополнительные сведения о параметрах очереди виртуальных машин см. в разделе "Получение и обновление параметров очереди виртуальных машин".

Накладывающийся драйвер инициализирует структуру NDIS_RECEIVE_QUEUE_PARAMETERS со следующими параметрами конфигурации очереди:

  • Тип очереди (NdisReceiveQueueTypeVMQueue из перечисления NDIS_RECEIVE_QUEUE_TYPE.)

  • Привязка процессора к очереди.

  • Имя очереди и имя виртуальной машины.

  • Параметры предварительного разделения.

    Примечание Начиная с NDIS 6.30, разделение данных пакетов на отдельные буферы lookahead больше не поддерживается.

Заметка Верхний уровень драйвер может установить флаги NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION и NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED в члене Flags структуры NDIS_RECEIVE_QUEUE_PARAMETERS. Другие флаги не используются для выделения очереди.

Когда NDIS получает запрос OID для выделения очереди получения, он проверяет параметры очереди. После того как NDIS выделяет необходимые ресурсы и идентификатор очереди, он отправляет запрос OID на базовый минипорт-драйвер. Идентификатор очереди является уникальным для связанного сетевого адаптера.

Если минипорт-драйвер может успешно выделить необходимые программные и аппаратные ресурсы для очереди получения, он завершает запрос OID с успешным статусом.

Прежде чем NDIS отправляет запрос OID драйверу минипорта, NDIS назначает идентификатор очереди в элементе QueueId структуры NDIS_RECEIVE_QUEUE_PARAMETERS и передает запрос метода драйверу мини-порта. Минипорт-драйвер предоставляет запись таблицы MSI-X в поле MSIXTableEntry.

Минипорт-драйвер должен хранить идентификаторы очереди для выделенных очередей приёма. NDIS использует идентификатор очереди получения для последующих вызовов драйвера минипорта, чтобы задать фильтр получения в очереди получения, изменить параметры очереди получения или освободить очередь получения.

Заметка Очередь по умолчанию (ноль идентификатора очереди) всегда выделяется и не может быть освобождена.

Вышележащий драйвер должен использовать идентификатор очереди, который NDIS предоставляет в последующих запросах OID, например, для изменения параметров очереди или освобождения очереди. Идентификатор очереди также включается в данные OOB для всех NET_BUFFER_LIST структур, связанных с очередью. Драйверы используют макрос NET_BUFFER_LIST_RECEIVE_QUEUE_ID для получения идентификатора очереди в структуре NET_BUFFER_LIST.

Заметка Драйвер протокола может задать фильтры VMQ в любое время после успешного выделения очереди и перед удалением очереди.

Драйвер протокола выдает запрос OID метода OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE для завершения выделения очереди. Минипорт-драйвер может выделить общую память и другие ресурсы после завершения выделения. Дополнительные сведения о выделении ресурсов общей памяти см. в разделе "Выделение ресурсов общей памяти".

После того как минипорт-драйвер получает запрос OID_RECEIVE_FILTER_QUEUE_ALLOCATION и обрабатывает его успешно, очередь находится в состоянии Выделено. Для получения более подробной информации о состояниях очередей см. раздел Состояния очередей и операций.

После того как верхний драйвер выделит одну или несколько очередей получения (и при необходимости задаст начальные фильтры), он должен выдавать сетевые запросы OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE, чтобы уведомить минипорт-драйвер о завершении выделения в рамках текущего пакета очередей получения.

Минипорт-драйвер не должен хранить пакеты в очереди получения, если в этой очереди нет фильтров. Если очередь никогда не имела наборов фильтров или все фильтры были удалены, очередь должна быть пуста, а все пакеты должны быть удалены. То есть они не указываются в стеке драйверов и не сохраняются в очереди.

Вышележащие драйверы используют OID_RECEIVE_FILTER_FREE_QUEUE OID для освобождения очередей, которые они выделяют. Дополнительные сведения о освобождении очередей см. в разделе "Освобождение очереди виртуальных машин".