Клонирование трафика пакетов
В этом разделе описывается, как расширения расширяемого коммутатора Hyper-V клонируют или дублируют пакеты и внедряют их в путь данных расширяемого коммутатора. Дополнительные сведения о клонировании пакетов см. в разделе Клонированные структуры NET_BUFFER_LIST.
Примечание На этой странице предполагается, что вы знакомы со сведениями и схемами в статье Обзор расширяемого коммутатора Hyper-V и гибридной пересылки.
Примечание В интерфейсе расширяемого коммутатора драйверы фильтров NDIS называются расширяемыми расширениями коммутаторов , а стек драйверов называется стеком драйверов расширяемого коммутатора. Дополнительные сведения о расширениях см. в разделе Расширения коммутатора Hyper-V.
Расширения фильтрации и переадресации расширяемых коммутаторов могут внедрять клонированные пакеты в путь входящего или исходящего трафика расширяемого коммутатора, следуя приведенным ниже рекомендациям.
Расширение должно сначала выделить структуру NET_BUFFER_LIST для клонированного пакета. Затем расширение должно скопировать данные пакета из исходного пакета в клонированные пакеты. Дополнительные сведения о том, как клонировать пакеты, см. в разделе Производные структуры NET_BUFFER_LIST.
После выделения NET_BUFFER_LIST структуры расширение должно вызвать функцию обработчика AllocateNetBufferListForwardingContext для выделения контекста переадресации расширяемого коммутатора для пакета.
Контекст переадресации находится во внеполосных данных (OOB) пакета. Он содержит сведения о переадресации для пакета, такие как исходный порт и массив из одного или нескольких портов назначения.
Дополнительные сведения о контексте переадресации см. в разделе Контекст переадресации расширяемого коммутатора Hyper-V.
Расширение должно скопировать данные OOB, включая существующий исходный порт, из исходного пакета в клонированную, вызвав Метод CopyNetBufferListInfo. Если расширение планирует внедрить пакет в путь данных входящего трафика, оно также должно скопировать порты назначения из данных OOB исходного пакета.
При копировании данных OOB расширение должно следовать следующим рекомендациям:
Если расширение фильтрации планирует внедрить пакет в путь данных входящего трафика, оно должно вызвать CopyNetBufferListInfo с флагом NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS unspecified. Это приводит к тому, что порты назначения исходного пакета не копируются в клонированные пакеты. Когда расширение фильтрации внедряет этот пакет в путь данных входящего трафика, порты назначения будут добавлены в пакет либо базовым расширением пересылки (если включено в стеке драйверов), либо краем мини-порта расширяемого коммутатора.
Если расширение фильтрации планирует внедрить пакет в путь исходящих данных, оно должно вызвать CopyNetBufferListInfo с указанным флагом NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS. Это приводит к копированию портов назначения исходного пакета в клонированные пакеты.
Если расширение фильтрации клонирует или дублирует пакет, полученный по пути исходящих данных, оно может изменить порты назначения для пакета после вызова CopyNetBufferListInfo с указанным флагом NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS. Дополнительные сведения об этой процедуре см. в разделе Изменение данных порта источника расширяемого коммутатора пакета.
Если расширение пересылки клонирует или дублирует пакет, полученный из пути данных входящего трафика, оно должно добавить новые порты назначения для пакета, прежде чем внедрять пакет в путь данных входящего трафика. Дополнительные сведения об этой процедуре см. в разделе Добавление данных порта назначения расширяемого коммутатора в пакет.
После того как расширение вызовет CopyNetBufferListInfo, пакету будет назначена та же информация о исходном порте, которая содержалась в исходном пакете.
Расширение может вызвать SetNetBufferListSource , чтобы изменить сведения об исходном порте в данных о внештатном канале (OOB) пакета.
Расширение может захотеть, чтобы пакет обрабатывался так, как если бы он поступил из определенного порта. Это позволяет применять политики для этого порта к пакету. Расширение вызывает SetNetBufferListSource , чтобы изменить исходный порт для пакета.
Однако могут возникнуть ситуации, когда расширению может потребоваться назначить идентификатор исходного порта пакета NDIS_SWITCH_DEFAULT_PORT_ID. Например, расширение может захотеть задать идентификатор исходного порта , чтобы NDIS_SWITCH_DEFAULT_PORT_ID для собственных управляющих пакетов, которые отправляются на устройство во внешней сети.
В стандартном пути к данным NDIS не расширяемые данные OOB коммутатора часто имеют разные значения в зависимости от того, указан ли пакет как отправка или получение. Например, NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO данных OOB является объединением структур, зависящих от отправки и получения.
В пути к данным расширяемого коммутатора все пакеты перемещаются через стек драйверов расширения по мере отправки и получения. Из-за этого не расширяемые данные OOB коммутатора в структуре NET_BUFFER_LIST пакета будут находиться в формате отправки или получения в течение потока через стек драйверов.
Формат этих данных OOB зависит от порта расширяемого коммутатора источника, из которого пакет поступил на расширяемый коммутатор. Если исходный порт подключен к внешнему сетевому адаптеру, данные OOB коммутатора, не расширяемые, будут иметь формат получения. Для других портов эти данные OOB будут иметь формат отправки.
Сведения об исходном порте хранятся в NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO объединении в данных OOB структуры NET_BUFFER_LIST пакета. Расширение получает данные с помощью макроса NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .
Примечание Если расширение клонирует NET_BUFFER_LIST структуру пакета, оно должно принимать во внимание не расширяемые данные OOB коммутатора, если оно добавляет или изменяет данные OOB. Расширение может вызывать CopyNetBufferListInfo для копирования всех данных OOB из исходного пакета в клонированные пакеты. Эта функция будет поддерживать формат отправки или получения OOB при копировании данных в пакет.
Когда расширение клонирует пакет, клонированные данные пакета находятся в локальной или доверенной памяти в родительской операционной системе родительского раздела Hyper-V. Доступ к этой памяти дочерней секции невозможен. Таким образом, он считается "безопасным" от несинхронизированных обновлений гостевой операционной системой, которая выполняется в этом разделе.
После клонированного исходного пакета расширение должно получить NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO объединение в клонированных пакетах с помощью макроса NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . Расширение должно задать для члена IsPacketDataSafe значение TRUE. Это указывает, что все данные пакета находятся в доверенной памяти.
Расширения фильтрации и пересылки должны соответствовать приведенным ниже рекомендациям по внедрению клонированных пакетов в путь данных входящего или исходящего трафика:
Расширение должно вызвать NdisFSendNetBufferLists для внедрения клонированного пакета в путь данных входящего трафика. Расширение должно задать параметр SendFlags с соответствующими параметрами флага расширяемого коммутатора. Дополнительные сведения об этих параметрах флагов см. в статье Флаги отправки и получения расширяемого коммутатора Hyper-V.
Когда NDIS вызывает функцию FilterSendNetBufferListsComplete расширения для выполнения запроса на отправку клонированного пакета, расширение должно вызвать FreeNetBufferListForwardingContext , чтобы освободить выделенный контекст пересылки. Расширение должно сделать это, прежде чем освободить или повторно использовать структуру NET_BUFFER_LIST для пакета.
Примечание Расширение должно внедрить клонированные пакеты в путь данных входящего трафика, если оно изменяет данные пакета или исходный порт для пакета, полученного из пути исходящих данных. Он также должен внедрить клонированные пакеты в путь данных входящего трафика, если порты назначения пакета не сохраняются.
Расширение должно вызвать NdisFIndicateReceiveNetBufferLists для внедрения клонированного пакета в путь исходящих данных. Расширение должно задать параметр ReceiveFlags с соответствующими параметрами флага расширяемого коммутатора.
Когда NDIS вызывает функцию FilterReturnNetBufferLists расширения для выполнения запроса на получение клонированного пакета, расширение должно вызвать FreeNetBufferListForwardingContext , прежде чем освободить или повторно использовать структуру NET_BUFFER_LIST для пакета.
Примечание Прежде чем расширение переадресации вызовет NdisFIndicateReceiveNetBufferLists, оно должно определить порты назначения клонированного пакета и добавить эти данные в данные OOB пакета.
Если расширение клонирует структуру NET_BUFFER_LIST пакета, оно должно сохранять владение NET_BUFFER_LIST структурой исходного пакета до завершения запроса на отправку или получение клонированного пакета. Расширение должно использовать элемент ParentNetBufferListструктуры NET_BUFFER_LIST клонированного пакета для связи со структурой NET_BUFFER_LIST исходного пакета.
Примечание В NDIS 6.30 (Windows Server 2012) расширение может использовать член ParentNetBufferList для связи с исходным пакетом, но это не обязательно. В NDIS 6.40 (Windows Server 2012 R2) и более поздних версиях расширение должно использовать член ParentNetBufferList для связи с исходным пакетом.
После завершения запроса на отправку или получение клонированного пакета расширение должно завершить запрос на отправку или получение исходного пакета.
Примечание Если расширение клонировало NET_BUFFER_LIST структуру пакета, оно может выполнить запрос на отправку или получение исходного пакета после его клонирования.
Если расширение клонирует пакет, оно может выполнить запрос на отправку или получение исходного пакета сразу после клонирования.
Если расширение переадресации или фильтрации получает пакет в пути исходящих данных, оно не может внедрить клонированную версию пакета в этот путь данных, если расширение изменило данные пакета или исходный порт. Однако расширение может внедрять эти пакеты в путь данных входящего трафика. Это позволяет правильно перенаправить и отфильтровать пакет через путь к данным расширяемого коммутатора.
Примечание Расширения фильтрации могут внедрять клонированные пакеты в путь данных входящего трафика, только если порты назначения пакета не сохраняются.
Например, предположим, что пакет с несколькими портами назначения был получен в пути исходящих данных расширяемого коммутатора. Если для одного порта назначения требуется специальная обработка, например инкапсуляция данных, расширение переадресации или фильтрации обрабатывает это, выполнив следующие действия.
Исключите доставку пакетов на порт, требующий специальной обработки. Расширение делает это, задав для элемента IsExcludedструктуры NDIS_SWITCH_PORT_DESTINATION порта назначения значение , равное одному. Дополнительные сведения об этой процедуре см. в разделе Исключение доставки пакетов в порты назначения расширяемого коммутатора.
Клонируйте исходный пакет и выполните необходимую обработку данных пакета.
Примечание Расширение фильтрации не должно добавлять порт назначения для клонированного пакета. Эти данные будут добавлены позже расширением переадресации или краем мини-порта расширяемого коммутатора.
Переадресуйте исходный пакет по пути исходящих данных, вызвав NdisMIndicateReceiveNetBufferLists.
Внедрение клонированного пакета в путь к данным входящего трафика путем вызова NdisFSendNetBufferLists.
Дополнительные сведения о путях входящего и исходящего трафика коммутатора см. в статье Hyper-V Extensible Switch Data Path.
Примечание Сбор расширений не может клонировать трафик пакетов. Однако они могут быть источником трафика пакетов. Дополнительные сведения см. в разделе Исходящий трафик пакетов.