Поделиться через


Клонирование трафика пакетов

В этом разделе описывается, как расширяемые расширения коммутатора 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 не указано. Это приводит к тому, что порты назначения исходного пакета не копируются в клонированные пакеты. Когда расширение фильтрации внедряет этот пакет в путь к данным входящего трафика, конечные порты будут добавлены в пакет с помощью базового расширения пересылки (если он включен в стеке драйверов) или мини-порта расширяемого коммутатора.

    • Если расширение фильтрации планирует интегрировать пакет в траекторию данных исходящего трафика, необходимо вызвать 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 часто имеет разные значения в зависимости от того, указано ли, что пакет отправляется или принимается. Например, данные OOB NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO представляют собой объединение структур, специфичных для отправки и получения.

    В расширяемом пути передачи данных коммутатора все пакеты проходят через стек драйверов расширения, будучи как отправленными, так и полученными. Из-за этого данные OOB нерасширяемого коммутатора в структуре пакета NET_BUFFER_LIST будут находиться в формате отправки или получения на протяжении всего потока в стеке драйверов.

    Формат этих данных OOB зависит от порта расширяемого коммутатора источника, из которого пакет прибыл в расширяемый коммутатор. Если исходный порт подключен к внешнему сетевому адаптеру, данные нераcширяемого коммутатора OOB будут иметь формат приема. Для других портов эти данные OOB будут находиться в формате отправки.

    Сведения о исходном порту хранятся в союзе NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO в данных OOB NET_BUFFER_LIST структуры пакета . Расширение получает данные с помощью макроса NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .

    Примечание Если расширение клонирует структуру NET_BUFFER_LIST пакета, необходимо учитывать данные 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 пакета, оно может завершить отправку или получение запроса исходного пакета после клонированного пакета.

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

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

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

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

  1. Исключите доставку пакетов на порт, требующий специальной обработки. Расширение делает это, установив для элемента IsExcluded структуры NDIS_SWITCH_PORT_DESTINATION порта назначения значение один. Дополнительные сведения об этой процедуре см. в разделе Исключение доставки пакетов на порты назначения расширяемого коммутатора.

  2. Клонируйте исходный пакет и выполните необходимую обработку данных пакета.

    Заметка Расширение фильтрации не должно добавлять порт назначения для клонированного пакета. Эти данные будут добавлены позже модулем пересылки или минипортом настраиваемого коммутатора.

  3. Передайте исходный пакет в выходной поток данных, вызвав NdisMIndicateReceiveNetBufferLists.

  4. Вставьте клонированный пакет в путь входящих данных, вызвав NdisFSendNetBufferLists.

Дополнительные сведения о входящем и исходящем путях данных расширяемого коммутатора см. в Hyper-V Extensible Switch Data Path.

Примечание Расширения для захвата не могут клонировать трафик пакетов. Однако они могут создавать пакетный трафик. Дополнительные сведения см. в разделе "Исходный трафик пакетов".