Adicionando dados extensíveis de porta de destino de comutador a um pacote
Este tópico descreve como as extensíveis do Hyper-V podem especificar 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 associados ao adaptador de rede externo comutador extensível.
Nota Somente uma extensão de encaminhamento ou a própria opção pode encaminhar pacotes para portas de comutador extensíveis ou adaptadores de rede individuais.
A figura a seguir mostra o caminho de dados para o tráfego de pacotes por meio da pilha de driver de comutador extensível para NDIS 6.40 (Windows Server 2012 R2) e posterior. Ambas as figuras também mostram o caminho de dados para o tráfego de pacotes de ou para os adaptadores de rede conectados a portas de comutador extensíveis.
A figura a seguir mostra o caminho de dados para o tráfego de pacotes por meio da pilha extensível do driver de comutador para NDIS 6.30 (Windows Server 2012).
Cada porta de destino de comutador 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 de NET_BUFFER_LIST do pacote. Para obter mais informações sobre esse contexto, consulte Contexto de encaminhamento extensível de comutador extensível do Hyper-V.
Se uma extensão de encaminhamento estiver associada e habilitada na pilha de driver de comutador extensível, ela será responsável por determinar as portas de destino para cada pacote obtido do caminho de dados de entrada do comutador extensível, a menos que o pacote seja um pacote NVGRE. Para obter mais informações sobre esse caminho de dados, consulte Visão geral do caminho de dados de comutador extensível do Hyper-V. Para obter mais informações sobre pacotes NVGRE, consulte Encaminhamento Híbrido.
Nota Se uma extensão de encaminhamento não estiver associada ou habilitada na pilha de driver, a opção extensível determinará as portas de destino para pacotes obtidos do caminho de dados de entrada.
A extensão de encaminhamento deve seguir estas diretrizes quando determina as portas de destino para um pacote obtido no caminho de dados de entrada:
A extensão deve inicializar uma estrutura 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 membro NicIndex da estrutura NDIS_SWITCH_PORT_DESTINATION como NDIS_SWITCH_DEFAULT_NIC_INDEX.
Se a porta de destino estiver conectada ao adaptador de rede externo comutador extensível, a extensão poderá especificar o índice de um adaptador de rede física subjacente para o qual encaminhar a solicitação de envio. A extensão faz isso definindo o membro NicIndex como o valor NDIS_SWITCH_NIC_INDEX diferente de zero do adaptador de rede de destino associado ao adaptador de rede externo.
Para obter mais informações, consulte Encaminhando 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 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 membro IsExcluded da estrutura NDIS_SWITCH_PORT_DESTINATION da porta de destino como FALSE.
Para reter os dados da VLAN (rede local virtual) 802.1Q em um pacote antes de ser entregue a uma porta, a extensão define o membro PreserveVLAN como TRUE.
Para remover os dados da VLAN (rede local virtual) 802.1Q em um pacote antes de ser entregue a uma porta, a extensão define o membro PreserveVLAN como FALSE.
Para manter 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 de serem entregues 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:
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ção GrowNetBufferListDestinations 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 define o parâmetro NetBufferLists como um ponteiro para a estrutura NET_BUFFER_LIST do pacote.
Nota Se houver portas de destino disponíveis na matriz, a extensão não deverá chamar GrowNetBufferListDestinations.
Se a função GrowNetBufferListDestinations 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 essa estrutura é retornado no parâmetro Destinations .
Nota Se a função GrowNetBufferListDestinations não puder alocar o número solicitado de portas de destino, ela retornará NDIS_STATUS_RESOURCES.
A 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 começando no deslocamento NumDestinations . NumDestinations é um membro da estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY .
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:
A extensão inicializa as informações da porta de destino para o pacote em uma estrutura de NDIS_SWITCH_PORT_DESTINATION alocada por extensão.
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 .
Nota A extensão não deve chamar a função UpdateNetBufferListDestinations para confirmar 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 portas de destino, a interface de comutador extensível não excluirá as portas de comutador extensíveis especificadas nos elementos da estrutura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Depois que a operação de envio ou recebimento de pacotes for concluída, a interface será livre para excluir a porta, se necessário.
Nota Depois que a extensão de encaminhamento confirmar as alterações das portas de destino para o contexto de encaminhamento, as portas de destino não poderão ser removidas e somente o membro IsExcluded da estrutura NDIS_SWITCH_PORT_DESTINATION de uma porta de destino poderá ser alterado. Para obter mais informações, consulte Excluindo a entrega de pacotes para portas de destino de comutador extensível.
A extensão de encaminhamento deve sincronizar seu tratamento de solicitações de conjunto OID (identificador de objeto) de OID_SWITCH_NIC_DISCONNECT com seu código que adiciona portas de destino para o adaptador de rede desconectado.
Se FilterOidRequest da extensão de encaminhamento for chamado para uma solicitação OID_SWITCH_NIC_DISCONNECT , a extensão poderá fazer um dos seguintes procedimentos:
Se a extensão chamada NdisFOidRequest encaminhar essa solicitação OID, ela não deverá especificar a porta com o adaptador de rede desconectado como uma porta de destino para o pacote.
Nota Se a única porta de destino para o pacote for aquela com o adaptador de rede desconectado, a extensão deverá remover 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 precisa encaminhar para uma porta antes de ser interrompida.
Nota Se a extensão retornar NDIS_STATUS_PENDING, ela também poderá chamar ReferenceSwitchPort para incrementar o contador de referência da porta com o adaptador de rede desconectado. 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 remover o pacote. A extensão também deve chamar ReportFilteredNetBufferLists para notificar a interface de comutador extensível sobre o pacote descartado.
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 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 do miniporto do comutador 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 deverá 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 Sinalizadores de envio e recebimento extensíveis do Hyper-V.