Compartilhar via


Clonando o tráfego de pacotes

Este tópico descreve como as extensões de comutador extensível do Hyper-V clonam ou duplicam pacotes e os injetam no caminho de dados de comutador extensível. Para obter mais informações sobre como clonar pacotes, consulte Estruturas de NET_BUFFER_LIST clonadas.

Nota Esta página pressupõe que você esteja familiarizado com as informações e diagramas em Visão geral do Comutador Extensível do Hyper-V e encaminhamento híbrido.

Nota Na interface de comutador extensível, os drivers de filtro NDIS são conhecidos como extensíveis extensíveis e a pilha de driver é conhecida como a pilha extensível do driver de comutador. Para obter mais informações sobre as extensões, consulte Extensões de Comutador Extensível do Hyper-V.

Extensible switch filtering and forwarding extensions can inject cloned packets into the extensible switch ingress or egress data path by following these guidelines:

  • A extensão deve primeiro alocar uma estrutura NET_BUFFER_LIST para o pacote clonado. Em seguida, a extensão deve copiar os dados do pacote original para o pacote clonado. Para obter mais informações sobre como clonar pacotes, consulte Estruturas de NET_BUFFER_LIST derivadas.

  • Depois que a extensão aloca uma estrutura NET_BUFFER_LIST , ela deve chamar a função de manipulador AllocateNetBufferListForwardingContext para alocar o contexto de encaminhamento de comutador extensível para o pacote.

    O contexto de encaminhamento reside nos dados OOB (fora de banda) do pacote. Ele contém informações de encaminhamento para o pacote, como sua porta de origem e uma matriz de uma ou mais portas de destino.

    Para obter mais informações sobre o contexto de encaminhamento, consulte Contexto de encaminhamento extensível do Hyper-V.

  • A extensão deve copiar os dados OOB, incluindo a porta de origem existente, do pacote original para o pacote clonado chamando CopyNetBufferListInfo. Se a extensão planeja injetar o pacote no caminho de dados de entrada, ela também deve copiar as portas de destino dos dados OOB do pacote original.

    Quando copia os dados OOB, a extensão deve seguir estas diretrizes:

    • Se a extensão de filtragem planeja injetar o pacote no caminho de dados de entrada, ela deve chamar CopyNetBufferListInfo com o sinalizador NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS não especificado. Isso faz com que as portas de destino do pacote original não sejam copiadas para os pacotes clonados. Quando a extensão de filtragem injetar esse pacote no caminho de dados de entrada, as portas de destino serão adicionadas ao pacote por uma extensão de encaminhamento subjacente (se habilitada na pilha do driver) ou pela borda do miniporte da opção extensível.

    • Se a extensão de filtragem planeja injetar o pacote no caminho de dados de saída, ela deve chamar CopyNetBufferListInfo com o sinalizador NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS especificado. Isso faz com que as portas de destino do pacote original sejam copiadas para os pacotes clonados.

  • Se a extensão de filtragem estiver clonando ou duplicando um pacote obtido do caminho de dados de saída, ela poderá alterar as portas de destino do pacote depois de chamar CopyNetBufferListInfo com o sinalizador de NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS especificado. Para obter mais informações sobre esse procedimento, consulte Modificando os dados extensíveis da porta de origem do comutador extensível de um pacote.

  • Se a extensão de encaminhamento estiver clonando ou duplicando um pacote obtido do caminho de dados de entrada, ela deverá adicionar novas portas de destino para o pacote antes de injetar o pacote no caminho de dados de entrada. Para obter mais informações sobre esse procedimento, consulte Adicionando dados extensíveis de porta de destino de comutador a um pacote.

  • Depois que a extensão chamar CopyNetBufferListInfo, o pacote receberá as mesmas informações de porta de origem contidas no pacote original.

    A extensão pode chamar SetNetBufferListSource para alterar as informações da porta de origem nos dados OOB (fora de banda) do pacote.

    A extensão pode querer que o pacote seja tratado como se tivesse se originado de uma porta específica. Isso permite que as políticas dessa porta sejam aplicadas ao pacote. A extensão chama SetNetBufferListSource para alterar a porta de origem do pacote.

    No entanto, pode haver situações em que a extensão pode querer atribuir o identificador de porta de origem do pacote a NDIS_SWITCH_DEFAULT_PORT_ID. Por exemplo, a extensão pode querer definir o identificador de porta de origem como NDIS_SWITCH_DEFAULT_PORT_ID para pacotes de controle proprietários que são enviados para um dispositivo na rede externa.

  • No caminho de dados NDIS padrão, os dados OOB de comutador não extensíveis geralmente têm valores diferentes, dependendo se o pacote está sendo indicado como um envio ou um recebimento. Por exemplo, o NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO dados OOB é uma união de estruturas específicas de envio e recebimento

    No caminho de dados de comutador extensível, todos os pacotes se movem pela pilha do driver de extensão conforme os envios e recebimentos. Por isso, os dados OOB de comutador não extensíveis dentro da estrutura NET_BUFFER_LIST do pacote estarão em um formato de envio ou recebimento durante a duração do fluxo pela pilha do driver.

    O formato desses dados OOB depende da porta de comutador extensível de origem da qual o pacote chegou ao comutador extensível. Se a porta de origem estiver conectada ao adaptador de rede externo, os dados OOB do comutador não extensível estarão em um formato de recebimento. Para outras portas, esses dados OOB estarão em um formato de envio.

    As informações da porta de origem são armazenadas na união NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO nos dados OOB da estrutura de NET_BUFFER_LIST do pacote. A extensão obtém os dados usando a macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .

    Nota Se a extensão clonar a estrutura de NET_BUFFER_LIST de um pacote, ela deverá levar em consideração os dados OOB não extensíveis se ele adicionar ou modificar os dados OOB. A extensão pode chamar CopyNetBufferListInfo para copiar todos os dados OOB de um pacote de origem para um pacote clonado. Essa função manterá o formato de envio ou recebimento do OOB quando os dados forem copiados para o pacote.

  • Quando a extensão clona um pacote, os dados de pacote clonados estão localizados na memória local ou confiável no sistema operacional pai da partição pai do Hyper-V. Essa memória não pode ser acessada pela partição filho. Portanto, ele é considerado "seguro" contra atualizações não sincronizadas pelo sistema operacional convidado executado nessa partição.

    Depois que o pacote original tiver sido clonado, a extensão deverá obter a união NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO no pacote clonado usando a macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . A extensão deve definir o membro IsPacketDataSafe como TRUE. Isso especifica que todos os dados do pacote estão localizados na memória confiável.

As extensões de filtragem e encaminhamento devem seguir estas diretrizes para injetar pacotes clonados no caminho de dados de entrada ou saída:

  • A extensão deve chamar NdisFSendNetBufferLists para injetar o pacote clonado no caminho de dados de entrada. A extensão deve definir o parâmetro SendFlags com as configurações de sinalizador de comutador extensível apropriadas. Para obter mais informações sobre essas configurações de sinalizador, consulte Sinalizadores de Envio e Recebimento do Comutador Extensível do Hyper-V.

    Quando o NDIS chama a função FilterSendNetBufferListsComplete da extensão para concluir a solicitação de envio do pacote clonado, a extensão deve chamar FreeNetBufferListForwardingContext para liberar o contexto de encaminhamento alocado. A extensão deve fazer isso antes de liberar ou reutilizar a estrutura NET_BUFFER_LIST para o pacote.

    Nota A extensão deverá injetar o pacote clonado no caminho de dados de entrada se modificar os dados do pacote ou a porta de origem de um pacote obtido do caminho de dados de saída. Ele também deve injetar o pacote clonado no caminho de dados de entrada se as portas de destino do pacote não forem preservadas.

  • A extensão deve chamar NdisFIndicateReceiveNetBufferLists para injetar o pacote clonado no caminho de dados de saída. A extensão deve definir o parâmetro ReceiveFlags com as configurações de sinalizador de comutador extensível apropriadas.

    Quando o NDIS chama a função FilterReturnNetBufferLists da extensão para concluir a solicitação de recebimento do pacote clonado, a extensão deve chamar FreeNetBufferListForwardingContext antes de liberar ou reutilizar a estrutura NET_BUFFER_LIST para o pacote.

    Nota Antes que a extensão de encaminhamento chame NdisFIndicateReceiveNetBufferLists, ela deve ter determinado as portas de destino do pacote clonado e adicionado esses dados aos dados OOB do pacote.

  • Se a extensão clonar a estrutura NET_BUFFER_LIST de um pacote, ela deverá manter a propriedade da estrutura NET_BUFFER_LIST do pacote original até que a solicitação de envio ou recebimento do pacote clonado seja concluída. A extensão deve usar o membro ParentNetBufferList da estrutura NET_BUFFER_LIST do pacote clonado para vincular à estrutura NET_BUFFER_LIST do pacote original.

    Nota No NDIS 6.30 (Windows Server 2012), a extensão pode usar o membro ParentNetBufferList para vincular ao pacote original, mas não é necessário fazê-lo. No NDIS 6.40 (Windows Server 2012 R2) e posterior, a extensão é necessária para usar o membro ParentNetBufferList para vincular ao pacote original.

    Depois que a solicitação de envio ou recebimento do pacote clonado for concluída, a extensão deverá concluir a solicitação de envio ou recebimento do pacote original.

    Nota Se a extensão clonou a estrutura de NET_BUFFER_LIST de um pacote, ela poderá concluir a solicitação de envio ou recebimento do pacote original depois que ele tiver sido clonado.

  • Se a extensão clonar um pacote, ela poderá concluir a solicitação de envio ou recebimento do pacote original assim que ele for clonado.

Se a extensão de encaminhamento ou filtragem obtiver um pacote no caminho de dados de saída, ela não poderá injetar uma versão clonada do pacote nesse caminho de dados se a extensão tiver modificado os dados do pacote ou alterado a porta de origem. No entanto, a extensão pode injetar esses pacotes no caminho de dados de entrada. Isso permite que o pacote seja encaminhado e filtrado corretamente por meio do caminho de dados de comutador extensível.

Nota As extensões de filtragem só poderão injetar pacotes clonados no caminho de dados de entrada se as portas de destino do pacote não forem preservadas.

Por exemplo, suponha que um pacote com várias portas de destino tenha sido obtido no caminho de dados de saída do comutador extensível. Se uma porta de destino exigir tratamento especial, como encapsulamento de dados, a extensão de encaminhamento ou filtragem lidará com isso seguindo estas etapas:

  1. Exclua a entrega de pacotes para a porta que requer tratamento especial. A extensão faz isso definindo o membro IsExcluded da estrutura NDIS_SWITCH_PORT_DESTINATION da porta de destino como um valor igual a um. Para obter mais informações sobre esse procedimento, consulte Excluindo a entrega de pacotes para portas de destino de comutador extensível.

  2. Clone o pacote original e execute o tratamento necessário dos dados do pacote.

    Nota A extensão de filtragem não deve adicionar uma porta de destino para o pacote clonado. Esses dados serão adicionados posteriormente pela extensão de encaminhamento ou pela borda do miniporto do comutador extensível.

  3. Encaminhe o pacote original no caminho de dados de saída chamando NdisMIndicateReceiveNetBufferLists.

  4. Injete o pacote clonado no caminho de dados de entrada chamando NdisFSendNetBufferLists.

Para obter mais informações sobre os caminhos de dados de entrada e saída do comutador extensível, consulte Caminho de dados de comutador extensível do Hyper-V.

Nota A captura de extensões não pode clonar o tráfego de pacotes. No entanto, eles podem originar o tráfego de pacotes. Para obter mais informações, consulte Originando o tráfego de pacotes.