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


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

Чтобы выделить очередь с начальным набором параметров конфигурации, избыточный драйвер выдает запрос 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_RECEIVE_FILTER_ALLOCATE_QUEUE OID и OID_RECEIVE_FILTER_QUEUE_PARAMETERS OID. Дополнительные сведения о параметрах очереди виртуальных машин см. в статье Получение и обновление параметров очереди виртуальной машины.

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

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

  • Сходство процессора для очереди.

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

  • Параметры lookahead-split.

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

Примечание Драйвер overlying может задать флаги 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 и успешно обрабатывает его, очередь находится в состоянии "Выделено ". Дополнительные сведения о состояниях очереди см. в разделе Состояния очереди и операции.

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

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

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