Partilhar via


Adicionando dados de porta de destino do switch extensível a um pacote

Este tópico descreve como as extensões de encaminhamento do switch extensível Hyper-V podem definir a entrega de pacotes para uma ou mais portas de destino. Essas extensões também podem encaminhar pacotes para adaptadores de rede física individuais que estão vinculados ao adaptador de rede externa do switch extensível.

Observação Somente uma extensão de encaminhamento ou o próprio switch pode encaminhar pacotes para portas de switch extensíveis ou adaptadores de rede individuais.

A figura a seguir mostra o trajeto de dados para o tráfego de pacotes através da pilha de drivers do switch extensível para NDIS 6.40 (Windows Server 2012 R2) e versões posteriores. Ambos os diagramas também mostram o caminho de dados para o tráfego de pacotes para ou dos adaptadores de rede conectados a portas de switch extensíveis.

Fluxograma que mostra o caminho de dados para o tráfego de pacotes de ou para adaptadores de rede conectados a portas de comutadores extensíveis para NDIS 6.40 (Windows Server 2012 R2) e posterior.

A figura a seguir mostra o trajeto dos dados para o tráfego de pacotes na pilha de drivers de switch extensível do NDIS 6.30 (Windows Server 2012).

Fluxograma que mostra o caminho de dados para o tráfego de pacotes de ou para adaptadores de rede conectados a portas de switch extensíveis para NDIS 6.30 (Windows Server 2012).

Cada porta de destino do switch extensível é especificada por um elemento NDIS_SWITCH_PORT_DESTINATION dentro da estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. Essa matriz está contida no contexto de encaminhamento fora de banda (OOB) da estrutura NET_BUFFER_LIST do pacote. Para obter mais informações sobre esse contexto, consulte Hyper-V Extensible Switch Forwarding Context.

Se uma extensão de encaminhamento estiver vinculada e habilitada na pilha de driver de switch extensível, ela será responsável por determinar as portas de destino para cada pacote obtido do caminho de dados de entrada do switch extensível, a menos que o pacote seja um pacote no formato NVGRE. Para obter mais informações sobre este caminho de dados, consulte Visão geral do caminho de dados do comutador extensível Hyper-V. Para obter mais informações sobre pacotes NVGRE, consulte Hybrid Forwarding.

Observação Se uma extensão de encaminhamento não estiver vinculada ou habilitada na pilha de drivers, o switch extensível determinará as portas de destino para os pacotes que obtém do caminho de entrada de dados.

A extensão de encaminhamento deve seguir estas diretrizes ao determinar as portas de destino para um pacote obtido no caminho de dados de entrada:

  • A extensão deve inicializar uma estrutura de NDIS_SWITCH_PORT_DESTINATION dentro da estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY com as informações da porta de destino.

    Se a porta de destino não estiver conectada ao adaptador de rede externo, a extensão deverá definir o NicIndex membro da estrutura NDIS_SWITCH_PORT_DESTINATION como NDIS_SWITCH_DEFAULT_NIC_INDEX.

    Se a porta de destino estiver conectada ao adaptador de rede externo do switch extensível, a extensão poderá especificar o índice de um adaptador de rede físico subjacente para o qual encaminhar a solicitação de envio. A extensão realiza esta ação ao definir o membro NicIndex para o valor não-nulo de NDIS_SWITCH_NIC_INDEX do adaptador de rede de destino que está ligado ao adaptador de rede externo.

    Para obter mais informações, consulte Encaminhamento de pacotes para adaptadores de rede física.

  • A extensão deve adicionar portas de destino aos dados OOB de um pacote somente para as portas que têm conexões de adaptador de rede ativas. Se a extensão tiver encaminhado uma solicitação de OID_SWITCH_NIC_DISCONNECT, ela não deverá adicionar uma porta de destino associada ao adaptador de rede desconectado.

  • Para melhorar o desempenho, a extensão deve adicionar apenas destinos de porta válidos para entrega de pacotes. Nesse caso, a extensão deve definir o IsExcluded membro da estrutura de NDIS_SWITCH_PORT_DESTINATION da porta de destino como FALSE.

  • Para reter os dados da rede local virtual (VLAN) 802.1Q em um pacote antes de serem entregues a uma porta, a extensão define o membro PreserveVLAN como TRUE.

    Para remover os dados da rede local virtual (VLAN) 802.1Q em um pacote antes de serem entregues a uma porta, a extensão define o membro PreserveVLAN como FALSE.

  • Para reter os dados de prioridade 802.1Q em um pacote antes de serem entregues a uma porta, a extensão define o membro PreservePriority como TRUE.

    Para remover os dados de prioridade 802.1Q em um pacote antes que ele seja entregue a uma porta, a extensão define o membro PreservePriority como FALSE.

  • Se a extensão de encaminhamento adicionar várias portas de destino para um pacote, ela deverá seguir estas etapas:

    1. A extensão primeiro acessa a estrutura NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO do pacote usando a macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL. Em seguida, a extensão lê o membro NumAvailableDestinations para determinar quantos elementos de porta de destino não utilizados estão disponíveis na matriz de porta de destino. Se a extensão exigir mais portas de destino do que as disponíveis na matriz, ela deverá chamar a funçãoGrowNetBufferListDestinations para alocar espaço para portas de destino adicionais na matriz.

      Quando a extensão chama GrowNetBufferListDestinations, ela define o parâmetro NumberOfNewDestinations para o número de novas portas de destino a serem adicionadas ao pacote.

      A extensão também atribui o parâmetro NetBufferLists como um ponteiro para a estrutura NET_BUFFER_LIST do pacote.

      Observação Se houver portas de destino disponíveis na matriz, a extensão não deve chamar GrowNetBufferListDestinations.

    2. Se a funçãoGrowNetBufferListDestinations retornar com êxito, ela adicionou as portas de destino adicionais ao final da matriz de destino na estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. Um ponteiro para esta estrutura é devolvido no parâmetro Destinations.

      Observação Se a função GrowNetBufferListDestinations não puder alocar o número solicitado de portas de destino, ela retornará NDIS_STATUS_RESOURCES.

    3. Extensão especifica novos elementos de porta de destino na estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. A extensão inicializa cada nova porta de destino como uma estrutura NDIS_SWITCH_PORT_DESTINATION.

      A extensão inicializa novas portas de destino para a matriz a partir do NumDestinations offset. NumDestinations é um membro da estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY.

    4. Depois que a extensão terminar de adicionar ou modificar elementos de porta de destino, ela deverá chamar UpdateNetBufferListDestinations para confirmar essas alterações.

  • Se a extensão adicionar uma única porta de destino para um pacote, ela deverá seguir estas etapas:

    1. A extensão inicializa as informações da porta de destino do pacote em uma estrutura NDIS_SWITCH_PORT_DESTINATION alocada pela extensão.

    2. A extensão chama AddNetBufferListDestination para confirmar as alterações na estrutura NET_BUFFER_LIST do pacote. A extensão passa o endereço da estrutura NDIS_SWITCH_PORT_DESTINATION no parâmetro Destination.

      Observação A extensão não deve chamar a função UpdateNetBufferListDestinations para efetuar as alterações em um pacote com apenas uma porta de destino.

  • Quando a extensão de encaminhamento chama AddNetBufferListDestination ou UpdateNetBufferListDestinations para confirmar as alterações para as portas de destino, a interface do switch extensível não excluirá as portas do switch extensível especificadas nos elementos da estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. Após a conclusão da operação de envio ou recebimento de pacotes, a interface fica livre para excluir a porta, se necessário.

    Nota Depois que a extensão de encaminhamento confirma as alterações nas portas de destino no contexto de encaminhamento, as portas de destino não podem ser removidas e apenas o membro IsExcluded da estrutura NDIS_SWITCH_PORT_DESTINATION de uma porta de destino pode ser alterado. Para obter mais informações, consulte Excluindo a entrega de pacotes para portas de destino do switch extensível.

  • A extensão de encaminhamento deve sincronizar sua manipulação de solicitações de conjunto de identificador de objeto (OID) de OID_SWITCH_NIC_DISCONNECT com seu código que adiciona portas de destino para o adaptador de rede desconectado.

    Se oFilterOidRequestda extensão de encaminhamento for chamado para uma solicitação OID_SWITCH_NIC_DISCONNECT, a extensão poderá seguir um destes procedimentos:

    • Se a extensão chamada NdisFOidRequest encaminhar essa solicitação OID, ela não deve especificar a porta com o adaptador de rede desconectado como uma porta de destino para o pacote.

      Observação Se a única porta de destino para o pacote for aquela com o adaptador de rede desconectado, a extensão deverá descartar o pacote.

    • A extensão pode retornar NDIS_STATUS_PENDING para concluir a solicitação de forma assíncrona. Isso permite que a extensão adicione a porta com o adaptador de rede desconectado como uma porta de destino para o pacote. Isso também permite que a extensão chame AddNetBufferListDestination ou UpdateNetBufferListDestinations e conclua a adição de portas de destino a um pacote.

      A extensão pode querer fazer isso para pacotes que ela tem que encaminhar para uma porta antes de ser desativada.

      Observação Se a extensão retornar NDIS_STATUS_PENDING, ela também poderá chamar ReferenceSwitchPort para aumentar o contador de referência para a porta com o adaptador de rede desligado. No entanto, a extensão não pode encaminhar a solicitação OID até que ela chame DereferenceSwitchPort para diminuir o contador de referência para a porta.

  • Se o número de portas de destino for zero, a extensão de encaminhamento deverá chamar NdisMSendNetBufferListsComplete para descartar o pacote. A extensão também deve chamar ReportFilteredNetBufferLists para notificar a interface do switch extensível sobre o pacote descartado.

    Observação Se a extensão de encaminhamento obteve uma lista vinculada de estruturas de NET_BUFFER_LIST para vários pacotes do caminho de dados de entrada, ela deverá criar uma lista separada de pacotes descartados. Ao fazer isso, a extensão pode chamar NdisMSendNetBufferListsComplete e ReportFilteredNetBufferLists apenas uma vez.

  • Se o número de portas de destino for maior que zero, a extensão de encaminhamento deverá chamar NdisFSendNetBufferLists para encaminhar o pacote pelo caminho de dados de entrada para a borda da miniporta do switch extensível.

    Nota Se a extensão de encaminhamento obteve uma lista vinculada de estruturas de NET_BUFFER_LIST para vários pacotes do caminho de dados de entrada, ela deve criar uma lista separada de pacotes encaminhados. Ao fazer isso, a extensão pode chamar NdisFSendNetBufferLists apenas uma vez para encaminhar a lista de pacotes. Além disso, a extensão deve manter listas separadas para encaminhar pacotes que tenham as mesmas portas de destino. Para obter mais informações, consulte Hyper-V Extensible Switch Send and Receive Flags.