Создание виртуального порта
Виртуальный порт (VPort) — это объект данных, представляющий внутренний порт на коммутаторе сетевой карты сетевого адаптера, который поддерживает виртуализацию ввода-вывода с одним корнем (SR-IOV). Каждый коммутатор сетевой карты имеет следующие порты для сетевого подключения:
Один внешний физический порт для подключения к внешней физической сети.
Один или несколько внутренних виртуальных портов, подключенных к физической функции PCI Express (PCIe) или виртуальным функциям (VF).
PF подключен к родительскому разделу Hyper-V и предоставляется в виде виртуального сетевого адаптера в операционной системе управления, работающей в этом разделе.
Виртуальная машина подключена к дочернему разделу Hyper-V и предоставляется в качестве виртуального сетевого адаптера в гостевой операционной системе, работающей в этом разделе.
Существует два типа виртуальных портов:
VPort по умолчанию
VPort по умолчанию обеспечивает сетевое подключение к сетевым компонентам, работающим в операционной системе управления. VPort по умолчанию имеет идентификатор NDIS_DEFAULT_VPORT_ID.
Когда драйвер минипорта PF создает и настраивает коммутатор сетевого адаптера по умолчанию, драйвер неявно создает VPort по умолчанию и подключает его к PF. VPort по умолчанию не может быть подключен к VF.
VPort по умолчанию всегда находится в активированном состоянии и не может быть явно удален. Драйвер мини-порта PF неявно удаляет VPort по умолчанию только при удалении коммутатора сетевой карты по умолчанию.
Дополнительные сведения о том, как создать коммутатор сетевой карты и VPort по умолчанию на коммутаторе, см. в разделе Создание коммутатора сетевого адаптера.
Не по умолчанию VPort
Неразрешимые виртуальные порты не создаются неявно при создании коммутатора сетевой карты. Избыточный драйвер, например стек виртуализации, явно создает эти порты, отправляя запросы метода OID OID_NIC_SWITCH_CREATE_VPORT. Неотложимые виртуальные порты могут быть подключены к PF или VF и могут быть созданы только после создания коммутатора сетевой карты.
Неотложимый VPort, подключенный к виртуальной машине, обеспечивает сетевое подключение к сетевым компонентам, работающим в гостевой операционной системе. После его создания и присоединения к виртуальному файлу неразрешимый VPort находится в активированном состоянии.
Неотложимый VPort, подключенный к PF, предоставляет дополнительные возможности сетевой разгрузки для сетевых компонентов, работающих в операционной системе управления. Например, для предоставления возможностей разгрузки, аналогичных интерфейсу очереди виртуальных машин (VMQ), можно использовать неотделимые виртуальные порты в PF.
Примечание Неразрешимые виртуальные порты можно создать только после создания коммутатора сетевой карты.
Избыточный драйвер отправляет запрос метода идентификатора объекта (OID) для OID_NIC_SWITCH_CREATE_VPORT для создания нестандартного VPort на указанном коммутаторе сетевой карты. Этот запрос OID также подключает созданный VPort к PF сетевого адаптера или ранее выделенному виртуальному фонду.
Элемент InformationBuffer структуры NDIS_OID_REQUEST содержит указатель наструктуру NDIS_NIC_SWITCH_VPORT_PARAMETERS . После успешного возврата из запроса OID_NIC_SWITCH_CREATE_VPORT член VPortId структуры NDIS_NIC_SWITCH_VPORT_PARAMETERS имеет идентификатор VPort, который является уникальным в VPorts на коммутаторе сетевой карты.
Драйвер overlying инициализирует структуру NDIS_NIC_SWITCH_VPORT_PARAMETERS со сведениями о конфигурации создаваемого неdefault VPort. Сведения о конфигурации включают функцию PCIe, к которой подключен неdefault VPort, и количество пар очередей для неdefault VPort.
Когда он инициализирует структуру NDIS_NIC_SWITCH_VPORT_PARAMETERS , драйвер overlying должен сделать следующее:
Для элемента SwitchId необходимо задать идентификатор коммутатора сетевого адаптера, который ранее был создан в сетевом адаптере с помощью запроса метода OID OID_NIC_SWITCH_CREATE_SWITCH.
Примечание Начиная с Windows Server 2012 интерфейс SR-IOV поддерживает только один коммутатор сетевого адаптера. Этот параметр называется сетевым адаптером по умолчанию. При создании VPort, не являющегося стандартным, драйвер должен задать для элемента SwitchId идентификатор NDIS_DEFAULT_SWITCH_ID.
Для элемента VPortId необходимо задать значение NDIS_DEFAULT_VPORT_ID.
Для элемента AttachedFunctionId необходимо задать идентификатор VF или PF, к которому должен быть присоединен неdefault VPort.
Значение NDIS_PF_FUNCTION_ID указывает PF. В противном случае необходимо задать значение идентификатора виртуальногоf, ресурсы которого ранее были выделены с помощью запроса метода OID OID_NIC_SWITCH_ALLOCATE_VF.
Примечание Вложение VPort без изменений в VF или PF невозможно изменить после создания неотложенного VPort.
Драйвер overlying также может указать количество пар очередей, назначенных VPort. Пара очередей — это очередь передачи и получения в сетевом адаптере, назначенном VPort. Если сетевой адаптер поддерживает асимметричные пары очередей для виртуальных портов без определенных значений, драйвер overlying может указать разное количество пар очередей для каждого создаваемого драйвера VPort. Дополнительные сведения см. в разделе Симметричное и асимметричное назначение пар очередей.
Драйвер overlying вызывает NdisOidRequest , чтобы отправить запрос OID_NIC_SWITCH_CREATE_VPORT базовому драйверу мини-порта PF. Прежде чем NDIS перенаправит запрос метода OID драйверу мини-порта, он выполняет следующие действия:
NDIS проверяет параметры в структуре NDIS_NIC_SWITCH_VPORT_PARAMETERS . Если параметры находятся в ошибке, NDIS завершает запрос метода OID и не передает запрос драйверу минипорта PF.
NDIS назначает идентификатор для нестандартного VPort в диапазоне от одного до (NumVPorts– 1), где NumVPorts — это число VPorts, настроенное драйвером мини-порта в сетевом адаптере. Драйвер указывает это число в элементе NumVPortsструктуры NDIS_NIC_SWITCH_INFO . Драйвер возвращает эту структуру с помощью запроса OID OID_NIC_SWITCH_ENUM_SWITCHES.
Примечание Идентификатор VPort NDIS_DEFAULT_VPORT_ID зарезервирован для VPort по умолчанию, подключенного к PF на коммутаторе сетевого адаптера по умолчанию.
Назначенный идентификатор VPort однозначно идентифицирует неразрешимый VPort на коммутаторе сетевого адаптера.
- NDIS задает элемент VPortId структуры NDIS_NIC_SWITCH_VPORT_PARAMETERS с назначенным идентификатором VPort.
Когда драйверу минипорта PF отправляется запрос OID, драйвер выделяет аппаратные и программные ресурсы, связанные с указанным неразрешимый VPort. После успешного выделения всех ресурсов драйвер минипорта PF успешно завершает OID, возвращая NDIS_STATUS_SUCCESS из MiniportOidRequest.
Если запрос OID_NIC_SWITCH_CREATE_VPORT выполнен успешно, драйвер мини-порта PF и вышерасполагающий драйвер должны сохранить значение VPortId неdefault VPort для последовательных операций. Значение VPortId используется во время следующих операций:
NDIS и избыточные драйверы используют значение VPortId для идентификации неразрешенный VPort в последовательных запросах OID, связанных с этим VPort, таких как OID_NIC_SWITCH_VPORT_PARAMETERS и OID_NIC_SWITCH_DELETE_VPORT.
Во время операций отправки NDIS задает значение VPortId для идентификации VPort, из которого был отправлен пакет. Это значение указывается в NDIS_NET_BUFFER_LIST_FILTERING_INFO данныхNET_BUFFER_LIST структуры.
Во время операций получения драйвер мини-порта PF задает значение VPortId , в которое должен быть переадресован пакет. Это значение также указывается в данных OOB NDIS_NET_BUFFER_LIST_FILTERING_INFO структуры NET_BUFFER_LIST .
Следующие моменты относятся к созданию неотчетких виртуальных портов:
Фильтры получения для идентификаторов управления доступом к мультимедиа (MAC) и виртуальной локальной сети (VLAN) настраиваются в VPort после его создания. Избыточные драйверы динамически устанавливают эти фильтры получения путем выдачи запросов метода OID OID_RECEIVE_FILTER_SET_FILTER. Фильтры получения также можно перемещать из одного VPort в другой с помощью запросов на набор OID OID_RECEIVE_FILTER_MOVE_FILTER.
Неотложимый VPort, подключенный к VF, при его создании находится в состоянии активации. VPort не может быть отключен, если он подключен к VF.
Неотложимый VPort, подключенный к PF, при его создании находится в состоянии деактивации. Избыточный драйвер, например модуль расширяемого коммутатора Hyper-V, явным образом активирует неотложимый порт VPort, подключенный к PF после успешного создания VPort. Это делается путем отправки запроса метода OID OID_NIC_SWITCH_VPORT_PARAMETERS драйверу минипорта PF.
Когда драйвер overlying выдает этот запрос OID, он передает структуру NDIS_NIC_SWITCH_VPORT_PARAMETERS с членом VPortState , равным NdisNicSwitchVPortStateActivated.
После того как неразрешительный VPort находится в активированном состоянии, драйвер минипорта PF может выделить общую память для VPort, вызвав NdisAllocateSharedMemory. Драйвер должен задать для элемента VPortId в структуре NDIS_SHARED_MEMORY_PARAMETERS значение идентификатора VPort.
Примечание Если неразрешимый VPort находится в активированном состоянии, он устанавливается в состояние деактивирован только при удалении с помощью запроса на набор OID OID_NIC_SWITCH_DELETE_VPORT.