Добавление данных порта назначения расширяемого коммутатора в пакет

В этом разделе описывается, как расширения переадресации расширяемого коммутатора Hyper-V могут указывать доставку пакетов на один или несколько конечных портов. Эти расширения также могут пересылать пакеты отдельным физическим сетевым адаптерам, привязанным к внешнему сетевому адаптеру расширяемого коммутатора.

Примечание Только расширение переадресации или сам коммутатор может пересылать пакеты в расширяемые порты коммутатора или отдельные сетевые адаптеры.

На следующем рисунке показан путь к данным для трафика пакетов через стек драйверов расширяемого коммутатора для NDIS 6.40 (Windows Server 2012 R2) и более поздних версий. На обоих рисунках также показан путь к данным для трафика пакетов к или из сетевых адаптеров, подключенных к портам расширяемого коммутатора.

Блок-схема, показывающая путь к данным для трафика пакетов к сетевым адаптерам или из нее, подключенным к портам расширяемого коммутатора для NDIS 6.40 (Windows Server 2012 R2) и более поздних версий.

На следующем рисунке показан путь к данным для трафика пакетов через стек драйверов расширяемого коммутатора для NDIS 6.30 (Windows Server 2012).

Блок-схема, показывающая путь к данным для трафика пакетов к сетевым адаптерам или из нее, подключенным к портам расширяемого коммутатора для NDIS 6.30 (Windows Server 2012).

Каждый порт назначения расширяемого коммутатора задается элементом NDIS_SWITCH_PORT_DESTINATION в структуре NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Этот массив содержится в контексте внеполосной пересылки (OOB) структуры NET_BUFFER_LIST пакета. Дополнительные сведения об этом контексте см. в статье Контекст переадресации расширяемого коммутатора Hyper-V.

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

Примечание Если расширение переадресации не привязано или не включено в стеке драйверов, расширяемый коммутатор определяет порты назначения для пакетов, получаемых из пути данных входящего трафика.

При определении портов назначения для пакета, полученного по пути входящего трафика, расширение переадресации должно следовать следующим рекомендациям:

  • Расширение должно инициализировать структуру NDIS_SWITCH_PORT_DESTINATION в структуре NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY с помощью сведений о портах назначения.

    Если порт назначения не подключен к внешнему сетевому адаптеру, расширение должно задать для элемента NicIndex структуры NDIS_SWITCH_PORT_DESTINATIONзначение NDIS_SWITCH_DEFAULT_NIC_INDEX.

    Если порт назначения подключен к внешнему сетевому адаптеру расширяемого коммутатора, расширение может указать индекс базового физического сетевого адаптера для переадресации запроса на отправку. Расширение делает это, задав члену NicIndex ненулевое значение NDIS_SWITCH_NIC_INDEX сетевого адаптера назначения, привязанного к внешнему сетевому адаптеру.

    Дополнительные сведения см. в разделе Пересылка пакетов в физические сетевые адаптеры.

  • Расширение должно добавлять порты назначения к данным OOB пакета только для тех портов, которые имеют активные подключения к сетевому адаптеру. Если расширение перенаправило запрос OID_SWITCH_NIC_DISCONNECT , оно не должно добавлять порт назначения, связанный с отключенным сетевым адаптером.

  • Чтобы повысить производительность, расширение должно добавлять только порты назначения, допустимые для доставки пакетов. В этом случае расширение должно задать для элемента IsExcluded структуры NDIS_SWITCH_PORT_DESTINATION порта назначения значение FALSE.

  • Чтобы сохранить данные виртуальной локальной сети (VLAN) 802.1Q в пакете перед их доставкой на порт, расширение устанавливает для элемента PreserveVLAN значение TRUE.

    Чтобы удалить данные виртуальной локальной сети (VLAN) 802.1Q в пакете перед их доставкой на порт, расширение устанавливает для элемента PreserveVLAN значение FALSE.

  • Чтобы сохранить данные приоритета 802.1Q в пакете перед их доставкой на порт, расширение устанавливает для элемента PreservePriority значение TRUE.

    Чтобы удалить данные приоритета 802.1Q в пакете перед их доставкой на порт, расширение устанавливает для элемента PreservePriority значение FALSE.

  • Если расширение переадресации добавляет несколько конечных портов для пакета, оно должно выполнить следующие действия:

    1. Сначала расширение обращается к NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO структуре пакета с помощью макроса NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . Затем расширение считывает элемент NumAvailableDestinations , чтобы определить, сколько неиспользуемых элементов порта назначения доступно в массиве портов назначения. Если расширению требуется больше портов назначения, чем доступно в массиве, он должен вызвать функцию GrowNetBufferListDestinations , чтобы выделить место для дополнительных конечных портов в массиве.

      Когда расширение вызывает GrowNetBufferListDestinations, оно задает для параметра NumberOfNewDestinations число новых портов назначения, добавляемых в пакет.

      Расширение также задает для параметра NetBufferLists указатель на структуру NET_BUFFER_LIST пакета.

      Примечание Если в массиве есть доступные порты назначения, расширение не должно вызывать GrowNetBufferListDestinations.

    2. Если функция GrowNetBufferListDestinations возвращается успешно, она добавила дополнительные порты назначения в конец массива назначения в структуре NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Указатель на эту структуру возвращается в параметре Destinations .

      Примечание Если функция GrowNetBufferListDestinations не может выделить требуемое количество портов назначения, она возвращает NDIS_STATUS_RESOURCES.

    3. Расширение задает новые элементы порта назначения в структуре NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Расширение инициализирует каждый новый порт назначения как NDIS_SWITCH_PORT_DESTINATION структуру.

      Расширение инициализирует новые порты назначения для массива, начиная со смещения NumDestinations . NumDestinations является членом структуры NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY .

    4. После завершения добавления или изменения элементов порта назначения расширение должно вызвать UpdateNetBufferListDestinations , чтобы зафиксировать эти изменения.

  • Если расширение добавляет один порт назначения для пакета, оно должно выполнить следующие действия:

    1. Расширение инициализирует сведения о порте назначения для пакета в структуре, выделенной расширением NDIS_SWITCH_PORT_DESTINATION .

    2. Расширение вызывает Метод AddNetBufferListDestination , чтобы зафиксировать изменения в структуре NET_BUFFER_LIST пакета. Расширение передает адрес структуры NDIS_SWITCH_PORT_DESTINATION в параметре Destination .

      Примечание Расширение не должно вызывать функцию UpdateNetBufferListDestinations , чтобы зафиксировать изменения в пакете только с одним портом назначения.

  • Когда расширение переадресации вызывает AddNetBufferListDestination или UpdateNetBufferListDestinations для фиксации изменений для портов назначения, расширяемый интерфейс коммутатора не удаляет расширяемые порты коммутатора, указанные в элементах структуры NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . После завершения операции отправки или получения пакетов интерфейс может при необходимости удалить порт.

    Примечание После того как расширение переадресации зафиксирует изменения портов назначения в контексте переадресации, конечные порты нельзя удалить, и можно изменить только элемент IsExcludedструктуры NDIS_SWITCH_PORT_DESTINATION порта назначения. Дополнительные сведения см. в разделе Исключение доставки пакетов в порты назначения расширяемого коммутатора.

  • Расширение переадресации должно синхронизировать свою обработку запросов на набор идентификаторов объектов (OID) OID_SWITCH_NIC_DISCONNECT со своим кодом, который добавляет порты назначения для отключенного сетевого адаптера.

    Если для запроса OID_SWITCH_NIC_DISCONNECT вызывается filterOidRequest расширения переадресации, расширение может выполнить одно из следующих действий:

    • Если расширение с именем NdisFOidRequest перенаправит этот запрос OID, оно не должно указывать порт с отключенным сетевым адаптером в качестве порта назначения для пакета.

      Примечание Если единственным портом назначения для пакета является порт с отключенным сетевым адаптером, расширение должно удалить пакет.

    • Расширение может возвращать NDIS_STATUS_PENDING для асинхронного выполнения запроса. Это позволяет расширению добавить порт с отключенным сетевым адаптером в качестве порта назначения для пакета. Это также позволяет расширению вызывать AddNetBufferListDestination или UpdateNetBufferListDestinations и завершить добавление портов назначения в пакет.

      Расширение может захотеть сделать это для пакетов, которые ему нужно перенаправить на порт, прежде чем он будет удален.

      Примечание Если расширение возвращает NDIS_STATUS_PENDING, оно также может вызвать ReferenceSwitchPort для увеличения счетчика ссылок для порта с отключенным сетевым адаптером. Однако расширение не может перенаправить запрос OID до тех пор, пока не вызовет DereferenceSwitchPort для уменьшения счетчика ссылок для порта.

  • Если число конечных портов равно нулю, расширение переадресации должно вызвать NdisMSendNetBufferListsComplete , чтобы удалить пакет. Расширение также должно вызывать ReportFilteredNetBufferLists , чтобы уведомить интерфейс расширяемого коммутатора об удаленном пакете.

    Примечание Если расширение переадресации получило связанный список структур NET_BUFFER_LIST для нескольких пакетов из пути к данным входящего трафика, оно должно создать отдельный список удаленных пакетов. При этом расширение может вызывать NdisMSendNetBufferListsComplete и ReportFilteredNetBufferLists только один раз.

  • Если число портов назначения больше нуля, расширение переадресации должно вызвать NdisFSendNetBufferLists , чтобы перенаправить пакет по пути данных входящего трафика на границу мини-порта расширяемого коммутатора.

    Примечание Если расширение переадресации получило связанный список структур NET_BUFFER_LIST для нескольких пакетов из пути данных входящего трафика, оно должно создать отдельный список пересылаемых пакетов. Таким образом, расширение может вызывать NdisFSendNetBufferLists только один раз для пересылки списка пакетов. Кроме того, расширение должно поддерживать отдельные списки для пересылки пакетов с одинаковыми портами назначения. Дополнительные сведения см. в статье Флаги отправки и получения расширяемого коммутатора Hyper-V.