Добавление данных порта назначения расширяемого коммутатора в пакет
В этом разделе описывается, как Hyper-V расширяемые расширения переадресации коммутаторов могут указывать доставку пакетов в один или несколько конечных портов. Эти расширения также могут перенаправлять пакеты отдельным физическим сетевым адаптерам, привязанным к внешнему сетевому адаптеру расширяемого коммутатора.
Примечание только расширение пересылки или сам коммутатор может перенаправить пакеты на расширяемые порты коммутаторов или отдельные сетевые адаптеры.
На следующем рисунке показан путь к данным для трафика пакетов через стек драйверов расширяемого коммутатора для NDIS 6.40 (Windows Server 2012 R2) и более поздних версий. Оба рисунка также показывают путь передачи данных для трафика пакетов к сетевым адаптерам или от них, которые подключены к распределяемым портам коммутатора.
На следующем рисунке показан путь к данным для трафика пакетов через стек драйверов расширяемого коммутатора для 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.
Если расширение пересылки добавляет несколько конечных портов для пакета, необходимо выполнить следующие действия.
Расширение сначала обращается к структуре NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO пакета с помощью макроса NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL. Затем расширение считывает NumAvailableDestinations элемент, чтобы определить, сколько неиспользуемых элементов порта назначения доступны в массиве портов назначения. Если для расширения требуется больше портов назначения, чем доступно в массиве, необходимо вызвать функцию GrowNetBufferListDestinations, чтобы выделить пространство для дополнительных конечных портов в массиве.
Когда расширение вызывает GrowNetBufferListDestinations, оно задает параметр NumberOfNewDestinations число новых портов назначения, добавляемых в пакет.
Расширение также задает параметр NetBufferLists указателем на структуру NET_BUFFER_LIST пакета.
Примечание Если в массиве есть доступные порты назначения, расширение не должно вызывать GrowNetBufferListDestinations.
Если функция GrowNetBufferListDestinations успешно возвращается, она добавила дополнительные порты назначения в конец целевого массива в структуре NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. Указатель на эту структуру возвращается в параметре назначения.
примечание Если функция GrowNetBufferListDestinations не может выделить запрошенное количество конечных портов, она возвращает NDIS_STATUS_RESOURCES.
Расширение задает новые элементы порта назначения в структуре NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. Расширение инициализирует каждый новый порт назначения как структуру NDIS_SWITCH_PORT_DESTINATION.
Расширение инициализирует новые порты назначения для массива, начиная с offset NumDestinations. NumDestinations является членом структуры NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY.
После завершения добавления или изменения элементов порта назначения необходимо вызвать UpdateNetBufferListDestinations, чтобы зафиксировать эти изменения.
Если расширение добавляет один порт назначения для пакета, необходимо выполнить следующие действия.
Расширение инициализирует сведения о порту назначения для пакета в выделенной расширением NDIS_SWITCH_PORT_DESTINATION структуре.
Расширение вызывает AddNetBufferListDestination для фиксации изменений в структуре NET_BUFFER_LIST пакета. Расширение передает адрес структуры NDIS_SWITCH_PORT_DESTINATION в параметре назначения.
Примечание Расширение не должно вызывать функцию UpdateNetBufferListDestinations для применения изменений в пакете, содержащем только один конечный порт.
При вызове расширения пересылки AddNetBufferListDestination или UpdateNetBufferListDestinations чтобы зафиксировать изменения для портов назначения, интерфейс расширяемого коммутатора не удаляет расширяемые порты, указанные в элементах структуры NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. После завершения операции отправки или получения пакета интерфейс может удалить порт, если это необходимо.
Примечание После того, как расширение пересылки фиксирует изменения для конечных портов в форвардинговый контекст, конечные порты нельзя удалить, однако можно изменить только параметр IsExcluded структуры NDIS_SWITCH_PORT_DESTINATION порта назначения. Дополнительные сведения см. в Исключение доставки пакетов в порты назначения коммутатора с возможностью расширения.
Расширение пересылки должно синхронизировать свою обработку запросов идентификатора объекта (OID) OID_SWITCH_NIC_DISCONNECT с кодом, который добавляет порты назначения для отключенного сетевого адаптера.
Если при вызове функции FilterOidRequest в расширении для пересылки поступает запрос OID_SWITCH_NIC_DISCONNECT, расширение может выполнить одно из следующих действий:
Если расширение, вызываемое 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.