Удаление виртуального порта

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

Элемент InformationBuffer структуры NDIS_OID_REQUEST содержит указатель на структуру NDIS_NIC_SWITCH_DELETE_VPORT_PARAMETERS.

Вышестоящий драйвер, например стек виртуализации, может удалить нестандартный VPort, созданный ранее. Накладываемый драйвер создает VPort, отправляя метод запроса OID OID_NIC_SWITCH_CREATE_VPORT.

Прежде чем выдается запрос набора OID_NIC_SWITCH_DELETE_VPORT, переопределяющий драйвер должен выполнить следующее:

  • Перед удалением VPort вышележащие драйверы должны очистить или переместить все фильтры получения, которые драйвер ранее установил на VPort. Фильтры получения задаются через запросы OID OID_RECEIVE_FILTER_SET_FILTER и перемещаются через запросы OID OID_RECEIVE_FILTER_MOVE_FILTER.

  • Переопределяющий драйвер устанавливает элемент VPortId структуры NDIS_NIC_SWITCH_DELETE_VPORT_PARAMETERS на идентификатор нестандартного виртуального порта (VPort), который необходимо удалить.

    Заметка Вышестоящий драйвер не должен задавать члену VPortIdзначение NDIS_DEFAULT_PORT_NUMBER. Этот идентификатор VPort зарезервирован для стандартного VPort, подключенного к физической функции PCI Express (PCIe) на сетевом адаптере. VPort по умолчанию всегда существует и не удаляется даже через запрос набора OID OID_NIC_SWITCH_DELETE_VPORT.

Верхний драйвер вызывает NdisOidRequest, чтобы отправить запрос OID_NIC_SWITCH_DELETE_VPORT базовому драйверу мини-порта PF. Когда драйвер минипорта получает запрос OID_NIC_SWITCH_DELETE_VPORT, драйвер должен выполнить следующее:

  • Драйвер должен освободить аппаратные и программные ресурсы, выделенные для указанного VPort.

  • Драйвер должен отсоединить указанный VPort от PF или виртуальной функции PCIe (VF).

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

    Если VPort подключен к PF, драйвер мини-порта PF должен остановить любую дополнительную DMA к общей памяти, связанной с VPort. Драйвер мини-порта PF должен убедиться, что все ранее полученные пакеты из VPort возвращаются в мини-порт. Драйвер мини-порта PF не должен делать никаких дополнительных индикаторов приема в NDIS, которые указывают идентификатор VPort в структуре NET_BUFFER_LIST пакета. После возврата всех указанных пакетов из VPort в минипорт драйвера PF, драйвер должен освободить общую память, связанную с VPort, вызвав NdisFreeSharedMemory.

К удалению VPorts применяются следующие моменты:

  • Перед вызовом NdisCloseAdapterEx драйвер протокола должен удалить все созданные им VPorts, которые не являются стандартными.

  • Драйвер фильтра должен удалить все VPorts, которые не являются стандартными, созданные в своей функции FilterDetach.

  • Прежде чем NDIS отправляет запрос OID_NIC_SWITCH_DELETE_SWITCH на удаление коммутатора на сетевом адаптере, он гарантирует, что из этого коммутатора удалены все VPort'ы, которые не являются по умолчанию.

  • С помощью запросов OID_NIC_SWITCH_DELETE_SWITCH можно явным образом удалить только не установленные по умолчанию виртуальные порты. Виртуальный порт по умолчанию неявно удаляется, когда драйвер мини-порта PF удаляет переключатель сетевого адаптера по умолчанию. Для получения дополнительной информации см. Удаление коммутатора сетевого адаптера.